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