[PING,1/3] RISC-V: Add support for Zfbfmin extension

Message ID 20240605013613.78830-2-zengxiao@eswincomputing.com
State New
Headers
Series RISC-V: Add support for Zfbfmin Zvfbfmin and Zvfbfwma extension |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_binutils_build--master-arm success Testing passed
linaro-tcwg-bot/tcwg_binutils_build--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_binutils_check--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_binutils_check--master-arm success Testing passed

Commit Message

Xiao Zeng June 5, 2024, 1:36 a.m. UTC
  This implements the Zfbfmin extension, as of version 1.0.

View detailed information in:
<https://github.com/riscv/riscv-isa-manual/blob/main/src/bfloat16.adoc#zfbfmin---scalar-bf16-converts>

1 The Zfbfmin extension depend on 'F', and the FLH, FSH, FMV.X.H, and
  FMV.H.X instructions as defined in the Zfh extension.

2 The Zfhmin extension includes the following instructions from the Zfh
  extension: FLH, FSH, FMV.X.H, FMV.H.X... View detailed information in:
  <https://github.com/riscv/riscv-isa-manual/blob/main/src/zfh.adoc>

3 Zfhmin extension depend on 'F'.

4 Simply put, just make Zfbfmin dependent on Zfhmin.

Perhaps in the future, we could propose making the FLH, FSH, FMV.X.H, and
FMV.H.X instructions an independent extension to achieve precise dependency
relationships for the Zfbfmin.

5 For relevant information in gcc, please refer to:
  <https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=35224ead63732a3550ba4b1332c06e9dc7999c31>

bfd/ChangeLog:

	* elfxx-riscv.c (riscv_multi_subset_supports): Handle Zfbfmin.
	(riscv_multi_subset_supports_ext): Ditto.

gas/ChangeLog:

	* NEWS: Updated.
	* testsuite/gas/riscv/march-help.l: Ditto.
	* testsuite/gas/riscv/zfbfmin.d: New test.
	* testsuite/gas/riscv/zfbfmin.s: New test.

include/ChangeLog:

	* opcode/riscv-opc.h (MATCH_FCVT_BF16_S): Define.
	(MASK_FCVT_BF16_S): Ditto.
	(MATCH_FCVT_S_BF16): Ditto.
	(MASK_FCVT_S_BF16): Ditto.
	(DECLARE_INSN): New declarations for Zfbfmin.
	* opcode/riscv.h (enum riscv_insn_class): Add INSN_CLASS_ZFBFMIN.

opcodes/ChangeLog:

	* riscv-opc.c: Add Zfbfmin instructions.
---
 bfd/elfxx-riscv.c                    |  6 ++++++
 gas/NEWS                             |  2 ++
 gas/testsuite/gas/riscv/march-help.l |  1 +
 gas/testsuite/gas/riscv/zfbfmin.d    | 11 +++++++++++
 gas/testsuite/gas/riscv/zfbfmin.s    |  6 ++++++
 include/opcode/riscv-opc.h           |  8 ++++++++
 include/opcode/riscv.h               |  1 +
 opcodes/riscv-opc.c                  |  5 +++++
 8 files changed, 40 insertions(+)
 create mode 100644 gas/testsuite/gas/riscv/zfbfmin.d
 create mode 100644 gas/testsuite/gas/riscv/zfbfmin.s
  

Comments

Nelson Chu June 6, 2024, 2:26 a.m. UTC | #1
On Wed, Jun 5, 2024 at 9:30 AM Xiao Zeng <zengxiao@eswincomputing.com>
wrote:

> This implements the Zfbfmin extension, as of version 1.0.
>
> View detailed information in:
> <
> https://github.com/riscv/riscv-isa-manual/blob/main/src/bfloat16.adoc#zfbfmin---scalar-bf16-converts
> >
>
> 1 The Zfbfmin extension depend on 'F', and the FLH, FSH, FMV.X.H, and
>   FMV.H.X instructions as defined in the Zfh extension.
>
> 2 The Zfhmin extension includes the following instructions from the Zfh
>   extension: FLH, FSH, FMV.X.H, FMV.H.X... View detailed information in:
>   <https://github.com/riscv/riscv-isa-manual/blob/main/src/zfh.adoc>
>
> 3 Zfhmin extension depend on 'F'.
>
> 4 Simply put, just make Zfbfmin dependent on Zfhmin.
>
> Perhaps in the future, we could propose making the FLH, FSH, FMV.X.H, and
> FMV.H.X instructions an independent extension to achieve precise dependency
> relationships for the Zfbfmin.
>
> 5 For relevant information in gcc, please refer to:
>   <
> https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=35224ead63732a3550ba4b1332c06e9dc7999c31
> >
>
> bfd/ChangeLog:
>
>         * elfxx-riscv.c (riscv_multi_subset_supports): Handle Zfbfmin.
>         (riscv_multi_subset_supports_ext): Ditto.
>
> gas/ChangeLog:
>
>         * NEWS: Updated.
>         * testsuite/gas/riscv/march-help.l: Ditto.
>         * testsuite/gas/riscv/zfbfmin.d: New test.
>         * testsuite/gas/riscv/zfbfmin.s: New test.
>
> include/ChangeLog:
>
>         * opcode/riscv-opc.h (MATCH_FCVT_BF16_S): Define.
>         (MASK_FCVT_BF16_S): Ditto.
>         (MATCH_FCVT_S_BF16): Ditto.
>         (MASK_FCVT_S_BF16): Ditto.
>         (DECLARE_INSN): New declarations for Zfbfmin.
>         * opcode/riscv.h (enum riscv_insn_class): Add INSN_CLASS_ZFBFMIN.
>
> opcodes/ChangeLog:
>
>         * riscv-opc.c: Add Zfbfmin instructions.
> ---
>  bfd/elfxx-riscv.c                    |  6 ++++++
>  gas/NEWS                             |  2 ++
>  gas/testsuite/gas/riscv/march-help.l |  1 +
>  gas/testsuite/gas/riscv/zfbfmin.d    | 11 +++++++++++
>  gas/testsuite/gas/riscv/zfbfmin.s    |  6 ++++++
>  include/opcode/riscv-opc.h           |  8 ++++++++
>  include/opcode/riscv.h               |  1 +
>  opcodes/riscv-opc.c                  |  5 +++++
>  8 files changed, 40 insertions(+)
>  create mode 100644 gas/testsuite/gas/riscv/zfbfmin.d
>  create mode 100644 gas/testsuite/gas/riscv/zfbfmin.s
>
> diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c
> index dfacb87eda0..d9709a232e6 100644
> --- a/bfd/elfxx-riscv.c
> +++ b/bfd/elfxx-riscv.c
> @@ -1224,6 +1224,7 @@ static struct riscv_implicit_subset
> riscv_implicit_subsets[] =
>    {"zcf", "f",         check_implicit_always},
>    {"zfa", "f",         check_implicit_always},
>    {"d", "f",           check_implicit_always},
> +  {"zfbfmin", "zfhmin",        check_implicit_always},
>    {"zfh", "zfhmin",    check_implicit_always},
>    {"zfhmin", "f",      check_implicit_always},
>    {"f", "zicsr",       check_implicit_always},
> @@ -1360,6 +1361,7 @@ static struct riscv_supported_ext
> riscv_supported_std_z_ext[] =
>    {"zalrsc",           ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
>    {"zawrs",            ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
>    {"zfa",              ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
> +  {"zfbfmin",          ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
>    {"zfh",              ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
>    {"zfhmin",           ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
>    {"zfinx",            ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
> @@ -2561,6 +2563,8 @@ riscv_multi_subset_supports (riscv_parse_subset_t
> *rps,
>      case INSN_CLASS_Q_INX:
>        return (riscv_subset_supports (rps, "q")
>               || riscv_subset_supports (rps, "zqinx"));
> +    case INSN_CLASS_ZFBFMIN:
> +      return riscv_subset_supports (rps, "zfbfmin");
>

Placed before INSN_CLASS_ZFA like the following change?


>      case INSN_CLASS_ZFH_INX:
>        return (riscv_subset_supports (rps, "zfh")
>               || riscv_subset_supports (rps, "zhinx"));
> @@ -2827,6 +2831,8 @@ riscv_multi_subset_supports_ext
> (riscv_parse_subset_t *rps,
>         return "zhinxmin";
>        else
>         return _("zfhmin' and `q', or `zhinxmin' and `zqinx");
> +    case INSN_CLASS_ZFBFMIN:
> +      return "zfbfmin";
>      case INSN_CLASS_ZFA:
>        return "zfa";
>      case INSN_CLASS_D_AND_ZFA:
> diff --git a/gas/NEWS b/gas/NEWS
> index e51c3bbba6d..b88c54fc5c3 100644
> --- a/gas/NEWS
> +++ b/gas/NEWS
> @@ -1,5 +1,7 @@
>  -*- text -*-
>
> +* Add support for RISC-V Zfbfmin extension with version 1.0.
> +
>

Added after "Add support for RISC-V Zcmp extension with version 1.0."


>  * In x86 Intel syntax undue mnemonic suffixes are now warned about.  This
> is
>    a first step towards rejecting their use where unjustified.
>
> diff --git a/gas/testsuite/gas/riscv/march-help.l
> b/gas/testsuite/gas/riscv/march-help.l
> index c5754837e05..9deaa841622 100644
> --- a/gas/testsuite/gas/riscv/march-help.l
> +++ b/gas/testsuite/gas/riscv/march-help.l
> @@ -26,6 +26,7 @@ All available -march extensions for RISC-V:
>         zalrsc                                  1.0
>         zawrs                                   1.0
>         zfa                                     1.0
> +       zfbfmin                                 1.0
>         zfh                                     1.0
>         zfhmin                                  1.0
>         zfinx                                   1.0
> diff --git a/gas/testsuite/gas/riscv/zfbfmin.d
> b/gas/testsuite/gas/riscv/zfbfmin.d
> new file mode 100644
> index 00000000000..7cacc0bd684
> --- /dev/null
> +++ b/gas/testsuite/gas/riscv/zfbfmin.d
> @@ -0,0 +1,11 @@
> +#as: -march=rv64i_zfbfmin
> +#objdump: -d
> +
> +.*:[   ]+file format .*
> +
> +Disassembly of section .text:
> +
> +0+000 <target>:
> +[      ]+[0-9a-f]+:[   ]+4485f553[     ]+fcvt.bf16.s[  ]+fa0,fa1
> +[      ]+[0-9a-f]+:[   ]+44858553[     ]+fcvt.bf16.s[  ]+fa0,fa1,rne
> +[      ]+[0-9a-f]+:[   ]+40658553[     ]+fcvt.s.bf16[  ]+fa0,fa1
> diff --git a/gas/testsuite/gas/riscv/zfbfmin.s
> b/gas/testsuite/gas/riscv/zfbfmin.s
> new file mode 100644
> index 00000000000..c9a9af3e394
> --- /dev/null
> +++ b/gas/testsuite/gas/riscv/zfbfmin.s
> @@ -0,0 +1,6 @@
> +target:
> +       # fcvt.bf16.s
> +       fcvt.bf16.s     fa0, fa1
> +       fcvt.bf16.s     fa0, fa1, rne
> +       # fcvt.s.bf16
> +       fcvt.s.bf16     fa0, fa1
> diff --git a/include/opcode/riscv-opc.h b/include/opcode/riscv-opc.h
> index ae14e14d427..26d60bc585e 100644
> --- a/include/opcode/riscv-opc.h
> +++ b/include/opcode/riscv-opc.h
> @@ -2365,6 +2365,11 @@
>  #define MASK_WRS_NTO 0xffffffff
>  #define MATCH_WRS_STO 0x01d00073
>  #define MASK_WRS_STO 0xffffffff
> +/* Zfbfmin intructions.  */
> +#define MATCH_FCVT_BF16_S 0x44800053
> +#define MASK_FCVT_BF16_S 0xfff0007f
> +#define MATCH_FCVT_S_BF16 0x40600053
> +#define MASK_FCVT_S_BF16 0xfff0007f
>  /* Vendor-specific (CORE-V) Xcvmac instructions.  */
>  #define MATCH_CV_MAC       0x9000302b
>  #define MASK_CV_MAC        0xfe00707f
> @@ -3912,6 +3917,9 @@ DECLARE_INSN(c_ntl_all, MATCH_C_NTL_ALL,
> MASK_C_NTL_ALL)
>  /* Zawrs instructions.  */
>  DECLARE_INSN(wrs_nto, MATCH_WRS_NTO, MASK_WRS_NTO)
>  DECLARE_INSN(wrs_sto, MATCH_WRS_STO, MASK_WRS_STO)
> +/* Zfbfmin instructions.  */
> +DECLARE_INSN(FCVT_BF16_S, MATCH_FCVT_BF16_S, MASK_FCVT_BF16_S)
> +DECLARE_INSN(FCVT_S_BF16, MATCH_FCVT_S_BF16, MASK_FCVT_S_BF16)
>  /* Zvbb/Zvkb instructions.  */
>  DECLARE_INSN(vandn_vv, MATCH_VANDN_VV, MASK_VANDN_VV)
>  DECLARE_INSN(vandn_vx, MATCH_VANDN_VX, MASK_VANDN_VX)
> diff --git a/include/opcode/riscv.h b/include/opcode/riscv.h
> index 5f516a1026e..0e58dbe3d03 100644
> --- a/include/opcode/riscv.h
> +++ b/include/opcode/riscv.h
> @@ -447,6 +447,7 @@ enum riscv_insn_class
>    INSN_CLASS_ZFHMIN_AND_D_INX,
>    INSN_CLASS_ZFHMIN_AND_Q_INX,
>    INSN_CLASS_ZFA,
> +  INSN_CLASS_ZFBFMIN,
>

Likewise, before ZFA


>    INSN_CLASS_D_AND_ZFA,
>    INSN_CLASS_Q_AND_ZFA,
>    INSN_CLASS_ZFH_AND_ZFA,
> diff --git a/opcodes/riscv-opc.c b/opcodes/riscv-opc.c
> index 1ef4eaddf4d..9f99aa6c792 100644
> --- a/opcodes/riscv-opc.c
> +++ b/opcodes/riscv-opc.c
> @@ -1132,6 +1132,11 @@ const struct riscv_opcode riscv_opcodes[] =
>  {"fltq.h",      0, INSN_CLASS_ZFH_AND_ZFA, "d,S,T", MATCH_FLTQ_H,
> MASK_FLTQ_H, match_opcode, 0 },
>  {"fleq.h",      0, INSN_CLASS_ZFH_AND_ZFA, "d,S,T", MATCH_FLEQ_H,
> MASK_FLEQ_H, match_opcode, 0 },
>
> +/* Zfbfmin instructions.  */
> +{"fcvt.bf16.s", 0, INSN_CLASS_ZFBFMIN, "D,S",
>  MATCH_FCVT_BF16_S|MASK_RM, MASK_FCVT_BF16_S|MASK_RM, match_opcode, 0 },
> +{"fcvt.bf16.s", 0, INSN_CLASS_ZFBFMIN, "D,S,m", MATCH_FCVT_BF16_S,
> MASK_FCVT_BF16_S, match_opcode, 0 },
> +{"fcvt.s.bf16", 0, INSN_CLASS_ZFBFMIN, "D,S",   MATCH_FCVT_S_BF16,
> MASK_FCVT_S_BF16|MASK_RM, match_opcode, 0 },
>

1. MATCH_FCVT_S_BF16|MASK_RM, MASK_FCVT_S_BF16, looks like you put it
backwards?
2. The fcvt.s.bf16 with "D,S,m"?
3. Moved between half-precision floating-point instruction subset and
single-precision
floating-point instruction subset?

+
>  /* Zbb or zbkb instructions.  */
>  {"clz",        0, INSN_CLASS_ZBB,  "d,s",   MATCH_CLZ, MASK_CLZ,
> match_opcode, 0 },
>  {"ctz",        0, INSN_CLASS_ZBB,  "d,s",   MATCH_CTZ, MASK_CTZ,
> match_opcode, 0 },
> --
> 2.17.1
>
>
  
Xiao Zeng June 6, 2024, 6:12 a.m. UTC | #2
2024-06-06 10:26  Nelson Chu <nelson@rivosinc.com> wrote:
>
>On Wed, Jun 5, 2024 at 9:30 AM Xiao Zeng <zengxiao@eswincomputing.com>
>wrote:
>
>> This implements the Zfbfmin extension, as of version 1.0.
>>
>> View detailed information in:
>> <
>> https://github.com/riscv/riscv-isa-manual/blob/main/src/bfloat16.adoc#zfbfmin---scalar-bf16-converts
>> >
>>
>> 1 The Zfbfmin extension depend on 'F', and the FLH, FSH, FMV.X.H, and
>>   FMV.H.X instructions as defined in the Zfh extension.
>>
>> 2 The Zfhmin extension includes the following instructions from the Zfh
>>   extension: FLH, FSH, FMV.X.H, FMV.H.X... View detailed information in:
>> <https://github.com/riscv/riscv-isa-manual/blob/main/src/zfh.adoc>
>>
>> 3 Zfhmin extension depend on 'F'.
>>
>> 4 Simply put, just make Zfbfmin dependent on Zfhmin.
>>
>> Perhaps in the future, we could propose making the FLH, FSH, FMV.X.H, and
>> FMV.H.X instructions an independent extension to achieve precise dependency
>> relationships for the Zfbfmin.
>>
>> 5 For relevant information in gcc, please refer to:
>>   <
>> https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=35224ead63732a3550ba4b1332c06e9dc7999c31
>> >
>>
>> bfd/ChangeLog:
>>
>>         * elfxx-riscv.c (riscv_multi_subset_supports): Handle Zfbfmin.
>>         (riscv_multi_subset_supports_ext): Ditto.
>>
>> gas/ChangeLog:
>>
>>         * NEWS: Updated.
>>         * testsuite/gas/riscv/march-help.l: Ditto.
>>         * testsuite/gas/riscv/zfbfmin.d: New test.
>>         * testsuite/gas/riscv/zfbfmin.s: New test.
>>
>> include/ChangeLog:
>>
>>         * opcode/riscv-opc.h (MATCH_FCVT_BF16_S): Define.
>>         (MASK_FCVT_BF16_S): Ditto.
>>         (MATCH_FCVT_S_BF16): Ditto.
>>         (MASK_FCVT_S_BF16): Ditto.
>>         (DECLARE_INSN): New declarations for Zfbfmin.
>>         * opcode/riscv.h (enum riscv_insn_class): Add INSN_CLASS_ZFBFMIN.
>>
>> opcodes/ChangeLog:
>>
>>         * riscv-opc.c: Add Zfbfmin instructions.
>> ---
>>  bfd/elfxx-riscv.c                    |  6 ++++++
>>  gas/NEWS                             |  2 ++
>>  gas/testsuite/gas/riscv/march-help.l |  1 +
>>  gas/testsuite/gas/riscv/zfbfmin.d    | 11 +++++++++++
>>  gas/testsuite/gas/riscv/zfbfmin.s    |  6 ++++++
>>  include/opcode/riscv-opc.h           |  8 ++++++++
>>  include/opcode/riscv.h               |  1 +
>>  opcodes/riscv-opc.c                  |  5 +++++
>>  8 files changed, 40 insertions(+)
>>  create mode 100644 gas/testsuite/gas/riscv/zfbfmin.d
>>  create mode 100644 gas/testsuite/gas/riscv/zfbfmin.s
>>
>> diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c
>> index dfacb87eda0..d9709a232e6 100644
>> --- a/bfd/elfxx-riscv.c
>> +++ b/bfd/elfxx-riscv.c
>> @@ -1224,6 +1224,7 @@ static struct riscv_implicit_subset
>> riscv_implicit_subsets[] =
>>    {"zcf", "f",         check_implicit_always},
>>    {"zfa", "f",         check_implicit_always},
>>    {"d", "f",           check_implicit_always},
>> +  {"zfbfmin", "zfhmin",        check_implicit_always},
>>    {"zfh", "zfhmin",    check_implicit_always},
>>    {"zfhmin", "f",      check_implicit_always},
>>    {"f", "zicsr",       check_implicit_always},
>> @@ -1360,6 +1361,7 @@ static struct riscv_supported_ext
>> riscv_supported_std_z_ext[] =
>>    {"zalrsc",           ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
>>    {"zawrs",            ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
>>    {"zfa",              ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
>> +  {"zfbfmin",          ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
>>    {"zfh",              ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
>>    {"zfhmin",           ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
>>    {"zfinx",            ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
>> @@ -2561,6 +2563,8 @@ riscv_multi_subset_supports (riscv_parse_subset_t
>> *rps,
>>      case INSN_CLASS_Q_INX:
>>        return (riscv_subset_supports (rps, "q")
>>               || riscv_subset_supports (rps, "zqinx"));
>> +    case INSN_CLASS_ZFBFMIN:
>> +      return riscv_subset_supports (rps, "zfbfmin");
>>
>
>Placed before INSN_CLASS_ZFA like the following change? 
Fixed.

>
>
>>      case INSN_CLASS_ZFH_INX:
>>        return (riscv_subset_supports (rps, "zfh")
>>               || riscv_subset_supports (rps, "zhinx"));
>> @@ -2827,6 +2831,8 @@ riscv_multi_subset_supports_ext
>> (riscv_parse_subset_t *rps,
>>         return "zhinxmin";
>>        else
>>         return _("zfhmin' and `q', or `zhinxmin' and `zqinx");
>> +    case INSN_CLASS_ZFBFMIN:
>> +      return "zfbfmin";
>>      case INSN_CLASS_ZFA:
>>        return "zfa";
>>      case INSN_CLASS_D_AND_ZFA:
>> diff --git a/gas/NEWS b/gas/NEWS
>> index e51c3bbba6d..b88c54fc5c3 100644
>> --- a/gas/NEWS
>> +++ b/gas/NEWS
>> @@ -1,5 +1,7 @@
>>  -*- text -*-
>>
>> +* Add support for RISC-V Zfbfmin extension with version 1.0.
>> +
>>
>
>Added after "Add support for RISC-V Zcmp extension with version 1.0." 
Fixed.

>
>
>>  * In x86 Intel syntax undue mnemonic suffixes are now warned about.  This
>> is
>>    a first step towards rejecting their use where unjustified.
>>
>> diff --git a/gas/testsuite/gas/riscv/march-help.l
>> b/gas/testsuite/gas/riscv/march-help.l
>> index c5754837e05..9deaa841622 100644
>> --- a/gas/testsuite/gas/riscv/march-help.l
>> +++ b/gas/testsuite/gas/riscv/march-help.l
>> @@ -26,6 +26,7 @@ All available -march extensions for RISC-V:
>>         zalrsc                                  1.0
>>         zawrs                                   1.0
>>         zfa                                     1.0
>> +       zfbfmin                                 1.0
>>         zfh                                     1.0
>>         zfhmin                                  1.0
>>         zfinx                                   1.0
>> diff --git a/gas/testsuite/gas/riscv/zfbfmin.d
>> b/gas/testsuite/gas/riscv/zfbfmin.d
>> new file mode 100644
>> index 00000000000..7cacc0bd684
>> --- /dev/null
>> +++ b/gas/testsuite/gas/riscv/zfbfmin.d
>> @@ -0,0 +1,11 @@
>> +#as: -march=rv64i_zfbfmin
>> +#objdump: -d
>> +
>> +.*:[   ]+file format .*
>> +
>> +Disassembly of section .text:
>> +
>> +0+000 <target>:
>> +[      ]+[0-9a-f]+:[   ]+4485f553[     ]+fcvt.bf16.s[  ]+fa0,fa1
>> +[      ]+[0-9a-f]+:[   ]+44858553[     ]+fcvt.bf16.s[  ]+fa0,fa1,rne
>> +[      ]+[0-9a-f]+:[   ]+40658553[     ]+fcvt.s.bf16[  ]+fa0,fa1
>> diff --git a/gas/testsuite/gas/riscv/zfbfmin.s
>> b/gas/testsuite/gas/riscv/zfbfmin.s
>> new file mode 100644
>> index 00000000000..c9a9af3e394
>> --- /dev/null
>> +++ b/gas/testsuite/gas/riscv/zfbfmin.s
>> @@ -0,0 +1,6 @@
>> +target:
>> +       # fcvt.bf16.s
>> +       fcvt.bf16.s     fa0, fa1
>> +       fcvt.bf16.s     fa0, fa1, rne
>> +       # fcvt.s.bf16
>> +       fcvt.s.bf16     fa0, fa1
>> diff --git a/include/opcode/riscv-opc.h b/include/opcode/riscv-opc.h
>> index ae14e14d427..26d60bc585e 100644
>> --- a/include/opcode/riscv-opc.h
>> +++ b/include/opcode/riscv-opc.h
>> @@ -2365,6 +2365,11 @@
>>  #define MASK_WRS_NTO 0xffffffff
>>  #define MATCH_WRS_STO 0x01d00073
>>  #define MASK_WRS_STO 0xffffffff
>> +/* Zfbfmin intructions.  */
>> +#define MATCH_FCVT_BF16_S 0x44800053
>> +#define MASK_FCVT_BF16_S 0xfff0007f
>> +#define MATCH_FCVT_S_BF16 0x40600053
>> +#define MASK_FCVT_S_BF16 0xfff0007f
>>  /* Vendor-specific (CORE-V) Xcvmac instructions.  */
>>  #define MATCH_CV_MAC       0x9000302b
>>  #define MASK_CV_MAC        0xfe00707f
>> @@ -3912,6 +3917,9 @@ DECLARE_INSN(c_ntl_all, MATCH_C_NTL_ALL,
>> MASK_C_NTL_ALL)
>>  /* Zawrs instructions.  */
>>  DECLARE_INSN(wrs_nto, MATCH_WRS_NTO, MASK_WRS_NTO)
>>  DECLARE_INSN(wrs_sto, MATCH_WRS_STO, MASK_WRS_STO)
>> +/* Zfbfmin instructions.  */
>> +DECLARE_INSN(FCVT_BF16_S, MATCH_FCVT_BF16_S, MASK_FCVT_BF16_S)
>> +DECLARE_INSN(FCVT_S_BF16, MATCH_FCVT_S_BF16, MASK_FCVT_S_BF16)
>>  /* Zvbb/Zvkb instructions.  */
>>  DECLARE_INSN(vandn_vv, MATCH_VANDN_VV, MASK_VANDN_VV)
>>  DECLARE_INSN(vandn_vx, MATCH_VANDN_VX, MASK_VANDN_VX)
>> diff --git a/include/opcode/riscv.h b/include/opcode/riscv.h
>> index 5f516a1026e..0e58dbe3d03 100644
>> --- a/include/opcode/riscv.h
>> +++ b/include/opcode/riscv.h
>> @@ -447,6 +447,7 @@ enum riscv_insn_class
>>    INSN_CLASS_ZFHMIN_AND_D_INX,
>>    INSN_CLASS_ZFHMIN_AND_Q_INX,
>>    INSN_CLASS_ZFA,
>> +  INSN_CLASS_ZFBFMIN,
>>
>
>Likewise, before ZFA 
Fixed.

>
>
>>    INSN_CLASS_D_AND_ZFA,
>>    INSN_CLASS_Q_AND_ZFA,
>>    INSN_CLASS_ZFH_AND_ZFA,
>> diff --git a/opcodes/riscv-opc.c b/opcodes/riscv-opc.c
>> index 1ef4eaddf4d..9f99aa6c792 100644
>> --- a/opcodes/riscv-opc.c
>> +++ b/opcodes/riscv-opc.c
>> @@ -1132,6 +1132,11 @@ const struct riscv_opcode riscv_opcodes[] =
>>  {"fltq.h",      0, INSN_CLASS_ZFH_AND_ZFA, "d,S,T", MATCH_FLTQ_H,
>> MASK_FLTQ_H, match_opcode, 0 },
>>  {"fleq.h",      0, INSN_CLASS_ZFH_AND_ZFA, "d,S,T", MATCH_FLEQ_H,
>> MASK_FLEQ_H, match_opcode, 0 },
>>
>> +/* Zfbfmin instructions.  */
>> +{"fcvt.bf16.s", 0, INSN_CLASS_ZFBFMIN, "D,S",
>>  MATCH_FCVT_BF16_S|MASK_RM, MASK_FCVT_BF16_S|MASK_RM, match_opcode, 0 },

>> +{"fcvt.bf16.s", 0, INSN_CLASS_ZFBFMIN, "D,S,m", MATCH_FCVT_BF16_S,
>> MASK_FCVT_BF16_S, match_opcode, 0 }, 

>> +{"fcvt.s.bf16", 0, INSN_CLASS_ZFBFMIN, "D,S",   MATCH_FCVT_S_BF16,
>> MASK_FCVT_S_BF16|MASK_RM, match_opcode, 0 },
>>
>
>1. MATCH_FCVT_S_BF16|MASK_RM, MASK_FCVT_S_BF16, looks like you put it
>backwards? 
Do you seem to have read it backwards? Of course, it could also be my problem.
If there is any further information, please feel free to ping me at any time.

fcvt.bf16.s(single-precision -> bf16 ) is similar to fcvt.h.s(single-precision -> hf16 ):
-------------------------------------------------------------------------------------------------------------------------------------------
{"fcvt.h.s",   0, INSN_CLASS_ZFHMIN_INX, "D,S",     MATCH_FCVT_H_S|MASK_RM, MASK_FCVT_H_S|MASK_RM, match_opcode, 0 },
{"fcvt.h.s",   0, INSN_CLASS_ZFHMIN_INX, "D,S,m",   MATCH_FCVT_H_S, MASK_FCVT_H_S, match_opcode, 0 },

{"fcvt.bf16.s", 0, INSN_CLASS_ZFBFMIN, "D,S",   MATCH_FCVT_BF16_S|MASK_RM, MASK_FCVT_BF16_S|MASK_RM, match_opcode, 0 }, 
{"fcvt.bf16.s", 0, INSN_CLASS_ZFBFMIN, "D,S,m", MATCH_FCVT_BF16_S, MASK_FCVT_BF16_S, match_opcode, 0 }, 
-------------------------------------------------------------------------------------------------------------------------------------------


>2. The fcvt.s.bf16 with "D,S,m"?
fcvt.s.bf16(bf16 -> single-precision) is similar to fcvt.s.h(hf16 -> single-precision):
-------------------------------------------------------------------------------------------------------------------------------------------
{"fcvt.s.h",      0, INSN_CLASS_ZFHMIN_INX, "D,S",     MATCH_FCVT_S_H,     MASK_FCVT_S_H|MASK_RM,       match_opcode, 0 },
{"fcvt.s.bf16", 0, INSN_CLASS_ZFBFMIN,       "D,S",    MATCH_FCVT_S_BF16, MASK_FCVT_S_BF16|MASK_RM, match_opcode, 0 },
-------------------------------------------------------------------------------------------------------------------------------------------

>3. Moved between half-precision floating-point instruction subset and
>single-precision
>floating-point instruction subset? 
Fixed.

>
>+
>>  /* Zbb or zbkb instructions.  */
>>  {"clz",        0, INSN_CLASS_ZBB,  "d,s",   MATCH_CLZ, MASK_CLZ,
>> match_opcode, 0 },
>>  {"ctz",        0, INSN_CLASS_ZBB,  "d,s",   MATCH_CTZ, MASK_CTZ,
>> match_opcode, 0 },
>> --
>> 2.17.1
>>
>>
Thanks
Xiao Zeng
  
Nelson Chu June 6, 2024, 8:08 a.m. UTC | #3
On Thu, Jun 6, 2024 at 2:12 PM Xiao Zeng <zengxiao@eswincomputing.com>
wrote:

> 2024-06-06 10:26  Nelson Chu <nelson@rivosinc.com> wrote:
> >1. MATCH_FCVT_S_BF16|MASK_RM, MASK_FCVT_S_BF16, looks like you put it
> >backwards?
> Do you seem to have read it backwards? Of course, it could also be my
> problem.
> If there is any further information, please feel free to ping me at any
> time.
>
> fcvt.bf16.s(single-precision -> bf16 ) is similar to
> fcvt.h.s(single-precision -> hf16 ):
>
> -------------------------------------------------------------------------------------------------------------------------------------------
> {"fcvt.h.s",   0, INSN_CLASS_ZFHMIN_INX, "D,S",
> MATCH_FCVT_H_S|MASK_RM, MASK_FCVT_H_S|MASK_RM, match_opcode, 0 },
> {"fcvt.h.s",   0, INSN_CLASS_ZFHMIN_INX, "D,S,m",   MATCH_FCVT_H_S,
> MASK_FCVT_H_S, match_opcode, 0 },
>
> {"fcvt.bf16.s", 0, INSN_CLASS_ZFBFMIN, "D,S",   MATCH_FCVT_BF16_S|MASK_RM,
> MASK_FCVT_BF16_S|MASK_RM, match_opcode, 0 },
> {"fcvt.bf16.s", 0, INSN_CLASS_ZFBFMIN, "D,S,m", MATCH_FCVT_BF16_S,
> MASK_FCVT_BF16_S, match_opcode, 0 },
>
> -------------------------------------------------------------------------------------------------------------------------------------------
>

I am saying the fcvt.s.bf16, not fcvt.bf16.s.  I thought it should be
 {"fcvt.s.bf16", 0, INSN_CLASS_ZFBFMIN,       "D,S",
 MATCH_FCVT_S_BF16|MASK_RM, MASK_FCVT_S_BF16|MASK_RM, match_opcode, 0 },
Since the spec still reserve rm operand,
https://github.com/riscv/riscv-bfloat16/blob/main/doc/insns/fcvt_S_BF16.adoc

But in fact you are right, I just remember that half to single/double
precision, single to double precision don't need to care about the rounding
mode, so your patch is right, I am confused and forgot this at first.


> >2. The fcvt.s.bf16 with "D,S,m"?
> fcvt.s.bf16(bf16 -> single-precision) is similar to fcvt.s.h(hf16 ->
> single-precision):
>
> -------------------------------------------------------------------------------------------------------------------------------------------
> {"fcvt.s.h",      0, INSN_CLASS_ZFHMIN_INX, "D,S",     MATCH_FCVT_S_H,
> MASK_FCVT_S_H|MASK_RM,       match_opcode, 0 },
> {"fcvt.s.bf16", 0, INSN_CLASS_ZFBFMIN,       "D,S",    MATCH_FCVT_S_BF16,
> MASK_FCVT_S_BF16|MASK_RM, match_opcode, 0 },
>
> -------------------------------------------------------------------------------------------------------------------------------------------
>

Forgot what I left in the previous comment, you are right.

Please send the fixed three patches again if you have time, so I can commit
them.

Thanks
Nelson
  

Patch

diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c
index dfacb87eda0..d9709a232e6 100644
--- a/bfd/elfxx-riscv.c
+++ b/bfd/elfxx-riscv.c
@@ -1224,6 +1224,7 @@  static struct riscv_implicit_subset riscv_implicit_subsets[] =
   {"zcf", "f",		check_implicit_always},
   {"zfa", "f",		check_implicit_always},
   {"d", "f",		check_implicit_always},
+  {"zfbfmin", "zfhmin",	check_implicit_always},
   {"zfh", "zfhmin",	check_implicit_always},
   {"zfhmin", "f",	check_implicit_always},
   {"f", "zicsr",	check_implicit_always},
@@ -1360,6 +1361,7 @@  static struct riscv_supported_ext riscv_supported_std_z_ext[] =
   {"zalrsc",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
   {"zawrs",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
   {"zfa",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
+  {"zfbfmin",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
   {"zfh",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
   {"zfhmin",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
   {"zfinx",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
@@ -2561,6 +2563,8 @@  riscv_multi_subset_supports (riscv_parse_subset_t *rps,
     case INSN_CLASS_Q_INX:
       return (riscv_subset_supports (rps, "q")
 	      || riscv_subset_supports (rps, "zqinx"));
+    case INSN_CLASS_ZFBFMIN:
+      return riscv_subset_supports (rps, "zfbfmin");
     case INSN_CLASS_ZFH_INX:
       return (riscv_subset_supports (rps, "zfh")
 	      || riscv_subset_supports (rps, "zhinx"));
@@ -2827,6 +2831,8 @@  riscv_multi_subset_supports_ext (riscv_parse_subset_t *rps,
 	return "zhinxmin";
       else
 	return _("zfhmin' and `q', or `zhinxmin' and `zqinx");
+    case INSN_CLASS_ZFBFMIN:
+      return "zfbfmin";
     case INSN_CLASS_ZFA:
       return "zfa";
     case INSN_CLASS_D_AND_ZFA:
diff --git a/gas/NEWS b/gas/NEWS
index e51c3bbba6d..b88c54fc5c3 100644
--- a/gas/NEWS
+++ b/gas/NEWS
@@ -1,5 +1,7 @@ 
 -*- text -*-
 
+* Add support for RISC-V Zfbfmin extension with version 1.0.
+
 * In x86 Intel syntax undue mnemonic suffixes are now warned about.  This is
   a first step towards rejecting their use where unjustified.
 
diff --git a/gas/testsuite/gas/riscv/march-help.l b/gas/testsuite/gas/riscv/march-help.l
index c5754837e05..9deaa841622 100644
--- a/gas/testsuite/gas/riscv/march-help.l
+++ b/gas/testsuite/gas/riscv/march-help.l
@@ -26,6 +26,7 @@  All available -march extensions for RISC-V:
 	zalrsc                                  1.0
 	zawrs                                   1.0
 	zfa                                     1.0
+	zfbfmin                                 1.0
 	zfh                                     1.0
 	zfhmin                                  1.0
 	zfinx                                   1.0
diff --git a/gas/testsuite/gas/riscv/zfbfmin.d b/gas/testsuite/gas/riscv/zfbfmin.d
new file mode 100644
index 00000000000..7cacc0bd684
--- /dev/null
+++ b/gas/testsuite/gas/riscv/zfbfmin.d
@@ -0,0 +1,11 @@ 
+#as: -march=rv64i_zfbfmin
+#objdump: -d
+
+.*:[ 	]+file format .*
+
+Disassembly of section .text:
+
+0+000 <target>:
+[ 	]+[0-9a-f]+:[ 	]+4485f553[ 	]+fcvt.bf16.s[ 	]+fa0,fa1
+[ 	]+[0-9a-f]+:[ 	]+44858553[ 	]+fcvt.bf16.s[ 	]+fa0,fa1,rne
+[ 	]+[0-9a-f]+:[ 	]+40658553[ 	]+fcvt.s.bf16[ 	]+fa0,fa1
diff --git a/gas/testsuite/gas/riscv/zfbfmin.s b/gas/testsuite/gas/riscv/zfbfmin.s
new file mode 100644
index 00000000000..c9a9af3e394
--- /dev/null
+++ b/gas/testsuite/gas/riscv/zfbfmin.s
@@ -0,0 +1,6 @@ 
+target:
+	# fcvt.bf16.s
+	fcvt.bf16.s	fa0, fa1
+	fcvt.bf16.s	fa0, fa1, rne
+	# fcvt.s.bf16
+	fcvt.s.bf16	fa0, fa1
diff --git a/include/opcode/riscv-opc.h b/include/opcode/riscv-opc.h
index ae14e14d427..26d60bc585e 100644
--- a/include/opcode/riscv-opc.h
+++ b/include/opcode/riscv-opc.h
@@ -2365,6 +2365,11 @@ 
 #define MASK_WRS_NTO 0xffffffff
 #define MATCH_WRS_STO 0x01d00073
 #define MASK_WRS_STO 0xffffffff
+/* Zfbfmin intructions.  */
+#define MATCH_FCVT_BF16_S 0x44800053
+#define MASK_FCVT_BF16_S 0xfff0007f
+#define MATCH_FCVT_S_BF16 0x40600053
+#define MASK_FCVT_S_BF16 0xfff0007f
 /* Vendor-specific (CORE-V) Xcvmac instructions.  */
 #define MATCH_CV_MAC       0x9000302b
 #define MASK_CV_MAC        0xfe00707f
@@ -3912,6 +3917,9 @@  DECLARE_INSN(c_ntl_all, MATCH_C_NTL_ALL, MASK_C_NTL_ALL)
 /* Zawrs instructions.  */
 DECLARE_INSN(wrs_nto, MATCH_WRS_NTO, MASK_WRS_NTO)
 DECLARE_INSN(wrs_sto, MATCH_WRS_STO, MASK_WRS_STO)
+/* Zfbfmin instructions.  */
+DECLARE_INSN(FCVT_BF16_S, MATCH_FCVT_BF16_S, MASK_FCVT_BF16_S)
+DECLARE_INSN(FCVT_S_BF16, MATCH_FCVT_S_BF16, MASK_FCVT_S_BF16)
 /* Zvbb/Zvkb instructions.  */
 DECLARE_INSN(vandn_vv, MATCH_VANDN_VV, MASK_VANDN_VV)
 DECLARE_INSN(vandn_vx, MATCH_VANDN_VX, MASK_VANDN_VX)
diff --git a/include/opcode/riscv.h b/include/opcode/riscv.h
index 5f516a1026e..0e58dbe3d03 100644
--- a/include/opcode/riscv.h
+++ b/include/opcode/riscv.h
@@ -447,6 +447,7 @@  enum riscv_insn_class
   INSN_CLASS_ZFHMIN_AND_D_INX,
   INSN_CLASS_ZFHMIN_AND_Q_INX,
   INSN_CLASS_ZFA,
+  INSN_CLASS_ZFBFMIN,
   INSN_CLASS_D_AND_ZFA,
   INSN_CLASS_Q_AND_ZFA,
   INSN_CLASS_ZFH_AND_ZFA,
diff --git a/opcodes/riscv-opc.c b/opcodes/riscv-opc.c
index 1ef4eaddf4d..9f99aa6c792 100644
--- a/opcodes/riscv-opc.c
+++ b/opcodes/riscv-opc.c
@@ -1132,6 +1132,11 @@  const struct riscv_opcode riscv_opcodes[] =
 {"fltq.h",      0, INSN_CLASS_ZFH_AND_ZFA, "d,S,T", MATCH_FLTQ_H, MASK_FLTQ_H, match_opcode, 0 },
 {"fleq.h",      0, INSN_CLASS_ZFH_AND_ZFA, "d,S,T", MATCH_FLEQ_H, MASK_FLEQ_H, match_opcode, 0 },
 
+/* Zfbfmin instructions.  */
+{"fcvt.bf16.s", 0, INSN_CLASS_ZFBFMIN, "D,S",   MATCH_FCVT_BF16_S|MASK_RM, MASK_FCVT_BF16_S|MASK_RM, match_opcode, 0 },
+{"fcvt.bf16.s", 0, INSN_CLASS_ZFBFMIN, "D,S,m", MATCH_FCVT_BF16_S, MASK_FCVT_BF16_S, match_opcode, 0 },
+{"fcvt.s.bf16", 0, INSN_CLASS_ZFBFMIN, "D,S",   MATCH_FCVT_S_BF16, MASK_FCVT_S_BF16|MASK_RM, match_opcode, 0 },
+
 /* Zbb or zbkb instructions.  */
 {"clz",        0, INSN_CLASS_ZBB,  "d,s",   MATCH_CLZ, MASK_CLZ, match_opcode, 0 },
 {"ctz",        0, INSN_CLASS_ZBB,  "d,s",   MATCH_CTZ, MASK_CTZ, match_opcode, 0 },