mirror of https://github.com/xemu-project/xemu.git
target/arm: Consistently use finalize_memop_asimd() for ASIMD loads/stores
In the recent refactoring we missed a few places which should be calling finalize_memop_asimd() for ASIMD loads and stores but instead are just calling finalize_memop(); fix these. For the disas_ldst_single_struct() and disas_ldst_multiple_struct() cases, this is not a behaviour change because there the size is never MO_128 and the two finalize functions do the same thing. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
99bb43c0ff
commit
68496d4172
|
@ -3309,6 +3309,7 @@ static void disas_ldst_reg_roffset(DisasContext *s, uint32_t insn,
|
|||
if (!fp_access_check(s)) {
|
||||
return;
|
||||
}
|
||||
memop = finalize_memop_asimd(s, size);
|
||||
} else {
|
||||
if (size == 3 && opc == 2) {
|
||||
/* PRFM - prefetch */
|
||||
|
@ -3321,6 +3322,7 @@ static void disas_ldst_reg_roffset(DisasContext *s, uint32_t insn,
|
|||
is_store = (opc == 0);
|
||||
is_signed = !is_store && extract32(opc, 1, 1);
|
||||
is_extended = (size < 3) && extract32(opc, 0, 1);
|
||||
memop = finalize_memop(s, size + is_signed * MO_SIGN);
|
||||
}
|
||||
|
||||
if (rn == 31) {
|
||||
|
@ -3333,7 +3335,6 @@ static void disas_ldst_reg_roffset(DisasContext *s, uint32_t insn,
|
|||
|
||||
tcg_gen_add_i64(dirty_addr, dirty_addr, tcg_rm);
|
||||
|
||||
memop = finalize_memop(s, size + is_signed * MO_SIGN);
|
||||
clean_addr = gen_mte_check1(s, dirty_addr, is_store, true, memop);
|
||||
|
||||
if (is_vector) {
|
||||
|
@ -3398,6 +3399,7 @@ static void disas_ldst_reg_unsigned_imm(DisasContext *s, uint32_t insn,
|
|||
if (!fp_access_check(s)) {
|
||||
return;
|
||||
}
|
||||
memop = finalize_memop_asimd(s, size);
|
||||
} else {
|
||||
if (size == 3 && opc == 2) {
|
||||
/* PRFM - prefetch */
|
||||
|
@ -3410,6 +3412,7 @@ static void disas_ldst_reg_unsigned_imm(DisasContext *s, uint32_t insn,
|
|||
is_store = (opc == 0);
|
||||
is_signed = !is_store && extract32(opc, 1, 1);
|
||||
is_extended = (size < 3) && extract32(opc, 0, 1);
|
||||
memop = finalize_memop(s, size + is_signed * MO_SIGN);
|
||||
}
|
||||
|
||||
if (rn == 31) {
|
||||
|
@ -3419,7 +3422,6 @@ static void disas_ldst_reg_unsigned_imm(DisasContext *s, uint32_t insn,
|
|||
offset = imm12 << size;
|
||||
tcg_gen_addi_i64(dirty_addr, dirty_addr, offset);
|
||||
|
||||
memop = finalize_memop(s, size + is_signed * MO_SIGN);
|
||||
clean_addr = gen_mte_check1(s, dirty_addr, is_store, rn != 31, memop);
|
||||
|
||||
if (is_vector) {
|
||||
|
@ -3861,7 +3863,7 @@ static void disas_ldst_multiple_struct(DisasContext *s, uint32_t insn)
|
|||
* promote consecutive little-endian elements below.
|
||||
*/
|
||||
clean_addr = gen_mte_checkN(s, tcg_rn, is_store, is_postidx || rn != 31,
|
||||
total, finalize_memop(s, size));
|
||||
total, finalize_memop_asimd(s, size));
|
||||
|
||||
/*
|
||||
* Consecutive little-endian elements from a single register
|
||||
|
@ -4019,7 +4021,7 @@ static void disas_ldst_single_struct(DisasContext *s, uint32_t insn)
|
|||
total = selem << scale;
|
||||
tcg_rn = cpu_reg_sp(s, rn);
|
||||
|
||||
mop = finalize_memop(s, scale);
|
||||
mop = finalize_memop_asimd(s, scale);
|
||||
|
||||
clean_addr = gen_mte_checkN(s, tcg_rn, !is_load, is_postidx || rn != 31,
|
||||
total, mop);
|
||||
|
|
Loading…
Reference in New Issue