LLVM API Documentation
00001 //===-- PPCPredicates.cpp - PPC Branch Predicate Information --------------===// 00002 // 00003 // The LLVM Compiler Infrastructure 00004 // 00005 // This file is distributed under the University of Illinois Open Source 00006 // License. See LICENSE.TXT for details. 00007 // 00008 //===----------------------------------------------------------------------===// 00009 // 00010 // This file implements the PowerPC branch predicates. 00011 // 00012 //===----------------------------------------------------------------------===// 00013 00014 #include "PPCPredicates.h" 00015 #include "llvm/Support/ErrorHandling.h" 00016 #include <cassert> 00017 using namespace llvm; 00018 00019 PPC::Predicate PPC::InvertPredicate(PPC::Predicate Opcode) { 00020 switch (Opcode) { 00021 case PPC::PRED_EQ: return PPC::PRED_NE; 00022 case PPC::PRED_NE: return PPC::PRED_EQ; 00023 case PPC::PRED_LT: return PPC::PRED_GE; 00024 case PPC::PRED_GE: return PPC::PRED_LT; 00025 case PPC::PRED_GT: return PPC::PRED_LE; 00026 case PPC::PRED_LE: return PPC::PRED_GT; 00027 case PPC::PRED_NU: return PPC::PRED_UN; 00028 case PPC::PRED_UN: return PPC::PRED_NU; 00029 case PPC::PRED_EQ_MINUS: return PPC::PRED_NE_PLUS; 00030 case PPC::PRED_NE_MINUS: return PPC::PRED_EQ_PLUS; 00031 case PPC::PRED_LT_MINUS: return PPC::PRED_GE_PLUS; 00032 case PPC::PRED_GE_MINUS: return PPC::PRED_LT_PLUS; 00033 case PPC::PRED_GT_MINUS: return PPC::PRED_LE_PLUS; 00034 case PPC::PRED_LE_MINUS: return PPC::PRED_GT_PLUS; 00035 case PPC::PRED_NU_MINUS: return PPC::PRED_UN_PLUS; 00036 case PPC::PRED_UN_MINUS: return PPC::PRED_NU_PLUS; 00037 case PPC::PRED_EQ_PLUS: return PPC::PRED_NE_MINUS; 00038 case PPC::PRED_NE_PLUS: return PPC::PRED_EQ_MINUS; 00039 case PPC::PRED_LT_PLUS: return PPC::PRED_GE_MINUS; 00040 case PPC::PRED_GE_PLUS: return PPC::PRED_LT_MINUS; 00041 case PPC::PRED_GT_PLUS: return PPC::PRED_LE_MINUS; 00042 case PPC::PRED_LE_PLUS: return PPC::PRED_GT_MINUS; 00043 case PPC::PRED_NU_PLUS: return PPC::PRED_UN_MINUS; 00044 case PPC::PRED_UN_PLUS: return PPC::PRED_NU_MINUS; 00045 00046 // Simple predicates for single condition-register bits. 00047 case PPC::PRED_BIT_SET: return PPC::PRED_BIT_UNSET; 00048 case PPC::PRED_BIT_UNSET: return PPC::PRED_BIT_SET; 00049 } 00050 llvm_unreachable("Unknown PPC branch opcode!"); 00051 } 00052 00053 PPC::Predicate PPC::getSwappedPredicate(PPC::Predicate Opcode) { 00054 switch (Opcode) { 00055 case PPC::PRED_EQ: return PPC::PRED_EQ; 00056 case PPC::PRED_NE: return PPC::PRED_NE; 00057 case PPC::PRED_LT: return PPC::PRED_GT; 00058 case PPC::PRED_GE: return PPC::PRED_LE; 00059 case PPC::PRED_GT: return PPC::PRED_LT; 00060 case PPC::PRED_LE: return PPC::PRED_GE; 00061 case PPC::PRED_NU: return PPC::PRED_NU; 00062 case PPC::PRED_UN: return PPC::PRED_UN; 00063 case PPC::PRED_EQ_MINUS: return PPC::PRED_EQ_MINUS; 00064 case PPC::PRED_NE_MINUS: return PPC::PRED_NE_MINUS; 00065 case PPC::PRED_LT_MINUS: return PPC::PRED_GT_MINUS; 00066 case PPC::PRED_GE_MINUS: return PPC::PRED_LE_MINUS; 00067 case PPC::PRED_GT_MINUS: return PPC::PRED_LT_MINUS; 00068 case PPC::PRED_LE_MINUS: return PPC::PRED_GE_MINUS; 00069 case PPC::PRED_NU_MINUS: return PPC::PRED_NU_MINUS; 00070 case PPC::PRED_UN_MINUS: return PPC::PRED_UN_MINUS; 00071 case PPC::PRED_EQ_PLUS: return PPC::PRED_EQ_PLUS; 00072 case PPC::PRED_NE_PLUS: return PPC::PRED_NE_PLUS; 00073 case PPC::PRED_LT_PLUS: return PPC::PRED_GT_PLUS; 00074 case PPC::PRED_GE_PLUS: return PPC::PRED_LE_PLUS; 00075 case PPC::PRED_GT_PLUS: return PPC::PRED_LT_PLUS; 00076 case PPC::PRED_LE_PLUS: return PPC::PRED_GE_PLUS; 00077 case PPC::PRED_NU_PLUS: return PPC::PRED_NU_PLUS; 00078 case PPC::PRED_UN_PLUS: return PPC::PRED_UN_PLUS; 00079 00080 case PPC::PRED_BIT_SET: 00081 case PPC::PRED_BIT_UNSET: 00082 llvm_unreachable("Invalid use of bit predicate code"); 00083 } 00084 llvm_unreachable("Unknown PPC branch opcode!"); 00085 } 00086