diff mbox series

aarch64: arm_neon.h - Fix -Wincompatible-pointer-types errors

Message ID 20231209233036.1712956-1-victor.donascimento@arm.com
State New
Headers show
Series aarch64: arm_neon.h - Fix -Wincompatible-pointer-types errors | expand

Commit Message

Victor Do Nascimento Dec. 9, 2023, 11:30 p.m. UTC
In the Linux kernel, u64/s64 are [un]signed long long, not [un]signed
long.  This means that when the `arm_neon.h' header is used by the
kernel, any use of the `uint64_t' / `in64_t' types needs to be
correctly cast to the correct `__builtin_aarch64_simd_di' /
`__builtin_aarch64_simd_df' types when calling the relevant ACLE
builtins.

This patch adds the necessary fixes to ensure that `vstl1_*' and
`vldap1_*' intrinsics are correctly defined for use by the kernel.

gcc/ChangeLog:

	* config/aarch64/arm_neon.h (vldap1_lane_u64): Add
	`const' to `__builtin_aarch64_simd_di *' cast.
	(vldap1q_lane_u64): Likewise.
	(vldap1_lane_s64): Cast __src to `const __builtin_aarch64_simd_di *'.
	(vldap1q_lane_s64): Likewise.
	(vldap1_lane_f64): Cast __src to `const __builtin_aarch64_simd_df *'.
	(vldap1q_lane_f64): Cast __src to `const __builtin_aarch64_simd_df *'.
	(vldap1_lane_p64): Add `const' to `__builtin_aarch64_simd_di *' cast.
	(vldap1q_lane_p64): Add `const' to `__builtin_aarch64_simd_di *' cast.
	(vstl1_lane_u64): remove stray `const'.
	(vstl1_lane_s64): Cast __src to `__builtin_aarch64_simd_di *'.
	(vstl1q_lane_s64): Likewise.
	(vstl1_lane_f64): Cast __src to `const __builtin_aarch64_simd_df *'.
	(vstl1q_lane_f64): Likewise.
---
 gcc/config/aarch64/arm_neon.h | 34 +++++++++++++++++++++-------------
 1 file changed, 21 insertions(+), 13 deletions(-)

Comments

Richard Sandiford Dec. 10, 2023, 1:22 p.m. UTC | #1
Victor Do Nascimento <victor.donascimento@arm.com> writes:
> In the Linux kernel, u64/s64 are [un]signed long long, not [un]signed
> long.  This means that when the `arm_neon.h' header is used by the
> kernel, any use of the `uint64_t' / `in64_t' types needs to be
> correctly cast to the correct `__builtin_aarch64_simd_di' /
> `__builtin_aarch64_simd_df' types when calling the relevant ACLE
> builtins.
>
> This patch adds the necessary fixes to ensure that `vstl1_*' and
> `vldap1_*' intrinsics are correctly defined for use by the kernel.

The patch is OK, but I think it's only a workaround.  The compiler
has its own idea of what the stdint.h types are, with the choice
being guided by the runtime (so glibc for *-linux-gnu).  GCC provides
its own implementation of stdint.h that conforms to the internal
expectations.

If linux defines the types to something else than other things are
likely to break.  E.g. the same sort of issue would be seen if linux
ever wants to use arm_sve.h, and there'll be no simple workaround
for that case.

The types that GCC expects are available as __INT8_TYPE__ etc.
I think linux ACLE code should try to use those (typedefed to
prettier names), and handle the difference from linux's types
at API boundaries.

But the patch is still OK.  Good catch on the stray "const" in
vstl1_lane_u64 btw.

Thanks,
Richard

>
> gcc/ChangeLog:
>
> 	* config/aarch64/arm_neon.h (vldap1_lane_u64): Add
> 	`const' to `__builtin_aarch64_simd_di *' cast.
> 	(vldap1q_lane_u64): Likewise.
> 	(vldap1_lane_s64): Cast __src to `const __builtin_aarch64_simd_di *'.
> 	(vldap1q_lane_s64): Likewise.
> 	(vldap1_lane_f64): Cast __src to `const __builtin_aarch64_simd_df *'.
> 	(vldap1q_lane_f64): Cast __src to `const __builtin_aarch64_simd_df *'.
> 	(vldap1_lane_p64): Add `const' to `__builtin_aarch64_simd_di *' cast.
> 	(vldap1q_lane_p64): Add `const' to `__builtin_aarch64_simd_di *' cast.
> 	(vstl1_lane_u64): remove stray `const'.
> 	(vstl1_lane_s64): Cast __src to `__builtin_aarch64_simd_di *'.
> 	(vstl1q_lane_s64): Likewise.
> 	(vstl1_lane_f64): Cast __src to `const __builtin_aarch64_simd_df *'.
> 	(vstl1q_lane_f64): Likewise.
> ---
>  gcc/config/aarch64/arm_neon.h | 34 +++++++++++++++++++++-------------
>  1 file changed, 21 insertions(+), 13 deletions(-)
>
> diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h
> index ef0d75e07ce..f394de595f7 100644
> --- a/gcc/config/aarch64/arm_neon.h
> +++ b/gcc/config/aarch64/arm_neon.h
> @@ -13456,7 +13456,7 @@ __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
>  vldap1_lane_u64 (const uint64_t *__src, uint64x1_t __vec, const int __lane)
>  {
>    return __builtin_aarch64_vec_ldap1_lanev1di_usus (
> -	  (__builtin_aarch64_simd_di *) __src, __vec, __lane);
> +	  (const __builtin_aarch64_simd_di *) __src, __vec, __lane);
>  }
>  
>  __extension__ extern __inline uint64x2_t
> @@ -13464,35 +13464,39 @@ __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
>  vldap1q_lane_u64 (const uint64_t *__src, uint64x2_t __vec, const int __lane)
>  {
>    return __builtin_aarch64_vec_ldap1_lanev2di_usus (
> -	  (__builtin_aarch64_simd_di *) __src, __vec, __lane);
> +	  (const __builtin_aarch64_simd_di *) __src, __vec, __lane);
>  }
>  
>  __extension__ extern __inline int64x1_t
>  __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
>  vldap1_lane_s64 (const int64_t *__src, int64x1_t __vec, const int __lane)
>  {
> -  return __builtin_aarch64_vec_ldap1_lanev1di (__src, __vec, __lane);
> +  return __builtin_aarch64_vec_ldap1_lanev1di (
> +	  (const __builtin_aarch64_simd_di *) __src, __vec, __lane);
>  }
>  
>  __extension__ extern __inline int64x2_t
>  __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
>  vldap1q_lane_s64 (const int64_t *__src, int64x2_t __vec, const int __lane)
>  {
> -  return __builtin_aarch64_vec_ldap1_lanev2di (__src, __vec, __lane);
> +  return __builtin_aarch64_vec_ldap1_lanev2di (
> +	  (const __builtin_aarch64_simd_di *) __src, __vec, __lane);
>  }
>  
>  __extension__ extern __inline float64x1_t
>  __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
>  vldap1_lane_f64 (const float64_t *__src, float64x1_t __vec, const int __lane)
>  {
> -  return __builtin_aarch64_vec_ldap1_lanev1df (__src, __vec, __lane);
> +  return __builtin_aarch64_vec_ldap1_lanev1df (
> +	  (const __builtin_aarch64_simd_df *) __src, __vec, __lane);
>  }
>  
>  __extension__ extern __inline float64x2_t
>  __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
>  vldap1q_lane_f64 (const float64_t *__src, float64x2_t __vec, const int __lane)
>  {
> -  return __builtin_aarch64_vec_ldap1_lanev2df (__src, __vec, __lane);
> +  return __builtin_aarch64_vec_ldap1_lanev2df (
> +	  (const __builtin_aarch64_simd_df *) __src, __vec, __lane);
>  }
>  
>  __extension__ extern __inline poly64x1_t
> @@ -13500,7 +13504,7 @@ __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
>  vldap1_lane_p64 (const poly64_t *__src, poly64x1_t __vec, const int __lane)
>  {
>    return __builtin_aarch64_vec_ldap1_lanev1di_psps (
> -	  (__builtin_aarch64_simd_di *) __src, __vec, __lane);
> +	  (const __builtin_aarch64_simd_di *) __src, __vec, __lane);
>  }
>  
>  __extension__ extern __inline poly64x2_t
> @@ -13508,14 +13512,14 @@ __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
>  vldap1q_lane_p64 (const poly64_t *__src, poly64x2_t __vec, const int __lane)
>  {
>    return __builtin_aarch64_vec_ldap1_lanev2di_psps (
> -	  (__builtin_aarch64_simd_di *) __src, __vec, __lane);
> +	  (const __builtin_aarch64_simd_di *) __src, __vec, __lane);
>  }
>  
>  /* vstl1_lane.  */
>  
>  __extension__ extern __inline void
>  __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
> -vstl1_lane_u64 (const uint64_t *__src, uint64x1_t __vec, const int __lane)
> +vstl1_lane_u64 (uint64_t *__src, uint64x1_t __vec, const int __lane)
>  {
>    __builtin_aarch64_vec_stl1_lanev1di_sus ((__builtin_aarch64_simd_di *) __src,
>  					   __vec, __lane);
> @@ -13533,28 +13537,32 @@ __extension__ extern __inline void
>  __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
>  vstl1_lane_s64 (int64_t *__src, int64x1_t __vec, const int __lane)
>  {
> -  __builtin_aarch64_vec_stl1_lanev1di (__src, __vec, __lane);
> +  __builtin_aarch64_vec_stl1_lanev1di ((__builtin_aarch64_simd_di *) __src,
> +				       __vec, __lane);
>  }
>  
>  __extension__ extern __inline void
>  __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
>  vstl1q_lane_s64 (int64_t *__src, int64x2_t __vec, const int __lane)
>  {
> -  __builtin_aarch64_vec_stl1_lanev2di (__src, __vec, __lane);
> +  __builtin_aarch64_vec_stl1_lanev2di ((__builtin_aarch64_simd_di *) __src,
> +				       __vec, __lane);
>  }
>  
>  __extension__ extern __inline void
>  __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
>  vstl1_lane_f64 (float64_t *__src, float64x1_t __vec, const int __lane)
>  {
> -  __builtin_aarch64_vec_stl1_lanev1df (__src, __vec, __lane);
> +  __builtin_aarch64_vec_stl1_lanev1df ((__builtin_aarch64_simd_df *) __src,
> +				       __vec, __lane);
>  }
>  
>  __extension__ extern __inline void
>  __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
>  vstl1q_lane_f64 (float64_t *__src, float64x2_t __vec, const int __lane)
>  {
> -  __builtin_aarch64_vec_stl1_lanev2df (__src, __vec, __lane);
> +  __builtin_aarch64_vec_stl1_lanev2df ((__builtin_aarch64_simd_df *) __src,
> +				       __vec, __lane);
>  }
>  
>  __extension__ extern __inline void
diff mbox series

Patch

diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h
index ef0d75e07ce..f394de595f7 100644
--- a/gcc/config/aarch64/arm_neon.h
+++ b/gcc/config/aarch64/arm_neon.h
@@ -13456,7 +13456,7 @@  __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
 vldap1_lane_u64 (const uint64_t *__src, uint64x1_t __vec, const int __lane)
 {
   return __builtin_aarch64_vec_ldap1_lanev1di_usus (
-	  (__builtin_aarch64_simd_di *) __src, __vec, __lane);
+	  (const __builtin_aarch64_simd_di *) __src, __vec, __lane);
 }
 
 __extension__ extern __inline uint64x2_t
@@ -13464,35 +13464,39 @@  __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
 vldap1q_lane_u64 (const uint64_t *__src, uint64x2_t __vec, const int __lane)
 {
   return __builtin_aarch64_vec_ldap1_lanev2di_usus (
-	  (__builtin_aarch64_simd_di *) __src, __vec, __lane);
+	  (const __builtin_aarch64_simd_di *) __src, __vec, __lane);
 }
 
 __extension__ extern __inline int64x1_t
 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
 vldap1_lane_s64 (const int64_t *__src, int64x1_t __vec, const int __lane)
 {
-  return __builtin_aarch64_vec_ldap1_lanev1di (__src, __vec, __lane);
+  return __builtin_aarch64_vec_ldap1_lanev1di (
+	  (const __builtin_aarch64_simd_di *) __src, __vec, __lane);
 }
 
 __extension__ extern __inline int64x2_t
 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
 vldap1q_lane_s64 (const int64_t *__src, int64x2_t __vec, const int __lane)
 {
-  return __builtin_aarch64_vec_ldap1_lanev2di (__src, __vec, __lane);
+  return __builtin_aarch64_vec_ldap1_lanev2di (
+	  (const __builtin_aarch64_simd_di *) __src, __vec, __lane);
 }
 
 __extension__ extern __inline float64x1_t
 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
 vldap1_lane_f64 (const float64_t *__src, float64x1_t __vec, const int __lane)
 {
-  return __builtin_aarch64_vec_ldap1_lanev1df (__src, __vec, __lane);
+  return __builtin_aarch64_vec_ldap1_lanev1df (
+	  (const __builtin_aarch64_simd_df *) __src, __vec, __lane);
 }
 
 __extension__ extern __inline float64x2_t
 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
 vldap1q_lane_f64 (const float64_t *__src, float64x2_t __vec, const int __lane)
 {
-  return __builtin_aarch64_vec_ldap1_lanev2df (__src, __vec, __lane);
+  return __builtin_aarch64_vec_ldap1_lanev2df (
+	  (const __builtin_aarch64_simd_df *) __src, __vec, __lane);
 }
 
 __extension__ extern __inline poly64x1_t
@@ -13500,7 +13504,7 @@  __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
 vldap1_lane_p64 (const poly64_t *__src, poly64x1_t __vec, const int __lane)
 {
   return __builtin_aarch64_vec_ldap1_lanev1di_psps (
-	  (__builtin_aarch64_simd_di *) __src, __vec, __lane);
+	  (const __builtin_aarch64_simd_di *) __src, __vec, __lane);
 }
 
 __extension__ extern __inline poly64x2_t
@@ -13508,14 +13512,14 @@  __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
 vldap1q_lane_p64 (const poly64_t *__src, poly64x2_t __vec, const int __lane)
 {
   return __builtin_aarch64_vec_ldap1_lanev2di_psps (
-	  (__builtin_aarch64_simd_di *) __src, __vec, __lane);
+	  (const __builtin_aarch64_simd_di *) __src, __vec, __lane);
 }
 
 /* vstl1_lane.  */
 
 __extension__ extern __inline void
 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vstl1_lane_u64 (const uint64_t *__src, uint64x1_t __vec, const int __lane)
+vstl1_lane_u64 (uint64_t *__src, uint64x1_t __vec, const int __lane)
 {
   __builtin_aarch64_vec_stl1_lanev1di_sus ((__builtin_aarch64_simd_di *) __src,
 					   __vec, __lane);
@@ -13533,28 +13537,32 @@  __extension__ extern __inline void
 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
 vstl1_lane_s64 (int64_t *__src, int64x1_t __vec, const int __lane)
 {
-  __builtin_aarch64_vec_stl1_lanev1di (__src, __vec, __lane);
+  __builtin_aarch64_vec_stl1_lanev1di ((__builtin_aarch64_simd_di *) __src,
+				       __vec, __lane);
 }
 
 __extension__ extern __inline void
 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
 vstl1q_lane_s64 (int64_t *__src, int64x2_t __vec, const int __lane)
 {
-  __builtin_aarch64_vec_stl1_lanev2di (__src, __vec, __lane);
+  __builtin_aarch64_vec_stl1_lanev2di ((__builtin_aarch64_simd_di *) __src,
+				       __vec, __lane);
 }
 
 __extension__ extern __inline void
 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
 vstl1_lane_f64 (float64_t *__src, float64x1_t __vec, const int __lane)
 {
-  __builtin_aarch64_vec_stl1_lanev1df (__src, __vec, __lane);
+  __builtin_aarch64_vec_stl1_lanev1df ((__builtin_aarch64_simd_df *) __src,
+				       __vec, __lane);
 }
 
 __extension__ extern __inline void
 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
 vstl1q_lane_f64 (float64_t *__src, float64x2_t __vec, const int __lane)
 {
-  __builtin_aarch64_vec_stl1_lanev2df (__src, __vec, __lane);
+  __builtin_aarch64_vec_stl1_lanev2df ((__builtin_aarch64_simd_df *) __src,
+				       __vec, __lane);
 }
 
 __extension__ extern __inline void