From bdfc472751caad9843b6527141264550df80bb6d Mon Sep 17 00:00:00 2001 From: Sintendo Date: Mon, 13 Jan 2020 00:10:46 +0100 Subject: [PATCH] x64Emitter: Refactor OpArg::WriteRest Shorter, displacement is now handled in one location. --- Source/Core/Common/x64Emitter.cpp | 82 +++++++++++-------------------- 1 file changed, 28 insertions(+), 54 deletions(-) diff --git a/Source/Core/Common/x64Emitter.cpp b/Source/Core/Common/x64Emitter.cpp index 169ffdc519..a90af4c288 100644 --- a/Source/Core/Common/x64Emitter.cpp +++ b/Source/Core/Common/x64Emitter.cpp @@ -270,71 +270,45 @@ void OpArg::WriteRest(XEmitter* emit, int extraBytes, X64Reg _operandReg, return; } - if (scale == 0) + if (scale == SCALE_NONE) { // Oh, no memory, Just a reg. mod = 3; // 11 } + else if (scale >= SCALE_NOBASE_2 && scale <= SCALE_NOBASE_8) + { + SIB = true; + mod = 0; + _offsetOrBaseReg = 5; + // Always has 32-bit displacement + } else { - // Ah good, no scaling. - if (scale == SCALE_ATREG && !((_offsetOrBaseReg & 7) == 4 || (_offsetOrBaseReg & 7) == 5)) - { - // Okay, we're good. No SIB necessary. - int ioff = (int)offset; - if (ioff == 0) - { - mod = 0; - } - else if (ioff < -128 || ioff > 127) - { - mod = 2; // 32-bit displacement - } - else - { - mod = 1; // 8-bit displacement - } - } - else if (scale >= SCALE_NOBASE_2 && scale <= SCALE_NOBASE_8) + if (scale != SCALE_ATREG) { SIB = true; - mod = 0; - _offsetOrBaseReg = 5; + } + else if ((_offsetOrBaseReg & 7) == 4) + { + // Special case for which SCALE_ATREG needs SIB + SIB = true; + ireg = _offsetOrBaseReg; + } + + // Okay, we're fine. Just disp encoding. + // We need displacement. Which size? + int ioff = (int)(s64)offset; + if (ioff == 0 && (_offsetOrBaseReg & 7) != 5) + { + mod = 0; // No displacement + } + else if (ioff >= -128 && ioff <= 127) + { + mod = 1; // 8-bit displacement } else { - if ((_offsetOrBaseReg & 7) == 4) // this would occupy the SIB encoding :( - { - // So we have to fake it with SIB encoding :( - SIB = true; - } - - if (scale >= SCALE_1 && scale < SCALE_ATREG) - { - SIB = true; - } - - if (scale == SCALE_ATREG && ((_offsetOrBaseReg & 7) == 4)) - { - SIB = true; - ireg = _offsetOrBaseReg; - } - - // Okay, we're fine. Just disp encoding. - // We need displacement. Which size? - int ioff = (int)(s64)offset; - if (ioff == 0 && (_offsetOrBaseReg & 7) != 5) - { - mod = 0; - } - else if (ioff < -128 || ioff > 127) - { - mod = 2; // 32-bit displacement - } - else - { - mod = 1; // 8-bit displacement - } + mod = 2; // 32-bit displacement } }