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); \