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