diff options
Diffstat (limited to 'lib/Target/Lanai/LanaiCondCode.h')
-rw-r--r-- | lib/Target/Lanai/LanaiCondCode.h | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/lib/Target/Lanai/LanaiCondCode.h b/lib/Target/Lanai/LanaiCondCode.h new file mode 100644 index 000000000000..6c5bdefc83dc --- /dev/null +++ b/lib/Target/Lanai/LanaiCondCode.h @@ -0,0 +1,100 @@ +// 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 |