https://gcc.gnu.org/g:7e5f5fd101f8686d34532f7afab9314f252e71cd

commit r16-561-g7e5f5fd101f8686d34532f7afab9314f252e71cd
Author: Dongyan Chen <chendong...@isrc.iscas.ac.cn>
Date:   Mon May 12 17:19:24 2025 +0800

    RISC-V: Minimal support for ssnpm, smnpm and smmpm extensions.
    
    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 v5:
    - Fix the testsuite error in arch-50.c.
    Changes for v4:
    - Fix the code based on the commit id 
9b13bea07706a7cae0185f8a860d67209308c050.
    Changes for v3:
    - Fix the error messages in gcc/testsuite/gcc.target/riscv/arch-46.c
    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-ss-1.c: New test.
            * gcc.target/riscv/arch-ss-2.c: New test.

Diff:
---
 gcc/common/config/riscv/riscv-common.cc    | 36 ++++++++++++++++++++++++++++++
 gcc/config/riscv/riscv.opt                 | 19 ++++++++++++++++
 gcc/testsuite/gcc.target/riscv/arch-ss-1.c |  5 +++++
 gcc/testsuite/gcc.target/riscv/arch-ss-2.c | 15 +++++++++++++
 4 files changed, 75 insertions(+)

diff --git a/gcc/common/config/riscv/riscv-common.cc 
b/gcc/common/config/riscv/riscv-common.cc
index c89931aaf869..d3240f792401 100644
--- a/gcc/common/config/riscv/riscv-common.cc
+++ b/gcc/common/config/riscv/riscv-common.cc
@@ -262,6 +262,10 @@ static const riscv_implied_info_t riscv_implied_info[] =
   {"ssstateen", "zicsr"},
   {"sstc", "zicsr"},
 
+  {"ssnpm", "zicsr"},
+  {"smnpm", "zicsr"},
+  {"smmpm", "zicsr"},
+
   {"xsfvcp", "zve32x"},
 
   {NULL, NULL}
@@ -457,6 +461,12 @@ static const struct riscv_ext_version 
riscv_ext_version_table[] =
   {"sstc",      ISA_SPEC_CLASS_NONE, 1, 0},
   {"ssstrict",  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},
+
   {"svade",   ISA_SPEC_CLASS_NONE, 1, 0},
   {"svadu",   ISA_SPEC_CLASS_NONE, 1, 0},
   {"svinval", ISA_SPEC_CLASS_NONE, 1, 0},
@@ -1454,6 +1464,26 @@ riscv_subset_list::check_conflict_ext ()
     error_at (m_loc, "%<-march=%s%>: zclsd 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 "
@@ -1888,6 +1918,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 ba5805e95452..9480dc54cbb5 100644
--- a/gcc/config/riscv/riscv.opt
+++ b/gcc/config/riscv/riscv.opt
@@ -482,6 +482,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-ss-1.c 
b/gcc/testsuite/gcc.target/riscv/arch-ss-1.c
new file mode 100644
index 000000000000..8f95737b248f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/arch-ss-1.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-ss-2.c 
b/gcc/testsuite/gcc.target/riscv/arch-ss-2.c
new file mode 100644
index 000000000000..f1d7724fcee0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/arch-ss-2.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv32gc_ssnpm_smnpm_smmpm_sspm_supm -mabi=ilp32d" } */
+int foo()
+{
+}
+/* { dg-error "'-march=rv32gc_ssnpm_smnpm_smmpm_sspm_supm': ssnpm extension 
supports in rv64 only" "" { target *-*-* } 0 } */
+/* { dg-error "'-march=rv32gc_ssnpm_smnpm_smmpm_sspm_supm': smnpm extension 
supports in rv64 only" "" { target *-*-* } 0 } */
+/* { dg-error "'-march=rv32gc_ssnpm_smnpm_smmpm_sspm_supm': smmpm extension 
supports in rv64 only" "" { target *-*-* } 0 } */
+/* { dg-error "'-march=rv32gc_ssnpm_smnpm_smmpm_sspm_supm': sspm extension 
supports in rv64 only" "" { target *-*-* } 0 } */
+/* { dg-error "'-march=rv32gc_ssnpm_smnpm_smmpm_sspm_supm': supm extension 
supports in rv64 only" "" { target *-*-* } 0 } */
+/* { dg-error 
"'-march=rv32imafdc_zicsr_zifencei_zmmul_zaamo_zalrsc_zca_zcd_zcf_smmpm_smnpm_ssnpm_sspm_supm':
 ssnpm extension supports in rv64 only" "" { target *-*-* } 0 } */
+/* { dg-error 
"'-march=rv32imafdc_zicsr_zifencei_zmmul_zaamo_zalrsc_zca_zcd_zcf_smmpm_smnpm_ssnpm_sspm_supm':
 smnpm extension supports in rv64 only" "" { target *-*-* } 0 } */
+/* { dg-error 
"'-march=rv32imafdc_zicsr_zifencei_zmmul_zaamo_zalrsc_zca_zcd_zcf_smmpm_smnpm_ssnpm_sspm_supm':
 smmpm extension supports in rv64 only" "" { target *-*-* } 0 } */
+/* { dg-error 
"'-march=rv32imafdc_zicsr_zifencei_zmmul_zaamo_zalrsc_zca_zcd_zcf_smmpm_smnpm_ssnpm_sspm_supm':
 sspm extension supports in rv64 only" "" { target *-*-* } 0 } */
+/* { dg-error 
"'-march=rv32imafdc_zicsr_zifencei_zmmul_zaamo_zalrsc_zca_zcd_zcf_smmpm_smnpm_ssnpm_sspm_supm':
 supm extension supports in rv64 only" "" { target *-*-* } 0 } */

Reply via email to