111424445SEvan Cheng //===-- PPCPredicates.cpp - PPC Branch Predicate Information --------------===//
211424445SEvan Cheng //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
611424445SEvan Cheng //
711424445SEvan Cheng //===----------------------------------------------------------------------===//
811424445SEvan Cheng //
911424445SEvan Cheng // This file implements the PowerPC branch predicates.
1011424445SEvan Cheng //
1111424445SEvan Cheng //===----------------------------------------------------------------------===//
1211424445SEvan Cheng 
1311424445SEvan Cheng #include "PPCPredicates.h"
1411424445SEvan Cheng #include "llvm/Support/ErrorHandling.h"
1511424445SEvan Cheng #include <cassert>
1611424445SEvan Cheng using namespace llvm;
1711424445SEvan Cheng 
InvertPredicate(PPC::Predicate Opcode)1811424445SEvan Cheng PPC::Predicate PPC::InvertPredicate(PPC::Predicate Opcode) {
1911424445SEvan Cheng   switch (Opcode) {
2011424445SEvan Cheng   case PPC::PRED_EQ: return PPC::PRED_NE;
2111424445SEvan Cheng   case PPC::PRED_NE: return PPC::PRED_EQ;
2211424445SEvan Cheng   case PPC::PRED_LT: return PPC::PRED_GE;
2311424445SEvan Cheng   case PPC::PRED_GE: return PPC::PRED_LT;
2411424445SEvan Cheng   case PPC::PRED_GT: return PPC::PRED_LE;
2511424445SEvan Cheng   case PPC::PRED_LE: return PPC::PRED_GT;
2611424445SEvan Cheng   case PPC::PRED_NU: return PPC::PRED_UN;
2711424445SEvan Cheng   case PPC::PRED_UN: return PPC::PRED_NU;
2886247b6eSUlrich Weigand   case PPC::PRED_EQ_MINUS: return PPC::PRED_NE_PLUS;
2986247b6eSUlrich Weigand   case PPC::PRED_NE_MINUS: return PPC::PRED_EQ_PLUS;
3086247b6eSUlrich Weigand   case PPC::PRED_LT_MINUS: return PPC::PRED_GE_PLUS;
3186247b6eSUlrich Weigand   case PPC::PRED_GE_MINUS: return PPC::PRED_LT_PLUS;
3286247b6eSUlrich Weigand   case PPC::PRED_GT_MINUS: return PPC::PRED_LE_PLUS;
3386247b6eSUlrich Weigand   case PPC::PRED_LE_MINUS: return PPC::PRED_GT_PLUS;
3486247b6eSUlrich Weigand   case PPC::PRED_NU_MINUS: return PPC::PRED_UN_PLUS;
3586247b6eSUlrich Weigand   case PPC::PRED_UN_MINUS: return PPC::PRED_NU_PLUS;
3686247b6eSUlrich Weigand   case PPC::PRED_EQ_PLUS: return PPC::PRED_NE_MINUS;
3786247b6eSUlrich Weigand   case PPC::PRED_NE_PLUS: return PPC::PRED_EQ_MINUS;
3886247b6eSUlrich Weigand   case PPC::PRED_LT_PLUS: return PPC::PRED_GE_MINUS;
3986247b6eSUlrich Weigand   case PPC::PRED_GE_PLUS: return PPC::PRED_LT_MINUS;
4086247b6eSUlrich Weigand   case PPC::PRED_GT_PLUS: return PPC::PRED_LE_MINUS;
4186247b6eSUlrich Weigand   case PPC::PRED_LE_PLUS: return PPC::PRED_GT_MINUS;
4286247b6eSUlrich Weigand   case PPC::PRED_NU_PLUS: return PPC::PRED_UN_MINUS;
4386247b6eSUlrich Weigand   case PPC::PRED_UN_PLUS: return PPC::PRED_NU_MINUS;
44940ab934SHal Finkel 
45940ab934SHal Finkel   // Simple predicates for single condition-register bits.
46940ab934SHal Finkel   case PPC::PRED_BIT_SET:   return PPC::PRED_BIT_UNSET;
47940ab934SHal Finkel   case PPC::PRED_BIT_UNSET: return PPC::PRED_BIT_SET;
4811424445SEvan Cheng   }
49c2467c4eSDavid Blaikie   llvm_unreachable("Unknown PPC branch opcode!");
5011424445SEvan Cheng }
510f64e21bSHal Finkel 
getSwappedPredicate(PPC::Predicate Opcode)520f64e21bSHal Finkel PPC::Predicate PPC::getSwappedPredicate(PPC::Predicate Opcode) {
530f64e21bSHal Finkel   switch (Opcode) {
540f64e21bSHal Finkel   case PPC::PRED_EQ: return PPC::PRED_EQ;
550f64e21bSHal Finkel   case PPC::PRED_NE: return PPC::PRED_NE;
560f64e21bSHal Finkel   case PPC::PRED_LT: return PPC::PRED_GT;
570f64e21bSHal Finkel   case PPC::PRED_GE: return PPC::PRED_LE;
580f64e21bSHal Finkel   case PPC::PRED_GT: return PPC::PRED_LT;
590f64e21bSHal Finkel   case PPC::PRED_LE: return PPC::PRED_GE;
600f64e21bSHal Finkel   case PPC::PRED_NU: return PPC::PRED_NU;
610f64e21bSHal Finkel   case PPC::PRED_UN: return PPC::PRED_UN;
6286247b6eSUlrich Weigand   case PPC::PRED_EQ_MINUS: return PPC::PRED_EQ_MINUS;
6386247b6eSUlrich Weigand   case PPC::PRED_NE_MINUS: return PPC::PRED_NE_MINUS;
6486247b6eSUlrich Weigand   case PPC::PRED_LT_MINUS: return PPC::PRED_GT_MINUS;
6586247b6eSUlrich Weigand   case PPC::PRED_GE_MINUS: return PPC::PRED_LE_MINUS;
6686247b6eSUlrich Weigand   case PPC::PRED_GT_MINUS: return PPC::PRED_LT_MINUS;
6786247b6eSUlrich Weigand   case PPC::PRED_LE_MINUS: return PPC::PRED_GE_MINUS;
6886247b6eSUlrich Weigand   case PPC::PRED_NU_MINUS: return PPC::PRED_NU_MINUS;
6986247b6eSUlrich Weigand   case PPC::PRED_UN_MINUS: return PPC::PRED_UN_MINUS;
7086247b6eSUlrich Weigand   case PPC::PRED_EQ_PLUS: return PPC::PRED_EQ_PLUS;
7186247b6eSUlrich Weigand   case PPC::PRED_NE_PLUS: return PPC::PRED_NE_PLUS;
7286247b6eSUlrich Weigand   case PPC::PRED_LT_PLUS: return PPC::PRED_GT_PLUS;
7386247b6eSUlrich Weigand   case PPC::PRED_GE_PLUS: return PPC::PRED_LE_PLUS;
7486247b6eSUlrich Weigand   case PPC::PRED_GT_PLUS: return PPC::PRED_LT_PLUS;
7586247b6eSUlrich Weigand   case PPC::PRED_LE_PLUS: return PPC::PRED_GE_PLUS;
7686247b6eSUlrich Weigand   case PPC::PRED_NU_PLUS: return PPC::PRED_NU_PLUS;
7786247b6eSUlrich Weigand   case PPC::PRED_UN_PLUS: return PPC::PRED_UN_PLUS;
78940ab934SHal Finkel 
79940ab934SHal Finkel   case PPC::PRED_BIT_SET:
80940ab934SHal Finkel   case PPC::PRED_BIT_UNSET:
81940ab934SHal Finkel     llvm_unreachable("Invalid use of bit predicate code");
820f64e21bSHal Finkel   }
83c2467c4eSDavid Blaikie   llvm_unreachable("Unknown PPC branch opcode!");
840f64e21bSHal Finkel }
850f64e21bSHal Finkel 
86