x64Emitter: Short MOVs for 32bit immediates
Prior to this commit, the emitter would emit a 7-byte instruction when loading a 32-bit immediate to a 64-bit register. 0: 48 c7 c0 ff ff ff 7f mov rax,0x7fffffff With this change, it will check if it can instead emit a load to a 32-bit register, which takes only 5 or 6 bytes. 0: b8 ff ff ff 7f mov eax,0x7fffffff
This commit is contained in:
parent
992c8bfc4e
commit
c84f34bd50
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue