Skip to content

Commit d8f75a8

Browse files
committed
Add support for sized integer types, including 128-bit integers [PR95325]
2021-05-18 Antoni Boucher <[email protected]> gcc/jit/ PR target/95325 * docs/topics/types.rst: Add documentation for the new types GCC_JIT_TYPE_UINT8_T, GCC_JIT_TYPE_UINT16_T, GCC_JIT_TYPE_UINT32_T, GCC_JIT_TYPE_UINT64_T, GCC_JIT_TYPE_UINT128_T, GCC_JIT_TYPE_INT8_T, GCC_JIT_TYPE_INT16_T, GCC_JIT_TYPE_INT32_T, GCC_JIT_TYPE_INT64_T, GCC_JIT_TYPE_INT128_T. * jit-playback.c: Add support for the sized integer types. * jit-recording.c: Add support for the sized integer types. * libgccjit.h (GCC_JIT_TYPE_UINT8_T, GCC_JIT_TYPE_UINT16_T, GCC_JIT_TYPE_UINT32_T, GCC_JIT_TYPE_UINT64_T, GCC_JIT_TYPE_UINT128_T, GCC_JIT_TYPE_INT8_T, GCC_JIT_TYPE_INT16_T, GCC_JIT_TYPE_INT32_T, GCC_JIT_TYPE_INT64_T, GCC_JIT_TYPE_INT128_T): New enum variants for gcc_jit_types. gcc/testsuite/ PR target/95325 * jit.dg/test-types.c: Add tests for sized integer types. Signed-off-by: Antoni Boucher <[email protected]>
1 parent 117ae9f commit d8f75a8

File tree

5 files changed

+226
-0
lines changed

5 files changed

+226
-0
lines changed

gcc/jit/docs/topics/types.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,16 @@ Standard types
7676
:c:data:`GCC_JIT_TYPE_UNSIGNED_LONG` C's ``unsigned long``
7777
:c:data:`GCC_JIT_TYPE_LONG_LONG` C99's ``long long`` (signed)
7878
:c:data:`GCC_JIT_TYPE_UNSIGNED_LONG_LONG` C99's ``unsigned long long``
79+
:c:data:`GCC_JIT_TYPE_UINT8_T` C99's ``uint8_t``
80+
:c:data:`GCC_JIT_TYPE_UINT16_T` C99's ``uint16_t``
81+
:c:data:`GCC_JIT_TYPE_UINT32_T` C99's ``uint32_t``
82+
:c:data:`GCC_JIT_TYPE_UINT64_T` C99's ``uint64_t``
83+
:c:data:`GCC_JIT_TYPE_UINT128_T` C99's ``__uint128_t``
84+
:c:data:`GCC_JIT_TYPE_INT8_T` C99's ``int8_t``
85+
:c:data:`GCC_JIT_TYPE_INT16_T` C99's ``int16_t``
86+
:c:data:`GCC_JIT_TYPE_INT32_T` C99's ``int32_t``
87+
:c:data:`GCC_JIT_TYPE_INT64_T` C99's ``int64_t``
88+
:c:data:`GCC_JIT_TYPE_INT128_T` C99's ``__int128_t``
7989
:c:data:`GCC_JIT_TYPE_FLOAT`
8090
:c:data:`GCC_JIT_TYPE_DOUBLE`
8191
:c:data:`GCC_JIT_TYPE_LONG_DOUBLE`

gcc/jit/jit-playback.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,27 @@ get_tree_node_for_type (enum gcc_jit_types type_)
193193
case GCC_JIT_TYPE_UNSIGNED_INT:
194194
return unsigned_type_node;
195195

196+
case GCC_JIT_TYPE_UINT8_T:
197+
return unsigned_intQI_type_node;
198+
case GCC_JIT_TYPE_UINT16_T:
199+
return uint16_type_node;
200+
case GCC_JIT_TYPE_UINT32_T:
201+
return uint32_type_node;
202+
case GCC_JIT_TYPE_UINT64_T:
203+
return uint64_type_node;
204+
case GCC_JIT_TYPE_UINT128_T:
205+
return uint128_type_node;
206+
case GCC_JIT_TYPE_INT8_T:
207+
return intQI_type_node;
208+
case GCC_JIT_TYPE_INT16_T:
209+
return intHI_type_node;
210+
case GCC_JIT_TYPE_INT32_T:
211+
return intSI_type_node;
212+
case GCC_JIT_TYPE_INT64_T:
213+
return intDI_type_node;
214+
case GCC_JIT_TYPE_INT128_T:
215+
return intTI_type_node;
216+
196217
case GCC_JIT_TYPE_LONG:
197218
return long_integer_type_node;
198219
case GCC_JIT_TYPE_UNSIGNED_LONG:

gcc/jit/jit-recording.c

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2247,6 +2247,18 @@ recording::memento_of_get_type::get_size ()
22472247
case GCC_JIT_TYPE_UNSIGNED_LONG_LONG:
22482248
size = LONG_LONG_TYPE_SIZE;
22492249
break;
2250+
case GCC_JIT_TYPE_UINT8_T:
2251+
case GCC_JIT_TYPE_UINT16_T:
2252+
case GCC_JIT_TYPE_UINT32_T:
2253+
case GCC_JIT_TYPE_UINT64_T:
2254+
case GCC_JIT_TYPE_UINT128_T:
2255+
case GCC_JIT_TYPE_INT8_T:
2256+
case GCC_JIT_TYPE_INT16_T:
2257+
case GCC_JIT_TYPE_INT32_T:
2258+
case GCC_JIT_TYPE_INT64_T:
2259+
case GCC_JIT_TYPE_INT128_T:
2260+
size = 128;
2261+
break;
22502262
case GCC_JIT_TYPE_FLOAT:
22512263
size = FLOAT_TYPE_SIZE;
22522264
break;
@@ -2295,6 +2307,16 @@ recording::memento_of_get_type::dereference ()
22952307
case GCC_JIT_TYPE_UNSIGNED_LONG:
22962308
case GCC_JIT_TYPE_LONG_LONG:
22972309
case GCC_JIT_TYPE_UNSIGNED_LONG_LONG:
2310+
case GCC_JIT_TYPE_UINT8_T:
2311+
case GCC_JIT_TYPE_UINT16_T:
2312+
case GCC_JIT_TYPE_UINT32_T:
2313+
case GCC_JIT_TYPE_UINT64_T:
2314+
case GCC_JIT_TYPE_UINT128_T:
2315+
case GCC_JIT_TYPE_INT8_T:
2316+
case GCC_JIT_TYPE_INT16_T:
2317+
case GCC_JIT_TYPE_INT32_T:
2318+
case GCC_JIT_TYPE_INT64_T:
2319+
case GCC_JIT_TYPE_INT128_T:
22982320
case GCC_JIT_TYPE_FLOAT:
22992321
case GCC_JIT_TYPE_DOUBLE:
23002322
case GCC_JIT_TYPE_LONG_DOUBLE:
@@ -2347,6 +2369,16 @@ recording::memento_of_get_type::is_int () const
23472369
case GCC_JIT_TYPE_UNSIGNED_LONG:
23482370
case GCC_JIT_TYPE_LONG_LONG:
23492371
case GCC_JIT_TYPE_UNSIGNED_LONG_LONG:
2372+
case GCC_JIT_TYPE_UINT8_T:
2373+
case GCC_JIT_TYPE_UINT16_T:
2374+
case GCC_JIT_TYPE_UINT32_T:
2375+
case GCC_JIT_TYPE_UINT64_T:
2376+
case GCC_JIT_TYPE_UINT128_T:
2377+
case GCC_JIT_TYPE_INT8_T:
2378+
case GCC_JIT_TYPE_INT16_T:
2379+
case GCC_JIT_TYPE_INT32_T:
2380+
case GCC_JIT_TYPE_INT64_T:
2381+
case GCC_JIT_TYPE_INT128_T:
23502382
return true;
23512383

23522384
case GCC_JIT_TYPE_FLOAT:
@@ -2400,6 +2432,16 @@ recording::memento_of_get_type::is_float () const
24002432
case GCC_JIT_TYPE_UNSIGNED_LONG:
24012433
case GCC_JIT_TYPE_LONG_LONG:
24022434
case GCC_JIT_TYPE_UNSIGNED_LONG_LONG:
2435+
case GCC_JIT_TYPE_UINT8_T:
2436+
case GCC_JIT_TYPE_UINT16_T:
2437+
case GCC_JIT_TYPE_UINT32_T:
2438+
case GCC_JIT_TYPE_UINT64_T:
2439+
case GCC_JIT_TYPE_UINT128_T:
2440+
case GCC_JIT_TYPE_INT8_T:
2441+
case GCC_JIT_TYPE_INT16_T:
2442+
case GCC_JIT_TYPE_INT32_T:
2443+
case GCC_JIT_TYPE_INT64_T:
2444+
case GCC_JIT_TYPE_INT128_T:
24032445
return false;
24042446

24052447
case GCC_JIT_TYPE_FLOAT:
@@ -2453,6 +2495,16 @@ recording::memento_of_get_type::is_bool () const
24532495
case GCC_JIT_TYPE_UNSIGNED_LONG:
24542496
case GCC_JIT_TYPE_LONG_LONG:
24552497
case GCC_JIT_TYPE_UNSIGNED_LONG_LONG:
2498+
case GCC_JIT_TYPE_UINT8_T:
2499+
case GCC_JIT_TYPE_UINT16_T:
2500+
case GCC_JIT_TYPE_UINT32_T:
2501+
case GCC_JIT_TYPE_UINT64_T:
2502+
case GCC_JIT_TYPE_UINT128_T:
2503+
case GCC_JIT_TYPE_INT8_T:
2504+
case GCC_JIT_TYPE_INT16_T:
2505+
case GCC_JIT_TYPE_INT32_T:
2506+
case GCC_JIT_TYPE_INT64_T:
2507+
case GCC_JIT_TYPE_INT128_T:
24562508
return false;
24572509

24582510
case GCC_JIT_TYPE_FLOAT:
@@ -2511,6 +2563,17 @@ static const char * const get_type_strings[] = {
25112563
"long long", /* GCC_JIT_TYPE_LONG_LONG */
25122564
"unsigned long long", /* GCC_JIT_TYPE_UNSIGNED_LONG_LONG */
25132565

2566+
"__uint8_t", /* GCC_JIT_TYPE_UINT8_T */
2567+
"__uint16_t", /* GCC_JIT_TYPE_UINT16_T */
2568+
"__uint32_t", /* GCC_JIT_TYPE_UINT32_T */
2569+
"__uint64_t", /* GCC_JIT_TYPE_UINT64_T */
2570+
"__uint128_t", /* GCC_JIT_TYPE_UINT128_T */
2571+
"__int8_t", /* GCC_JIT_TYPE_INT8_T */
2572+
"__int16_t", /* GCC_JIT_TYPE_INT16_T */
2573+
"__int32_t", /* GCC_JIT_TYPE_INT32_T */
2574+
"__int64_t", /* GCC_JIT_TYPE_INT64_T */
2575+
"__int128_t", /* GCC_JIT_TYPE_INT128_T */
2576+
25142577
"float", /* GCC_JIT_TYPE_FLOAT */
25152578
"double", /* GCC_JIT_TYPE_DOUBLE */
25162579
"long double", /* GCC_JIT_TYPE_LONG_DOUBLE */
@@ -2551,6 +2614,16 @@ static const char * const get_type_enum_strings[] = {
25512614
"GCC_JIT_TYPE_UNSIGNED_LONG",
25522615
"GCC_JIT_TYPE_LONG_LONG",
25532616
"GCC_JIT_TYPE_UNSIGNED_LONG_LONG",
2617+
"GCC_JIT_TYPE_UINT8_T",
2618+
"GCC_JIT_TYPE_UINT16_T",
2619+
"GCC_JIT_TYPE_UINT32_T",
2620+
"GCC_JIT_TYPE_UINT64_T",
2621+
"GCC_JIT_TYPE_UINT128_T",
2622+
"GCC_JIT_TYPE_INT8_T",
2623+
"GCC_JIT_TYPE_INT16_T",
2624+
"GCC_JIT_TYPE_INT32_T",
2625+
"GCC_JIT_TYPE_INT64_T",
2626+
"GCC_JIT_TYPE_INT128_T",
25542627
"GCC_JIT_TYPE_FLOAT",
25552628
"GCC_JIT_TYPE_DOUBLE",
25562629
"GCC_JIT_TYPE_LONG_DOUBLE",

gcc/jit/libgccjit.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -548,6 +548,17 @@ enum gcc_jit_types
548548
GCC_JIT_TYPE_LONG_LONG, /* signed */
549549
GCC_JIT_TYPE_UNSIGNED_LONG_LONG,
550550

551+
GCC_JIT_TYPE_UINT8_T,
552+
GCC_JIT_TYPE_UINT16_T,
553+
GCC_JIT_TYPE_UINT32_T,
554+
GCC_JIT_TYPE_UINT64_T,
555+
GCC_JIT_TYPE_UINT128_T,
556+
GCC_JIT_TYPE_INT8_T,
557+
GCC_JIT_TYPE_INT16_T,
558+
GCC_JIT_TYPE_INT32_T,
559+
GCC_JIT_TYPE_INT64_T,
560+
GCC_JIT_TYPE_INT128_T,
561+
551562
/* Floating-point types */
552563

553564
GCC_JIT_TYPE_FLOAT,

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

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include <stdint.h>
12
#include <stdlib.h>
23
#include <stdio.h>
34
#include <stddef.h>
@@ -29,6 +30,18 @@ struct zoo
2930
long long m_long_long;
3031
unsigned long long m_unsigned_long_long;
3132

33+
uint8_t m_u8;
34+
uint16_t m_u16;
35+
uint32_t m_u32;
36+
uint64_t m_u64;
37+
__uint128_t m_u128;
38+
39+
int8_t m_i8;
40+
int16_t m_i16;
41+
int32_t m_i32;
42+
int64_t m_i64;
43+
__int128_t m_i128;
44+
3245
int m_sized_int_type;
3346

3447
float m_float;
@@ -101,6 +114,28 @@ create_code (gcc_jit_context *ctxt, void *user_data)
101114
gcc_jit_field *field_m_unsigned_long_long =
102115
CREATE_FIELD (GCC_JIT_TYPE_UNSIGNED_LONG_LONG, "m_unsigned_long_long");
103116

117+
gcc_jit_field *field_m_u8 =
118+
CREATE_FIELD (GCC_JIT_TYPE_UINT8_T, "m_u8");
119+
gcc_jit_field *field_m_u16 =
120+
CREATE_FIELD (GCC_JIT_TYPE_UINT16_T, "m_u16");
121+
gcc_jit_field *field_m_u32 =
122+
CREATE_FIELD (GCC_JIT_TYPE_UINT32_T, "m_u32");
123+
gcc_jit_field *field_m_u64 =
124+
CREATE_FIELD (GCC_JIT_TYPE_UINT64_T, "m_u64");
125+
gcc_jit_field *field_m_u128 =
126+
CREATE_FIELD (GCC_JIT_TYPE_UINT128_T, "m_u128");
127+
128+
gcc_jit_field *field_m_i8 =
129+
CREATE_FIELD (GCC_JIT_TYPE_INT8_T, "m_i8");
130+
gcc_jit_field *field_m_i16 =
131+
CREATE_FIELD (GCC_JIT_TYPE_INT16_T, "m_i16");
132+
gcc_jit_field *field_m_i32 =
133+
CREATE_FIELD (GCC_JIT_TYPE_INT32_T, "m_i32");
134+
gcc_jit_field *field_m_i64 =
135+
CREATE_FIELD (GCC_JIT_TYPE_INT64_T, "m_i64");
136+
gcc_jit_field *field_m_i128 =
137+
CREATE_FIELD (GCC_JIT_TYPE_INT128_T, "m_i128");
138+
104139
/* Signed int type with sizeof (int): */
105140
gcc_jit_type *sized_int_type =
106141
gcc_jit_context_get_int_type (ctxt, sizeof (int), 1);
@@ -147,6 +182,18 @@ create_code (gcc_jit_context *ctxt, void *user_data)
147182
field_m_long_long,
148183
field_m_unsigned_long_long,
149184

185+
field_m_u8,
186+
field_m_u16,
187+
field_m_u32,
188+
field_m_u64,
189+
field_m_u128,
190+
191+
field_m_i8,
192+
field_m_i16,
193+
field_m_i32,
194+
field_m_i64,
195+
field_m_i128,
196+
150197
field_m_sized_int_type,
151198

152199
field_m_float,
@@ -266,6 +313,58 @@ create_code (gcc_jit_context *ctxt, void *user_data)
266313
gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_UNSIGNED_LONG_LONG),
267314
123456789))
268315

316+
ASSIGN(field_m_u8,
317+
gcc_jit_context_new_rvalue_from_int (
318+
ctxt,
319+
gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_UINT8_T),
320+
123))
321+
ASSIGN(field_m_u16,
322+
gcc_jit_context_new_rvalue_from_int (
323+
ctxt,
324+
gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_UINT16_T),
325+
12345))
326+
ASSIGN(field_m_u32,
327+
gcc_jit_context_new_rvalue_from_int (
328+
ctxt,
329+
gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_UINT32_T),
330+
123456789))
331+
ASSIGN(field_m_u64,
332+
gcc_jit_context_new_rvalue_from_int (
333+
ctxt,
334+
gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_UINT64_T),
335+
123456789))
336+
ASSIGN(field_m_u128,
337+
gcc_jit_context_new_rvalue_from_int (
338+
ctxt,
339+
gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_UINT128_T),
340+
123456789))
341+
342+
ASSIGN(field_m_i8,
343+
gcc_jit_context_new_rvalue_from_int (
344+
ctxt,
345+
gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT8_T),
346+
-1))
347+
ASSIGN(field_m_i16,
348+
gcc_jit_context_new_rvalue_from_int (
349+
ctxt,
350+
gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT16_T),
351+
-2))
352+
ASSIGN(field_m_i32,
353+
gcc_jit_context_new_rvalue_from_int (
354+
ctxt,
355+
gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT32_T),
356+
-3))
357+
ASSIGN(field_m_i64,
358+
gcc_jit_context_new_rvalue_from_int (
359+
ctxt,
360+
gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT64_T),
361+
-4))
362+
ASSIGN(field_m_i128,
363+
gcc_jit_context_new_rvalue_from_int (
364+
ctxt,
365+
gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT128_T),
366+
-5))
367+
269368
ASSIGN(field_m_sized_int_type,
270369
gcc_jit_context_new_rvalue_from_int (
271370
ctxt,
@@ -347,6 +446,18 @@ verify_code (gcc_jit_context *ctxt, gcc_jit_result *result)
347446
CHECK_VALUE (z.m_long_long, -42);
348447
CHECK_VALUE (z.m_unsigned_long_long, 123456789);
349448

449+
CHECK_VALUE (z.m_u8, 123);
450+
CHECK_VALUE (z.m_u16, 12345);
451+
CHECK_VALUE (z.m_u32, 123456789);
452+
CHECK_VALUE (z.m_u64, 123456789);
453+
CHECK_VALUE (z.m_u128, 123456789);
454+
455+
CHECK_VALUE (z.m_i8, -1);
456+
CHECK_VALUE (z.m_i16, -2);
457+
CHECK_VALUE (z.m_i32, -3);
458+
CHECK_VALUE (z.m_i64, -4);
459+
CHECK_VALUE (z.m_i128, -5);
460+
350461
CHECK_VALUE (z.m_sized_int_type, 500);
351462

352463
CHECK_VALUE (z.m_float, 3.141f);

0 commit comments

Comments
 (0)