* [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
* 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
* [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 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).