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