From: Max Chou <max.c...@sifive.com> According to the Vector Reduction Operations section in the RISC-V "V" Vector Extension spec, "If vl=0, no operation is performed and the destination register is not updated."
The vd should be updated when vl is larger than 0. Fixes: fe5c9ab1fc ("target/riscv: vector single-width integer reduction instructions") Fixes: f714361ed7 ("target/riscv: rvv-1.0: implement vstart CSR") Signed-off-by: Max Chou <max.c...@sifive.com> Reviewed-by: Daniel Henrique Barboza <dbarb...@ventanamicro.com> Message-ID: <20250124101452.2519171-1-max.c...@sifive.com> Signed-off-by: Alistair Francis <alistair.fran...@wdc.com> (cherry picked from commit ffd455963f230c7dc04965609d6675da687a5a78) Signed-off-by: Michael Tokarev <m...@tls.msk.ru> diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c index a85dd1d200..3731500717 100644 --- a/target/riscv/vector_helper.c +++ b/target/riscv/vector_helper.c @@ -4648,7 +4648,9 @@ void HELPER(NAME)(void *vd, void *v0, void *vs1, \ } \ s1 = OP(s1, (TD)s2); \ } \ - *((TD *)vd + HD(0)) = s1; \ + if (vl > 0) { \ + *((TD *)vd + HD(0)) = s1; \ + } \ env->vstart = 0; \ /* set tail elements to 1s */ \ vext_set_elems_1s(vd, vta, esz, vlenb); \ @@ -4734,7 +4736,9 @@ void HELPER(NAME)(void *vd, void *v0, void *vs1, \ } \ s1 = OP(s1, (TD)s2, &env->fp_status); \ } \ - *((TD *)vd + HD(0)) = s1; \ + if (vl > 0) { \ + *((TD *)vd + HD(0)) = s1; \ + } \ env->vstart = 0; \ /* set tail elements to 1s */ \ vext_set_elems_1s(vd, vta, esz, vlenb); \ -- 2.39.5