Re: [PATCH] target/riscv: reject FMV.X.W and FMV.W.X with Zfinx

Daniel Henrique Barboza <[email protected]>
Newsgroups org.nongnu.qemu-riscv,org.nongnu.qemu-devel
Message-ID <[email protected]>
Hi,

Seems like this has been fixed by this patch that is currently on the
queue for merge:

[PULL v2 87/96] target/riscv: reject FMV.X.W/FMV.W.X under Zfinx

I'll send an email letting people know that we should comment in Gitlab
when a bug fix is sent.



Thanks,
Daniel

On 8/13/2026 1:13 AM, Zephyr Li wrote:
> Zfinx excludes FMV.X.W and FMV.W.X, but QEMU currently accepts both
> instructions when Zfinx is enabled without the F extension.
> 
> Require the F extension for these instructions so they raise an illegal
> instruction exception on Zfinx-only CPUs.
> 
> Add TCG regression tests for both instructions.
> 
> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/4108
> Signed-off-by: Zephyr Li <[email protected]>
> ---
>   target/riscv/tcg/insn_trans/trans_rvf.c.inc |  4 +--
>   tests/tcg/riscv64/Makefile.target           | 10 +++++++
>   tests/tcg/riscv64/test-zfinx-fmv-w-x.S      | 33 +++++++++++++++++++++
>   tests/tcg/riscv64/test-zfinx-fmv-x-w.S      | 33 +++++++++++++++++++++
>   4 files changed, 78 insertions(+), 2 deletions(-)
>   create mode 100644 tests/tcg/riscv64/test-zfinx-fmv-w-x.S
>   create mode 100644 tests/tcg/riscv64/test-zfinx-fmv-x-w.S
> 
> diff --git a/target/riscv/tcg/insn_trans/trans_rvf.c.inc b/target/riscv/tcg/insn_trans/trans_rvf.c.inc
> index e935523c93..70c66e9e25 100644
> --- a/target/riscv/tcg/insn_trans/trans_rvf.c.inc
> +++ b/target/riscv/tcg/insn_trans/trans_rvf.c.inc
> @@ -428,7 +428,7 @@ static bool trans_fmv_x_w(DisasContext *ctx, arg_fmv_x_w *a)
>   {
>       /* NOTE: This was FMV.X.S in an earlier version of the ISA spec! */
>       REQUIRE_FPU;
> -    REQUIRE_ZFINX_OR_F(ctx);
> +    REQUIRE_EXT(ctx, RVF);
>   
>       TCGv dest = dest_gpr(ctx, a->rd);
>       TCGv_i64 src1 = get_fpr_hs(ctx, a->rs1);
> @@ -531,7 +531,7 @@ static bool trans_fmv_w_x(DisasContext *ctx, arg_fmv_w_x *a)
>   {
>       /* NOTE: This was FMV.S.X in an earlier version of the ISA spec! */
>       REQUIRE_FPU;
> -    REQUIRE_ZFINX_OR_F(ctx);
> +    REQUIRE_EXT(ctx, RVF);
>   
>       TCGv_i64 dest = dest_fpr(ctx, a->rd);
>       TCGv src = get_gpr(ctx, a->rs1, EXT_ZERO);
> diff --git a/tests/tcg/riscv64/Makefile.target b/tests/tcg/riscv64/Makefile.target
> index 4da5b9a3b3..23e1152a10 100644
> --- a/tests/tcg/riscv64/Makefile.target
> +++ b/tests/tcg/riscv64/Makefile.target
> @@ -18,3 +18,13 @@ TESTS += test-fcvtmod
>   test-fcvtmod: CFLAGS += -march=rv64imafdc
>   test-fcvtmod: LDFLAGS += -static
>   run-test-fcvtmod: QEMU_OPTS += -cpu rv64,d=true,zfa=true
> +
> +TESTS += test-zfinx-fmv-x-w
> +test-zfinx-fmv-x-w: LDFLAGS = -nostdlib -static
> +run-test-zfinx-fmv-x-w: QEMU_OPTS += \
> +	-cpu rv64,f=false,d=false,zfa=false,zfh=false,zfhmin=false,zfinx=true
> +
> +TESTS += test-zfinx-fmv-w-x
> +test-zfinx-fmv-w-x: LDFLAGS = -nostdlib -static
> +run-test-zfinx-fmv-w-x: QEMU_OPTS += \
> +	-cpu rv64,f=false,d=false,zfa=false,zfh=false,zfhmin=false,zfinx=true
> diff --git a/tests/tcg/riscv64/test-zfinx-fmv-w-x.S b/tests/tcg/riscv64/test-zfinx-fmv-w-x.S
> new file mode 100644
> index 0000000000..73c5c2b2bf
> --- /dev/null
> +++ b/tests/tcg/riscv64/test-zfinx-fmv-w-x.S
> @@ -0,0 +1,33 @@
> +/* SPDX-License-Identifier: GPL-2.0-or-later */
> +#include <asm/unistd.h>
> +
> +        .text
> +        .globl  _start
> +_start:
> +        .option norvc
> +
> +        li      a0, 4
> +        la      a1, sa
> +        li      a2, 0
> +        li      a3, 8
> +        li      a7, __NR_rt_sigaction
> +        scall
> +
> +        .word   0xf0030453
> +
> +        li      a0, 1
> +        j       exit
> +
> +pass:
> +        li      a0, 0
> +
> +exit:
> +        li      a7, __NR_exit
> +        scall
> +
> +        .data
> +        .type   sa, @object
> +        .size   sa, 32
> +sa:
> +        .dword  pass
> +        .zero   24
> diff --git a/tests/tcg/riscv64/test-zfinx-fmv-x-w.S b/tests/tcg/riscv64/test-zfinx-fmv-x-w.S
> new file mode 100644
> index 0000000000..c4e853036f
> --- /dev/null
> +++ b/tests/tcg/riscv64/test-zfinx-fmv-x-w.S
> @@ -0,0 +1,33 @@
> +/* SPDX-License-Identifier: GPL-2.0-or-later */
> +#include <asm/unistd.h>
> +
> +        .text
> +        .globl  _start
> +_start:
> +        .option norvc
> +
> +        li      a0, 4
> +        la      a1, sa
> +        li      a2, 0
> +        li      a3, 8
> +        li      a7, __NR_rt_sigaction
> +        scall
> +
> +        .word   0xe0030453
> +
> +        li      a0, 1
> +        j       exit
> +
> +pass:
> +        li      a0, 0
> +
> +exit:
> +        li      a7, __NR_exit
> +        scall
> +
> +        .data
> +        .type   sa, @object
> +        .size   sa, 32
> +sa:
> +        .dword  pass
> +        .zero   24
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.