diff options
-rw-r--r-- | gcc/common/config/riscv/riscv-common.cc | 56 | ||||
-rw-r--r-- | gcc/config/riscv/riscv-subset.h | 1 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/riscv/predef-17.c | 63 |
3 files changed, 120 insertions, 0 deletions
diff --git a/gcc/common/config/riscv/riscv-common.cc b/gcc/common/config/riscv/riscv-common.cc index a904893..e4eedcd 100644 --- a/gcc/common/config/riscv/riscv-common.cc +++ b/gcc/common/config/riscv/riscv-common.cc @@ -189,6 +189,16 @@ static const struct riscv_ext_version riscv_ext_version_table[] = {NULL, ISA_SPEC_CLASS_NONE, 0, 0} }; +/* Combine extensions defined in this table */ +static const struct riscv_ext_version riscv_combine_info[] = +{ + {"zk", ISA_SPEC_CLASS_NONE, 1, 0}, + {"zkn", ISA_SPEC_CLASS_NONE, 1, 0}, + {"zks", ISA_SPEC_CLASS_NONE, 1, 0}, + /* Terminate the list. */ + {NULL, ISA_SPEC_CLASS_NONE, 0, 0} +}; + static const riscv_cpu_info riscv_cpu_tables[] = { #define RISCV_CORE(CORE_NAME, ARCH, TUNE) \ @@ -813,6 +823,50 @@ riscv_subset_list::handle_implied_ext (riscv_subset_t *ext) } } +/* Check any combine extensions for EXT. */ +void +riscv_subset_list::handle_combine_ext () +{ + const riscv_ext_version *combine_info; + const riscv_implied_info_t *implied_info; + bool is_combined = false; + + for (combine_info = &riscv_combine_info[0]; combine_info->name; + ++combine_info) + { + /* Skip if combine extensions are present */ + if (lookup (combine_info->name)) + continue; + + /* Find all extensions of the combine extension */ + for (implied_info = &riscv_implied_info[0]; implied_info->ext; + ++implied_info) + { + /* Skip if implied extension don't match combine extension */ + if (strcmp (combine_info->name, implied_info->ext) != 0) + continue; + + if (lookup (implied_info->implied_ext)) + is_combined = true; + else + { + is_combined = false; + break; + } + } + + /* Add combine extensions */ + if (is_combined) + { + if (lookup (combine_info->name) == NULL) + { + add (combine_info->name, combine_info->major_version, + combine_info->minor_version, false, true); + } + } + } +} + /* Parsing function for multi-letter extensions. Return Value: @@ -992,6 +1046,8 @@ riscv_subset_list::parse (const char *arch, location_t loc) subset_list->handle_implied_ext (itr); } + subset_list->handle_combine_ext (); + return subset_list; fail: diff --git a/gcc/config/riscv/riscv-subset.h b/gcc/config/riscv/riscv-subset.h index 4f3556a..c592650 100644 --- a/gcc/config/riscv/riscv-subset.h +++ b/gcc/config/riscv/riscv-subset.h @@ -68,6 +68,7 @@ private: const char *); void handle_implied_ext (riscv_subset_t *); + void handle_combine_ext (); public: ~riscv_subset_list (); diff --git a/gcc/testsuite/gcc.target/riscv/predef-17.c b/gcc/testsuite/gcc.target/riscv/predef-17.c new file mode 100644 index 0000000..1510d88 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/predef-17.c @@ -0,0 +1,63 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64i_zbkb_zbkc_zbkx_zknd_zkne_zknh_zksed_zksh_zkr_zkt -mabi=lp64 -mcmodel=medlow -misa-spec=2.2" } */ + +int main () { + +#ifndef __riscv_arch_test +#error "__riscv_arch_test" +#endif + +#if __riscv_xlen != 64 +#error "__riscv_xlen" +#endif + +#if !defined(__riscv_i) +#error "__riscv_i" +#endif + +#if !defined(__riscv_zk) +#error "__riscv_zk" +#endif + +#if !defined(__riscv_zkr) +#error "__riscv_zkr" +#endif + +#if !defined(__riscv_zkn) +#error "__riscv_zkn" +#endif + +#if !defined(__riscv_zks) +#error "__riscv_zks" +#endif + +#if !defined(__riscv_zbkb) +#error "__riscv_zbkb" +#endif + +#if !defined(__riscv_zbkc) +#error "__riscv_zbkc" +#endif + +#if !defined(__riscv_zbkx) +#error "__riscv_zbkx" +#endif + +#if !defined(__riscv_zknd) +#error "__riscv_zknd" +#endif + +#if !defined(__riscv_zkne) +#error "__riscv_zkne" +#endif + +#if !defined(__riscv_zknh) +#error "__riscv_zknh" +#endif + +#if !defined(__riscv_zksh) +#error "__riscv_zksh" +#endif + + return 0; +} |