From b893bdb8dfeac2db6a5e92834e645d9cdb31eb91 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Wed, 21 Aug 2024 16:23:52 -0400 Subject: [PATCH] OpcodeDispatcher: optimize fcmovu Signed-off-by: Alyssa Rosenzweig --- FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp b/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp index 796fdf03c..b204d7d6d 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp @@ -589,9 +589,14 @@ void OpDispatchBuilder::CALLAbsoluteOp(OpcodeArgs) { Ref OpDispatchBuilder::SelectBit(Ref Cmp, IR::OpSize ResultSize, Ref TrueValue, Ref FalseValue) { uint64_t TrueConst, FalseConst; - if (IsValueConstant(WrapNode(TrueValue), &TrueConst) && IsValueConstant(WrapNode(FalseValue), &FalseConst) && TrueConst == 1 && FalseConst == 0) { - - return _And(ResultSize, Cmp, _Constant(1)); + if (IsValueConstant(WrapNode(TrueValue), &TrueConst) && IsValueConstant(WrapNode(FalseValue), &FalseConst) && FalseConst == 0) { + if (TrueConst == 1) { + return _And(ResultSize, Cmp, _Constant(1)); + } else if (TrueConst == 0xffffffff) { + return _Sbfe(OpSize::i32Bit, 1, 0, Cmp); + } else if (TrueConst == 0xffffffffffffffffull) { + return _Sbfe(OpSize::i64Bit, 1, 0, Cmp); + } } SaveNZCV();