Skip to content

Commit ff2800a

Browse files
author
Robert Zakrzewski
committed
Add _Float16, _Float32, _Float64 and __float128 support for jit
Fix _Float16 and __float128 support for jit. Add _Float32 and _Float64 support for jit Add Float32 and Float54, update test-types.c
1 parent 2cf6ca7 commit ff2800a

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
@@ -2617,6 +2617,18 @@ recording::memento_of_get_type::get_size ()
26172617
case GCC_JIT_TYPE_LONG_DOUBLE:
26182618
size = LONG_DOUBLE_TYPE_SIZE;
26192619
break;
2620+
case GCC_JIT_TYPE_FLOAT16:
2621+
size = 16;
2622+
break;
2623+
case GCC_JIT_TYPE_FLOAT32:
2624+
size = 32;
2625+
break;
2626+
case GCC_JIT_TYPE_FLOAT64:
2627+
size = 64;
2628+
break;
2629+
case GCC_JIT_TYPE_FLOAT128:
2630+
size = 128;
2631+
break;
26202632
case GCC_JIT_TYPE_SIZE_T:
26212633
/* Compare with tree.cc's build_common_tree_nodes. */
26222634
if (strcmp (SIZE_TYPE, "unsigned int") == 0)
@@ -2700,6 +2712,10 @@ recording::memento_of_get_type::dereference ()
27002712
case GCC_JIT_TYPE_BFLOAT16:
27012713
case GCC_JIT_TYPE_DOUBLE:
27022714
case GCC_JIT_TYPE_LONG_DOUBLE:
2715+
case GCC_JIT_TYPE_FLOAT16:
2716+
case GCC_JIT_TYPE_FLOAT32:
2717+
case GCC_JIT_TYPE_FLOAT64:
2718+
case GCC_JIT_TYPE_FLOAT128:
27032719
case GCC_JIT_TYPE_COMPLEX_FLOAT:
27042720
case GCC_JIT_TYPE_COMPLEX_DOUBLE:
27052721
case GCC_JIT_TYPE_COMPLEX_LONG_DOUBLE:
@@ -2765,6 +2781,10 @@ recording::memento_of_get_type::is_int () const
27652781
case GCC_JIT_TYPE_BFLOAT16:
27662782
case GCC_JIT_TYPE_DOUBLE:
27672783
case GCC_JIT_TYPE_LONG_DOUBLE:
2784+
case GCC_JIT_TYPE_FLOAT16:
2785+
case GCC_JIT_TYPE_FLOAT32:
2786+
case GCC_JIT_TYPE_FLOAT64:
2787+
case GCC_JIT_TYPE_FLOAT128:
27682788
return false;
27692789

27702790
case GCC_JIT_TYPE_CONST_CHAR_PTR:
@@ -2824,6 +2844,10 @@ recording::memento_of_get_type::is_signed () const
28242844
case GCC_JIT_TYPE_BFLOAT16:
28252845
case GCC_JIT_TYPE_DOUBLE:
28262846
case GCC_JIT_TYPE_LONG_DOUBLE:
2847+
case GCC_JIT_TYPE_FLOAT16:
2848+
case GCC_JIT_TYPE_FLOAT32:
2849+
case GCC_JIT_TYPE_FLOAT64:
2850+
case GCC_JIT_TYPE_FLOAT128:
28272851

28282852
case GCC_JIT_TYPE_CONST_CHAR_PTR:
28292853

@@ -2884,6 +2908,10 @@ recording::memento_of_get_type::is_float () const
28842908
case GCC_JIT_TYPE_BFLOAT16:
28852909
case GCC_JIT_TYPE_DOUBLE:
28862910
case GCC_JIT_TYPE_LONG_DOUBLE:
2911+
case GCC_JIT_TYPE_FLOAT16:
2912+
case GCC_JIT_TYPE_FLOAT32:
2913+
case GCC_JIT_TYPE_FLOAT64:
2914+
case GCC_JIT_TYPE_FLOAT128:
28872915
return true;
28882916

28892917
case GCC_JIT_TYPE_CONST_CHAR_PTR:
@@ -2948,6 +2976,10 @@ recording::memento_of_get_type::is_bool () const
29482976
case GCC_JIT_TYPE_BFLOAT16:
29492977
case GCC_JIT_TYPE_DOUBLE:
29502978
case GCC_JIT_TYPE_LONG_DOUBLE:
2979+
case GCC_JIT_TYPE_FLOAT16:
2980+
case GCC_JIT_TYPE_FLOAT32:
2981+
case GCC_JIT_TYPE_FLOAT64:
2982+
case GCC_JIT_TYPE_FLOAT128:
29512983
return false;
29522984

29532985
case GCC_JIT_TYPE_CONST_CHAR_PTR:
@@ -3026,6 +3058,10 @@ static const char * const get_type_strings[] = {
30263058
"__int64_t", /* GCC_JIT_TYPE_INT64_T */
30273059
"__int128_t", /* GCC_JIT_TYPE_INT128_T */
30283060
"bfloat16", /* GCC_JIT_TYPE_BFLOAT16 */
3061+
"_Float16", /* GCC_JIT_TYPE_FLOAT16 */
3062+
"_Float32", /* GCC_JIT_TYPE_FLOAT32 */
3063+
"_Float64", /* GCC_JIT_TYPE_FLOAT64 */
3064+
"__float128", /* GCC_JIT_TYPE_FLOAT128 */
30293065

30303066
};
30313067

@@ -3073,6 +3109,10 @@ static const char * const get_type_enum_strings[] = {
30733109
"GCC_JIT_TYPE_INT64_T",
30743110
"GCC_JIT_TYPE_INT128_T",
30753111
"GCC_JIT_TYPE_BFLOAT16",
3112+
"GCC_JIT_TYPE_FLOAT16",
3113+
"GCC_JIT_TYPE_FLOAT32",
3114+
"GCC_JIT_TYPE_FLOAT64",
3115+
"GCC_JIT_TYPE_FLOAT128",
30763116
};
30773117

30783118
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)