[PATCH] RISC-V: Handle combine extension in canonical ordering.

shihua@iscas.ac.cn shihua@iscas.ac.cn
Tue Mar 8 03:30:51 GMT 2022


From: LiaoShihua <shihua@iscas.ac.cn>

The crypto extension have several shorthand extensions that don't consist of any extra instructions.
Take zk for example, while the extension would imply zkn, zkr, zkt. 
The 3 extensions should also combine back into zk to maintain the canonical order in isa strings.
This patch addresses the above.
And if the other extension has the same situation, you can add them in riscv_combine_info[]



gcc/ChangeLog:

        * common/config/riscv/riscv-common.cc (riscv_subset_list::handle_combine_ext):Combine back into zk to maintain the canonical order in isa strings.
        (riscv_subset_list::parse):Ditto.
        * config/riscv/riscv-subset.h:Declare handle_combine_ext();

gcc/testsuite/ChangeLog:

        * gcc.target/riscv/predef-17.c: New test.

---
 gcc/common/config/riscv/riscv-common.cc    | 56 +++++++++++++++++++
 gcc/config/riscv/riscv-subset.h            |  1 +
 gcc/testsuite/gcc.target/riscv/predef-17.c | 63 ++++++++++++++++++++++
 3 files changed, 120 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/riscv/predef-17.c

diff --git a/gcc/common/config/riscv/riscv-common.cc b/gcc/common/config/riscv/riscv-common.cc
index a904893b9ed..1c06f83cc1c 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 (riscv_subset_list *subset_list)
+{
+  const riscv_ext_version *combine_info;
+  const riscv_implied_info_t *implied_info;
+  bool IsCombined = false;
+
+  for (combine_info = &riscv_combine_info[0]; combine_info->name; ++combine_info)
+  {
+
+    /* Skip if combine extensions are present */
+    if (subset_list->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 (subset_list->lookup(implied_info->implied_ext))
+          {
+            IsCombined = true;
+          }
+      else
+          {
+            IsCombined = false;
+            break;
+          }
+    }
+
+    /* Add combine extensions */
+    if (IsCombined)
+    {
+      if (subset_list->lookup(combine_info->name) == NULL)
+      {
+        subset_list->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 (subset_list);
+
   return subset_list;
 
 fail:
diff --git a/gcc/config/riscv/riscv-subset.h b/gcc/config/riscv/riscv-subset.h
index 4f3556a8d9b..da2e22d34f2 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 (riscv_subset_list *);
 
 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 00000000000..68f5f95a66c
--- /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;
+}
\ No newline at end of file
-- 
2.31.1.windows.1



More information about the Gcc-patches mailing list