Permalink
Browse files

x64Emitter: short MOV for 64bit immediates (1)

Prior to this commit, the emitter would unconditionally emit a 10-byte
instruction known as MOVABS when loading a 64-bit immediate to a
register.

0:  48 b8 ef be ad de ff    movabs rax,0xffffffffdeadbeef
7:  ff ff ff

With this change, it will instead emit a 7-byte instruction when it is
possible to express the 64-bit immediate using a signed 32-bit value.

0:  48 c7 c0 ef be ad de    mov    rax,0xffffffffdeadbeef
  • Loading branch information...
Sintendo committed Sep 14, 2018
1 parent ce9e918 commit 575f1b309a4e6e9580bd62ab3c3e584811b4a9da
Showing with 14 additions and 4 deletions.
  1. +14 −4 Source/Core/Common/x64Emitter.cpp
@@ -1469,11 +1469,21 @@ void OpArg::WriteNormalOp(XEmitter* emit, bool toRM, NormalOp op, const OpArg& o
// mov reg64, imm64
else if (op == NormalOp::MOV)
{
emit->Write8(0xB8 + (offsetOrBaseReg & 7));
emit->Write64((u64)operand.offset);
return;
// movabs reg64, imm64 (10 bytes)
if (static_cast<s64>(operand.offset) != static_cast<s32>(operand.offset))
{
emit->Write8(0xB8 + (offsetOrBaseReg & 7));
emit->Write64(operand.offset);
return;
}
// mov reg64, simm32 (7 bytes)
emit->Write8(op_def.imm32);
immToWrite = 32;
}
else
{
ASSERT_MSG(DYNA_REC, 0, "WriteNormalOp - Only MOV can take 64-bit imm");
}
ASSERT_MSG(DYNA_REC, 0, "WriteNormalOp - Only MOV can take 64-bit imm");
}
else
{

0 comments on commit 575f1b3

Please sign in to comment.