mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-29 04:01:27 +01:00
OpcodeDispatcher: drop pointless flag defers for shifts
Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
This commit is contained in:
1 parent
0e62759d24
commit
395573720d
3 files changed
+5
-114
No files matched your search
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user