Skip to content

Commit ab469a6

Browse files
authored
Merge pull request #47 from zedar/support_for_f16_and_f128_types
Add Float16 and Float128 support for jit
2 parents fd61715 + ff2800a commit ab469a6

File tree

7 files changed

+142
-1
lines changed

7 files changed

+142
-1
lines changed

gcc/jit/docs/topics/types.rst

+8
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,14 @@ Standard types
117117
-
118118
* - :c:data:`GCC_JIT_TYPE_LONG_DOUBLE`
119119
-
120+
* - :c:data:`GCC_JIT_TYPE_FLOAT16`
121+
-
122+
* - :c:data:`GCC_JIT_TYPE_FLOAT32`
123+
-
124+
* - :c:data:`GCC_JIT_TYPE_FLOAT64`
125+
-
126+
* - :c:data:`GCC_JIT_TYPE_FLOAT128`
127+
-
120128
* - :c:data:`GCC_JIT_TYPE_CONST_CHAR_PTR`
121129
- C type: ``(const char *)``
122130
* - :c:data:`GCC_JIT_TYPE_SIZE_T`

gcc/jit/dummy-frontend.cc

+16
Original file line numberDiff line numberDiff line change
@@ -1253,6 +1253,22 @@ recording::type* tree_type_to_jit_type (tree type)
12531253
{
12541254
return new recording::memento_of_get_type (&target_builtins_ctxt, GCC_JIT_TYPE_BFLOAT16);
12551255
}
1256+
else if (type == float16_type_node)
1257+
{
1258+
return new recording::memento_of_get_type(&target_builtins_ctxt, GCC_JIT_TYPE_FLOAT16);
1259+
}
1260+
else if (type == float32_type_node)
1261+
{
1262+
return new recording::memento_of_get_type(&target_builtins_ctxt, GCC_JIT_TYPE_FLOAT32);
1263+
}
1264+
else if (type == float64_type_node)
1265+
{
1266+
return new recording::memento_of_get_type(&target_builtins_ctxt, GCC_JIT_TYPE_FLOAT64);
1267+
}
1268+
else if (type == float128_type_node)
1269+
{
1270+
return new recording::memento_of_get_type(&target_builtins_ctxt, GCC_JIT_TYPE_FLOAT128);
1271+
}
12561272
else if (type == dfloat128_type_node)
12571273
{
12581274
return new recording::memento_of_get_type (&target_builtins_ctxt, GCC_JIT_TYPE_VOID); // FIXME: wrong type.

gcc/jit/jit-common.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ along with GCC; see the file COPYING3. If not see
3636
#endif
3737
#endif
3838

39-
const int NUM_GCC_JIT_TYPES = GCC_JIT_TYPE_BFLOAT16 + 1;
39+
const int NUM_GCC_JIT_TYPES = GCC_JIT_TYPE_FLOAT128 + 1;
4040

4141
/* This comment is included by the docs.
4242

gcc/jit/jit-playback.cc

+28
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,34 @@ get_tree_node_for_type (enum gcc_jit_types type_)
290290
return double_type_node;
291291
case GCC_JIT_TYPE_LONG_DOUBLE:
292292
return long_double_type_node;
293+
case GCC_JIT_TYPE_FLOAT16:
294+
if (float16_type_node == NULL || TYPE_PRECISION(float16_type_node) != 16)
295+
{
296+
add_error (NULL, "gcc_jit_types value unsupported on this target: %i", type_);
297+
return NULL;
298+
}
299+
return float16_type_node;
300+
case GCC_JIT_TYPE_FLOAT32:
301+
if (float32_type_node == NULL || TYPE_PRECISION(float32_type_node) != 32)
302+
{
303+
add_error (NULL, "gcc_jit_types value unsupported on this target: %i", type_);
304+
return NULL;
305+
}
306+
return float32_type_node;
307+
case GCC_JIT_TYPE_FLOAT64:
308+
if (float64_type_node == NULL || TYPE_PRECISION(float64_type_node) != 64)
309+
{
310+
add_error (NULL, "gcc_jit_types value unsupported on this target: %i", type_);
311+
return NULL;
312+
}
313+
return float64_type_node;
314+
case GCC_JIT_TYPE_FLOAT128:
315+
if (float128_type_node == NULL || TYPE_PRECISION(float128_type_node) != 128)
316+
{
317+
add_error (NULL, "gcc_jit_types value unsupported on this target: %i", type_);
318+
return NULL;
319+
}
320+
return float128_type_node;
293321

294322
case GCC_JIT_TYPE_SIZE_T:
295323
return size_type_node;

gcc/jit/jit-recording.cc

+40
Original file line numberDiff line numberDiff line change
@@ -2632,6 +2632,18 @@ recording::memento_of_get_type::get_size ()
26322632
case GCC_JIT_TYPE_LONG_DOUBLE:
26332633
size = LONG_DOUBLE_TYPE_SIZE;
26342634
break;
2635+
case GCC_JIT_TYPE_FLOAT16:
2636+
size = 16;
2637+
break;
2638+
case GCC_JIT_TYPE_FLOAT32:
2639+
size = 32;
2640+
break;
2641+
case GCC_JIT_TYPE_FLOAT64:
2642+
size = 64;
2643+
break;
2644+
case GCC_JIT_TYPE_FLOAT128:
2645+
size = 128;
2646+
break;
26352647
case GCC_JIT_TYPE_SIZE_T:
26362648
/* Compare with tree.cc's build_common_tree_nodes. */
26372649
if (strcmp (SIZE_TYPE, "unsigned int") == 0)
@@ -2715,6 +2727,10 @@ recording::memento_of_get_type::dereference ()
27152727
case GCC_JIT_TYPE_BFLOAT16:
27162728
case GCC_JIT_TYPE_DOUBLE:
27172729
case GCC_JIT_TYPE_LONG_DOUBLE:
2730+
case GCC_JIT_TYPE_FLOAT16:
2731+
case GCC_JIT_TYPE_FLOAT32:
2732+
case GCC_JIT_TYPE_FLOAT64:
2733+
case GCC_JIT_TYPE_FLOAT128:
27182734
case GCC_JIT_TYPE_COMPLEX_FLOAT:
27192735
case GCC_JIT_TYPE_COMPLEX_DOUBLE:
27202736
case GCC_JIT_TYPE_COMPLEX_LONG_DOUBLE:
@@ -2780,6 +2796,10 @@ recording::memento_of_get_type::is_int () const
27802796
case GCC_JIT_TYPE_BFLOAT16:
27812797
case GCC_JIT_TYPE_DOUBLE:
27822798
case GCC_JIT_TYPE_LONG_DOUBLE:
2799+
case GCC_JIT_TYPE_FLOAT16:
2800+
case GCC_JIT_TYPE_FLOAT32:
2801+
case GCC_JIT_TYPE_FLOAT64:
2802+
case GCC_JIT_TYPE_FLOAT128:
27832803
return false;
27842804

27852805
case GCC_JIT_TYPE_CONST_CHAR_PTR:
@@ -2839,6 +2859,10 @@ recording::memento_of_get_type::is_signed () const
28392859
case GCC_JIT_TYPE_BFLOAT16:
28402860
case GCC_JIT_TYPE_DOUBLE:
28412861
case GCC_JIT_TYPE_LONG_DOUBLE:
2862+
case GCC_JIT_TYPE_FLOAT16:
2863+
case GCC_JIT_TYPE_FLOAT32:
2864+
case GCC_JIT_TYPE_FLOAT64:
2865+
case GCC_JIT_TYPE_FLOAT128:
28422866

28432867
case GCC_JIT_TYPE_CONST_CHAR_PTR:
28442868

@@ -2899,6 +2923,10 @@ recording::memento_of_get_type::is_float () const
28992923
case GCC_JIT_TYPE_BFLOAT16:
29002924
case GCC_JIT_TYPE_DOUBLE:
29012925
case GCC_JIT_TYPE_LONG_DOUBLE:
2926+
case GCC_JIT_TYPE_FLOAT16:
2927+
case GCC_JIT_TYPE_FLOAT32:
2928+
case GCC_JIT_TYPE_FLOAT64:
2929+
case GCC_JIT_TYPE_FLOAT128:
29022930
return true;
29032931

29042932
case GCC_JIT_TYPE_CONST_CHAR_PTR:
@@ -2963,6 +2991,10 @@ recording::memento_of_get_type::is_bool () const
29632991
case GCC_JIT_TYPE_BFLOAT16:
29642992
case GCC_JIT_TYPE_DOUBLE:
29652993
case GCC_JIT_TYPE_LONG_DOUBLE:
2994+
case GCC_JIT_TYPE_FLOAT16:
2995+
case GCC_JIT_TYPE_FLOAT32:
2996+
case GCC_JIT_TYPE_FLOAT64:
2997+
case GCC_JIT_TYPE_FLOAT128:
29662998
return false;
29672999

29683000
case GCC_JIT_TYPE_CONST_CHAR_PTR:
@@ -3041,6 +3073,10 @@ static const char * const get_type_strings[] = {
30413073
"__int64_t", /* GCC_JIT_TYPE_INT64_T */
30423074
"__int128_t", /* GCC_JIT_TYPE_INT128_T */
30433075
"bfloat16", /* GCC_JIT_TYPE_BFLOAT16 */
3076+
"_Float16", /* GCC_JIT_TYPE_FLOAT16 */
3077+
"_Float32", /* GCC_JIT_TYPE_FLOAT32 */
3078+
"_Float64", /* GCC_JIT_TYPE_FLOAT64 */
3079+
"__float128", /* GCC_JIT_TYPE_FLOAT128 */
30443080

30453081
};
30463082

@@ -3088,6 +3124,10 @@ static const char * const get_type_enum_strings[] = {
30883124
"GCC_JIT_TYPE_INT64_T",
30893125
"GCC_JIT_TYPE_INT128_T",
30903126
"GCC_JIT_TYPE_BFLOAT16",
3127+
"GCC_JIT_TYPE_FLOAT16",
3128+
"GCC_JIT_TYPE_FLOAT32",
3129+
"GCC_JIT_TYPE_FLOAT64",
3130+
"GCC_JIT_TYPE_FLOAT128",
30913131
};
30923132

30933133
void

gcc/jit/libgccjit.h

+4
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,10 @@ enum gcc_jit_types
613613
GCC_JIT_TYPE_INT128_T,
614614

615615
GCC_JIT_TYPE_BFLOAT16,
616+
GCC_JIT_TYPE_FLOAT16,
617+
GCC_JIT_TYPE_FLOAT32,
618+
GCC_JIT_TYPE_FLOAT64,
619+
GCC_JIT_TYPE_FLOAT128,
616620
};
617621

618622
extern gcc_jit_type *

gcc/testsuite/jit.dg/test-types.c

+45
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ struct zoo
5050
float m_float;
5151
double m_double;
5252
long double m_long_double;
53+
_Float16 m_float16;
54+
_Float32 m_float32;
55+
_Float64 m_float64;
56+
__float128 m_float128;
5357

5458
const char *m_const_char_ptr;
5559

@@ -156,6 +160,11 @@ create_code (gcc_jit_context *ctxt, void *user_data)
156160
gcc_jit_field *field_m_long_double =
157161
CREATE_FIELD (GCC_JIT_TYPE_LONG_DOUBLE, "m_long_double");
158162

163+
gcc_jit_field *field_m_float16 = CREATE_FIELD(GCC_JIT_TYPE_FLOAT16, "m_float16");
164+
gcc_jit_field *field_m_float32 = CREATE_FIELD(GCC_JIT_TYPE_FLOAT32, "m_float32");
165+
gcc_jit_field *field_m_float64 = CREATE_FIELD(GCC_JIT_TYPE_FLOAT64, "m_float64");
166+
gcc_jit_field *field_m_float128 = CREATE_FIELD(GCC_JIT_TYPE_FLOAT128, "m_float128");
167+
159168
gcc_jit_field *field_m_const_char_ptr =
160169
CREATE_FIELD (GCC_JIT_TYPE_CONST_CHAR_PTR, "m_const_char_ptr");
161170

@@ -209,6 +218,11 @@ create_code (gcc_jit_context *ctxt, void *user_data)
209218
field_m_double,
210219
field_m_long_double,
211220

221+
field_m_float16,
222+
field_m_float32,
223+
field_m_float64,
224+
field_m_float128,
225+
212226
field_m_const_char_ptr,
213227

214228
field_m_size_t,
@@ -398,6 +412,27 @@ create_code (gcc_jit_context *ctxt, void *user_data)
398412
gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_LONG_DOUBLE),
399413
3.141))
400414

415+
ASSIGN(field_m_float16,
416+
gcc_jit_context_new_rvalue_from_double (
417+
ctxt,
418+
gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_FLOAT16),
419+
3.141))
420+
ASSIGN(field_m_float32,
421+
gcc_jit_context_new_rvalue_from_double (
422+
ctxt,
423+
gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_FLOAT32),
424+
3.141))
425+
ASSIGN(field_m_float64,
426+
gcc_jit_context_new_rvalue_from_double (
427+
ctxt,
428+
gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_FLOAT64),
429+
3.141))
430+
ASSIGN(field_m_float128,
431+
gcc_jit_context_new_rvalue_from_double (
432+
ctxt,
433+
gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_FLOAT128),
434+
3.141))
435+
401436
ASSIGN(field_m_const_char_ptr,
402437
gcc_jit_context_new_rvalue_from_ptr (
403438
ctxt,
@@ -479,6 +514,11 @@ verify_code (gcc_jit_context *ctxt, gcc_jit_result *result)
479514
CHECK_VALUE (z.m_double, 3.141);
480515
CHECK_VALUE (z.m_long_double, 3.141);
481516

517+
CHECK_VALUE (z.m_float16, (_Float16)3.141);
518+
CHECK_VALUE (z.m_float32, (_Float32)3.141);
519+
CHECK_VALUE (z.m_float64, (_Float64)3.141);
520+
CHECK_VALUE (z.m_float128, (__float128)3.141);
521+
482522
CHECK_VALUE (z.m_const_char_ptr, test_string);
483523

484524
CHECK_VALUE (z.m_size_t, sizeof (struct zoo));
@@ -493,6 +533,11 @@ verify_code (gcc_jit_context *ctxt, gcc_jit_result *result)
493533
CHECK_VALUE (gcc_jit_type_get_size (gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_FLOAT)), sizeof (float));
494534
CHECK_VALUE (gcc_jit_type_get_size (gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_DOUBLE)), sizeof (double));
495535

536+
CHECK_VALUE (gcc_jit_type_get_size (gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_FLOAT16)), sizeof(_Float16));
537+
CHECK_VALUE (gcc_jit_type_get_size (gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_FLOAT32)), sizeof(_Float32));
538+
CHECK_VALUE (gcc_jit_type_get_size (gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_FLOAT64)), sizeof(_Float64));
539+
CHECK_VALUE (gcc_jit_type_get_size (gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_FLOAT128)), sizeof(__float128));
540+
496541
gcc_jit_type *int_type = gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT);
497542
gcc_jit_type *array_type1 = gcc_jit_context_new_array_type (ctxt, NULL, int_type, 2);
498543
gcc_jit_type *array_type2 = gcc_jit_context_new_array_type (ctxt, NULL, int_type, 2);

0 commit comments

Comments
 (0)