From: Christophe Lyon <[email protected]>

Implement vuninitialized using the new MVE builtins framework.

Introduce a new inherent1 shape to support 'vuninitializedq' with no
type suffix, where the expected type is taken from the first argument.
This can only work in C++, because C does not support such overloading.

gcc/ChangeLog:
        * config/arm/arm-mve-builtins-base.def (vuninitializedq): Add
        inherent1 version.
        * config/arm/arm-mve-builtins-shapes.cc (nonoverloaded_base): Add
        no_type_suffix_p default implementation.
        (overloaded_base): Likewise.
        (inherent1): New.
        * config/arm/arm-mve-builtins-shapes.h (inherent1): New.
        * config/arm/arm-mve-builtins.cc (get_name): Add support for
        no_type_suffix_p.
        * config/arm/arm-mve-builtins.h (function_base): Add
        no_type_suffix_p.
        * config/arm/arm_mve.h (vuninitializedq_u8): Delete.
        (vuninitializedq_u16): Delete.
        (vuninitializedq_u32): Delete.
        (vuninitializedq_u64): Delete.
        (vuninitializedq_s8): Delete.
        (vuninitializedq_s16): Delete.
        (vuninitializedq_s32): Delete.
        (vuninitializedq_s64): Delete.
        (vuninitializedq_f16): Delete.
        (vuninitializedq_f32): Delete.
        (vuninitializedq): Move to not __cplusplus section.
---
 gcc/config/arm/arm-mve-builtins-base.def  |  2 +
 gcc/config/arm/arm-mve-builtins-shapes.cc | 40 +++++++++-
 gcc/config/arm/arm-mve-builtins-shapes.h  |  1 +
 gcc/config/arm/arm-mve-builtins.cc        | 10 ++-
 gcc/config/arm/arm-mve-builtins.h         |  1 +
 gcc/config/arm/arm_mve.h                  | 92 +----------------------
 6 files changed, 52 insertions(+), 94 deletions(-)

diff --git a/gcc/config/arm/arm-mve-builtins-base.def b/gcc/config/arm/arm-mve-builtins-base.def
index 9b9603e87b0..b831cd8de46 100644
--- a/gcc/config/arm/arm-mve-builtins-base.def
+++ b/gcc/config/arm/arm-mve-builtins-base.def
@@ -216,6 +216,7 @@ DEF_MVE_FUNCTION (vstrdq_scatter_base, store_scatter_base, integer_64, p_or_none
 DEF_MVE_FUNCTION (vstrdq_scatter_shifted, store_scatter_offset, integer_64, p_or_none)
 DEF_MVE_FUNCTION (vsubq, binary_opt_n, all_integer, mx_or_none)
 DEF_MVE_FUNCTION (vuninitializedq, inherent, all_integer_with_64, none)
+DEF_MVE_FUNCTION (vuninitializedq, inherent1, all_integer_with_64, none)
 #undef REQUIRES_FLOAT
 
 #define REQUIRES_FLOAT true
@@ -302,4 +303,5 @@ DEF_MVE_FUNCTION (vstrwq_scatter_base, store_scatter_base, float_32, p_or_none)
 DEF_MVE_FUNCTION (vstrwq_scatter_shifted, store_scatter_offset, float_32, p_or_none)
 DEF_MVE_FUNCTION (vsubq, binary_opt_n, all_float, mx_or_none)
 DEF_MVE_FUNCTION (vuninitializedq, inherent, all_float, none)
+DEF_MVE_FUNCTION (vuninitializedq, inherent1, all_float, none)
 #undef REQUIRES_FLOAT
diff --git a/gcc/config/arm/arm-mve-builtins-shapes.cc b/gcc/config/arm/arm-mve-builtins-shapes.cc
index 741c582cef4..3463f618401 100644
--- a/gcc/config/arm/arm-mve-builtins-shapes.cc
+++ b/gcc/config/arm/arm-mve-builtins-shapes.cc
@@ -26,6 +26,7 @@
 #include "memmodel.h"
 #include "insn-codes.h"
 #include "optabs.h"
+#include "langhooks.h"
 #include "arm-mve-builtins.h"
 #include "arm-mve-builtins-shapes.h"
 
@@ -403,6 +404,11 @@ struct nonoverloaded_base : public function_shape
     return true;
   }
 
+  bool no_type_suffix_p () const override
+  {
+    return false;
+  }
+
   tree
   resolve (function_resolver &) const override
   {
@@ -439,6 +445,11 @@ struct overloaded_base : public function_shape
   {
     return true;
   }
+
+  bool no_type_suffix_p () const override
+  {
+    return false;
+  }
 };
 
 /* <T0>_t vfoo[_t0](<T0>_t, <T0>_t)
@@ -1511,8 +1522,7 @@ SHAPE (getq_lane)
 /* <T0>[xN]_t vfoo_t0().
 
    Example: vuninitializedq.
-   int8x16_t [__arm_]vuninitializedq_s8(void)
-   int8x16_t [__arm_]vuninitializedq(int8x16_t t)  */
+   int8x16_t [__arm_]vuninitializedq_s8(void)  */
 struct inherent_def : public nonoverloaded_base
 {
   void
@@ -1524,6 +1534,32 @@ struct inherent_def : public nonoverloaded_base
 };
 SHAPE (inherent)
 
+/* <T0>[xN]_t vfoo(<T0>_t).
+
+   Example: vuninitializedq.
+   int8x16_t [__arm_]vuninitializedq(int8x16_t t)  */
+struct inherent1_def : public nonoverloaded_base
+{
+  bool no_type_suffix_p () const override
+  {
+    return true;
+  }
+
+  void
+  build (function_builder &b, const function_group_info &group,
+	 bool preserve_user_namespace) const override
+  {
+    /* Similar to inherent, but applies only to C++ because in C one cannot
+       distinguish
+       int16x8_t vuninitializedq(int16x8_t t) from
+       int16x8_t vuninitializedq(int16x8_t t).
+       In C, we still rely on the preprocessor definition in arm_mve.h.  */
+    if (lang_GNU_CXX ())
+      build_all (b, "t0,t0", group, MODE_none, preserve_user_namespace);
+  }
+};
+SHAPE (inherent1)
+
 /* <T0>_t vfoo[_t0](const <s0>_t *)
 
    where <s0> is the scalar name of <T0>.
diff --git a/gcc/config/arm/arm-mve-builtins-shapes.h b/gcc/config/arm/arm-mve-builtins-shapes.h
index 22d06ce0ebd..c87821a8e56 100644
--- a/gcc/config/arm/arm-mve-builtins-shapes.h
+++ b/gcc/config/arm/arm-mve-builtins-shapes.h
@@ -62,6 +62,7 @@ namespace arm_mve
     extern const function_shape *const create;
     extern const function_shape *const getq_lane;
     extern const function_shape *const inherent;
+    extern const function_shape *const inherent1;
     extern const function_shape *const load;
     extern const function_shape *const load_ext;
     extern const function_shape *const load_ext_gather_offset;
diff --git a/gcc/config/arm/arm-mve-builtins.cc b/gcc/config/arm/arm-mve-builtins.cc
index b37c91c541b..6ab2a1895e3 100644
--- a/gcc/config/arm/arm-mve-builtins.cc
+++ b/gcc/config/arm/arm-mve-builtins.cc
@@ -907,11 +907,13 @@ function_builder::get_name (const function_instance &instance,
     append_name (pred_suffixes[instance.pred]);
 
   for (unsigned int i = 0; i < 2; ++i)
-    if (!overloaded_p
-	|| instance.shape->explicit_type_suffix_p (i, instance.pred,
-						   instance.mode_suffix_id,
-						   instance.type_suffix (i)))
+    if ((!overloaded_p
+	 || instance.shape->explicit_type_suffix_p (i, instance.pred,
+						    instance.mode_suffix_id,
+						    instance.type_suffix (i)))
+	&& !instance.shape->no_type_suffix_p ())
       append_name (instance.type_suffix (i).string);
+
   return finish_name ();
 }
 
diff --git a/gcc/config/arm/arm-mve-builtins.h b/gcc/config/arm/arm-mve-builtins.h
index 3a0d50dc64c..66eb7cff33c 100644
--- a/gcc/config/arm/arm-mve-builtins.h
+++ b/gcc/config/arm/arm-mve-builtins.h
@@ -586,6 +586,7 @@ public:
   virtual bool skip_overload_p (enum predication_index,
 				enum mode_suffix_index) const = 0;
   virtual bool mode_after_pred () const = 0;
+  virtual bool no_type_suffix_p () const = 0;
 
   /* Define all functions associated with the given group.  */
   virtual void build (function_builder &,
diff --git a/gcc/config/arm/arm_mve.h b/gcc/config/arm/arm_mve.h
index 9710be53911..e34c6a768b9 100644
--- a/gcc/config/arm/arm_mve.h
+++ b/gcc/config/arm/arm_mve.h
@@ -44,96 +44,8 @@
 #pragma GCC arm "arm_mve.h" false
 #endif
 
-#ifndef __ARM_MVE_PRESERVE_USER_NAMESPACE
-#define vuninitializedq(__v) __arm_vuninitializedq(__v)
-
-
-#define vuninitializedq_u8(void) __arm_vuninitializedq_u8(void)
-#define vuninitializedq_u16(void) __arm_vuninitializedq_u16(void)
-#define vuninitializedq_u32(void) __arm_vuninitializedq_u32(void)
-#define vuninitializedq_u64(void) __arm_vuninitializedq_u64(void)
-#define vuninitializedq_s8(void) __arm_vuninitializedq_s8(void)
-#define vuninitializedq_s16(void) __arm_vuninitializedq_s16(void)
-#define vuninitializedq_s32(void) __arm_vuninitializedq_s32(void)
-#define vuninitializedq_s64(void) __arm_vuninitializedq_s64(void)
-#define vuninitializedq_f16(void) __arm_vuninitializedq_f16(void)
-#define vuninitializedq_f32(void) __arm_vuninitializedq_f32(void)
-#endif
-
 #ifdef __cplusplus
 
-__extension__ extern __inline uint8x16_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-__arm_vuninitializedq (uint8x16_t /* __v ATTRIBUTE UNUSED */)
-{
- return __arm_vuninitializedq_u8 ();
-}
-
-__extension__ extern __inline uint16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-__arm_vuninitializedq (uint16x8_t /* __v ATTRIBUTE UNUSED */)
-{
- return __arm_vuninitializedq_u16 ();
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-__arm_vuninitializedq (uint32x4_t /* __v ATTRIBUTE UNUSED */)
-{
- return __arm_vuninitializedq_u32 ();
-}
-
-__extension__ extern __inline uint64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-__arm_vuninitializedq (uint64x2_t /* __v ATTRIBUTE UNUSED */)
-{
- return __arm_vuninitializedq_u64 ();
-}
-
-__extension__ extern __inline int8x16_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-__arm_vuninitializedq (int8x16_t /* __v ATTRIBUTE UNUSED */)
-{
- return __arm_vuninitializedq_s8 ();
-}
-
-__extension__ extern __inline int16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-__arm_vuninitializedq (int16x8_t /* __v ATTRIBUTE UNUSED */)
-{
- return __arm_vuninitializedq_s16 ();
-}
-
-__extension__ extern __inline int32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-__arm_vuninitializedq (int32x4_t /* __v ATTRIBUTE UNUSED */)
-{
- return __arm_vuninitializedq_s32 ();
-}
-
-__extension__ extern __inline int64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-__arm_vuninitializedq (int64x2_t /* __v ATTRIBUTE UNUSED */)
-{
- return __arm_vuninitializedq_s64 ();
-}
-
-#if (__ARM_FEATURE_MVE & 2) /* MVE Floating point.  */
-__extension__ extern __inline float16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-__arm_vuninitializedq (float16x8_t /* __v ATTRIBUTE UNUSED */)
-{
- return __arm_vuninitializedq_f16 ();
-}
-
-__extension__ extern __inline float32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-__arm_vuninitializedq (float32x4_t /* __v ATTRIBUTE UNUSED */)
-{
- return __arm_vuninitializedq_f32 ();
-}
-#endif /* __ARM_FEATURE_MVE & 2 (MVE floating point)  */
-
 #else
 enum {
     __ARM_mve_type_fp_n = 1,
@@ -369,6 +281,10 @@ extern void *__ARM_undef;
     _Generic(param, type: param, const type: param, default: _Generic (param, float*: param, default: *(type *)__ARM_undef))
 #endif
 
+#ifndef __ARM_MVE_PRESERVE_USER_NAMESPACE
+#define vuninitializedq(__v) __arm_vuninitializedq(__v)
+#endif
+
 #if (__ARM_FEATURE_MVE & 2) /* MVE Floating point.  */
 
 #define __arm_vuninitializedq(p0) ({ __typeof(p0) __p0 = (p0); \

Reply via email to