mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-01-09 11:55:38 +00:00
tcg: Use tcg_out_dupi_vec from temp_load
Having dupi pass though movi is confusing and arguably wrong. Backports 0a6a8bc8ebfe5ae2a3f18ef48b92a74bc2df2f96
This commit is contained in:
parent
68f645dd4f
commit
c5c19529c5
|
@ -1004,12 +1004,6 @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd,
|
||||||
tcg_debug_assert(rd < 32);
|
tcg_debug_assert(rd < 32);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TCG_TYPE_V64:
|
|
||||||
case TCG_TYPE_V128:
|
|
||||||
tcg_debug_assert(rd >= 32);
|
|
||||||
tcg_out_dupi_vec(s, type, rd, value);
|
|
||||||
return;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
g_assert_not_reached();
|
g_assert_not_reached();
|
||||||
}
|
}
|
||||||
|
|
|
@ -981,30 +981,32 @@ static void tcg_out_dupi_vec(TCGContext *s, TCGType type,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tcg_out_movi(TCGContext *s, TCGType type,
|
static void tcg_out_movi_vec(TCGContext *s, TCGType type,
|
||||||
|
TCGReg ret, tcg_target_long arg)
|
||||||
|
{
|
||||||
|
if (arg == 0) {
|
||||||
|
tcg_out_vex_modrm(s, OPC_PXOR, ret, ret, ret);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (arg == -1) {
|
||||||
|
tcg_out_vex_modrm(s, OPC_PCMPEQB, ret, ret, ret);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int rexw = (type == TCG_TYPE_I32 ? 0 : P_REXW);
|
||||||
|
tcg_out_vex_modrm_pool(s, OPC_MOVD_VyEy + rexw, ret);
|
||||||
|
if (TCG_TARGET_REG_BITS == 64) {
|
||||||
|
new_pool_label(s, arg, R_386_PC32, s->code_ptr - 4, -4);
|
||||||
|
} else {
|
||||||
|
new_pool_label(s, arg, R_386_32, s->code_ptr - 4, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void tcg_out_movi_int(TCGContext *s, TCGType type,
|
||||||
TCGReg ret, tcg_target_long arg)
|
TCGReg ret, tcg_target_long arg)
|
||||||
{
|
{
|
||||||
tcg_target_long diff;
|
tcg_target_long diff;
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
case TCG_TYPE_I32:
|
|
||||||
#if TCG_TARGET_REG_BITS == 64
|
|
||||||
case TCG_TYPE_I64:
|
|
||||||
#endif
|
|
||||||
if (ret < 16) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* fallthru */
|
|
||||||
case TCG_TYPE_V64:
|
|
||||||
case TCG_TYPE_V128:
|
|
||||||
case TCG_TYPE_V256:
|
|
||||||
tcg_debug_assert(ret >= 16);
|
|
||||||
tcg_out_dupi_vec(s, type, ret, arg);
|
|
||||||
return;
|
|
||||||
default:
|
|
||||||
g_assert_not_reached();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (arg == 0) {
|
if (arg == 0) {
|
||||||
tgen_arithr(s, ARITH_XOR, ret, ret);
|
tgen_arithr(s, ARITH_XOR, ret, ret);
|
||||||
return;
|
return;
|
||||||
|
@ -1033,6 +1035,25 @@ static void tcg_out_movi(TCGContext *s, TCGType type,
|
||||||
tcg_out64(s, arg);
|
tcg_out64(s, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void tcg_out_movi(TCGContext *s, TCGType type,
|
||||||
|
TCGReg ret, tcg_target_long arg)
|
||||||
|
{
|
||||||
|
switch (type) {
|
||||||
|
case TCG_TYPE_I32:
|
||||||
|
#if TCG_TARGET_REG_BITS == 64
|
||||||
|
case TCG_TYPE_I64:
|
||||||
|
#endif
|
||||||
|
if (ret < 16) {
|
||||||
|
tcg_out_movi_int(s, type, ret, arg);
|
||||||
|
} else {
|
||||||
|
tcg_out_movi_vec(s, type, ret, arg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static inline void tcg_out_pushi(TCGContext *s, tcg_target_long val)
|
static inline void tcg_out_pushi(TCGContext *s, tcg_target_long val)
|
||||||
{
|
{
|
||||||
if (val == (int8_t)val) {
|
if (val == (int8_t)val) {
|
||||||
|
|
|
@ -2738,7 +2738,11 @@ static void temp_load(TCGContext *s, TCGTemp *ts, TCGRegSet desired_regs,
|
||||||
case TEMP_VAL_CONST:
|
case TEMP_VAL_CONST:
|
||||||
reg = tcg_reg_alloc(s, desired_regs, allocated_regs,
|
reg = tcg_reg_alloc(s, desired_regs, allocated_regs,
|
||||||
preferred_regs, ts->indirect_base);
|
preferred_regs, ts->indirect_base);
|
||||||
|
if (ts->type <= TCG_TYPE_I64) {
|
||||||
tcg_out_movi(s, ts->type, reg, ts->val);
|
tcg_out_movi(s, ts->type, reg, ts->val);
|
||||||
|
} else {
|
||||||
|
tcg_out_dupi_vec(s, ts->type, reg, ts->val);
|
||||||
|
}
|
||||||
ts->mem_coherent = 0;
|
ts->mem_coherent = 0;
|
||||||
break;
|
break;
|
||||||
case TEMP_VAL_MEM:
|
case TEMP_VAL_MEM:
|
||||||
|
|
Loading…
Reference in a new issue