This patch support ssnpm, smnpm, smmpm, sspm and supm extensions[1].
To enable GCC to recognize and process ssnpm, smnpm, smmpm, sspm and
supm extensions correctly at compile time.
[1]
https://github.com/riscv/riscv-j-extension/blob/master/zjpm/instructions.adoc
Changes for v2:
- Add the sspm and supm extensions.
- Add the check_conflict_ext function to check the compatibility of
ssnpm, smnpm, smmpm, sspm and supm extensions.
- Add the test cases for ssnpm, smnpm, smmpm, sspm and supm extensions.
gcc/ChangeLog:
* common/config/riscv/riscv-common.cc
(riscv_subset_list::check_conflict_ext): New extension.
* config/riscv/riscv.opt: Ditto.
gcc/testsuite/ChangeLog:
* gcc.target/riscv/arch-45.c: New test.
* gcc.target/riscv/arch-46.c: New test.
---
gcc/common/config/riscv/riscv-common.cc | 36 ++++++++++++++++++++++++
gcc/config/riscv/riscv.opt | 19 +++++++++++++
gcc/testsuite/gcc.target/riscv/arch-45.c | 5 ++++
gcc/testsuite/gcc.target/riscv/arch-46.c | 10 +++++++
4 files changed, 70 insertions(+)
create mode 100644 gcc/testsuite/gcc.target/riscv/arch-45.c
create mode 100644 gcc/testsuite/gcc.target/riscv/arch-46.c
diff --git a/gcc/common/config/riscv/riscv-common.cc
b/gcc/common/config/riscv/riscv-common.cc
index b34409adf39c..33b2b3c5a191 100644
--- a/gcc/common/config/riscv/riscv-common.cc
+++ b/gcc/common/config/riscv/riscv-common.cc
@@ -227,6 +227,10 @@ static const riscv_implied_info_t
riscv_implied_info[] =
{"ssstateen", "zicsr"},
{"sstc", "zicsr"},
+ {"ssnpm", "zicsr"},
+ {"smnpm", "zicsr"},
+ {"smmpm", "zicsr"},
+
{"xsfvcp", "zve32x"},
{NULL, NULL}
@@ -409,6 +413,12 @@ static const struct riscv_ext_version
riscv_ext_version_table[] =
{"ssstateen", ISA_SPEC_CLASS_NONE, 1, 0},
{"sstc", ISA_SPEC_CLASS_NONE, 1, 0},
+ {"ssnpm", ISA_SPEC_CLASS_NONE, 1, 0},
+ {"smnpm", ISA_SPEC_CLASS_NONE, 1, 0},
+ {"smmpm", ISA_SPEC_CLASS_NONE, 1, 0},
+ {"sspm", ISA_SPEC_CLASS_NONE, 1, 0},
+ {"supm", ISA_SPEC_CLASS_NONE, 1, 0},
+
{"svinval", ISA_SPEC_CLASS_NONE, 1, 0},
{"svnapot", ISA_SPEC_CLASS_NONE, 1, 0},
{"svpbmt", ISA_SPEC_CLASS_NONE, 1, 0},
@@ -1309,6 +1319,26 @@ riscv_subset_list::check_conflict_ext ()
error_at (m_loc, "%<-march=%s%>: zcf extension supports in rv32 only",
m_arch);
+ if (lookup ("ssnpm") && m_xlen == 32)
+ error_at (m_loc, "%<-march=%s%>: ssnpm extension supports in rv64
only",
+ m_arch);
+
+ if (lookup ("smnpm") && m_xlen == 32)
+ error_at (m_loc, "%<-march=%s%>: smnpm extension supports in rv64
only",
+ m_arch);
+
+ if (lookup ("smmpm") && m_xlen == 32)
+ error_at (m_loc, "%<-march=%s%>: smmpm extension supports in rv64
only",
+ m_arch);
+
+ if (lookup ("sspm") && m_xlen == 32)
+ error_at (m_loc, "%<-march=%s%>: sspm extension supports in rv64 only",
+ m_arch);
+
+ if (lookup ("supm") && m_xlen == 32)
+ error_at (m_loc, "%<-march=%s%>: supm extension supports in rv64 only",
+ m_arch);
+
if (lookup ("zfinx") && lookup ("f"))
error_at (m_loc,
"%<-march=%s%>: z*inx conflicts with floating-point "
@@ -1736,6 +1766,12 @@ static const riscv_ext_flag_table_t
riscv_ext_flag_table[] =
RISCV_EXT_FLAG_ENTRY ("svnapot", x_riscv_sv_subext, MASK_SVNAPOT),
RISCV_EXT_FLAG_ENTRY ("svvptc", x_riscv_sv_subext, MASK_SVVPTC),
+ RISCV_EXT_FLAG_ENTRY ("ssnpm", x_riscv_ss_subext, MASK_SSNPM),
+ RISCV_EXT_FLAG_ENTRY ("smnpm", x_riscv_sm_subext, MASK_SMNPM),
+ RISCV_EXT_FLAG_ENTRY ("smmpm", x_riscv_sm_subext, MASK_SMMPM),
+ RISCV_EXT_FLAG_ENTRY ("sspm", x_riscv_ss_subext, MASK_SSPM),
+ RISCV_EXT_FLAG_ENTRY ("supm", x_riscv_su_subext, MASK_SUPM),
+
RISCV_EXT_FLAG_ENTRY ("ztso", x_riscv_ztso_subext, MASK_ZTSO),
RISCV_EXT_FLAG_ENTRY ("xcvmac", x_riscv_xcv_subext, MASK_XCVMAC),
diff --git a/gcc/config/riscv/riscv.opt b/gcc/config/riscv/riscv.opt
index 7515c8ea13dd..cec866350b64 100644
--- a/gcc/config/riscv/riscv.opt
+++ b/gcc/config/riscv/riscv.opt
@@ -472,6 +472,25 @@ Mask(SVNAPOT) Var(riscv_sv_subext)
Mask(SVVPTC) Var(riscv_sv_subext)
+TargetVariable
+int riscv_ss_subext
+
+Mask(SSNPM) Var(riscv_ss_subext)
+
+Mask(SSPM) Var(riscv_ss_subext)
+
+TargetVariable
+int riscv_sm_subext
+
+Mask(SMNPM) Var(riscv_sm_subext)
+
+Mask(SMMPM) Var(riscv_sm_subext)
+
+TargetVariable
+int riscv_su_subext
+
+Mask(SUPM) Var(riscv_su_subext)
+
TargetVariable
int riscv_ztso_subext
diff --git a/gcc/testsuite/gcc.target/riscv/arch-45.c
b/gcc/testsuite/gcc.target/riscv/arch-45.c
new file mode 100644
index 000000000000..8f95737b248f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/arch-45.c
@@ -0,0 +1,5 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gc_ssnpm_smnpm_smmpm_sspm_supm -mabi=lp64" } */
+int foo()
+{
+}
diff --git a/gcc/testsuite/gcc.target/riscv/arch-46.c
b/gcc/testsuite/gcc.target/riscv/arch-46.c
new file mode 100644
index 000000000000..fb2bdf72597f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/arch-46.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv32gc_ssnpm_smnpm_smmpm_sspm_supm
-mabi=ilp32d" } */
+int foo()
+{
+}
+/* { missing " for " dg-error 6 ".'error: '-march=rv32gc_ssnpm': ssnpm
extension supports in rv64 only " } */
+/* { missing " for " dg-error 6 ".'error: '-march=rv32gc_smnpm': smnpm
extension supports in rv64 only " } */
+/* { missing " for " dg-error 6 ".'error: '-march=rv32gc_smmpm': smmpm
extension supports in rv64 only " } */
+/* { missing " for " dg-error 6 ".'error: '-march=rv32gc_sspm': sspm
extension supports in rv64 only " } */
+/* { missing " for " dg-error 6 ".'error: '-march=rv32gc_supm': supm
extension supports in rv64 only " } */
--
2.43.0
在 2025/3/17 21:06, chendongyan 写道:
Okay.
Thanks,
Dongyan Chen
在 2025/3/17 20:51, Jeff Law 写道:
On 3/17/25 5:30 AM, Dongyan Chen wrote:
This patch support ssnpm, smnpm and smmpm extensions[1].
To enable GCC to recognize and process ssnpm, smnpm and smmpm
extensions correctly at compile time.
[1]
https://github.com/riscv/riscv-j-extension/blob/master/zjpm/instructions.adoc
gcc/ChangeLog:
* common/config/riscv/riscv-common.cc: New extension.
* config/riscv/riscv.opt: Ditto.
gcc/testsuite/ChangeLog:
* gcc.target/riscv/arch-45.c: New test.
Not a bugfix. Deferring to gcc-16.
jeff