]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
arm: [MVE intrinsics] add mode_after_pred helper in function_shape
authorChristophe Lyon <christophe.lyon@linaro.org>
Thu, 10 Oct 2024 16:35:23 +0000 (16:35 +0000)
committerChristophe Lyon <christophe.lyon@linaro.org>
Fri, 13 Dec 2024 14:23:29 +0000 (14:23 +0000)
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.

gcc/config/arm/arm-mve-builtins-shapes.cc
gcc/config/arm/arm-mve-builtins.cc
gcc/config/arm/arm-mve-builtins.h

index 12e62122ae4e56eddd7b2a8d126e78d6b09bd426..b5bd03a465bf1c9419db8962357bba0315a1dec0 100644 (file)
@@ -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)
index 36bd66882b5a419488df139ad56b15050e203871..0d8def8c2a57e21b2cf1199e99f2192c21cb497f 100644 (file)
@@ -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,
index 2e48d91d5aa014fa49eae98eac9b55b76c67f215..3e0796f7c09cd0a9ca368a6cc17a8e10e173b20e 100644 (file)
@@ -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 &,