[PATCH 3/3] RISC-V: Fall back on /proc/cpuinfo when hwprobe is unavailable

Kito Cheng <[email protected]>
Newsgroups gmane.comp.gcc.patches
Message-ID <[email protected]>
hwprobe only arrived in Linux 6.4, so on an older kernel the syscall fails
and -march=native has nothing to say.  /proc/cpuinfo has carried an ISA
string for far longer, so read that instead when the syscall is unavailable.

GCC_CPUINFO names a file to read instead of /proc/cpuinfo, and
GCC_CPUINFO_CPU the processor to look for in it, as on aarch64.  Both
exist so that the parser can be tested on a machine unlike the one the
file describes.

The test input other than info_1 are /proc/cpuinfo output collected from
real machines:

  info_0  SpacemiT X100 and A100, one block of each, from a machine
          whose cores are not all alike
  info_2  SiFive U74-MC, from a StarFive VisionFive 2
  info_3  SpacemiT X60, from a Banana Pi BPI-F3
  info_4  SiFive P870-D

info_1 is made up, naming extensions no compiler knows, so that
dropping them can be tested.

gcc/ChangeLog:

	* common/config/riscv/riscv-common.cc (standard_extensions_p):
	Rename to...
	(riscv_ext_is_known_p): ...this, and export.
	(riscv_subset_list::parse_single_std_ext): Update the callers.
	(riscv_subset_list::parse_single_multiletter_ext): Likewise.
	* config/riscv/riscv-subset.h (riscv_ext_is_known_p): Declare.
	* config/riscv/driver-riscv.cc: Include riscv-subset.h.
	(riscv_native_arch): Split the hwprobe half out into...
	(riscv_arch_from_hwprobe): ...this new function.
	(struct riscv_cpuinfo): New.
	(riscv_cpuinfo_file, riscv_cpuinfo_forced, riscv_cpuinfo_cpu)
	(riscv_cpuinfo_field, riscv_read_cpuinfo, riscv_cpuinfo)
	(riscv_filter_isa, riscv_arch_from_cpuinfo): New functions.
	* config/riscv/x-riscv: Update the dependencies.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/cpunative/riscv-cpunative.exp: New file.
	* gcc.target/riscv/cpunative/info_0: New file.
	* gcc.target/riscv/cpunative/info_1: New file.
	* gcc.target/riscv/cpunative/info_2: New file.
	* gcc.target/riscv/cpunative/info_3: New file.
	* gcc.target/riscv/cpunative/info_4: New file.
	* gcc.target/riscv/cpunative/native_cpu_0.c: New test.
	* gcc.target/riscv/cpunative/native_cpu_1.c: New test.
	* gcc.target/riscv/cpunative/native_cpu_2.c: New test.
	* gcc.target/riscv/cpunative/native_cpu_3.c: New test.
	* gcc.target/riscv/cpunative/native_cpu_4.c: New test.
	* gcc.target/riscv/cpunative/native_cpu_5.c: New test.
	* gcc.target/riscv/cpunative/native_cpu_6.c: New test.
---
 gcc/common/config/riscv/riscv-common.cc       |  15 +-
 gcc/common/config/riscv/riscv-hwprobe.h       |   3 +
 gcc/config/riscv/driver-riscv.cc              | 220 +++++++++++++-
 gcc/config/riscv/riscv-subset.h               |   1 +
 gcc/config/riscv/x-riscv                      |   1 +
 .../gcc.target/riscv/cpunative/info_0         |  20 ++
 .../gcc.target/riscv/cpunative/info_1         |  10 +
 .../gcc.target/riscv/cpunative/info_2         |  39 +++
 .../gcc.target/riscv/cpunative/info_3         |  71 +++++
 .../gcc.target/riscv/cpunative/info_4         | 287 ++++++++++++++++++
 .../gcc.target/riscv/cpunative/native_cpu_0.c |  17 ++
 .../gcc.target/riscv/cpunative/native_cpu_1.c |  17 ++
 .../gcc.target/riscv/cpunative/native_cpu_2.c |  14 +
 .../gcc.target/riscv/cpunative/native_cpu_3.c |  18 ++
 .../gcc.target/riscv/cpunative/native_cpu_4.c |  17 ++
 .../gcc.target/riscv/cpunative/native_cpu_5.c |  16 +
 .../gcc.target/riscv/cpunative/native_cpu_6.c |  22 ++
 .../riscv/cpunative/riscv-cpunative.exp       |  35 +++
 18 files changed, 814 insertions(+), 9 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/riscv/cpunative/info_0
 create mode 100644 gcc/testsuite/gcc.target/riscv/cpunative/info_1
 create mode 100644 gcc/testsuite/gcc.target/riscv/cpunative/info_2
 create mode 100644 gcc/testsuite/gcc.target/riscv/cpunative/info_3
 create mode 100644 gcc/testsuite/gcc.target/riscv/cpunative/info_4
 create mode 100644 gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_0.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_1.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_2.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_3.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_4.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_5.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_6.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/cpunative/riscv-cpunative.exp

diff --git a/gcc/common/config/riscv/riscv-common.cc b/gcc/common/config/riscv/riscv-common.cc
index 6bbbacab8df..0252a600287 100644
--- a/gcc/common/config/riscv/riscv-common.cc
+++ b/gcc/common/config/riscv/riscv-common.cc
@@ -522,10 +522,11 @@ subset_cmp (const std::string &a, const std::string &b)
     }
 }
 
-/* Return true if EXT is a standard extension.  */
+/* Return true if EXT names an extension this compiler knows about, whether
+   standard or vendor defined.  */
 
-static bool
-standard_extensions_p (const char *ext)
+bool
+riscv_ext_is_known_p (const char *ext)
 {
   auto itr = riscv_ext_infos.find (ext);
   return itr != riscv_ext_infos.end ();
@@ -562,7 +563,7 @@ riscv_subset_list::add (const char *subset, int major_version,
 	}
       return;
     }
-  else if (strlen (subset) == 1 && !standard_extensions_p (subset))
+  else if (strlen (subset) == 1 && !riscv_ext_is_known_p (subset))
     {
       if (m_loc)
 	error_at (*m_loc,
@@ -571,7 +572,7 @@ riscv_subset_list::add (const char *subset, int major_version,
 		  m_arch, subset);
       return;
     }
-  else if (subset[0] == 'z' && !standard_extensions_p (subset))
+  else if (subset[0] == 'z' && !riscv_ext_is_known_p (subset))
     {
       if (m_loc)
 	error_at (*m_loc,
@@ -580,7 +581,7 @@ riscv_subset_list::add (const char *subset, int major_version,
 		  m_arch, subset);
       return;
     }
-  else if (subset[0] == 's' && !standard_extensions_p (subset))
+  else if (subset[0] == 's' && !riscv_ext_is_known_p (subset))
     {
       if (m_loc)
 	error_at (*m_loc,
@@ -589,7 +590,7 @@ riscv_subset_list::add (const char *subset, int major_version,
 		  m_arch, subset);
       return;
     }
-  else if (subset[0] == 'x' && !standard_extensions_p (subset))
+  else if (subset[0] == 'x' && !riscv_ext_is_known_p (subset))
     {
       if (m_loc)
 	error_at (*m_loc,
diff --git a/gcc/common/config/riscv/riscv-hwprobe.h b/gcc/common/config/riscv/riscv-hwprobe.h
index ba989b99d2f..9b66364427c 100644
--- a/gcc/common/config/riscv/riscv-hwprobe.h
+++ b/gcc/common/config/riscv/riscv-hwprobe.h
@@ -29,6 +29,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #ifndef __NR_riscv_hwprobe
 #define __NR_riscv_hwprobe 258
 #endif
+#ifndef __NR_getcpu
+#define __NR_getcpu 168
+#endif
 
 enum {
 #define RISCV_HWPROBE_KEY(NAME, VALUE) RISCV_HWPROBE_KEY_##NAME = VALUE,
diff --git a/gcc/config/riscv/driver-riscv.cc b/gcc/config/riscv/driver-riscv.cc
index 2997c5c2fe9..535ee49267c 100644
--- a/gcc/config/riscv/driver-riscv.cc
+++ b/gcc/config/riscv/driver-riscv.cc
@@ -24,6 +24,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "system.h"
 #include "coretypes.h"
 #include "tm.h"
+#include "riscv-subset.h"
 
 #ifdef __linux__
 #include "common/config/riscv/riscv-hwprobe.h"
@@ -44,6 +45,20 @@ static const struct riscv_hwprobe_ext riscv_hwprobe_exts[] = {
 #include "common/config/riscv/riscv-hwprobe.def"
 };
 
+/* Return the number of the CPU this process is currently running on, or -1
+   if it cannot be determined.  */
+
+static int
+riscv_current_cpu (void)
+{
+  unsigned int cpu = 0;
+
+  if (syscall_5_args (__NR_getcpu, (long) &cpu, 0, 0, 0, 0) != 0)
+    return -1;
+
+  return (int) cpu;
+}
+
 /* Append the Zvl extension for this machine's vector register width,
    which only the vlenb CSR reports.  */
 
@@ -111,6 +126,205 @@ riscv_arch_from_hwprobe (std::string &isa, bool *vector_p)
   return true;
 }
 
+/* What the /proc/cpuinfo fallback managed to read out of one processor
+   block.  */
+
+struct riscv_cpuinfo
+{
+  std::string isa;
+};
+
+/* GCC_CPUINFO names a file to read instead of /proc/cpuinfo, and
+   GCC_CPUINFO_CPU the processor to look for in it.  Both are for
+   testing.  */
+
+static const char *
+riscv_cpuinfo_file (void)
+{
+  const char *path = getenv ("GCC_CPUINFO");
+
+  return path != NULL ? path : "/proc/cpuinfo";
+}
+
+static bool
+riscv_cpuinfo_forced (void)
+{
+  return getenv ("GCC_CPUINFO") != NULL;
+}
+
+static int
+riscv_cpuinfo_cpu (void)
+{
+  const char *forced = getenv ("GCC_CPUINFO_CPU");
+
+  return forced != NULL ? atoi (forced) : riscv_current_cpu ();
+}
+
+/* Split LINE, which /proc/cpuinfo writes as "name\t: value", putting the
+   name in NAME and returning the value.  Both are stripped of surrounding
+   whitespace.  Return NULL if LINE is not of that shape.  */
+
+static const char *
+riscv_cpuinfo_field (char *line, std::string &name)
+{
+  char *colon = strchr (line, ':');
+  char *end;
+
+  if (colon == NULL)
+    return NULL;
+
+  end = colon;
+  while (end > line && ISSPACE (end[-1]))
+    end--;
+  name.assign (line, end - line);
+
+  colon++;
+  while (ISSPACE (*colon))
+    colon++;
+
+  end = colon + strlen (colon);
+  while (end > colon && ISSPACE (end[-1]))
+    end--;
+  *end = '\0';
+
+  return colon;
+}
+
+/* Read the /proc/cpuinfo block describing processor WANT into OUT, or the
+   first block in the file if WANT is negative.  The processor field holds
+   the number sched_getcpu would return, not the hart id.  Return false if
+   there is no such block, or if it says nothing about the ISA.  */
+
+static bool
+riscv_read_cpuinfo (int want, struct riscv_cpuinfo *out)
+{
+  FILE *f = fopen (riscv_cpuinfo_file (), "r");
+  char line[1024];
+  bool in_block = false;
+  bool hart_isa_p = false;
+
+  if (f == NULL)
+    return false;
+
+  out->isa.clear ();
+
+  while (fgets (line, sizeof (line), f) != NULL)
+    {
+      std::string name;
+      const char *value = riscv_cpuinfo_field (line, name);
+
+      if (value == NULL)
+	continue;
+
+      if (name == "processor")
+	{
+	  if (in_block)
+	    break;
+	  in_block = want < 0 || atoi (value) == want;
+	  continue;
+	}
+
+      if (!in_block)
+	continue;
+
+      /* "hart isa" describes this core alone and is the one to go by, but
+	 the kernels this fallback exists for are older than that line and
+	 offer only the machine-wide "isa".  */
+      if (name == "hart isa")
+	{
+	  out->isa = value;
+	  hart_isa_p = true;
+	}
+      else if (name == "isa" && !hart_isa_p)
+	out->isa = value;
+    }
+
+  fclose (f);
+
+  return !out->isa.empty ();
+}
+
+/* Read the block for the current CPU, or the first one if it has none.  */
+
+static bool
+riscv_cpuinfo (struct riscv_cpuinfo *out)
+{
+  return (riscv_read_cpuinfo (riscv_cpuinfo_cpu (), out)
+	  || riscv_read_cpuinfo (-1, out));
+}
+
+/* Copy KERNEL_ISA into ISA, dropping every extension this compiler does
+   not know: one unrecognised name would make -march= fail outright.  Set
+   *VECTOR_P if what is left has vectors.  Return false if KERNEL_ISA is
+   not an ISA string at all.  */
+
+static bool
+riscv_filter_isa (const char *kernel_isa, std::string &isa, bool *vector_p)
+{
+  const char *base = __riscv_xlen == 32 ? "rv32" : "rv64";
+  const char *p = kernel_isa;
+
+  if (strncmp (p, base, 4) != 0)
+    return false;
+  p += 4;
+
+  if (*p != 'i' && *p != 'e' && *p != 'g')
+    return false;
+
+  isa = base;
+  isa += *p++;
+
+  /* The single-letter extensions run together up to the first underscore.  */
+  for (; *p != '\0' && *p != '_'; p++)
+    {
+      const char name[2] = { *p, '\0' };
+
+      if (!riscv_ext_is_known_p (name))
+	continue;
+
+      isa += '_';
+      isa += *p;
+      if (*p == 'v')
+	*vector_p = true;
+    }
+
+  /* The multi-letter ones are separated by underscores.  */
+  while (*p == '_')
+    {
+      const char *end = ++p;
+
+      while (*end != '\0' && *end != '_')
+	end++;
+
+      std::string name (p, end - p);
+      p = end;
+
+      if (name.empty () || !riscv_ext_is_known_p (name.c_str ()))
+	continue;
+
+      isa += '_';
+      isa += name;
+      if (name.compare (0, 3, "zve") == 0)
+	*vector_p = true;
+    }
+
+  return true;
+}
+
+/* Build the ISA string from /proc/cpuinfo, for kernels that are too old to
+   have hwprobe.  */
+
+static bool
+riscv_arch_from_cpuinfo (std::string &isa, bool *vector_p)
+{
+  struct riscv_cpuinfo info;
+
+  if (!riscv_cpuinfo (&info))
+    return false;
+
+  return riscv_filter_isa (info.isa.c_str (), isa, vector_p);
+}
+
 /* Return the ISA string describing this machine, or NULL if it cannot be
    determined.  */
 
@@ -119,11 +333,13 @@ riscv_native_arch (void)
 {
   std::string isa;
   bool vector_p = false;
+  bool forced = riscv_cpuinfo_forced ();
 
-  if (!riscv_arch_from_hwprobe (isa, &vector_p))
+  if ((forced || !riscv_arch_from_hwprobe (isa, &vector_p))
+      && !riscv_arch_from_cpuinfo (isa, &vector_p))
     return NULL;
 
-  if (vector_p)
+  if (vector_p && !forced)
     riscv_add_vlen (isa);
 
   return xstrdup (isa.c_str ());
diff --git a/gcc/config/riscv/riscv-subset.h b/gcc/config/riscv/riscv-subset.h
index 2f7d943613f..19ccb0a4fdb 100644
--- a/gcc/config/riscv/riscv-subset.h
+++ b/gcc/config/riscv/riscv-subset.h
@@ -178,6 +178,7 @@ public:
   const_iterator end() const   { return const_iterator(nullptr); }
 };
 
+extern bool riscv_ext_is_known_p (const char *);
 extern const riscv_subset_list *riscv_cmdline_subset_list (void);
 extern void
 riscv_set_arch_by_subset_list (riscv_subset_list *, struct gcc_options *);
diff --git a/gcc/config/riscv/x-riscv b/gcc/config/riscv/x-riscv
index 55f32d7dd1c..d1c59ba50e0 100644
--- a/gcc/config/riscv/x-riscv
+++ b/gcc/config/riscv/x-riscv
@@ -1,5 +1,6 @@
 driver-riscv.o: $(srcdir)/config/riscv/driver-riscv.cc \
   $(CONFIG_H) $(SYSTEM_H) $(TM_H) $(CORETYPES_H) \
+  $(srcdir)/config/riscv/riscv-subset.h \
   $(srcdir)/common/config/riscv/riscv-hwprobe.h \
   $(srcdir)/common/config/riscv/riscv-hwprobe.def
 	$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
diff --git a/gcc/testsuite/gcc.target/riscv/cpunative/info_0 b/gcc/testsuite/gcc.target/riscv/cpunative/info_0
new file mode 100644
index 00000000000..d86dc23aee5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/cpunative/info_0
@@ -0,0 +1,20 @@
+processor	: 0
+hart		: 0
+model name	: Spacemit(R) X100
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfh_zfhmin_zca_zcb_zcd_zcmop_zba_zbb_zbc_zbs_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfh_zvfhmin_zvkb_zvkg_zvkned_zvknha_zvknhb_zvksed_zvksh_zvkt_smaia_smstateen_ssaia_sscofpmf_sstc_svinval_svnapot_svpbmt_sdtrig
+mmu		: sv39
+mvendorid	: 0x710
+marchid		: 0x8000000058000002
+mimpid		: 0x33d8a600
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfh_zfhmin_zca_zcb_zcd_zcmop_zba_zbb_zbc_zbs_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfh_zvfhmin_zvkb_zvkg_zvkned_zvknha_zvknhb_zvksed_zvksh_zvkt_smaia_smstateen_ssaia_sscofpmf_sstc_svinval_svnapot_svpbmt_sdtrig
+
+processor	: 8
+hart		: 8
+model name	: Spacemit(R) A100
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfh_zfhmin_zca_zcb_zcd_zcmop_zba_zbb_zbc_zbs_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfh_zvfhmin_zvkb_zvkg_zvkned_zvknha_zvknhb_zvksed_zvksh_zvkt_smaia_smstateen_ssaia_sscofpmf_sstc_svinval_svnapot_svpbmt_sdtrig
+mmu		: sv39
+mvendorid	: 0x710
+marchid		: 0x8000000041000002
+mimpid		: 0x10000000d5686200
+hart isa	: rv64imafdcv_zicbom_zicbop_zicboz_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfh_zfhmin_zca_zcb_zcd_zcmop_zba_zbb_zbc_zbs_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfh_zvfhmin_zvkb_zvkg_zvkned_zvknha_zvknhb_zvksed_zvksh_zvkt_smaia_smstateen_ssaia_sscofpmf_sstc_svinval_svnapot_svpbmt_sdtrig
+
diff --git a/gcc/testsuite/gcc.target/riscv/cpunative/info_1 b/gcc/testsuite/gcc.target/riscv/cpunative/info_1
new file mode 100644
index 00000000000..6a3709c5456
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/cpunative/info_1
@@ -0,0 +1,10 @@
+processor	: 0
+hart		: 0
+model name	: Nonesuch
+isa		: rv64imafdc_znosuchext_zba_xmadeup_zbb
+mmu		: sv39
+mvendorid	: 0xdead
+marchid		: 0xbeef
+mimpid		: 0x1
+hart isa	: rv64imafdc_znosuchext_zba_xmadeup_zbb
+
diff --git a/gcc/testsuite/gcc.target/riscv/cpunative/info_2 b/gcc/testsuite/gcc.target/riscv/cpunative/info_2
new file mode 100644
index 00000000000..500ad48d420
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/cpunative/info_2
@@ -0,0 +1,39 @@
+processor	: 0
+hart		: 2
+isa		: rv64imafdc_zicntr_zicsr_zifencei_zihpm_zca_zcd_zba_zbb
+mmu		: sv39
+uarch		: sifive,u74-mc
+mvendorid	: 0x489
+marchid		: 0x8000000000000007
+mimpid		: 0x4210427
+hart isa	: rv64imafdc_zicntr_zicsr_zifencei_zihpm_zca_zcd_zba_zbb
+
+processor	: 1
+hart		: 1
+isa		: rv64imafdc_zicntr_zicsr_zifencei_zihpm_zca_zcd_zba_zbb
+mmu		: sv39
+uarch		: sifive,u74-mc
+mvendorid	: 0x489
+marchid		: 0x8000000000000007
+mimpid		: 0x4210427
+hart isa	: rv64imafdc_zicntr_zicsr_zifencei_zihpm_zca_zcd_zba_zbb
+
+processor	: 2
+hart		: 3
+isa		: rv64imafdc_zicntr_zicsr_zifencei_zihpm_zca_zcd_zba_zbb
+mmu		: sv39
+uarch		: sifive,u74-mc
+mvendorid	: 0x489
+marchid		: 0x8000000000000007
+mimpid		: 0x4210427
+hart isa	: rv64imafdc_zicntr_zicsr_zifencei_zihpm_zca_zcd_zba_zbb
+
+processor	: 3
+hart		: 4
+isa		: rv64imafdc_zicntr_zicsr_zifencei_zihpm_zca_zcd_zba_zbb
+mmu		: sv39
+uarch		: sifive,u74-mc
+mvendorid	: 0x489
+marchid		: 0x8000000000000007
+mimpid		: 0x4210427
+hart isa	: rv64imafdc_zicntr_zicsr_zifencei_zihpm_zca_zcd_zba_zbb
diff --git a/gcc/testsuite/gcc.target/riscv/cpunative/info_3 b/gcc/testsuite/gcc.target/riscv/cpunative/info_3
new file mode 100644
index 00000000000..ff24857b4a3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/cpunative/info_3
@@ -0,0 +1,71 @@
+processor	: 0
+hart		: 0
+model name	: Spacemit(R) X60
+isa		: rv64imafdcv_zicbom_zicboz_zicntr_zicond_zicsr_zifencei_zihintpause_zihpm_zfh_zfhmin_zca_zcd_zba_zbb_zbc_zbs_zkt_zve32f_zve32x_zve64d_zve64f_zve64x_zvfh_zvfhmin_zvkt_sscofpmf_sstc_svinval_svnapot_svpbmt
+mmu		: sv39
+mvendorid	: 0x710
+marchid		: 0x8000000058000001
+mimpid		: 0x1000000049772200
+
+processor	: 1
+hart		: 1
+model name	: Spacemit(R) X60
+isa		: rv64imafdcv_zicbom_zicboz_zicntr_zicond_zicsr_zifencei_zihintpause_zihpm_zfh_zfhmin_zca_zcd_zba_zbb_zbc_zbs_zkt_zve32f_zve32x_zve64d_zve64f_zve64x_zvfh_zvfhmin_zvkt_sscofpmf_sstc_svinval_svnapot_svpbmt
+mmu		: sv39
+mvendorid	: 0x710
+marchid		: 0x8000000058000001
+mimpid		: 0x1000000049772200
+
+processor	: 2
+hart		: 2
+model name	: Spacemit(R) X60
+isa		: rv64imafdcv_zicbom_zicboz_zicntr_zicond_zicsr_zifencei_zihintpause_zihpm_zfh_zfhmin_zca_zcd_zba_zbb_zbc_zbs_zkt_zve32f_zve32x_zve64d_zve64f_zve64x_zvfh_zvfhmin_zvkt_sscofpmf_sstc_svinval_svnapot_svpbmt
+mmu		: sv39
+mvendorid	: 0x710
+marchid		: 0x8000000058000001
+mimpid		: 0x1000000049772200
+
+processor	: 3
+hart		: 3
+model name	: Spacemit(R) X60
+isa		: rv64imafdcv_zicbom_zicboz_zicntr_zicond_zicsr_zifencei_zihintpause_zihpm_zfh_zfhmin_zca_zcd_zba_zbb_zbc_zbs_zkt_zve32f_zve32x_zve64d_zve64f_zve64x_zvfh_zvfhmin_zvkt_sscofpmf_sstc_svinval_svnapot_svpbmt
+mmu		: sv39
+mvendorid	: 0x710
+marchid		: 0x8000000058000001
+mimpid		: 0x1000000049772200
+
+processor	: 4
+hart		: 4
+model name	: Spacemit(R) X60
+isa		: rv64imafdcv_zicbom_zicboz_zicntr_zicond_zicsr_zifencei_zihintpause_zihpm_zfh_zfhmin_zca_zcd_zba_zbb_zbc_zbs_zkt_zve32f_zve32x_zve64d_zve64f_zve64x_zvfh_zvfhmin_zvkt_sscofpmf_sstc_svinval_svnapot_svpbmt
+mmu		: sv39
+mvendorid	: 0x710
+marchid		: 0x8000000058000001
+mimpid		: 0x1000000049772200
+
+processor	: 5
+hart		: 5
+model name	: Spacemit(R) X60
+isa		: rv64imafdcv_zicbom_zicboz_zicntr_zicond_zicsr_zifencei_zihintpause_zihpm_zfh_zfhmin_zca_zcd_zba_zbb_zbc_zbs_zkt_zve32f_zve32x_zve64d_zve64f_zve64x_zvfh_zvfhmin_zvkt_sscofpmf_sstc_svinval_svnapot_svpbmt
+mmu		: sv39
+mvendorid	: 0x710
+marchid		: 0x8000000058000001
+mimpid		: 0x1000000049772200
+
+processor	: 6
+hart		: 6
+model name	: Spacemit(R) X60
+isa		: rv64imafdcv_zicbom_zicboz_zicntr_zicond_zicsr_zifencei_zihintpause_zihpm_zfh_zfhmin_zca_zcd_zba_zbb_zbc_zbs_zkt_zve32f_zve32x_zve64d_zve64f_zve64x_zvfh_zvfhmin_zvkt_sscofpmf_sstc_svinval_svnapot_svpbmt
+mmu		: sv39
+mvendorid	: 0x710
+marchid		: 0x8000000058000001
+mimpid		: 0x1000000049772200
+
+processor	: 7
+hart		: 7
+model name	: Spacemit(R) X60
+isa		: rv64imafdcv_zicbom_zicboz_zicntr_zicond_zicsr_zifencei_zihintpause_zihpm_zfh_zfhmin_zca_zcd_zba_zbb_zbc_zbs_zkt_zve32f_zve32x_zve64d_zve64f_zve64x_zvfh_zvfhmin_zvkt_sscofpmf_sstc_svinval_svnapot_svpbmt
+mmu		: sv39
+mvendorid	: 0x710
+marchid		: 0x8000000058000001
+mimpid		: 0x1000000049772200
diff --git a/gcc/testsuite/gcc.target/riscv/cpunative/info_4 b/gcc/testsuite/gcc.target/riscv/cpunative/info_4
new file mode 100644
index 00000000000..3082d576e6c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/cpunative/info_4
@@ -0,0 +1,287 @@
+processor	: 0
+hart		: 0
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 1
+hart		: 1
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 2
+hart		: 2
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 3
+hart		: 3
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 4
+hart		: 4
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 5
+hart		: 5
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 6
+hart		: 6
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 7
+hart		: 7
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 8
+hart		: 8
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 9
+hart		: 9
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 10
+hart		: 10
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 11
+hart		: 11
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 12
+hart		: 12
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 13
+hart		: 13
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 14
+hart		: 14
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 15
+hart		: 15
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 16
+hart		: 16
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 17
+hart		: 17
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 18
+hart		: 18
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 19
+hart		: 19
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 20
+hart		: 20
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 21
+hart		: 21
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 22
+hart		: 22
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 23
+hart		: 23
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 24
+hart		: 24
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 25
+hart		: 25
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 26
+hart		: 26
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 27
+hart		: 27
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 28
+hart		: 28
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 29
+hart		: 29
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 30
+hart		: 30
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+
+processor	: 31
+hart		: 31
+isa		: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
+mmu		: sv48
+mvendorid	: 0x489
+marchid		: 0x8000000000000109
+mimpid		: 0x14250606
+hart isa	: rv64imafdcvh_zicbom_zicbop_zicboz_ziccrse_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zimop_zaamo_zalrsc_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcmop_zba_zbb_zbs_zkr_zkt_zvbb_zvbc_zve32f_zve32x_zve64d_zve64f_zve64x_zvfbfmin_zvfbfwma_zvfh_zvkb_zvkg_zvkned_zvknhb_zvksed_zvksh_zvkt_smaia_smmpm_smnpm_smstateen_ssaia_sscofpmf_ssnpm_sstc_svade_svinval_svnapot_svpbmt
diff --git a/gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_0.c b/gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_0.c
new file mode 100644
index 00000000000..bdac433d381
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_0.c
@@ -0,0 +1,17 @@
+/* The X100 half of a heterogeneous machine.  Its hart implements H, and
+   the compiler is told it is running on that core.  */
+
+/* { dg-do compile } */
+/* { dg-require-effective-target riscv_native_cpu_detect } */
+/* { dg-require-effective-target rv64 } */
+/* { dg-set-compiler-env-var GCC_CPUINFO "$srcdir/gcc.target/riscv/cpunative/info_0" } */
+/* { dg-set-compiler-env-var GCC_CPUINFO_CPU "0" } */
+/* { dg-additional-options "-march=native -mabi=lp64d -fverbose-asm" } */
+
+int
+main (void)
+{
+  return 0;
+}
+
+/* { dg-final { scan-assembler {\.attribute arch, "rv64i2p1[^"]*_h1p0_} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_1.c b/gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_1.c
new file mode 100644
index 00000000000..a958e8c541a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_1.c
@@ -0,0 +1,17 @@
+/* Real /proc/cpuinfo from a spacemit K3.  */
+
+/* { dg-do compile } */
+/* { dg-require-effective-target riscv_native_cpu_detect } */
+/* { dg-require-effective-target rv64 } */
+/* { dg-set-compiler-env-var GCC_CPUINFO "$srcdir/gcc.target/riscv/cpunative/info_0" } */
+/* { dg-set-compiler-env-var GCC_CPUINFO_CPU "8" } */
+/* { dg-additional-options "-march=native -mabi=lp64d -fverbose-asm" } */
+
+int
+main (void)
+{
+  return 0;
+}
+
+/* { dg-final { scan-assembler {\.attribute arch, "rv64i2p1[^"]*_v1p0_} } } */
+/* { dg-final { scan-assembler-not {\.attribute arch, "[^"]*_h1p0_} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_2.c b/gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_2.c
new file mode 100644
index 00000000000..adccb7ea7cd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_2.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target riscv_native_cpu_detect } */
+/* { dg-require-effective-target rv64 } */
+/* { dg-set-compiler-env-var GCC_CPUINFO "$srcdir/gcc.target/riscv/cpunative/info_0" } */
+/* { dg-set-compiler-env-var GCC_CPUINFO_CPU "99" } */
+/* { dg-additional-options "-march=native -mabi=lp64d -fverbose-asm" } */
+
+int
+main (void)
+{
+  return 0;
+}
+
+/* { dg-final { scan-assembler {\.attribute arch, "rv64i2p1[^"]*_h1p0_} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_3.c b/gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_3.c
new file mode 100644
index 00000000000..8fbcb75b187
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_3.c
@@ -0,0 +1,18 @@
+/* Testcase with unknown ext in /proc/cpuinfo.  */
+
+/* { dg-do compile } */
+/* { dg-require-effective-target riscv_native_cpu_detect } */
+/* { dg-require-effective-target rv64 } */
+/* { dg-set-compiler-env-var GCC_CPUINFO "$srcdir/gcc.target/riscv/cpunative/info_1" } */
+/* { dg-set-compiler-env-var GCC_CPUINFO_CPU "0" } */
+/* { dg-additional-options "-march=native -mabi=lp64d -fverbose-asm" } */
+
+int
+main (void)
+{
+  return 0;
+}
+
+/* { dg-final { scan-assembler {\.attribute arch, "rv64i2p1[^"]*_zba1p0_zbb1p0} } } */
+/* { dg-final { scan-assembler-not {znosuchext} } } */
+/* { dg-final { scan-assembler-not {xmadeup} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_4.c b/gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_4.c
new file mode 100644
index 00000000000..58bb4aeef9f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_4.c
@@ -0,0 +1,17 @@
+/* A real /proc/cpuinfo from StarFive VisionFive 2.  */
+
+/* { dg-do compile } */
+/* { dg-require-effective-target riscv_native_cpu_detect } */
+/* { dg-require-effective-target rv64 } */
+/* { dg-set-compiler-env-var GCC_CPUINFO "$srcdir/gcc.target/riscv/cpunative/info_2" } */
+/* { dg-set-compiler-env-var GCC_CPUINFO_CPU "2" } */
+/* { dg-additional-options "-march=native -mabi=lp64d -fverbose-asm" } */
+
+int
+main (void)
+{
+  return 0;
+}
+
+/* { dg-final { scan-assembler {\.attribute arch, "rv64i2p1[^"]*_zba1p0_zbb1p0"} } } */
+/* { dg-final { scan-assembler-not {\.attribute arch, "[^"]*_v1p0_} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_5.c b/gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_5.c
new file mode 100644
index 00000000000..656b44f011e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_5.c
@@ -0,0 +1,16 @@
+/* Real /proc/cpuinfo from a Banana Pi BPI-F3.  */
+
+/* { dg-do compile } */
+/* { dg-require-effective-target riscv_native_cpu_detect } */
+/* { dg-require-effective-target rv64 } */
+/* { dg-set-compiler-env-var GCC_CPUINFO "$srcdir/gcc.target/riscv/cpunative/info_3" } */
+/* { dg-set-compiler-env-var GCC_CPUINFO_CPU "0" } */
+/* { dg-additional-options "-march=native -mabi=lp64d -fverbose-asm" } */
+
+int
+main (void)
+{
+  return 0;
+}
+
+/* { dg-final { scan-assembler {\.attribute arch, "rv64i2p1[^"]*_v1p0_[^"]*_zvfh1p0_} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_6.c b/gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_6.c
new file mode 100644
index 00000000000..823fcd79b54
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/cpunative/native_cpu_6.c
@@ -0,0 +1,22 @@
+/* A real /proc/cpuinfo, from a SiFive P870-D.  It is the last of the
+   thirty-two blocks that are asked for here, and the ISA string is the
+   longest and the most recent of any file in this directory, carrying
+   names -- zfbfmin, zvfbfwma, smmpm, ssnpm, svade -- that the others
+   do not.  */
+
+/* { dg-do compile } */
+/* { dg-require-effective-target riscv_native_cpu_detect } */
+/* { dg-require-effective-target rv64 } */
+/* { dg-set-compiler-env-var GCC_CPUINFO "$srcdir/gcc.target/riscv/cpunative/info_4" } */
+/* { dg-set-compiler-env-var GCC_CPUINFO_CPU "31" } */
+/* { dg-additional-options "-march=native -mabi=lp64d -fverbose-asm" } */
+
+int
+main (void)
+{
+  return 0;
+}
+
+/* { dg-final { scan-assembler {\.attribute arch, "rv64i2p1[^"]*_zfbfmin1p0_} } } */
+/* { dg-final { scan-assembler {\.attribute arch, "[^"]*_zvfbfwma1p0_} } } */
+/* { dg-final { scan-assembler {\.attribute arch, "[^"]*_svade1p0_} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/cpunative/riscv-cpunative.exp b/gcc/testsuite/gcc.target/riscv/cpunative/riscv-cpunative.exp
new file mode 100644
index 00000000000..21353ea0593
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/cpunative/riscv-cpunative.exp
@@ -0,0 +1,35 @@
+# Copyright (C) 2026 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# GCC testsuite that uses the `dg.exp' driver.
+
+# Exit immediately if this isn't a RISC-V target.
+if ![istarget riscv*-*-*] then {
+  return
+}
+
+# Load support procs.
+load_lib gcc-dg.exp
+
+# Initialize `dg'.
+dg-init
+
+# Main loop.
+dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cCS\]]] \
+	"" ""
+
+# All done.
+dg-finish
-- 
2.53.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.