| // The encoding used for conditional codes used in BR instructions |
| |
| #ifndef LLVM_LIB_TARGET_LANAI_LANAICONDCODE_H |
| #define LLVM_LIB_TARGET_LANAI_LANAICONDCODE_H |
| |
| #include "llvm/ADT/StringSwitch.h" |
| |
| namespace llvm { |
| namespace LPCC { |
| enum CondCode { |
| ICC_T = 0, // true |
| ICC_F = 1, // false |
| ICC_HI = 2, // high |
| ICC_UGT = 2, // unsigned greater than |
| ICC_LS = 3, // low or same |
| ICC_ULE = 3, // unsigned less than or equal |
| ICC_CC = 4, // carry cleared |
| ICC_ULT = 4, // unsigned less than |
| ICC_CS = 5, // carry set |
| ICC_UGE = 5, // unsigned greater than or equal |
| ICC_NE = 6, // not equal |
| ICC_EQ = 7, // equal |
| ICC_VC = 8, // oVerflow cleared |
| ICC_VS = 9, // oVerflow set |
| ICC_PL = 10, // plus |
| ICC_MI = 11, // minus |
| ICC_GE = 12, // greater than or equal |
| ICC_LT = 13, // less than |
| ICC_GT = 14, // greater than |
| ICC_LE = 15, // less than or equal |
| UNKNOWN |
| }; |
| |
| inline static StringRef lanaiCondCodeToString(LPCC::CondCode CC) { |
| switch (CC) { |
| case LPCC::ICC_T: |
| return "t"; // true |
| case LPCC::ICC_F: |
| return "f"; // false |
| case LPCC::ICC_NE: |
| return "ne"; // not equal |
| case LPCC::ICC_EQ: |
| return "eq"; // equal |
| case LPCC::ICC_VC: |
| return "vc"; // oVerflow cleared |
| case LPCC::ICC_VS: |
| return "vs"; // oVerflow set |
| case LPCC::ICC_PL: |
| return "pl"; // plus |
| case LPCC::ICC_MI: |
| return "mi"; // minus |
| case LPCC::ICC_GE: |
| return "ge"; // greater than or equal |
| case LPCC::ICC_LT: |
| return "lt"; // less than |
| case LPCC::ICC_GT: |
| return "gt"; // greater than |
| case LPCC::ICC_LE: |
| return "le"; // less than or equal |
| case LPCC::ICC_UGT: |
| return "ugt"; // high | unsigned greater than |
| case LPCC::ICC_ULE: |
| return "ule"; // low or same | unsigned less or equal |
| case LPCC::ICC_ULT: |
| return "ult"; // carry cleared | unsigned less than |
| case LPCC::ICC_UGE: |
| return "uge"; // carry set | unsigned than or equal |
| default: |
| llvm_unreachable("Invalid cond code"); |
| } |
| } |
| |
| inline static CondCode suffixToLanaiCondCode(StringRef S) { |
| return StringSwitch<CondCode>(S) |
| .EndsWith("f", LPCC::ICC_F) |
| .EndsWith("hi", LPCC::ICC_HI) |
| .EndsWith("ugt", LPCC::ICC_UGT) |
| .EndsWith("ls", LPCC::ICC_LS) |
| .EndsWith("ule", LPCC::ICC_ULE) |
| .EndsWith("cc", LPCC::ICC_CC) |
| .EndsWith("ult", LPCC::ICC_ULT) |
| .EndsWith("cs", LPCC::ICC_CS) |
| .EndsWith("uge", LPCC::ICC_UGE) |
| .EndsWith("ne", LPCC::ICC_NE) |
| .EndsWith("eq", LPCC::ICC_EQ) |
| .EndsWith("vc", LPCC::ICC_VC) |
| .EndsWith("vs", LPCC::ICC_VS) |
| .EndsWith("pl", LPCC::ICC_PL) |
| .EndsWith("mi", LPCC::ICC_MI) |
| .EndsWith("ge", LPCC::ICC_GE) |
| .EndsWith("lt", LPCC::ICC_LT) |
| .EndsWith("gt", LPCC::ICC_GT) |
| .EndsWith("le", LPCC::ICC_LE) |
| .EndsWith("t", LPCC::ICC_T) // Has to be after others with suffix t |
| .Default(LPCC::UNKNOWN); |
| } |
| } // namespace LPCC |
| } // namespace llvm |
| |
| #endif // LLVM_LIB_TARGET_LANAI_LANAICONDCODE_H |