aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Lyon <christophe.lyon@linaro.org>2024-10-10 16:35:23 +0000
committerChristophe Lyon <christophe.lyon@linaro.org>2024-12-13 14:23:29 +0000
commit8080760951b563cedf7b68fcc119f7992bdb39fe (patch)
tree07ea6f369b7d7708865873ffaafff63e923d61a5
parent46dd8acffe8264c5586cf5dc489157ea254dc152 (diff)
downloadgcc-8080760951b563cedf7b68fcc119f7992bdb39fe.zip
gcc-8080760951b563cedf7b68fcc119f7992bdb39fe.tar.gz
gcc-8080760951b563cedf7b68fcc119f7992bdb39fe.tar.bz2
arm: [MVE intrinsics] add mode_after_pred helper in function_shape
This new helper returns true if the mode suffix goes after the predicate suffix. This is true in most cases, so the base implementations in nonoverloaded_base and overloaded_base return true. For instance: vaddq_m_n_s32. This will be useful in later patches to implement vstr?q_scatter_offset_p (_p appears after _offset). gcc/ChangeLog: * config/arm/arm-mve-builtins-shapes.cc (struct nonoverloaded_base): Implement mode_after_pred. (struct overloaded_base): Likewise. * config/arm/arm-mve-builtins.cc (function_builder::get_name): Call mode_after_pred as needed. * config/arm/arm-mve-builtins.h (function_shape): Add mode_after_pred.
-rw-r--r--gcc/config/arm/arm-mve-builtins-shapes.cc12
-rw-r--r--gcc/config/arm/arm-mve-builtins.cc9
-rw-r--r--gcc/config/arm/arm-mve-builtins.h1
3 files changed, 21 insertions, 1 deletions
diff --git a/gcc/config/arm/arm-mve-builtins-shapes.cc b/gcc/config/arm/arm-mve-builtins-shapes.cc
index 12e6212..b5bd03a 100644
--- a/gcc/config/arm/arm-mve-builtins-shapes.cc
+++ b/gcc/config/arm/arm-mve-builtins-shapes.cc
@@ -387,6 +387,12 @@ struct nonoverloaded_base : public function_shape
return false;
}
+ bool
+ mode_after_pred () const override
+ {
+ return true;
+ }
+
tree
resolve (function_resolver &) const override
{
@@ -417,6 +423,12 @@ struct overloaded_base : public function_shape
{
return false;
}
+
+ bool
+ mode_after_pred () const override
+ {
+ return true;
+ }
};
/* <T0>_t vfoo[_t0](<T0>_t, <T0>_t)
diff --git a/gcc/config/arm/arm-mve-builtins.cc b/gcc/config/arm/arm-mve-builtins.cc
index 36bd668..0d8def8 100644
--- a/gcc/config/arm/arm-mve-builtins.cc
+++ b/gcc/config/arm/arm-mve-builtins.cc
@@ -886,11 +886,18 @@ function_builder::get_name (const function_instance &instance,
if (preserve_user_namespace)
append_name ("__arm_");
append_name (instance.base_name);
- append_name (pred_suffixes[instance.pred]);
+
+ if (instance.shape->mode_after_pred ())
+ append_name (pred_suffixes[instance.pred]);
+
if (!overloaded_p
|| instance.shape->explicit_mode_suffix_p (instance.pred,
instance.mode_suffix_id))
append_name (instance.mode_suffix ().string);
+
+ if (!instance.shape->mode_after_pred ())
+ 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,
diff --git a/gcc/config/arm/arm-mve-builtins.h b/gcc/config/arm/arm-mve-builtins.h
index 2e48d91..3e0796f 100644
--- a/gcc/config/arm/arm-mve-builtins.h
+++ b/gcc/config/arm/arm-mve-builtins.h
@@ -580,6 +580,7 @@ public:
enum mode_suffix_index) const = 0;
virtual bool skip_overload_p (enum predication_index,
enum mode_suffix_index) const = 0;
+ virtual bool mode_after_pred () const = 0;
/* Define all functions associated with the given group. */
virtual void build (function_builder &,