mirror of
https://github.com/qemu/qemu.git
synced 2025-08-16 14:54:29 +00:00
target/riscv: Fix shift count overflow
The result of (8 - 3 - vlmul) is negative when vlmul >= 6, and results in wrong vill. Signed-off-by: demin.han <demin.han@starfivetech.com> Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> Message-ID: <20240225174114.5298-1-demin.han@starfivetech.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
a506c4289d
commit
938dd05ea1
@ -44,6 +44,7 @@ target_ulong HELPER(vsetvl)(CPURISCVState *env, target_ulong s1,
|
|||||||
target_ulong reserved = s2 &
|
target_ulong reserved = s2 &
|
||||||
MAKE_64BIT_MASK(R_VTYPE_RESERVED_SHIFT,
|
MAKE_64BIT_MASK(R_VTYPE_RESERVED_SHIFT,
|
||||||
xlen - 1 - R_VTYPE_RESERVED_SHIFT);
|
xlen - 1 - R_VTYPE_RESERVED_SHIFT);
|
||||||
|
uint16_t vlen = cpu->cfg.vlenb << 3;
|
||||||
int8_t lmul;
|
int8_t lmul;
|
||||||
|
|
||||||
if (vlmul & 4) {
|
if (vlmul & 4) {
|
||||||
@ -53,10 +54,8 @@ target_ulong HELPER(vsetvl)(CPURISCVState *env, target_ulong s1,
|
|||||||
* VLEN * LMUL >= SEW
|
* VLEN * LMUL >= SEW
|
||||||
* VLEN >> (8 - lmul) >= sew
|
* VLEN >> (8 - lmul) >= sew
|
||||||
* (vlenb << 3) >> (8 - lmul) >= sew
|
* (vlenb << 3) >> (8 - lmul) >= sew
|
||||||
* vlenb >> (8 - 3 - lmul) >= sew
|
|
||||||
*/
|
*/
|
||||||
if (vlmul == 4 ||
|
if (vlmul == 4 || (vlen >> (8 - vlmul)) < sew) {
|
||||||
cpu->cfg.vlenb >> (8 - 3 - vlmul) < sew) {
|
|
||||||
vill = true;
|
vill = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user