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