target/arm: Fix SCTLR_B test for TCGv_i64 load/store
Just because operating on a TCGv_i64 temporary does not mean that we're performing a 64-bit operation. Restrict the frobbing to actual 64-bit operations. This bug is not currently visible because all current users of these two functions always pass MO_64. Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20210419202257.161730-14-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
37bf7a055f
commit
9565ac4cc7
|
@ -982,7 +982,7 @@ static void gen_aa32_ld_i64(DisasContext *s, TCGv_i64 val, TCGv_i32 a32,
|
||||||
tcg_gen_qemu_ld_i64(val, addr, index, opc);
|
tcg_gen_qemu_ld_i64(val, addr, index, opc);
|
||||||
|
|
||||||
/* Not needed for user-mode BE32, where we use MO_BE instead. */
|
/* Not needed for user-mode BE32, where we use MO_BE instead. */
|
||||||
if (!IS_USER_ONLY && s->sctlr_b) {
|
if (!IS_USER_ONLY && s->sctlr_b && (opc & MO_SIZE) == MO_64) {
|
||||||
tcg_gen_rotri_i64(val, val, 32);
|
tcg_gen_rotri_i64(val, val, 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1001,7 +1001,7 @@ static void gen_aa32_st_i64(DisasContext *s, TCGv_i64 val, TCGv_i32 a32,
|
||||||
TCGv addr = gen_aa32_addr(s, a32, opc);
|
TCGv addr = gen_aa32_addr(s, a32, opc);
|
||||||
|
|
||||||
/* Not needed for user-mode BE32, where we use MO_BE instead. */
|
/* Not needed for user-mode BE32, where we use MO_BE instead. */
|
||||||
if (!IS_USER_ONLY && s->sctlr_b) {
|
if (!IS_USER_ONLY && s->sctlr_b && (opc & MO_SIZE) == MO_64) {
|
||||||
TCGv_i64 tmp = tcg_temp_new_i64();
|
TCGv_i64 tmp = tcg_temp_new_i64();
|
||||||
tcg_gen_rotri_i64(tmp, val, 32);
|
tcg_gen_rotri_i64(tmp, val, 32);
|
||||||
tcg_gen_qemu_st_i64(tmp, addr, index, opc);
|
tcg_gen_qemu_st_i64(tmp, addr, index, opc);
|
||||||
|
|
Loading…
Reference in a new issue