From: Antoni Boucher <bouanto@zoho.com>
To: jit@gcc.gnu.org, gcc-patches@gcc.gnu.org
Subject: [PATCH] libgccjit: Add support for sized integer types, including 128-bit integers [PR95325]
Date: Tue, 18 May 2021 08:23:56 -0400 [thread overview]
Message-ID: <92a0bd2aad201de75a71d0a00414e518cf1716e6.camel@zoho.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 238 bytes --]
Hello.
This patch add support for sized integer types.
Maybe it should check whether the size of a byte for the current
platform is 8 bits and do other checks so that they're only available
when it makes sense.
What do you think?
Thanks.
[-- Attachment #2: 0001-Add-support-for-sized-integer-types-including-128-bi.patch --]
[-- Type: text/x-patch, Size: 11816 bytes --]
From d194a03fe3f2e8164c39413b79da9c43e236cf37 Mon Sep 17 00:00:00 2001
From: Antoni Boucher <bouanto@zoho.com>
Date: Mon, 10 May 2021 19:43:02 -0400
Subject: [PATCH] Add support for sized integer types, including 128-bit
integers [PR95325]
2021-05-18 Antoni Boucher <bouanto@zoho.com>
gcc/jit/
PR target/95325
* 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.
---
gcc/jit/jit-playback.c | 21 ++++++
gcc/jit/jit-recording.c | 73 ++++++++++++++++++++
gcc/jit/libgccjit.h | 11 +++
gcc/testsuite/jit.dg/test-types.c | 111 ++++++++++++++++++++++++++++++
4 files changed, 216 insertions(+)
diff --git a/gcc/jit/jit-playback.c b/gcc/jit/jit-playback.c
index c6136301243..40630aa1ab8 100644
--- a/gcc/jit/jit-playback.c
+++ b/gcc/jit/jit-playback.c
@@ -193,6 +193,27 @@ get_tree_node_for_type (enum gcc_jit_types type_)
case GCC_JIT_TYPE_UNSIGNED_INT:
return unsigned_type_node;
+ case GCC_JIT_TYPE_UINT8_T:
+ return unsigned_intQI_type_node;
+ case GCC_JIT_TYPE_UINT16_T:
+ return uint16_type_node;
+ case GCC_JIT_TYPE_UINT32_T:
+ return uint32_type_node;
+ case GCC_JIT_TYPE_UINT64_T:
+ return uint64_type_node;
+ case GCC_JIT_TYPE_UINT128_T:
+ return uint128_type_node;
+ case GCC_JIT_TYPE_INT8_T:
+ return intQI_type_node;
+ case GCC_JIT_TYPE_INT16_T:
+ return intHI_type_node;
+ case GCC_JIT_TYPE_INT32_T:
+ return intSI_type_node;
+ case GCC_JIT_TYPE_INT64_T:
+ return intDI_type_node;
+ case GCC_JIT_TYPE_INT128_T:
+ return intTI_type_node;
+
case GCC_JIT_TYPE_LONG:
return long_integer_type_node;
case GCC_JIT_TYPE_UNSIGNED_LONG:
diff --git a/gcc/jit/jit-recording.c b/gcc/jit/jit-recording.c
index 117ff70114c..b67ae8bfb78 100644
--- a/gcc/jit/jit-recording.c
+++ b/gcc/jit/jit-recording.c
@@ -2247,6 +2247,18 @@ recording::memento_of_get_type::get_size ()
case GCC_JIT_TYPE_UNSIGNED_LONG_LONG:
size = LONG_LONG_TYPE_SIZE;
break;
+ case GCC_JIT_TYPE_UINT8_T:
+ case GCC_JIT_TYPE_UINT16_T:
+ case GCC_JIT_TYPE_UINT32_T:
+ case GCC_JIT_TYPE_UINT64_T:
+ case GCC_JIT_TYPE_UINT128_T:
+ case GCC_JIT_TYPE_INT8_T:
+ case GCC_JIT_TYPE_INT16_T:
+ case GCC_JIT_TYPE_INT32_T:
+ case GCC_JIT_TYPE_INT64_T:
+ case GCC_JIT_TYPE_INT128_T:
+ size = 128;
+ break;
case GCC_JIT_TYPE_FLOAT:
size = FLOAT_TYPE_SIZE;
break;
@@ -2295,6 +2307,16 @@ recording::memento_of_get_type::dereference ()
case GCC_JIT_TYPE_UNSIGNED_LONG:
case GCC_JIT_TYPE_LONG_LONG:
case GCC_JIT_TYPE_UNSIGNED_LONG_LONG:
+ case GCC_JIT_TYPE_UINT8_T:
+ case GCC_JIT_TYPE_UINT16_T:
+ case GCC_JIT_TYPE_UINT32_T:
+ case GCC_JIT_TYPE_UINT64_T:
+ case GCC_JIT_TYPE_UINT128_T:
+ case GCC_JIT_TYPE_INT8_T:
+ case GCC_JIT_TYPE_INT16_T:
+ case GCC_JIT_TYPE_INT32_T:
+ case GCC_JIT_TYPE_INT64_T:
+ case GCC_JIT_TYPE_INT128_T:
case GCC_JIT_TYPE_FLOAT:
case GCC_JIT_TYPE_DOUBLE:
case GCC_JIT_TYPE_LONG_DOUBLE:
@@ -2347,6 +2369,16 @@ recording::memento_of_get_type::is_int () const
case GCC_JIT_TYPE_UNSIGNED_LONG:
case GCC_JIT_TYPE_LONG_LONG:
case GCC_JIT_TYPE_UNSIGNED_LONG_LONG:
+ case GCC_JIT_TYPE_UINT8_T:
+ case GCC_JIT_TYPE_UINT16_T:
+ case GCC_JIT_TYPE_UINT32_T:
+ case GCC_JIT_TYPE_UINT64_T:
+ case GCC_JIT_TYPE_UINT128_T:
+ case GCC_JIT_TYPE_INT8_T:
+ case GCC_JIT_TYPE_INT16_T:
+ case GCC_JIT_TYPE_INT32_T:
+ case GCC_JIT_TYPE_INT64_T:
+ case GCC_JIT_TYPE_INT128_T:
return true;
case GCC_JIT_TYPE_FLOAT:
@@ -2400,6 +2432,16 @@ recording::memento_of_get_type::is_float () const
case GCC_JIT_TYPE_UNSIGNED_LONG:
case GCC_JIT_TYPE_LONG_LONG:
case GCC_JIT_TYPE_UNSIGNED_LONG_LONG:
+ case GCC_JIT_TYPE_UINT8_T:
+ case GCC_JIT_TYPE_UINT16_T:
+ case GCC_JIT_TYPE_UINT32_T:
+ case GCC_JIT_TYPE_UINT64_T:
+ case GCC_JIT_TYPE_UINT128_T:
+ case GCC_JIT_TYPE_INT8_T:
+ case GCC_JIT_TYPE_INT16_T:
+ case GCC_JIT_TYPE_INT32_T:
+ case GCC_JIT_TYPE_INT64_T:
+ case GCC_JIT_TYPE_INT128_T:
return false;
case GCC_JIT_TYPE_FLOAT:
@@ -2453,6 +2495,16 @@ recording::memento_of_get_type::is_bool () const
case GCC_JIT_TYPE_UNSIGNED_LONG:
case GCC_JIT_TYPE_LONG_LONG:
case GCC_JIT_TYPE_UNSIGNED_LONG_LONG:
+ case GCC_JIT_TYPE_UINT8_T:
+ case GCC_JIT_TYPE_UINT16_T:
+ case GCC_JIT_TYPE_UINT32_T:
+ case GCC_JIT_TYPE_UINT64_T:
+ case GCC_JIT_TYPE_UINT128_T:
+ case GCC_JIT_TYPE_INT8_T:
+ case GCC_JIT_TYPE_INT16_T:
+ case GCC_JIT_TYPE_INT32_T:
+ case GCC_JIT_TYPE_INT64_T:
+ case GCC_JIT_TYPE_INT128_T:
return false;
case GCC_JIT_TYPE_FLOAT:
@@ -2511,6 +2563,17 @@ static const char * const get_type_strings[] = {
"long long", /* GCC_JIT_TYPE_LONG_LONG */
"unsigned long long", /* GCC_JIT_TYPE_UNSIGNED_LONG_LONG */
+ "__uint8_t", /* GCC_JIT_TYPE_UINT8_T */
+ "__uint16_t", /* GCC_JIT_TYPE_UINT16_T */
+ "__uint32_t", /* GCC_JIT_TYPE_UINT32_T */
+ "__uint64_t", /* GCC_JIT_TYPE_UINT64_T */
+ "__uint128_t", /* GCC_JIT_TYPE_UINT128_T */
+ "__int8_t", /* GCC_JIT_TYPE_INT8_T */
+ "__int16_t", /* GCC_JIT_TYPE_INT16_T */
+ "__int32_t", /* GCC_JIT_TYPE_INT32_T */
+ "__int64_t", /* GCC_JIT_TYPE_INT64_T */
+ "__int128_t", /* GCC_JIT_TYPE_INT128_T */
+
"float", /* GCC_JIT_TYPE_FLOAT */
"double", /* GCC_JIT_TYPE_DOUBLE */
"long double", /* GCC_JIT_TYPE_LONG_DOUBLE */
@@ -2551,6 +2614,16 @@ static const char * const get_type_enum_strings[] = {
"GCC_JIT_TYPE_UNSIGNED_LONG",
"GCC_JIT_TYPE_LONG_LONG",
"GCC_JIT_TYPE_UNSIGNED_LONG_LONG",
+ "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",
"GCC_JIT_TYPE_FLOAT",
"GCC_JIT_TYPE_DOUBLE",
"GCC_JIT_TYPE_LONG_DOUBLE",
diff --git a/gcc/jit/libgccjit.h b/gcc/jit/libgccjit.h
index 5c722c2c57f..5d88033a2ab 100644
--- a/gcc/jit/libgccjit.h
+++ b/gcc/jit/libgccjit.h
@@ -548,6 +548,17 @@ enum gcc_jit_types
GCC_JIT_TYPE_LONG_LONG, /* signed */
GCC_JIT_TYPE_UNSIGNED_LONG_LONG,
+ 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,
+
/* Floating-point types */
GCC_JIT_TYPE_FLOAT,
diff --git a/gcc/testsuite/jit.dg/test-types.c b/gcc/testsuite/jit.dg/test-types.c
index 8debcd7eb82..9c66284f193 100644
--- a/gcc/testsuite/jit.dg/test-types.c
+++ b/gcc/testsuite/jit.dg/test-types.c
@@ -1,3 +1,4 @@
+#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
@@ -29,6 +30,18 @@ struct zoo
long long m_long_long;
unsigned long long m_unsigned_long_long;
+ uint8_t m_u8;
+ uint16_t m_u16;
+ uint32_t m_u32;
+ uint64_t m_u64;
+ __uint128_t m_u128;
+
+ int8_t m_i8;
+ int16_t m_i16;
+ int32_t m_i32;
+ int64_t m_i64;
+ __int128_t m_i128;
+
int m_sized_int_type;
float m_float;
@@ -101,6 +114,28 @@ create_code (gcc_jit_context *ctxt, void *user_data)
gcc_jit_field *field_m_unsigned_long_long =
CREATE_FIELD (GCC_JIT_TYPE_UNSIGNED_LONG_LONG, "m_unsigned_long_long");
+ gcc_jit_field *field_m_u8 =
+ CREATE_FIELD (GCC_JIT_TYPE_UINT8_T, "m_u8");
+ gcc_jit_field *field_m_u16 =
+ CREATE_FIELD (GCC_JIT_TYPE_UINT16_T, "m_u16");
+ gcc_jit_field *field_m_u32 =
+ CREATE_FIELD (GCC_JIT_TYPE_UINT32_T, "m_u32");
+ gcc_jit_field *field_m_u64 =
+ CREATE_FIELD (GCC_JIT_TYPE_UINT64_T, "m_u64");
+ gcc_jit_field *field_m_u128 =
+ CREATE_FIELD (GCC_JIT_TYPE_UINT128_T, "m_u128");
+
+ gcc_jit_field *field_m_i8 =
+ CREATE_FIELD (GCC_JIT_TYPE_INT8_T, "m_i8");
+ gcc_jit_field *field_m_i16 =
+ CREATE_FIELD (GCC_JIT_TYPE_INT16_T, "m_i16");
+ gcc_jit_field *field_m_i32 =
+ CREATE_FIELD (GCC_JIT_TYPE_INT32_T, "m_i32");
+ gcc_jit_field *field_m_i64 =
+ CREATE_FIELD (GCC_JIT_TYPE_INT64_T, "m_i64");
+ gcc_jit_field *field_m_i128 =
+ CREATE_FIELD (GCC_JIT_TYPE_INT128_T, "m_i128");
+
/* Signed int type with sizeof (int): */
gcc_jit_type *sized_int_type =
gcc_jit_context_get_int_type (ctxt, sizeof (int), 1);
@@ -147,6 +182,18 @@ create_code (gcc_jit_context *ctxt, void *user_data)
field_m_long_long,
field_m_unsigned_long_long,
+ field_m_u8,
+ field_m_u16,
+ field_m_u32,
+ field_m_u64,
+ field_m_u128,
+
+ field_m_i8,
+ field_m_i16,
+ field_m_i32,
+ field_m_i64,
+ field_m_i128,
+
field_m_sized_int_type,
field_m_float,
@@ -266,6 +313,58 @@ create_code (gcc_jit_context *ctxt, void *user_data)
gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_UNSIGNED_LONG_LONG),
123456789))
+ ASSIGN(field_m_u8,
+ gcc_jit_context_new_rvalue_from_int (
+ ctxt,
+ gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_UINT8_T),
+ 123))
+ ASSIGN(field_m_u16,
+ gcc_jit_context_new_rvalue_from_int (
+ ctxt,
+ gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_UINT16_T),
+ 12345))
+ ASSIGN(field_m_u32,
+ gcc_jit_context_new_rvalue_from_int (
+ ctxt,
+ gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_UINT32_T),
+ 123456789))
+ ASSIGN(field_m_u64,
+ gcc_jit_context_new_rvalue_from_int (
+ ctxt,
+ gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_UINT64_T),
+ 123456789))
+ ASSIGN(field_m_u128,
+ gcc_jit_context_new_rvalue_from_int (
+ ctxt,
+ gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_UINT128_T),
+ 123456789))
+
+ ASSIGN(field_m_i8,
+ gcc_jit_context_new_rvalue_from_int (
+ ctxt,
+ gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT8_T),
+ -1))
+ ASSIGN(field_m_i16,
+ gcc_jit_context_new_rvalue_from_int (
+ ctxt,
+ gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT16_T),
+ -2))
+ ASSIGN(field_m_i32,
+ gcc_jit_context_new_rvalue_from_int (
+ ctxt,
+ gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT32_T),
+ -3))
+ ASSIGN(field_m_i64,
+ gcc_jit_context_new_rvalue_from_int (
+ ctxt,
+ gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT64_T),
+ -4))
+ ASSIGN(field_m_i128,
+ gcc_jit_context_new_rvalue_from_int (
+ ctxt,
+ gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT128_T),
+ -5))
+
ASSIGN(field_m_sized_int_type,
gcc_jit_context_new_rvalue_from_int (
ctxt,
@@ -347,6 +446,18 @@ verify_code (gcc_jit_context *ctxt, gcc_jit_result *result)
CHECK_VALUE (z.m_long_long, -42);
CHECK_VALUE (z.m_unsigned_long_long, 123456789);
+ CHECK_VALUE (z.m_u8, 123);
+ CHECK_VALUE (z.m_u16, 12345);
+ CHECK_VALUE (z.m_u32, 123456789);
+ CHECK_VALUE (z.m_u64, 123456789);
+ CHECK_VALUE (z.m_u128, 123456789);
+
+ CHECK_VALUE (z.m_i8, -1);
+ CHECK_VALUE (z.m_i16, -2);
+ CHECK_VALUE (z.m_i32, -3);
+ CHECK_VALUE (z.m_i64, -4);
+ CHECK_VALUE (z.m_i128, -5);
+
CHECK_VALUE (z.m_sized_int_type, 500);
CHECK_VALUE (z.m_float, 3.141f);
--
2.31.1
next reply other threads:[~2021-05-18 12:24 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-18 12:23 Antoni Boucher [this message]
2021-05-18 12:36 ` Antoni Boucher
2021-05-18 12:53 ` Jakub Jelinek
2021-05-20 19:25 ` David Malcolm
2022-01-04 3:13 ` Antoni Boucher
2022-01-21 16:22 ` Antoni Boucher
2022-04-08 20:29 ` Antoni Boucher
2022-04-12 21:32 ` David Malcolm
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=92a0bd2aad201de75a71d0a00414e518cf1716e6.camel@zoho.com \
--to=bouanto@zoho.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=jit@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).