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 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-49.c: New test. * gcc.target/riscv/arch-50.c: New test. --- gcc/common/config/riscv/riscv-common.cc | 36 ++++++++++++++++++++++++ gcc/config/riscv/riscv.opt | 19 +++++++++++++ gcc/testsuite/gcc.target/riscv/arch-49.c | 5 ++++ gcc/testsuite/gcc.target/riscv/arch-50.c | 10 +++++++ 4 files changed, 70 insertions(+) create mode 100644 gcc/testsuite/gcc.target/riscv/arch-49.c create mode 100644 gcc/testsuite/gcc.target/riscv/arch-50.c diff --git a/gcc/common/config/riscv/riscv-common.cc b/gcc/common/config/riscv/riscv-common.cc index ca14eb96b253..0039833ad3e4 100644 --- a/gcc/common/config/riscv/riscv-common.cc +++ b/gcc/common/config/riscv/riscv-common.cc @@ -259,6 +259,10 @@ static const riscv_implied_info_t riscv_implied_info[] = {"ssstateen", "zicsr"}, {"sstc", "zicsr"}, + {"ssnpm", "zicsr"}, + {"smnpm", "zicsr"}, + {"smmpm", "zicsr"}, + {"xsfvcp", "zve32x"}, {NULL, NULL} @@ -445,6 +449,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}, @@ -1347,6 +1357,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 " @@ -1777,6 +1807,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 80593ee139c1..3db9408c2387 100644 --- a/gcc/config/riscv/riscv.opt +++ b/gcc/config/riscv/riscv.opt @@ -478,6 +478,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-49.c b/gcc/testsuite/gcc.target/riscv/arch-49.c new file mode 100644 index 000000000000..8f95737b248f --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/arch-49.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-50.c b/gcc/testsuite/gcc.target/riscv/arch-50.c new file mode 100644 index 000000000000..37027c1b3241 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/arch-50.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv32gc_ssnpm_smnpm_smmpm_sspm_supm -mabi=ilp32d" } */ +int foo() +{ +} +/* { dg-error "'-march=rv32gc_ssnpm': ssnpm extension supports in rv64 only" "" { target *-*-* } 0 } */ +/* { dg-error "'-march=rv32gc_smnpm': smnpm extension supports in rv64 only" "" { target *-*-* } 0 } */ +/* { dg-error "'-march=rv32gc_smmpm': smmpm extension supports in rv64 only" "" { target *-*-* } 0 } */ +/* { dg-error "'-march=rv32gc_sspm': sspm extension supports in rv64 only" "" { target *-*-* } 0 } */ +/* { dg-error "'-march=rv32gc_supm': supm extension supports in rv64 only" "" { target *-*-* } 0 } */ -- 2.43.0