From 0f25a960eea5c281ca50828dcf71ed74c8b8f7bb Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Mon, 13 Nov 2023 07:56:43 -0400 Subject: [PATCH] OpcodeDispatcher: remove bfe for small shl imm We allow the garbage in flags calculation, it's ignored. Signed-off-by: Alyssa Rosenzweig --- FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp | 4 ---- FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp | 8 ++++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp b/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp index 8350dac8c..4f1480b6e 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp @@ -1679,10 +1679,6 @@ void OpDispatchBuilder::SHLImmediateOp(OpcodeArgs) { StoreResult(GPRClass, Op, Result, -1); - if (Size < 32) { - Result = _Bfe(OpSize::i32Bit, Size, 0, Result); - } - GenerateFlags_ShiftLeftImmediate(Op, Result, Dest, Shift); } diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp b/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp index b2d260692..17be9f163 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp @@ -806,13 +806,13 @@ void OpDispatchBuilder::CalculateFlags_SignShiftRight(uint8_t SrcSize, OrderedNo PossiblySetNZCVBits |= OldSetNZCVBits; } -void OpDispatchBuilder::CalculateFlags_ShiftLeftImmediate(uint8_t SrcSize, OrderedNode *Res, OrderedNode *Src1, uint64_t Shift) { +void OpDispatchBuilder::CalculateFlags_ShiftLeftImmediate(uint8_t SrcSize, OrderedNode *UnmaskedRes, OrderedNode *Src1, uint64_t Shift) { // No flags changed if shift is zero if (Shift == 0) return; auto OpSize = SrcSize == 8 ? OpSize::i64Bit : OpSize::i32Bit; - SetNZ_ZeroCV(SrcSize, Res); + SetNZ_ZeroCV(SrcSize, UnmaskedRes); // CF { @@ -824,7 +824,7 @@ void OpDispatchBuilder::CalculateFlags_ShiftLeftImmediate(uint8_t SrcSize, Order SetRFLAG(Src1, SrcSizeBits - Shift, true); } - CalculatePF(Res); + CalculatePF(UnmaskedRes); // AF // Undefined @@ -833,7 +833,7 @@ void OpDispatchBuilder::CalculateFlags_ShiftLeftImmediate(uint8_t SrcSize, Order // OF // In the case of left shift. OF is only set from the result of XOR if (Shift == 1) { - auto Xor = _Xor(OpSize, Res, Src1); + auto Xor = _Xor(OpSize, UnmaskedRes, Src1); SetRFLAG(Xor, SrcSize * 8 - 1, true); } else { // Undefined, we choose to zero as part of SetNZ_ZeroCV