Hi Jeff,

> Just a nit.  In several places you need to replace
> "UPPERCAE_NAME" with "UPPERCASE_NAME".

Fixed. Thanks for your review.

This is a patch series for Andes vender extension of RISC-V.
These patches are tested by riscv-gnu-toolchain gcc/g++ testsuite. And the
report is the same as without these patches.
               ========= Summary of gcc testsuite =========
                            | # of unexpected case / # of unique unexpected
case
                            |          gcc |          g++ |     gfortran |
     rv64gc/  lp64d/ medlow |   26 /    13 |   14 /     6 |      - |

This patch add basic support for the following XAndes ISA extensions:

XANDESPERF
XANDESBFHCVT
XANDESVBFHCVT
XANDESVSINTLOAD
XANDESVPACKFPH
XANDESVDOT

gcc/ChangeLog:

        * config/riscv/riscv-ext.def: Include riscv-ext-andes.def.
        * config/riscv/riscv-ext.opt (riscv_xandes_subext): New variable.
        (XANDESPERF) : New mask.
        (XANDESBFHCVT): Ditto.
        (XANDESVBFHCVT): Ditto.
        (XANDESVSINTLOAD): Ditto.
        (XANDESVPACKFPH): Ditto.
        (XANDESVDOT): Ditto.
        * config/riscv/t-riscv: Add riscv-ext-andes.def.
        * doc/riscv-ext.texi: Regenerated.
        * config/riscv/riscv-ext-andes.def: New file.

gcc/testsuite/ChangeLog:

        * gcc.target/riscv/xandes-predef-1.c: New test.
        * gcc.target/riscv/xandes-predef-2.c: New test.
        * gcc.target/riscv/xandes-predef-3.c: New test.
        * gcc.target/riscv/xandes-predef-4.c: New test.
        * gcc.target/riscv/xandes-predef-5.c: New test.
        * gcc.target/riscv/xandes-predef-6.c: New test.
From 8643c4f10187b7ddd166bde3626330467146ac5c Mon Sep 17 00:00:00 2001
From: Kuan-Lin Chen <rufus@andestech.com>
Date: Mon, 31 Mar 2025 15:27:41 +0800
Subject: [PATCH 1/7] RISC-V: Add basic XAndes vendor extension support.

This patch add basic support for the following XAndes ISA extensions:

XANDESPERF
XANDESBFHCVT
XANDESVBFHCVT
XANDESVSINTLOAD
XANDESVPACKFPH
XANDESVDOT

gcc/ChangeLog:

	* config/riscv/riscv-ext.def: Include riscv-ext-andes.def.
	* config/riscv/riscv-ext.opt (riscv_xandes_subext): New variable.
	(XANDESPERF) : New mask.
	(XANDESBFHCVT): Ditto.
	(XANDESVBFHCVT): Ditto.
	(XANDESVSINTLOAD): Ditto.
	(XANDESVPACKFPH): Ditto.
	(XANDESVDOT): Ditto.
	* config/riscv/t-riscv: Add riscv-ext-andes.def.
	* doc/riscv-ext.texi: Regenerated.
	* config/riscv/riscv-ext-andes.def: New file.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/xandes-predef-1.c: New test.
	* gcc.target/riscv/xandes-predef-2.c: New test.
	* gcc.target/riscv/xandes-predef-3.c: New test.
	* gcc.target/riscv/xandes-predef-4.c: New test.
	* gcc.target/riscv/xandes-predef-5.c: New test.
	* gcc.target/riscv/xandes-predef-6.c: New test.

Co-author: Lino Hsing-Yu Peng (linopeng@andestech.com),
	   Kai Kai-Yi Weng (kaiweng@andestech.com).
---
 gcc/config/riscv/riscv-ext-andes.def          | 100 ++++++++++++++++++
 gcc/config/riscv/riscv-ext.def                |   1 +
 gcc/config/riscv/riscv-ext.opt                |  15 +++
 gcc/config/riscv/t-riscv                      |   3 +-
 gcc/doc/riscv-ext.texi                        |  24 +++++
 .../gcc.target/riscv/xandes-predef-1.c        |  14 +++
 .../gcc.target/riscv/xandes-predef-2.c        |  14 +++
 .../gcc.target/riscv/xandes-predef-3.c        |  14 +++
 .../gcc.target/riscv/xandes-predef-4.c        |  14 +++
 .../gcc.target/riscv/xandes-predef-5.c        |  14 +++
 .../gcc.target/riscv/xandes-predef-6.c        |  14 +++
 11 files changed, 226 insertions(+), 1 deletion(-)
 create mode 100644 gcc/config/riscv/riscv-ext-andes.def
 create mode 100644 gcc/testsuite/gcc.target/riscv/xandes-predef-1.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/xandes-predef-2.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/xandes-predef-3.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/xandes-predef-4.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/xandes-predef-5.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/xandes-predef-6.c

diff --git a/gcc/config/riscv/riscv-ext-andes.def b/gcc/config/riscv/riscv-ext-andes.def
new file mode 100644
index 000000000000..4226e3ed86fe
--- /dev/null
+++ b/gcc/config/riscv/riscv-ext-andes.def
@@ -0,0 +1,100 @@
+/* Andes extension definition file for RISC-V.
+   Copyright (C) 2025 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC 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, or (at your option)
+any later version.
+
+GCC 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/>.
+
+Please run `make riscv-regen` in build folder to make sure updated anything.
+
+Format of DEFINE_RISCV_EXT, please refer to riscv-ext.def.  */
+
+DEFINE_RISCV_EXT(
+  /* NAME */ xandesperf,
+  /* UPPERCASE_NAME */ XANDESPERF,
+  /* FULL_NAME */ "Andes performace extension",
+  /* DESC */ "",
+  /* URL */ ,
+  /* DEP_EXTS */ ({}),
+  /* SUPPORTED_VERSIONS */ ({{5, 0}}),
+  /* FLAG_GROUP */ xandes,
+  /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
+  /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
+  /* EXTRA_EXTENSION_FLAGS */ 0)
+
+DEFINE_RISCV_EXT(
+  /* NAME */ xandesbfhcvt,
+  /* UPPERCASE_NAME */ XANDESBFHCVT,
+  /* FULL_NAME */ "Andes bfloat16 conversion extension",
+  /* DESC */ "",
+  /* URL */ ,
+  /* DEP_EXTS */ ({}),
+  /* SUPPORTED_VERSIONS */ ({{5, 0}}),
+  /* FLAG_GROUP */ xandes,
+  /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
+  /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
+  /* EXTRA_EXTENSION_FLAGS */ 0)
+
+DEFINE_RISCV_EXT(
+  /* NAME */ xandesvbfhcvt,
+  /* UPPERCASE_NAME */ XANDESVBFHCVT,
+  /* FULL_NAME */ "Andes vector bfloat16 conversion extension",
+  /* DESC */ "",
+  /* URL */ ,
+  /* DEP_EXTS */ ({}),
+  /* SUPPORTED_VERSIONS */ ({{5, 0}}),
+  /* FLAG_GROUP */ xandes,
+  /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
+  /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
+  /* EXTRA_EXTENSION_FLAGS */ 0)
+
+DEFINE_RISCV_EXT(
+  /* NAME */ xandesvsintload,
+  /* UPPERCASE_NAME */ XANDESVSINTLOAD,
+  /* FULL_NAME */ "Andes vector INT4 load extension",
+  /* DESC */ "",
+  /* URL */ ,
+  /* DEP_EXTS */ ({}),
+  /* SUPPORTED_VERSIONS */ ({{5, 0}}),
+  /* FLAG_GROUP */ xandes,
+  /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
+  /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
+  /* EXTRA_EXTENSION_FLAGS */ 0)
+
+DEFINE_RISCV_EXT(
+  /* NAME */ xandesvpackfph,
+  /* UPPERCASE_NAME */ XANDESVPACKFPH,
+  /* FULL_NAME */ "Andes vector packed FP16 extension",
+  /* DESC */ "",
+  /* URL */ ,
+  /* DEP_EXTS */ ({}),
+  /* SUPPORTED_VERSIONS */ ({{5, 0}}),
+  /* FLAG_GROUP */ xandes,
+  /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
+  /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
+  /* EXTRA_EXTENSION_FLAGS */ 0)
+
+DEFINE_RISCV_EXT(
+  /* NAME */ xandesvdot,
+  /* UPPERCASE_NAME */ XANDESVDOT,
+  /* FULL_NAME */ "Andes vector dot product extension",
+  /* DESC */ "",
+  /* URL */ ,
+  /* DEP_EXTS */ ({}),
+  /* SUPPORTED_VERSIONS */ ({{5, 0}}),
+  /* FLAG_GROUP */ xandes,
+  /* 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.def b/gcc/config/riscv/riscv-ext.def
index 816acaa34f4a..92cc07a0752a 100644
--- a/gcc/config/riscv/riscv-ext.def
+++ b/gcc/config/riscv/riscv-ext.def
@@ -2082,3 +2082,4 @@ DEFINE_RISCV_EXT(
 #include "riscv-ext-sifive.def"
 #include "riscv-ext-thead.def"
 #include "riscv-ext-ventana.def"
+#include "riscv-ext-andes.def"
diff --git a/gcc/config/riscv/riscv-ext.opt b/gcc/config/riscv/riscv-ext.opt
index 9f8c5451d497..01d480d3b6a7 100644
--- a/gcc/config/riscv/riscv-ext.opt
+++ b/gcc/config/riscv/riscv-ext.opt
@@ -43,6 +43,9 @@ int riscv_su_subext
 TargetVariable
 int riscv_sv_subext
 
+TargetVariable
+int riscv_xandes_subext
+
 TargetVariable
 int riscv_xcv_subext
 
@@ -397,6 +400,18 @@ Mask(SVADE) Var(riscv_sv_subext)
 
 Mask(SVBARE) Var(riscv_sv_subext)
 
+Mask(XANDESPERF) Var(riscv_xandes_subext)
+
+Mask(XANDESBFHCVT) Var(riscv_xandes_subext)
+
+Mask(XANDESVBFHCVT) Var(riscv_xandes_subext)
+
+Mask(XANDESVSINTLOAD) Var(riscv_xandes_subext)
+
+Mask(XANDESVPACKFPH) Var(riscv_xandes_subext)
+
+Mask(XANDESVDOT) Var(riscv_xandes_subext)
+
 Mask(XCVALU) Var(riscv_xcv_subext)
 
 Mask(XCVBI) Var(riscv_xcv_subext)
diff --git a/gcc/config/riscv/t-riscv b/gcc/config/riscv/t-riscv
index 32092d856878..0309c84e81d4 100644
--- a/gcc/config/riscv/t-riscv
+++ b/gcc/config/riscv/t-riscv
@@ -194,7 +194,8 @@ RISCV_EXT_DEFS = \
   $(srcdir)/config/riscv/riscv-ext.def \
   $(srcdir)/config/riscv/riscv-ext-sifive.def \
   $(srcdir)/config/riscv/riscv-ext-thead.def \
-  $(srcdir)/config/riscv/riscv-ext-ventana.def
+  $(srcdir)/config/riscv/riscv-ext-ventana.def \
+  $(srcdir)/config/riscv/riscv-ext-andes.def
 
 $(srcdir)/config/riscv/riscv-ext.opt: $(RISCV_EXT_DEFS)
 
diff --git a/gcc/doc/riscv-ext.texi b/gcc/doc/riscv-ext.texi
index c3ed1bfb5936..4cd879d48491 100644
--- a/gcc/doc/riscv-ext.texi
+++ b/gcc/doc/riscv-ext.texi
@@ -714,4 +714,28 @@
 @tab 1.0
 @tab Ventana integer conditional operations extension
 
+@item xandesperf
+@tab 5.0
+@tab Andes performace extension
+
+@item xandesbfhcvt
+@tab 5.0
+@tab Andes bfloat16 conversion extension
+
+@item xandesvbfhcvt
+@tab 5.0
+@tab Andes vector bfloat16 conversion extension
+
+@item xandesvsintload
+@tab 5.0
+@tab Andes vector INT4 load extension
+
+@item xandesvpackfph
+@tab 5.0
+@tab Andes vector packed FP16 extension
+
+@item xandesvdot
+@tab 5.0
+@tab Andes vector dot product extension
+
 @end multitable
diff --git a/gcc/testsuite/gcc.target/riscv/xandes-predef-1.c b/gcc/testsuite/gcc.target/riscv/xandes-predef-1.c
new file mode 100644
index 000000000000..24391312fa47
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/xandes-predef-1.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64g_xandesperf -mabi=lp64" } */
+
+int main () {
+#if !defined(__riscv)
+#error "__riscv"
+#endif
+
+#if !defined(__riscv_xandesperf)
+#error "__riscv_xandesperf"
+#endif
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/riscv/xandes-predef-2.c b/gcc/testsuite/gcc.target/riscv/xandes-predef-2.c
new file mode 100644
index 000000000000..0e2e2d6260c8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/xandes-predef-2.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64g_xandesbfhcvt -mabi=lp64" } */
+
+int main () {
+#if !defined(__riscv)
+#error "__riscv"
+#endif
+
+#if !defined(__riscv_xandesbfhcvt)
+#error "__riscv_xandesbfhcvt"
+#endif
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/riscv/xandes-predef-3.c b/gcc/testsuite/gcc.target/riscv/xandes-predef-3.c
new file mode 100644
index 000000000000..62f4c286b4bf
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/xandes-predef-3.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64g_xandesvbfhcvt -mabi=lp64" } */
+
+int main () {
+#if !defined(__riscv)
+#error "__riscv"
+#endif
+
+#if !defined(__riscv_xandesvbfhcvt)
+#error "__riscv_xandesvbfhcvt"
+#endif
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/riscv/xandes-predef-4.c b/gcc/testsuite/gcc.target/riscv/xandes-predef-4.c
new file mode 100644
index 000000000000..3074b5a2a9b3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/xandes-predef-4.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64g_xandesvsintload -mabi=lp64" } */
+
+int main () {
+#if !defined(__riscv)
+#error "__riscv"
+#endif
+
+#if !defined(__riscv_xandesvsintload)
+#error "__riscv_xandesvsintload"
+#endif
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/riscv/xandes-predef-5.c b/gcc/testsuite/gcc.target/riscv/xandes-predef-5.c
new file mode 100644
index 000000000000..de5fe31373a9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/xandes-predef-5.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64g_xandesvpackfph -mabi=lp64" } */
+
+int main () {
+#if !defined(__riscv)
+#error "__riscv"
+#endif
+
+#if !defined(__riscv_xandesvpackfph)
+#error "__riscv_xandesvpackfph"
+#endif
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/riscv/xandes-predef-6.c b/gcc/testsuite/gcc.target/riscv/xandes-predef-6.c
new file mode 100644
index 000000000000..728d54106c78
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/xandes-predef-6.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64g_xandesvdot -mabi=lp64" } */
+
+int main () {
+#if !defined(__riscv)
+#error "__riscv"
+#endif
+
+#if !defined(__riscv_xandesvdot)
+#error "__riscv_xandesvdot"
+#endif
+
+  return 0;
+}
-- 
2.34.1

Reply via email to