1*9880d681SAndroid Build Coastguard Worker //===-- PPCPredicates.cpp - PPC Branch Predicate Information --------------===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // This file implements the PowerPC branch predicates. 11*9880d681SAndroid Build Coastguard Worker // 12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker #include "PPCPredicates.h" 15*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h" 16*9880d681SAndroid Build Coastguard Worker #include <cassert> 17*9880d681SAndroid Build Coastguard Worker using namespace llvm; 18*9880d681SAndroid Build Coastguard Worker InvertPredicate(PPC::Predicate Opcode)19*9880d681SAndroid Build Coastguard WorkerPPC::Predicate PPC::InvertPredicate(PPC::Predicate Opcode) { 20*9880d681SAndroid Build Coastguard Worker switch (Opcode) { 21*9880d681SAndroid Build Coastguard Worker case PPC::PRED_EQ: return PPC::PRED_NE; 22*9880d681SAndroid Build Coastguard Worker case PPC::PRED_NE: return PPC::PRED_EQ; 23*9880d681SAndroid Build Coastguard Worker case PPC::PRED_LT: return PPC::PRED_GE; 24*9880d681SAndroid Build Coastguard Worker case PPC::PRED_GE: return PPC::PRED_LT; 25*9880d681SAndroid Build Coastguard Worker case PPC::PRED_GT: return PPC::PRED_LE; 26*9880d681SAndroid Build Coastguard Worker case PPC::PRED_LE: return PPC::PRED_GT; 27*9880d681SAndroid Build Coastguard Worker case PPC::PRED_NU: return PPC::PRED_UN; 28*9880d681SAndroid Build Coastguard Worker case PPC::PRED_UN: return PPC::PRED_NU; 29*9880d681SAndroid Build Coastguard Worker case PPC::PRED_EQ_MINUS: return PPC::PRED_NE_PLUS; 30*9880d681SAndroid Build Coastguard Worker case PPC::PRED_NE_MINUS: return PPC::PRED_EQ_PLUS; 31*9880d681SAndroid Build Coastguard Worker case PPC::PRED_LT_MINUS: return PPC::PRED_GE_PLUS; 32*9880d681SAndroid Build Coastguard Worker case PPC::PRED_GE_MINUS: return PPC::PRED_LT_PLUS; 33*9880d681SAndroid Build Coastguard Worker case PPC::PRED_GT_MINUS: return PPC::PRED_LE_PLUS; 34*9880d681SAndroid Build Coastguard Worker case PPC::PRED_LE_MINUS: return PPC::PRED_GT_PLUS; 35*9880d681SAndroid Build Coastguard Worker case PPC::PRED_NU_MINUS: return PPC::PRED_UN_PLUS; 36*9880d681SAndroid Build Coastguard Worker case PPC::PRED_UN_MINUS: return PPC::PRED_NU_PLUS; 37*9880d681SAndroid Build Coastguard Worker case PPC::PRED_EQ_PLUS: return PPC::PRED_NE_MINUS; 38*9880d681SAndroid Build Coastguard Worker case PPC::PRED_NE_PLUS: return PPC::PRED_EQ_MINUS; 39*9880d681SAndroid Build Coastguard Worker case PPC::PRED_LT_PLUS: return PPC::PRED_GE_MINUS; 40*9880d681SAndroid Build Coastguard Worker case PPC::PRED_GE_PLUS: return PPC::PRED_LT_MINUS; 41*9880d681SAndroid Build Coastguard Worker case PPC::PRED_GT_PLUS: return PPC::PRED_LE_MINUS; 42*9880d681SAndroid Build Coastguard Worker case PPC::PRED_LE_PLUS: return PPC::PRED_GT_MINUS; 43*9880d681SAndroid Build Coastguard Worker case PPC::PRED_NU_PLUS: return PPC::PRED_UN_MINUS; 44*9880d681SAndroid Build Coastguard Worker case PPC::PRED_UN_PLUS: return PPC::PRED_NU_MINUS; 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker // Simple predicates for single condition-register bits. 47*9880d681SAndroid Build Coastguard Worker case PPC::PRED_BIT_SET: return PPC::PRED_BIT_UNSET; 48*9880d681SAndroid Build Coastguard Worker case PPC::PRED_BIT_UNSET: return PPC::PRED_BIT_SET; 49*9880d681SAndroid Build Coastguard Worker } 50*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Unknown PPC branch opcode!"); 51*9880d681SAndroid Build Coastguard Worker } 52*9880d681SAndroid Build Coastguard Worker getSwappedPredicate(PPC::Predicate Opcode)53*9880d681SAndroid Build Coastguard WorkerPPC::Predicate PPC::getSwappedPredicate(PPC::Predicate Opcode) { 54*9880d681SAndroid Build Coastguard Worker switch (Opcode) { 55*9880d681SAndroid Build Coastguard Worker case PPC::PRED_EQ: return PPC::PRED_EQ; 56*9880d681SAndroid Build Coastguard Worker case PPC::PRED_NE: return PPC::PRED_NE; 57*9880d681SAndroid Build Coastguard Worker case PPC::PRED_LT: return PPC::PRED_GT; 58*9880d681SAndroid Build Coastguard Worker case PPC::PRED_GE: return PPC::PRED_LE; 59*9880d681SAndroid Build Coastguard Worker case PPC::PRED_GT: return PPC::PRED_LT; 60*9880d681SAndroid Build Coastguard Worker case PPC::PRED_LE: return PPC::PRED_GE; 61*9880d681SAndroid Build Coastguard Worker case PPC::PRED_NU: return PPC::PRED_NU; 62*9880d681SAndroid Build Coastguard Worker case PPC::PRED_UN: return PPC::PRED_UN; 63*9880d681SAndroid Build Coastguard Worker case PPC::PRED_EQ_MINUS: return PPC::PRED_EQ_MINUS; 64*9880d681SAndroid Build Coastguard Worker case PPC::PRED_NE_MINUS: return PPC::PRED_NE_MINUS; 65*9880d681SAndroid Build Coastguard Worker case PPC::PRED_LT_MINUS: return PPC::PRED_GT_MINUS; 66*9880d681SAndroid Build Coastguard Worker case PPC::PRED_GE_MINUS: return PPC::PRED_LE_MINUS; 67*9880d681SAndroid Build Coastguard Worker case PPC::PRED_GT_MINUS: return PPC::PRED_LT_MINUS; 68*9880d681SAndroid Build Coastguard Worker case PPC::PRED_LE_MINUS: return PPC::PRED_GE_MINUS; 69*9880d681SAndroid Build Coastguard Worker case PPC::PRED_NU_MINUS: return PPC::PRED_NU_MINUS; 70*9880d681SAndroid Build Coastguard Worker case PPC::PRED_UN_MINUS: return PPC::PRED_UN_MINUS; 71*9880d681SAndroid Build Coastguard Worker case PPC::PRED_EQ_PLUS: return PPC::PRED_EQ_PLUS; 72*9880d681SAndroid Build Coastguard Worker case PPC::PRED_NE_PLUS: return PPC::PRED_NE_PLUS; 73*9880d681SAndroid Build Coastguard Worker case PPC::PRED_LT_PLUS: return PPC::PRED_GT_PLUS; 74*9880d681SAndroid Build Coastguard Worker case PPC::PRED_GE_PLUS: return PPC::PRED_LE_PLUS; 75*9880d681SAndroid Build Coastguard Worker case PPC::PRED_GT_PLUS: return PPC::PRED_LT_PLUS; 76*9880d681SAndroid Build Coastguard Worker case PPC::PRED_LE_PLUS: return PPC::PRED_GE_PLUS; 77*9880d681SAndroid Build Coastguard Worker case PPC::PRED_NU_PLUS: return PPC::PRED_NU_PLUS; 78*9880d681SAndroid Build Coastguard Worker case PPC::PRED_UN_PLUS: return PPC::PRED_UN_PLUS; 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker case PPC::PRED_BIT_SET: 81*9880d681SAndroid Build Coastguard Worker case PPC::PRED_BIT_UNSET: 82*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Invalid use of bit predicate code"); 83*9880d681SAndroid Build Coastguard Worker } 84*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Unknown PPC branch opcode!"); 85*9880d681SAndroid Build Coastguard Worker } 86*9880d681SAndroid Build Coastguard Worker 87