tcg/i386: Propagate is64 to tcg_out_qemu_ld_direct
This helps preserve the invariant that all TCG_TYPE_I32 values are stored zero-extended in the 64-bit host registers. Reviewed-by: Emilio G. Cota <cota@braap.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
55dfd8fedc
commit
1d21d95b61
@ -1883,10 +1883,11 @@ static inline void setup_guest_base_seg(void) { }
|
||||
|
||||
static void tcg_out_qemu_ld_direct(TCGContext *s, TCGReg datalo, TCGReg datahi,
|
||||
TCGReg base, int index, intptr_t ofs,
|
||||
int seg, TCGMemOp memop)
|
||||
int seg, bool is64, TCGMemOp memop)
|
||||
{
|
||||
const TCGMemOp real_bswap = memop & MO_BSWAP;
|
||||
TCGMemOp bswap = real_bswap;
|
||||
int rexw = is64 * P_REXW;
|
||||
int movop = OPC_MOVL_GvEv;
|
||||
|
||||
if (have_movbe && real_bswap) {
|
||||
@ -1900,7 +1901,7 @@ static void tcg_out_qemu_ld_direct(TCGContext *s, TCGReg datalo, TCGReg datahi,
|
||||
base, index, 0, ofs);
|
||||
break;
|
||||
case MO_SB:
|
||||
tcg_out_modrm_sib_offset(s, OPC_MOVSBL + P_REXW + seg, datalo,
|
||||
tcg_out_modrm_sib_offset(s, OPC_MOVSBL + rexw + seg, datalo,
|
||||
base, index, 0, ofs);
|
||||
break;
|
||||
case MO_UW:
|
||||
@ -1920,9 +1921,9 @@ static void tcg_out_qemu_ld_direct(TCGContext *s, TCGReg datalo, TCGReg datahi,
|
||||
base, index, 0, ofs);
|
||||
tcg_out_rolw_8(s, datalo);
|
||||
}
|
||||
tcg_out_modrm(s, OPC_MOVSWL + P_REXW, datalo, datalo);
|
||||
tcg_out_modrm(s, OPC_MOVSWL + rexw, datalo, datalo);
|
||||
} else {
|
||||
tcg_out_modrm_sib_offset(s, OPC_MOVSWL + P_REXW + seg,
|
||||
tcg_out_modrm_sib_offset(s, OPC_MOVSWL + rexw + seg,
|
||||
datalo, base, index, 0, ofs);
|
||||
}
|
||||
break;
|
||||
@ -2010,7 +2011,7 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, bool is64)
|
||||
label_ptr, offsetof(CPUTLBEntry, addr_read));
|
||||
|
||||
/* TLB Hit. */
|
||||
tcg_out_qemu_ld_direct(s, datalo, datahi, TCG_REG_L1, -1, 0, 0, opc);
|
||||
tcg_out_qemu_ld_direct(s, datalo, datahi, TCG_REG_L1, -1, 0, 0, is64, opc);
|
||||
|
||||
/* Record the current context of a load into ldst label */
|
||||
add_qemu_ldst_label(s, true, oi, datalo, datahi, addrlo, addrhi,
|
||||
@ -2045,7 +2046,7 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, bool is64)
|
||||
}
|
||||
|
||||
tcg_out_qemu_ld_direct(s, datalo, datahi,
|
||||
base, index, offset, seg, opc);
|
||||
base, index, offset, seg, is64, opc);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user