[PATCH 4/5] RISC-V: Relax `fmv.[sdq]' requirements

Palmer Dabbelt palmer@rivosinc.com
Tue Feb 8 02:00:52 GMT 2022


On Tue, 01 Feb 2022 05:49:05 PST (-0800), binutils@sourceware.org wrote:
> This commit relaxes requirements to `fmv.s' instructions from F to (F or
> Zfinx).  The same applies to `fmv.d' and `fmv.q'.
>
> gas/ChangeLog:
>
> 	* testsuite/gas/riscv/zfinx.s: Add `fmv.s' instruction.
> 	* testsuite/gas/riscv/zfinx.d: Likewise.
> 	* testsuite/gas/riscv/zdinx.s: Add `fmv.d' instruction.
> 	* testsuite/gas/riscv/zdinx.d: Likewise.
> 	* testsuite/gas/riscv/zqinx.d: Add `fmv.q' instruction.
> 	* testsuite/gas/riscv/zqinx.s: Likewise.
>
> opcodes/ChangeLog:
>
> 	* riscv-opc.c (riscv_opcodes): Relax requirements to
> 	`fmv.[sdq]' instructions to support those in Zfinx/Zdinx/Zqinx.
> ---
>  gas/testsuite/gas/riscv/zdinx.d | 1 +
>  gas/testsuite/gas/riscv/zdinx.s | 1 +
>  gas/testsuite/gas/riscv/zfinx.d | 1 +
>  gas/testsuite/gas/riscv/zfinx.s | 1 +
>  gas/testsuite/gas/riscv/zqinx.d | 1 +
>  gas/testsuite/gas/riscv/zqinx.s | 1 +
>  opcodes/riscv-opc.c             | 6 +++---
>  7 files changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/gas/testsuite/gas/riscv/zdinx.d b/gas/testsuite/gas/riscv/zdinx.d
> index cb465bfbef4..3db2cb56f1a 100644
> --- a/gas/testsuite/gas/riscv/zdinx.d
> +++ b/gas/testsuite/gas/riscv/zdinx.d
> @@ -36,6 +36,7 @@ Disassembly of section .text:
>  [ 	]+[0-9a-f]+:[ 	]+a2c58553[ 	]+fle.d[ 	]+a0,a1,a2
>  [ 	]+[0-9a-f]+:[ 	]+a2b61553[ 	]+flt.d[ 	]+a0,a2,a1
>  [ 	]+[0-9a-f]+:[ 	]+a2b60553[ 	]+fle.d[ 	]+a0,a2,a1
> +[ 	]+[0-9a-f]+:[ 	]+22b58553[ 	]+fmv.d[ 	]+a0,a1
>  [ 	]+[0-9a-f]+:[ 	]+22b59553[ 	]+fneg.d[ 	]+a0,a1
>  [ 	]+[0-9a-f]+:[ 	]+22b5a553[ 	]+fabs.d[ 	]+a0,a1
>  [ 	]+[0-9a-f]+:[ 	]+e2059553[ 	]+fclass.d[ 	]+a0,a1
> diff --git a/gas/testsuite/gas/riscv/zdinx.s b/gas/testsuite/gas/riscv/zdinx.s
> index f44358111de..cdf5f3c2e7e 100644
> --- a/gas/testsuite/gas/riscv/zdinx.s
> +++ b/gas/testsuite/gas/riscv/zdinx.s
> @@ -28,6 +28,7 @@ target:
>  	fle.d	a0, a1, a2
>  	fgt.d	a0, a1, a2
>  	fge.d	a0, a1, a2
> +	fmv.d	a0, a1
>  	fneg.d	a0, a1
>  	fabs.d	a0, a1
>  	fclass.d	a0, a1
> diff --git a/gas/testsuite/gas/riscv/zfinx.d b/gas/testsuite/gas/riscv/zfinx.d
> index 6465c08ea9a..6fc4491fbc0 100644
> --- a/gas/testsuite/gas/riscv/zfinx.d
> +++ b/gas/testsuite/gas/riscv/zfinx.d
> @@ -34,6 +34,7 @@ Disassembly of section .text:
>  [ 	]+[0-9a-f]+:[ 	]+a0c58553[ 	]+fle.s[ 	]+a0,a1,a2
>  [ 	]+[0-9a-f]+:[ 	]+a0b61553[ 	]+flt.s[ 	]+a0,a2,a1
>  [ 	]+[0-9a-f]+:[ 	]+a0b60553[ 	]+fle.s[ 	]+a0,a2,a1
> +[ 	]+[0-9a-f]+:[ 	]+20b58553[ 	]+fmv.s[ 	]+a0,a1
>  [ 	]+[0-9a-f]+:[ 	]+20b59553[ 	]+fneg.s[ 	]+a0,a1
>  [ 	]+[0-9a-f]+:[ 	]+20b5a553[ 	]+fabs.s[ 	]+a0,a1
>  [ 	]+[0-9a-f]+:[ 	]+e0059553[ 	]+fclass.s[ 	]+a0,a1
> diff --git a/gas/testsuite/gas/riscv/zfinx.s b/gas/testsuite/gas/riscv/zfinx.s
> index 41ae0e38ad4..d63c0c37570 100644
> --- a/gas/testsuite/gas/riscv/zfinx.s
> +++ b/gas/testsuite/gas/riscv/zfinx.s
> @@ -26,6 +26,7 @@ target:
>  	fle.s	a0, a1, a2
>  	fgt.s	a0, a1, a2
>  	fge.s	a0, a1, a2
> +	fmv.s	a0, a1
>  	fneg.s	a0, a1
>  	fabs.s	a0, a1
>  	fclass.s	a0, a1
> diff --git a/gas/testsuite/gas/riscv/zqinx.d b/gas/testsuite/gas/riscv/zqinx.d
> index e8d2b7ba4c5..c704241bc90 100644
> --- a/gas/testsuite/gas/riscv/zqinx.d
> +++ b/gas/testsuite/gas/riscv/zqinx.d
> @@ -38,6 +38,7 @@ Disassembly of section .text:
>  [ 	]+[0-9a-f]+:[ 	]+a6c58553[ 	]+fle.q[ 	]+a0,a1,a2
>  [ 	]+[0-9a-f]+:[ 	]+a6b61553[ 	]+flt.q[ 	]+a0,a2,a1
>  [ 	]+[0-9a-f]+:[ 	]+a6b60553[ 	]+fle.q[ 	]+a0,a2,a1
> +[ 	]+[0-9a-f]+:[ 	]+26b58553[ 	]+fmv.q[ 	]+a0,a1
>  [ 	]+[0-9a-f]+:[ 	]+26b59553[ 	]+fneg.q[ 	]+a0,a1
>  [ 	]+[0-9a-f]+:[ 	]+26b5a553[ 	]+fabs.q[ 	]+a0,a1
>  [ 	]+[0-9a-f]+:[ 	]+e6059553[ 	]+fclass.q[ 	]+a0,a1
> diff --git a/gas/testsuite/gas/riscv/zqinx.s b/gas/testsuite/gas/riscv/zqinx.s
> index ecfa509b98c..02147b1919c 100644
> --- a/gas/testsuite/gas/riscv/zqinx.s
> +++ b/gas/testsuite/gas/riscv/zqinx.s
> @@ -30,6 +30,7 @@ target:
>  	fle.q	a0, a1, a2
>  	fgt.q	a0, a1, a2
>  	fge.q	a0, a1, a2
> +	fmv.q	a0, a1
>  	fneg.q	a0, a1
>  	fabs.q	a0, a1
>  	fclass.q	a0, a1

Looking at the ISA manual, I'm not actually seeing Zqinx defined.  
Specifically

    \begin{commentary}
    In the future, an RV64Zqinx quad-precision extension could be defined analogously
    to RV32Zdinx.
    An RV32Zqinx extension could also be defined but would require
    quad-register groups.
    \end{commentary}

Looks like it was removed from the ISA manual here

    9025a7f Remove Zqinx (for now, at least)

I must have missed that when reviewing the patches last time, but not 
entirely sure what to do as we're about to release it.  None of that 
shouldn't block this patch set, though.

> diff --git a/opcodes/riscv-opc.c b/opcodes/riscv-opc.c
> index 2da0f7cf0a4..991d4d7a0aa 100644
> --- a/opcodes/riscv-opc.c
> +++ b/opcodes/riscv-opc.c
> @@ -598,7 +598,7 @@ const struct riscv_opcode riscv_opcodes[] =
>  {"fmv.w.x",    0, INSN_CLASS_F,   "D,s",       MATCH_FMV_S_X, MASK_FMV_S_X, match_opcode, 0 },
>  {"fmv.x.s",    0, INSN_CLASS_F,   "d,S",       MATCH_FMV_X_S, MASK_FMV_X_S, match_opcode, 0 },
>  {"fmv.s.x",    0, INSN_CLASS_F,   "D,s",       MATCH_FMV_S_X, MASK_FMV_S_X, match_opcode, 0 },
> -{"fmv.s",      0, INSN_CLASS_F,   "D,U",       MATCH_FSGNJ_S, MASK_FSGNJ_S, match_rs1_eq_rs2, INSN_ALIAS },
> +{"fmv.s",      0, INSN_CLASS_F_OR_ZFINX,   "D,U",       MATCH_FSGNJ_S, MASK_FSGNJ_S, match_rs1_eq_rs2, INSN_ALIAS },
>  {"fneg.s",     0, INSN_CLASS_F_OR_ZFINX,   "D,U",       MATCH_FSGNJN_S, MASK_FSGNJN_S, match_rs1_eq_rs2, INSN_ALIAS },
>  {"fabs.s",     0, INSN_CLASS_F_OR_ZFINX,   "D,U",       MATCH_FSGNJX_S, MASK_FSGNJX_S, match_rs1_eq_rs2, INSN_ALIAS },
>  {"fsgnj.s",    0, INSN_CLASS_F_OR_ZFINX,   "D,S,T",     MATCH_FSGNJ_S, MASK_FSGNJ_S, match_opcode, 0 },
> @@ -656,7 +656,7 @@ const struct riscv_opcode riscv_opcodes[] =
>  {"fsd",        0, INSN_CLASS_D_AND_C, "CD,Cl(Cs)", MATCH_C_FSD, MASK_C_FSD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE },
>  {"fsd",        0, INSN_CLASS_D,   "T,q(s)",    MATCH_FSD, MASK_FSD, match_opcode, INSN_DREF|INSN_8_BYTE },
>  {"fsd",        0, INSN_CLASS_D,   "T,A,s",     0, (int) M_FSD, match_never, INSN_MACRO },
> -{"fmv.d",      0, INSN_CLASS_D,   "D,U",       MATCH_FSGNJ_D, MASK_FSGNJ_D, match_rs1_eq_rs2, INSN_ALIAS },
> +{"fmv.d",      0, INSN_CLASS_D_OR_ZDINX,   "D,U",       MATCH_FSGNJ_D, MASK_FSGNJ_D, match_rs1_eq_rs2, INSN_ALIAS },
>  {"fneg.d",     0, INSN_CLASS_D_OR_ZDINX,   "D,U",       MATCH_FSGNJN_D, MASK_FSGNJN_D, match_rs1_eq_rs2, INSN_ALIAS },
>  {"fabs.d",     0, INSN_CLASS_D_OR_ZDINX,   "D,U",       MATCH_FSGNJX_D, MASK_FSGNJX_D, match_rs1_eq_rs2, INSN_ALIAS },
>  {"fsgnj.d",    0, INSN_CLASS_D_OR_ZDINX,   "D,S,T",     MATCH_FSGNJ_D, MASK_FSGNJ_D, match_opcode, 0 },
> @@ -713,7 +713,7 @@ const struct riscv_opcode riscv_opcodes[] =
>  {"flq",        0, INSN_CLASS_Q,   "D,A,s",     0, (int) M_FLQ, match_never, INSN_MACRO },
>  {"fsq",        0, INSN_CLASS_Q,   "T,q(s)",    MATCH_FSQ, MASK_FSQ, match_opcode, INSN_DREF|INSN_16_BYTE },
>  {"fsq",        0, INSN_CLASS_Q,   "T,A,s",     0, (int) M_FSQ, match_never, INSN_MACRO },
> -{"fmv.q",      0, INSN_CLASS_Q,   "D,U",       MATCH_FSGNJ_Q, MASK_FSGNJ_Q, match_rs1_eq_rs2, INSN_ALIAS },
> +{"fmv.q",      0, INSN_CLASS_Q_OR_ZQINX,   "D,U",       MATCH_FSGNJ_Q, MASK_FSGNJ_Q, match_rs1_eq_rs2, INSN_ALIAS },
>  {"fneg.q",     0, INSN_CLASS_Q_OR_ZQINX,   "D,U",       MATCH_FSGNJN_Q, MASK_FSGNJN_Q, match_rs1_eq_rs2, INSN_ALIAS },
>  {"fabs.q",     0, INSN_CLASS_Q_OR_ZQINX,   "D,U",       MATCH_FSGNJX_Q, MASK_FSGNJX_Q, match_rs1_eq_rs2, INSN_ALIAS },
>  {"fsgnj.q",    0, INSN_CLASS_Q_OR_ZQINX,   "D,S,T",     MATCH_FSGNJ_Q, MASK_FSGNJ_Q, match_opcode, 0 },

Presumably whomever wrote this assumed these were flavors of move, but 
the ISA manual is pretty clear that they're not

    Note, FSGNJ.S {\em rx, ry, ry} moves {\em ry} to {\em rx} (assembler 
    pseudoinstruction FMV.S {\em rx, ry});

Thus they're in Zfinx, as they're not explicitly omitted.

Reviewed-by: Palmer Dabbelt <palmer@rivosinc.com>

Thanks!


More information about the Binutils mailing list