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 | using namespace llvm; |
16 | |
17 | PPC::Predicate PPC::InvertPredicate(PPC::Predicate Opcode) { |
18 | switch (Opcode) { |
19 | case PPC::PRED_EQ: return PPC::PRED_NE; |
20 | case PPC::PRED_NE: return PPC::PRED_EQ; |
21 | case PPC::PRED_LT: return PPC::PRED_GE; |
22 | case PPC::PRED_GE: return PPC::PRED_LT; |
23 | case PPC::PRED_GT: return PPC::PRED_LE; |
24 | case PPC::PRED_LE: return PPC::PRED_GT; |
25 | case PPC::PRED_NU: return PPC::PRED_UN; |
26 | case PPC::PRED_UN: return PPC::PRED_NU; |
27 | case PPC::PRED_EQ_MINUS: return PPC::PRED_NE_PLUS; |
28 | case PPC::PRED_NE_MINUS: return PPC::PRED_EQ_PLUS; |
29 | case PPC::PRED_LT_MINUS: return PPC::PRED_GE_PLUS; |
30 | case PPC::PRED_GE_MINUS: return PPC::PRED_LT_PLUS; |
31 | case PPC::PRED_GT_MINUS: return PPC::PRED_LE_PLUS; |
32 | case PPC::PRED_LE_MINUS: return PPC::PRED_GT_PLUS; |
33 | case PPC::PRED_NU_MINUS: return PPC::PRED_UN_PLUS; |
34 | case PPC::PRED_UN_MINUS: return PPC::PRED_NU_PLUS; |
35 | case PPC::PRED_EQ_PLUS: return PPC::PRED_NE_MINUS; |
36 | case PPC::PRED_NE_PLUS: return PPC::PRED_EQ_MINUS; |
37 | case PPC::PRED_LT_PLUS: return PPC::PRED_GE_MINUS; |
38 | case PPC::PRED_GE_PLUS: return PPC::PRED_LT_MINUS; |
39 | case PPC::PRED_GT_PLUS: return PPC::PRED_LE_MINUS; |
40 | case PPC::PRED_LE_PLUS: return PPC::PRED_GT_MINUS; |
41 | case PPC::PRED_NU_PLUS: return PPC::PRED_UN_MINUS; |
42 | case PPC::PRED_UN_PLUS: return PPC::PRED_NU_MINUS; |
43 | |
44 | // Simple predicates for single condition-register bits. |
45 | case PPC::PRED_BIT_SET: return PPC::PRED_BIT_UNSET; |
46 | case PPC::PRED_BIT_UNSET: return PPC::PRED_BIT_SET; |
47 | } |
48 | llvm_unreachable("Unknown PPC branch opcode!"); |
49 | } |
50 | |
51 | PPC::Predicate PPC::getSwappedPredicate(PPC::Predicate Opcode) { |
52 | switch (Opcode) { |
53 | case PPC::PRED_EQ: return PPC::PRED_EQ; |
54 | case PPC::PRED_NE: return PPC::PRED_NE; |
55 | case PPC::PRED_LT: return PPC::PRED_GT; |
56 | case PPC::PRED_GE: return PPC::PRED_LE; |
57 | case PPC::PRED_GT: return PPC::PRED_LT; |
58 | case PPC::PRED_LE: return PPC::PRED_GE; |
59 | case PPC::PRED_NU: return PPC::PRED_NU; |
60 | case PPC::PRED_UN: return PPC::PRED_UN; |
61 | case PPC::PRED_EQ_MINUS: return PPC::PRED_EQ_MINUS; |
62 | case PPC::PRED_NE_MINUS: return PPC::PRED_NE_MINUS; |
63 | case PPC::PRED_LT_MINUS: return PPC::PRED_GT_MINUS; |
64 | case PPC::PRED_GE_MINUS: return PPC::PRED_LE_MINUS; |
65 | case PPC::PRED_GT_MINUS: return PPC::PRED_LT_MINUS; |
66 | case PPC::PRED_LE_MINUS: return PPC::PRED_GE_MINUS; |
67 | case PPC::PRED_NU_MINUS: return PPC::PRED_NU_MINUS; |
68 | case PPC::PRED_UN_MINUS: return PPC::PRED_UN_MINUS; |
69 | case PPC::PRED_EQ_PLUS: return PPC::PRED_EQ_PLUS; |
70 | case PPC::PRED_NE_PLUS: return PPC::PRED_NE_PLUS; |
71 | case PPC::PRED_LT_PLUS: return PPC::PRED_GT_PLUS; |
72 | case PPC::PRED_GE_PLUS: return PPC::PRED_LE_PLUS; |
73 | case PPC::PRED_GT_PLUS: return PPC::PRED_LT_PLUS; |
74 | case PPC::PRED_LE_PLUS: return PPC::PRED_GE_PLUS; |
75 | case PPC::PRED_NU_PLUS: return PPC::PRED_NU_PLUS; |
76 | case PPC::PRED_UN_PLUS: return PPC::PRED_UN_PLUS; |
77 | |
78 | case PPC::PRED_BIT_SET: |
79 | case PPC::PRED_BIT_UNSET: |
80 | llvm_unreachable("Invalid use of bit predicate code"); |
81 | } |
82 | llvm_unreachable("Unknown PPC branch opcode!"); |
83 | } |
84 | |
85 |