aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKito Cheng <kito.cheng@sifive.com>2023-11-27 22:01:44 +0800
committerKito Cheng <kito.cheng@sifive.com>2023-12-04 14:38:10 +0800
commit9e12010b5e724277ea44c300630802f464407d8d (patch)
treeed338469111bcd01caae1a8117c134d6a636b762 /gcc
parent26b1599d83ddd5b5ac6fb845549e66acc45981f6 (diff)
downloadgcc-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.cc44
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 ());