1 | //==- SystemZ.h - Top-Level Interface for SystemZ representation -*- C++ -*-==// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // This file contains the entry points for global functions defined in |
10 | // the LLVM SystemZ backend. |
11 | // |
12 | //===----------------------------------------------------------------------===// |
13 | |
14 | #ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZ_H |
15 | #define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZ_H |
16 | |
17 | #include "MCTargetDesc/SystemZMCTargetDesc.h" |
18 | #include "llvm/Support/CodeGen.h" |
19 | |
20 | namespace llvm { |
21 | class FunctionPass; |
22 | class PassRegistry; |
23 | class SystemZTargetMachine; |
24 | |
25 | namespace SystemZ { |
26 | // Condition-code mask values. |
27 | const unsigned CCMASK_0 = 1 << 3; |
28 | const unsigned CCMASK_1 = 1 << 2; |
29 | const unsigned CCMASK_2 = 1 << 1; |
30 | const unsigned CCMASK_3 = 1 << 0; |
31 | const unsigned CCMASK_ANY = CCMASK_0 | CCMASK_1 | CCMASK_2 | CCMASK_3; |
32 | |
33 | // Condition-code mask assignments for integer and floating-point |
34 | // comparisons. |
35 | const unsigned CCMASK_CMP_EQ = CCMASK_0; |
36 | const unsigned CCMASK_CMP_LT = CCMASK_1; |
37 | const unsigned CCMASK_CMP_GT = CCMASK_2; |
38 | const unsigned CCMASK_CMP_NE = CCMASK_CMP_LT | CCMASK_CMP_GT; |
39 | const unsigned CCMASK_CMP_LE = CCMASK_CMP_EQ | CCMASK_CMP_LT; |
40 | const unsigned CCMASK_CMP_GE = CCMASK_CMP_EQ | CCMASK_CMP_GT; |
41 | |
42 | // Condition-code mask assignments for floating-point comparisons only. |
43 | const unsigned CCMASK_CMP_UO = CCMASK_3; |
44 | const unsigned CCMASK_CMP_O = CCMASK_ANY ^ CCMASK_CMP_UO; |
45 | |
46 | // All condition-code values produced by comparisons. |
47 | const unsigned CCMASK_ICMP = CCMASK_0 | CCMASK_1 | CCMASK_2; |
48 | const unsigned CCMASK_FCMP = CCMASK_0 | CCMASK_1 | CCMASK_2 | CCMASK_3; |
49 | |
50 | // Condition-code mask assignments for arithmetical operations. |
51 | const unsigned CCMASK_ARITH_EQ = CCMASK_0; |
52 | const unsigned CCMASK_ARITH_LT = CCMASK_1; |
53 | const unsigned CCMASK_ARITH_GT = CCMASK_2; |
54 | const unsigned CCMASK_ARITH_OVERFLOW = CCMASK_3; |
55 | const unsigned CCMASK_ARITH = CCMASK_ANY; |
56 | |
57 | // Condition-code mask assignments for logical operations. |
58 | const unsigned CCMASK_LOGICAL_ZERO = CCMASK_0 | CCMASK_2; |
59 | const unsigned CCMASK_LOGICAL_NONZERO = CCMASK_1 | CCMASK_3; |
60 | const unsigned CCMASK_LOGICAL_CARRY = CCMASK_2 | CCMASK_3; |
61 | const unsigned CCMASK_LOGICAL_NOCARRY = CCMASK_0 | CCMASK_1; |
62 | const unsigned CCMASK_LOGICAL_BORROW = CCMASK_LOGICAL_NOCARRY; |
63 | const unsigned CCMASK_LOGICAL_NOBORROW = CCMASK_LOGICAL_CARRY; |
64 | const unsigned CCMASK_LOGICAL = CCMASK_ANY; |
65 | |
66 | // Condition-code mask assignments for CS. |
67 | const unsigned CCMASK_CS_EQ = CCMASK_0; |
68 | const unsigned CCMASK_CS_NE = CCMASK_1; |
69 | const unsigned CCMASK_CS = CCMASK_0 | CCMASK_1; |
70 | |
71 | // Condition-code mask assignments for a completed SRST loop. |
72 | const unsigned CCMASK_SRST_FOUND = CCMASK_1; |
73 | const unsigned CCMASK_SRST_NOTFOUND = CCMASK_2; |
74 | const unsigned CCMASK_SRST = CCMASK_1 | CCMASK_2; |
75 | |
76 | // Condition-code mask assignments for TEST UNDER MASK. |
77 | const unsigned CCMASK_TM_ALL_0 = CCMASK_0; |
78 | const unsigned CCMASK_TM_MIXED_MSB_0 = CCMASK_1; |
79 | const unsigned CCMASK_TM_MIXED_MSB_1 = CCMASK_2; |
80 | const unsigned CCMASK_TM_ALL_1 = CCMASK_3; |
81 | const unsigned CCMASK_TM_SOME_0 = CCMASK_TM_ALL_1 ^ CCMASK_ANY; |
82 | const unsigned CCMASK_TM_SOME_1 = CCMASK_TM_ALL_0 ^ CCMASK_ANY; |
83 | const unsigned CCMASK_TM_MSB_0 = CCMASK_0 | CCMASK_1; |
84 | const unsigned CCMASK_TM_MSB_1 = CCMASK_2 | CCMASK_3; |
85 | const unsigned CCMASK_TM = CCMASK_ANY; |
86 | |
87 | // Condition-code mask assignments for TRANSACTION_BEGIN. |
88 | const unsigned CCMASK_TBEGIN_STARTED = CCMASK_0; |
89 | const unsigned CCMASK_TBEGIN_INDETERMINATE = CCMASK_1; |
90 | const unsigned CCMASK_TBEGIN_TRANSIENT = CCMASK_2; |
91 | const unsigned CCMASK_TBEGIN_PERSISTENT = CCMASK_3; |
92 | const unsigned CCMASK_TBEGIN = CCMASK_ANY; |
93 | |
94 | // Condition-code mask assignments for TRANSACTION_END. |
95 | const unsigned CCMASK_TEND_TX = CCMASK_0; |
96 | const unsigned CCMASK_TEND_NOTX = CCMASK_2; |
97 | const unsigned CCMASK_TEND = CCMASK_TEND_TX | CCMASK_TEND_NOTX; |
98 | |
99 | // Condition-code mask assignments for vector comparisons (and similar |
100 | // operations). |
101 | const unsigned CCMASK_VCMP_ALL = CCMASK_0; |
102 | const unsigned CCMASK_VCMP_MIXED = CCMASK_1; |
103 | const unsigned CCMASK_VCMP_NONE = CCMASK_3; |
104 | const unsigned CCMASK_VCMP = CCMASK_0 | CCMASK_1 | CCMASK_3; |
105 | |
106 | // Condition-code mask assignments for Test Data Class. |
107 | const unsigned CCMASK_TDC_NOMATCH = CCMASK_0; |
108 | const unsigned CCMASK_TDC_MATCH = CCMASK_1; |
109 | const unsigned CCMASK_TDC = CCMASK_TDC_NOMATCH | CCMASK_TDC_MATCH; |
110 | |
111 | // The position of the low CC bit in an IPM result. |
112 | const unsigned IPM_CC = 28; |
113 | |
114 | // Mask assignments for PFD. |
115 | const unsigned PFD_READ = 1; |
116 | const unsigned PFD_WRITE = 2; |
117 | |
118 | // Mask assignments for TDC |
119 | const unsigned TDCMASK_ZERO_PLUS = 0x800; |
120 | const unsigned TDCMASK_ZERO_MINUS = 0x400; |
121 | const unsigned TDCMASK_NORMAL_PLUS = 0x200; |
122 | const unsigned TDCMASK_NORMAL_MINUS = 0x100; |
123 | const unsigned TDCMASK_SUBNORMAL_PLUS = 0x080; |
124 | const unsigned TDCMASK_SUBNORMAL_MINUS = 0x040; |
125 | const unsigned TDCMASK_INFINITY_PLUS = 0x020; |
126 | const unsigned TDCMASK_INFINITY_MINUS = 0x010; |
127 | const unsigned TDCMASK_QNAN_PLUS = 0x008; |
128 | const unsigned TDCMASK_QNAN_MINUS = 0x004; |
129 | const unsigned TDCMASK_SNAN_PLUS = 0x002; |
130 | const unsigned TDCMASK_SNAN_MINUS = 0x001; |
131 | |
132 | const unsigned TDCMASK_ZERO = TDCMASK_ZERO_PLUS | TDCMASK_ZERO_MINUS; |
133 | const unsigned TDCMASK_POSITIVE = TDCMASK_NORMAL_PLUS | |
134 | TDCMASK_SUBNORMAL_PLUS | |
135 | TDCMASK_INFINITY_PLUS; |
136 | const unsigned TDCMASK_NEGATIVE = TDCMASK_NORMAL_MINUS | |
137 | TDCMASK_SUBNORMAL_MINUS | |
138 | TDCMASK_INFINITY_MINUS; |
139 | const unsigned TDCMASK_NAN = TDCMASK_QNAN_PLUS | |
140 | TDCMASK_QNAN_MINUS | |
141 | TDCMASK_SNAN_PLUS | |
142 | TDCMASK_SNAN_MINUS; |
143 | const unsigned TDCMASK_PLUS = TDCMASK_POSITIVE | |
144 | TDCMASK_ZERO_PLUS | |
145 | TDCMASK_QNAN_PLUS | |
146 | TDCMASK_SNAN_PLUS; |
147 | const unsigned TDCMASK_MINUS = TDCMASK_NEGATIVE | |
148 | TDCMASK_ZERO_MINUS | |
149 | TDCMASK_QNAN_MINUS | |
150 | TDCMASK_SNAN_MINUS; |
151 | const unsigned TDCMASK_ALL = TDCMASK_PLUS | TDCMASK_MINUS; |
152 | |
153 | // Number of bits in a vector register. |
154 | const unsigned VectorBits = 128; |
155 | |
156 | // Number of bytes in a vector register (and consequently the number of |
157 | // bytes in a general permute vector). |
158 | const unsigned VectorBytes = VectorBits / 8; |
159 | |
160 | // Return true if Val fits an LLILL operand. |
161 | static inline bool isImmLL(uint64_t Val) { |
162 | return (Val & ~0x000000000000ffffULL) == 0; |
163 | } |
164 | |
165 | // Return true if Val fits an LLILH operand. |
166 | static inline bool isImmLH(uint64_t Val) { |
167 | return (Val & ~0x00000000ffff0000ULL) == 0; |
168 | } |
169 | |
170 | // Return true if Val fits an LLIHL operand. |
171 | static inline bool isImmHL(uint64_t Val) { |
172 | return (Val & ~0x00000ffff00000000ULL) == 0; |
173 | } |
174 | |
175 | // Return true if Val fits an LLIHH operand. |
176 | static inline bool isImmHH(uint64_t Val) { |
177 | return (Val & ~0xffff000000000000ULL) == 0; |
178 | } |
179 | |
180 | // Return true if Val fits an LLILF operand. |
181 | static inline bool isImmLF(uint64_t Val) { |
182 | return (Val & ~0x00000000ffffffffULL) == 0; |
183 | } |
184 | |
185 | // Return true if Val fits an LLIHF operand. |
186 | static inline bool isImmHF(uint64_t Val) { |
187 | return (Val & ~0xffffffff00000000ULL) == 0; |
188 | } |
189 | } // end namespace SystemZ |
190 | |
191 | FunctionPass *createSystemZISelDag(SystemZTargetMachine &TM, |
192 | CodeGenOptLevel OptLevel); |
193 | FunctionPass *createSystemZElimComparePass(SystemZTargetMachine &TM); |
194 | FunctionPass *createSystemZShortenInstPass(SystemZTargetMachine &TM); |
195 | FunctionPass *createSystemZLongBranchPass(SystemZTargetMachine &TM); |
196 | FunctionPass *createSystemZLDCleanupPass(SystemZTargetMachine &TM); |
197 | FunctionPass *createSystemZCopyPhysRegsPass(SystemZTargetMachine &TM); |
198 | FunctionPass *createSystemZPostRewritePass(SystemZTargetMachine &TM); |
199 | FunctionPass *createSystemZTDCPass(); |
200 | |
201 | void initializeSystemZCopyPhysRegsPass(PassRegistry &); |
202 | void initializeSystemZDAGToDAGISelLegacyPass(PassRegistry &); |
203 | void initializeSystemZElimComparePass(PassRegistry &); |
204 | void initializeSystemZLDCleanupPass(PassRegistry &); |
205 | void initializeSystemZLongBranchPass(PassRegistry &); |
206 | void initializeSystemZPostRewritePass(PassRegistry &); |
207 | void initializeSystemZShortenInstPass(PassRegistry &); |
208 | void initializeSystemZTDCPassPass(PassRegistry &); |
209 | |
210 | } // end namespace llvm |
211 | |
212 | #endif |
213 | |