target/arm: Fix decode of FMOV (hp) vs MOVI
The decode of FMOV (vector, immediate, half-precision) vs invalid cases of MOVI are incorrect. Fixes RISU mismatch for invalid insn 0x2f01fd31. Fixes: 70b4e6a4457 ("arm/translate-a64: add FP16 FMOV to simd_mod_imm") Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 20240524232121.284515-6-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
fe84877ed4
commit
c0ca7ed049
@ -7904,27 +7904,31 @@ static void disas_simd_mod_imm(DisasContext *s, uint32_t insn)
|
|||||||
bool is_q = extract32(insn, 30, 1);
|
bool is_q = extract32(insn, 30, 1);
|
||||||
uint64_t imm = 0;
|
uint64_t imm = 0;
|
||||||
|
|
||||||
if (o2 != 0 || ((cmode == 0xf) && is_neg && !is_q)) {
|
if (o2) {
|
||||||
/* Check for FMOV (vector, immediate) - half-precision */
|
if (cmode != 0xf || is_neg) {
|
||||||
if (!(dc_isar_feature(aa64_fp16, s) && o2 && cmode == 0xf)) {
|
|
||||||
unallocated_encoding(s);
|
unallocated_encoding(s);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (!fp_access_check(s)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cmode == 15 && o2 && !is_neg) {
|
|
||||||
/* FMOV (vector, immediate) - half-precision */
|
/* FMOV (vector, immediate) - half-precision */
|
||||||
|
if (!dc_isar_feature(aa64_fp16, s)) {
|
||||||
|
unallocated_encoding(s);
|
||||||
|
return;
|
||||||
|
}
|
||||||
imm = vfp_expand_imm(MO_16, abcdefgh);
|
imm = vfp_expand_imm(MO_16, abcdefgh);
|
||||||
/* now duplicate across the lanes */
|
/* now duplicate across the lanes */
|
||||||
imm = dup_const(MO_16, imm);
|
imm = dup_const(MO_16, imm);
|
||||||
} else {
|
} else {
|
||||||
|
if (cmode == 0xf && is_neg && !is_q) {
|
||||||
|
unallocated_encoding(s);
|
||||||
|
return;
|
||||||
|
}
|
||||||
imm = asimd_imm_const(abcdefgh, cmode, is_neg);
|
imm = asimd_imm_const(abcdefgh, cmode, is_neg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!fp_access_check(s)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!((cmode & 0x9) == 0x1 || (cmode & 0xd) == 0x9)) {
|
if (!((cmode & 0x9) == 0x1 || (cmode & 0xd) == 0x9)) {
|
||||||
/* MOVI or MVNI, with MVNI negation handled above. */
|
/* MOVI or MVNI, with MVNI negation handled above. */
|
||||||
tcg_gen_gvec_dup_imm(MO_64, vec_full_reg_offset(s, rd), is_q ? 16 : 8,
|
tcg_gen_gvec_dup_imm(MO_64, vec_full_reg_offset(s, rd), is_q ? 16 : 8,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user