diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2020-01-10 15:05:40 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2020-01-10 15:05:40 +0000 |
commit | 7cee96370cf624dbda81fcd3cd32ddb48a2fc3d3 (patch) | |
tree | 8b555486f4a8f943cacfa283a8a8a88dada8d7b9 /gcc/config | |
parent | d29c7f605fc6b531eaf351bf5909e7c551fc6b9e (diff) | |
download | gcc-7cee96370cf624dbda81fcd3cd32ddb48a2fc3d3.zip gcc-7cee96370cf624dbda81fcd3cd32ddb48a2fc3d3.tar.gz gcc-7cee96370cf624dbda81fcd3cd32ddb48a2fc3d3.tar.bz2 |
[AArch64] Tighten mode checks in aarch64_builtin_vectorized_function
aarch64_builtin_vectorized_function checked vectors based on the
number of elements and the element mode. This doesn't interact
well with fixed-length 128-bit SVE, where SVE modes can have those
same properties. (And we can't just use the built-ins for SVE because
the types use a different ABI. SVE handles this kind of thing using
optabs instead.)
2020-01-10 Richard Sandiford <richard.sandiford@arm.com>
gcc/
* config/aarch64/aarch64-builtins.c
(aarch64_builtin_vectorized_function): Check for specific vector modes,
rather than checking the number of elements and the element mode.
From-SVN: r280114
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/aarch64/aarch64-builtins.c | 17 |
1 files changed, 5 insertions, 12 deletions
diff --git a/gcc/config/aarch64/aarch64-builtins.c b/gcc/config/aarch64/aarch64-builtins.c index 1bd2640..33d4c31 100644 --- a/gcc/config/aarch64/aarch64-builtins.c +++ b/gcc/config/aarch64/aarch64-builtins.c @@ -1942,17 +1942,13 @@ aarch64_builtin_vectorized_function (unsigned int fn, tree type_out, tree type_in) { machine_mode in_mode, out_mode; - unsigned HOST_WIDE_INT in_n, out_n; if (TREE_CODE (type_out) != VECTOR_TYPE || TREE_CODE (type_in) != VECTOR_TYPE) return NULL_TREE; - out_mode = TYPE_MODE (TREE_TYPE (type_out)); - in_mode = TYPE_MODE (TREE_TYPE (type_in)); - if (!TYPE_VECTOR_SUBPARTS (type_out).is_constant (&out_n) - || !TYPE_VECTOR_SUBPARTS (type_in).is_constant (&in_n)) - return NULL_TREE; + out_mode = TYPE_MODE (type_out); + in_mode = TYPE_MODE (type_in); #undef AARCH64_CHECK_BUILTIN_MODE #define AARCH64_CHECK_BUILTIN_MODE(C, N) 1 @@ -1968,8 +1964,7 @@ aarch64_builtin_vectorized_function (unsigned int fn, tree type_out, { #undef AARCH64_CHECK_BUILTIN_MODE #define AARCH64_CHECK_BUILTIN_MODE(C, N) \ - (out_mode == N##Fmode && out_n == C \ - && in_mode == N##Fmode && in_n == C) + (out_mode == V##C##N##Fmode && in_mode == V##C##N##Fmode) CASE_CFN_FLOOR: return AARCH64_FIND_FRINT_VARIANT (floor); CASE_CFN_CEIL: @@ -1984,8 +1979,7 @@ aarch64_builtin_vectorized_function (unsigned int fn, tree type_out, return AARCH64_FIND_FRINT_VARIANT (sqrt); #undef AARCH64_CHECK_BUILTIN_MODE #define AARCH64_CHECK_BUILTIN_MODE(C, N) \ - (out_mode == SImode && out_n == C \ - && in_mode == N##Imode && in_n == C) + (out_mode == V##C##SImode && in_mode == V##C##N##Imode) CASE_CFN_CLZ: { if (AARCH64_CHECK_BUILTIN_MODE (4, S)) @@ -2002,8 +1996,7 @@ aarch64_builtin_vectorized_function (unsigned int fn, tree type_out, } #undef AARCH64_CHECK_BUILTIN_MODE #define AARCH64_CHECK_BUILTIN_MODE(C, N) \ - (out_mode == N##Imode && out_n == C \ - && in_mode == N##Fmode && in_n == C) + (out_mode == V##C##N##Imode && in_mode == V##C##N##Fmode) CASE_CFN_IFLOOR: CASE_CFN_LFLOOR: CASE_CFN_LLFLOOR: |