16122f3e6SDimitry Andric //===-- PPCPredicates.cpp - PPC Branch Predicate Information --------------===// 26122f3e6SDimitry Andric // 36122f3e6SDimitry Andric // The LLVM Compiler Infrastructure 46122f3e6SDimitry Andric // 56122f3e6SDimitry Andric // This file is distributed under the University of Illinois Open Source 66122f3e6SDimitry Andric // License. See LICENSE.TXT for details. 76122f3e6SDimitry Andric // 86122f3e6SDimitry Andric //===----------------------------------------------------------------------===// 96122f3e6SDimitry Andric // 106122f3e6SDimitry Andric // This file implements the PowerPC branch predicates. 116122f3e6SDimitry Andric // 126122f3e6SDimitry Andric //===----------------------------------------------------------------------===// 136122f3e6SDimitry Andric 146122f3e6SDimitry Andric #include "PPCPredicates.h" 156122f3e6SDimitry Andric #include "llvm/Support/ErrorHandling.h" 166122f3e6SDimitry Andric #include <cassert> 176122f3e6SDimitry Andric using namespace llvm; 186122f3e6SDimitry Andric InvertPredicate(PPC::Predicate Opcode)196122f3e6SDimitry AndricPPC::Predicate PPC::InvertPredicate(PPC::Predicate Opcode) { 206122f3e6SDimitry Andric switch (Opcode) { 216122f3e6SDimitry Andric case PPC::PRED_EQ: return PPC::PRED_NE; 226122f3e6SDimitry Andric case PPC::PRED_NE: return PPC::PRED_EQ; 236122f3e6SDimitry Andric case PPC::PRED_LT: return PPC::PRED_GE; 246122f3e6SDimitry Andric case PPC::PRED_GE: return PPC::PRED_LT; 256122f3e6SDimitry Andric case PPC::PRED_GT: return PPC::PRED_LE; 266122f3e6SDimitry Andric case PPC::PRED_LE: return PPC::PRED_GT; 276122f3e6SDimitry Andric case PPC::PRED_NU: return PPC::PRED_UN; 286122f3e6SDimitry Andric case PPC::PRED_UN: return PPC::PRED_NU; 29f785676fSDimitry Andric case PPC::PRED_EQ_MINUS: return PPC::PRED_NE_PLUS; 30f785676fSDimitry Andric case PPC::PRED_NE_MINUS: return PPC::PRED_EQ_PLUS; 31f785676fSDimitry Andric case PPC::PRED_LT_MINUS: return PPC::PRED_GE_PLUS; 32f785676fSDimitry Andric case PPC::PRED_GE_MINUS: return PPC::PRED_LT_PLUS; 33f785676fSDimitry Andric case PPC::PRED_GT_MINUS: return PPC::PRED_LE_PLUS; 34f785676fSDimitry Andric case PPC::PRED_LE_MINUS: return PPC::PRED_GT_PLUS; 35f785676fSDimitry Andric case PPC::PRED_NU_MINUS: return PPC::PRED_UN_PLUS; 36f785676fSDimitry Andric case PPC::PRED_UN_MINUS: return PPC::PRED_NU_PLUS; 37f785676fSDimitry Andric case PPC::PRED_EQ_PLUS: return PPC::PRED_NE_MINUS; 38f785676fSDimitry Andric case PPC::PRED_NE_PLUS: return PPC::PRED_EQ_MINUS; 39f785676fSDimitry Andric case PPC::PRED_LT_PLUS: return PPC::PRED_GE_MINUS; 40f785676fSDimitry Andric case PPC::PRED_GE_PLUS: return PPC::PRED_LT_MINUS; 41f785676fSDimitry Andric case PPC::PRED_GT_PLUS: return PPC::PRED_LE_MINUS; 42f785676fSDimitry Andric case PPC::PRED_LE_PLUS: return PPC::PRED_GT_MINUS; 43f785676fSDimitry Andric case PPC::PRED_NU_PLUS: return PPC::PRED_UN_MINUS; 44f785676fSDimitry Andric case PPC::PRED_UN_PLUS: return PPC::PRED_NU_MINUS; 45*91bc56edSDimitry Andric 46*91bc56edSDimitry Andric // Simple predicates for single condition-register bits. 47*91bc56edSDimitry Andric case PPC::PRED_BIT_SET: return PPC::PRED_BIT_UNSET; 48*91bc56edSDimitry Andric case PPC::PRED_BIT_UNSET: return PPC::PRED_BIT_SET; 496122f3e6SDimitry Andric } 50139f7f9bSDimitry Andric llvm_unreachable("Unknown PPC branch opcode!"); 516122f3e6SDimitry Andric } 52284c1978SDimitry Andric getSwappedPredicate(PPC::Predicate Opcode)53284c1978SDimitry AndricPPC::Predicate PPC::getSwappedPredicate(PPC::Predicate Opcode) { 54284c1978SDimitry Andric switch (Opcode) { 55284c1978SDimitry Andric case PPC::PRED_EQ: return PPC::PRED_EQ; 56284c1978SDimitry Andric case PPC::PRED_NE: return PPC::PRED_NE; 57284c1978SDimitry Andric case PPC::PRED_LT: return PPC::PRED_GT; 58284c1978SDimitry Andric case PPC::PRED_GE: return PPC::PRED_LE; 59284c1978SDimitry Andric case PPC::PRED_GT: return PPC::PRED_LT; 60284c1978SDimitry Andric case PPC::PRED_LE: return PPC::PRED_GE; 61284c1978SDimitry Andric case PPC::PRED_NU: return PPC::PRED_NU; 62284c1978SDimitry Andric case PPC::PRED_UN: return PPC::PRED_UN; 63f785676fSDimitry Andric case PPC::PRED_EQ_MINUS: return PPC::PRED_EQ_MINUS; 64f785676fSDimitry Andric case PPC::PRED_NE_MINUS: return PPC::PRED_NE_MINUS; 65f785676fSDimitry Andric case PPC::PRED_LT_MINUS: return PPC::PRED_GT_MINUS; 66f785676fSDimitry Andric case PPC::PRED_GE_MINUS: return PPC::PRED_LE_MINUS; 67f785676fSDimitry Andric case PPC::PRED_GT_MINUS: return PPC::PRED_LT_MINUS; 68f785676fSDimitry Andric case PPC::PRED_LE_MINUS: return PPC::PRED_GE_MINUS; 69f785676fSDimitry Andric case PPC::PRED_NU_MINUS: return PPC::PRED_NU_MINUS; 70f785676fSDimitry Andric case PPC::PRED_UN_MINUS: return PPC::PRED_UN_MINUS; 71f785676fSDimitry Andric case PPC::PRED_EQ_PLUS: return PPC::PRED_EQ_PLUS; 72f785676fSDimitry Andric case PPC::PRED_NE_PLUS: return PPC::PRED_NE_PLUS; 73f785676fSDimitry Andric case PPC::PRED_LT_PLUS: return PPC::PRED_GT_PLUS; 74f785676fSDimitry Andric case PPC::PRED_GE_PLUS: return PPC::PRED_LE_PLUS; 75f785676fSDimitry Andric case PPC::PRED_GT_PLUS: return PPC::PRED_LT_PLUS; 76f785676fSDimitry Andric case PPC::PRED_LE_PLUS: return PPC::PRED_GE_PLUS; 77f785676fSDimitry Andric case PPC::PRED_NU_PLUS: return PPC::PRED_NU_PLUS; 78f785676fSDimitry Andric case PPC::PRED_UN_PLUS: return PPC::PRED_UN_PLUS; 79*91bc56edSDimitry Andric 80*91bc56edSDimitry Andric case PPC::PRED_BIT_SET: 81*91bc56edSDimitry Andric case PPC::PRED_BIT_UNSET: 82*91bc56edSDimitry Andric llvm_unreachable("Invalid use of bit predicate code"); 83284c1978SDimitry Andric } 84284c1978SDimitry Andric llvm_unreachable("Unknown PPC branch opcode!"); 85284c1978SDimitry Andric } 86284c1978SDimitry Andric 87