| 1 | //===-- PPCPredicates.h - PPC Branch Predicate Information ------*- C++ -*-===// |
| 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 describes the PowerPC branch predicates. |
| 10 | // |
| 11 | //===----------------------------------------------------------------------===// |
| 12 | |
| 13 | #ifndef LLVM_LIB_TARGET_POWERPC_MCTARGETDESC_PPCPREDICATES_H |
| 14 | #define LLVM_LIB_TARGET_POWERPC_MCTARGETDESC_PPCPREDICATES_H |
| 15 | |
| 16 | // GCC #defines PPC on Linux but we use it as our namespace name |
| 17 | #undef PPC |
| 18 | |
| 19 | // Generated files will use "namespace PPC". To avoid symbol clash, |
| 20 | // undefine PPC here. PPC may be predefined on some hosts. |
| 21 | #undef PPC |
| 22 | |
| 23 | namespace llvm { |
| 24 | namespace PPC { |
| 25 | /// Predicate - These are "(BI << 5) | BO" for various predicates. |
| 26 | enum Predicate { |
| 27 | PRED_LT = (0 << 5) | 12, |
| 28 | PRED_LE = (1 << 5) | 4, |
| 29 | PRED_EQ = (2 << 5) | 12, |
| 30 | PRED_GE = (0 << 5) | 4, |
| 31 | PRED_GT = (1 << 5) | 12, |
| 32 | PRED_NE = (2 << 5) | 4, |
| 33 | PRED_UN = (3 << 5) | 12, |
| 34 | PRED_NU = (3 << 5) | 4, |
| 35 | PRED_LT_MINUS = (0 << 5) | 14, |
| 36 | PRED_LE_MINUS = (1 << 5) | 6, |
| 37 | PRED_EQ_MINUS = (2 << 5) | 14, |
| 38 | PRED_GE_MINUS = (0 << 5) | 6, |
| 39 | PRED_GT_MINUS = (1 << 5) | 14, |
| 40 | PRED_NE_MINUS = (2 << 5) | 6, |
| 41 | PRED_UN_MINUS = (3 << 5) | 14, |
| 42 | PRED_NU_MINUS = (3 << 5) | 6, |
| 43 | PRED_LT_PLUS = (0 << 5) | 15, |
| 44 | PRED_LE_PLUS = (1 << 5) | 7, |
| 45 | PRED_EQ_PLUS = (2 << 5) | 15, |
| 46 | PRED_GE_PLUS = (0 << 5) | 7, |
| 47 | PRED_GT_PLUS = (1 << 5) | 15, |
| 48 | PRED_NE_PLUS = (2 << 5) | 7, |
| 49 | PRED_UN_PLUS = (3 << 5) | 15, |
| 50 | PRED_NU_PLUS = (3 << 5) | 7, |
| 51 | |
| 52 | // SPE scalar compare instructions always set the GT bit. |
| 53 | PRED_SPE = PRED_GT, |
| 54 | |
| 55 | // When dealing with individual condition-register bits, we have simple set |
| 56 | // and unset predicates. |
| 57 | PRED_BIT_SET = 1024, |
| 58 | PRED_BIT_UNSET = 1025 |
| 59 | }; |
| 60 | |
| 61 | // Bit for branch taken (plus) or not-taken (minus) hint |
| 62 | enum BranchHintBit { |
| 63 | BR_NO_HINT = 0x0, |
| 64 | BR_NONTAKEN_HINT = 0x2, |
| 65 | BR_TAKEN_HINT = 0x3, |
| 66 | BR_HINT_MASK = 0X3 |
| 67 | }; |
| 68 | |
| 69 | /// Invert the specified predicate. != -> ==, < -> >=. |
| 70 | Predicate InvertPredicate(Predicate Opcode); |
| 71 | |
| 72 | /// Assume the condition register is set by MI(a,b), return the predicate if |
| 73 | /// we modify the instructions such that condition register is set by MI(b,a). |
| 74 | Predicate getSwappedPredicate(Predicate Opcode); |
| 75 | |
| 76 | /// Return the condition without hint bits. |
| 77 | inline unsigned getPredicateCondition(Predicate Opcode) { |
| 78 | return (unsigned)(Opcode & ~BR_HINT_MASK); |
| 79 | } |
| 80 | |
| 81 | /// Return the hint bits of the predicate. |
| 82 | inline unsigned getPredicateHint(Predicate Opcode) { |
| 83 | return (unsigned)(Opcode & BR_HINT_MASK); |
| 84 | } |
| 85 | |
| 86 | /// Return predicate consisting of specified condition and hint bits. |
| 87 | inline Predicate getPredicate(unsigned Condition, unsigned Hint) { |
| 88 | return (Predicate)((Condition & ~BR_HINT_MASK) | |
| 89 | (Hint & BR_HINT_MASK)); |
| 90 | } |
| 91 | } |
| 92 | } |
| 93 | |
| 94 | #endif |
| 95 | |