/src/build/lib/Target/SystemZ/SystemZGenCallingConv.inc
Line | Count | Source (jump to first uncovered line) |
1 | | /*===- TableGen'erated file -------------------------------------*- C++ -*-===*\ |
2 | | |* *| |
3 | | |* Calling Convention Implementation Fragment *| |
4 | | |* *| |
5 | | |* Automatically generated file, do not edit! *| |
6 | | |* *| |
7 | | \*===----------------------------------------------------------------------===*/ |
8 | | |
9 | | #ifndef GET_CC_REGISTER_LISTS |
10 | | |
11 | | static bool CC_SystemZ(unsigned ValNo, MVT ValVT, |
12 | | MVT LocVT, CCValAssign::LocInfo LocInfo, |
13 | | ISD::ArgFlagsTy ArgFlags, CCState &State); |
14 | | static bool CC_SystemZ_ELF(unsigned ValNo, MVT ValVT, |
15 | | MVT LocVT, CCValAssign::LocInfo LocInfo, |
16 | | ISD::ArgFlagsTy ArgFlags, CCState &State); |
17 | | static bool CC_SystemZ_GHC(unsigned ValNo, MVT ValVT, |
18 | | MVT LocVT, CCValAssign::LocInfo LocInfo, |
19 | | ISD::ArgFlagsTy ArgFlags, CCState &State); |
20 | | static bool CC_SystemZ_XPLINK64(unsigned ValNo, MVT ValVT, |
21 | | MVT LocVT, CCValAssign::LocInfo LocInfo, |
22 | | ISD::ArgFlagsTy ArgFlags, CCState &State); |
23 | | static bool RetCC_SystemZ(unsigned ValNo, MVT ValVT, |
24 | | MVT LocVT, CCValAssign::LocInfo LocInfo, |
25 | | ISD::ArgFlagsTy ArgFlags, CCState &State); |
26 | | static bool RetCC_SystemZ_ELF(unsigned ValNo, MVT ValVT, |
27 | | MVT LocVT, CCValAssign::LocInfo LocInfo, |
28 | | ISD::ArgFlagsTy ArgFlags, CCState &State); |
29 | | static bool RetCC_SystemZ_XPLINK64(unsigned ValNo, MVT ValVT, |
30 | | MVT LocVT, CCValAssign::LocInfo LocInfo, |
31 | | ISD::ArgFlagsTy ArgFlags, CCState &State); |
32 | | |
33 | | |
34 | | static bool CC_SystemZ(unsigned ValNo, MVT ValVT, |
35 | | MVT LocVT, CCValAssign::LocInfo LocInfo, |
36 | 0 | ISD::ArgFlagsTy ArgFlags, CCState &State) { |
37 | |
|
38 | 0 | if (static_cast<const SystemZSubtarget&>(State.getMachineFunction().getSubtarget()).isTargetXPLINK64()) { |
39 | 0 | if (!CC_SystemZ_XPLINK64(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) |
40 | 0 | return false; |
41 | 0 | } |
42 | | |
43 | 0 | if (static_cast<const SystemZSubtarget&>(State.getMachineFunction().getSubtarget()).isTargetELF()) { |
44 | 0 | if (!CC_SystemZ_ELF(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) |
45 | 0 | return false; |
46 | 0 | } |
47 | | |
48 | 0 | return true; // CC didn't match. |
49 | 0 | } |
50 | | |
51 | | |
52 | | static bool CC_SystemZ_ELF(unsigned ValNo, MVT ValVT, |
53 | | MVT LocVT, CCValAssign::LocInfo LocInfo, |
54 | 0 | ISD::ArgFlagsTy ArgFlags, CCState &State) { |
55 | |
|
56 | 0 | if (State.getCallingConv() == CallingConv::GHC) { |
57 | 0 | if (!CC_SystemZ_GHC(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) |
58 | 0 | return false; |
59 | 0 | } |
60 | | |
61 | 0 | if (LocVT == MVT::i32) { |
62 | 0 | if (ArgFlags.isSExt() || ArgFlags.isZExt()) { |
63 | 0 | LocVT = MVT::i64; |
64 | 0 | if (ArgFlags.isSExt()) |
65 | 0 | LocInfo = CCValAssign::SExt; |
66 | 0 | else if (ArgFlags.isZExt()) |
67 | 0 | LocInfo = CCValAssign::ZExt; |
68 | 0 | else |
69 | 0 | LocInfo = CCValAssign::AExt; |
70 | 0 | } |
71 | 0 | } |
72 | |
|
73 | 0 | if (ArgFlags.isSwiftSelf()) { |
74 | 0 | if (LocVT == MVT::i64) { |
75 | 0 | if (unsigned Reg = State.AllocateReg(SystemZ::R10D)) { |
76 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
77 | 0 | return false; |
78 | 0 | } |
79 | 0 | } |
80 | 0 | } |
81 | | |
82 | 0 | if (ArgFlags.isSwiftError()) { |
83 | 0 | if (LocVT == MVT::i64) { |
84 | 0 | if (unsigned Reg = State.AllocateReg(SystemZ::R9D)) { |
85 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
86 | 0 | return false; |
87 | 0 | } |
88 | 0 | } |
89 | 0 | } |
90 | | |
91 | 0 | if (LocVT == MVT::i128 || |
92 | 0 | LocVT == MVT::f128) { |
93 | 0 | LocVT = MVT::i64; |
94 | 0 | LocInfo = CCValAssign::Indirect; |
95 | 0 | } |
96 | |
|
97 | 0 | if (LocVT == MVT::i64) { |
98 | 0 | if (CC_SystemZ_I128Indirect(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) |
99 | 0 | return false; |
100 | 0 | } |
101 | | |
102 | 0 | if (LocVT == MVT::i32) { |
103 | 0 | static const MCPhysReg RegList1[] = { |
104 | 0 | SystemZ::R2L, SystemZ::R3L, SystemZ::R4L, SystemZ::R5L, SystemZ::R6L |
105 | 0 | }; |
106 | 0 | if (unsigned Reg = State.AllocateReg(RegList1)) { |
107 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
108 | 0 | return false; |
109 | 0 | } |
110 | 0 | } |
111 | | |
112 | 0 | if (LocVT == MVT::i64) { |
113 | 0 | static const MCPhysReg RegList2[] = { |
114 | 0 | SystemZ::R2D, SystemZ::R3D, SystemZ::R4D, SystemZ::R5D, SystemZ::R6D |
115 | 0 | }; |
116 | 0 | if (unsigned Reg = State.AllocateReg(RegList2)) { |
117 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
118 | 0 | return false; |
119 | 0 | } |
120 | 0 | } |
121 | | |
122 | 0 | if (LocVT == MVT::f32) { |
123 | 0 | static const MCPhysReg RegList3[] = { |
124 | 0 | SystemZ::F0S, SystemZ::F2S, SystemZ::F4S, SystemZ::F6S |
125 | 0 | }; |
126 | 0 | if (unsigned Reg = State.AllocateReg(RegList3)) { |
127 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
128 | 0 | return false; |
129 | 0 | } |
130 | 0 | } |
131 | | |
132 | 0 | if (LocVT == MVT::f64) { |
133 | 0 | static const MCPhysReg RegList4[] = { |
134 | 0 | SystemZ::F0D, SystemZ::F2D, SystemZ::F4D, SystemZ::F6D |
135 | 0 | }; |
136 | 0 | if (unsigned Reg = State.AllocateReg(RegList4)) { |
137 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
138 | 0 | return false; |
139 | 0 | } |
140 | 0 | } |
141 | | |
142 | 0 | if (static_cast<const SystemZSubtarget&>(State.getMachineFunction().getSubtarget()).hasVector()) { |
143 | 0 | if (LocVT == MVT::v16i8 || |
144 | 0 | LocVT == MVT::v8i16 || |
145 | 0 | LocVT == MVT::v4i32 || |
146 | 0 | LocVT == MVT::v2i64 || |
147 | 0 | LocVT == MVT::v4f32 || |
148 | 0 | LocVT == MVT::v2f64) { |
149 | 0 | if (static_cast<SystemZCCState *>(&State)->IsFixed(ValNo)) { |
150 | 0 | static const MCPhysReg RegList5[] = { |
151 | 0 | SystemZ::V24, SystemZ::V26, SystemZ::V28, SystemZ::V30, SystemZ::V25, SystemZ::V27, SystemZ::V29, SystemZ::V31 |
152 | 0 | }; |
153 | 0 | if (unsigned Reg = State.AllocateReg(RegList5)) { |
154 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
155 | 0 | return false; |
156 | 0 | } |
157 | 0 | } |
158 | 0 | } |
159 | 0 | } |
160 | | |
161 | 0 | if (static_cast<const SystemZSubtarget&>(State.getMachineFunction().getSubtarget()).hasVector()) { |
162 | 0 | if (LocVT == MVT::v16i8 || |
163 | 0 | LocVT == MVT::v8i16 || |
164 | 0 | LocVT == MVT::v4i32 || |
165 | 0 | LocVT == MVT::v2i64 || |
166 | 0 | LocVT == MVT::v4f32 || |
167 | 0 | LocVT == MVT::v2f64) { |
168 | 0 | if (static_cast<SystemZCCState *>(&State)->IsShortVector(ValNo)) { |
169 | 0 | LocVT = MVT::i64; |
170 | 0 | LocInfo = CCValAssign::BCvt; |
171 | 0 | } |
172 | 0 | } |
173 | 0 | } |
174 | |
|
175 | 0 | if (static_cast<const SystemZSubtarget&>(State.getMachineFunction().getSubtarget()).hasVector()) { |
176 | 0 | if (LocVT == MVT::v16i8 || |
177 | 0 | LocVT == MVT::v8i16 || |
178 | 0 | LocVT == MVT::v4i32 || |
179 | 0 | LocVT == MVT::v2i64 || |
180 | 0 | LocVT == MVT::v4f32 || |
181 | 0 | LocVT == MVT::v2f64) { |
182 | 0 | int64_t Offset6 = State.AllocateStack(16, Align(8)); |
183 | 0 | State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset6, LocVT, LocInfo)); |
184 | 0 | return false; |
185 | 0 | } |
186 | 0 | } |
187 | | |
188 | 0 | if (LocVT == MVT::i32 || |
189 | 0 | LocVT == MVT::i64 || |
190 | 0 | LocVT == MVT::f32 || |
191 | 0 | LocVT == MVT::f64) { |
192 | 0 | int64_t Offset7 = State.AllocateStack(8, Align(8)); |
193 | 0 | State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset7, LocVT, LocInfo)); |
194 | 0 | return false; |
195 | 0 | } |
196 | | |
197 | 0 | return true; // CC didn't match. |
198 | 0 | } |
199 | | |
200 | | |
201 | | static bool CC_SystemZ_GHC(unsigned ValNo, MVT ValVT, |
202 | | MVT LocVT, CCValAssign::LocInfo LocInfo, |
203 | 0 | ISD::ArgFlagsTy ArgFlags, CCState &State) { |
204 | |
|
205 | 0 | if (LocVT == MVT::i64) { |
206 | 0 | static const MCPhysReg RegList1[] = { |
207 | 0 | SystemZ::R7D, SystemZ::R8D, SystemZ::R10D, SystemZ::R11D, SystemZ::R12D, SystemZ::R13D, SystemZ::R6D, SystemZ::R2D, SystemZ::R3D, SystemZ::R4D, SystemZ::R5D, SystemZ::R9D |
208 | 0 | }; |
209 | 0 | if (unsigned Reg = State.AllocateReg(RegList1)) { |
210 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
211 | 0 | return false; |
212 | 0 | } |
213 | 0 | } |
214 | | |
215 | 0 | if (LocVT == MVT::f32) { |
216 | 0 | static const MCPhysReg RegList2[] = { |
217 | 0 | SystemZ::F8S, SystemZ::F9S, SystemZ::F10S, SystemZ::F11S, SystemZ::F0S, SystemZ::F1S |
218 | 0 | }; |
219 | 0 | if (unsigned Reg = State.AllocateReg(RegList2)) { |
220 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
221 | 0 | return false; |
222 | 0 | } |
223 | 0 | } |
224 | | |
225 | 0 | if (LocVT == MVT::f64) { |
226 | 0 | static const MCPhysReg RegList3[] = { |
227 | 0 | SystemZ::F12D, SystemZ::F13D, SystemZ::F14D, SystemZ::F15D, SystemZ::F2D, SystemZ::F3D |
228 | 0 | }; |
229 | 0 | if (unsigned Reg = State.AllocateReg(RegList3)) { |
230 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
231 | 0 | return false; |
232 | 0 | } |
233 | 0 | } |
234 | | |
235 | 0 | if (static_cast<const SystemZSubtarget&>(State.getMachineFunction().getSubtarget()).hasVector()) { |
236 | 0 | if (LocVT == MVT::v16i8 || |
237 | 0 | LocVT == MVT::v8i16 || |
238 | 0 | LocVT == MVT::v4i32 || |
239 | 0 | LocVT == MVT::v2i64 || |
240 | 0 | LocVT == MVT::v4f32 || |
241 | 0 | LocVT == MVT::v2f64) { |
242 | 0 | if (static_cast<SystemZCCState *>(&State)->IsFixed(ValNo)) { |
243 | 0 | static const MCPhysReg RegList4[] = { |
244 | 0 | SystemZ::V16, SystemZ::V17, SystemZ::V18, SystemZ::V19, SystemZ::V20, SystemZ::V21 |
245 | 0 | }; |
246 | 0 | if (unsigned Reg = State.AllocateReg(RegList4)) { |
247 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
248 | 0 | return false; |
249 | 0 | } |
250 | 0 | } |
251 | 0 | } |
252 | 0 | } |
253 | | |
254 | 0 | if (CC_SystemZ_GHC_Error(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) |
255 | 0 | return false; |
256 | | |
257 | 0 | return true; // CC didn't match. |
258 | 0 | } |
259 | | |
260 | | |
261 | | static bool CC_SystemZ_XPLINK64(unsigned ValNo, MVT ValVT, |
262 | | MVT LocVT, CCValAssign::LocInfo LocInfo, |
263 | 0 | ISD::ArgFlagsTy ArgFlags, CCState &State) { |
264 | |
|
265 | 0 | if (LocVT == MVT::i32) { |
266 | 0 | if (ArgFlags.isSExt() || ArgFlags.isZExt()) { |
267 | 0 | LocVT = MVT::i64; |
268 | 0 | if (ArgFlags.isSExt()) |
269 | 0 | LocInfo = CCValAssign::SExt; |
270 | 0 | else if (ArgFlags.isZExt()) |
271 | 0 | LocInfo = CCValAssign::ZExt; |
272 | 0 | else |
273 | 0 | LocInfo = CCValAssign::AExt; |
274 | 0 | } |
275 | 0 | } |
276 | |
|
277 | 0 | if (LocVT == MVT::f32 || |
278 | 0 | LocVT == MVT::f64) { |
279 | 0 | if (!(static_cast<SystemZCCState *>(&State)->IsFixed(ValNo))) { |
280 | 0 | LocVT = MVT::i64; |
281 | 0 | LocInfo = CCValAssign::BCvt; |
282 | 0 | } |
283 | 0 | } |
284 | |
|
285 | 0 | if (LocVT == MVT::f128) { |
286 | 0 | if (!(static_cast<SystemZCCState *>(&State)->IsFixed(ValNo))) { |
287 | 0 | if (CC_XPLINK64_Allocate128BitVararg(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) |
288 | 0 | return false; |
289 | 0 | } |
290 | 0 | } |
291 | | |
292 | 0 | if (static_cast<const SystemZSubtarget&>(State.getMachineFunction().getSubtarget()).hasVector()) { |
293 | 0 | if (LocVT == MVT::v16i8 || |
294 | 0 | LocVT == MVT::v8i16 || |
295 | 0 | LocVT == MVT::v4i32 || |
296 | 0 | LocVT == MVT::v2i64 || |
297 | 0 | LocVT == MVT::v4f32 || |
298 | 0 | LocVT == MVT::v2f64) { |
299 | 0 | if (!(static_cast<SystemZCCState *>(&State)->IsFixed(ValNo))) { |
300 | 0 | if (CC_XPLINK64_Allocate128BitVararg(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) |
301 | 0 | return false; |
302 | 0 | } |
303 | 0 | } |
304 | 0 | } |
305 | | |
306 | 0 | if (ArgFlags.isSwiftSelf()) { |
307 | 0 | if (LocVT == MVT::i64) { |
308 | 0 | if (unsigned Reg = State.AllocateReg(SystemZ::R10D)) { |
309 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
310 | 0 | return false; |
311 | 0 | } |
312 | 0 | } |
313 | 0 | } |
314 | | |
315 | 0 | if (ArgFlags.isSwiftError()) { |
316 | 0 | if (LocVT == MVT::i64) { |
317 | 0 | if (unsigned Reg = State.AllocateReg(SystemZ::R0D)) { |
318 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
319 | 0 | return false; |
320 | 0 | } |
321 | 0 | } |
322 | 0 | } |
323 | | |
324 | 0 | if (LocVT == MVT::i128) { |
325 | 0 | LocVT = MVT::i64; |
326 | 0 | LocInfo = CCValAssign::Indirect; |
327 | 0 | } |
328 | |
|
329 | 0 | if (LocVT == MVT::i64) { |
330 | 0 | if (CC_SystemZ_I128Indirect(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) |
331 | 0 | return false; |
332 | 0 | } |
333 | | |
334 | 0 | if (LocVT == MVT::i64) { |
335 | 0 | static const MCPhysReg RegList1[] = { |
336 | 0 | SystemZ::R1D, SystemZ::R2D, SystemZ::R3D |
337 | 0 | }; |
338 | 0 | if (unsigned Reg = State.AllocateReg(RegList1)) { |
339 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
340 | 0 | (void)State.AllocateStack(8, Align(8)); |
341 | 0 | return false; |
342 | 0 | } |
343 | 0 | } |
344 | | |
345 | 0 | if (static_cast<const SystemZSubtarget&>(State.getMachineFunction().getSubtarget()).hasVector()) { |
346 | 0 | if (LocVT == MVT::v16i8 || |
347 | 0 | LocVT == MVT::v8i16 || |
348 | 0 | LocVT == MVT::v4i32 || |
349 | 0 | LocVT == MVT::v2i64 || |
350 | 0 | LocVT == MVT::v4f32 || |
351 | 0 | LocVT == MVT::v2f64) { |
352 | 0 | if (static_cast<SystemZCCState *>(&State)->IsFixed(ValNo)) { |
353 | 0 | if (CC_XPLINK64_Shadow_Reg(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) |
354 | 0 | return false; |
355 | 0 | } |
356 | 0 | } |
357 | 0 | } |
358 | | |
359 | 0 | if (static_cast<const SystemZSubtarget&>(State.getMachineFunction().getSubtarget()).hasVector()) { |
360 | 0 | if (LocVT == MVT::v16i8 || |
361 | 0 | LocVT == MVT::v8i16 || |
362 | 0 | LocVT == MVT::v4i32 || |
363 | 0 | LocVT == MVT::v2i64 || |
364 | 0 | LocVT == MVT::v4f32 || |
365 | 0 | LocVT == MVT::v2f64) { |
366 | 0 | if (static_cast<SystemZCCState *>(&State)->IsFixed(ValNo)) { |
367 | 0 | static const MCPhysReg RegList2[] = { |
368 | 0 | SystemZ::V24, SystemZ::V25, SystemZ::V26, SystemZ::V27, SystemZ::V28, SystemZ::V29, SystemZ::V30, SystemZ::V31 |
369 | 0 | }; |
370 | 0 | if (unsigned Reg = State.AllocateReg(RegList2)) { |
371 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
372 | 0 | (void)State.AllocateStack(16, Align(8)); |
373 | 0 | return false; |
374 | 0 | } |
375 | 0 | } |
376 | 0 | } |
377 | 0 | } |
378 | | |
379 | 0 | if (LocVT == MVT::f32 || |
380 | 0 | LocVT == MVT::f64) { |
381 | 0 | if (static_cast<SystemZCCState *>(&State)->IsFixed(ValNo)) { |
382 | 0 | if (CC_XPLINK64_Shadow_Reg(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) |
383 | 0 | return false; |
384 | 0 | } |
385 | 0 | } |
386 | | |
387 | 0 | if (LocVT == MVT::f32) { |
388 | 0 | if (static_cast<SystemZCCState *>(&State)->IsFixed(ValNo)) { |
389 | 0 | static const MCPhysReg RegList3[] = { |
390 | 0 | SystemZ::F0S, SystemZ::F2S, SystemZ::F4S, SystemZ::F6S |
391 | 0 | }; |
392 | 0 | if (unsigned Reg = State.AllocateReg(RegList3)) { |
393 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
394 | 0 | (void)State.AllocateStack(4, Align(8)); |
395 | 0 | return false; |
396 | 0 | } |
397 | 0 | } |
398 | 0 | } |
399 | | |
400 | 0 | if (LocVT == MVT::f64) { |
401 | 0 | if (static_cast<SystemZCCState *>(&State)->IsFixed(ValNo)) { |
402 | 0 | static const MCPhysReg RegList4[] = { |
403 | 0 | SystemZ::F0D, SystemZ::F2D, SystemZ::F4D, SystemZ::F6D |
404 | 0 | }; |
405 | 0 | if (unsigned Reg = State.AllocateReg(RegList4)) { |
406 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
407 | 0 | (void)State.AllocateStack(8, Align(8)); |
408 | 0 | return false; |
409 | 0 | } |
410 | 0 | } |
411 | 0 | } |
412 | | |
413 | 0 | if (LocVT == MVT::f128) { |
414 | 0 | if (static_cast<SystemZCCState *>(&State)->IsFixed(ValNo)) { |
415 | 0 | if (CC_XPLINK64_Shadow_Reg(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) |
416 | 0 | return false; |
417 | 0 | } |
418 | 0 | } |
419 | | |
420 | 0 | if (LocVT == MVT::f128) { |
421 | 0 | if (static_cast<SystemZCCState *>(&State)->IsFixed(ValNo)) { |
422 | 0 | static const MCPhysReg RegList5[] = { |
423 | 0 | SystemZ::F0Q, SystemZ::F4Q |
424 | 0 | }; |
425 | 0 | if (unsigned Reg = State.AllocateReg(RegList5)) { |
426 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
427 | 0 | (void)State.AllocateStack(16, Align(8)); |
428 | 0 | return false; |
429 | 0 | } |
430 | 0 | } |
431 | 0 | } |
432 | | |
433 | 0 | if (LocVT == MVT::i32 || |
434 | 0 | LocVT == MVT::i64 || |
435 | 0 | LocVT == MVT::f32 || |
436 | 0 | LocVT == MVT::f64) { |
437 | 0 | int64_t Offset6 = State.AllocateStack(8, Align(8)); |
438 | 0 | State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset6, LocVT, LocInfo)); |
439 | 0 | return false; |
440 | 0 | } |
441 | | |
442 | 0 | if (LocVT == MVT::f128) { |
443 | 0 | int64_t Offset7 = State.AllocateStack(16, Align(8)); |
444 | 0 | State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset7, LocVT, LocInfo)); |
445 | 0 | return false; |
446 | 0 | } |
447 | | |
448 | 0 | if (static_cast<const SystemZSubtarget&>(State.getMachineFunction().getSubtarget()).hasVector()) { |
449 | 0 | if (LocVT == MVT::v16i8 || |
450 | 0 | LocVT == MVT::v8i16 || |
451 | 0 | LocVT == MVT::v4i32 || |
452 | 0 | LocVT == MVT::v2i64 || |
453 | 0 | LocVT == MVT::v4f32 || |
454 | 0 | LocVT == MVT::v2f64) { |
455 | 0 | int64_t Offset8 = State.AllocateStack(16, Align(8)); |
456 | 0 | State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset8, LocVT, LocInfo)); |
457 | 0 | return false; |
458 | 0 | } |
459 | 0 | } |
460 | | |
461 | 0 | return true; // CC didn't match. |
462 | 0 | } |
463 | | |
464 | | |
465 | | static bool RetCC_SystemZ(unsigned ValNo, MVT ValVT, |
466 | | MVT LocVT, CCValAssign::LocInfo LocInfo, |
467 | 0 | ISD::ArgFlagsTy ArgFlags, CCState &State) { |
468 | |
|
469 | 0 | if (static_cast<const SystemZSubtarget&>(State.getMachineFunction().getSubtarget()).isTargetXPLINK64()) { |
470 | 0 | if (!RetCC_SystemZ_XPLINK64(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) |
471 | 0 | return false; |
472 | 0 | } |
473 | | |
474 | 0 | if (static_cast<const SystemZSubtarget&>(State.getMachineFunction().getSubtarget()).isTargetELF()) { |
475 | 0 | if (!RetCC_SystemZ_ELF(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) |
476 | 0 | return false; |
477 | 0 | } |
478 | | |
479 | 0 | return true; // CC didn't match. |
480 | 0 | } |
481 | | |
482 | | |
483 | | static bool RetCC_SystemZ_ELF(unsigned ValNo, MVT ValVT, |
484 | | MVT LocVT, CCValAssign::LocInfo LocInfo, |
485 | 0 | ISD::ArgFlagsTy ArgFlags, CCState &State) { |
486 | |
|
487 | 0 | if (LocVT == MVT::i32) { |
488 | 0 | if (ArgFlags.isSExt() || ArgFlags.isZExt()) { |
489 | 0 | LocVT = MVT::i64; |
490 | 0 | if (ArgFlags.isSExt()) |
491 | 0 | LocInfo = CCValAssign::SExt; |
492 | 0 | else if (ArgFlags.isZExt()) |
493 | 0 | LocInfo = CCValAssign::ZExt; |
494 | 0 | else |
495 | 0 | LocInfo = CCValAssign::AExt; |
496 | 0 | } |
497 | 0 | } |
498 | |
|
499 | 0 | if (ArgFlags.isSwiftError()) { |
500 | 0 | if (LocVT == MVT::i64) { |
501 | 0 | if (unsigned Reg = State.AllocateReg(SystemZ::R9D)) { |
502 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
503 | 0 | return false; |
504 | 0 | } |
505 | 0 | } |
506 | 0 | } |
507 | | |
508 | 0 | if (LocVT == MVT::i32) { |
509 | 0 | static const MCPhysReg RegList1[] = { |
510 | 0 | SystemZ::R2L, SystemZ::R3L, SystemZ::R4L, SystemZ::R5L |
511 | 0 | }; |
512 | 0 | if (unsigned Reg = State.AllocateReg(RegList1)) { |
513 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
514 | 0 | return false; |
515 | 0 | } |
516 | 0 | } |
517 | | |
518 | 0 | if (LocVT == MVT::i64) { |
519 | 0 | static const MCPhysReg RegList2[] = { |
520 | 0 | SystemZ::R2D, SystemZ::R3D, SystemZ::R4D, SystemZ::R5D |
521 | 0 | }; |
522 | 0 | if (unsigned Reg = State.AllocateReg(RegList2)) { |
523 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
524 | 0 | return false; |
525 | 0 | } |
526 | 0 | } |
527 | | |
528 | 0 | if (LocVT == MVT::f32) { |
529 | 0 | static const MCPhysReg RegList3[] = { |
530 | 0 | SystemZ::F0S, SystemZ::F2S, SystemZ::F4S, SystemZ::F6S |
531 | 0 | }; |
532 | 0 | if (unsigned Reg = State.AllocateReg(RegList3)) { |
533 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
534 | 0 | return false; |
535 | 0 | } |
536 | 0 | } |
537 | | |
538 | 0 | if (LocVT == MVT::f64) { |
539 | 0 | static const MCPhysReg RegList4[] = { |
540 | 0 | SystemZ::F0D, SystemZ::F2D, SystemZ::F4D, SystemZ::F6D |
541 | 0 | }; |
542 | 0 | if (unsigned Reg = State.AllocateReg(RegList4)) { |
543 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
544 | 0 | return false; |
545 | 0 | } |
546 | 0 | } |
547 | | |
548 | 0 | if (static_cast<const SystemZSubtarget&>(State.getMachineFunction().getSubtarget()).hasVector()) { |
549 | 0 | if (LocVT == MVT::v16i8 || |
550 | 0 | LocVT == MVT::v8i16 || |
551 | 0 | LocVT == MVT::v4i32 || |
552 | 0 | LocVT == MVT::v2i64 || |
553 | 0 | LocVT == MVT::v4f32 || |
554 | 0 | LocVT == MVT::v2f64) { |
555 | 0 | static const MCPhysReg RegList5[] = { |
556 | 0 | SystemZ::V24, SystemZ::V26, SystemZ::V28, SystemZ::V30, SystemZ::V25, SystemZ::V27, SystemZ::V29, SystemZ::V31 |
557 | 0 | }; |
558 | 0 | if (unsigned Reg = State.AllocateReg(RegList5)) { |
559 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
560 | 0 | return false; |
561 | 0 | } |
562 | 0 | } |
563 | 0 | } |
564 | | |
565 | 0 | return true; // CC didn't match. |
566 | 0 | } |
567 | | |
568 | | |
569 | | static bool RetCC_SystemZ_XPLINK64(unsigned ValNo, MVT ValVT, |
570 | | MVT LocVT, CCValAssign::LocInfo LocInfo, |
571 | 0 | ISD::ArgFlagsTy ArgFlags, CCState &State) { |
572 | |
|
573 | 0 | if (LocVT == MVT::i32) { |
574 | 0 | LocVT = MVT::i64; |
575 | 0 | if (ArgFlags.isSExt()) |
576 | 0 | LocInfo = CCValAssign::SExt; |
577 | 0 | else if (ArgFlags.isZExt()) |
578 | 0 | LocInfo = CCValAssign::ZExt; |
579 | 0 | else |
580 | 0 | LocInfo = CCValAssign::AExt; |
581 | 0 | } |
582 | |
|
583 | 0 | if (LocVT == MVT::i64) { |
584 | 0 | if (ArgFlags.isInReg()) { |
585 | 0 | static const MCPhysReg RegList1[] = { |
586 | 0 | SystemZ::R1D, SystemZ::R2D, SystemZ::R3D |
587 | 0 | }; |
588 | 0 | if (unsigned Reg = State.AllocateReg(RegList1)) { |
589 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
590 | 0 | return false; |
591 | 0 | } |
592 | 0 | } |
593 | 0 | } |
594 | | |
595 | 0 | if (LocVT == MVT::i64) { |
596 | 0 | static const MCPhysReg RegList2[] = { |
597 | 0 | SystemZ::R3D, SystemZ::R2D, SystemZ::R1D |
598 | 0 | }; |
599 | 0 | if (unsigned Reg = State.AllocateReg(RegList2)) { |
600 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
601 | 0 | return false; |
602 | 0 | } |
603 | 0 | } |
604 | | |
605 | 0 | if (LocVT == MVT::f32) { |
606 | 0 | static const MCPhysReg RegList3[] = { |
607 | 0 | SystemZ::F0S, SystemZ::F2S, SystemZ::F4S, SystemZ::F6S |
608 | 0 | }; |
609 | 0 | if (unsigned Reg = State.AllocateReg(RegList3)) { |
610 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
611 | 0 | return false; |
612 | 0 | } |
613 | 0 | } |
614 | | |
615 | 0 | if (LocVT == MVT::f64) { |
616 | 0 | static const MCPhysReg RegList4[] = { |
617 | 0 | SystemZ::F0D, SystemZ::F2D, SystemZ::F4D, SystemZ::F6D |
618 | 0 | }; |
619 | 0 | if (unsigned Reg = State.AllocateReg(RegList4)) { |
620 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
621 | 0 | return false; |
622 | 0 | } |
623 | 0 | } |
624 | | |
625 | 0 | if (LocVT == MVT::f128) { |
626 | 0 | static const MCPhysReg RegList5[] = { |
627 | 0 | SystemZ::F0Q, SystemZ::F4Q |
628 | 0 | }; |
629 | 0 | if (unsigned Reg = State.AllocateReg(RegList5)) { |
630 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
631 | 0 | return false; |
632 | 0 | } |
633 | 0 | } |
634 | | |
635 | 0 | if (static_cast<const SystemZSubtarget&>(State.getMachineFunction().getSubtarget()).hasVector()) { |
636 | 0 | if (LocVT == MVT::v16i8 || |
637 | 0 | LocVT == MVT::v8i16 || |
638 | 0 | LocVT == MVT::v4i32 || |
639 | 0 | LocVT == MVT::v2i64 || |
640 | 0 | LocVT == MVT::v4f32 || |
641 | 0 | LocVT == MVT::v2f64) { |
642 | 0 | static const MCPhysReg RegList6[] = { |
643 | 0 | SystemZ::V24, SystemZ::V25, SystemZ::V26, SystemZ::V27, SystemZ::V28, SystemZ::V29, SystemZ::V30, SystemZ::V31 |
644 | 0 | }; |
645 | 0 | if (unsigned Reg = State.AllocateReg(RegList6)) { |
646 | 0 | State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); |
647 | 0 | return false; |
648 | 0 | } |
649 | 0 | } |
650 | 0 | } |
651 | | |
652 | 0 | return true; // CC didn't match. |
653 | 0 | } |
654 | | |
655 | | #else |
656 | | |
657 | | const MCRegister CC_SystemZ_ArgRegs[] = { 0 }; |
658 | | const MCRegister CC_SystemZ_ELF_ArgRegs[] = { SystemZ::F0D, SystemZ::F0S, SystemZ::F2D, SystemZ::F2S, SystemZ::F4D, SystemZ::F4S, SystemZ::F6D, SystemZ::F6S, SystemZ::R2D, SystemZ::R2L, SystemZ::R3D, SystemZ::R3L, SystemZ::R4D, SystemZ::R4L, SystemZ::R5D, SystemZ::R5L, SystemZ::R6D, SystemZ::R6L, SystemZ::V24, SystemZ::V25, SystemZ::V26, SystemZ::V27, SystemZ::V28, SystemZ::V29, SystemZ::V30, SystemZ::V31 }; |
659 | | const MCRegister CC_SystemZ_GHC_ArgRegs[] = { SystemZ::F0S, SystemZ::F10S, SystemZ::F11S, SystemZ::F12D, SystemZ::F13D, SystemZ::F14D, SystemZ::F15D, SystemZ::F1S, SystemZ::F2D, SystemZ::F3D, SystemZ::F8S, SystemZ::F9S, SystemZ::R10D, SystemZ::R11D, SystemZ::R12D, SystemZ::R13D, SystemZ::R2D, SystemZ::R3D, SystemZ::R4D, SystemZ::R5D, SystemZ::R6D, SystemZ::R7D, SystemZ::R8D, SystemZ::R9D, SystemZ::V16, SystemZ::V17, SystemZ::V18, SystemZ::V19, SystemZ::V20, SystemZ::V21 }; |
660 | | const MCRegister CC_SystemZ_XPLINK64_ArgRegs[] = { SystemZ::F0D, SystemZ::F0Q, SystemZ::F0S, SystemZ::F2D, SystemZ::F2S, SystemZ::F4D, SystemZ::F4Q, SystemZ::F4S, SystemZ::F6D, SystemZ::F6S, SystemZ::R1D, SystemZ::R2D, SystemZ::R3D, SystemZ::V24, SystemZ::V25, SystemZ::V26, SystemZ::V27, SystemZ::V28, SystemZ::V29, SystemZ::V30, SystemZ::V31 }; |
661 | | const MCRegister RetCC_SystemZ_ArgRegs[] = { 0 }; |
662 | | const MCRegister RetCC_SystemZ_ELF_ArgRegs[] = { SystemZ::F0D, SystemZ::F0S, SystemZ::F2D, SystemZ::F2S, SystemZ::F4D, SystemZ::F4S, SystemZ::F6D, SystemZ::F6S, SystemZ::R2D, SystemZ::R2L, SystemZ::R3D, SystemZ::R3L, SystemZ::R4D, SystemZ::R4L, SystemZ::R5D, SystemZ::R5L, SystemZ::V24, SystemZ::V25, SystemZ::V26, SystemZ::V27, SystemZ::V28, SystemZ::V29, SystemZ::V30, SystemZ::V31 }; |
663 | | const MCRegister RetCC_SystemZ_XPLINK64_ArgRegs[] = { SystemZ::F0D, SystemZ::F0Q, SystemZ::F0S, SystemZ::F2D, SystemZ::F2S, SystemZ::F4D, SystemZ::F4Q, SystemZ::F4S, SystemZ::F6D, SystemZ::F6S, SystemZ::R1D, SystemZ::R2D, SystemZ::R3D, SystemZ::V24, SystemZ::V25, SystemZ::V26, SystemZ::V27, SystemZ::V28, SystemZ::V29, SystemZ::V30, SystemZ::V31 }; |
664 | | |
665 | | // Registers used by Swift. |
666 | | const MCRegister CC_SystemZ_ELF_Swift_ArgRegs[] = { SystemZ::R10D, SystemZ::R9D }; |
667 | | const MCRegister CC_SystemZ_XPLINK64_Swift_ArgRegs[] = { SystemZ::R0D, SystemZ::R10D }; |
668 | | const MCRegister RetCC_SystemZ_ELF_Swift_ArgRegs[] = { SystemZ::R9D }; |
669 | | |
670 | | #endif // CC_REGISTER_LIST |