[committed] RISC-V: Refactor riscv_implied_info_t to make it able to handle conditional implication [NFC]

Message ID 20231204064010.80032-1-kito.cheng@sifive.com
State Committed
Commit 9e12010b5e724277ea44c300630802f464407d8d
Headers
Series [committed] RISC-V: Refactor riscv_implied_info_t to make it able to handle conditional implication [NFC] |

Checks

Context Check Description
rivoscibot/toolchain-ci-rivos-build--newlib-rv64gcv-lp64d-multilib success Build passed
rivoscibot/toolchain-ci-rivos-build--linux-rv64gcv-lp64d-multilib success Build passed
linaro-tcwg-bot/tcwg_gcc_build--master-arm warning Patch is already merged
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 warning Patch is already merged
rivoscibot/toolchain-ci-rivos-lint warning Lint failed
rivoscibot/toolchain-ci-rivos-apply-patch success Patch applied
rivoscibot/toolchain-ci-rivos-build--newlib-rv64gc-lp64d-multilib pending Build started
rivoscibot/toolchain-ci-rivos-build--linux-rv32gc_zba_zbb_zbc_zbs-ilp32d-non-multilib success Build passed
rivoscibot/toolchain-ci-rivos-build--linux-rv64gc_zba_zbb_zbc_zbs-lp64d-non-multilib success Build passed
rivoscibot/toolchain-ci-rivos-test pending Testing started

Commit Message

Kito Cheng Dec. 4, 2023, 6:40 a.m. UTC
  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.
---
 gcc/common/config/riscv/riscv-common.cc | 44 ++++++++++++++++++-------
 1 file changed, 33 insertions(+), 11 deletions(-)
  

Patch

diff --git a/gcc/common/config/riscv/riscv-common.cc b/gcc/common/config/riscv/riscv-common.cc
index de793f96fa5..aecb342b164 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 ());