diff options
author | Kito Cheng <kito.cheng@sifive.com> | 2023-11-27 22:01:44 +0800 |
---|---|---|
committer | Kito Cheng <kito.cheng@sifive.com> | 2023-12-04 14:38:10 +0800 |
commit | 9e12010b5e724277ea44c300630802f464407d8d (patch) | |
tree | ed338469111bcd01caae1a8117c134d6a636b762 /gcc | |
parent | 26b1599d83ddd5b5ac6fb845549e66acc45981f6 (diff) | |
download | gcc-9e12010b5e724277ea44c300630802f464407d8d.zip gcc-9e12010b5e724277ea44c300630802f464407d8d.tar.gz gcc-9e12010b5e724277ea44c300630802f464407d8d.tar.bz2 |
RISC-V: Refactor riscv_implied_info_t to make it able to handle conditional implication [NFC]
RISC-V ISA implication rules become little bit complicated than before,
it may come with condition, so this commit extend the capability of
riscv_implied_info_t, also make it more...C++ize.
gcc/ChangeLog:
* common/config/riscv/riscv-common.cc (riscv_implied_predicator_t): New.
(riscv_implied_info_t::riscv_implied_info_t): New.
(riscv_implied_info_t::match): New.
(riscv_implied_info): New entry for zcf.
(riscv_subset_list::handle_implied_ext): Use
riscv_implied_info_t::match.
(riscv_subset_list::check_implied_ext): Ditto.
(riscv_subset_list::handle_combine_ext): Ditto.
(riscv_subset_list::parse): Move zcf implication handling to
riscv_implied_infos.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/common/config/riscv/riscv-common.cc | 44 |
1 files changed, 33 insertions, 11 deletions
diff --git a/gcc/common/config/riscv/riscv-common.cc b/gcc/common/config/riscv/riscv-common.cc index de793f9..aecb342 100644 --- a/gcc/common/config/riscv/riscv-common.cc +++ b/gcc/common/config/riscv/riscv-common.cc @@ -38,11 +38,36 @@ along with GCC; see the file COPYING3. If not see #define TARGET_DEFAULT_TARGET_FLAGS (MASK_BIG_ENDIAN) #endif +typedef bool (*riscv_implied_predicator_t) (const riscv_subset_list *); + /* Type for implied ISA info. */ struct riscv_implied_info_t { + constexpr riscv_implied_info_t (const char *ext, const char *implied_ext, + riscv_implied_predicator_t predicator + = nullptr) + : ext (ext), implied_ext (implied_ext), predicator (predicator){}; + + bool match (const riscv_subset_list *subset_list, const char *ext_name) const + { + if (strcmp (ext_name, ext) != 0) + return false; + + if (predicator && !predicator (subset_list)) + return false; + + return true; + } + + bool match (const riscv_subset_list *subset_list, + const riscv_subset_t *subset) const + { + return match (subset_list, subset->name.c_str()); + } + const char *ext; const char *implied_ext; + riscv_implied_predicator_t predicator; }; /* Implied ISA info, must end with NULL sentinel. */ @@ -143,6 +168,11 @@ static const riscv_implied_info_t riscv_implied_info[] = {"zcmp", "zca"}, {"zcmt", "zca"}, {"zcmt", "zicsr"}, + {"zcf", "f", + [] (const riscv_subset_list *subset_list) -> bool + { + return subset_list->xlen () == 32 && subset_list->lookup ("f"); + }}, {"smaia", "ssaia"}, {"smstateen", "ssstateen"}, @@ -1093,7 +1123,7 @@ riscv_subset_list::handle_implied_ext (const char *ext) implied_info->ext; ++implied_info) { - if (strcmp (ext, implied_info->ext) != 0) + if (!implied_info->match (this, ext)) continue; /* Skip if implied extension already present. */ @@ -1131,7 +1161,7 @@ riscv_subset_list::check_implied_ext () for (implied_info = &riscv_implied_info[0]; implied_info->ext; ++implied_info) { - if (strcmp (itr->name.c_str(), implied_info->ext) != 0) + if (!implied_info->match (this, itr)) continue; if (!lookup (implied_info->implied_ext)) @@ -1160,8 +1190,7 @@ riscv_subset_list::handle_combine_ext () 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) + if (!implied_info->match (this, combine_info->name)) continue; if (lookup (implied_info->implied_ext)) @@ -1502,13 +1531,6 @@ riscv_subset_list::parse (const char *arch, location_t loc) subset_list->handle_implied_ext (itr->name.c_str ()); } - /* Zce only implies zcf when RV32 and 'f' extension exist. */ - if (subset_list->lookup ("zce") != NULL - && subset_list->m_xlen == 32 - && subset_list->lookup ("f") != NULL - && subset_list->lookup ("zcf") == NULL) - subset_list->add ("zcf", false); - /* Make sure all implied extensions are included. */ gcc_assert (subset_list->check_implied_ext ()); |