diff options
author | WANG Rui <wangrui@loongson.cn> | 2025-08-04 21:22:12 +0800 |
---|---|---|
committer | Song Gao <gaosong@loongson.cn> | 2025-08-08 09:18:44 +0800 |
commit | e66644c48e96e81848c6aa94b185f59fc212d080 (patch) | |
tree | f582d4b35cb2be33b74617fc572081143e07802a | |
parent | cd21ee5b27b22ae66c103d36516aa5077881aa3d (diff) | |
download | qemu-e66644c48e96e81848c6aa94b185f59fc212d080.zip qemu-e66644c48e96e81848c6aa94b185f59fc212d080.tar.gz qemu-e66644c48e96e81848c6aa94b185f59fc212d080.tar.bz2 |
target/loongarch: Fix [X]VLDI raising exception incorrectly
According to the specification, [X]VLDI should trigger an invalid instruction
exception only when Bit[12] is 1 and Bit[11:8] > 12. This patch fixes an issue
where an exception was incorrectly raised even when Bit[12] was 0.
Test case:
```
.global main
main:
vldi $vr0, 3328
ret
```
Reported-by: Zhou Qiankang <wszqkzqk@qq.com>
Signed-off-by: WANG Rui <wangrui@loongson.cn>
Reviewed-by: Song Gao <gaosong@loongson.cn>
Message-ID: <20250804132212.4816-1-wangrui@loongson.cn>
Signed-off-by: Song Gao <gaosong@loongson.cn>
-rw-r--r-- | target/loongarch/tcg/insn_trans/trans_vec.c.inc | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/target/loongarch/tcg/insn_trans/trans_vec.c.inc b/target/loongarch/tcg/insn_trans/trans_vec.c.inc index 7873002..38bccf2 100644 --- a/target/loongarch/tcg/insn_trans/trans_vec.c.inc +++ b/target/loongarch/tcg/insn_trans/trans_vec.c.inc @@ -3585,7 +3585,9 @@ static bool gen_vldi(DisasContext *ctx, arg_vldi *a, uint32_t oprsz) int sel, vece; uint64_t value; - if (!check_valid_vldi_mode(a)) { + sel = (a->imm >> 12) & 0x1; + + if (sel && !check_valid_vldi_mode(a)) { generate_exception(ctx, EXCCODE_INE); return true; } @@ -3594,8 +3596,6 @@ static bool gen_vldi(DisasContext *ctx, arg_vldi *a, uint32_t oprsz) return true; } - sel = (a->imm >> 12) & 0x1; - if (sel) { value = vldi_get_value(ctx, a->imm); vece = MO_64; |