diff --git a/Source/Core/Common/x64Emitter.cpp b/Source/Core/Common/x64Emitter.cpp index 63c094ad6f..947e6e5614 100644 --- a/Source/Core/Common/x64Emitter.cpp +++ b/Source/Core/Common/x64Emitter.cpp @@ -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) { - if (bits == 64 && a1.IsSimpleReg() && a2.scale == SCALE_IMM64 && - a2.offset == static_cast(a2.offset)) + if (bits == 64 && a1.IsSimpleReg() && + ((a2.scale == SCALE_IMM64 && a2.offset == static_cast(a2.offset)) || + (a2.scale == SCALE_IMM32 && static_cast(a2.offset) >= 0))) { WriteNormalOp(32, NormalOp::MOV, a1, a2.AsImm32()); return; diff --git a/Source/UnitTests/Common/x64EmitterTest.cpp b/Source/UnitTests/Common/x64EmitterTest.cpp index 020e53afa2..dedac29df3 100644 --- a/Source/UnitTests/Common/x64EmitterTest.cpp +++ b/Source/UnitTests/Common/x64EmitterTest.cpp @@ -554,7 +554,7 @@ TWO_OP_ARITH_TEST(OR) TWO_OP_ARITH_TEST(XOR) TWO_OP_ARITH_TEST(MOV) -TEST_F(x64EmitterTest, MOV_Imm64) +TEST_F(x64EmitterTest, MOV64) { 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)); EXPECT_EQ(emitter->GetCodePtr(), code_buffer + 5 + (i > 7)); 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"); } }