summaryrefslogtreecommitdiff
path: root/Source/Core/Common
diff options
context:
space:
mode:
authorSintendo <bram.speeckaert@gmail.com>2020-01-12 23:48:16 +0100
committerSintendo <bram.speeckaert@gmail.com>2020-01-13 08:43:42 +0100
commitcde3a3b44865d6654884f7c9be691fdf64bc9927 (patch)
tree54905dcb4caa6436f2f364796ac3c037c530a3d2 /Source/Core/Common
parentd5cb85816593fb494808671f8a0d6481db538b9b (diff)
x64Emitter: Avoid 8-bit displacement when possible
Due to the way the ModRM encoding works on x86, memory addressing combinations involving RBP or R13 need an additional byte for an 8-bit displacement of zero. However, this was also applied in cases where it is unnecessary, effectively wasting a byte. - MatR with RSP or R12 8B 44 24 00 mov eax,dword ptr [rsp] 8B 04 24 mov eax,dword ptr [rsp] - MRegSum with base != RBP or R13 46 8D 7C 37 00 lea r15d,[rdi+r14] 46 8D 3C 37 lea r15d,[rdi+r14] - MComplex without offset 8B 4C CA 00 mov ecx,dword ptr [rdx+rcx*8] 8B 0C CA mov ecx,dword ptr [rdx+rcx*8]
Diffstat (limited to 'Source/Core/Common')
-rw-r--r--Source/Core/Common/x64Emitter.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/Source/Core/Common/x64Emitter.cpp b/Source/Core/Common/x64Emitter.cpp
index 947e6e5614..169ffdc519 100644
--- a/Source/Core/Common/x64Emitter.cpp
+++ b/Source/Core/Common/x64Emitter.cpp
@@ -323,7 +323,11 @@ void OpArg::WriteRest(XEmitter* emit, int extraBytes, X64Reg _operandReg,
// Okay, we're fine. Just disp encoding.
// We need displacement. Which size?
int ioff = (int)(s64)offset;
- if (ioff < -128 || ioff > 127)
+ if (ioff == 0 && (_offsetOrBaseReg & 7) != 5)
+ {
+ mod = 0;
+ }
+ else if (ioff < -128 || ioff > 127)
{
mod = 2; // 32-bit displacement
}