diff --git a/FEXCore/Source/Interface/Core/JIT/Arm64/ALUOps.cpp b/FEXCore/Source/Interface/Core/JIT/Arm64/ALUOps.cpp index c1511f1418..4493671d99 100644 --- a/FEXCore/Source/Interface/Core/JIT/Arm64/ALUOps.cpp +++ b/FEXCore/Source/Interface/Core/JIT/Arm64/ALUOps.cpp @@ -1535,6 +1535,14 @@ DEF_OP(NZCVSelect) { } } +DEF_OP(NZCVSelectV) { + auto Op = IROp->C(); + + auto cc = MapCC(Op->Cond); + const auto SubRegSize = ConvertSubRegSizePair248(IROp); + fcsel(SubRegSize.Scalar, GetVReg(Node), GetVReg(Op->TrueVal.ID()), GetVReg(Op->FalseVal.ID()), cc); +} + DEF_OP(NZCVSelectIncrement) { auto Op = IROp->C(); diff --git a/FEXCore/Source/Interface/IR/IR.json b/FEXCore/Source/Interface/IR/IR.json index c061f407d9..46606ca3d7 100644 --- a/FEXCore/Source/Interface/IR/IR.json +++ b/FEXCore/Source/Interface/IR/IR.json @@ -1540,6 +1540,17 @@ "ResultSize == FEXCore::IR::OpSize::i32Bit || ResultSize == FEXCore::IR::OpSize::i64Bit" ] }, + "FPR = NZCVSelectV OpSize:#ResultSize, u8:$ElementSize, CondClass:$Cond, FPR:$TrueVal, FPR:$FalseVal": { + "Desc": [ + "Select based on value in NZCV flags, where TrueVal and FalseVal are both FPRs.", + "op:", + "Dest = Cond ? TrueVal : FalseVal" + ], + "DestSize": "ResultSize", + "EmitValidation": [ + "ResultSize == FEXCore::IR::OpSize::i32Bit || ResultSize == FEXCore::IR::OpSize::i64Bit" + ] + }, "GPR = NZCVSelectIncrement OpSize:#ResultSize, CondClass:$Cond, GPR:$TrueVal, GPR:$FalseVal": { "Desc": ["Select and increment based on value in NZCV flags", "op:", diff --git a/FEXCore/Source/Interface/IR/Passes/RedundantFlagCalculationElimination.cpp b/FEXCore/Source/Interface/IR/Passes/RedundantFlagCalculationElimination.cpp index 19d6b137bc..29ee822f10 100644 --- a/FEXCore/Source/Interface/IR/Passes/RedundantFlagCalculationElimination.cpp +++ b/FEXCore/Source/Interface/IR/Passes/RedundantFlagCalculationElimination.cpp @@ -319,6 +319,7 @@ constexpr FlagInfo ClassifyConst(IROps Op) { case OP_STOREAF: return FlagInfo::Pack({.Write = FLAG_A, .CanEliminate = true}); case OP_NZCVSELECT: + case OP_NZCVSELECTV: case OP_NZCVSELECTINCREMENT: case OP_NEG: case OP_CONDJUMP: @@ -353,6 +354,11 @@ FlagInfo DeadFlagCalculationEliminination::Classify(IROp_Header* IROp) { return FlagInfo::Pack({.Read = FlagsForCondClassType(Op->Cond)}); } + case OP_NZCVSELECTV: { + auto Op = IROp->CW(); + return FlagInfo::Pack({.Read = FlagsForCondClassType(Op->Cond)}); + } + case OP_NEG: { auto Op = IROp->CW(); return FlagInfo::Pack({.Read = FlagsForCondClassType(Op->Cond)});