From f9f80b77e57febc8f1072fbbc6964fec88ab0d04 Mon Sep 17 00:00:00 2001 From: Stefanos Kornilios Mitsis Poiitidis Date: Thu, 5 Nov 2020 23:33:38 +0200 Subject: [PATCH] CondJump/Arm64: Use cbnz/cbz if faster --- .../Interface/Core/JIT/Arm64/BranchOps.cpp | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/External/FEXCore/Source/Interface/Core/JIT/Arm64/BranchOps.cpp b/External/FEXCore/Source/Interface/Core/JIT/Arm64/BranchOps.cpp index af9bd5b6b..5af977eae 100644 --- a/External/FEXCore/Source/Interface/Core/JIT/Arm64/BranchOps.cpp +++ b/External/FEXCore/Source/Interface/Core/JIT/Arm64/BranchOps.cpp @@ -113,16 +113,21 @@ DEF_OP(CondJump) { TrueTargetLabel = &TrueIter->second; } - if (Op->Header.Args[1].IsInvalid()) { - cbnz(GetReg(Op->Header.Args[0].ID()), TrueTargetLabel); - } else { - uint64_t Const; - if (IsInlineConstant(Op->Header.Args[1], &Const)) - cmp(GRCMP(Op->Header.Args[0].ID()), Const); - else - cmp(GRCMP(Op->Header.Args[0].ID()), GRCMP(Op->Header.Args[1].ID())); - b(TrueTargetLabel, MapBranchCC(Op->Operation)); + uint64_t Const; + bool isConst = IsInlineConstant(Op->Cmp2, &Const); + + if (isConst && Const == 0 && Op->Operation.Val == FEXCore::IR::COND_EQ) { + cbz(GRCMP(Op->Cmp1.ID()), TrueTargetLabel); + } else if (isConst && Const == 0 && Op->Operation.Val == FEXCore::IR::COND_NEQ) { + cbnz(GRCMP(Op->Cmp1.ID()), TrueTargetLabel); + } else { + if (isConst) + cmp(GRCMP(Op->Cmp1.ID()), Const); + else + cmp(GRCMP(Op->Cmp1.ID()), GRCMP(Op->Cmp2.ID())); + + b(TrueTargetLabel, MapBranchCC(Op->Operation)); } if (FalseIter == JumpTargets.end()) {