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 Andric PPC::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 Andric PPC::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