summaryrefslogtreecommitdiff
path: root/0242-Backport-SME-aarch64-Remove-redundant-builtins-code.patch
diff options
context:
space:
mode:
Diffstat (limited to '0242-Backport-SME-aarch64-Remove-redundant-builtins-code.patch')
-rw-r--r--0242-Backport-SME-aarch64-Remove-redundant-builtins-code.patch264
1 files changed, 264 insertions, 0 deletions
diff --git a/0242-Backport-SME-aarch64-Remove-redundant-builtins-code.patch b/0242-Backport-SME-aarch64-Remove-redundant-builtins-code.patch
new file mode 100644
index 0000000..85f8c59
--- /dev/null
+++ b/0242-Backport-SME-aarch64-Remove-redundant-builtins-code.patch
@@ -0,0 +1,264 @@
+From 42bfa9a26205da222cebbe830168b6f0b5e668b4 Mon Sep 17 00:00:00 2001
+From: Richard Sandiford <richard.sandiford@arm.com>
+Date: Tue, 12 Jul 2022 12:59:25 +0100
+Subject: [PATCH 143/157] [Backport][SME] aarch64: Remove redundant builtins
+ code
+
+Reference: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=e80daf04c8888f527d2fc7f6cbcd1b4c853dcd04
+
+aarch64_builtin_vectorized_function handles some built-in functions
+that already have equivalent internal functions. This seems to be
+redundant now, since the target builtins that it chooses are mapped
+to the same optab patterns as the internal functions.
+
+gcc/
+ * config/aarch64/aarch64-builtins.cc
+ (aarch64_builtin_vectorized_function): Remove handling of
+ floor, ceil, trunc, round, nearbyint, sqrt, clz and ctz.
+
+gcc/testsuite/
+ * gcc.target/aarch64/vect_unary_1.c: New test.
+---
+ gcc/config/aarch64/aarch64-builtins.cc | 32 ---
+ .../gcc.target/aarch64/vect_unary_1.c | 186 ++++++++++++++++++
+ 2 files changed, 186 insertions(+), 32 deletions(-)
+ create mode 100644 gcc/testsuite/gcc.target/aarch64/vect_unary_1.c
+
+diff --git a/gcc/config/aarch64/aarch64-builtins.cc b/gcc/config/aarch64/aarch64-builtins.cc
+index 37bb3af48..23a84cd53 100644
+--- a/gcc/config/aarch64/aarch64-builtins.cc
++++ b/gcc/config/aarch64/aarch64-builtins.cc
+@@ -2653,38 +2653,6 @@ aarch64_builtin_vectorized_function (unsigned int fn, tree type_out,
+ switch (fn)
+ {
+ #undef AARCH64_CHECK_BUILTIN_MODE
+-#define AARCH64_CHECK_BUILTIN_MODE(C, N) \
+- (out_mode == V##C##N##Fmode && in_mode == V##C##N##Fmode)
+- CASE_CFN_FLOOR:
+- return AARCH64_FIND_FRINT_VARIANT (floor);
+- CASE_CFN_CEIL:
+- return AARCH64_FIND_FRINT_VARIANT (ceil);
+- CASE_CFN_TRUNC:
+- return AARCH64_FIND_FRINT_VARIANT (btrunc);
+- CASE_CFN_ROUND:
+- return AARCH64_FIND_FRINT_VARIANT (round);
+- CASE_CFN_NEARBYINT:
+- return AARCH64_FIND_FRINT_VARIANT (nearbyint);
+- CASE_CFN_SQRT:
+- return AARCH64_FIND_FRINT_VARIANT (sqrt);
+-#undef AARCH64_CHECK_BUILTIN_MODE
+-#define AARCH64_CHECK_BUILTIN_MODE(C, N) \
+- (out_mode == V##C##SImode && in_mode == V##C##N##Imode)
+- CASE_CFN_CLZ:
+- {
+- if (AARCH64_CHECK_BUILTIN_MODE (4, S))
+- return aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_UNOP_clzv4si];
+- return NULL_TREE;
+- }
+- CASE_CFN_CTZ:
+- {
+- if (AARCH64_CHECK_BUILTIN_MODE (2, S))
+- return aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_UNOP_ctzv2si];
+- else if (AARCH64_CHECK_BUILTIN_MODE (4, S))
+- return aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_UNOP_ctzv4si];
+- return NULL_TREE;
+- }
+-#undef AARCH64_CHECK_BUILTIN_MODE
+ #define AARCH64_CHECK_BUILTIN_MODE(C, N) \
+ (out_mode == V##C##N##Imode && in_mode == V##C##N##Fmode)
+ CASE_CFN_IFLOOR:
+diff --git a/gcc/testsuite/gcc.target/aarch64/vect_unary_1.c b/gcc/testsuite/gcc.target/aarch64/vect_unary_1.c
+new file mode 100644
+index 000000000..8516808be
+--- /dev/null
++++ b/gcc/testsuite/gcc.target/aarch64/vect_unary_1.c
+@@ -0,0 +1,186 @@
++/* { dg-options "-O3 --save-temps" } */
++/* { dg-final { check-function-bodies "**" "" "" } } */
++
++#include <stdint.h>
++
++#define TEST2(OUT, NAME, IN) \
++OUT __attribute__((vector_size(sizeof(OUT) * 2))) \
++test2_##OUT##_##NAME##_##IN (float dummy, \
++ IN __attribute__((vector_size(sizeof(IN) * 2))) y) \
++{ \
++ OUT __attribute__((vector_size(sizeof(OUT) * 2))) x; \
++ x[0] = __builtin_##NAME (y[0]); \
++ x[1] = __builtin_##NAME (y[1]); \
++ return x; \
++} \
++
++#define TEST4(OUT, NAME, IN) \
++OUT __attribute__((vector_size(16))) \
++test4_##OUT##_##NAME##_##IN (float dummy, \
++ IN __attribute__((vector_size(16))) y) \
++{ \
++ OUT __attribute__((vector_size(16))) x; \
++ x[0] = __builtin_##NAME (y[0]); \
++ x[1] = __builtin_##NAME (y[1]); \
++ x[2] = __builtin_##NAME (y[2]); \
++ x[3] = __builtin_##NAME (y[3]); \
++ return x; \
++} \
++
++/*
++** test2_float_truncf_float:
++** frintz v0.2s, v1.2s
++** ret
++*/
++TEST2 (float, truncf, float)
++
++/*
++** test2_double_trunc_double:
++** frintz v0.2d, v1.2d
++** ret
++*/
++TEST2 (double, trunc, double)
++
++/*
++** test4_float_truncf_float:
++** frintz v0.4s, v1.4s
++** ret
++*/
++TEST4 (float, truncf, float)
++
++/*
++** test2_float_roundf_float:
++** frinta v0.2s, v1.2s
++** ret
++*/
++TEST2 (float, roundf, float)
++
++/*
++** test2_double_round_double:
++** frinta v0.2d, v1.2d
++** ret
++*/
++TEST2 (double, round, double)
++
++/*
++** test4_float_roundf_float:
++** frinta v0.4s, v1.4s
++** ret
++*/
++TEST4 (float, roundf, float)
++
++/*
++** test2_float_nearbyintf_float:
++** frinti v0.2s, v1.2s
++** ret
++*/
++TEST2 (float, nearbyintf, float)
++
++/*
++** test2_double_nearbyint_double:
++** frinti v0.2d, v1.2d
++** ret
++*/
++TEST2 (double, nearbyint, double)
++
++/*
++** test4_float_nearbyintf_float:
++** frinti v0.4s, v1.4s
++** ret
++*/
++TEST4 (float, nearbyintf, float)
++
++/*
++** test2_float_floorf_float:
++** frintm v0.2s, v1.2s
++** ret
++*/
++TEST2 (float, floorf, float)
++
++/*
++** test2_double_floor_double:
++** frintm v0.2d, v1.2d
++** ret
++*/
++TEST2 (double, floor, double)
++
++/*
++** test4_float_floorf_float:
++** frintm v0.4s, v1.4s
++** ret
++*/
++TEST4 (float, floorf, float)
++
++/*
++** test2_float_ceilf_float:
++** frintp v0.2s, v1.2s
++** ret
++*/
++TEST2 (float, ceilf, float)
++
++/*
++** test2_double_ceil_double:
++** frintp v0.2d, v1.2d
++** ret
++*/
++TEST2 (double, ceil, double)
++
++/*
++** test4_float_ceilf_float:
++** frintp v0.4s, v1.4s
++** ret
++*/
++TEST4 (float, ceilf, float)
++
++/*
++** test2_float_rintf_float:
++** frintx v0.2s, v1.2s
++** ret
++*/
++TEST2 (float, rintf, float)
++
++/*
++** test2_double_rint_double:
++** frintx v0.2d, v1.2d
++** ret
++*/
++TEST2 (double, rint, double)
++
++/*
++** test4_float_rintf_float:
++** frintx v0.4s, v1.4s
++** ret
++*/
++TEST4 (float, rintf, float)
++
++/*
++** test2_int_clz_int:
++** clz v0.2s, v1.2s
++** ret
++*/
++TEST2 (int, clz, int)
++
++/*
++** test4_int_clz_int:
++** clz v0.4s, v1.4s
++** ret
++*/
++TEST4 (int, clz, int)
++
++/*
++** test2_int_ctz_int:
++** rev32 (v[0-9]+).8b, v1.8b
++** rbit (v[0-9]+).8b, \1.8b
++** clz v0.2s, \2.2s
++** ret
++*/
++TEST2 (int, ctz, int)
++
++/*
++** test4_int_ctz_int:
++** rev32 (v[0-9]+).16b, v1.16b
++** rbit (v[0-9]+).16b, \1.16b
++** clz v0.4s, \2.4s
++** ret
++*/
++TEST4 (int, ctz, int)
+--
+2.33.0
+