diff mbox series

aarch64, acle header: Cast uint64_t pointers to DIMode.

Message ID 20240205145606.93835-1-iain@sandoe.co.uk
State New
Headers show
Series aarch64, acle header: Cast uint64_t pointers to DIMode. | expand

Commit Message

Iain Sandoe Feb. 5, 2024, 2:56 p.m. UTC
Tested on aarch64-linux,darwin and a cross from aarch64-darwin to linux,
OK for trunk, or some alternative is needed?
thanks
Iain

--- 8< ---

Currently, most of the acle tests fail on the Darwin port because
DI mode is "long" and uint64 is "long long".  The fix for this used
in other headers is to cast the pointers using __builtin_aarch64_simd_di
and that is what this patch does.

gcc/ChangeLog:

	* config/aarch64/arm_acle.h (__rndr): Cast uint64 pointer to DI
	mode to avoid typedef mismatches.
	(__rndrrs): Likewise.
---
 gcc/config/aarch64/arm_acle.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Iain Sandoe Feb. 5, 2024, 9:04 p.m. UTC | #1
> On 5 Feb 2024, at 14:56, Iain Sandoe <iains.gcc@gmail.com> wrote:
> 
> Tested on aarch64-linux,darwin and a cross from aarch64-darwin to linux,
> OK for trunk, or some alternative is needed?

Hmm.. apparently, this fails the linaro pre-commit CI for g++ with:
error: invalid conversion from 'long int*' to 'long unsigned int*' [-fpermissive]

So, I guess some alternative is needed, advice welcome,
Iain

> thanks
> Iain
> 
> --- 8< ---
> 
> Currently, most of the acle tests fail on the Darwin port because
> DI mode is "long" and uint64 is "long long".  The fix for this used
> in other headers is to cast the pointers using __builtin_aarch64_simd_di
> and that is what this patch does.
> 
> gcc/ChangeLog:
> 
> 	* config/aarch64/arm_acle.h (__rndr): Cast uint64 pointer to DI
> 	mode to avoid typedef mismatches.
> 	(__rndrrs): Likewise.
> ---
> gcc/config/aarch64/arm_acle.h | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/gcc/config/aarch64/arm_acle.h b/gcc/config/aarch64/arm_acle.h
> index 2aa681090fa..823f87187b1 100644
> --- a/gcc/config/aarch64/arm_acle.h
> +++ b/gcc/config/aarch64/arm_acle.h
> @@ -309,14 +309,14 @@ __extension__ extern __inline int
> __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
> __rndr (uint64_t *__res)
> {
> -  return __builtin_aarch64_rndr (__res);
> +  return __builtin_aarch64_rndr ((__builtin_aarch64_simd_di *) __res);
> }
> 
> __extension__ extern __inline int
> __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
> __rndrrs (uint64_t *__res)
> {
> -  return __builtin_aarch64_rndrrs (__res);
> +  return __builtin_aarch64_rndrrs ((__builtin_aarch64_simd_di *) __res);
> }
> 
> #pragma GCC pop_options
> -- 
> 2.39.2 (Apple Git-143)
>
Richard Sandiford Feb. 15, 2024, 6:05 p.m. UTC | #2
Iain Sandoe <iains.gcc@gmail.com> writes:
>> On 5 Feb 2024, at 14:56, Iain Sandoe <iains.gcc@gmail.com> wrote:
>> 
>> Tested on aarch64-linux,darwin and a cross from aarch64-darwin to linux,
>> OK for trunk, or some alternative is needed?
>
> Hmm.. apparently, this fails the linaro pre-commit CI for g++ with:
> error: invalid conversion from 'long int*' to 'long unsigned int*' [-fpermissive]
>
> So, I guess some alternative is needed, advice welcome,

The builtins are registered with:

static void
aarch64_init_rng_builtins (void)
{
  tree unsigned_ptr_type = build_pointer_type (unsigned_intDI_type_node);
  ...

Does it work if you change unsigned_intDI_type_node to
get_typenode_from_name (UINT64_TYPE)?

Thanks,
Richard
Iain Sandoe Feb. 16, 2024, 1:40 p.m. UTC | #3
> On 15 Feb 2024, at 18:05, Richard Sandiford <richard.sandiford@arm.com> wrote:
> 
> Iain Sandoe <iains.gcc@gmail.com> writes:
>>> On 5 Feb 2024, at 14:56, Iain Sandoe <iains.gcc@gmail.com> wrote:
>>> 
>>> Tested on aarch64-linux,darwin and a cross from aarch64-darwin to linux,
>>> OK for trunk, or some alternative is needed?
>> 
>> Hmm.. apparently, this fails the linaro pre-commit CI for g++ with:
>> error: invalid conversion from 'long int*' to 'long unsigned int*' [-fpermissive]
>> 
>> So, I guess some alternative is needed, advice welcome,
> 
> The builtins are registered with:
> 
> static void
> aarch64_init_rng_builtins (void)
> {
>  tree unsigned_ptr_type = build_pointer_type (unsigned_intDI_type_node);
>  ...
> 
> Does it work if you change unsigned_intDI_type_node to
> get_typenode_from_name (UINT64_TYPE)?

Yes, that works fine; tested on aarch64-linux and aarch64-darwin.

revised, as below,
OK for trunk?
Iain


Subject: [PATCH] aarch64: Register rng builtins with uint64_t pointers.

Currently, these are registered as unsigned_intDI_type_node which is not
necessarily the same type definition as uint64_t.  On platforms where these
differ that causes fails in consuming the arm_acle.h header.

gcc/ChangeLog:

	* config/aarch64/aarch64-builtins.cc (aarch64_init_rng_builtins):
	Register these builtins with a pointer to uint64_t rather than unsigned
	DI mode.
---
 gcc/config/aarch64/aarch64-builtins.cc | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/gcc/config/aarch64/aarch64-builtins.cc b/gcc/config/aarch64/aarch64-builtins.cc
index e211a7271ba..1330558f109 100644
--- a/gcc/config/aarch64/aarch64-builtins.cc
+++ b/gcc/config/aarch64/aarch64-builtins.cc
@@ -1759,7 +1759,8 @@ aarch64_init_tme_builtins (void)
 static void
 aarch64_init_rng_builtins (void)
 {
-  tree unsigned_ptr_type = build_pointer_type (unsigned_intDI_type_node);
+  tree unsigned_ptr_type
+    = build_pointer_type (get_typenode_from_name (UINT64_TYPE));
   tree ftype
     = build_function_type_list (integer_type_node, unsigned_ptr_type, NULL);
   aarch64_builtin_decls[AARCH64_BUILTIN_RNG_RNDR]
Richard Sandiford Feb. 19, 2024, 9:48 a.m. UTC | #4
Iain Sandoe <iain@sandoe.co.uk> writes:
>> On 15 Feb 2024, at 18:05, Richard Sandiford <richard.sandiford@arm.com> wrote:
>> 
>> Iain Sandoe <iains.gcc@gmail.com> writes:
>>>> On 5 Feb 2024, at 14:56, Iain Sandoe <iains.gcc@gmail.com> wrote:
>>>> 
>>>> Tested on aarch64-linux,darwin and a cross from aarch64-darwin to linux,
>>>> OK for trunk, or some alternative is needed?
>>> 
>>> Hmm.. apparently, this fails the linaro pre-commit CI for g++ with:
>>> error: invalid conversion from 'long int*' to 'long unsigned int*' [-fpermissive]
>>> 
>>> So, I guess some alternative is needed, advice welcome,
>> 
>> The builtins are registered with:
>> 
>> static void
>> aarch64_init_rng_builtins (void)
>> {
>>  tree unsigned_ptr_type = build_pointer_type (unsigned_intDI_type_node);
>>  ...
>> 
>> Does it work if you change unsigned_intDI_type_node to
>> get_typenode_from_name (UINT64_TYPE)?
>
> Yes, that works fine; tested on aarch64-linux and aarch64-darwin.
>
> revised, as below,
> OK for trunk?
> Iain
>
>
> Subject: [PATCH] aarch64: Register rng builtins with uint64_t pointers.
>
> Currently, these are registered as unsigned_intDI_type_node which is not
> necessarily the same type definition as uint64_t.  On platforms where these
> differ that causes fails in consuming the arm_acle.h header.
>
> gcc/ChangeLog:
>
> 	* config/aarch64/aarch64-builtins.cc (aarch64_init_rng_builtins):
> 	Register these builtins with a pointer to uint64_t rather than unsigned
> 	DI mode.

OK, thanks.

Richard

> ---
>  gcc/config/aarch64/aarch64-builtins.cc | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/gcc/config/aarch64/aarch64-builtins.cc b/gcc/config/aarch64/aarch64-builtins.cc
> index e211a7271ba..1330558f109 100644
> --- a/gcc/config/aarch64/aarch64-builtins.cc
> +++ b/gcc/config/aarch64/aarch64-builtins.cc
> @@ -1759,7 +1759,8 @@ aarch64_init_tme_builtins (void)
>  static void
>  aarch64_init_rng_builtins (void)
>  {
> -  tree unsigned_ptr_type = build_pointer_type (unsigned_intDI_type_node);
> +  tree unsigned_ptr_type
> +    = build_pointer_type (get_typenode_from_name (UINT64_TYPE));
>    tree ftype
>      = build_function_type_list (integer_type_node, unsigned_ptr_type, NULL);
>    aarch64_builtin_decls[AARCH64_BUILTIN_RNG_RNDR]
diff mbox series

Patch

diff --git a/gcc/config/aarch64/arm_acle.h b/gcc/config/aarch64/arm_acle.h
index 2aa681090fa..823f87187b1 100644
--- a/gcc/config/aarch64/arm_acle.h
+++ b/gcc/config/aarch64/arm_acle.h
@@ -309,14 +309,14 @@  __extension__ extern __inline int
 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
 __rndr (uint64_t *__res)
 {
-  return __builtin_aarch64_rndr (__res);
+  return __builtin_aarch64_rndr ((__builtin_aarch64_simd_di *) __res);
 }
 
 __extension__ extern __inline int
 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
 __rndrrs (uint64_t *__res)
 {
-  return __builtin_aarch64_rndrrs (__res);
+  return __builtin_aarch64_rndrrs ((__builtin_aarch64_simd_di *) __res);
 }
 
 #pragma GCC pop_options