1303231Sdim// The encoding used for conditional codes used in BR instructions 2303231Sdim 3303231Sdim#ifndef LLVM_LIB_TARGET_LANAI_LANAICONDCODE_H 4303231Sdim#define LLVM_LIB_TARGET_LANAI_LANAICONDCODE_H 5303231Sdim 6303231Sdim#include "llvm/ADT/StringSwitch.h" 7303231Sdim 8303231Sdimnamespace llvm { 9303231Sdimnamespace LPCC { 10303231Sdimenum CondCode { 11303231Sdim ICC_T = 0, // true 12303231Sdim ICC_F = 1, // false 13303231Sdim ICC_HI = 2, // high 14303231Sdim ICC_UGT = 2, // unsigned greater than 15303231Sdim ICC_LS = 3, // low or same 16303231Sdim ICC_ULE = 3, // unsigned less than or equal 17303231Sdim ICC_CC = 4, // carry cleared 18303231Sdim ICC_ULT = 4, // unsigned less than 19303231Sdim ICC_CS = 5, // carry set 20303231Sdim ICC_UGE = 5, // unsigned greater than or equal 21303231Sdim ICC_NE = 6, // not equal 22303231Sdim ICC_EQ = 7, // equal 23303231Sdim ICC_VC = 8, // oVerflow cleared 24303231Sdim ICC_VS = 9, // oVerflow set 25303231Sdim ICC_PL = 10, // plus 26303231Sdim ICC_MI = 11, // minus 27303231Sdim ICC_GE = 12, // greater than or equal 28303231Sdim ICC_LT = 13, // less than 29303231Sdim ICC_GT = 14, // greater than 30303231Sdim ICC_LE = 15, // less than or equal 31303231Sdim UNKNOWN 32303231Sdim}; 33303231Sdim 34303231Sdiminline static StringRef lanaiCondCodeToString(LPCC::CondCode CC) { 35303231Sdim switch (CC) { 36303231Sdim case LPCC::ICC_T: 37303231Sdim return "t"; // true 38303231Sdim case LPCC::ICC_F: 39303231Sdim return "f"; // false 40303231Sdim case LPCC::ICC_NE: 41303231Sdim return "ne"; // not equal 42303231Sdim case LPCC::ICC_EQ: 43303231Sdim return "eq"; // equal 44303231Sdim case LPCC::ICC_VC: 45303231Sdim return "vc"; // oVerflow cleared 46303231Sdim case LPCC::ICC_VS: 47303231Sdim return "vs"; // oVerflow set 48303231Sdim case LPCC::ICC_PL: 49303231Sdim return "pl"; // plus 50303231Sdim case LPCC::ICC_MI: 51303231Sdim return "mi"; // minus 52303231Sdim case LPCC::ICC_GE: 53303231Sdim return "ge"; // greater than or equal 54303231Sdim case LPCC::ICC_LT: 55303231Sdim return "lt"; // less than 56303231Sdim case LPCC::ICC_GT: 57303231Sdim return "gt"; // greater than 58303231Sdim case LPCC::ICC_LE: 59303231Sdim return "le"; // less than or equal 60303231Sdim case LPCC::ICC_UGT: 61303231Sdim return "ugt"; // high | unsigned greater than 62303231Sdim case LPCC::ICC_ULE: 63303231Sdim return "ule"; // low or same | unsigned less or equal 64303231Sdim case LPCC::ICC_ULT: 65303231Sdim return "ult"; // carry cleared | unsigned less than 66303231Sdim case LPCC::ICC_UGE: 67303231Sdim return "uge"; // carry set | unsigned than or equal 68303231Sdim default: 69303231Sdim llvm_unreachable("Invalid cond code"); 70303231Sdim } 71303231Sdim} 72303231Sdim 73303231Sdiminline static CondCode suffixToLanaiCondCode(StringRef S) { 74303231Sdim return StringSwitch<CondCode>(S) 75303231Sdim .EndsWith("f", LPCC::ICC_F) 76303231Sdim .EndsWith("hi", LPCC::ICC_HI) 77303231Sdim .EndsWith("ugt", LPCC::ICC_UGT) 78303231Sdim .EndsWith("ls", LPCC::ICC_LS) 79303231Sdim .EndsWith("ule", LPCC::ICC_ULE) 80303231Sdim .EndsWith("cc", LPCC::ICC_CC) 81303231Sdim .EndsWith("ult", LPCC::ICC_ULT) 82303231Sdim .EndsWith("cs", LPCC::ICC_CS) 83303231Sdim .EndsWith("uge", LPCC::ICC_UGE) 84303231Sdim .EndsWith("ne", LPCC::ICC_NE) 85303231Sdim .EndsWith("eq", LPCC::ICC_EQ) 86303231Sdim .EndsWith("vc", LPCC::ICC_VC) 87303231Sdim .EndsWith("vs", LPCC::ICC_VS) 88303231Sdim .EndsWith("pl", LPCC::ICC_PL) 89303231Sdim .EndsWith("mi", LPCC::ICC_MI) 90303231Sdim .EndsWith("ge", LPCC::ICC_GE) 91303231Sdim .EndsWith("lt", LPCC::ICC_LT) 92303231Sdim .EndsWith("gt", LPCC::ICC_GT) 93303231Sdim .EndsWith("le", LPCC::ICC_LE) 94303231Sdim .EndsWith("t", LPCC::ICC_T) // Has to be after others with suffix t 95303231Sdim .Default(LPCC::UNKNOWN); 96303231Sdim} 97303231Sdim} // namespace LPCC 98303231Sdim} // namespace llvm 99303231Sdim 100303231Sdim#endif // LLVM_LIB_TARGET_LANAI_LANAICONDCODE_H 101