Merge pull request #8133 from Sintendo/mov64imm32
x64Emitter: Emit shorter MOVs for 32-bit immediates
This commit is contained in:
commit
6e18dfb600
|
@ -1591,8 +1591,9 @@ void XEmitter::XOR(int bits, const OpArg& a1, const OpArg& a2)
|
||||||
}
|
}
|
||||||
void XEmitter::MOV(int bits, const OpArg& a1, const OpArg& a2)
|
void XEmitter::MOV(int bits, const OpArg& a1, const OpArg& a2)
|
||||||
{
|
{
|
||||||
if (bits == 64 && a1.IsSimpleReg() && a2.scale == SCALE_IMM64 &&
|
if (bits == 64 && a1.IsSimpleReg() &&
|
||||||
a2.offset == static_cast<u32>(a2.offset))
|
((a2.scale == SCALE_IMM64 && a2.offset == static_cast<u32>(a2.offset)) ||
|
||||||
|
(a2.scale == SCALE_IMM32 && static_cast<s32>(a2.offset) >= 0)))
|
||||||
{
|
{
|
||||||
WriteNormalOp(32, NormalOp::MOV, a1, a2.AsImm32());
|
WriteNormalOp(32, NormalOp::MOV, a1, a2.AsImm32());
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -554,7 +554,7 @@ TWO_OP_ARITH_TEST(OR)
|
||||||
TWO_OP_ARITH_TEST(XOR)
|
TWO_OP_ARITH_TEST(XOR)
|
||||||
TWO_OP_ARITH_TEST(MOV)
|
TWO_OP_ARITH_TEST(MOV)
|
||||||
|
|
||||||
TEST_F(x64EmitterTest, MOV_Imm64)
|
TEST_F(x64EmitterTest, MOV64)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < reg64names.size(); i++)
|
for (size_t i = 0; i < reg64names.size(); i++)
|
||||||
{
|
{
|
||||||
|
@ -569,6 +569,10 @@ TEST_F(x64EmitterTest, MOV_Imm64)
|
||||||
emitter->MOV(64, R(reg64names[i].reg), Imm64(0xDEADBEEF));
|
emitter->MOV(64, R(reg64names[i].reg), Imm64(0xDEADBEEF));
|
||||||
EXPECT_EQ(emitter->GetCodePtr(), code_buffer + 5 + (i > 7));
|
EXPECT_EQ(emitter->GetCodePtr(), code_buffer + 5 + (i > 7));
|
||||||
ExpectDisassembly("mov " + reg32names[i].name + ", 0xdeadbeef");
|
ExpectDisassembly("mov " + reg32names[i].name + ", 0xdeadbeef");
|
||||||
|
|
||||||
|
emitter->MOV(64, R(reg64names[i].reg), Imm32(0x7FFFFFFF));
|
||||||
|
EXPECT_EQ(emitter->GetCodePtr(), code_buffer + 5 + (i > 7));
|
||||||
|
ExpectDisassembly("mov " + reg32names[i].name + ", 0x7fffffff");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue