target/loongarch: fix vldi/xvldi raise wrong error
on qemu we got an aborted error ** ERROR:../target/loongarch/tcg/insn_trans/trans_vec.c.inc:3574:vldi_get_value: code should not be reached Bail out! ERROR:../target/loongarch/tcg/insn_trans/trans_vec.c.inc:3574:vldi_get_value: code should not be reached Aborted (core dumped) but on 3A600/3A5000 we got a "Illegal instruction" error. Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2971 Fixes:29bb5d727f("target/loongarch: Implement vldi") Cc: qemu-stable@nongnu.org Reviewed-by: Bibo Mao <maobibo@loongson.cn> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Song Gao <gaosong@loongson.cn> (cherry picked from commitc2a2e1ad2a) Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
This commit is contained in:
parent
fdd20285ae
commit
46cdfdfe92
1 changed files with 11 additions and 2 deletions
|
|
@ -3465,7 +3465,7 @@ TRANS(xvmsknz_b, LASX, gen_xx, gen_helper_vmsknz_b)
|
|||
static uint64_t vldi_get_value(DisasContext *ctx, uint32_t imm)
|
||||
{
|
||||
int mode;
|
||||
uint64_t data, t;
|
||||
uint64_t data = 0, t;
|
||||
|
||||
/*
|
||||
* imm bit [11:8] is mode, mode value is 0-12.
|
||||
|
|
@ -3570,17 +3570,26 @@ static uint64_t vldi_get_value(DisasContext *ctx, uint32_t imm)
|
|||
}
|
||||
break;
|
||||
default:
|
||||
generate_exception(ctx, EXCCODE_INE);
|
||||
g_assert_not_reached();
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
static bool check_valid_vldi_mode(arg_vldi *a)
|
||||
{
|
||||
return extract32(a->imm, 8, 4) <= 12;
|
||||
}
|
||||
|
||||
static bool gen_vldi(DisasContext *ctx, arg_vldi *a, uint32_t oprsz)
|
||||
{
|
||||
int sel, vece;
|
||||
uint64_t value;
|
||||
|
||||
if (!check_valid_vldi_mode(a)) {
|
||||
generate_exception(ctx, EXCCODE_INE);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!check_vec(ctx, oprsz)) {
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue