summaryrefslogtreecommitdiff
path: root/0155-Backport-SME-aarch64-Generalise-require_immediate_la.patch
diff options
context:
space:
mode:
Diffstat (limited to '0155-Backport-SME-aarch64-Generalise-require_immediate_la.patch')
-rw-r--r--0155-Backport-SME-aarch64-Generalise-require_immediate_la.patch164
1 files changed, 164 insertions, 0 deletions
diff --git a/0155-Backport-SME-aarch64-Generalise-require_immediate_la.patch b/0155-Backport-SME-aarch64-Generalise-require_immediate_la.patch
new file mode 100644
index 0000000..3a47094
--- /dev/null
+++ b/0155-Backport-SME-aarch64-Generalise-require_immediate_la.patch
@@ -0,0 +1,164 @@
+From cb6d55f6bc7c490f72a43dd87543ab7a7ea582a8 Mon Sep 17 00:00:00 2001
+From: Richard Sandiford <richard.sandiford@arm.com>
+Date: Tue, 5 Dec 2023 10:11:18 +0000
+Subject: [PATCH 056/157] [Backport][SME] aarch64: Generalise
+ require_immediate_lane_index
+
+Reference: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=c0cf2c893d54420b0c19fee7bd41ae40017d0106
+
+require_immediate_lane_index previously hard-coded the assumption
+that the group size is determined by the argument immediately before
+the index. However, for SME, there are cases where it should be
+determined by an earlier argument instead.
+
+gcc/
+ * config/aarch64/aarch64-sve-builtins.h:
+ (function_checker::require_immediate_lane_index): Add an argument
+ for the index of the indexed vector argument.
+ * config/aarch64/aarch64-sve-builtins.cc
+ (function_checker::require_immediate_lane_index): Likewise.
+ * config/aarch64/aarch64-sve-builtins-shapes.cc
+ (ternary_bfloat_lane_base::check): Update accordingly.
+ (ternary_qq_lane_base::check): Likewise.
+ (binary_lane_def::check): Likewise.
+ (binary_long_lane_def::check): Likewise.
+ (ternary_lane_def::check): Likewise.
+ (ternary_lane_rotate_def::check): Likewise.
+ (ternary_long_lane_def::check): Likewise.
+ (ternary_qq_lane_rotate_def::check): Likewise.
+---
+ .../aarch64/aarch64-sve-builtins-shapes.cc | 16 ++++++++--------
+ gcc/config/aarch64/aarch64-sve-builtins.cc | 18 ++++++++++++------
+ gcc/config/aarch64/aarch64-sve-builtins.h | 3 ++-
+ 3 files changed, 22 insertions(+), 15 deletions(-)
+
+diff --git a/gcc/config/aarch64/aarch64-sve-builtins-shapes.cc b/gcc/config/aarch64/aarch64-sve-builtins-shapes.cc
+index f57f92698..4fa4181b9 100644
+--- a/gcc/config/aarch64/aarch64-sve-builtins-shapes.cc
++++ b/gcc/config/aarch64/aarch64-sve-builtins-shapes.cc
+@@ -941,7 +941,7 @@ struct ternary_bfloat_lane_base
+ bool
+ check (function_checker &c) const OVERRIDE
+ {
+- return c.require_immediate_lane_index (3, N);
++ return c.require_immediate_lane_index (3, 2, N);
+ }
+ };
+
+@@ -956,7 +956,7 @@ struct ternary_qq_lane_base
+ bool
+ check (function_checker &c) const OVERRIDE
+ {
+- return c.require_immediate_lane_index (3, 4);
++ return c.require_immediate_lane_index (3, 0);
+ }
+ };
+
+@@ -1123,7 +1123,7 @@ struct binary_lane_def : public overloaded_base<0>
+ bool
+ check (function_checker &c) const OVERRIDE
+ {
+- return c.require_immediate_lane_index (2);
++ return c.require_immediate_lane_index (2, 1);
+ }
+ };
+ SHAPE (binary_lane)
+@@ -1162,7 +1162,7 @@ struct binary_long_lane_def : public overloaded_base<0>
+ bool
+ check (function_checker &c) const OVERRIDE
+ {
+- return c.require_immediate_lane_index (2);
++ return c.require_immediate_lane_index (2, 1);
+ }
+ };
+ SHAPE (binary_long_lane)
+@@ -2817,7 +2817,7 @@ struct ternary_lane_def : public overloaded_base<0>
+ bool
+ check (function_checker &c) const OVERRIDE
+ {
+- return c.require_immediate_lane_index (3);
++ return c.require_immediate_lane_index (3, 2);
+ }
+ };
+ SHAPE (ternary_lane)
+@@ -2845,7 +2845,7 @@ struct ternary_lane_rotate_def : public overloaded_base<0>
+ bool
+ check (function_checker &c) const OVERRIDE
+ {
+- return (c.require_immediate_lane_index (3, 2)
++ return (c.require_immediate_lane_index (3, 2, 2)
+ && c.require_immediate_one_of (4, 0, 90, 180, 270));
+ }
+ };
+@@ -2868,7 +2868,7 @@ struct ternary_long_lane_def
+ bool
+ check (function_checker &c) const OVERRIDE
+ {
+- return c.require_immediate_lane_index (3);
++ return c.require_immediate_lane_index (3, 2);
+ }
+ };
+ SHAPE (ternary_long_lane)
+@@ -2965,7 +2965,7 @@ struct ternary_qq_lane_rotate_def : public overloaded_base<0>
+ bool
+ check (function_checker &c) const OVERRIDE
+ {
+- return (c.require_immediate_lane_index (3, 4)
++ return (c.require_immediate_lane_index (3, 0)
+ && c.require_immediate_one_of (4, 0, 90, 180, 270));
+ }
+ };
+diff --git a/gcc/config/aarch64/aarch64-sve-builtins.cc b/gcc/config/aarch64/aarch64-sve-builtins.cc
+index 91af96687..7924cdf0f 100644
+--- a/gcc/config/aarch64/aarch64-sve-builtins.cc
++++ b/gcc/config/aarch64/aarch64-sve-builtins.cc
+@@ -2440,20 +2440,26 @@ function_checker::require_immediate_enum (unsigned int rel_argno, tree type)
+ return false;
+ }
+
+-/* Check that argument REL_ARGNO is suitable for indexing argument
+- REL_ARGNO - 1, in groups of GROUP_SIZE elements. REL_ARGNO counts
+- from the end of the predication arguments. */
++/* The intrinsic conceptually divides vector argument REL_VEC_ARGNO into
++ groups of GROUP_SIZE elements. Return true if argument REL_ARGNO is
++ a suitable constant index for selecting one of these groups. The
++ selection happens within a 128-bit quadword, rather than the whole vector.
++
++ REL_ARGNO and REL_VEC_ARGNO count from the end of the predication
++ arguments. */
+ bool
+ function_checker::require_immediate_lane_index (unsigned int rel_argno,
++ unsigned int rel_vec_argno,
+ unsigned int group_size)
+ {
+ unsigned int argno = m_base_arg + rel_argno;
+ if (!argument_exists_p (argno))
+ return true;
+
+- /* Get the type of the previous argument. tree_argument_type wants a
+- 1-based number, whereas ARGNO is 0-based. */
+- machine_mode mode = TYPE_MODE (type_argument_type (m_fntype, argno));
++ /* Get the type of the vector argument. tree_argument_type wants a
++ 1-based number, whereas VEC_ARGNO is 0-based. */
++ unsigned int vec_argno = m_base_arg + rel_vec_argno;
++ machine_mode mode = TYPE_MODE (type_argument_type (m_fntype, vec_argno + 1));
+ gcc_assert (VECTOR_MODE_P (mode));
+ unsigned int nlanes = 128 / (group_size * GET_MODE_UNIT_BITSIZE (mode));
+ return require_immediate_range (rel_argno, 0, nlanes - 1);
+diff --git a/gcc/config/aarch64/aarch64-sve-builtins.h b/gcc/config/aarch64/aarch64-sve-builtins.h
+index 52994cde0..824c31cd7 100644
+--- a/gcc/config/aarch64/aarch64-sve-builtins.h
++++ b/gcc/config/aarch64/aarch64-sve-builtins.h
+@@ -463,7 +463,8 @@ public:
+ bool require_immediate_either_or (unsigned int, HOST_WIDE_INT,
+ HOST_WIDE_INT);
+ bool require_immediate_enum (unsigned int, tree);
+- bool require_immediate_lane_index (unsigned int, unsigned int = 1);
++ bool require_immediate_lane_index (unsigned int, unsigned int,
++ unsigned int = 1);
+ bool require_immediate_one_of (unsigned int, HOST_WIDE_INT, HOST_WIDE_INT,
+ HOST_WIDE_INT, HOST_WIDE_INT);
+ bool require_immediate_range (unsigned int, HOST_WIDE_INT, HOST_WIDE_INT);
+--
+2.33.0
+