This patch add zvfbfa and zvfofp8min intrinsic[1]. To enable GCC to recognize and process zvfbfa and zvfofp8min extensions correctly at compile time.
[1]https://github.com/aswaterman/riscv-misc/blob/e515758c24504cf3c16145bc763a76c59425ed1b/isa/zvfbfa.adoc gcc/ChangeLog: * common/config/riscv/riscv-common.cc: New intrinsic. * config/riscv/riscv-vector-builtins.cc (validate_instance_type_required_extensions): Add required_ext checking for 'zvfbfa' and 'zvfofp8min'. * config/riscv/riscv-vector-builtins.h (RVV_REQUIRE_ELEN_OFP_8): New bit value for OFP8. (enum required_ext): Add required_ext declaration for 'zvfbfa' and 'zvfofp8min'. (required_ext_to_isa_name): Ditto. (required_extensions_specified): Ditto. (struct function_group_info): Add match case for 'zvfbfa' and 'zvfofp8min'. * config/riscv/riscv.opt: New mask for 'zvfbfa' and 'zvfofp8min'. gcc/testsuite/ChangeLog: * gcc.target/riscv/arch-45.c: New test. * gcc.target/riscv/arch-46.c: New test. --- gcc/common/config/riscv/riscv-common.cc | 9 +++++++++ gcc/config/riscv/riscv-vector-builtins.cc | 20 ++++++++++++++++++++ gcc/config/riscv/riscv-vector-builtins.h | 15 +++++++++++++++ gcc/config/riscv/riscv.opt | 6 ++++++ gcc/testsuite/gcc.target/riscv/arch-45.c | 5 +++++ gcc/testsuite/gcc.target/riscv/arch-46.c | 5 +++++ 6 files changed, 60 insertions(+) create mode 100644 gcc/testsuite/gcc.target/riscv/arch-45.c create mode 100644 gcc/testsuite/gcc.target/riscv/arch-46.c diff --git a/gcc/common/config/riscv/riscv-common.cc b/gcc/common/config/riscv/riscv-common.cc index b34409adf39c..7aaa9d92455b 100644 --- a/gcc/common/config/riscv/riscv-common.cc +++ b/gcc/common/config/riscv/riscv-common.cc @@ -193,12 +193,15 @@ static const riscv_implied_info_t riscv_implied_info[] = {"zfa", "f"}, + {"zvfbfa", "zve32f"}, + {"zvfbfa", "zfbfmin"}, {"zvfbfmin", "zve32f"}, {"zvfbfwma", "zvfbfmin"}, {"zvfbfwma", "zfbfmin"}, {"zvfhmin", "zve32f"}, {"zvfh", "zve32f"}, {"zvfh", "zfhmin"}, + {"zvfofp8min", "zve32f"}, {"zhinx", "zhinxmin"}, {"zhinxmin", "zfinx"}, @@ -383,10 +386,12 @@ static const struct riscv_ext_version riscv_ext_version_table[] = {"zfbfmin", ISA_SPEC_CLASS_NONE, 1, 0}, {"zfh", ISA_SPEC_CLASS_NONE, 1, 0}, {"zfhmin", ISA_SPEC_CLASS_NONE, 1, 0}, + {"zvfbfa", ISA_SPEC_CLASS_NONE, 0, 1}, {"zvfbfmin", ISA_SPEC_CLASS_NONE, 1, 0}, {"zvfbfwma", ISA_SPEC_CLASS_NONE, 1, 0}, {"zvfhmin", ISA_SPEC_CLASS_NONE, 1, 0}, {"zvfh", ISA_SPEC_CLASS_NONE, 1, 0}, + {"zvfofp8min",ISA_SPEC_CLASS_NONE, 0, 2}, {"zfa", ISA_SPEC_CLASS_NONE, 1, 0}, @@ -1676,10 +1681,12 @@ static const riscv_ext_flag_table_t riscv_ext_flag_table[] = RISCV_EXT_FLAG_ENTRY ("zve64x", x_riscv_vector_elen_flags, MASK_VECTOR_ELEN_64), RISCV_EXT_FLAG_ENTRY ("zve64f", x_riscv_vector_elen_flags, MASK_VECTOR_ELEN_FP_32), RISCV_EXT_FLAG_ENTRY ("zve64d", x_riscv_vector_elen_flags, MASK_VECTOR_ELEN_FP_64), + RISCV_EXT_FLAG_ENTRY ("zvfbfa", x_riscv_vector_elen_flags, MASK_VECTOR_ELEN_BF_16), RISCV_EXT_FLAG_ENTRY ("zvfbfmin", x_riscv_vector_elen_flags, MASK_VECTOR_ELEN_BF_16), RISCV_EXT_FLAG_ENTRY ("zvfbfwma", x_riscv_vector_elen_flags, MASK_VECTOR_ELEN_BF_16), RISCV_EXT_FLAG_ENTRY ("zvfhmin", x_riscv_vector_elen_flags, MASK_VECTOR_ELEN_FP_16), RISCV_EXT_FLAG_ENTRY ("zvfh", x_riscv_vector_elen_flags, MASK_VECTOR_ELEN_FP_16), + RISCV_EXT_FLAG_ENTRY ("zvfofp8min", x_riscv_vector_elen_flags, MASK_VECTOR_ELEN_OFP_8), RISCV_EXT_FLAG_ENTRY ("zvbb", x_riscv_zvb_subext, MASK_ZVBB), RISCV_EXT_FLAG_ENTRY ("zvbc", x_riscv_zvb_subext, MASK_ZVBC), @@ -1714,10 +1721,12 @@ static const riscv_ext_flag_table_t riscv_ext_flag_table[] = RISCV_EXT_FLAG_ENTRY ("zfbfmin", x_riscv_zf_subext, MASK_ZFBFMIN), RISCV_EXT_FLAG_ENTRY ("zfhmin", x_riscv_zf_subext, MASK_ZFHMIN), RISCV_EXT_FLAG_ENTRY ("zfh", x_riscv_zf_subext, MASK_ZFH), + RISCV_EXT_FLAG_ENTRY ("zvfbfa", x_riscv_zf_subext, MASK_ZVFBFA), RISCV_EXT_FLAG_ENTRY ("zvfbfmin", x_riscv_zf_subext, MASK_ZVFBFMIN), RISCV_EXT_FLAG_ENTRY ("zvfbfwma", x_riscv_zf_subext, MASK_ZVFBFWMA), RISCV_EXT_FLAG_ENTRY ("zvfhmin", x_riscv_zf_subext, MASK_ZVFHMIN), RISCV_EXT_FLAG_ENTRY ("zvfh", x_riscv_zf_subext, MASK_ZVFH), + RISCV_EXT_FLAG_ENTRY ("zvfofp8min", x_riscv_zf_subext, MASK_ZVFOFP8MIN), RISCV_EXT_FLAG_ENTRY ("zfa", x_riscv_zfa_subext, MASK_ZFA), diff --git a/gcc/config/riscv/riscv-vector-builtins.cc b/gcc/config/riscv/riscv-vector-builtins.cc index 61dcdabbb403..290b342abc56 100644 --- a/gcc/config/riscv/riscv-vector-builtins.cc +++ b/gcc/config/riscv/riscv-vector-builtins.cc @@ -4915,6 +4915,26 @@ validate_instance_type_required_extensions (const rvv_type_info type, { uint64_t exts = type.required_extensions; + if ((exts & RVV_REQUIRE_ELEN_BF_16) + && !TARGET_VECTOR_ELEN_BF_16_P (riscv_vector_elen_flags)) + { + error_at (EXPR_LOCATION (exp), + "built-in function %qE requires the " + "zvfbfa ISA extension", + exp); + return false; + } + + if ((exts & RVV_REQUIRE_ELEN_OFP_8) + && !TARGET_VECTOR_ELEN_OFP_8_P (riscv_vector_elen_flags)) + { + error_at (EXPR_LOCATION (exp), + "built-in function %qE requires the " + "zvfofp8min ISA extension", + exp); + return false; + } + if ((exts & RVV_REQUIRE_ELEN_BF_16) && !TARGET_VECTOR_ELEN_BF_16_P (riscv_vector_elen_flags)) { diff --git a/gcc/config/riscv/riscv-vector-builtins.h b/gcc/config/riscv/riscv-vector-builtins.h index 42ba90577079..f3ca912bf725 100644 --- a/gcc/config/riscv/riscv-vector-builtins.h +++ b/gcc/config/riscv/riscv-vector-builtins.h @@ -110,6 +110,7 @@ static const unsigned int CP_WRITE_CSR = 1U << 5; #define RVV_REQUIRE_MIN_VLEN_64 (1 << 5) /* Require TARGET_MIN_VLEN >= 64. */ #define RVV_REQUIRE_ELEN_FP_16 (1 << 6) /* Require FP ELEN >= 32. */ #define RVV_REQUIRE_ELEN_BF_16 (1 << 7) /* Require BF16. */ +#define RVV_REQUIRE_ELEN_OFP_8 (1 << 8) /* Require OFP8. */ /* Enumerates the required extensions. */ enum required_ext @@ -125,8 +126,10 @@ enum required_ext ZVKSED_EXT, /* Crypto vector Zvksed sub-ext */ ZVKSH_EXT, /* Crypto vector Zvksh sub-ext */ XTHEADVECTOR_EXT, /* XTheadVector extension */ + ZVFBFA_EXT, /* Zvfbfa extension */ ZVFBFMIN_EXT, /* Zvfbfmin extension */ ZVFBFWMA_EXT, /* Zvfbfwma extension */ + ZVFOFP8MIN_EXT, /* Zvfofp8min extension */ XSFVQMACCQOQ_EXT, /* XSFVQMACCQOQ extension */ XSFVQMACCDOD_EXT, /* XSFVQMACCDOD extension */ XSFVFNRCLIPXFQF_EXT, /* XSFVFNRCLIPXFQF extension */ @@ -159,10 +162,14 @@ static inline const char * required_ext_to_isa_name (enum required_ext required) return "zvksh"; case XTHEADVECTOR_EXT: return "xtheadvector"; + case ZVFBFA_EXT: + return "zvfbfa"; case ZVFBFMIN_EXT: return "zvfbfmin"; case ZVFBFWMA_EXT: return "zvfbfwma"; + case ZVFOFP8MIN_EXT: + return "zvfofp8min"; case XSFVQMACCQOQ_EXT: return "xsfvqmaccqoq"; case XSFVQMACCDOD_EXT: @@ -202,10 +209,14 @@ static inline bool required_extensions_specified (enum required_ext required) return TARGET_ZVKSH; case XTHEADVECTOR_EXT: return TARGET_XTHEADVECTOR; + case ZVFBFA_EXT: + return TARGET_ZVFBFA; case ZVFBFMIN_EXT: return TARGET_ZVFBFMIN; case ZVFBFWMA_EXT: return TARGET_ZVFBFWMA; + case ZVFOFP8MIN_EXT: + return TARGET_ZVFOFP8MIN; case XSFVQMACCQOQ_EXT: return TARGET_XSFVQMACCQOQ; case XSFVQMACCDOD_EXT: @@ -349,10 +360,14 @@ struct function_group_info return TARGET_ZVKSH; case XTHEADVECTOR_EXT: return TARGET_XTHEADVECTOR; + case ZVFBFA_EXT: + return TARGET_ZVFBFA; case ZVFBFMIN_EXT: return TARGET_ZVFBFMIN; case ZVFBFWMA_EXT: return TARGET_ZVFBFWMA; + case ZVFOFP8MIN_EXT: + return TARGET_ZVFOFP8MIN; case XSFVQMACCQOQ_EXT: return TARGET_XSFVQMACCQOQ; case XSFVQMACCDOD_EXT: diff --git a/gcc/config/riscv/riscv.opt b/gcc/config/riscv/riscv.opt index 7515c8ea13dd..800c0776f357 100644 --- a/gcc/config/riscv/riscv.opt +++ b/gcc/config/riscv/riscv.opt @@ -334,6 +334,8 @@ Mask(VECTOR_ELEN_FP_16) Var(riscv_vector_elen_flags) Mask(VECTOR_ELEN_BF_16) Var(riscv_vector_elen_flags) +Mask(VECTOR_ELEN_OFP_8) Var(riscv_vector_elen_flags) + TargetVariable int riscv_zvl_flags @@ -426,6 +428,8 @@ Mask(ZFHMIN) Var(riscv_zf_subext) Mask(ZFH) Var(riscv_zf_subext) +Mask(ZVFBFA) Var(riscv_zf_subext) + Mask(ZVFBFMIN) Var(riscv_zf_subext) Mask(ZVFBFWMA) Var(riscv_zf_subext) @@ -434,6 +438,8 @@ Mask(ZVFHMIN) Var(riscv_zf_subext) Mask(ZVFH) Var(riscv_zf_subext) +Mask(ZVFOFP8MIN) Var(riscv_zf_subext) + TargetVariable int riscv_zfa_subext diff --git a/gcc/testsuite/gcc.target/riscv/arch-45.c b/gcc/testsuite/gcc.target/riscv/arch-45.c new file mode 100644 index 000000000000..e7f3d35ba332 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/arch-45.c @@ -0,0 +1,5 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gc_zvfbfa -mabi=lp64" } */ +int foo() +{ +} diff --git a/gcc/testsuite/gcc.target/riscv/arch-46.c b/gcc/testsuite/gcc.target/riscv/arch-46.c new file mode 100644 index 000000000000..797b2af011ba --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/arch-46.c @@ -0,0 +1,5 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gc_zvfofp8min -mabi=lp64" } */ +int foo() +{ +} -- 2.43.0