Jacques Pienaar | fcef3e4 | 2016-03-28 13:09:54 +0000 | [diff] [blame] | 1 | // The encoding used for conditional codes used in BR instructions |
| 2 | |
| 3 | #ifndef LLVM_LIB_TARGET_LANAI_LANAICONDCODE_H |
| 4 | #define LLVM_LIB_TARGET_LANAI_LANAICONDCODE_H |
| 5 | |
| 6 | #include "llvm/ADT/StringSwitch.h" |
| 7 | |
| 8 | namespace llvm { |
| 9 | namespace LPCC { |
| 10 | enum CondCode { |
| 11 | ICC_T = 0, // true |
| 12 | ICC_F = 1, // false |
| 13 | ICC_HI = 2, // high |
| 14 | ICC_UGT = 2, // unsigned greater than |
| 15 | ICC_LS = 3, // low or same |
| 16 | ICC_ULE = 3, // unsigned less than or equal |
| 17 | ICC_CC = 4, // carry cleared |
| 18 | ICC_ULT = 4, // unsigned less than |
| 19 | ICC_CS = 5, // carry set |
| 20 | ICC_UGE = 5, // unsigned greater than or equal |
| 21 | ICC_NE = 6, // not equal |
| 22 | ICC_EQ = 7, // equal |
| 23 | ICC_VC = 8, // oVerflow cleared |
| 24 | ICC_VS = 9, // oVerflow set |
| 25 | ICC_PL = 10, // plus |
| 26 | ICC_MI = 11, // minus |
| 27 | ICC_GE = 12, // greater than or equal |
| 28 | ICC_LT = 13, // less than |
| 29 | ICC_GT = 14, // greater than |
| 30 | ICC_LE = 15, // less than or equal |
| 31 | UNKNOWN |
| 32 | }; |
| 33 | |
| 34 | inline static StringRef lanaiCondCodeToString(LPCC::CondCode CC) { |
| 35 | switch (CC) { |
| 36 | case LPCC::ICC_T: |
| 37 | return "t"; // true |
| 38 | case LPCC::ICC_F: |
| 39 | return "f"; // false |
| 40 | case LPCC::ICC_NE: |
| 41 | return "ne"; // not equal |
| 42 | case LPCC::ICC_EQ: |
| 43 | return "eq"; // equal |
| 44 | case LPCC::ICC_VC: |
| 45 | return "vc"; // oVerflow cleared |
| 46 | case LPCC::ICC_VS: |
| 47 | return "vs"; // oVerflow set |
| 48 | case LPCC::ICC_PL: |
| 49 | return "pl"; // plus |
| 50 | case LPCC::ICC_MI: |
| 51 | return "mi"; // minus |
| 52 | case LPCC::ICC_GE: |
| 53 | return "ge"; // greater than or equal |
| 54 | case LPCC::ICC_LT: |
| 55 | return "lt"; // less than |
| 56 | case LPCC::ICC_GT: |
| 57 | return "gt"; // greater than |
| 58 | case LPCC::ICC_LE: |
| 59 | return "le"; // less than or equal |
| 60 | case LPCC::ICC_UGT: |
| 61 | return "ugt"; // high | unsigned greater than |
| 62 | case LPCC::ICC_ULE: |
| 63 | return "ule"; // low or same | unsigned less or equal |
| 64 | case LPCC::ICC_ULT: |
| 65 | return "ult"; // carry cleared | unsigned less than |
| 66 | case LPCC::ICC_UGE: |
| 67 | return "uge"; // carry set | unsigned than or equal |
| 68 | default: |
| 69 | llvm_unreachable("Invalid cond code"); |
| 70 | } |
| 71 | } |
| 72 | |
| 73 | inline static CondCode suffixToLanaiCondCode(StringRef S) { |
| 74 | return StringSwitch<CondCode>(S) |
| 75 | .EndsWith("f", LPCC::ICC_F) |
| 76 | .EndsWith("hi", LPCC::ICC_HI) |
| 77 | .EndsWith("ugt", LPCC::ICC_UGT) |
| 78 | .EndsWith("ls", LPCC::ICC_LS) |
| 79 | .EndsWith("ule", LPCC::ICC_ULE) |
| 80 | .EndsWith("cc", LPCC::ICC_CC) |
| 81 | .EndsWith("ult", LPCC::ICC_ULT) |
| 82 | .EndsWith("cs", LPCC::ICC_CS) |
| 83 | .EndsWith("uge", LPCC::ICC_UGE) |
| 84 | .EndsWith("ne", LPCC::ICC_NE) |
| 85 | .EndsWith("eq", LPCC::ICC_EQ) |
| 86 | .EndsWith("vc", LPCC::ICC_VC) |
| 87 | .EndsWith("vs", LPCC::ICC_VS) |
| 88 | .EndsWith("pl", LPCC::ICC_PL) |
| 89 | .EndsWith("mi", LPCC::ICC_MI) |
| 90 | .EndsWith("ge", LPCC::ICC_GE) |
| 91 | .EndsWith("lt", LPCC::ICC_LT) |
| 92 | .EndsWith("gt", LPCC::ICC_GT) |
| 93 | .EndsWith("le", LPCC::ICC_LE) |
| 94 | .EndsWith("t", LPCC::ICC_T) // Has to be after others with suffix t |
| 95 | .Default(LPCC::UNKNOWN); |
| 96 | } |
| 97 | } // namespace LPCC |
| 98 | } // namespace llvm |
| 99 | |
| 100 | #endif // LLVM_LIB_TARGET_LANAI_LANAICONDCODE_H |