From 395573720dac8ffb1375fa1d3dc0ccf343ce8e0b Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Fri, 5 Jul 2024 16:10:49 -0400 Subject: [PATCH] OpcodeDispatcher: drop pointless flag defers for shifts Signed-off-by: Alyssa Rosenzweig --- .../Interface/Core/OpcodeDispatcher.cpp | 10 +- .../Source/Interface/Core/OpcodeDispatcher.h | 93 ------------------- .../Interface/Core/OpcodeDispatcher/Flags.cpp | 16 ---- 3 files changed, 5 insertions(+), 114 deletions(-) diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp b/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp index 368637c28..bad890cc3 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp @@ -1482,7 +1482,7 @@ void OpDispatchBuilder::SHLImmediateOp(OpcodeArgs) { Ref Src = _Constant(Size, Shift); Ref Result = _Lshl(Size == 64 ? OpSize::i64Bit : OpSize::i32Bit, Dest, Src); - GenerateFlags_ShiftLeftImmediate(Op, Result, Dest, Shift); + CalculateFlags_ShiftLeftImmediate(GetSrcSize(Op), Result, Dest, Shift); CalculateDeferredFlags(); StoreResult(GPRClass, Op, Result, -1); } @@ -1506,7 +1506,7 @@ void OpDispatchBuilder::SHRImmediateOp(OpcodeArgs) { Ref Src = _Constant(Size, Shift); auto ALUOp = _Lshr(Size == 64 ? OpSize::i64Bit : OpSize::i32Bit, Dest, Src); - GenerateFlags_ShiftRightImmediate(Op, ALUOp, Dest, Shift); + CalculateFlags_ShiftRightImmediate(GetSrcSize(Op), ALUOp, Dest, Shift); CalculateDeferredFlags(); StoreResult(GPRClass, Op, ALUOp, -1); } @@ -1575,7 +1575,7 @@ void OpDispatchBuilder::SHLDImmediateOp(OpcodeArgs) { Res = _Extr(OpSizeFromSrc(Op), Dest, Src, Size - Shift); } - GenerateFlags_ShiftLeftImmediate(Op, Res, Dest, Shift); + CalculateFlags_ShiftLeftImmediate(GetSrcSize(Op), Res, Dest, Shift); CalculateDeferredFlags(); StoreResult(GPRClass, Op, Res, -1); } else if (Shift == 0 && Size == 32) { @@ -1641,7 +1641,7 @@ void OpDispatchBuilder::SHRDImmediateOp(OpcodeArgs) { } StoreResult(GPRClass, Op, Res, -1); - GenerateFlags_ShiftRightDoubleImmediate(Op, Res, Dest, Shift); + CalculateFlags_ShiftRightDoubleImmediate(GetSrcSize(Op), Res, Dest, Shift); } else if (Shift == 0 && Size == 32) { // Ensure Zext still occurs StoreResult(GPRClass, Op, Dest, -1); @@ -1667,7 +1667,7 @@ void OpDispatchBuilder::ASHROp(OpcodeArgs) { uint64_t Shift = LoadConstantShift(Op, SHR1Bit); Ref Result = _Ashr(IR::SizeToOpSize(OpSize), Dest, _Constant(Shift)); - GenerateFlags_SignShiftRightImmediate(Op, Result, Dest, Shift); + CalculateFlags_SignShiftRightImmediate(GetSrcSize(Op), Result, Dest, Shift); CalculateDeferredFlags(); StoreResult(GPRClass, Op, Result, -1); } else { diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher.h b/FEXCore/Source/Interface/Core/OpcodeDispatcher.h index 63e16e06f..d425a7c26 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher.h +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher.h @@ -89,10 +89,6 @@ class OpDispatchBuilder final : public IREmitter { public: enum class FlagsGenerationType : uint8_t { TYPE_NONE, - TYPE_LSHLI, - TYPE_LSHRI, - TYPE_LSHRDI, - TYPE_ASHRI, }; Ref GetNewJumpBlock(uint64_t RIP) { @@ -2190,95 +2186,6 @@ private: void CalculateFlags_RDRAND(Ref Src); /** @} */ - /** - * @name These functions generated deferred RFLAGs tracking. - * - * Depending on the operation it may force a RFLAGs calculation before storing the new deferred state. - * @{ */ - void GenerateFlags_ShiftLeftImmediate(FEXCore::X86Tables::DecodedOp Op, Ref Res, Ref Src1, uint64_t Shift) { - // No flags changed if shift is zero. - if (Shift == 0) { - return; - } - - CurrentDeferredFlags = DeferredFlagData { - .Type = FlagsGenerationType::TYPE_LSHLI, - .SrcSize = GetSrcSize(Op), - .Res = Res, - .Sources = - { - .OneSrcImmediate = - { - .Src1 = Src1, - .Imm = Shift, - }, - }, - }; - } - - void GenerateFlags_SignShiftRightImmediate(FEXCore::X86Tables::DecodedOp Op, Ref Res, Ref Src1, uint64_t Shift) { - // No flags changed if shift is zero. - if (Shift == 0) { - return; - } - - CurrentDeferredFlags = DeferredFlagData { - .Type = FlagsGenerationType::TYPE_ASHRI, - .SrcSize = GetSrcSize(Op), - .Res = Res, - .Sources = - { - .OneSrcImmediate = - { - .Src1 = Src1, - .Imm = Shift, - }, - }, - }; - } - - void GenerateFlags_ShiftRightImmediate(FEXCore::X86Tables::DecodedOp Op, Ref Res, Ref Src1, uint64_t Shift) { - // No flags changed if shift is zero. - if (Shift == 0) { - return; - } - - CurrentDeferredFlags = DeferredFlagData { - .Type = FlagsGenerationType::TYPE_LSHRI, - .SrcSize = GetSrcSize(Op), - .Res = Res, - .Sources = - { - .OneSrcImmediate = - { - .Src1 = Src1, - .Imm = Shift, - }, - }, - }; - } - - void GenerateFlags_ShiftRightDoubleImmediate(FEXCore::X86Tables::DecodedOp Op, Ref Res, Ref Src1, uint64_t Shift) { - // No flags changed if shift is zero. - if (Shift == 0) { - return; - } - - CurrentDeferredFlags = DeferredFlagData { - .Type = FlagsGenerationType::TYPE_LSHRDI, - .SrcSize = GetSrcSize(Op), - .Res = Res, - .Sources = - { - .OneSrcImmediate = - { - .Src1 = Src1, - .Imm = Shift, - }, - }, - }; - } - Ref AndConst(FEXCore::IR::OpSize Size, Ref Node, uint64_t Const) { uint64_t NodeConst; diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp b/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp index 584835c9f..02af2178b 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp @@ -271,22 +271,6 @@ void OpDispatchBuilder::CalculateDeferredFlags(uint32_t FlagsToCalculateMask) { } switch (CurrentDeferredFlags.Type) { - case FlagsGenerationType::TYPE_LSHLI: - CalculateFlags_ShiftLeftImmediate(CurrentDeferredFlags.SrcSize, CurrentDeferredFlags.Res, - CurrentDeferredFlags.Sources.OneSrcImmediate.Src1, CurrentDeferredFlags.Sources.OneSrcImmediate.Imm); - break; - case FlagsGenerationType::TYPE_LSHRI: - CalculateFlags_ShiftRightImmediate(CurrentDeferredFlags.SrcSize, CurrentDeferredFlags.Res, - CurrentDeferredFlags.Sources.OneSrcImmediate.Src1, CurrentDeferredFlags.Sources.OneSrcImmediate.Imm); - break; - case FlagsGenerationType::TYPE_LSHRDI: - CalculateFlags_ShiftRightDoubleImmediate(CurrentDeferredFlags.SrcSize, CurrentDeferredFlags.Res, - CurrentDeferredFlags.Sources.OneSrcImmediate.Src1, CurrentDeferredFlags.Sources.OneSrcImmediate.Imm); - break; - case FlagsGenerationType::TYPE_ASHRI: - CalculateFlags_SignShiftRightImmediate(CurrentDeferredFlags.SrcSize, CurrentDeferredFlags.Res, - CurrentDeferredFlags.Sources.OneSrcImmediate.Src1, CurrentDeferredFlags.Sources.OneSrcImmediate.Imm); - break; case FlagsGenerationType::TYPE_NONE: default: ERROR_AND_DIE_FMT("Unhandled flags type {}", CurrentDeferredFlags.Type); }