From: WANG Rui <wang...@loongson.cn> 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 <wszqk...@qq.com> Signed-off-by: WANG Rui <wang...@loongson.cn> Reviewed-by: Song Gao <gaos...@loongson.cn> Message-ID: <20250804132212.4816-1-wang...@loongson.cn> Signed-off-by: Song Gao <gaos...@loongson.cn> --- target/loongarch/tcg/insn_trans/trans_vec.c.inc | 6 +++--- 1 file 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 78730029cb..38bccf2838 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; -- 2.47.0