From 333271d490cdd7ebffeef195f2fa5fbf60f71ea3 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Mon, 26 Feb 2024 15:27:19 -0400 Subject: [PATCH] OpcodeDispatcher: fuse sbb when flags calculated Signed-off-by: Alyssa Rosenzweig --- FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp b/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp index 4487b50ec..25e984d7f 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp @@ -428,17 +428,21 @@ void OpDispatchBuilder::SBBOp(OpcodeArgs) { OrderedNode *DestMem = LoadSource(GPRClass, Op, Op->Dest, Op->Flags, {.LoadData = false}); DestMem = AppendSegmentOffset(DestMem, Op->Flags); Before = _AtomicFetchSub(IR::SizeToOpSize(Size), ALUOp, DestMem); - Result = _Sub(Size == 8 ? OpSize::i64Bit : OpSize::i32Bit, Before, ALUOp); } else { Before = LoadSource(GPRClass, Op, Op->Dest, Op->Flags); - Result = _Sub(Size == 8 ? OpSize::i64Bit : OpSize::i32Bit, Before, ALUOp); - StoreResult(GPRClass, Op, Result, -1); } if (SetFlags) { - CalculateFlags_SBB(Size, Before, Src); + Result = CalculateFlags_SBB(Size, Before, Src); + } else { + auto CF = GetRFLAG(FEXCore::X86State::RFLAG_CF_RAW_LOC); + auto ALUOp = _Add(OpSize, Src, CF); + Result = _Sub(Size == 8 ? OpSize::i64Bit : OpSize::i32Bit, Before, ALUOp); } + + if (!DestIsLockedMem(Op)) + StoreResult(GPRClass, Op, Result, -1); } void OpDispatchBuilder::PUSHOp(OpcodeArgs) {