// 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(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