提交 3b6dac34 编写于 作者: R Richard Henderson 提交者: Aurelien Jarno

tcg: Add TYPE parameter to tcg_out_mov.

Mirror tcg_out_movi in having a TYPE parameter.  This allows x86_64
to perform the move at the proper width, which may elide a REX prefix.

Introduce a TCG_TYPE_REG enumerator to represent the "native width"
of the host register, and to distinguish the usage from "pointer data"
as represented by the existing TCG_TYPE_PTR.

Update all targets to match.
Signed-off-by: NRichard Henderson <rth@twiddle.net>
Signed-off-by: NAurelien Jarno <aurelien@aurel32.net>
上级 26ebe468
...@@ -1798,7 +1798,7 @@ static void tcg_out_addi(TCGContext *s, int reg, tcg_target_long val) ...@@ -1798,7 +1798,7 @@ static void tcg_out_addi(TCGContext *s, int reg, tcg_target_long val)
} }
} }
static inline void tcg_out_mov(TCGContext *s, int ret, int arg) static inline void tcg_out_mov(TCGContext *s, TCGType type, int ret, int arg)
{ {
tcg_out_dat_reg(s, COND_AL, ARITH_MOV, ret, 0, arg, SHIFT_IMM_LSL(0)); tcg_out_dat_reg(s, COND_AL, ARITH_MOV, ret, 0, arg, SHIFT_IMM_LSL(0));
} }
......
...@@ -338,7 +338,7 @@ static int tcg_target_const_match(tcg_target_long val, ...@@ -338,7 +338,7 @@ static int tcg_target_const_match(tcg_target_long val,
/* supplied by libgcc */ /* supplied by libgcc */
extern void *__canonicalize_funcptr_for_compare(void *); extern void *__canonicalize_funcptr_for_compare(void *);
static void tcg_out_mov(TCGContext *s, int ret, int arg) static void tcg_out_mov(TCGContext *s, TCGType type, int ret, int arg)
{ {
/* PA1.1 defines COPY as OR r,0,t; PA2.0 defines COPY as LDO 0(r),t /* PA1.1 defines COPY as OR r,0,t; PA2.0 defines COPY as LDO 0(r),t
but hppa-dis.c is unaware of this definition */ but hppa-dis.c is unaware of this definition */
...@@ -498,7 +498,7 @@ static void tcg_out_ori(TCGContext *s, int ret, int arg, tcg_target_ulong m) ...@@ -498,7 +498,7 @@ static void tcg_out_ori(TCGContext *s, int ret, int arg, tcg_target_ulong m)
} }
assert(bs1 == 32 || (1ul << bs1) > m); assert(bs1 == 32 || (1ul << bs1) > m);
tcg_out_mov(s, ret, arg); tcg_out_mov(s, TCG_TYPE_I32, ret, arg);
tcg_out32(s, INSN_DEPI | INSN_R2(ret) | INSN_IM5(-1) tcg_out32(s, INSN_DEPI | INSN_R2(ret) | INSN_IM5(-1)
| INSN_SHDEP_CP(31 - bs0) | INSN_DEP_LEN(bs1 - bs0)); | INSN_SHDEP_CP(31 - bs0) | INSN_DEP_LEN(bs1 - bs0));
} }
...@@ -528,7 +528,7 @@ static void tcg_out_andi(TCGContext *s, int ret, int arg, tcg_target_ulong m) ...@@ -528,7 +528,7 @@ static void tcg_out_andi(TCGContext *s, int ret, int arg, tcg_target_ulong m)
if (ls1 == 32) { if (ls1 == 32) {
tcg_out_extr(s, ret, arg, 0, ls0, 0); tcg_out_extr(s, ret, arg, 0, ls0, 0);
} else { } else {
tcg_out_mov(s, ret, arg); tcg_out_mov(s, TCG_TYPE_I32, ret, arg);
tcg_out32(s, INSN_DEPI | INSN_R2(ret) | INSN_IM5(0) tcg_out32(s, INSN_DEPI | INSN_R2(ret) | INSN_IM5(0)
| INSN_SHDEP_CP(31 - ls0) | INSN_DEP_LEN(ls1 - ls0)); | INSN_SHDEP_CP(31 - ls0) | INSN_DEP_LEN(ls1 - ls0));
} }
...@@ -608,7 +608,7 @@ static void tcg_out_rotr(TCGContext *s, int ret, int arg, int creg) ...@@ -608,7 +608,7 @@ static void tcg_out_rotr(TCGContext *s, int ret, int arg, int creg)
static void tcg_out_bswap16(TCGContext *s, int ret, int arg, int sign) static void tcg_out_bswap16(TCGContext *s, int ret, int arg, int sign)
{ {
if (ret != arg) { if (ret != arg) {
tcg_out_mov(s, ret, arg); /* arg = xxAB */ tcg_out_mov(s, TCG_TYPE_I32, ret, arg); /* arg = xxAB */
} }
tcg_out_dep(s, ret, ret, 16, 8); /* ret = xBAB */ tcg_out_dep(s, ret, ret, 16, 8); /* ret = xBAB */
tcg_out_extr(s, ret, ret, 8, 16, sign); /* ret = ..BA */ tcg_out_extr(s, ret, ret, 8, 16, sign); /* ret = ..BA */
...@@ -638,7 +638,7 @@ static void tcg_out_call(TCGContext *s, void *func) ...@@ -638,7 +638,7 @@ static void tcg_out_call(TCGContext *s, void *func)
tcg_out32(s, INSN_LDIL | INSN_R2(TCG_REG_R20) | reassemble_21(hi)); tcg_out32(s, INSN_LDIL | INSN_R2(TCG_REG_R20) | reassemble_21(hi));
tcg_out32(s, INSN_BLE_SR4 | INSN_R2(TCG_REG_R20) tcg_out32(s, INSN_BLE_SR4 | INSN_R2(TCG_REG_R20)
| reassemble_17(lo >> 2)); | reassemble_17(lo >> 2));
tcg_out_mov(s, TCG_REG_RP, TCG_REG_R31); tcg_out_mov(s, TCG_TYPE_I32, TCG_REG_RP, TCG_REG_R31);
} }
} }
...@@ -685,7 +685,7 @@ static void tcg_out_add2(TCGContext *s, int destl, int desth, ...@@ -685,7 +685,7 @@ static void tcg_out_add2(TCGContext *s, int destl, int desth,
} }
tcg_out_arith(s, desth, ah, bh, INSN_ADDC); tcg_out_arith(s, desth, ah, bh, INSN_ADDC);
tcg_out_mov(s, destl, tmp); tcg_out_mov(s, TCG_TYPE_I32, destl, tmp);
} }
static void tcg_out_sub2(TCGContext *s, int destl, int desth, int al, int ah, static void tcg_out_sub2(TCGContext *s, int destl, int desth, int al, int ah,
...@@ -706,7 +706,7 @@ static void tcg_out_sub2(TCGContext *s, int destl, int desth, int al, int ah, ...@@ -706,7 +706,7 @@ static void tcg_out_sub2(TCGContext *s, int destl, int desth, int al, int ah,
} }
tcg_out_arith(s, desth, ah, bh, INSN_SUBB); tcg_out_arith(s, desth, ah, bh, INSN_SUBB);
tcg_out_mov(s, destl, tmp); tcg_out_mov(s, TCG_TYPE_I32, destl, tmp);
} }
static void tcg_out_branch(TCGContext *s, int label_index, int nul) static void tcg_out_branch(TCGContext *s, int label_index, int nul)
...@@ -869,7 +869,7 @@ static void tcg_out_setcond2(TCGContext *s, int cond, TCGArg ret, ...@@ -869,7 +869,7 @@ static void tcg_out_setcond2(TCGContext *s, int cond, TCGArg ret,
break; break;
} }
tcg_out_mov(s, ret, scratch); tcg_out_mov(s, TCG_TYPE_I32, ret, scratch);
} }
#if defined(CONFIG_SOFTMMU) #if defined(CONFIG_SOFTMMU)
...@@ -1048,9 +1048,9 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int opc) ...@@ -1048,9 +1048,9 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int opc)
tcg_out_label(s, lab1, (tcg_target_long)s->code_ptr); tcg_out_label(s, lab1, (tcg_target_long)s->code_ptr);
argreg = TCG_REG_R26; argreg = TCG_REG_R26;
tcg_out_mov(s, argreg--, addrlo_reg); tcg_out_mov(s, TCG_TYPE_I32, argreg--, addrlo_reg);
if (TARGET_LONG_BITS == 64) { if (TARGET_LONG_BITS == 64) {
tcg_out_mov(s, argreg--, addrhi_reg); tcg_out_mov(s, TCG_TYPE_I32, argreg--, addrhi_reg);
} }
tcg_out_movi(s, TCG_TYPE_I32, argreg, mem_index); tcg_out_movi(s, TCG_TYPE_I32, argreg, mem_index);
...@@ -1071,11 +1071,11 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int opc) ...@@ -1071,11 +1071,11 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int opc)
break; break;
case 2: case 2:
case 2 | 4: case 2 | 4:
tcg_out_mov(s, datalo_reg, TCG_REG_RET0); tcg_out_mov(s, TCG_TYPE_I32, datalo_reg, TCG_REG_RET0);
break; break;
case 3: case 3:
tcg_out_mov(s, datahi_reg, TCG_REG_RET0); tcg_out_mov(s, TCG_TYPE_I32, datahi_reg, TCG_REG_RET0);
tcg_out_mov(s, datalo_reg, TCG_REG_RET1); tcg_out_mov(s, TCG_TYPE_I32, datalo_reg, TCG_REG_RET1);
break; break;
default: default:
tcg_abort(); tcg_abort();
...@@ -1167,9 +1167,9 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int opc) ...@@ -1167,9 +1167,9 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int opc)
tcg_out_label(s, lab1, (tcg_target_long)s->code_ptr); tcg_out_label(s, lab1, (tcg_target_long)s->code_ptr);
argreg = TCG_REG_R26; argreg = TCG_REG_R26;
tcg_out_mov(s, argreg--, addrlo_reg); tcg_out_mov(s, TCG_TYPE_I32, argreg--, addrlo_reg);
if (TARGET_LONG_BITS == 64) { if (TARGET_LONG_BITS == 64) {
tcg_out_mov(s, argreg--, addrhi_reg); tcg_out_mov(s, TCG_TYPE_I32, argreg--, addrhi_reg);
} }
switch(opc) { switch(opc) {
...@@ -1182,7 +1182,7 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int opc) ...@@ -1182,7 +1182,7 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int opc)
tcg_out_movi(s, TCG_TYPE_I32, argreg, mem_index); tcg_out_movi(s, TCG_TYPE_I32, argreg, mem_index);
break; break;
case 2: case 2:
tcg_out_mov(s, argreg--, datalo_reg); tcg_out_mov(s, TCG_TYPE_I32, argreg--, datalo_reg);
tcg_out_movi(s, TCG_TYPE_I32, argreg, mem_index); tcg_out_movi(s, TCG_TYPE_I32, argreg, mem_index);
break; break;
case 3: case 3:
...@@ -1196,8 +1196,8 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int opc) ...@@ -1196,8 +1196,8 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int opc)
argreg = TCG_REG_R20; argreg = TCG_REG_R20;
tcg_out_movi(s, TCG_TYPE_I32, argreg, mem_index); tcg_out_movi(s, TCG_TYPE_I32, argreg, mem_index);
} }
tcg_out_mov(s, TCG_REG_R23, datahi_reg); tcg_out_mov(s, TCG_TYPE_I32, TCG_REG_R23, datahi_reg);
tcg_out_mov(s, TCG_REG_R24, datalo_reg); tcg_out_mov(s, TCG_TYPE_I32, TCG_REG_R24, datalo_reg);
tcg_out_st(s, TCG_TYPE_I32, argreg, TCG_REG_SP, tcg_out_st(s, TCG_TYPE_I32, argreg, TCG_REG_SP,
TCG_TARGET_CALL_STACK_OFFSET - 4); TCG_TARGET_CALL_STACK_OFFSET - 4);
break; break;
...@@ -1637,7 +1637,7 @@ void tcg_target_qemu_prologue(TCGContext *s) ...@@ -1637,7 +1637,7 @@ void tcg_target_qemu_prologue(TCGContext *s)
/* Jump to TB, and adjust R18 to be the return address. */ /* Jump to TB, and adjust R18 to be the return address. */
tcg_out32(s, INSN_BLE_SR4 | INSN_R2(TCG_REG_R26)); tcg_out32(s, INSN_BLE_SR4 | INSN_R2(TCG_REG_R26));
tcg_out_mov(s, TCG_REG_R18, TCG_REG_R31); tcg_out_mov(s, TCG_TYPE_I32, TCG_REG_R18, TCG_REG_R31);
/* Restore callee saved registers. */ /* Restore callee saved registers. */
tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_RP, TCG_REG_SP, -frame_size - 20); tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_RP, TCG_REG_SP, -frame_size - 20);
......
...@@ -348,7 +348,7 @@ static inline void tgen_arithr(TCGContext *s, int subop, int dest, int src) ...@@ -348,7 +348,7 @@ static inline void tgen_arithr(TCGContext *s, int subop, int dest, int src)
tcg_out_modrm(s, OPC_ARITH_GvEv + (subop << 3), dest, src); tcg_out_modrm(s, OPC_ARITH_GvEv + (subop << 3), dest, src);
} }
static inline void tcg_out_mov(TCGContext *s, int ret, int arg) static inline void tcg_out_mov(TCGContext *s, TCGType type, int ret, int arg)
{ {
if (arg != ret) { if (arg != ret) {
tcg_out_modrm(s, OPC_MOVL_GvEv, ret, arg); tcg_out_modrm(s, OPC_MOVL_GvEv, ret, arg);
...@@ -733,8 +733,8 @@ static inline void tcg_out_tlb_load(TCGContext *s, int addrlo_idx, ...@@ -733,8 +733,8 @@ static inline void tcg_out_tlb_load(TCGContext *s, int addrlo_idx,
const int r0 = TCG_REG_EAX; const int r0 = TCG_REG_EAX;
const int r1 = TCG_REG_EDX; const int r1 = TCG_REG_EDX;
tcg_out_mov(s, r1, addrlo); tcg_out_mov(s, TCG_TYPE_I32, r1, addrlo);
tcg_out_mov(s, r0, addrlo); tcg_out_mov(s, TCG_TYPE_I32, r0, addrlo);
tcg_out_shifti(s, SHIFT_SHR, r1, TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS); tcg_out_shifti(s, SHIFT_SHR, r1, TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS);
...@@ -748,7 +748,7 @@ static inline void tcg_out_tlb_load(TCGContext *s, int addrlo_idx, ...@@ -748,7 +748,7 @@ static inline void tcg_out_tlb_load(TCGContext *s, int addrlo_idx,
/* cmp 0(r1), r0 */ /* cmp 0(r1), r0 */
tcg_out_modrm_offset(s, OPC_CMP_GvEv, r0, r1, 0); tcg_out_modrm_offset(s, OPC_CMP_GvEv, r0, r1, 0);
tcg_out_mov(s, r0, addrlo); tcg_out_mov(s, TCG_TYPE_I32, r0, addrlo);
/* jne label1 */ /* jne label1 */
tcg_out8(s, OPC_JCC_short + JCC_JNE); tcg_out8(s, OPC_JCC_short + JCC_JNE);
...@@ -881,7 +881,7 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, ...@@ -881,7 +881,7 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args,
/* EAX is already loaded. */ /* EAX is already loaded. */
arg_idx = 1; arg_idx = 1;
if (TARGET_LONG_BITS == 64) { if (TARGET_LONG_BITS == 64) {
tcg_out_mov(s, tcg_target_call_iarg_regs[arg_idx++], tcg_out_mov(s, TCG_TYPE_I32, tcg_target_call_iarg_regs[arg_idx++],
args[addrlo_idx + 1]); args[addrlo_idx + 1]);
} }
tcg_out_movi(s, TCG_TYPE_I32, tcg_target_call_iarg_regs[arg_idx], tcg_out_movi(s, TCG_TYPE_I32, tcg_target_call_iarg_regs[arg_idx],
...@@ -903,16 +903,16 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, ...@@ -903,16 +903,16 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args,
break; break;
case 2: case 2:
default: default:
tcg_out_mov(s, data_reg, TCG_REG_EAX); tcg_out_mov(s, TCG_TYPE_I32, data_reg, TCG_REG_EAX);
break; break;
case 3: case 3:
if (data_reg == TCG_REG_EDX) { if (data_reg == TCG_REG_EDX) {
/* xchg %edx, %eax */ /* xchg %edx, %eax */
tcg_out_opc(s, OPC_XCHG_ax_r32 + TCG_REG_EDX); tcg_out_opc(s, OPC_XCHG_ax_r32 + TCG_REG_EDX);
tcg_out_mov(s, data_reg2, TCG_REG_EAX); tcg_out_mov(s, TCG_TYPE_I32, data_reg2, TCG_REG_EAX);
} else { } else {
tcg_out_mov(s, data_reg, TCG_REG_EAX); tcg_out_mov(s, TCG_TYPE_I32, data_reg, TCG_REG_EAX);
tcg_out_mov(s, data_reg2, TCG_REG_EDX); tcg_out_mov(s, TCG_TYPE_I32, data_reg2, TCG_REG_EDX);
} }
break; break;
} }
...@@ -945,7 +945,7 @@ static void tcg_out_qemu_st_direct(TCGContext *s, int datalo, int datahi, ...@@ -945,7 +945,7 @@ static void tcg_out_qemu_st_direct(TCGContext *s, int datalo, int datahi,
break; break;
case 1: case 1:
if (bswap) { if (bswap) {
tcg_out_mov(s, scratch, datalo); tcg_out_mov(s, TCG_TYPE_I32, scratch, datalo);
tcg_out_rolw_8(s, scratch); tcg_out_rolw_8(s, scratch);
datalo = scratch; datalo = scratch;
} }
...@@ -955,7 +955,7 @@ static void tcg_out_qemu_st_direct(TCGContext *s, int datalo, int datahi, ...@@ -955,7 +955,7 @@ static void tcg_out_qemu_st_direct(TCGContext *s, int datalo, int datahi,
break; break;
case 2: case 2:
if (bswap) { if (bswap) {
tcg_out_mov(s, scratch, datalo); tcg_out_mov(s, TCG_TYPE_I32, scratch, datalo);
tcg_out_bswap32(s, scratch); tcg_out_bswap32(s, scratch);
datalo = scratch; datalo = scratch;
} }
...@@ -963,10 +963,10 @@ static void tcg_out_qemu_st_direct(TCGContext *s, int datalo, int datahi, ...@@ -963,10 +963,10 @@ static void tcg_out_qemu_st_direct(TCGContext *s, int datalo, int datahi,
break; break;
case 3: case 3:
if (bswap) { if (bswap) {
tcg_out_mov(s, scratch, datahi); tcg_out_mov(s, TCG_TYPE_I32, scratch, datahi);
tcg_out_bswap32(s, scratch); tcg_out_bswap32(s, scratch);
tcg_out_st(s, TCG_TYPE_I32, scratch, base, ofs); tcg_out_st(s, TCG_TYPE_I32, scratch, base, ofs);
tcg_out_mov(s, scratch, datalo); tcg_out_mov(s, TCG_TYPE_I32, scratch, datalo);
tcg_out_bswap32(s, scratch); tcg_out_bswap32(s, scratch);
tcg_out_st(s, TCG_TYPE_I32, scratch, base, ofs + 4); tcg_out_st(s, TCG_TYPE_I32, scratch, base, ofs + 4);
} else { } else {
...@@ -1022,9 +1022,9 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, ...@@ -1022,9 +1022,9 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args,
/* XXX: move that code at the end of the TB */ /* XXX: move that code at the end of the TB */
if (TARGET_LONG_BITS == 32) { if (TARGET_LONG_BITS == 32) {
tcg_out_mov(s, TCG_REG_EDX, data_reg); tcg_out_mov(s, TCG_TYPE_I32, TCG_REG_EDX, data_reg);
if (opc == 3) { if (opc == 3) {
tcg_out_mov(s, TCG_REG_ECX, data_reg2); tcg_out_mov(s, TCG_TYPE_I32, TCG_REG_ECX, data_reg2);
tcg_out_pushi(s, mem_index); tcg_out_pushi(s, mem_index);
stack_adjust = 4; stack_adjust = 4;
} else { } else {
...@@ -1033,13 +1033,13 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, ...@@ -1033,13 +1033,13 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args,
} }
} else { } else {
if (opc == 3) { if (opc == 3) {
tcg_out_mov(s, TCG_REG_EDX, args[addrlo_idx + 1]); tcg_out_mov(s, TCG_TYPE_I32, TCG_REG_EDX, args[addrlo_idx + 1]);
tcg_out_pushi(s, mem_index); tcg_out_pushi(s, mem_index);
tcg_out_push(s, data_reg2); tcg_out_push(s, data_reg2);
tcg_out_push(s, data_reg); tcg_out_push(s, data_reg);
stack_adjust = 12; stack_adjust = 12;
} else { } else {
tcg_out_mov(s, TCG_REG_EDX, args[addrlo_idx + 1]); tcg_out_mov(s, TCG_TYPE_I32, TCG_REG_EDX, args[addrlo_idx + 1]);
switch(opc) { switch(opc) {
case 0: case 0:
tcg_out_ext8u(s, TCG_REG_ECX, data_reg); tcg_out_ext8u(s, TCG_REG_ECX, data_reg);
...@@ -1048,7 +1048,7 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, ...@@ -1048,7 +1048,7 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args,
tcg_out_ext16u(s, TCG_REG_ECX, data_reg); tcg_out_ext16u(s, TCG_REG_ECX, data_reg);
break; break;
case 2: case 2:
tcg_out_mov(s, TCG_REG_ECX, data_reg); tcg_out_mov(s, TCG_TYPE_I32, TCG_REG_ECX, data_reg);
break; break;
} }
tcg_out_pushi(s, mem_index); tcg_out_pushi(s, mem_index);
......
...@@ -827,7 +827,8 @@ static inline void tcg_out_bundle(TCGContext *s, int template, ...@@ -827,7 +827,8 @@ static inline void tcg_out_bundle(TCGContext *s, int template,
s->code_ptr += 16; s->code_ptr += 16;
} }
static inline void tcg_out_mov(TCGContext *s, TCGArg ret, TCGArg arg) static inline void tcg_out_mov(TCGContext *s, TCGType type,
TCGArg ret, TCGArg arg)
{ {
tcg_out_bundle(s, mmI, tcg_out_bundle(s, mmI,
tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0), tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
......
...@@ -377,7 +377,7 @@ static inline void tcg_out_nop(TCGContext *s) ...@@ -377,7 +377,7 @@ static inline void tcg_out_nop(TCGContext *s)
tcg_out32(s, 0); tcg_out32(s, 0);
} }
static inline void tcg_out_mov(TCGContext *s, int ret, int arg) static inline void tcg_out_mov(TCGContext *s, TCGType type, int ret, int arg)
{ {
tcg_out_opc_reg(s, OPC_ADDU, ret, arg, TCG_REG_ZERO); tcg_out_opc_reg(s, OPC_ADDU, ret, arg, TCG_REG_ZERO);
} }
...@@ -849,9 +849,9 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, ...@@ -849,9 +849,9 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args,
/* slow path */ /* slow path */
sp_args = TCG_REG_A0; sp_args = TCG_REG_A0;
tcg_out_mov(s, sp_args++, addr_reg1); tcg_out_mov(s, TCG_TYPE_I32, sp_args++, addr_reg1);
# if TARGET_LONG_BITS == 64 # if TARGET_LONG_BITS == 64
tcg_out_mov(s, sp_args++, addr_reg2); tcg_out_mov(s, TCG_TYPE_I32, sp_args++, addr_reg2);
# endif # endif
tcg_out_movi(s, TCG_TYPE_I32, sp_args++, mem_index); tcg_out_movi(s, TCG_TYPE_I32, sp_args++, mem_index);
tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_T9, (tcg_target_long)qemu_ld_helpers[s_bits]); tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_T9, (tcg_target_long)qemu_ld_helpers[s_bits]);
...@@ -872,11 +872,11 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, ...@@ -872,11 +872,11 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args,
tcg_out_ext16s(s, data_reg1, TCG_REG_V0); tcg_out_ext16s(s, data_reg1, TCG_REG_V0);
break; break;
case 2: case 2:
tcg_out_mov(s, data_reg1, TCG_REG_V0); tcg_out_mov(s, TCG_TYPE_I32, data_reg1, TCG_REG_V0);
break; break;
case 3: case 3:
tcg_out_mov(s, data_reg2, TCG_REG_V1); tcg_out_mov(s, TCG_TYPE_I32, data_reg2, TCG_REG_V1);
tcg_out_mov(s, data_reg1, TCG_REG_V0); tcg_out_mov(s, TCG_TYPE_I32, data_reg1, TCG_REG_V0);
break; break;
default: default:
tcg_abort(); tcg_abort();
...@@ -1035,9 +1035,9 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, ...@@ -1035,9 +1035,9 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args,
/* slow path */ /* slow path */
sp_args = TCG_REG_A0; sp_args = TCG_REG_A0;
tcg_out_mov(s, sp_args++, addr_reg1); tcg_out_mov(s, TCG_TYPE_I32, sp_args++, addr_reg1);
# if TARGET_LONG_BITS == 64 # if TARGET_LONG_BITS == 64
tcg_out_mov(s, sp_args++, addr_reg2); tcg_out_mov(s, TCG_TYPE_I32, sp_args++, addr_reg2);
# endif # endif
switch(opc) { switch(opc) {
case 0: case 0:
...@@ -1047,12 +1047,12 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, ...@@ -1047,12 +1047,12 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args,
tcg_out_opc_imm(s, OPC_ANDI, sp_args++, data_reg1, 0xffff); tcg_out_opc_imm(s, OPC_ANDI, sp_args++, data_reg1, 0xffff);
break; break;
case 2: case 2:
tcg_out_mov(s, sp_args++, data_reg1); tcg_out_mov(s, TCG_TYPE_I32, sp_args++, data_reg1);
break; break;
case 3: case 3:
sp_args = (sp_args + 1) & ~1; sp_args = (sp_args + 1) & ~1;
tcg_out_mov(s, sp_args++, data_reg1); tcg_out_mov(s, TCG_TYPE_I32, sp_args++, data_reg1);
tcg_out_mov(s, sp_args++, data_reg2); tcg_out_mov(s, TCG_TYPE_I32, sp_args++, data_reg2);
break; break;
default: default:
tcg_abort(); tcg_abort();
...@@ -1165,7 +1165,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, ...@@ -1165,7 +1165,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
break; break;
case INDEX_op_mov_i32: case INDEX_op_mov_i32:
tcg_out_mov(s, args[0], args[1]); tcg_out_mov(s, TCG_TYPE_I32, args[0], args[1]);
break; break;
case INDEX_op_movi_i32: case INDEX_op_movi_i32:
tcg_out_movi(s, TCG_TYPE_I32, args[0], args[1]); tcg_out_movi(s, TCG_TYPE_I32, args[0], args[1]);
...@@ -1216,7 +1216,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, ...@@ -1216,7 +1216,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
tcg_out_opc_reg(s, OPC_ADDU, args[1], args[3], args[5]); tcg_out_opc_reg(s, OPC_ADDU, args[1], args[3], args[5]);
} }
tcg_out_opc_reg(s, OPC_ADDU, args[1], args[1], TCG_REG_T0); tcg_out_opc_reg(s, OPC_ADDU, args[1], args[1], TCG_REG_T0);
tcg_out_mov(s, args[0], TCG_REG_AT); tcg_out_mov(s, TCG_TYPE_I32, args[0], TCG_REG_AT);
break; break;
case INDEX_op_sub_i32: case INDEX_op_sub_i32:
if (const_args[2]) { if (const_args[2]) {
...@@ -1238,7 +1238,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, ...@@ -1238,7 +1238,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
tcg_out_opc_reg(s, OPC_SUBU, args[1], args[3], args[5]); tcg_out_opc_reg(s, OPC_SUBU, args[1], args[3], args[5]);
} }
tcg_out_opc_reg(s, OPC_SUBU, args[1], args[1], TCG_REG_T0); tcg_out_opc_reg(s, OPC_SUBU, args[1], args[1], TCG_REG_T0);
tcg_out_mov(s, args[0], TCG_REG_AT); tcg_out_mov(s, TCG_TYPE_I32, args[0], TCG_REG_AT);
break; break;
case INDEX_op_mul_i32: case INDEX_op_mul_i32:
tcg_out_opc_reg(s, OPC_MULT, 0, args[1], args[2]); tcg_out_opc_reg(s, OPC_MULT, 0, args[1], args[2]);
......
...@@ -437,7 +437,7 @@ static const uint32_t tcg_to_bc[10] = { ...@@ -437,7 +437,7 @@ static const uint32_t tcg_to_bc[10] = {
[TCG_COND_GTU] = BC | BI (7, CR_GT) | BO_COND_TRUE, [TCG_COND_GTU] = BC | BI (7, CR_GT) | BO_COND_TRUE,
}; };
static void tcg_out_mov(TCGContext *s, int ret, int arg) static void tcg_out_mov(TCGContext *s, TCGType type, int ret, int arg)
{ {
tcg_out32 (s, OR | SAB (arg, ret, arg)); tcg_out32 (s, OR | SAB (arg, ret, arg));
} }
...@@ -591,11 +591,11 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc) ...@@ -591,11 +591,11 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc)
/* slow path */ /* slow path */
#if TARGET_LONG_BITS == 32 #if TARGET_LONG_BITS == 32
tcg_out_mov (s, 3, addr_reg); tcg_out_mov (s, TCG_TYPE_I32, 3, addr_reg);
tcg_out_movi (s, TCG_TYPE_I32, 4, mem_index); tcg_out_movi (s, TCG_TYPE_I32, 4, mem_index);
#else #else
tcg_out_mov (s, 3, addr_reg2); tcg_out_mov (s, TCG_TYPE_I32, 3, addr_reg2);
tcg_out_mov (s, 4, addr_reg); tcg_out_mov (s, TCG_TYPE_I32, 4, addr_reg);
tcg_out_movi (s, TCG_TYPE_I32, 5, mem_index); tcg_out_movi (s, TCG_TYPE_I32, 5, mem_index);
#endif #endif
...@@ -611,23 +611,23 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc) ...@@ -611,23 +611,23 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc)
case 1: case 1:
case 2: case 2:
if (data_reg != 3) if (data_reg != 3)
tcg_out_mov (s, data_reg, 3); tcg_out_mov (s, TCG_TYPE_I32, data_reg, 3);
break; break;
case 3: case 3:
if (data_reg == 3) { if (data_reg == 3) {
if (data_reg2 == 4) { if (data_reg2 == 4) {
tcg_out_mov (s, 0, 4); tcg_out_mov (s, TCG_TYPE_I32, 0, 4);
tcg_out_mov (s, 4, 3); tcg_out_mov (s, TCG_TYPE_I32, 4, 3);
tcg_out_mov (s, 3, 0); tcg_out_mov (s, TCG_TYPE_I32, 3, 0);
} }
else { else {
tcg_out_mov (s, data_reg2, 3); tcg_out_mov (s, TCG_TYPE_I32, data_reg2, 3);
tcg_out_mov (s, 3, 4); tcg_out_mov (s, TCG_TYPE_I32, 3, 4);
} }
} }
else { else {
if (data_reg != 4) tcg_out_mov (s, data_reg, 4); if (data_reg != 4) tcg_out_mov (s, TCG_TYPE_I32, data_reg, 4);
if (data_reg2 != 3) tcg_out_mov (s, data_reg2, 3); if (data_reg2 != 3) tcg_out_mov (s, TCG_TYPE_I32, data_reg2, 3);
} }
break; break;
} }
...@@ -705,7 +705,7 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc) ...@@ -705,7 +705,7 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc)
if (r0 == data_reg2) { if (r0 == data_reg2) {
tcg_out32 (s, LWZ | RT (0) | RA (r0)); tcg_out32 (s, LWZ | RT (0) | RA (r0));
tcg_out32 (s, LWZ | RT (data_reg) | RA (r0) | 4); tcg_out32 (s, LWZ | RT (data_reg) | RA (r0) | 4);
tcg_out_mov (s, data_reg2, 0); tcg_out_mov (s, TCG_TYPE_I32, data_reg2, 0);
} }
else { else {
tcg_out32 (s, LWZ | RT (data_reg2) | RA (r0)); tcg_out32 (s, LWZ | RT (data_reg2) | RA (r0));
...@@ -787,11 +787,11 @@ static void tcg_out_qemu_st (TCGContext *s, const TCGArg *args, int opc) ...@@ -787,11 +787,11 @@ static void tcg_out_qemu_st (TCGContext *s, const TCGArg *args, int opc)
/* slow path */ /* slow path */
#if TARGET_LONG_BITS == 32 #if TARGET_LONG_BITS == 32
tcg_out_mov (s, 3, addr_reg); tcg_out_mov (s, TCG_TYPE_I32, 3, addr_reg);
ir = 4; ir = 4;
#else #else
tcg_out_mov (s, 3, addr_reg2); tcg_out_mov (s, TCG_TYPE_I32, 3, addr_reg2);
tcg_out_mov (s, 4, addr_reg); tcg_out_mov (s, TCG_TYPE_I32, 4, addr_reg);
#ifdef TCG_TARGET_CALL_ALIGN_ARGS #ifdef TCG_TARGET_CALL_ALIGN_ARGS
ir = 5; ir = 5;
#else #else
...@@ -817,14 +817,14 @@ static void tcg_out_qemu_st (TCGContext *s, const TCGArg *args, int opc) ...@@ -817,14 +817,14 @@ static void tcg_out_qemu_st (TCGContext *s, const TCGArg *args, int opc)
| ME (31))); | ME (31)));
break; break;
case 2: case 2:
tcg_out_mov (s, ir, data_reg); tcg_out_mov (s, TCG_TYPE_I32, ir, data_reg);
break; break;
case 3: case 3:
#ifdef TCG_TARGET_CALL_ALIGN_ARGS #ifdef TCG_TARGET_CALL_ALIGN_ARGS
ir = 5; ir = 5;
#endif #endif
tcg_out_mov (s, ir++, data_reg2); tcg_out_mov (s, TCG_TYPE_I32, ir++, data_reg2);
tcg_out_mov (s, ir, data_reg); tcg_out_mov (s, TCG_TYPE_I32, ir, data_reg);
break; break;
} }
ir++; ir++;
...@@ -1526,7 +1526,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, ...@@ -1526,7 +1526,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
if (args[0] == args[2] || args[0] == args[3]) { if (args[0] == args[2] || args[0] == args[3]) {
tcg_out32 (s, MULLW | TAB (0, args[2], args[3])); tcg_out32 (s, MULLW | TAB (0, args[2], args[3]));
tcg_out32 (s, MULHWU | TAB (args[1], args[2], args[3])); tcg_out32 (s, MULHWU | TAB (args[1], args[2], args[3]));
tcg_out_mov (s, args[0], 0); tcg_out_mov (s, TCG_TYPE_I32, args[0], 0);
} }
else { else {
tcg_out32 (s, MULLW | TAB (args[0], args[2], args[3])); tcg_out32 (s, MULLW | TAB (args[0], args[2], args[3]));
...@@ -1584,7 +1584,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, ...@@ -1584,7 +1584,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
case INDEX_op_rotr_i32: case INDEX_op_rotr_i32:
if (const_args[2]) { if (const_args[2]) {
if (!args[2]) { if (!args[2]) {
tcg_out_mov (s, args[0], args[1]); tcg_out_mov (s, TCG_TYPE_I32, args[0], args[1]);
} }
else { else {
tcg_out32 (s, RLWINM tcg_out32 (s, RLWINM
...@@ -1612,7 +1612,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, ...@@ -1612,7 +1612,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
if (args[0] == args[3] || args[0] == args[5]) { if (args[0] == args[3] || args[0] == args[5]) {
tcg_out32 (s, ADDC | TAB (0, args[2], args[4])); tcg_out32 (s, ADDC | TAB (0, args[2], args[4]));
tcg_out32 (s, ADDE | TAB (args[1], args[3], args[5])); tcg_out32 (s, ADDE | TAB (args[1], args[3], args[5]));
tcg_out_mov (s, args[0], 0); tcg_out_mov (s, TCG_TYPE_I32, args[0], 0);
} }
else { else {
tcg_out32 (s, ADDC | TAB (args[0], args[2], args[4])); tcg_out32 (s, ADDC | TAB (args[0], args[2], args[4]));
...@@ -1623,7 +1623,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, ...@@ -1623,7 +1623,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
if (args[0] == args[3] || args[0] == args[5]) { if (args[0] == args[3] || args[0] == args[5]) {
tcg_out32 (s, SUBFC | TAB (0, args[4], args[2])); tcg_out32 (s, SUBFC | TAB (0, args[4], args[2]));
tcg_out32 (s, SUBFE | TAB (args[1], args[5], args[3])); tcg_out32 (s, SUBFE | TAB (args[1], args[5], args[3]));
tcg_out_mov (s, args[0], 0); tcg_out_mov (s, TCG_TYPE_I32, args[0], 0);
} }
else { else {
tcg_out32 (s, SUBFC | TAB (args[0], args[4], args[2])); tcg_out32 (s, SUBFC | TAB (args[0], args[4], args[2]));
...@@ -1782,7 +1782,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, ...@@ -1782,7 +1782,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
); );
if (!a0) { if (!a0) {
tcg_out_mov (s, args[0], a0); tcg_out_mov (s, TCG_TYPE_I32, args[0], a0);
} }
} }
break; break;
......
...@@ -435,7 +435,7 @@ static const uint32_t tcg_to_bc[10] = { ...@@ -435,7 +435,7 @@ static const uint32_t tcg_to_bc[10] = {
[TCG_COND_GTU] = BC | BI (7, CR_GT) | BO_COND_TRUE, [TCG_COND_GTU] = BC | BI (7, CR_GT) | BO_COND_TRUE,
}; };
static void tcg_out_mov (TCGContext *s, int ret, int arg) static void tcg_out_mov (TCGContext *s, TCGType type, int ret, int arg)
{ {
tcg_out32 (s, OR | SAB (arg, ret, arg)); tcg_out32 (s, OR | SAB (arg, ret, arg));
} }
...@@ -644,7 +644,7 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc) ...@@ -644,7 +644,7 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc)
#endif #endif
/* slow path */ /* slow path */
tcg_out_mov (s, 3, addr_reg); tcg_out_mov (s, TCG_TYPE_I64, 3, addr_reg);
tcg_out_movi (s, TCG_TYPE_I64, 4, mem_index); tcg_out_movi (s, TCG_TYPE_I64, 4, mem_index);
tcg_out_call (s, (tcg_target_long) qemu_ld_helpers[s_bits], 1); tcg_out_call (s, (tcg_target_long) qemu_ld_helpers[s_bits], 1);
...@@ -664,7 +664,7 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc) ...@@ -664,7 +664,7 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc)
case 2: case 2:
case 3: case 3:
if (data_reg != 3) if (data_reg != 3)
tcg_out_mov (s, data_reg, 3); tcg_out_mov (s, TCG_TYPE_I64, data_reg, 3);
break; break;
} }
label2_ptr = s->code_ptr; label2_ptr = s->code_ptr;
...@@ -746,7 +746,7 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc) ...@@ -746,7 +746,7 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc)
else tcg_out32 (s, LDX | TAB (data_reg, rbase, r0)); else tcg_out32 (s, LDX | TAB (data_reg, rbase, r0));
#else #else
if (bswap) { if (bswap) {
tcg_out_movi32 (s, 0, 4); tcg_out_movi32 (s, TCG_TYPE_I64, 0, 4);
tcg_out32 (s, LWBRX | RT (data_reg) | RB (r0)); tcg_out32 (s, LWBRX | RT (data_reg) | RB (r0));
tcg_out32 (s, LWBRX | RT ( r1) | RA (r0)); tcg_out32 (s, LWBRX | RT ( r1) | RA (r0));
tcg_out_rld (s, RLDIMI, data_reg, r1, 32, 0); tcg_out_rld (s, RLDIMI, data_reg, r1, 32, 0);
...@@ -790,7 +790,7 @@ static void tcg_out_qemu_st (TCGContext *s, const TCGArg *args, int opc) ...@@ -790,7 +790,7 @@ static void tcg_out_qemu_st (TCGContext *s, const TCGArg *args, int opc)
#endif #endif
/* slow path */ /* slow path */
tcg_out_mov (s, 3, addr_reg); tcg_out_mov (s, TCG_TYPE_I64, 3, addr_reg);
tcg_out_rld (s, RLDICL, 4, data_reg, 0, 64 - (1 << (3 + opc))); tcg_out_rld (s, RLDICL, 4, data_reg, 0, 64 - (1 << (3 + opc)));
tcg_out_movi (s, TCG_TYPE_I64, 5, mem_index); tcg_out_movi (s, TCG_TYPE_I64, 5, mem_index);
......
...@@ -94,7 +94,7 @@ void tcg_target_qemu_prologue(TCGContext *s) ...@@ -94,7 +94,7 @@ void tcg_target_qemu_prologue(TCGContext *s)
/* gets called with KVM */ /* gets called with KVM */
} }
static inline void tcg_out_mov(TCGContext *s, int ret, int arg) static inline void tcg_out_mov(TCGContext *s, TCGType type, int ret, int arg)
{ {
tcg_abort(); tcg_abort();
} }
......
...@@ -304,7 +304,7 @@ static void tcg_out_arithc(TCGContext *s, int rd, int rs1, ...@@ -304,7 +304,7 @@ static void tcg_out_arithc(TCGContext *s, int rd, int rs1,
| (val2const ? INSN_IMM13(val2) : INSN_RS2(val2))); | (val2const ? INSN_IMM13(val2) : INSN_RS2(val2)));
} }
static inline void tcg_out_mov(TCGContext *s, int ret, int arg) static inline void tcg_out_mov(TCGContext *s, TCGType type, int ret, int arg)
{ {
tcg_out_arith(s, ret, arg, TCG_REG_G0, ARITH_OR); tcg_out_arith(s, ret, arg, TCG_REG_G0, ARITH_OR);
} }
...@@ -795,7 +795,7 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, ...@@ -795,7 +795,7 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args,
tcg_out32(s, 0); tcg_out32(s, 0);
/* mov (delay slot) */ /* mov (delay slot) */
tcg_out_mov(s, arg0, addr_reg); tcg_out_mov(s, TCG_TYPE_PTR, arg0, addr_reg);
/* mov */ /* mov */
tcg_out_movi(s, TCG_TYPE_I32, arg1, mem_index); tcg_out_movi(s, TCG_TYPE_I32, arg1, mem_index);
...@@ -845,7 +845,7 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, ...@@ -845,7 +845,7 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args,
case 3: case 3:
default: default:
/* mov */ /* mov */
tcg_out_mov(s, data_reg, arg0); tcg_out_mov(s, TCG_TYPE_REG, data_reg, arg0);
break; break;
} }
...@@ -1007,10 +1007,10 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, ...@@ -1007,10 +1007,10 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args,
tcg_out32(s, 0); tcg_out32(s, 0);
/* mov (delay slot) */ /* mov (delay slot) */
tcg_out_mov(s, arg0, addr_reg); tcg_out_mov(s, TCG_TYPE_PTR, arg0, addr_reg);
/* mov */ /* mov */
tcg_out_mov(s, arg1, data_reg); tcg_out_mov(s, TCG_TYPE_REG, arg1, data_reg);
/* mov */ /* mov */
tcg_out_movi(s, TCG_TYPE_I32, arg2, mem_index); tcg_out_movi(s, TCG_TYPE_I32, arg2, mem_index);
......
...@@ -1547,7 +1547,7 @@ static void tcg_reg_alloc_mov(TCGContext *s, const TCGOpDef *def, ...@@ -1547,7 +1547,7 @@ static void tcg_reg_alloc_mov(TCGContext *s, const TCGOpDef *def,
reg = tcg_reg_alloc(s, arg_ct->u.regs, s->reserved_regs); reg = tcg_reg_alloc(s, arg_ct->u.regs, s->reserved_regs);
} }
if (ts->reg != reg) { if (ts->reg != reg) {
tcg_out_mov(s, reg, ts->reg); tcg_out_mov(s, ots->type, reg, ts->reg);
} }
} }
} else if (ts->val_type == TEMP_VAL_MEM) { } else if (ts->val_type == TEMP_VAL_MEM) {
...@@ -1652,7 +1652,7 @@ static void tcg_reg_alloc_op(TCGContext *s, ...@@ -1652,7 +1652,7 @@ static void tcg_reg_alloc_op(TCGContext *s,
/* allocate a new register matching the constraint /* allocate a new register matching the constraint
and move the temporary register into it */ and move the temporary register into it */
reg = tcg_reg_alloc(s, arg_ct->u.regs, allocated_regs); reg = tcg_reg_alloc(s, arg_ct->u.regs, allocated_regs);
tcg_out_mov(s, reg, ts->reg); tcg_out_mov(s, ts->type, reg, ts->reg);
} }
new_args[i] = reg; new_args[i] = reg;
const_args[i] = 0; const_args[i] = 0;
...@@ -1734,7 +1734,7 @@ static void tcg_reg_alloc_op(TCGContext *s, ...@@ -1734,7 +1734,7 @@ static void tcg_reg_alloc_op(TCGContext *s,
ts = &s->temps[args[i]]; ts = &s->temps[args[i]];
reg = new_args[i]; reg = new_args[i];
if (ts->fixed_reg && ts->reg != reg) { if (ts->fixed_reg && ts->reg != reg) {
tcg_out_mov(s, ts->reg, reg); tcg_out_mov(s, ts->type, ts->reg, reg);
} }
} }
} }
...@@ -1820,7 +1820,7 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def, ...@@ -1820,7 +1820,7 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def,
tcg_reg_free(s, reg); tcg_reg_free(s, reg);
if (ts->val_type == TEMP_VAL_REG) { if (ts->val_type == TEMP_VAL_REG) {
if (ts->reg != reg) { if (ts->reg != reg) {
tcg_out_mov(s, reg, ts->reg); tcg_out_mov(s, ts->type, reg, ts->reg);
} }
} else if (ts->val_type == TEMP_VAL_MEM) { } else if (ts->val_type == TEMP_VAL_MEM) {
tcg_out_ld(s, ts->type, reg, ts->mem_reg, ts->mem_offset); tcg_out_ld(s, ts->type, reg, ts->mem_reg, ts->mem_offset);
...@@ -1849,7 +1849,7 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def, ...@@ -1849,7 +1849,7 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def,
reg = ts->reg; reg = ts->reg;
if (!tcg_regset_test_reg(arg_ct->u.regs, reg)) { if (!tcg_regset_test_reg(arg_ct->u.regs, reg)) {
reg = tcg_reg_alloc(s, arg_ct->u.regs, allocated_regs); reg = tcg_reg_alloc(s, arg_ct->u.regs, allocated_regs);
tcg_out_mov(s, reg, ts->reg); tcg_out_mov(s, ts->type, reg, ts->reg);
} }
func_arg = reg; func_arg = reg;
tcg_regset_set_reg(allocated_regs, reg); tcg_regset_set_reg(allocated_regs, reg);
...@@ -1908,7 +1908,7 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def, ...@@ -1908,7 +1908,7 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def,
assert(s->reg_to_temp[reg] == -1); assert(s->reg_to_temp[reg] == -1);
if (ts->fixed_reg) { if (ts->fixed_reg) {
if (ts->reg != reg) { if (ts->reg != reg) {
tcg_out_mov(s, ts->reg, reg); tcg_out_mov(s, ts->type, ts->reg, reg);
} }
} else { } else {
if (ts->val_type == TEMP_VAL_REG) if (ts->val_type == TEMP_VAL_REG)
......
...@@ -101,11 +101,18 @@ typedef enum TCGType { ...@@ -101,11 +101,18 @@ typedef enum TCGType {
TCG_TYPE_I64, TCG_TYPE_I64,
TCG_TYPE_COUNT, /* number of different types */ TCG_TYPE_COUNT, /* number of different types */
/* An alias for the size of the host register. */
#if TCG_TARGET_REG_BITS == 32 #if TCG_TARGET_REG_BITS == 32
TCG_TYPE_PTR = TCG_TYPE_I32, TCG_TYPE_REG = TCG_TYPE_I32,
#else #else
TCG_TYPE_PTR = TCG_TYPE_I64, TCG_TYPE_REG = TCG_TYPE_I64,
#endif #endif
/* An alias for the size of the native pointer. We don't currently
support any hosts with 64-bit registers and 32-bit pointers. */
TCG_TYPE_PTR = TCG_TYPE_REG,
/* An alias for the size of the target "long", aka register. */
#if TARGET_LONG_BITS == 64 #if TARGET_LONG_BITS == 64
TCG_TYPE_TL = TCG_TYPE_I64, TCG_TYPE_TL = TCG_TYPE_I64,
#else #else
......
...@@ -354,9 +354,10 @@ static void tcg_out_modrm_offset2(TCGContext *s, int opc, int r, int rm, ...@@ -354,9 +354,10 @@ static void tcg_out_modrm_offset2(TCGContext *s, int opc, int r, int rm,
} }
#endif #endif
static inline void tcg_out_mov(TCGContext *s, int ret, int arg) static inline void tcg_out_mov(TCGContext *s, TCGType type, int ret, int arg)
{ {
tcg_out_modrm(s, 0x8b | P_REXW, ret, arg); int rexw = (type == TCG_TYPE_I64 ? P_REXW : 0);
tcg_out_modrm(s, 0x8b | rexw, ret, arg);
} }
static inline void tcg_out_movi(TCGContext *s, TCGType type, static inline void tcg_out_movi(TCGContext *s, TCGType type,
...@@ -577,11 +578,8 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, ...@@ -577,11 +578,8 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args,
rexw = P_REXW; rexw = P_REXW;
#endif #endif
#if defined(CONFIG_SOFTMMU) #if defined(CONFIG_SOFTMMU)
/* mov */ tcg_out_mov(s, TCG_TYPE_TL, r1, addr_reg);
tcg_out_modrm(s, 0x8b | rexw, r1, addr_reg); tcg_out_mov(s, TCG_TYPE_TL, r0, addr_reg);
/* mov */
tcg_out_modrm(s, 0x8b | rexw, r0, addr_reg);
tcg_out_modrm(s, 0xc1 | rexw, 5, r1); /* shr $x, r1 */ tcg_out_modrm(s, 0xc1 | rexw, 5, r1); /* shr $x, r1 */
tcg_out8(s, TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS); tcg_out8(s, TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS);
...@@ -599,8 +597,7 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, ...@@ -599,8 +597,7 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args,
/* cmp 0(r1), r0 */ /* cmp 0(r1), r0 */
tcg_out_modrm_offset(s, 0x3b | rexw, r0, r1, 0); tcg_out_modrm_offset(s, 0x3b | rexw, r0, r1, 0);
/* mov */ tcg_out_mov(s, TCG_TYPE_TL, r0, addr_reg);
tcg_out_modrm(s, 0x8b | rexw, r0, addr_reg);
/* je label1 */ /* je label1 */
tcg_out8(s, 0x70 + JCC_JE); tcg_out8(s, 0x70 + JCC_JE);
...@@ -634,11 +631,10 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, ...@@ -634,11 +631,10 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args,
break; break;
case 2: case 2:
default: default:
/* movl */ tcg_out_mov(s, TCG_TYPE_I32, data_reg, TCG_REG_RAX);
tcg_out_modrm(s, 0x8b, data_reg, TCG_REG_RAX);
break; break;
case 3: case 3:
tcg_out_mov(s, data_reg, TCG_REG_RAX); tcg_out_mov(s, TCG_TYPE_I64, data_reg, TCG_REG_RAX);
break; break;
} }
...@@ -772,11 +768,8 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, ...@@ -772,11 +768,8 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args,
rexw = P_REXW; rexw = P_REXW;
#endif #endif
#if defined(CONFIG_SOFTMMU) #if defined(CONFIG_SOFTMMU)
/* mov */ tcg_out_mov(s, TCG_TYPE_TL, r1, addr_reg);
tcg_out_modrm(s, 0x8b | rexw, r1, addr_reg); tcg_out_mov(s, TCG_TYPE_TL, r0, addr_reg);
/* mov */
tcg_out_modrm(s, 0x8b | rexw, r0, addr_reg);
tcg_out_modrm(s, 0xc1 | rexw, 5, r1); /* shr $x, r1 */ tcg_out_modrm(s, 0xc1 | rexw, 5, r1); /* shr $x, r1 */
tcg_out8(s, TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS); tcg_out8(s, TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS);
...@@ -794,8 +787,7 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, ...@@ -794,8 +787,7 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args,
/* cmp 0(r1), r0 */ /* cmp 0(r1), r0 */
tcg_out_modrm_offset(s, 0x3b | rexw, r0, r1, 0); tcg_out_modrm_offset(s, 0x3b | rexw, r0, r1, 0);
/* mov */ tcg_out_mov(s, TCG_TYPE_TL, r0, addr_reg);
tcg_out_modrm(s, 0x8b | rexw, r0, addr_reg);
/* je label1 */ /* je label1 */
tcg_out8(s, 0x70 + JCC_JE); tcg_out8(s, 0x70 + JCC_JE);
...@@ -813,12 +805,11 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, ...@@ -813,12 +805,11 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args,
tcg_out_modrm(s, 0xb7 | P_EXT, TCG_REG_RSI, data_reg); tcg_out_modrm(s, 0xb7 | P_EXT, TCG_REG_RSI, data_reg);
break; break;
case 2: case 2:
/* movl */ tcg_out_mov(s, TCG_TYPE_I32, TCG_REG_RSI, data_reg);
tcg_out_modrm(s, 0x8b, TCG_REG_RSI, data_reg);
break; break;
default: default:
case 3: case 3:
tcg_out_mov(s, TCG_REG_RSI, data_reg); tcg_out_mov(s, TCG_TYPE_I64, TCG_REG_RSI, data_reg);
break; break;
} }
tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_RDX, mem_index); tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_RDX, mem_index);
...@@ -863,7 +854,7 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, ...@@ -863,7 +854,7 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args,
break; break;
case 1: case 1:
if (bswap) { if (bswap) {
tcg_out_modrm(s, 0x8b, r1, data_reg); /* movl */ tcg_out_mov(s, TCG_TYPE_I32, r1, data_reg);
tcg_out8(s, 0x66); /* rolw $8, %ecx */ tcg_out8(s, 0x66); /* rolw $8, %ecx */
tcg_out_modrm(s, 0xc1, 0, r1); tcg_out_modrm(s, 0xc1, 0, r1);
tcg_out8(s, 8); tcg_out8(s, 8);
...@@ -875,7 +866,7 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, ...@@ -875,7 +866,7 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args,
break; break;
case 2: case 2:
if (bswap) { if (bswap) {
tcg_out_modrm(s, 0x8b, r1, data_reg); /* movl */ tcg_out_mov(s, TCG_TYPE_I32, r1, data_reg);
/* bswap data_reg */ /* bswap data_reg */
tcg_out_opc(s, (0xc8 + r1) | P_EXT, 0, r1, 0); tcg_out_opc(s, (0xc8 + r1) | P_EXT, 0, r1, 0);
data_reg = r1; data_reg = r1;
...@@ -885,7 +876,7 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, ...@@ -885,7 +876,7 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args,
break; break;
case 3: case 3:
if (bswap) { if (bswap) {
tcg_out_mov(s, r1, data_reg); tcg_out_mov(s, TCG_TYPE_I64, r1, data_reg);
/* bswap data_reg */ /* bswap data_reg */
tcg_out_opc(s, (0xc8 + r1) | P_EXT | P_REXW, 0, r1, 0); tcg_out_opc(s, (0xc8 + r1) | P_EXT | P_REXW, 0, r1, 0);
data_reg = r1; data_reg = r1;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册