diff options
author | Christophe Lyon <christophe.lyon@arm.com> | 2023-02-08 21:18:28 +0000 |
---|---|---|
committer | Christophe Lyon <christophe.lyon@arm.com> | 2023-05-05 16:12:00 +0200 |
commit | 2c9a25a82ead1379b3a1f4f4a77a23104ea238b8 (patch) | |
tree | 705eaf7d94f8522320770b95092b975a619e61d6 | |
parent | 02888679a5b9c1f5916f0f02711dfc513549b7b0 (diff) | |
download | gcc-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.cc | 8 | ||||
-rw-r--r-- | gcc/config/arm/arm-mve-builtins.def | 1 |
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) |