PPCPredicates.cpp revision 36b56886974eae4f9c5ebc96befd3e7bfe5de338
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>
17using namespace llvm;
18
19PPC::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
53PPC::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