aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Lyon <christophe.lyon@arm.com>2023-02-08 21:18:28 +0000
committerChristophe Lyon <christophe.lyon@arm.com>2023-05-05 16:12:00 +0200
commit2c9a25a82ead1379b3a1f4f4a77a23104ea238b8 (patch)
tree705eaf7d94f8522320770b95092b975a619e61d6
parent02888679a5b9c1f5916f0f02711dfc513549b7b0 (diff)
downloadgcc-2c9a25a82ead1379b3a1f4f4a77a23104ea238b8.zip
gcc-2c9a25a82ead1379b3a1f4f4a77a23104ea238b8.tar.gz
gcc-2c9a25a82ead1379b3a1f4f4a77a23104ea238b8.tar.bz2
arm: [MVE intrinsics] add support for MODE_r
A few intrinsics have an additional mode (MODE_r), which does not always support the same set of predicates as MODE_none and MODE_n. For vqshlq they are the same, but for vshlq they are not. Indeed we have: vqshlq vqshlq_m vqshlq_n vqshlq_m_n vqshlq_r vqshlq_m_r vshlq vshlq_m vshlq_x vshlq_n vshlq_m_n vshlq_x_n vshlq_r vshlq_m_r This patch adds support for it. 2022-09-08 Christophe Lyon <christophe.lyon@arm.com> gcc/ * config/arm/arm-mve-builtins.cc (has_inactive_argument) (finish_opt_n_resolution): Handle MODE_r. * config/arm/arm-mve-builtins.def (r): New mode.
-rw-r--r--gcc/config/arm/arm-mve-builtins.cc8
-rw-r--r--gcc/config/arm/arm-mve-builtins.def1
2 files changed, 7 insertions, 2 deletions
diff --git a/gcc/config/arm/arm-mve-builtins.cc b/gcc/config/arm/arm-mve-builtins.cc
index 91b3ae7..c25b1be 100644
--- a/gcc/config/arm/arm-mve-builtins.cc
+++ b/gcc/config/arm/arm-mve-builtins.cc
@@ -669,7 +669,8 @@ function_instance::has_inactive_argument () const
if (pred != PRED_m)
return false;
- if ((base == functions::vorrq && mode_suffix_id == MODE_n)
+ if (mode_suffix_id == MODE_r
+ || (base == functions::vorrq && mode_suffix_id == MODE_n)
|| (base == functions::vqrshlq && mode_suffix_id == MODE_n)
|| (base == functions::vrshlq && mode_suffix_id == MODE_n))
return false;
@@ -1522,7 +1523,10 @@ finish_opt_n_resolution (unsigned int argno, unsigned int first_argno,
{
if (inferred_type == NUM_TYPE_SUFFIXES)
inferred_type = first_type;
- tree scalar_form = lookup_form (MODE_n, inferred_type);
+ mode_suffix_index scalar_mode = MODE_n;
+ if (mode_suffix_id == MODE_r)
+ scalar_mode = MODE_r;
+ tree scalar_form = lookup_form (scalar_mode, inferred_type);
/* Allow the final argument to be scalar, if an _n form exists. */
if (scalar_argument_p (argno))
diff --git a/gcc/config/arm/arm-mve-builtins.def b/gcc/config/arm/arm-mve-builtins.def
index 49d0736..e3f3787 100644
--- a/gcc/config/arm/arm-mve-builtins.def
+++ b/gcc/config/arm/arm-mve-builtins.def
@@ -35,6 +35,7 @@
DEF_MVE_MODE (n, none, none, none)
DEF_MVE_MODE (offset, none, none, bytes)
+DEF_MVE_MODE (r, none, none, none)
#define REQUIRES_FLOAT false
DEF_MVE_TYPE (mve_pred16_t, boolean_type_node)