xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/Lanai/LanaiCondCode.h (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
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