10b57cec5SDimitry Andric //===-- PPCPredicates.cpp - PPC Branch Predicate Information --------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file implements the PowerPC branch predicates.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #include "PPCPredicates.h"
140b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h"
150b57cec5SDimitry Andric using namespace llvm;
160b57cec5SDimitry Andric 
InvertPredicate(PPC::Predicate Opcode)170b57cec5SDimitry Andric PPC::Predicate PPC::InvertPredicate(PPC::Predicate Opcode) {
180b57cec5SDimitry Andric   switch (Opcode) {
190b57cec5SDimitry Andric   case PPC::PRED_EQ: return PPC::PRED_NE;
200b57cec5SDimitry Andric   case PPC::PRED_NE: return PPC::PRED_EQ;
210b57cec5SDimitry Andric   case PPC::PRED_LT: return PPC::PRED_GE;
220b57cec5SDimitry Andric   case PPC::PRED_GE: return PPC::PRED_LT;
230b57cec5SDimitry Andric   case PPC::PRED_GT: return PPC::PRED_LE;
240b57cec5SDimitry Andric   case PPC::PRED_LE: return PPC::PRED_GT;
250b57cec5SDimitry Andric   case PPC::PRED_NU: return PPC::PRED_UN;
260b57cec5SDimitry Andric   case PPC::PRED_UN: return PPC::PRED_NU;
270b57cec5SDimitry Andric   case PPC::PRED_EQ_MINUS: return PPC::PRED_NE_PLUS;
280b57cec5SDimitry Andric   case PPC::PRED_NE_MINUS: return PPC::PRED_EQ_PLUS;
290b57cec5SDimitry Andric   case PPC::PRED_LT_MINUS: return PPC::PRED_GE_PLUS;
300b57cec5SDimitry Andric   case PPC::PRED_GE_MINUS: return PPC::PRED_LT_PLUS;
310b57cec5SDimitry Andric   case PPC::PRED_GT_MINUS: return PPC::PRED_LE_PLUS;
320b57cec5SDimitry Andric   case PPC::PRED_LE_MINUS: return PPC::PRED_GT_PLUS;
330b57cec5SDimitry Andric   case PPC::PRED_NU_MINUS: return PPC::PRED_UN_PLUS;
340b57cec5SDimitry Andric   case PPC::PRED_UN_MINUS: return PPC::PRED_NU_PLUS;
350b57cec5SDimitry Andric   case PPC::PRED_EQ_PLUS: return PPC::PRED_NE_MINUS;
360b57cec5SDimitry Andric   case PPC::PRED_NE_PLUS: return PPC::PRED_EQ_MINUS;
370b57cec5SDimitry Andric   case PPC::PRED_LT_PLUS: return PPC::PRED_GE_MINUS;
380b57cec5SDimitry Andric   case PPC::PRED_GE_PLUS: return PPC::PRED_LT_MINUS;
390b57cec5SDimitry Andric   case PPC::PRED_GT_PLUS: return PPC::PRED_LE_MINUS;
400b57cec5SDimitry Andric   case PPC::PRED_LE_PLUS: return PPC::PRED_GT_MINUS;
410b57cec5SDimitry Andric   case PPC::PRED_NU_PLUS: return PPC::PRED_UN_MINUS;
420b57cec5SDimitry Andric   case PPC::PRED_UN_PLUS: return PPC::PRED_NU_MINUS;
430b57cec5SDimitry Andric 
440b57cec5SDimitry Andric   // Simple predicates for single condition-register bits.
450b57cec5SDimitry Andric   case PPC::PRED_BIT_SET:   return PPC::PRED_BIT_UNSET;
460b57cec5SDimitry Andric   case PPC::PRED_BIT_UNSET: return PPC::PRED_BIT_SET;
470b57cec5SDimitry Andric   }
480b57cec5SDimitry Andric   llvm_unreachable("Unknown PPC branch opcode!");
490b57cec5SDimitry Andric }
500b57cec5SDimitry Andric 
getSwappedPredicate(PPC::Predicate Opcode)510b57cec5SDimitry Andric PPC::Predicate PPC::getSwappedPredicate(PPC::Predicate Opcode) {
520b57cec5SDimitry Andric   switch (Opcode) {
530b57cec5SDimitry Andric   case PPC::PRED_EQ: return PPC::PRED_EQ;
540b57cec5SDimitry Andric   case PPC::PRED_NE: return PPC::PRED_NE;
550b57cec5SDimitry Andric   case PPC::PRED_LT: return PPC::PRED_GT;
560b57cec5SDimitry Andric   case PPC::PRED_GE: return PPC::PRED_LE;
570b57cec5SDimitry Andric   case PPC::PRED_GT: return PPC::PRED_LT;
580b57cec5SDimitry Andric   case PPC::PRED_LE: return PPC::PRED_GE;
590b57cec5SDimitry Andric   case PPC::PRED_NU: return PPC::PRED_NU;
600b57cec5SDimitry Andric   case PPC::PRED_UN: return PPC::PRED_UN;
610b57cec5SDimitry Andric   case PPC::PRED_EQ_MINUS: return PPC::PRED_EQ_MINUS;
620b57cec5SDimitry Andric   case PPC::PRED_NE_MINUS: return PPC::PRED_NE_MINUS;
630b57cec5SDimitry Andric   case PPC::PRED_LT_MINUS: return PPC::PRED_GT_MINUS;
640b57cec5SDimitry Andric   case PPC::PRED_GE_MINUS: return PPC::PRED_LE_MINUS;
650b57cec5SDimitry Andric   case PPC::PRED_GT_MINUS: return PPC::PRED_LT_MINUS;
660b57cec5SDimitry Andric   case PPC::PRED_LE_MINUS: return PPC::PRED_GE_MINUS;
670b57cec5SDimitry Andric   case PPC::PRED_NU_MINUS: return PPC::PRED_NU_MINUS;
680b57cec5SDimitry Andric   case PPC::PRED_UN_MINUS: return PPC::PRED_UN_MINUS;
690b57cec5SDimitry Andric   case PPC::PRED_EQ_PLUS: return PPC::PRED_EQ_PLUS;
700b57cec5SDimitry Andric   case PPC::PRED_NE_PLUS: return PPC::PRED_NE_PLUS;
710b57cec5SDimitry Andric   case PPC::PRED_LT_PLUS: return PPC::PRED_GT_PLUS;
720b57cec5SDimitry Andric   case PPC::PRED_GE_PLUS: return PPC::PRED_LE_PLUS;
730b57cec5SDimitry Andric   case PPC::PRED_GT_PLUS: return PPC::PRED_LT_PLUS;
740b57cec5SDimitry Andric   case PPC::PRED_LE_PLUS: return PPC::PRED_GE_PLUS;
750b57cec5SDimitry Andric   case PPC::PRED_NU_PLUS: return PPC::PRED_NU_PLUS;
760b57cec5SDimitry Andric   case PPC::PRED_UN_PLUS: return PPC::PRED_UN_PLUS;
770b57cec5SDimitry Andric 
780b57cec5SDimitry Andric   case PPC::PRED_BIT_SET:
790b57cec5SDimitry Andric   case PPC::PRED_BIT_UNSET:
800b57cec5SDimitry Andric     llvm_unreachable("Invalid use of bit predicate code");
810b57cec5SDimitry Andric   }
820b57cec5SDimitry Andric   llvm_unreachable("Unknown PPC branch opcode!");
830b57cec5SDimitry Andric }
840b57cec5SDimitry Andric 
85