mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-14 06:00:41 +02:00
OpcodeDispatcher: Remove silly shift branching
The flag generation code does this internally and more efficiently. Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
This commit is contained in:
1 parent
b5dd1d05e9
commit
e455996dbd
2 files changed
+44
-89
No files matched your search
@@ -1911,30 +1911,10 @@ void OpDispatchBuilder::SHLDOp(OpcodeArgs) {
|
||||
|
||||
StoreResult(GPRClass, Op, Res, -1);
|
||||
|
||||
auto CondJump = _CondJump(Shift, {COND_EQ});
|
||||
|
||||
auto CurrentBlock = GetCurrentBlock();
|
||||
|
||||
// Do nothing if shift count is zero
|
||||
auto JumpTarget = CreateNewCodeBlockAfter(CurrentBlock);
|
||||
SetFalseJumpTarget(CondJump, JumpTarget);
|
||||
SetCurrentCodeBlock(JumpTarget);
|
||||
StartNewBlock();
|
||||
|
||||
if (Size != 64) {
|
||||
Res = _Bfe(OpSize::i64Bit, Size, 0, Res);
|
||||
}
|
||||
GenerateFlags_ShiftLeft(Op, Res, Dest, Shift);
|
||||
|
||||
// Calculate flags early.
|
||||
CalculateDeferredFlags();
|
||||
|
||||
auto Jump = _Jump();
|
||||
auto NextJumpTarget = CreateNewCodeBlockAfter(JumpTarget);
|
||||
SetJumpTarget(Jump, NextJumpTarget);
|
||||
SetTrueJumpTarget(CondJump, NextJumpTarget);
|
||||
SetCurrentCodeBlock(NextJumpTarget);
|
||||
StartNewBlock();
|
||||
}
|
||||
|
||||
void OpDispatchBuilder::SHLDImmediateOp(OpcodeArgs) {
|
||||
@@ -2013,28 +1993,10 @@ void OpDispatchBuilder::SHRDOp(OpcodeArgs) {
|
||||
|
||||
StoreResult(GPRClass, Op, Res, -1);
|
||||
|
||||
auto CondJump = _CondJump(Shift, {COND_EQ});
|
||||
|
||||
// Do not change flags if shift count is zero
|
||||
auto JumpTarget = CreateNewCodeBlockAfter(GetCurrentBlock());
|
||||
SetFalseJumpTarget(CondJump, JumpTarget);
|
||||
SetCurrentCodeBlock(JumpTarget);
|
||||
StartNewBlock();
|
||||
|
||||
if (Size != 64) {
|
||||
Res = _Bfe(OpSize::i64Bit, Size, 0, Res);
|
||||
}
|
||||
GenerateFlags_ShiftRight(Op, Res, Dest, Shift);
|
||||
// Calculate deferred flags immediately.
|
||||
// This block is ending so it needs to serialize
|
||||
CalculateDeferredFlags();
|
||||
|
||||
auto Jump = _Jump();
|
||||
auto NextJumpTarget = CreateNewCodeBlockAfter(JumpTarget);
|
||||
SetJumpTarget(Jump, NextJumpTarget);
|
||||
SetTrueJumpTarget(CondJump, NextJumpTarget);
|
||||
SetCurrentCodeBlock(NextJumpTarget);
|
||||
StartNewBlock();
|
||||
}
|
||||
|
||||
void OpDispatchBuilder::SHRDImmediateOp(OpcodeArgs) {
|
||||
|
||||
Reference in new issue
Block a user