https://gcc.gnu.org/g:e71bc0f8d7f93cff7129a867bc12b75048b1fab2

commit r17-2012-ge71bc0f8d7f93cff7129a867bc12b75048b1fab2
Author: Mark Zhuang <[email protected]>
Date:   Tue Jun 30 07:21:20 2026 -0600

    [PATCH] RISC-V: Add basic Spacemit-A100 core support
    
    Add the Spacemit-A100 processor to -mcpu/-mtune.
    The A100 is an in-order, dual-issue core whose microarchitecture
    is close to the X60, so for now it reuses the Spacemit X60 costs.
    On the ISA side, the A100 is closest to the X100. The main differences
    are that it does not implement the H (hypervisor) extension, its
    vector length is VLEN=1024 (zvl1024b), and it has the xsmtvdotii extension.
    
    gcc/ChangeLog:
    
            * config/riscv/riscv-ext-spacemit.def (xsmtvdotii): New extension.
            * config/riscv/riscv-ext.opt: Regenerate.
            * config/riscv/riscv-cores.def (RISCV_TUNE): Add spacemit-a100.
            (RISCV_CORE): Add spacemit-a100.
            * doc/riscv-ext.texi: Regenerate.
            * doc/riscv-mcpu.texi: Regenerate.
            * doc/riscv-mtune.texi: Regenerate.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.target/riscv/mcpu-spacemit-a100.c: New test.
    
    Signed-off-by: Mark Zhuang <[email protected]>

Diff:
---
 gcc/config/riscv/riscv-cores.def                   |  7 ++
 gcc/config/riscv/riscv-ext-spacemit.def            | 13 ++++
 gcc/config/riscv/riscv-ext.opt                     |  3 +
 gcc/doc/riscv-ext.texi                             |  4 ++
 gcc/doc/riscv-mcpu.texi                            |  4 +-
 gcc/doc/riscv-mtune.texi                           |  2 +
 .../gcc.target/riscv/mcpu-spacemit-a100.c          | 80 ++++++++++++++++++++++
 7 files changed, 112 insertions(+), 1 deletion(-)

diff --git a/gcc/config/riscv/riscv-cores.def b/gcc/config/riscv/riscv-cores.def
index 6ed9dad8be23..57c8e76b2bd2 100644
--- a/gcc/config/riscv/riscv-cores.def
+++ b/gcc/config/riscv/riscv-cores.def
@@ -53,6 +53,7 @@ RISCV_TUNE("xiangshan-nanhu", xiangshan, 
xiangshan_nanhu_tune_info)
 RISCV_TUNE("xiangshan-kunminghu", xiangshan, generic_ooo_tune_info)
 RISCV_TUNE("spacemit-x60", spacemit_x60, spacemit_x60_tune_info)
 RISCV_TUNE("spacemit-x100", generic_ooo, spacemit_x100_tune_info)
+RISCV_TUNE("spacemit-a100", spacemit_x60, spacemit_x60_tune_info)
 RISCV_TUNE("arc-v-rhx-100-series", arcv_rhx100, arcv_rhx100_tune_info)
 RISCV_TUNE("generic-ooo", generic_ooo, generic_ooo_tune_info)
 RISCV_TUNE("size", generic, optimize_size_tune_info)
@@ -227,5 +228,11 @@ RISCV_CORE("spacemit-x100",   
"rva23s64_smepmp_smnpm_smstateen_sspm_zbc_zbkc_"
                              "zvksc_zvksg_zvl256b_xsmtvdot",
                              "spacemit-x100")
 
+RISCV_CORE("spacemit-a100",   "rva23u64_zfh_zbc_zbkc_zfbfmin_smepmp_smnpm_"
+                             
"smstateen_sscofpmf_ssnpm_sspm_ssstateen_sstc_svinval_"
+                             
"svnapot_svpbmt_zifencei_zvfh_zvfbfwma_zvkng_zvknha_"
+                             "zvknc_zvksc_zvksg_zvl1024b_xsmtvdotii",
+                             "spacemit-a100")
+
 #undef RISCV_CORE
 #undef RISCV_CORE_ALIAS
diff --git a/gcc/config/riscv/riscv-ext-spacemit.def 
b/gcc/config/riscv/riscv-ext-spacemit.def
index e9ba547d7450..681c2c156c89 100644
--- a/gcc/config/riscv/riscv-ext-spacemit.def
+++ b/gcc/config/riscv/riscv-ext-spacemit.def
@@ -34,3 +34,16 @@ DEFINE_RISCV_EXT(
   /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
   /* EXTRA_EXTENSION_FLAGS */ 0)
 
+DEFINE_RISCV_EXT(
+  /* NAME */ xsmtvdotii,
+  /* UPPERCASE_NAME */ XSMTVDOTII,
+  /* FULL_NAME */ "SpacemiT vector dot product II extension",
+  /* DESC */ "",
+  /* URL */ 
"https://github.com/spacemit-com/docs-ai/blob/main/en/architecture/ime_extension.md";,
+  /* DEP_EXTS */ ({"xsmtvdot"}),
+  /* SUPPORTED_VERSIONS */ ({{1, 0}}),
+  /* FLAG_GROUP */ xsmt,
+  /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
+  /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
+  /* EXTRA_EXTENSION_FLAGS */ 0)
+
diff --git a/gcc/config/riscv/riscv-ext.opt b/gcc/config/riscv/riscv-ext.opt
index 875a8626a648..843b95fc35be 100644
--- a/gcc/config/riscv/riscv-ext.opt
+++ b/gcc/config/riscv/riscv-ext.opt
@@ -480,3 +480,6 @@ Mask(XANDESVPACKFPH) Var(riscv_xandes_subext)
 Mask(XANDESVDOT) Var(riscv_xandes_subext)
 
 Mask(XSMTVDOT) Var(riscv_xsmt_subext)
+
+Mask(XSMTVDOTII) Var(riscv_xsmt_subext)
+
diff --git a/gcc/doc/riscv-ext.texi b/gcc/doc/riscv-ext.texi
index 43c836fa77bd..41614790ab82 100644
--- a/gcc/doc/riscv-ext.texi
+++ b/gcc/doc/riscv-ext.texi
@@ -762,4 +762,8 @@
 @tab 1.0
 @tab SpacemiT vector dot product extension
 
+@item @samp{xsmtvdotii}
+@tab 1.0
+@tab SpacemiT vector dot product II extension
+
 @end multitable
diff --git a/gcc/doc/riscv-mcpu.texi b/gcc/doc/riscv-mcpu.texi
index 9ccb265c3662..6e3c2adc2fb7 100644
--- a/gcc/doc/riscv-mcpu.texi
+++ b/gcc/doc/riscv-mcpu.texi
@@ -98,4 +98,6 @@ by particular CPU name.  Permissible values for this option 
are:
 
 @samp{spacemit-x60},
 
-@samp{spacemit-x100}.
+@samp{spacemit-x100},
+
+@samp{spacemit-a100}.
diff --git a/gcc/doc/riscv-mtune.texi b/gcc/doc/riscv-mtune.texi
index d40ba7f7f15c..101d81d3709f 100644
--- a/gcc/doc/riscv-mtune.texi
+++ b/gcc/doc/riscv-mtune.texi
@@ -56,6 +56,8 @@ particular CPU name.  Permissible values for this option are:
 
 @samp{spacemit-x100},
 
+@samp{spacemit-a100},
+
 @samp{arc-v-rhx-100-series},
 
 @samp{generic-ooo},
diff --git a/gcc/testsuite/gcc.target/riscv/mcpu-spacemit-a100.c 
b/gcc/testsuite/gcc.target/riscv/mcpu-spacemit-a100.c
new file mode 100644
index 000000000000..6aada02c3eab
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/mcpu-spacemit-a100.c
@@ -0,0 +1,80 @@
+/* { dg-do compile } */
+/* { dg-skip-if "-march given" { *-*-* } { "-march=*" } } */
+/* { dg-options "-mcpu=spacemit-a100" { target { rv64 } } } */
+/* Spacemit A100 => rva23u64_zfh_zbc_zbkc_zfbfmin_smepmp_smnpm_smstateen_
+ * sscofpmf_ssnpm_sspm_ssstateen_sstc_svinval_svnapot_svpbmt_zifencei_zvfh_
+ * zvfbfwma_zvkng_zvknha_zvknc_zvksc_zvksg_zvl1024b_xsmtvdotii
+ */
+
+#if !((__riscv_xlen == 64)             \
+      && !defined(__riscv_32e)         \
+      && !defined(__riscv_h)           \
+      && defined(__riscv_mul)          \
+      && defined(__riscv_atomic)       \
+      && (__riscv_flen == 64)          \
+      && defined(__riscv_compressed)   \
+      && defined(__riscv_v)            \
+      && defined(__riscv_zic64b)       \
+      && defined(__riscv_zba)          \
+      && defined(__riscv_zbb)          \
+      && defined(__riscv_zbc)          \
+      && defined(__riscv_zbs)          \
+      && defined(__riscv_zfh)          \
+      && defined(__riscv_zfhmin)       \
+      && defined(__riscv_ziccamoa)     \
+      && defined(__riscv_ziccif)       \
+      && defined(__riscv_zicclsm)      \
+      && defined(__riscv_ziccrse)      \
+      && defined(__riscv_zicsr)                \
+      && defined(__riscv_zifencei)     \
+      && defined(__riscv_zihintntl)    \
+      && defined(__riscv_svpbmt)       \
+      && defined(__riscv_smepmp)       \
+      && defined(__riscv_sstc)         \
+      && defined(__riscv_sscofpmf)     \
+      && defined(__riscv_zicond)       \
+      && defined(__riscv_zicboz)       \
+      && defined(__riscv_zicbom)       \
+      && defined(__riscv_zicbop)       \
+      && defined(__riscv_zicntr)       \
+      && defined(__riscv_zihpm)                \
+      && defined(__riscv_za64rs)       \
+      && defined(__riscv_zkt)          \
+      && defined(__riscv_svinval)      \
+      && defined(__riscv_svnapot)      \
+      && defined(__riscv_zihintpause)  \
+      && defined(__riscv_zbkc)         \
+      && defined(__riscv_zvfh)         \
+      && defined(__riscv_zvfhmin)      \
+      && defined(__riscv_zvl1024b)     \
+      && defined(__riscv_zfa)          \
+      && defined(__riscv_zca)          \
+      && defined(__riscv_zcb)          \
+      && defined(__riscv_zcd)          \
+      && defined(__riscv_zvbb)         \
+      && defined(__riscv_zvkng)                \
+      && defined(__riscv_zvknha)       \
+      && defined(__riscv_smstateen)    \
+      && defined(__riscv_ssstateen)    \
+      && defined(__riscv_zfbfmin)      \
+      && defined(__riscv_zvfbfmin)     \
+      && defined(__riscv_zvfbfwma)     \
+      && defined(__riscv_zimop)                \
+      && defined(__riscv_zcmop)                \
+      && defined(__riscv_smnpm)                \
+      && defined(__riscv_ssnpm)                \
+      && defined(__riscv_sspm)         \
+      && defined(__riscv_zawrs)                \
+      && defined(__riscv_zvbc)         \
+      && defined(__riscv_zvknc)                \
+      && defined(__riscv_zvksc)                \
+      && defined(__riscv_zvksg)                \
+      && defined(__riscv_supm)         \
+      && defined(__riscv_xsmtvdotii))
+#error "unexpected arch"
+#endif
+
+int main()
+{
+  return 0;
+}

Reply via email to