There are quite a few redundant type conversions in arm_neon.h, all of
them are intrinsics taking argument of vector float type and return result
of vector unsigned integer type.

The problem is currently we support UNOP and UNOPU qualifiers for unary
"signed <- signed", "unsigned <- unsigned" respectively, while we are
lack of unary "unsigned <- signed" qualifier which is added by this patch
as UNOPUS.

"vector unsigned int" <- "vector float" should fall into UNOPUS catalogue.

I guess this patch also fix hiding bugs in arm_neon.h which will be exposed
when -Wconversion specified because several builtins are returning inconsistent
types with declared, for example "vcvtas_u32_f32", "vcvtad_u64_f64".

ok for trunk or should wait until stage-1 re-open?

Thanks.

2016-01-11  Jiong. Wang  <jiong.w...@arm.com>

gcc/
  * config/aarch64/aarch64-builtins.c (aarch64_types_unopus_qualifiers):
  New.
  (TYPES_UNOPUS): New.
  * config/aarch64/aarch64-simd-builtins.def (lbtruncuv2sf): Correct
  builtin type, from UNOP to UNOPUS.
  (lbtruncuv4sf): Likewise.
  (lbtruncuv2df): Likewise.
  (lrounduv2sf): Likewise.
  (lrounduv4sf): Likewise.
  (lrounduv2df): Likewise.
  (lroundusf): Likewise.
  (lroundusf): Likewise.
  (lceiluv2sf): Likewise.
  (lceiluv4sf): Likewise.
  (lceiluv2df): Likewise.
  (lceilusf): Likewise.
  (lceiludf): Likewise.
  (lflooruv2sf): Likewise.
  (lflooruv4sf): Likewise.
  (lflooruv2df): Likewise.
  (lfloorusf): Likewise.
  (lfloorudf): Likewise.
  (lfrintnuv2sf): Likewise.
  (lfrintnuv4sf): Likewise.
  (lfrintnuv2df): Likewise.
  (lfrintnusf): Likewise.
  (lfrintnudf): Likewise.
  * config/aarch64/arm_neon.h (vcvt_u32_f32): Remove unncessary type
  conversion.
  (vcvtq_u32_f32): Likewise.
  (vcvtq_u64_f64): Likewise.
  (vcvta_u32_f32): Likewise.
  (vcvtaq_u32_f32): Likewise.
  (vcvtaq_u64_f64): Likewise.
  (vcvtm_u32_f32): Likewise.
  (vcvtmq_u32_f32): Likewise.
  (vcvtmq_u64_f64): Likewise.
  (vcvtn_u32_f32): Likwise.
  (vcvtnq_u32_f32): Likewise.
  (vcvtnq_u64_f64): Likewise.
  (vcvtp_u32_f32): Likewise.
  (vcvtpq_u32_f32): Likewise.
  (vcvtpq_u64_f64): Likewise.
  (vcvtmd_u64_f64): Likewise.
  (vcvtms_u32_f32): Likewise.
  (vcvtad_u64_f64): Likewise.
  (vcvtas_u32_f32): Likewise.
  (vcvtnd_u64_f64): Likewise.
  (vcvtns_u32_f32): Likewise.
  (vcvtpd_u64_f64): Likewise.
  (vcvtps_u32_f32): Likewise.

diff --git a/gcc/config/aarch64/aarch64-builtins.c b/gcc/config/aarch64/aarch64-builtins.c
index a1998ed..2c8dba8 100644
--- a/gcc/config/aarch64/aarch64-builtins.c
+++ b/gcc/config/aarch64/aarch64-builtins.c
@@ -118,6 +118,10 @@ aarch64_types_unopu_qualifiers[SIMD_MAX_BUILTIN_ARGS]
   = { qualifier_unsigned, qualifier_unsigned };
 #define TYPES_UNOPU (aarch64_types_unopu_qualifiers)
 static enum aarch64_type_qualifiers
+aarch64_types_unopus_qualifiers[SIMD_MAX_BUILTIN_ARGS]
+  = { qualifier_unsigned, qualifier_none };
+#define TYPES_UNOPUS (aarch64_types_unopus_qualifiers)
+static enum aarch64_type_qualifiers
 aarch64_types_binop_qualifiers[SIMD_MAX_BUILTIN_ARGS]
   = { qualifier_none, qualifier_none, qualifier_maybe_immediate };
 #define TYPES_BINOP (aarch64_types_binop_qualifiers)
diff --git a/gcc/config/aarch64/aarch64-simd-builtins.def b/gcc/config/aarch64/aarch64-simd-builtins.def
index 654e963..80c17c9 100644
--- a/gcc/config/aarch64/aarch64-simd-builtins.def
+++ b/gcc/config/aarch64/aarch64-simd-builtins.def
@@ -274,9 +274,9 @@
   VAR1 (UNOP, lbtruncv4sf, 2, v4si)
   VAR1 (UNOP, lbtruncv2df, 2, v2di)
 
-  VAR1 (UNOP, lbtruncuv2sf, 2, v2si)
-  VAR1 (UNOP, lbtruncuv4sf, 2, v4si)
-  VAR1 (UNOP, lbtruncuv2df, 2, v2di)
+  VAR1 (UNOPUS, lbtruncuv2sf, 2, v2si)
+  VAR1 (UNOPUS, lbtruncuv4sf, 2, v4si)
+  VAR1 (UNOPUS, lbtruncuv2df, 2, v2di)
 
   VAR1 (UNOP, lroundv2sf, 2, v2si)
   VAR1 (UNOP, lroundv4sf, 2, v4si)
@@ -285,31 +285,31 @@
   VAR1 (UNOP, lroundsf, 2, si)
   VAR1 (UNOP, lrounddf, 2, di)
 
-  VAR1 (UNOP, lrounduv2sf, 2, v2si)
-  VAR1 (UNOP, lrounduv4sf, 2, v4si)
-  VAR1 (UNOP, lrounduv2df, 2, v2di)
-  VAR1 (UNOP, lroundusf, 2, si)
-  VAR1 (UNOP, lroundudf, 2, di)
+  VAR1 (UNOPUS, lrounduv2sf, 2, v2si)
+  VAR1 (UNOPUS, lrounduv4sf, 2, v4si)
+  VAR1 (UNOPUS, lrounduv2df, 2, v2di)
+  VAR1 (UNOPUS, lroundusf, 2, si)
+  VAR1 (UNOPUS, lroundudf, 2, di)
 
   VAR1 (UNOP, lceilv2sf, 2, v2si)
   VAR1 (UNOP, lceilv4sf, 2, v4si)
   VAR1 (UNOP, lceilv2df, 2, v2di)
 
-  VAR1 (UNOP, lceiluv2sf, 2, v2si)
-  VAR1 (UNOP, lceiluv4sf, 2, v4si)
-  VAR1 (UNOP, lceiluv2df, 2, v2di)
-  VAR1 (UNOP, lceilusf, 2, si)
-  VAR1 (UNOP, lceiludf, 2, di)
+  VAR1 (UNOPUS, lceiluv2sf, 2, v2si)
+  VAR1 (UNOPUS, lceiluv4sf, 2, v4si)
+  VAR1 (UNOPUS, lceiluv2df, 2, v2di)
+  VAR1 (UNOPUS, lceilusf, 2, si)
+  VAR1 (UNOPUS, lceiludf, 2, di)
 
   VAR1 (UNOP, lfloorv2sf, 2, v2si)
   VAR1 (UNOP, lfloorv4sf, 2, v4si)
   VAR1 (UNOP, lfloorv2df, 2, v2di)
 
-  VAR1 (UNOP, lflooruv2sf, 2, v2si)
-  VAR1 (UNOP, lflooruv4sf, 2, v4si)
-  VAR1 (UNOP, lflooruv2df, 2, v2di)
-  VAR1 (UNOP, lfloorusf, 2, si)
-  VAR1 (UNOP, lfloorudf, 2, di)
+  VAR1 (UNOPUS, lflooruv2sf, 2, v2si)
+  VAR1 (UNOPUS, lflooruv4sf, 2, v4si)
+  VAR1 (UNOPUS, lflooruv2df, 2, v2di)
+  VAR1 (UNOPUS, lfloorusf, 2, si)
+  VAR1 (UNOPUS, lfloorudf, 2, di)
 
   VAR1 (UNOP, lfrintnv2sf, 2, v2si)
   VAR1 (UNOP, lfrintnv4sf, 2, v4si)
@@ -317,11 +317,11 @@
   VAR1 (UNOP, lfrintnsf, 2, si)
   VAR1 (UNOP, lfrintndf, 2, di)
 
-  VAR1 (UNOP, lfrintnuv2sf, 2, v2si)
-  VAR1 (UNOP, lfrintnuv4sf, 2, v4si)
-  VAR1 (UNOP, lfrintnuv2df, 2, v2di)
-  VAR1 (UNOP, lfrintnusf, 2, si)
-  VAR1 (UNOP, lfrintnudf, 2, di)
+  VAR1 (UNOPUS, lfrintnuv2sf, 2, v2si)
+  VAR1 (UNOPUS, lfrintnuv4sf, 2, v4si)
+  VAR1 (UNOPUS, lfrintnuv2df, 2, v2di)
+  VAR1 (UNOPUS, lfrintnusf, 2, si)
+  VAR1 (UNOPUS, lfrintnudf, 2, di)
 
   /* Implemented by <optab><fcvt_target><VDQF:mode>2.  */
   VAR1 (UNOP, floatv2si, 2, v2sf)
diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h
index e186348..42d604b 100644
--- a/gcc/config/aarch64/arm_neon.h
+++ b/gcc/config/aarch64/arm_neon.h
@@ -13515,9 +13515,7 @@ vcvt_s32_f32 (float32x2_t __a)
 __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 vcvt_u32_f32 (float32x2_t __a)
 {
-  /* TODO: This cast should go away when builtins have
-     their correct types.  */
-  return (uint32x2_t) __builtin_aarch64_lbtruncuv2sfv2si (__a);
+  return __builtin_aarch64_lbtruncuv2sfv2si_us (__a);
 }
 
 __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
@@ -13529,9 +13527,7 @@ vcvtq_s32_f32 (float32x4_t __a)
 __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 vcvtq_u32_f32 (float32x4_t __a)
 {
-  /* TODO: This cast should go away when builtins have
-     their correct types.  */
-  return (uint32x4_t) __builtin_aarch64_lbtruncuv4sfv4si (__a);
+  return __builtin_aarch64_lbtruncuv4sfv4si_us (__a);
 }
 
 __extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
@@ -13543,9 +13539,7 @@ vcvtq_s64_f64 (float64x2_t __a)
 __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 vcvtq_u64_f64 (float64x2_t __a)
 {
-  /* TODO: This cast should go away when builtins have
-     their correct types.  */
-  return (uint64x2_t) __builtin_aarch64_lbtruncuv2dfv2di (__a);
+  return __builtin_aarch64_lbtruncuv2dfv2di_us (__a);
 }
 
 /* vcvta  */
@@ -13559,7 +13553,7 @@ vcvtad_s64_f64 (float64_t __a)
 __extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 vcvtad_u64_f64 (float64_t __a)
 {
-  return __builtin_aarch64_lroundudfdi (__a);
+  return __builtin_aarch64_lroundudfdi_us (__a);
 }
 
 __extension__ static __inline int32_t __attribute__ ((__always_inline__))
@@ -13571,7 +13565,7 @@ vcvtas_s32_f32 (float32_t __a)
 __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 vcvtas_u32_f32 (float32_t __a)
 {
-  return __builtin_aarch64_lroundusfsi (__a);
+  return __builtin_aarch64_lroundusfsi_us (__a);
 }
 
 __extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
@@ -13583,9 +13577,7 @@ vcvta_s32_f32 (float32x2_t __a)
 __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 vcvta_u32_f32 (float32x2_t __a)
 {
-  /* TODO: This cast should go away when builtins have
-     their correct types.  */
-  return (uint32x2_t) __builtin_aarch64_lrounduv2sfv2si (__a);
+  return __builtin_aarch64_lrounduv2sfv2si_us (__a);
 }
 
 __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
@@ -13597,9 +13589,7 @@ vcvtaq_s32_f32 (float32x4_t __a)
 __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 vcvtaq_u32_f32 (float32x4_t __a)
 {
-  /* TODO: This cast should go away when builtins have
-     their correct types.  */
-  return (uint32x4_t) __builtin_aarch64_lrounduv4sfv4si (__a);
+  return __builtin_aarch64_lrounduv4sfv4si_us (__a);
 }
 
 __extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
@@ -13611,9 +13601,7 @@ vcvtaq_s64_f64 (float64x2_t __a)
 __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 vcvtaq_u64_f64 (float64x2_t __a)
 {
-  /* TODO: This cast should go away when builtins have
-     their correct types.  */
-  return (uint64x2_t) __builtin_aarch64_lrounduv2dfv2di (__a);
+  return __builtin_aarch64_lrounduv2dfv2di_us (__a);
 }
 
 /* vcvtm  */
@@ -13627,7 +13615,7 @@ vcvtmd_s64_f64 (float64_t __a)
 __extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 vcvtmd_u64_f64 (float64_t __a)
 {
-  return __builtin_aarch64_lfloorudfdi (__a);
+  return __builtin_aarch64_lfloorudfdi_us (__a);
 }
 
 __extension__ static __inline int32_t __attribute__ ((__always_inline__))
@@ -13639,7 +13627,7 @@ vcvtms_s32_f32 (float32_t __a)
 __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 vcvtms_u32_f32 (float32_t __a)
 {
-  return __builtin_aarch64_lfloorusfsi (__a);
+  return __builtin_aarch64_lfloorusfsi_us (__a);
 }
 
 __extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
@@ -13651,9 +13639,7 @@ vcvtm_s32_f32 (float32x2_t __a)
 __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 vcvtm_u32_f32 (float32x2_t __a)
 {
-  /* TODO: This cast should go away when builtins have
-     their correct types.  */
-  return (uint32x2_t) __builtin_aarch64_lflooruv2sfv2si (__a);
+  return __builtin_aarch64_lflooruv2sfv2si_us (__a);
 }
 
 __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
@@ -13665,9 +13651,7 @@ vcvtmq_s32_f32 (float32x4_t __a)
 __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 vcvtmq_u32_f32 (float32x4_t __a)
 {
-  /* TODO: This cast should go away when builtins have
-     their correct types.  */
-  return (uint32x4_t) __builtin_aarch64_lflooruv4sfv4si (__a);
+  return __builtin_aarch64_lflooruv4sfv4si_us (__a);
 }
 
 __extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
@@ -13679,9 +13663,7 @@ vcvtmq_s64_f64 (float64x2_t __a)
 __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 vcvtmq_u64_f64 (float64x2_t __a)
 {
-  /* TODO: This cast should go away when builtins have
-     their correct types.  */
-  return (uint64x2_t) __builtin_aarch64_lflooruv2dfv2di (__a);
+  return __builtin_aarch64_lflooruv2dfv2di_us (__a);
 }
 
 /* vcvtn  */
@@ -13695,7 +13677,7 @@ vcvtnd_s64_f64 (float64_t __a)
 __extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 vcvtnd_u64_f64 (float64_t __a)
 {
-  return __builtin_aarch64_lfrintnudfdi (__a);
+  return __builtin_aarch64_lfrintnudfdi_us (__a);
 }
 
 __extension__ static __inline int32_t __attribute__ ((__always_inline__))
@@ -13707,7 +13689,7 @@ vcvtns_s32_f32 (float32_t __a)
 __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 vcvtns_u32_f32 (float32_t __a)
 {
-  return __builtin_aarch64_lfrintnusfsi (__a);
+  return __builtin_aarch64_lfrintnusfsi_us (__a);
 }
 
 __extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
@@ -13719,9 +13701,7 @@ vcvtn_s32_f32 (float32x2_t __a)
 __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 vcvtn_u32_f32 (float32x2_t __a)
 {
-  /* TODO: This cast should go away when builtins have
-     their correct types.  */
-  return (uint32x2_t) __builtin_aarch64_lfrintnuv2sfv2si (__a);
+  return __builtin_aarch64_lfrintnuv2sfv2si_us (__a);
 }
 
 __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
@@ -13733,9 +13713,7 @@ vcvtnq_s32_f32 (float32x4_t __a)
 __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 vcvtnq_u32_f32 (float32x4_t __a)
 {
-  /* TODO: This cast should go away when builtins have
-     their correct types.  */
-  return (uint32x4_t) __builtin_aarch64_lfrintnuv4sfv4si (__a);
+  return __builtin_aarch64_lfrintnuv4sfv4si_us (__a);
 }
 
 __extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
@@ -13747,9 +13725,7 @@ vcvtnq_s64_f64 (float64x2_t __a)
 __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 vcvtnq_u64_f64 (float64x2_t __a)
 {
-  /* TODO: This cast should go away when builtins have
-     their correct types.  */
-  return (uint64x2_t) __builtin_aarch64_lfrintnuv2dfv2di (__a);
+  return __builtin_aarch64_lfrintnuv2dfv2di_us (__a);
 }
 
 /* vcvtp  */
@@ -13763,7 +13739,7 @@ vcvtpd_s64_f64 (float64_t __a)
 __extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 vcvtpd_u64_f64 (float64_t __a)
 {
-  return __builtin_aarch64_lceiludfdi (__a);
+  return __builtin_aarch64_lceiludfdi_us (__a);
 }
 
 __extension__ static __inline int32_t __attribute__ ((__always_inline__))
@@ -13775,7 +13751,7 @@ vcvtps_s32_f32 (float32_t __a)
 __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 vcvtps_u32_f32 (float32_t __a)
 {
-  return __builtin_aarch64_lceilusfsi (__a);
+  return __builtin_aarch64_lceilusfsi_us (__a);
 }
 
 __extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
@@ -13787,9 +13763,7 @@ vcvtp_s32_f32 (float32x2_t __a)
 __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 vcvtp_u32_f32 (float32x2_t __a)
 {
-  /* TODO: This cast should go away when builtins have
-     their correct types.  */
-  return (uint32x2_t) __builtin_aarch64_lceiluv2sfv2si (__a);
+  return __builtin_aarch64_lceiluv2sfv2si_us (__a);
 }
 
 __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
@@ -13801,9 +13775,7 @@ vcvtpq_s32_f32 (float32x4_t __a)
 __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 vcvtpq_u32_f32 (float32x4_t __a)
 {
-  /* TODO: This cast should go away when builtins have
-     their correct types.  */
-  return (uint32x4_t) __builtin_aarch64_lceiluv4sfv4si (__a);
+  return __builtin_aarch64_lceiluv4sfv4si_us (__a);
 }
 
 __extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
@@ -13815,9 +13787,7 @@ vcvtpq_s64_f64 (float64x2_t __a)
 __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 vcvtpq_u64_f64 (float64x2_t __a)
 {
-  /* TODO: This cast should go away when builtins have
-     their correct types.  */
-  return (uint64x2_t) __builtin_aarch64_lceiluv2dfv2di (__a);
+  return __builtin_aarch64_lceiluv2dfv2di_us (__a);
 }
 
 /* vdup_n  */

Reply via email to