aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2020-01-10 15:05:40 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2020-01-10 15:05:40 +0000
commit7cee96370cf624dbda81fcd3cd32ddb48a2fc3d3 (patch)
tree8b555486f4a8f943cacfa283a8a8a88dada8d7b9 /gcc/config
parentd29c7f605fc6b531eaf351bf5909e7c551fc6b9e (diff)
downloadgcc-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.c17
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: