* [PATCH v2 0/5] aarch64: Add Armv9.4-a 128-bit system-register read/write support
@ 2023-11-28 15:55 Victor Do Nascimento
2023-11-28 15:55 ` [PATCH v2 1/5] aarch64: Add march flags for +the and +d128 arch extensions Victor Do Nascimento
` (5 more replies)
0 siblings, 6 replies; 8+ messages in thread
From: Victor Do Nascimento @ 2023-11-28 15:55 UTC (permalink / raw)
To: gcc-patches
Cc: kyrylo.tkachov, richard.sandiford, Richard.Earnshaw,
Victor Do Nascimento
Changes from v1 -
https://gcc.gnu.org/pipermail/gcc-patches/2023-November/635531.html
* [PATCH 4/5] - For `error_at' message, put feature name in quotes.
* [PATCH 4/5] - For `aarch64_retrieve_sysreg' function, add
description of new parameter to comments.
* [PATCH 5/5] - Reduce the minimum arch requirements of the system
register unit tests, selectively using `#pragma GCC target' when
testing 128-bit sysreg r/w functions.
---
Given the introduction of optional 128-bit page table descriptor and
translation hardening extension support with the Arm9.4-a
architecture, this patch series introduces the necessary changes to
the aarch64-specific builtin code to enable the reading and writing of
128-bit system registers. In so doing, the following ACLE builtins and
feature macro are made available to the compiler:
* __uint128_t __arm_rsr128(const char *special_register);
* void __arm_wsr128(const char *special_register, __uint128_t value);
* __ARM_FEATURE_SYSREG128.
Finally, in order to update the GCC system-register database bringing
it in line with Binutils, and in so doing add the relevant 128-bit
system registers to GCC, this patch also introduces the Guarded
Control Stack (GCS) `+gcs' architecture modifier flag, allowing the
inclusion of the novel GCS system registers which are now supported
and also present in the `aarch64-sys-regs.def' system register
database.
Victor Do Nascimento (5):
aarch64: Add march flags for +the and +d128 arch extensions
aarch64: Add support for GCS system registers with the +gcs modifier
aarch64: Sync `aarch64-sys-regs.def' with Binutils.
aarch64: Implement 128-bit extension to ACLE sysreg r/w builtins
aarch64: Add rsr128 and wsr128 ACLE tests
gcc/config/aarch64/aarch64-arches.def | 2 +
gcc/config/aarch64/aarch64-builtins.cc | 50 ++++++++++++++++---
gcc/config/aarch64/aarch64-c.cc | 1 +
.../aarch64/aarch64-option-extensions.def | 6 +++
gcc/config/aarch64/aarch64-protos.h | 2 +-
gcc/config/aarch64/aarch64-sys-regs.def | 30 +++++++----
gcc/config/aarch64/aarch64.cc | 9 +++-
gcc/config/aarch64/aarch64.h | 21 ++++++++
gcc/config/aarch64/aarch64.md | 18 +++++++
gcc/config/aarch64/arm_acle.h | 11 ++++
gcc/doc/invoke.texi | 8 +++
gcc/testsuite/gcc.target/aarch64/acle/rwsr.c | 32 ++++++++++++
12 files changed, 170 insertions(+), 20 deletions(-)
--
2.42.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 1/5] aarch64: Add march flags for +the and +d128 arch extensions
2023-11-28 15:55 [PATCH v2 0/5] aarch64: Add Armv9.4-a 128-bit system-register read/write support Victor Do Nascimento
@ 2023-11-28 15:55 ` Victor Do Nascimento
2023-11-28 15:55 ` [PATCH v2 2/5] aarch64: Add support for GCS system registers with the +gcs modifier Victor Do Nascimento
` (4 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Victor Do Nascimento @ 2023-11-28 15:55 UTC (permalink / raw)
To: gcc-patches
Cc: kyrylo.tkachov, richard.sandiford, Richard.Earnshaw,
Victor Do Nascimento
Given the introduction of optional 128-bit page table descriptor and
translation hardening extension support with the Arm9.4-a
architecture, this introduces the relevant flags to enable the reading
and writing of 128-bit system registers.
The `+d128' -march modifier enables the use of the following ACLE
builtin functions:
* __uint128_t __arm_rsr128(const char *special_register);
* void __arm_wsr128(const char *special_register, __uint128_t value);
and defines the __ARM_FEATURE_SYSREG128 macro to 1.
Finally, the `rcwmask_el1' and `rcwsmask_el1' 128-bit system register
implementations are also reliant on the enablement of the `+the' flag,
which is thus also implemented in this patch.
gcc/ChangeLog:
* config/aarch64/aarch64-arches.def (armv8.9-a): New.
(armv9.4-a): Likewise.
* config/aarch64/aarch64-option-extensions.def (d128): Likewise.
(the): Likewise.
* config/aarch64/aarch64.h (AARCH64_ISA_V9_4A): Likewise.
(AARCH64_ISA_V8_9A): Likewise.
(TARGET_ARMV9_4): Likewise.
(AARCH64_ISA_D128): Likewise.
(AARCH64_ISA_THE): Likewise.
(TARGET_D128): Likewise.
* doc/invoke.texi (AArch64 Options): Document new -march flags
and extensions.
---
gcc/config/aarch64/aarch64-arches.def | 2 ++
gcc/config/aarch64/aarch64-c.cc | 1 +
gcc/config/aarch64/aarch64-option-extensions.def | 4 ++++
gcc/config/aarch64/aarch64.h | 15 +++++++++++++++
gcc/doc/invoke.texi | 6 ++++++
5 files changed, 28 insertions(+)
diff --git a/gcc/config/aarch64/aarch64-arches.def b/gcc/config/aarch64/aarch64-arches.def
index 6b9a19c490b..1fe6b796001 100644
--- a/gcc/config/aarch64/aarch64-arches.def
+++ b/gcc/config/aarch64/aarch64-arches.def
@@ -39,10 +39,12 @@ AARCH64_ARCH("armv8.5-a", generic_armv8_a, V8_5A, 8, (V8_4A, SB, SSBS
AARCH64_ARCH("armv8.6-a", generic_armv8_a, V8_6A, 8, (V8_5A, I8MM, BF16))
AARCH64_ARCH("armv8.7-a", generic_armv8_a, V8_7A, 8, (V8_6A, LS64))
AARCH64_ARCH("armv8.8-a", generic_armv8_a, V8_8A, 8, (V8_7A, MOPS))
+AARCH64_ARCH("armv8.9-a", generic_armv8_a, V8_9A, 8, (V8_8A))
AARCH64_ARCH("armv8-r", generic_armv8_a, V8R , 8, (V8_4A))
AARCH64_ARCH("armv9-a", generic_armv9_a, V9A , 9, (V8_5A, SVE2))
AARCH64_ARCH("armv9.1-a", generic_armv9_a, V9_1A, 9, (V8_6A, V9A))
AARCH64_ARCH("armv9.2-a", generic_armv9_a, V9_2A, 9, (V8_7A, V9_1A))
AARCH64_ARCH("armv9.3-a", generic_armv9_a, V9_3A, 9, (V8_8A, V9_2A))
+AARCH64_ARCH("armv9.4-a", generic_armv9_a, V9_4A, 9, (V8_9A, V9_3A))
#undef AARCH64_ARCH
diff --git a/gcc/config/aarch64/aarch64-c.cc b/gcc/config/aarch64/aarch64-c.cc
index be8b7236cf9..cacf8e8ed25 100644
--- a/gcc/config/aarch64/aarch64-c.cc
+++ b/gcc/config/aarch64/aarch64-c.cc
@@ -206,6 +206,7 @@ aarch64_update_cpp_builtins (cpp_reader *pfile)
aarch64_def_or_undef (TARGET_LS64,
"__ARM_FEATURE_LS64", pfile);
aarch64_def_or_undef (AARCH64_ISA_RCPC, "__ARM_FEATURE_RCPC", pfile);
+ aarch64_def_or_undef (TARGET_D128, "__ARM_FEATURE_SYSREG128", pfile);
/* Not for ACLE, but required to keep "float.h" correct if we switch
target between implementations that do or do not support ARMv8.2-A
diff --git a/gcc/config/aarch64/aarch64-option-extensions.def b/gcc/config/aarch64/aarch64-option-extensions.def
index 825f3bf7758..da31f7c32d1 100644
--- a/gcc/config/aarch64/aarch64-option-extensions.def
+++ b/gcc/config/aarch64/aarch64-option-extensions.def
@@ -151,4 +151,8 @@ AARCH64_OPT_EXTENSION("mops", MOPS, (), (), (), "")
AARCH64_OPT_EXTENSION("cssc", CSSC, (), (), (), "cssc")
+AARCH64_OPT_EXTENSION("d128", D128, (), (), (), "d128")
+
+AARCH64_OPT_EXTENSION("the", THE, (), (), (), "the")
+
#undef AARCH64_OPT_EXTENSION
diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
index efe2036537e..5f0486cb128 100644
--- a/gcc/config/aarch64/aarch64.h
+++ b/gcc/config/aarch64/aarch64.h
@@ -219,13 +219,17 @@ enum class aarch64_feature : unsigned char {
#define AARCH64_ISA_PAUTH (aarch64_isa_flags & AARCH64_FL_PAUTH)
#define AARCH64_ISA_V8_7A (aarch64_isa_flags & AARCH64_FL_V8_7A)
#define AARCH64_ISA_V8_8A (aarch64_isa_flags & AARCH64_FL_V8_8A)
+#define AARCH64_ISA_V8_9A (aarch64_isa_flags & AARCH64_FL_V8_9A)
#define AARCH64_ISA_V9A (aarch64_isa_flags & AARCH64_FL_V9A)
#define AARCH64_ISA_V9_1A (aarch64_isa_flags & AARCH64_FL_V9_1A)
#define AARCH64_ISA_V9_2A (aarch64_isa_flags & AARCH64_FL_V9_2A)
#define AARCH64_ISA_V9_3A (aarch64_isa_flags & AARCH64_FL_V9_3A)
+#define AARCH64_ISA_V9_4A (aarch64_isa_flags & AARCH64_FL_V9_4A)
#define AARCH64_ISA_MOPS (aarch64_isa_flags & AARCH64_FL_MOPS)
#define AARCH64_ISA_LS64 (aarch64_isa_flags & AARCH64_FL_LS64)
#define AARCH64_ISA_CSSC (aarch64_isa_flags & AARCH64_FL_CSSC)
+#define AARCH64_ISA_D128 (aarch64_isa_flags & AARCH64_FL_D128)
+#define AARCH64_ISA_THE (aarch64_isa_flags & AARCH64_FL_THE)
/* AARCH64_FL options necessary for system register implementation. */
@@ -388,6 +392,17 @@ enum class aarch64_feature : unsigned char {
/* ARMv8.1-A Adv.SIMD support. */
#define TARGET_SIMD_RDMA (TARGET_SIMD && AARCH64_ISA_RDMA)
+/* Armv9.4-A features. */
+#define TARGET_ARMV9_4 (AARCH64_ISA_V9_4A)
+
+/* 128-bit System Registers and Instructions from Armv9.4-a are enabled
+ through +d128. */
+#define TARGET_D128 (AARCH64_ISA_D128)
+
+/* Armv8.9-A/9.4-A Translation Hardening Extension system registers are
+ enabled through +the. */
+#define TARGET_THE (AARCH64_ISA_THE)
+
/* Standard register usage. */
/* 31 64-bit general purpose registers R0-R30:
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 7666de1e9b2..c76205bf6e8 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -20801,10 +20801,12 @@ and the features that they enable by default:
@item @samp{armv8.6-a} @tab Armv8.6-A @tab @samp{armv8.5-a}, @samp{+bf16}, @samp{+i8mm}
@item @samp{armv8.7-a} @tab Armv8.7-A @tab @samp{armv8.6-a}, @samp{+ls64}
@item @samp{armv8.8-a} @tab Armv8.8-a @tab @samp{armv8.7-a}, @samp{+mops}
+@item @samp{armv8.9-a} @tab Armv8.9-a @tab @samp{armv8.8-a}
@item @samp{armv9-a} @tab Armv9-A @tab @samp{armv8.5-a}, @samp{+sve}, @samp{+sve2}
@item @samp{armv9.1-a} @tab Armv9.1-A @tab @samp{armv9-a}, @samp{+bf16}, @samp{+i8mm}
@item @samp{armv9.2-a} @tab Armv9.2-A @tab @samp{armv9.1-a}, @samp{+ls64}
@item @samp{armv9.3-a} @tab Armv9.3-A @tab @samp{armv9.2-a}, @samp{+mops}
+@item @samp{armv9.4-a} @tab Armv9.4-A @tab @samp{armv9.3-a}
@item @samp{armv8-r} @tab Armv8-R @tab @samp{armv8-r}
@end multitable
@@ -21107,6 +21109,10 @@ Enable the Flag Manipulation instructions Extension.
Enable the Pointer Authentication Extension.
@item cssc
Enable the Common Short Sequence Compression instructions.
+@item d128
+Enable support for 128-bit system register read/write instructions.
+@item the
+Enable support for Armv8.9-a/9.4-a translation hardening extension.
@end table
--
2.42.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 2/5] aarch64: Add support for GCS system registers with the +gcs modifier
2023-11-28 15:55 [PATCH v2 0/5] aarch64: Add Armv9.4-a 128-bit system-register read/write support Victor Do Nascimento
2023-11-28 15:55 ` [PATCH v2 1/5] aarch64: Add march flags for +the and +d128 arch extensions Victor Do Nascimento
@ 2023-11-28 15:55 ` Victor Do Nascimento
2023-11-28 15:55 ` [PATCH v2 3/5] aarch64: Sync `aarch64-sys-regs.def' with Binutils Victor Do Nascimento
` (3 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Victor Do Nascimento @ 2023-11-28 15:55 UTC (permalink / raw)
To: gcc-patches
Cc: kyrylo.tkachov, richard.sandiford, Richard.Earnshaw,
Victor Do Nascimento
Given the introduction of system registers associated with the Guarded
Control Stack extension to Armv9.4-a in Binutils and their reliance on
the `+gcs' modifier, we implement the necessary changes in GCC to
allow for them to be recognized by the compiler.
gcc/ChangeLog:
* config/aarch64/aarch64-option-extensions.def (gcs): New.
* config/aarch64/aarch64.h (AARCH64_ISA_GCS): New.
(TARGET_THE): Likewise.
* doc/invoke.texi (AArch64 Options): Describe GCS.
---
gcc/config/aarch64/aarch64-option-extensions.def | 2 ++
gcc/config/aarch64/aarch64.h | 6 ++++++
gcc/doc/invoke.texi | 2 ++
3 files changed, 10 insertions(+)
diff --git a/gcc/config/aarch64/aarch64-option-extensions.def b/gcc/config/aarch64/aarch64-option-extensions.def
index da31f7c32d1..e72c039b612 100644
--- a/gcc/config/aarch64/aarch64-option-extensions.def
+++ b/gcc/config/aarch64/aarch64-option-extensions.def
@@ -155,4 +155,6 @@ AARCH64_OPT_EXTENSION("d128", D128, (), (), (), "d128")
AARCH64_OPT_EXTENSION("the", THE, (), (), (), "the")
+AARCH64_OPT_EXTENSION("gcs", GCS, (), (), (), "gcs")
+
#undef AARCH64_OPT_EXTENSION
diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
index 5f0486cb128..d84ff3fc8ba 100644
--- a/gcc/config/aarch64/aarch64.h
+++ b/gcc/config/aarch64/aarch64.h
@@ -230,6 +230,7 @@ enum class aarch64_feature : unsigned char {
#define AARCH64_ISA_CSSC (aarch64_isa_flags & AARCH64_FL_CSSC)
#define AARCH64_ISA_D128 (aarch64_isa_flags & AARCH64_FL_D128)
#define AARCH64_ISA_THE (aarch64_isa_flags & AARCH64_FL_THE)
+#define AARCH64_ISA_GCS (aarch64_isa_flags & AARCH64_FL_GCS)
/* AARCH64_FL options necessary for system register implementation. */
@@ -403,6 +404,11 @@ enum class aarch64_feature : unsigned char {
enabled through +the. */
#define TARGET_THE (AARCH64_ISA_THE)
+/* Armv9.4-A Guarded Control Stack extension system registers are
+ enabled through +gcs. */
+#define TARGET_GCS (AARCH64_ISA_GCS)
+
+
/* Standard register usage. */
/* 31 64-bit general purpose registers R0-R30:
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index c76205bf6e8..75551ef2ace 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -21111,6 +21111,8 @@ Enable the Pointer Authentication Extension.
Enable the Common Short Sequence Compression instructions.
@item d128
Enable support for 128-bit system register read/write instructions.
+@item gcs
+Enable support for Armv9.4-a Guarded Control Stack extension.
@item the
Enable support for Armv8.9-a/9.4-a translation hardening extension.
--
2.42.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 3/5] aarch64: Sync `aarch64-sys-regs.def' with Binutils.
2023-11-28 15:55 [PATCH v2 0/5] aarch64: Add Armv9.4-a 128-bit system-register read/write support Victor Do Nascimento
2023-11-28 15:55 ` [PATCH v2 1/5] aarch64: Add march flags for +the and +d128 arch extensions Victor Do Nascimento
2023-11-28 15:55 ` [PATCH v2 2/5] aarch64: Add support for GCS system registers with the +gcs modifier Victor Do Nascimento
@ 2023-11-28 15:55 ` Victor Do Nascimento
2023-11-28 16:40 ` Kyrylo Tkachov
2023-11-28 15:55 ` [PATCH v2 4/5] aarch64: Implement 128-bit extension to ACLE sysreg r/w builtins Victor Do Nascimento
` (2 subsequent siblings)
5 siblings, 1 reply; 8+ messages in thread
From: Victor Do Nascimento @ 2023-11-28 15:55 UTC (permalink / raw)
To: gcc-patches
Cc: kyrylo.tkachov, richard.sandiford, Richard.Earnshaw,
Victor Do Nascimento
This patch updates `aarch64-sys-regs.def', bringing it into sync with
the Binutils source.
gcc/ChangeLog:
* config/aarch64/aarch64-sys-regs.def (par_el1): New.
(rcwmask_el1): Likewise.
(rcwsmask_el1): Likewise.
(ttbr0_el1): Likewise.
(ttbr0_el12): Likewise.
(ttbr0_el2): Likewise.
(ttbr1_el1): Likewise.
(ttbr1_el12): Likewise.
(ttbr1_el2): Likewise.
(vttbr_el2): Likewise.
(gcspr_el0): Likewise.
(gcspr_el1): Likewise.
(gcspr_el12): Likewise.
(gcspr_el2): Likewise.
(gcspr_el3): Likewise.
(gcscre0_el1): Likewise.
(gcscr_el1): Likewise.
(gcscr_el12): Likewise.
(gcscr_el2): Likewise.
(gcscr_el3): Likewise.
---
gcc/config/aarch64/aarch64-sys-regs.def | 30 +++++++++++++++++--------
1 file changed, 21 insertions(+), 9 deletions(-)
diff --git a/gcc/config/aarch64/aarch64-sys-regs.def b/gcc/config/aarch64/aarch64-sys-regs.def
index d24a2455503..96bdadb0b0f 100644
--- a/gcc/config/aarch64/aarch64-sys-regs.def
+++ b/gcc/config/aarch64/aarch64-sys-regs.def
@@ -419,6 +419,16 @@
SYSREG ("fpcr", CPENC (3,3,4,4,0), 0, AARCH64_NO_FEATURES)
SYSREG ("fpexc32_el2", CPENC (3,4,5,3,0), 0, AARCH64_NO_FEATURES)
SYSREG ("fpsr", CPENC (3,3,4,4,1), 0, AARCH64_NO_FEATURES)
+ SYSREG ("gcspr_el0", CPENC (3,3,2,5,1), F_ARCHEXT, AARCH64_FEATURE (GCS))
+ SYSREG ("gcspr_el1", CPENC (3,0,2,5,1), F_ARCHEXT, AARCH64_FEATURE (GCS))
+ SYSREG ("gcspr_el2", CPENC (3,4,2,5,1), F_ARCHEXT, AARCH64_FEATURE (GCS))
+ SYSREG ("gcspr_el12", CPENC (3,5,2,5,1), F_ARCHEXT, AARCH64_FEATURE (GCS))
+ SYSREG ("gcspr_el3", CPENC (3,6,2,5,1), F_ARCHEXT, AARCH64_FEATURE (GCS))
+ SYSREG ("gcscre0_el1", CPENC (3,0,2,5,2), F_ARCHEXT, AARCH64_FEATURE (GCS))
+ SYSREG ("gcscr_el1", CPENC (3,0,2,5,0), F_ARCHEXT, AARCH64_FEATURE (GCS))
+ SYSREG ("gcscr_el2", CPENC (3,4,2,5,0), F_ARCHEXT, AARCH64_FEATURE (GCS))
+ SYSREG ("gcscr_el12", CPENC (3,5,2,5,0), F_ARCHEXT, AARCH64_FEATURE (GCS))
+ SYSREG ("gcscr_el3", CPENC (3,6,2,5,0), F_ARCHEXT, AARCH64_FEATURE (GCS))
SYSREG ("gcr_el1", CPENC (3,0,1,0,6), F_ARCHEXT, AARCH64_FEATURE (MEMTAG))
SYSREG ("gmid_el1", CPENC (3,1,0,0,4), F_REG_READ|F_ARCHEXT, AARCH64_FEATURE (MEMTAG))
SYSREG ("gpccr_el3", CPENC (3,6,2,1,6), 0, AARCH64_NO_FEATURES)
@@ -584,7 +594,7 @@
SYSREG ("oslar_el1", CPENC (2,0,1,0,4), F_REG_WRITE, AARCH64_NO_FEATURES)
SYSREG ("oslsr_el1", CPENC (2,0,1,1,4), F_REG_READ, AARCH64_NO_FEATURES)
SYSREG ("pan", CPENC (3,0,4,2,3), F_ARCHEXT, AARCH64_FEATURE (PAN))
- SYSREG ("par_el1", CPENC (3,0,7,4,0), 0, AARCH64_NO_FEATURES)
+ SYSREG ("par_el1", CPENC (3,0,7,4,0), F_REG_128, AARCH64_NO_FEATURES)
SYSREG ("pmbidr_el1", CPENC (3,0,9,10,7), F_REG_READ|F_ARCHEXT, AARCH64_FEATURE (PROFILE))
SYSREG ("pmblimitr_el1", CPENC (3,0,9,10,0), F_ARCHEXT, AARCH64_FEATURE (PROFILE))
SYSREG ("pmbptr_el1", CPENC (3,0,9,10,1), F_ARCHEXT, AARCH64_FEATURE (PROFILE))
@@ -746,6 +756,8 @@
SYSREG ("prlar_el2", CPENC (3,4,6,8,1), F_ARCHEXT, AARCH64_FEATURE (V8R))
SYSREG ("prselr_el1", CPENC (3,0,6,2,1), F_ARCHEXT, AARCH64_FEATURE (V8R))
SYSREG ("prselr_el2", CPENC (3,4,6,2,1), F_ARCHEXT, AARCH64_FEATURE (V8R))
+ SYSREG ("rcwmask_el1", CPENC (3,0,13,0,6), F_ARCHEXT|F_REG_128, AARCH64_FEATURE (THE))
+ SYSREG ("rcwsmask_el1", CPENC (3,0,13,0,3), F_ARCHEXT|F_REG_128, AARCH64_FEATURE (THE))
SYSREG ("revidr_el1", CPENC (3,0,0,0,6), F_REG_READ, AARCH64_NO_FEATURES)
SYSREG ("rgsr_el1", CPENC (3,0,1,0,5), F_ARCHEXT, AARCH64_FEATURE (MEMTAG))
SYSREG ("rmr_el1", CPENC (3,0,12,0,2), 0, AARCH64_NO_FEATURES)
@@ -1034,13 +1046,13 @@
SYSREG ("trfcr_el1", CPENC (3,0,1,2,1), F_ARCHEXT, AARCH64_FEATURE (V8_4A))
SYSREG ("trfcr_el12", CPENC (3,5,1,2,1), F_ARCHEXT, AARCH64_FEATURE (V8_4A))
SYSREG ("trfcr_el2", CPENC (3,4,1,2,1), F_ARCHEXT, AARCH64_FEATURE (V8_4A))
- SYSREG ("ttbr0_el1", CPENC (3,0,2,0,0), 0, AARCH64_NO_FEATURES)
- SYSREG ("ttbr0_el12", CPENC (3,5,2,0,0), F_ARCHEXT, AARCH64_FEATURE (V8_1A))
- SYSREG ("ttbr0_el2", CPENC (3,4,2,0,0), F_ARCHEXT, AARCH64_FEATURE (V8A))
+ SYSREG ("ttbr0_el1", CPENC (3,0,2,0,0), F_REG_128, AARCH64_NO_FEATURES)
+ SYSREG ("ttbr0_el12", CPENC (3,5,2,0,0), F_ARCHEXT|F_REG_128, AARCH64_FEATURE (V8_1A))
+ SYSREG ("ttbr0_el2", CPENC (3,4,2,0,0), F_ARCHEXT|F_REG_128, AARCH64_FEATURE (V8A))
SYSREG ("ttbr0_el3", CPENC (3,6,2,0,0), 0, AARCH64_NO_FEATURES)
- SYSREG ("ttbr1_el1", CPENC (3,0,2,0,1), 0, AARCH64_NO_FEATURES)
- SYSREG ("ttbr1_el12", CPENC (3,5,2,0,1), F_ARCHEXT, AARCH64_FEATURE (V8_1A))
- SYSREG ("ttbr1_el2", CPENC (3,4,2,0,1), F_ARCHEXT, AARCH64_FEATURES (2, V8A, V8_1A))
+ SYSREG ("ttbr1_el1", CPENC (3,0,2,0,1), F_REG_128, AARCH64_NO_FEATURES)
+ SYSREG ("ttbr1_el12", CPENC (3,5,2,0,1), F_ARCHEXT|F_REG_128, AARCH64_FEATURE (V8_1A))
+ SYSREG ("ttbr1_el2", CPENC (3,4,2,0,1), F_ARCHEXT|F_REG_128, AARCH64_FEATURES (2, V8A, V8_1A))
SYSREG ("uao", CPENC (3,0,4,2,4), F_ARCHEXT, AARCH64_FEATURE (V8_2A))
SYSREG ("vbar_el1", CPENC (3,0,12,0,0), 0, AARCH64_NO_FEATURES)
SYSREG ("vbar_el12", CPENC (3,5,12,0,0), F_ARCHEXT, AARCH64_FEATURE (V8_1A))
@@ -1057,8 +1069,8 @@
SYSREG ("vstcr_el2", CPENC (3,4,2,6,2), F_ARCHEXT, AARCH64_FEATURE (V8_4A))
SYSREG ("vsttbr_el2", CPENC (3,4,2,6,0), F_ARCHEXT, AARCH64_FEATURES (2, V8A, V8_4A))
SYSREG ("vtcr_el2", CPENC (3,4,2,1,2), 0, AARCH64_NO_FEATURES)
- SYSREG ("vttbr_el2", CPENC (3,4,2,1,0), F_ARCHEXT, AARCH64_FEATURE (V8A))
+ SYSREG ("vttbr_el2", CPENC (3,4,2,1,0), F_ARCHEXT|F_REG_128, AARCH64_FEATURE (V8A))
SYSREG ("zcr_el1", CPENC (3,0,1,2,0), F_ARCHEXT, AARCH64_FEATURE (SVE))
SYSREG ("zcr_el12", CPENC (3,5,1,2,0), F_ARCHEXT, AARCH64_FEATURE (SVE))
SYSREG ("zcr_el2", CPENC (3,4,1,2,0), F_ARCHEXT, AARCH64_FEATURE (SVE))
- SYSREG ("zcr_el3", CPENC (3,6,1,2,0), F_ARCHEXT, AARCH64_FEATURE (SVE))
\ No newline at end of file
+ SYSREG ("zcr_el3", CPENC (3,6,1,2,0), F_ARCHEXT, AARCH64_FEATURE (SVE))
--
2.42.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 4/5] aarch64: Implement 128-bit extension to ACLE sysreg r/w builtins
2023-11-28 15:55 [PATCH v2 0/5] aarch64: Add Armv9.4-a 128-bit system-register read/write support Victor Do Nascimento
` (2 preceding siblings ...)
2023-11-28 15:55 ` [PATCH v2 3/5] aarch64: Sync `aarch64-sys-regs.def' with Binutils Victor Do Nascimento
@ 2023-11-28 15:55 ` Victor Do Nascimento
2023-11-28 15:55 ` [PATCH v2 5/5] aarch64: Add rsr128 and wsr128 ACLE tests Victor Do Nascimento
2023-11-28 22:46 ` [PATCH v2 0/5] aarch64: Add Armv9.4-a 128-bit system-register read/write support Richard Sandiford
5 siblings, 0 replies; 8+ messages in thread
From: Victor Do Nascimento @ 2023-11-28 15:55 UTC (permalink / raw)
To: gcc-patches
Cc: kyrylo.tkachov, richard.sandiford, Richard.Earnshaw,
Victor Do Nascimento
Implement the ACLE builtins for 128-bit system register manipulation:
* __uint128_t __arm_rsr128(const char *special_register);
* void __arm_wsr128(const char *special_register, __uint128_t value);
gcc/ChangeLog:
* config/aarch64/aarch64-builtins.cc (AARCH64_RSR128): New
`enum aarch64_builtins' value.
(AARCH64_WSR128): Likewise.
(aarch64_init_rwsr_builtins): Init `__builtin_aarch64_rsr128'
and `__builtin_aarch64_wsr128' builtins.
(aarch64_expand_rwsr_builtin): Extend function to handle
`__builtin_aarch64_{rsr|wsr}128'.
* config/aarch64/aarch64-protos.h (aarch64_retrieve_sysreg):
Update function signature.
* config/aarch64/aarch64.cc (F_REG_128): New.
(aarch64_retrieve_sysreg): Add 128-bit register mode check.
* config/aarch64/aarch64.md (UNSPEC_SYSREG_RTI): New.
(UNSPEC_SYSREG_WTI): Likewise.
(aarch64_read_sysregti): Likewise.
(aarch64_write_sysregti): Likewise.
---
gcc/config/aarch64/aarch64-builtins.cc | 50 +++++++++++++++++++++-----
gcc/config/aarch64/aarch64-protos.h | 2 +-
gcc/config/aarch64/aarch64.cc | 9 +++--
gcc/config/aarch64/aarch64.md | 18 ++++++++++
gcc/config/aarch64/arm_acle.h | 11 ++++++
5 files changed, 79 insertions(+), 11 deletions(-)
diff --git a/gcc/config/aarch64/aarch64-builtins.cc b/gcc/config/aarch64/aarch64-builtins.cc
index c5f20f68bca..1f2b2721f5a 100644
--- a/gcc/config/aarch64/aarch64-builtins.cc
+++ b/gcc/config/aarch64/aarch64-builtins.cc
@@ -815,11 +815,13 @@ enum aarch64_builtins
AARCH64_RSR64,
AARCH64_RSRF,
AARCH64_RSRF64,
+ AARCH64_RSR128,
AARCH64_WSR,
AARCH64_WSRP,
AARCH64_WSR64,
AARCH64_WSRF,
AARCH64_WSRF64,
+ AARCH64_WSR128,
AARCH64_BUILTIN_MAX
};
@@ -1842,6 +1844,10 @@ aarch64_init_rwsr_builtins (void)
= build_function_type_list (double_type_node, const_char_ptr_type, NULL);
AARCH64_INIT_RWSR_BUILTINS_DECL (RSRF64, rsrf64, fntype);
+ fntype
+ = build_function_type_list (uint128_type_node, const_char_ptr_type, NULL);
+ AARCH64_INIT_RWSR_BUILTINS_DECL (RSR128, rsr128, fntype);
+
fntype
= build_function_type_list (void_type_node, const_char_ptr_type,
uint32_type_node, NULL);
@@ -1867,6 +1873,12 @@ aarch64_init_rwsr_builtins (void)
= build_function_type_list (void_type_node, const_char_ptr_type,
double_type_node, NULL);
AARCH64_INIT_RWSR_BUILTINS_DECL (WSRF64, wsrf64, fntype);
+
+ fntype
+ = build_function_type_list (void_type_node, const_char_ptr_type,
+ uint128_type_node, NULL);
+ AARCH64_INIT_RWSR_BUILTINS_DECL (WSR128, wsr128, fntype);
+
}
/* Initialize the memory tagging extension (MTE) builtins. */
@@ -2710,6 +2722,7 @@ aarch64_expand_rwsr_builtin (tree exp, rtx target, int fcode)
tree arg0, arg1;
rtx const_str, input_val, subreg;
enum machine_mode mode;
+ enum insn_code icode;
class expand_operand ops[2];
arg0 = CALL_EXPR_ARG (exp, 0);
@@ -2718,7 +2731,18 @@ aarch64_expand_rwsr_builtin (tree exp, rtx target, int fcode)
|| fcode == AARCH64_WSRP
|| fcode == AARCH64_WSR64
|| fcode == AARCH64_WSRF
- || fcode == AARCH64_WSRF64);
+ || fcode == AARCH64_WSRF64
+ || fcode == AARCH64_WSR128);
+
+ bool op128 = (fcode == AARCH64_RSR128 || fcode == AARCH64_WSR128);
+ enum machine_mode sysreg_mode = op128 ? TImode : DImode;
+
+ if (op128 && !TARGET_D128)
+ {
+ error_at (EXPR_LOCATION (exp), "128-bit system register support requires"
+ " the %<d128%> extension");
+ return const0_rtx;
+ }
/* Argument 0 (system register name) must be a string literal. */
gcc_assert (TREE_CODE (arg0) == ADDR_EXPR
@@ -2741,7 +2765,7 @@ aarch64_expand_rwsr_builtin (tree exp, rtx target, int fcode)
sysreg_name[pos] = TOLOWER (sysreg_name[pos]);
const char* name_output = aarch64_retrieve_sysreg ((const char *) sysreg_name,
- write_op);
+ write_op, op128);
if (name_output == NULL)
{
error_at (EXPR_LOCATION (exp), "invalid system register name provided");
@@ -2760,13 +2784,17 @@ aarch64_expand_rwsr_builtin (tree exp, rtx target, int fcode)
mode = TYPE_MODE (TREE_TYPE (arg1));
input_val = copy_to_mode_reg (mode, expand_normal (arg1));
+ icode = (op128 ? CODE_FOR_aarch64_write_sysregti
+ : CODE_FOR_aarch64_write_sysregdi);
+
switch (fcode)
{
case AARCH64_WSR:
case AARCH64_WSRP:
case AARCH64_WSR64:
case AARCH64_WSRF64:
- subreg = lowpart_subreg (DImode, input_val, mode);
+ case AARCH64_WSR128:
+ subreg = lowpart_subreg (sysreg_mode, input_val, mode);
break;
case AARCH64_WSRF:
subreg = gen_lowpart_SUBREG (SImode, input_val);
@@ -2775,8 +2803,8 @@ aarch64_expand_rwsr_builtin (tree exp, rtx target, int fcode)
}
create_fixed_operand (&ops[0], const_str);
- create_input_operand (&ops[1], subreg, DImode);
- expand_insn (CODE_FOR_aarch64_write_sysregdi, 2, ops);
+ create_input_operand (&ops[1], subreg, sysreg_mode);
+ expand_insn (icode, 2, ops);
return target;
}
@@ -2784,10 +2812,13 @@ aarch64_expand_rwsr_builtin (tree exp, rtx target, int fcode)
/* Read operations are implied by !write_op. */
gcc_assert (call_expr_nargs (exp) == 1);
+ icode = (op128 ? CODE_FOR_aarch64_read_sysregti
+ : CODE_FOR_aarch64_read_sysregdi);
+
/* Emit the initial read_sysregdi rtx. */
- create_output_operand (&ops[0], target, DImode);
+ create_output_operand (&ops[0], target, sysreg_mode);
create_fixed_operand (&ops[1], const_str);
- expand_insn (CODE_FOR_aarch64_read_sysregdi, 2, ops);
+ expand_insn (icode, 2, ops);
target = ops[0].value;
/* Do any necessary post-processing on the result. */
@@ -2797,7 +2828,8 @@ aarch64_expand_rwsr_builtin (tree exp, rtx target, int fcode)
case AARCH64_RSRP:
case AARCH64_RSR64:
case AARCH64_RSRF64:
- return lowpart_subreg (TYPE_MODE (TREE_TYPE (exp)), target, DImode);
+ case AARCH64_RSR128:
+ return lowpart_subreg (TYPE_MODE (TREE_TYPE (exp)), target, sysreg_mode);
case AARCH64_RSRF:
subreg = gen_lowpart_SUBREG (SImode, target);
return gen_lowpart_SUBREG (SFmode, subreg);
@@ -3048,11 +3080,13 @@ aarch64_general_expand_builtin (unsigned int fcode, tree exp, rtx target,
case AARCH64_RSR64:
case AARCH64_RSRF:
case AARCH64_RSRF64:
+ case AARCH64_RSR128:
case AARCH64_WSR:
case AARCH64_WSRP:
case AARCH64_WSR64:
case AARCH64_WSRF:
case AARCH64_WSRF64:
+ case AARCH64_WSR128:
return aarch64_expand_rwsr_builtin (exp, target, fcode);
}
diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h
index d1315c5491f..3154bbb56ef 100644
--- a/gcc/config/aarch64/aarch64-protos.h
+++ b/gcc/config/aarch64/aarch64-protos.h
@@ -831,7 +831,7 @@ bool aarch64_sve_ptrue_svpattern_p (rtx, struct simd_immediate_info *);
bool aarch64_simd_valid_immediate (rtx, struct simd_immediate_info *,
enum simd_immediate_check w = AARCH64_CHECK_MOV);
bool aarch64_valid_sysreg_name_p (const char *);
-const char *aarch64_retrieve_sysreg (const char *, bool);
+const char *aarch64_retrieve_sysreg (const char *, bool, bool);
rtx aarch64_check_zero_based_sve_index_immediate (rtx);
bool aarch64_maybe_generate_simd_constant (rtx, rtx, machine_mode);
bool aarch64_simd_special_constant_p (rtx, machine_mode);
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index ab9dbe64b57..066d03f8be2 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -471,6 +471,8 @@ typedef struct {
#define F_ARCHEXT (1 << 4)
/* Flag indicating register name is alias for another system register. */
#define F_REG_ALIAS (1 << 5)
+/* Flag indicatinig registers which may be implemented with 128-bits. */
+#define F_REG_128 (1 << 6)
/* Database of system registers, their encodings and architectural
requirements. */
@@ -25937,9 +25939,10 @@ aarch64_valid_sysreg_name_p (const char *regname)
/* Return the generic sysreg specification for a valid system register
name, otherwise NULL. WRITE_P is true iff the register is being
- written to. */
+ written to. IS128OP indicates the requested system register should
+ be checked for a 128-bit implementation. */
const char *
-aarch64_retrieve_sysreg (const char *regname, bool write_p)
+aarch64_retrieve_sysreg (const char *regname, bool write_p, bool is128op)
{
const sysreg_t *sysreg = aarch64_lookup_sysreg_map (regname);
if (sysreg == NULL)
@@ -25949,6 +25952,8 @@ aarch64_retrieve_sysreg (const char *regname, bool write_p)
else
return NULL;
}
+ if (is128op && !(sysreg->properties & F_REG_128))
+ return NULL;
if ((write_p && (sysreg->properties & F_REG_READ))
|| (!write_p && (sysreg->properties & F_REG_WRITE)))
return NULL;
diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index 8e50f51231a..2adc3c1eab7 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -282,7 +282,9 @@
UNSPEC_RDFFR
UNSPEC_WRFFR
UNSPEC_SYSREG_RDI
+ UNSPEC_SYSREG_RTI
UNSPEC_SYSREG_WDI
+ UNSPEC_SYSREG_WTI
;; Represents an SVE-style lane index, in which the indexing applies
;; within the containing 128-bit block.
UNSPEC_SVE_LANE_SELECT
@@ -486,6 +488,14 @@
"mrs\t%x0, %1"
)
+(define_insn "aarch64_read_sysregti"
+ [(set (match_operand:TI 0 "register_operand" "=r")
+ (unspec_volatile:TI [(match_operand 1 "aarch64_sysreg_string" "")]
+ UNSPEC_SYSREG_RTI))]
+ "TARGET_D128"
+ "mrrs\t%x0, %H0, %x1"
+)
+
(define_insn "aarch64_write_sysregdi"
[(unspec_volatile:DI [(match_operand 0 "aarch64_sysreg_string" "")
(match_operand:DI 1 "register_operand" "rZ")]
@@ -494,6 +504,14 @@
"msr\t%0, %x1"
)
+(define_insn "aarch64_write_sysregti"
+ [(unspec_volatile:TI [(match_operand 0 "aarch64_sysreg_string" "")
+ (match_operand:TI 1 "register_operand" "r")]
+ UNSPEC_SYSREG_WTI)]
+ "TARGET_D128"
+ "msrr\t%x0, %x1, %H1"
+)
+
(define_insn "indirect_jump"
[(set (pc) (match_operand:DI 0 "register_operand" "r"))]
""
diff --git a/gcc/config/aarch64/arm_acle.h b/gcc/config/aarch64/arm_acle.h
index 71ada878299..80282b361a4 100644
--- a/gcc/config/aarch64/arm_acle.h
+++ b/gcc/config/aarch64/arm_acle.h
@@ -344,6 +344,17 @@ __rndrrs (uint64_t *__res)
#define __arm_wsrf64(__regname, __value) \
__builtin_aarch64_wsrf64 (__regname, __value)
+#pragma GCC push_options
+#pragma GCC target ("+nothing+d128")
+
+#define __arm_rsr128(__regname) \
+ __builtin_aarch64_rsr128 (__regname)
+
+#define __arm_wsr128(__regname, __value) \
+ __builtin_aarch64_wsr128 (__regname, __value)
+
+#pragma GCC pop_options
+
#ifdef __cplusplus
}
#endif
--
2.42.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 5/5] aarch64: Add rsr128 and wsr128 ACLE tests
2023-11-28 15:55 [PATCH v2 0/5] aarch64: Add Armv9.4-a 128-bit system-register read/write support Victor Do Nascimento
` (3 preceding siblings ...)
2023-11-28 15:55 ` [PATCH v2 4/5] aarch64: Implement 128-bit extension to ACLE sysreg r/w builtins Victor Do Nascimento
@ 2023-11-28 15:55 ` Victor Do Nascimento
2023-11-28 22:46 ` [PATCH v2 0/5] aarch64: Add Armv9.4-a 128-bit system-register read/write support Richard Sandiford
5 siblings, 0 replies; 8+ messages in thread
From: Victor Do Nascimento @ 2023-11-28 15:55 UTC (permalink / raw)
To: gcc-patches
Cc: kyrylo.tkachov, richard.sandiford, Richard.Earnshaw,
Victor Do Nascimento
Extend existing unit tests for the ACLE system register manipulation
functions to include 128-bit tests.
gcc/testsuite/ChangeLog:
* gcc/testsuite/gcc.target/aarch64/acle/rwsr.c (get_rsr128): New.
(set_wsr128): Likewise.
---
gcc/testsuite/gcc.target/aarch64/acle/rwsr.c | 32 ++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/gcc/testsuite/gcc.target/aarch64/acle/rwsr.c b/gcc/testsuite/gcc.target/aarch64/acle/rwsr.c
index 93c48c4caf0..6feb0bef2d6 100644
--- a/gcc/testsuite/gcc.target/aarch64/acle/rwsr.c
+++ b/gcc/testsuite/gcc.target/aarch64/acle/rwsr.c
@@ -6,6 +6,38 @@
#include <arm_acle.h>
+#pragma GCC push_options
+#pragma GCC target ("arch=armv9.4-a+d128")
+
+#ifndef __ARM_FEATURE_SYSREG128
+#error "__ARM_FEATURE_SYSREG128 feature macro not defined."
+#endif
+
+/*
+** get_rsr128:
+** mrrs x0, x1, s3_0_c7_c4_0
+** ...
+*/
+__uint128_t
+get_rsr128 ()
+{
+ __arm_rsr128 ("par_el1");
+}
+
+/*
+** set_wsr128:
+** ...
+** msrr s3_0_c7_c4_0, x0, x1
+** ...
+*/
+void
+set_wsr128 (__uint128_t c)
+{
+ __arm_wsr128 ("par_el1", c);
+}
+
+#pragma GCC pop_options
+
/*
** get_rsr:
** ...
--
2.42.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* RE: [PATCH v2 3/5] aarch64: Sync `aarch64-sys-regs.def' with Binutils.
2023-11-28 15:55 ` [PATCH v2 3/5] aarch64: Sync `aarch64-sys-regs.def' with Binutils Victor Do Nascimento
@ 2023-11-28 16:40 ` Kyrylo Tkachov
0 siblings, 0 replies; 8+ messages in thread
From: Kyrylo Tkachov @ 2023-11-28 16:40 UTC (permalink / raw)
To: Victor Do Nascimento, gcc-patches
Cc: Richard Sandiford, Richard Earnshaw, Victor Do Nascimento
Hi Victor,
> -----Original Message-----
> From: Victor Do Nascimento <victor.donascimento@arm.com>
> Sent: Tuesday, November 28, 2023 3:56 PM
> To: gcc-patches@gcc.gnu.org
> Cc: Kyrylo Tkachov <Kyrylo.Tkachov@arm.com>; Richard Sandiford
> <Richard.Sandiford@arm.com>; Richard Earnshaw
> <Richard.Earnshaw@arm.com>; Victor Do Nascimento
> <Victor.DoNascimento@arm.com>
> Subject: [PATCH v2 3/5] aarch64: Sync `aarch64-sys-regs.def' with Binutils.
>
> This patch updates `aarch64-sys-regs.def', bringing it into sync with
> the Binutils source.
>
> gcc/ChangeLog:
>
> * config/aarch64/aarch64-sys-regs.def (par_el1): New.
> (rcwmask_el1): Likewise.
> (rcwsmask_el1): Likewise.
> (ttbr0_el1): Likewise.
> (ttbr0_el12): Likewise.
> (ttbr0_el2): Likewise.
> (ttbr1_el1): Likewise.
> (ttbr1_el12): Likewise.
> (ttbr1_el2): Likewise.
> (vttbr_el2): Likewise.
> (gcspr_el0): Likewise.
> (gcspr_el1): Likewise.
> (gcspr_el12): Likewise.
> (gcspr_el2): Likewise.
> (gcspr_el3): Likewise.
> (gcscre0_el1): Likewise.
> (gcscr_el1): Likewise.
> (gcscr_el12): Likewise.
> (gcscr_el2): Likewise.
> (gcscr_el3): Likewise.
In the case where we copy a file from elsewhere or regenerate we can just use the short entry:
* config/aarch64/aarch64-sys-regs.def: Copy from Binutils.
Or something equivalent.
Ok with and adjusted ChangeLog.
Thanks,
Kyrill
> ---
> gcc/config/aarch64/aarch64-sys-regs.def | 30 +++++++++++++++++--------
> 1 file changed, 21 insertions(+), 9 deletions(-)
>
> diff --git a/gcc/config/aarch64/aarch64-sys-regs.def
> b/gcc/config/aarch64/aarch64-sys-regs.def
> index d24a2455503..96bdadb0b0f 100644
> --- a/gcc/config/aarch64/aarch64-sys-regs.def
> +++ b/gcc/config/aarch64/aarch64-sys-regs.def
> @@ -419,6 +419,16 @@
> SYSREG ("fpcr", CPENC (3,3,4,4,0), 0,
> AARCH64_NO_FEATURES)
> SYSREG ("fpexc32_el2", CPENC (3,4,5,3,0), 0,
> AARCH64_NO_FEATURES)
> SYSREG ("fpsr", CPENC (3,3,4,4,1), 0,
> AARCH64_NO_FEATURES)
> + SYSREG ("gcspr_el0", CPENC (3,3,2,5,1), F_ARCHEXT,
> AARCH64_FEATURE (GCS))
> + SYSREG ("gcspr_el1", CPENC (3,0,2,5,1), F_ARCHEXT,
> AARCH64_FEATURE (GCS))
> + SYSREG ("gcspr_el2", CPENC (3,4,2,5,1), F_ARCHEXT,
> AARCH64_FEATURE (GCS))
> + SYSREG ("gcspr_el12", CPENC (3,5,2,5,1), F_ARCHEXT,
> AARCH64_FEATURE (GCS))
> + SYSREG ("gcspr_el3", CPENC (3,6,2,5,1), F_ARCHEXT,
> AARCH64_FEATURE (GCS))
> + SYSREG ("gcscre0_el1", CPENC (3,0,2,5,2), F_ARCHEXT,
> AARCH64_FEATURE (GCS))
> + SYSREG ("gcscr_el1", CPENC (3,0,2,5,0), F_ARCHEXT,
> AARCH64_FEATURE (GCS))
> + SYSREG ("gcscr_el2", CPENC (3,4,2,5,0), F_ARCHEXT,
> AARCH64_FEATURE (GCS))
> + SYSREG ("gcscr_el12", CPENC (3,5,2,5,0), F_ARCHEXT,
> AARCH64_FEATURE (GCS))
> + SYSREG ("gcscr_el3", CPENC (3,6,2,5,0), F_ARCHEXT,
> AARCH64_FEATURE (GCS))
> SYSREG ("gcr_el1", CPENC (3,0,1,0,6), F_ARCHEXT,
> AARCH64_FEATURE (MEMTAG))
> SYSREG ("gmid_el1", CPENC (3,1,0,0,4),
> F_REG_READ|F_ARCHEXT, AARCH64_FEATURE (MEMTAG))
> SYSREG ("gpccr_el3", CPENC (3,6,2,1,6), 0,
> AARCH64_NO_FEATURES)
> @@ -584,7 +594,7 @@
> SYSREG ("oslar_el1", CPENC (2,0,1,0,4), F_REG_WRITE,
> AARCH64_NO_FEATURES)
> SYSREG ("oslsr_el1", CPENC (2,0,1,1,4), F_REG_READ,
> AARCH64_NO_FEATURES)
> SYSREG ("pan", CPENC (3,0,4,2,3), F_ARCHEXT,
> AARCH64_FEATURE (PAN))
> - SYSREG ("par_el1", CPENC (3,0,7,4,0), 0,
> AARCH64_NO_FEATURES)
> + SYSREG ("par_el1", CPENC (3,0,7,4,0), F_REG_128,
> AARCH64_NO_FEATURES)
> SYSREG ("pmbidr_el1", CPENC (3,0,9,10,7),
> F_REG_READ|F_ARCHEXT, AARCH64_FEATURE (PROFILE))
> SYSREG ("pmblimitr_el1", CPENC (3,0,9,10,0), F_ARCHEXT,
> AARCH64_FEATURE (PROFILE))
> SYSREG ("pmbptr_el1", CPENC (3,0,9,10,1), F_ARCHEXT,
> AARCH64_FEATURE (PROFILE))
> @@ -746,6 +756,8 @@
> SYSREG ("prlar_el2", CPENC (3,4,6,8,1), F_ARCHEXT,
> AARCH64_FEATURE (V8R))
> SYSREG ("prselr_el1", CPENC (3,0,6,2,1), F_ARCHEXT,
> AARCH64_FEATURE (V8R))
> SYSREG ("prselr_el2", CPENC (3,4,6,2,1), F_ARCHEXT,
> AARCH64_FEATURE (V8R))
> + SYSREG ("rcwmask_el1", CPENC (3,0,13,0,6),
> F_ARCHEXT|F_REG_128, AARCH64_FEATURE (THE))
> + SYSREG ("rcwsmask_el1", CPENC (3,0,13,0,3),
> F_ARCHEXT|F_REG_128, AARCH64_FEATURE (THE))
> SYSREG ("revidr_el1", CPENC (3,0,0,0,6), F_REG_READ,
> AARCH64_NO_FEATURES)
> SYSREG ("rgsr_el1", CPENC (3,0,1,0,5), F_ARCHEXT,
> AARCH64_FEATURE (MEMTAG))
> SYSREG ("rmr_el1", CPENC (3,0,12,0,2), 0,
> AARCH64_NO_FEATURES)
> @@ -1034,13 +1046,13 @@
> SYSREG ("trfcr_el1", CPENC (3,0,1,2,1), F_ARCHEXT,
> AARCH64_FEATURE (V8_4A))
> SYSREG ("trfcr_el12", CPENC (3,5,1,2,1), F_ARCHEXT,
> AARCH64_FEATURE (V8_4A))
> SYSREG ("trfcr_el2", CPENC (3,4,1,2,1), F_ARCHEXT,
> AARCH64_FEATURE (V8_4A))
> - SYSREG ("ttbr0_el1", CPENC (3,0,2,0,0), 0,
> AARCH64_NO_FEATURES)
> - SYSREG ("ttbr0_el12", CPENC (3,5,2,0,0), F_ARCHEXT,
> AARCH64_FEATURE (V8_1A))
> - SYSREG ("ttbr0_el2", CPENC (3,4,2,0,0), F_ARCHEXT,
> AARCH64_FEATURE (V8A))
> + SYSREG ("ttbr0_el1", CPENC (3,0,2,0,0), F_REG_128,
> AARCH64_NO_FEATURES)
> + SYSREG ("ttbr0_el12", CPENC (3,5,2,0,0),
> F_ARCHEXT|F_REG_128, AARCH64_FEATURE (V8_1A))
> + SYSREG ("ttbr0_el2", CPENC (3,4,2,0,0),
> F_ARCHEXT|F_REG_128, AARCH64_FEATURE (V8A))
> SYSREG ("ttbr0_el3", CPENC (3,6,2,0,0), 0,
> AARCH64_NO_FEATURES)
> - SYSREG ("ttbr1_el1", CPENC (3,0,2,0,1), 0,
> AARCH64_NO_FEATURES)
> - SYSREG ("ttbr1_el12", CPENC (3,5,2,0,1), F_ARCHEXT,
> AARCH64_FEATURE (V8_1A))
> - SYSREG ("ttbr1_el2", CPENC (3,4,2,0,1), F_ARCHEXT,
> AARCH64_FEATURES (2, V8A, V8_1A))
> + SYSREG ("ttbr1_el1", CPENC (3,0,2,0,1), F_REG_128,
> AARCH64_NO_FEATURES)
> + SYSREG ("ttbr1_el12", CPENC (3,5,2,0,1),
> F_ARCHEXT|F_REG_128, AARCH64_FEATURE (V8_1A))
> + SYSREG ("ttbr1_el2", CPENC (3,4,2,0,1),
> F_ARCHEXT|F_REG_128, AARCH64_FEATURES (2, V8A, V8_1A))
> SYSREG ("uao", CPENC (3,0,4,2,4), F_ARCHEXT,
> AARCH64_FEATURE (V8_2A))
> SYSREG ("vbar_el1", CPENC (3,0,12,0,0), 0,
> AARCH64_NO_FEATURES)
> SYSREG ("vbar_el12", CPENC (3,5,12,0,0), F_ARCHEXT,
> AARCH64_FEATURE (V8_1A))
> @@ -1057,8 +1069,8 @@
> SYSREG ("vstcr_el2", CPENC (3,4,2,6,2), F_ARCHEXT,
> AARCH64_FEATURE (V8_4A))
> SYSREG ("vsttbr_el2", CPENC (3,4,2,6,0), F_ARCHEXT,
> AARCH64_FEATURES (2, V8A, V8_4A))
> SYSREG ("vtcr_el2", CPENC (3,4,2,1,2), 0,
> AARCH64_NO_FEATURES)
> - SYSREG ("vttbr_el2", CPENC (3,4,2,1,0), F_ARCHEXT,
> AARCH64_FEATURE (V8A))
> + SYSREG ("vttbr_el2", CPENC (3,4,2,1,0),
> F_ARCHEXT|F_REG_128, AARCH64_FEATURE (V8A))
> SYSREG ("zcr_el1", CPENC (3,0,1,2,0), F_ARCHEXT,
> AARCH64_FEATURE (SVE))
> SYSREG ("zcr_el12", CPENC (3,5,1,2,0), F_ARCHEXT,
> AARCH64_FEATURE (SVE))
> SYSREG ("zcr_el2", CPENC (3,4,1,2,0), F_ARCHEXT,
> AARCH64_FEATURE (SVE))
> - SYSREG ("zcr_el3", CPENC (3,6,1,2,0), F_ARCHEXT,
> AARCH64_FEATURE (SVE))
> \ No newline at end of file
> + SYSREG ("zcr_el3", CPENC (3,6,1,2,0), F_ARCHEXT,
> AARCH64_FEATURE (SVE))
> --
> 2.42.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 0/5] aarch64: Add Armv9.4-a 128-bit system-register read/write support
2023-11-28 15:55 [PATCH v2 0/5] aarch64: Add Armv9.4-a 128-bit system-register read/write support Victor Do Nascimento
` (4 preceding siblings ...)
2023-11-28 15:55 ` [PATCH v2 5/5] aarch64: Add rsr128 and wsr128 ACLE tests Victor Do Nascimento
@ 2023-11-28 22:46 ` Richard Sandiford
5 siblings, 0 replies; 8+ messages in thread
From: Richard Sandiford @ 2023-11-28 22:46 UTC (permalink / raw)
To: Victor Do Nascimento; +Cc: gcc-patches, kyrylo.tkachov, Richard.Earnshaw
Victor Do Nascimento <victor.donascimento@arm.com> writes:
> Changes from v1 -
> https://gcc.gnu.org/pipermail/gcc-patches/2023-November/635531.html
>
> * [PATCH 4/5] - For `error_at' message, put feature name in quotes.
> * [PATCH 4/5] - For `aarch64_retrieve_sysreg' function, add
> description of new parameter to comments.
> * [PATCH 5/5] - Reduce the minimum arch requirements of the system
> register unit tests, selectively using `#pragma GCC target' when
> testing 128-bit sysreg r/w functions.
OK for the series, thanks, with the changelog tweak that Kyrill
asked for. 1-3 had already been approved and I agree that the new
versions of 4 and 5 address the review comments.
Richard
> ---
>
> Given the introduction of optional 128-bit page table descriptor and
> translation hardening extension support with the Arm9.4-a
> architecture, this patch series introduces the necessary changes to
> the aarch64-specific builtin code to enable the reading and writing of
> 128-bit system registers. In so doing, the following ACLE builtins and
> feature macro are made available to the compiler:
>
> * __uint128_t __arm_rsr128(const char *special_register);
> * void __arm_wsr128(const char *special_register, __uint128_t value);
> * __ARM_FEATURE_SYSREG128.
>
> Finally, in order to update the GCC system-register database bringing
> it in line with Binutils, and in so doing add the relevant 128-bit
> system registers to GCC, this patch also introduces the Guarded
> Control Stack (GCS) `+gcs' architecture modifier flag, allowing the
> inclusion of the novel GCS system registers which are now supported
> and also present in the `aarch64-sys-regs.def' system register
> database.
>
> Victor Do Nascimento (5):
> aarch64: Add march flags for +the and +d128 arch extensions
> aarch64: Add support for GCS system registers with the +gcs modifier
> aarch64: Sync `aarch64-sys-regs.def' with Binutils.
> aarch64: Implement 128-bit extension to ACLE sysreg r/w builtins
> aarch64: Add rsr128 and wsr128 ACLE tests
>
> gcc/config/aarch64/aarch64-arches.def | 2 +
> gcc/config/aarch64/aarch64-builtins.cc | 50 ++++++++++++++++---
> gcc/config/aarch64/aarch64-c.cc | 1 +
> .../aarch64/aarch64-option-extensions.def | 6 +++
> gcc/config/aarch64/aarch64-protos.h | 2 +-
> gcc/config/aarch64/aarch64-sys-regs.def | 30 +++++++----
> gcc/config/aarch64/aarch64.cc | 9 +++-
> gcc/config/aarch64/aarch64.h | 21 ++++++++
> gcc/config/aarch64/aarch64.md | 18 +++++++
> gcc/config/aarch64/arm_acle.h | 11 ++++
> gcc/doc/invoke.texi | 8 +++
> gcc/testsuite/gcc.target/aarch64/acle/rwsr.c | 32 ++++++++++++
> 12 files changed, 170 insertions(+), 20 deletions(-)
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2023-11-28 22:46 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-28 15:55 [PATCH v2 0/5] aarch64: Add Armv9.4-a 128-bit system-register read/write support Victor Do Nascimento
2023-11-28 15:55 ` [PATCH v2 1/5] aarch64: Add march flags for +the and +d128 arch extensions Victor Do Nascimento
2023-11-28 15:55 ` [PATCH v2 2/5] aarch64: Add support for GCS system registers with the +gcs modifier Victor Do Nascimento
2023-11-28 15:55 ` [PATCH v2 3/5] aarch64: Sync `aarch64-sys-regs.def' with Binutils Victor Do Nascimento
2023-11-28 16:40 ` Kyrylo Tkachov
2023-11-28 15:55 ` [PATCH v2 4/5] aarch64: Implement 128-bit extension to ACLE sysreg r/w builtins Victor Do Nascimento
2023-11-28 15:55 ` [PATCH v2 5/5] aarch64: Add rsr128 and wsr128 ACLE tests Victor Do Nascimento
2023-11-28 22:46 ` [PATCH v2 0/5] aarch64: Add Armv9.4-a 128-bit system-register read/write support Richard Sandiford
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).