#include "translate.h"
#include "translate-a32.h"
-#include "tcg/tcg-op.h"
+#define TCG_ADDRESS_BITS 32
+#include "tcg/tcg-op-mem.h"
#include "qemu/log.h"
#include "arm_ldst.h"
#include "semihosting/semihost.h"
* that the address argument is TCGv_i32 rather than TCGv.
*/
-static TCGv gen_aa32_addr(DisasContext *s, TCGv_i32 a32, MemOp op)
+static TCGv_va gen_aa32_addr(DisasContext *s, TCGv_i32 a32, MemOp op)
{
- TCGv addr = tcg_temp_new();
- tcg_gen_extu_i32_tl(addr, a32);
+ TCGv_va addr = tcgv_va_temp_new();
+ tcg_gen_mov_i32(addr, a32);
/* Not needed for user-mode BE32, where we use MO_BE instead. */
if (!IS_USER_ONLY && s->sctlr_b && (op & MO_SIZE) < MO_32) {
- tcg_gen_xori_tl(addr, addr, 4 - (1 << (op & MO_SIZE)));
+ tcg_gen_xori_i32(addr, addr, 4 - (1 << (op & MO_SIZE)));
}
return addr;
}
void gen_aa32_ld_internal_i32(DisasContext *s, TCGv_i32 val,
TCGv_i32 a32, int index, MemOp opc)
{
- TCGv addr = gen_aa32_addr(s, a32, opc);
+ TCGv_va addr = gen_aa32_addr(s, a32, opc);
tcg_gen_qemu_ld_i32(val, addr, index, opc);
}
void gen_aa32_st_internal_i32(DisasContext *s, TCGv_i32 val,
TCGv_i32 a32, int index, MemOp opc)
{
- TCGv addr = gen_aa32_addr(s, a32, opc);
+ TCGv_va addr = gen_aa32_addr(s, a32, opc);
tcg_gen_qemu_st_i32(val, addr, index, opc);
}
void gen_aa32_ld_internal_i64(DisasContext *s, TCGv_i64 val,
TCGv_i32 a32, int index, MemOp opc)
{
- TCGv addr = gen_aa32_addr(s, a32, opc);
+ TCGv_va addr = gen_aa32_addr(s, a32, opc);
tcg_gen_qemu_ld_i64(val, addr, index, opc);
void gen_aa32_st_internal_i64(DisasContext *s, TCGv_i64 val,
TCGv_i32 a32, int index, MemOp opc)
{
- TCGv addr = gen_aa32_addr(s, a32, opc);
+ TCGv_va addr = gen_aa32_addr(s, a32, opc);
/* Not needed for user-mode BE32, where we use MO_BE instead. */
if (!IS_USER_ONLY && s->sctlr_b && (opc & MO_SIZE) == MO_64) {
* architecturally 64-bit access, but instead do a 64-bit access
* using MO_BE if appropriate and then split the two halves.
*/
- TCGv taddr = gen_aa32_addr(s, addr, opc);
+ TCGv_va taddr = gen_aa32_addr(s, addr, opc);
tcg_gen_qemu_ld_i64(t64, taddr, get_mem_index(s), opc);
tcg_gen_mov_i64(cpu_exclusive_val, t64);
{
TCGv_i32 t0, t1, t2;
TCGv_i64 extaddr;
- TCGv taddr;
+ TCGv_va taddr;
TCGLabel *done_label;
TCGLabel *fail_label;
MemOp opc = size | MO_ALIGN | s->be_data;
*/
int mem_idx = get_mem_index(s);
MemOp opc = MO_64 | MO_ALIGN_4 | MO_ATOM_SUBALIGN | s->be_data;
- TCGv taddr = gen_aa32_addr(s, addr, opc);
+ TCGv_va taddr = gen_aa32_addr(s, addr, opc);
TCGv_i64 t64 = tcg_temp_new_i64();
TCGv_i32 tmp = tcg_temp_new_i32();
TCGv_i32 tmp2 = tcg_temp_new_i32();
*/
int mem_idx = get_mem_index(s);
MemOp opc = MO_64 | MO_ALIGN_4 | MO_ATOM_SUBALIGN | s->be_data;
- TCGv taddr = gen_aa32_addr(s, addr, opc);
+ TCGv_va taddr = gen_aa32_addr(s, addr, opc);
TCGv_i32 t1 = load_reg(s, rt);
TCGv_i32 t2 = load_reg(s, rt2);
TCGv_i64 t64 = tcg_temp_new_i64();
static bool op_swp(DisasContext *s, arg_SWP *a, MemOp opc)
{
TCGv_i32 addr, tmp;
- TCGv taddr;
+ TCGv_va taddr;
opc |= s->be_data;
addr = load_reg(s, a->rn);