1/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
2|* *|
3|* Calling Convention Implementation Fragment *|
4|* *|
5|* Automatically generated file, do not edit! *|
6|* *|
7\*===----------------------------------------------------------------------===*/
8
9#if !defined(GET_CC_REGISTER_LISTS)
10
11static bool CC_Mips(unsigned ValNo, MVT ValVT,
12 MVT LocVT, CCValAssign::LocInfo LocInfo,
13 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State);
14static bool CC_Mips16RetHelper(unsigned ValNo, MVT ValVT,
15 MVT LocVT, CCValAssign::LocInfo LocInfo,
16 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State);
17static bool CC_MipsN(unsigned ValNo, MVT ValVT,
18 MVT LocVT, CCValAssign::LocInfo LocInfo,
19 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State);
20static bool CC_MipsN_FastCC(unsigned ValNo, MVT ValVT,
21 MVT LocVT, CCValAssign::LocInfo LocInfo,
22 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State);
23static bool CC_MipsN_SoftFloat(unsigned ValNo, MVT ValVT,
24 MVT LocVT, CCValAssign::LocInfo LocInfo,
25 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State);
26static bool CC_MipsN_VarArg(unsigned ValNo, MVT ValVT,
27 MVT LocVT, CCValAssign::LocInfo LocInfo,
28 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State);
29static bool CC_MipsO32(unsigned ValNo, MVT ValVT,
30 MVT LocVT, CCValAssign::LocInfo LocInfo,
31 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State);
32static bool CC_MipsO32_FP(unsigned ValNo, MVT ValVT,
33 MVT LocVT, CCValAssign::LocInfo LocInfo,
34 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State);
35static bool CC_MipsO32_FastCC(unsigned ValNo, MVT ValVT,
36 MVT LocVT, CCValAssign::LocInfo LocInfo,
37 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State);
38static bool CC_Mips_ByVal(unsigned ValNo, MVT ValVT,
39 MVT LocVT, CCValAssign::LocInfo LocInfo,
40 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State);
41static bool CC_Mips_FastCC(unsigned ValNo, MVT ValVT,
42 MVT LocVT, CCValAssign::LocInfo LocInfo,
43 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State);
44static bool CC_Mips_FixedArg(unsigned ValNo, MVT ValVT,
45 MVT LocVT, CCValAssign::LocInfo LocInfo,
46 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State);
47static bool CC_Mips_VarArg(unsigned ValNo, MVT ValVT,
48 MVT LocVT, CCValAssign::LocInfo LocInfo,
49 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State);
50static bool RetCC_F128(unsigned ValNo, MVT ValVT,
51 MVT LocVT, CCValAssign::LocInfo LocInfo,
52 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State);
53static bool RetCC_F128HardFloat(unsigned ValNo, MVT ValVT,
54 MVT LocVT, CCValAssign::LocInfo LocInfo,
55 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State);
56static bool RetCC_F128SoftFloat(unsigned ValNo, MVT ValVT,
57 MVT LocVT, CCValAssign::LocInfo LocInfo,
58 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State);
59static bool RetCC_Mips(unsigned ValNo, MVT ValVT,
60 MVT LocVT, CCValAssign::LocInfo LocInfo,
61 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State);
62static bool RetCC_MipsN(unsigned ValNo, MVT ValVT,
63 MVT LocVT, CCValAssign::LocInfo LocInfo,
64 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State);
65static bool RetCC_MipsO32(unsigned ValNo, MVT ValVT,
66 MVT LocVT, CCValAssign::LocInfo LocInfo,
67 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State);
68
69
70static bool CC_Mips(unsigned ValNo, MVT ValVT,
71 MVT LocVT, CCValAssign::LocInfo LocInfo,
72 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State) {
73
74 if (State.isVarArg()) {
75 if (ArgFlags.isVarArg()) {
76 if (!CC_Mips_VarArg(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State))
77 return false;
78 }
79 }
80
81 if (!CC_Mips_FixedArg(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State))
82 return false;
83
84 return true; // CC didn't match.
85}
86
87
88static bool CC_Mips16RetHelper(unsigned ValNo, MVT ValVT,
89 MVT LocVT, CCValAssign::LocInfo LocInfo,
90 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State) {
91
92 if (ArgFlags.isByVal()) {
93 if (!CC_Mips_ByVal(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State))
94 return false;
95 }
96
97 if (LocVT == MVT::i32) {
98 static const MCPhysReg RegList1[] = {
99 Mips::V0, Mips::V1, Mips::A0, Mips::A1
100 };
101 if (MCRegister Reg = State.AllocateReg(Regs: RegList1)) {
102 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
103 return false;
104 }
105 }
106
107 return true; // CC didn't match.
108}
109
110
111static bool CC_MipsN(unsigned ValNo, MVT ValVT,
112 MVT LocVT, CCValAssign::LocInfo LocInfo,
113 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State) {
114
115 if (LocVT == MVT::i8 ||
116 LocVT == MVT::i16 ||
117 LocVT == MVT::i32 ||
118 LocVT == MVT::i64) {
119 if (!State.getMachineFunction().getSubtarget<MipsSubtarget>().isLittle()) {
120 if (ArgFlags.isInReg()) {
121 LocVT = MVT::i64;
122 if (ArgFlags.isSExt())
123 LocInfo = CCValAssign::SExtUpper;
124 else if (ArgFlags.isZExt())
125 LocInfo = CCValAssign::ZExtUpper;
126 else
127 LocInfo = CCValAssign::AExtUpper;
128 }
129 }
130 }
131
132 if (LocVT == MVT::i32) {
133 if (State.getMachineFunction().getSubtarget<MipsSubtarget>().useSoftFloat()) {
134 if (OrigTy->isFloatingPointTy()) {
135 if (!CC_MipsN_SoftFloat(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State))
136 return false;
137 }
138 }
139 }
140
141 if (LocVT == MVT::i8 ||
142 LocVT == MVT::i16 ||
143 LocVT == MVT::i32) {
144 LocVT = MVT::i64;
145 if (ArgFlags.isSExt())
146 LocInfo = CCValAssign::SExt;
147 else if (ArgFlags.isZExt())
148 LocInfo = CCValAssign::ZExt;
149 else
150 LocInfo = CCValAssign::AExt;
151 }
152
153 if (LocVT == MVT::i64) {
154 static const MCPhysReg RegList1[] = {
155 Mips::A0_64, Mips::A1_64, Mips::A2_64, Mips::A3_64, Mips::T0_64, Mips::T1_64, Mips::T2_64, Mips::T3_64
156 };
157 static const MCPhysReg RegList2[] = {
158 Mips::D12_64, Mips::D13_64, Mips::D14_64, Mips::D15_64, Mips::D16_64, Mips::D17_64, Mips::D18_64, Mips::D19_64
159 };
160 if (MCRegister Reg = State.AllocateReg(Regs: RegList1, ShadowRegs: RegList2)) {
161 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
162 return false;
163 }
164 }
165
166 if (LocVT == MVT::f32) {
167 static const MCPhysReg RegList3[] = {
168 Mips::F12, Mips::F13, Mips::F14, Mips::F15, Mips::F16, Mips::F17, Mips::F18, Mips::F19
169 };
170 static const MCPhysReg RegList4[] = {
171 Mips::A0_64, Mips::A1_64, Mips::A2_64, Mips::A3_64, Mips::T0_64, Mips::T1_64, Mips::T2_64, Mips::T3_64
172 };
173 if (MCRegister Reg = State.AllocateReg(Regs: RegList3, ShadowRegs: RegList4)) {
174 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
175 return false;
176 }
177 }
178
179 if (LocVT == MVT::f64) {
180 static const MCPhysReg RegList5[] = {
181 Mips::D12_64, Mips::D13_64, Mips::D14_64, Mips::D15_64, Mips::D16_64, Mips::D17_64, Mips::D18_64, Mips::D19_64
182 };
183 static const MCPhysReg RegList6[] = {
184 Mips::A0_64, Mips::A1_64, Mips::A2_64, Mips::A3_64, Mips::T0_64, Mips::T1_64, Mips::T2_64, Mips::T3_64
185 };
186 if (MCRegister Reg = State.AllocateReg(Regs: RegList5, ShadowRegs: RegList6)) {
187 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
188 return false;
189 }
190 }
191
192 if (LocVT == MVT::f32) {
193 int64_t Offset7 = State.AllocateStack(Size: 4, Alignment: Align(8));
194 State.addLoc(V: CCValAssign::getMem(ValNo, ValVT, Offset: Offset7, LocVT, HTP: LocInfo));
195 return false;
196 }
197
198 if (LocVT == MVT::i64 ||
199 LocVT == MVT::f64) {
200 int64_t Offset8 = State.AllocateStack(Size: 8, Alignment: Align(8));
201 State.addLoc(V: CCValAssign::getMem(ValNo, ValVT, Offset: Offset8, LocVT, HTP: LocInfo));
202 return false;
203 }
204
205 return true; // CC didn't match.
206}
207
208
209static bool CC_MipsN_FastCC(unsigned ValNo, MVT ValVT,
210 MVT LocVT, CCValAssign::LocInfo LocInfo,
211 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State) {
212
213 if (LocVT == MVT::i64) {
214 static const MCPhysReg RegList1[] = {
215 Mips::A0_64, Mips::A1_64, Mips::A2_64, Mips::A3_64, Mips::T0_64, Mips::T1_64, Mips::T2_64, Mips::T3_64, Mips::T4_64, Mips::T5_64, Mips::T6_64, Mips::T7_64, Mips::T8_64, Mips::V1_64
216 };
217 if (MCRegister Reg = State.AllocateReg(Regs: RegList1)) {
218 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
219 return false;
220 }
221 }
222
223 if (LocVT == MVT::f64) {
224 static const MCPhysReg RegList2[] = {
225 Mips::D0_64, Mips::D1_64, Mips::D2_64, Mips::D3_64, Mips::D4_64, Mips::D5_64, Mips::D6_64, Mips::D7_64, Mips::D8_64, Mips::D9_64, Mips::D10_64, Mips::D11_64, Mips::D12_64, Mips::D13_64, Mips::D14_64, Mips::D15_64, Mips::D16_64, Mips::D17_64, Mips::D18_64, Mips::D19_64
226 };
227 if (MCRegister Reg = State.AllocateReg(Regs: RegList2)) {
228 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
229 return false;
230 }
231 }
232
233 if (LocVT == MVT::i64 ||
234 LocVT == MVT::f64) {
235 int64_t Offset3 = State.AllocateStack(Size: 8, Alignment: Align(8));
236 State.addLoc(V: CCValAssign::getMem(ValNo, ValVT, Offset: Offset3, LocVT, HTP: LocInfo));
237 return false;
238 }
239
240 return true; // CC didn't match.
241}
242
243
244static bool CC_MipsN_SoftFloat(unsigned ValNo, MVT ValVT,
245 MVT LocVT, CCValAssign::LocInfo LocInfo,
246 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State) {
247
248 static const MCPhysReg RegList1[] = {
249 Mips::A0, Mips::A1, Mips::A2, Mips::A3, Mips::T0, Mips::T1, Mips::T2, Mips::T3
250 };
251 static const MCPhysReg RegList2[] = {
252 Mips::D12_64, Mips::D13_64, Mips::D14_64, Mips::D15_64, Mips::D16_64, Mips::D17_64, Mips::D18_64, Mips::D19_64
253 };
254 if (MCRegister Reg = State.AllocateReg(Regs: RegList1, ShadowRegs: RegList2)) {
255 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
256 return false;
257 }
258
259 int64_t Offset3 = State.AllocateStack(Size: 4, Alignment: Align(8));
260 State.addLoc(V: CCValAssign::getMem(ValNo, ValVT, Offset: Offset3, LocVT, HTP: LocInfo));
261 return false;
262
263 return true; // CC didn't match.
264}
265
266
267static bool CC_MipsN_VarArg(unsigned ValNo, MVT ValVT,
268 MVT LocVT, CCValAssign::LocInfo LocInfo,
269 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State) {
270
271 if (LocVT == MVT::i8 ||
272 LocVT == MVT::i16 ||
273 LocVT == MVT::i32 ||
274 LocVT == MVT::i64) {
275 if (!State.getMachineFunction().getSubtarget<MipsSubtarget>().isLittle()) {
276 if (ArgFlags.isInReg()) {
277 LocVT = MVT::i64;
278 if (ArgFlags.isSExt())
279 LocInfo = CCValAssign::SExtUpper;
280 else if (ArgFlags.isZExt())
281 LocInfo = CCValAssign::ZExtUpper;
282 else
283 LocInfo = CCValAssign::AExtUpper;
284 }
285 }
286 }
287
288 if (LocVT == MVT::i8 ||
289 LocVT == MVT::i16 ||
290 LocVT == MVT::i32) {
291 LocVT = MVT::i64;
292 if (ArgFlags.isSExt())
293 LocInfo = CCValAssign::SExt;
294 else if (ArgFlags.isZExt())
295 LocInfo = CCValAssign::ZExt;
296 else
297 LocInfo = CCValAssign::AExt;
298 }
299
300 if (LocVT == MVT::f32) {
301 static const MCPhysReg RegList1[] = {
302 Mips::A0, Mips::A1, Mips::A2, Mips::A3, Mips::T0, Mips::T1, Mips::T2, Mips::T3
303 };
304 if (MCRegister Reg = State.AllocateReg(Regs: RegList1)) {
305 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
306 return false;
307 }
308 }
309
310 if (LocVT == MVT::i64 ||
311 LocVT == MVT::f64) {
312 static const MCPhysReg RegList2[] = {
313 Mips::A0_64, Mips::A1_64, Mips::A2_64, Mips::A3_64, Mips::T0_64, Mips::T1_64, Mips::T2_64, Mips::T3_64
314 };
315 if (MCRegister Reg = State.AllocateReg(Regs: RegList2)) {
316 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
317 return false;
318 }
319 }
320
321 if (LocVT == MVT::f32) {
322 int64_t Offset3 = State.AllocateStack(Size: 4, Alignment: Align(8));
323 State.addLoc(V: CCValAssign::getMem(ValNo, ValVT, Offset: Offset3, LocVT, HTP: LocInfo));
324 return false;
325 }
326
327 if (LocVT == MVT::i64 ||
328 LocVT == MVT::f64) {
329 int64_t Offset4 = State.AllocateStack(Size: 8, Alignment: Align(8));
330 State.addLoc(V: CCValAssign::getMem(ValNo, ValVT, Offset: Offset4, LocVT, HTP: LocInfo));
331 return false;
332 }
333
334 return true; // CC didn't match.
335}
336
337
338static bool CC_MipsO32(unsigned ValNo, MVT ValVT,
339 MVT LocVT, CCValAssign::LocInfo LocInfo,
340 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State) {
341
342 if (LocVT == MVT::i1 ||
343 LocVT == MVT::i8 ||
344 LocVT == MVT::i16) {
345 LocVT = MVT::i32;
346 if (ArgFlags.isSExt())
347 LocInfo = CCValAssign::SExt;
348 else if (ArgFlags.isZExt())
349 LocInfo = CCValAssign::ZExt;
350 else
351 LocInfo = CCValAssign::AExt;
352 }
353
354 if (LocVT == MVT::i32 ||
355 LocVT == MVT::f32) {
356 int64_t Offset1 = State.AllocateStack(Size: 4, Alignment: Align(4));
357 State.addLoc(V: CCValAssign::getMem(ValNo, ValVT, Offset: Offset1, LocVT, HTP: LocInfo));
358 return false;
359 }
360
361 if (LocVT == MVT::f64) {
362 int64_t Offset2 = State.AllocateStack(Size: 8, Alignment: Align(8));
363 State.addLoc(V: CCValAssign::getMem(ValNo, ValVT, Offset: Offset2, LocVT, HTP: LocInfo));
364 return false;
365 }
366
367 return true; // CC didn't match.
368}
369
370
371static bool CC_MipsO32_FP(unsigned ValNo, MVT ValVT,
372 MVT LocVT, CCValAssign::LocInfo LocInfo,
373 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State) {
374
375 if (!State.getMachineFunction().getSubtarget<MipsSubtarget>().isFP64bit()) {
376 if (!CC_MipsO32_FP32(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State))
377 return false;
378 }
379
380 if (State.getMachineFunction().getSubtarget<MipsSubtarget>().isFP64bit()) {
381 if (!CC_MipsO32_FP64(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State))
382 return false;
383 }
384
385 return true; // CC didn't match.
386}
387
388
389static bool CC_MipsO32_FastCC(unsigned ValNo, MVT ValVT,
390 MVT LocVT, CCValAssign::LocInfo LocInfo,
391 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State) {
392
393 if (LocVT == MVT::f64) {
394 if (!State.getMachineFunction().getSubtarget<MipsSubtarget>().isFP64bit()) {
395 static const MCPhysReg RegList1[] = {
396 Mips::D0, Mips::D1, Mips::D2, Mips::D3, Mips::D4, Mips::D5, Mips::D6, Mips::D7, Mips::D8, Mips::D9
397 };
398 if (MCRegister Reg = State.AllocateReg(Regs: RegList1)) {
399 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
400 return false;
401 }
402 }
403 }
404
405 if (LocVT == MVT::f64) {
406 if (State.getMachineFunction().getSubtarget<MipsSubtarget>().isFP64bit()) {
407 if (State.getMachineFunction().getSubtarget<MipsSubtarget>().useOddSPReg()) {
408 static const MCPhysReg RegList2[] = {
409 Mips::D0_64, Mips::D1_64, Mips::D2_64, Mips::D3_64, Mips::D4_64, Mips::D5_64, Mips::D6_64, Mips::D7_64, Mips::D8_64, Mips::D9_64, Mips::D10_64, Mips::D11_64, Mips::D12_64, Mips::D13_64, Mips::D14_64, Mips::D15_64, Mips::D16_64, Mips::D17_64, Mips::D18_64, Mips::D19_64
410 };
411 if (MCRegister Reg = State.AllocateReg(Regs: RegList2)) {
412 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
413 return false;
414 }
415 }
416 }
417 }
418
419 if (LocVT == MVT::f64) {
420 if (State.getMachineFunction().getSubtarget<MipsSubtarget>().isFP64bit()) {
421 if (State.getMachineFunction().getSubtarget<MipsSubtarget>().noOddSPReg()) {
422 static const MCPhysReg RegList3[] = {
423 Mips::D0_64, Mips::D2_64, Mips::D4_64, Mips::D6_64, Mips::D8_64, Mips::D10_64, Mips::D12_64, Mips::D14_64, Mips::D16_64, Mips::D18_64
424 };
425 if (MCRegister Reg = State.AllocateReg(Regs: RegList3)) {
426 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
427 return false;
428 }
429 }
430 }
431 }
432
433 if (LocVT == MVT::f64) {
434 int64_t Offset4 = State.AllocateStack(Size: 8, Alignment: Align(8));
435 State.addLoc(V: CCValAssign::getMem(ValNo, ValVT, Offset: Offset4, LocVT, HTP: LocInfo));
436 return false;
437 }
438
439 return true; // CC didn't match.
440}
441
442
443static bool CC_Mips_ByVal(unsigned ValNo, MVT ValVT,
444 MVT LocVT, CCValAssign::LocInfo LocInfo,
445 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State) {
446
447 if (State.getMachineFunction().getSubtarget<MipsSubtarget>().isABI_O32()) {
448 if (ArgFlags.isByVal()) {
449 State.HandleByVal(ValNo, ValVT, LocVT, LocInfo, MinSize: 4, MinAlign: Align(4), ArgFlags);
450 return false;
451 }
452 }
453
454 if (ArgFlags.isByVal()) {
455 State.HandleByVal(ValNo, ValVT, LocVT, LocInfo, MinSize: 8, MinAlign: Align(8), ArgFlags);
456 return false;
457 }
458
459 return true; // CC didn't match.
460}
461
462
463static bool CC_Mips_FastCC(unsigned ValNo, MVT ValVT,
464 MVT LocVT, CCValAssign::LocInfo LocInfo,
465 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State) {
466
467 if (ArgFlags.isByVal()) {
468 State.HandleByVal(ValNo, ValVT, LocVT, LocInfo, MinSize: 4, MinAlign: Align(4), ArgFlags);
469 return false;
470 }
471
472 if (LocVT == MVT::i8 ||
473 LocVT == MVT::i16) {
474 LocVT = MVT::i32;
475 if (ArgFlags.isSExt())
476 LocInfo = CCValAssign::SExt;
477 else if (ArgFlags.isZExt())
478 LocInfo = CCValAssign::ZExt;
479 else
480 LocInfo = CCValAssign::AExt;
481 }
482
483 if (LocVT == MVT::i32) {
484 static const MCPhysReg RegList1[] = {
485 Mips::A0, Mips::A1, Mips::A2, Mips::A3, Mips::T0, Mips::T1, Mips::T2, Mips::T3, Mips::T4, Mips::T5, Mips::T6, Mips::T7, Mips::T8, Mips::V1
486 };
487 if (MCRegister Reg = State.AllocateReg(Regs: RegList1)) {
488 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
489 return false;
490 }
491 }
492
493 if (LocVT == MVT::f32) {
494 if (State.getMachineFunction().getSubtarget<MipsSubtarget>().useOddSPReg()) {
495 static const MCPhysReg RegList2[] = {
496 Mips::F0, Mips::F1, Mips::F2, Mips::F3, Mips::F4, Mips::F5, Mips::F6, Mips::F7, Mips::F8, Mips::F9, Mips::F10, Mips::F11, Mips::F12, Mips::F13, Mips::F14, Mips::F15, Mips::F16, Mips::F17, Mips::F18, Mips::F19
497 };
498 if (MCRegister Reg = State.AllocateReg(Regs: RegList2)) {
499 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
500 return false;
501 }
502 }
503 }
504
505 if (LocVT == MVT::f32) {
506 if (State.getMachineFunction().getSubtarget<MipsSubtarget>().noOddSPReg()) {
507 static const MCPhysReg RegList3[] = {
508 Mips::F0, Mips::F2, Mips::F4, Mips::F6, Mips::F8, Mips::F10, Mips::F12, Mips::F14, Mips::F16, Mips::F18
509 };
510 if (MCRegister Reg = State.AllocateReg(Regs: RegList3)) {
511 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
512 return false;
513 }
514 }
515 }
516
517 if (LocVT == MVT::i32 ||
518 LocVT == MVT::f32) {
519 int64_t Offset4 = State.AllocateStack(Size: 4, Alignment: Align(4));
520 State.addLoc(V: CCValAssign::getMem(ValNo, ValVT, Offset: Offset4, LocVT, HTP: LocInfo));
521 return false;
522 }
523
524 if (State.getMachineFunction().getSubtarget<MipsSubtarget>().isABI_O32()) {
525 if (!CC_MipsO32_FastCC(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State))
526 return false;
527 }
528
529 if (!CC_MipsN_FastCC(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State))
530 return false;
531
532 return true; // CC didn't match.
533}
534
535
536static bool CC_Mips_FixedArg(unsigned ValNo, MVT ValVT,
537 MVT LocVT, CCValAssign::LocInfo LocInfo,
538 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State) {
539
540 if (State.getCallingConv() != CallingConv::Fast) {
541 if (static_cast<MipsCCState *>(&State)->getSpecialCallingConv() == MipsCCState::Mips16RetHelperConv) {
542 if (!CC_Mips16RetHelper(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State))
543 return false;
544 }
545 }
546
547 if (ArgFlags.isByVal()) {
548 if (!CC_Mips_ByVal(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State))
549 return false;
550 }
551
552 if (LocVT == MVT::i64) {
553 if (!State.getMachineFunction().getSubtarget<MipsSubtarget>().isSingleFloat()) {
554 if (!State.getMachineFunction().getSubtarget<MipsSubtarget>().useSoftFloat()) {
555 if (OrigTy->isFP128Ty()) {
556 LocVT = MVT::f64;
557 LocInfo = CCValAssign::BCvt;
558 }
559 }
560 }
561 }
562
563 if (State.getCallingConv() == CallingConv::Fast) {
564 if (!CC_Mips_FastCC(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State))
565 return false;
566 }
567
568 if (State.getMachineFunction().getSubtarget<MipsSubtarget>().isABI_O32()) {
569 if (!State.getMachineFunction().getSubtarget<MipsSubtarget>().isGP64bit()) {
570 if (!CC_MipsO32_FP(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State))
571 return false;
572 }
573 }
574
575 if (!CC_MipsN(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State))
576 return false;
577
578 return true; // CC didn't match.
579}
580
581
582static bool CC_Mips_VarArg(unsigned ValNo, MVT ValVT,
583 MVT LocVT, CCValAssign::LocInfo LocInfo,
584 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State) {
585
586 if (ArgFlags.isByVal()) {
587 if (!CC_Mips_ByVal(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State))
588 return false;
589 }
590
591 if (State.getMachineFunction().getSubtarget<MipsSubtarget>().isABI_O32()) {
592 if (!CC_MipsO32_FP(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State))
593 return false;
594 }
595
596 if (!CC_MipsN_VarArg(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State))
597 return false;
598
599 return true; // CC didn't match.
600}
601
602
603static bool RetCC_F128(unsigned ValNo, MVT ValVT,
604 MVT LocVT, CCValAssign::LocInfo LocInfo,
605 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State) {
606
607 if (State.getMachineFunction().getSubtarget<MipsSubtarget>().useSoftFloat()) {
608 if (LocVT == MVT::i64) {
609 if (!RetCC_F128SoftFloat(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State))
610 return false;
611 }
612 }
613
614 if (!State.getMachineFunction().getSubtarget<MipsSubtarget>().useSoftFloat()) {
615 if (LocVT == MVT::i64) {
616 if (!RetCC_F128HardFloat(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State))
617 return false;
618 }
619 }
620
621 return true; // CC didn't match.
622}
623
624
625static bool RetCC_F128HardFloat(unsigned ValNo, MVT ValVT,
626 MVT LocVT, CCValAssign::LocInfo LocInfo,
627 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State) {
628
629 LocVT = MVT::f64;
630 LocInfo = CCValAssign::BCvt;
631
632 if (ArgFlags.isInReg()) {
633 static const MCPhysReg RegList1[] = {
634 Mips::D0_64, Mips::D1_64
635 };
636 if (MCRegister Reg = State.AllocateReg(Regs: RegList1)) {
637 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
638 return false;
639 }
640 }
641
642 static const MCPhysReg RegList2[] = {
643 Mips::D0_64, Mips::D2_64
644 };
645 if (MCRegister Reg = State.AllocateReg(Regs: RegList2)) {
646 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
647 return false;
648 }
649
650 return true; // CC didn't match.
651}
652
653
654static bool RetCC_F128SoftFloat(unsigned ValNo, MVT ValVT,
655 MVT LocVT, CCValAssign::LocInfo LocInfo,
656 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State) {
657
658 static const MCPhysReg RegList1[] = {
659 Mips::V0_64, Mips::A0_64
660 };
661 if (MCRegister Reg = State.AllocateReg(Regs: RegList1)) {
662 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
663 return false;
664 }
665
666 return true; // CC didn't match.
667}
668
669
670static bool RetCC_Mips(unsigned ValNo, MVT ValVT,
671 MVT LocVT, CCValAssign::LocInfo LocInfo,
672 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State) {
673
674 if (State.getMachineFunction().getSubtarget<MipsSubtarget>().isABI_N32()) {
675 if (!RetCC_MipsN(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State))
676 return false;
677 }
678
679 if (State.getMachineFunction().getSubtarget<MipsSubtarget>().isABI_N64()) {
680 if (!RetCC_MipsN(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State))
681 return false;
682 }
683
684 if (!RetCC_MipsO32(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State))
685 return false;
686
687 return true; // CC didn't match.
688}
689
690
691static bool RetCC_MipsN(unsigned ValNo, MVT ValVT,
692 MVT LocVT, CCValAssign::LocInfo LocInfo,
693 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State) {
694
695 if (!State.getMachineFunction().getSubtarget<MipsSubtarget>().isSingleFloat()) {
696 if (LocVT == MVT::i64) {
697 if (OrigTy->isFP128Ty()) {
698 if (!RetCC_F128(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State))
699 return false;
700 }
701 }
702 }
703
704 if (State.getMachineFunction().getSubtarget<MipsSubtarget>().isLittle()) {
705 if (LocVT == MVT::i8 ||
706 LocVT == MVT::i16 ||
707 LocVT == MVT::i32 ||
708 LocVT == MVT::i64) {
709 if (ArgFlags.isInReg()) {
710 LocVT = MVT::i64;
711 if (ArgFlags.isSExt())
712 LocInfo = CCValAssign::SExt;
713 else if (ArgFlags.isZExt())
714 LocInfo = CCValAssign::ZExt;
715 else
716 LocInfo = CCValAssign::AExt;
717 }
718 }
719 }
720
721 if (!State.getMachineFunction().getSubtarget<MipsSubtarget>().isLittle()) {
722 if (LocVT == MVT::i8 ||
723 LocVT == MVT::i16 ||
724 LocVT == MVT::i32 ||
725 LocVT == MVT::i64) {
726 if (ArgFlags.isInReg()) {
727 LocVT = MVT::i64;
728 if (ArgFlags.isSExt())
729 LocInfo = CCValAssign::SExtUpper;
730 else if (ArgFlags.isZExt())
731 LocInfo = CCValAssign::ZExtUpper;
732 else
733 LocInfo = CCValAssign::AExtUpper;
734 }
735 }
736 }
737
738 if (LocVT == MVT::i64) {
739 static const MCPhysReg RegList1[] = {
740 Mips::V0_64, Mips::V1_64
741 };
742 if (MCRegister Reg = State.AllocateReg(Regs: RegList1)) {
743 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
744 return false;
745 }
746 }
747
748 if (LocVT == MVT::f32) {
749 static const MCPhysReg RegList2[] = {
750 Mips::F0, Mips::F2
751 };
752 if (MCRegister Reg = State.AllocateReg(Regs: RegList2)) {
753 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
754 return false;
755 }
756 }
757
758 if (LocVT == MVT::f64) {
759 static const MCPhysReg RegList3[] = {
760 Mips::D0_64, Mips::D2_64
761 };
762 if (MCRegister Reg = State.AllocateReg(Regs: RegList3)) {
763 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
764 return false;
765 }
766 }
767
768 return true; // CC didn't match.
769}
770
771
772static bool RetCC_MipsO32(unsigned ValNo, MVT ValVT,
773 MVT LocVT, CCValAssign::LocInfo LocInfo,
774 ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State) {
775
776 if (LocVT == MVT::i1 ||
777 LocVT == MVT::i8 ||
778 LocVT == MVT::i16) {
779 LocVT = MVT::i32;
780 if (ArgFlags.isSExt())
781 LocInfo = CCValAssign::SExt;
782 else if (ArgFlags.isZExt())
783 LocInfo = CCValAssign::ZExt;
784 else
785 LocInfo = CCValAssign::AExt;
786 }
787
788 if (!OrigTy->isVectorTy() || !OrigTy->isFPOrFPVectorTy()) {
789 if (LocVT == MVT::i32) {
790 static const MCPhysReg RegList1[] = {
791 Mips::V0, Mips::V1, Mips::A0, Mips::A1
792 };
793 if (MCRegister Reg = State.AllocateReg(Regs: RegList1)) {
794 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
795 return false;
796 }
797 }
798 }
799
800 if (LocVT == MVT::f32) {
801 static const MCPhysReg RegList2[] = {
802 Mips::F0, Mips::F2
803 };
804 if (MCRegister Reg = State.AllocateReg(Regs: RegList2)) {
805 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
806 return false;
807 }
808 }
809
810 if (LocVT == MVT::f64) {
811 if (State.getMachineFunction().getSubtarget<MipsSubtarget>().isFP64bit()) {
812 static const MCPhysReg RegList3[] = {
813 Mips::D0_64, Mips::D2_64
814 };
815 if (MCRegister Reg = State.AllocateReg(Regs: RegList3)) {
816 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
817 return false;
818 }
819 }
820 }
821
822 if (LocVT == MVT::f64) {
823 if (!State.getMachineFunction().getSubtarget<MipsSubtarget>().isFP64bit()) {
824 static const MCPhysReg RegList4[] = {
825 Mips::D0, Mips::D1
826 };
827 if (MCRegister Reg = State.AllocateReg(Regs: RegList4)) {
828 State.addLoc(V: CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, HTP: LocInfo));
829 return false;
830 }
831 }
832 }
833
834 return true; // CC didn't match.
835}
836
837#else
838
839const MCRegister CC_Mips_ArgRegs[] = { 0 };
840const MCRegister CC_Mips16RetHelper_ArgRegs[] = { Mips::A0, Mips::A1, Mips::V0, Mips::V1 };
841const MCRegister CC_MipsN_ArgRegs[] = { 0 };
842const MCRegister CC_MipsN_FastCC_ArgRegs[] = { Mips::A0_64, Mips::A1_64, Mips::A2_64, Mips::A3_64, Mips::D0_64, Mips::D10_64, Mips::D11_64, Mips::D12_64, Mips::D13_64, Mips::D14_64, Mips::D15_64, Mips::D16_64, Mips::D17_64, Mips::D18_64, Mips::D19_64, Mips::D1_64, Mips::D2_64, Mips::D3_64, Mips::D4_64, Mips::D5_64, Mips::D6_64, Mips::D7_64, Mips::D8_64, Mips::D9_64, Mips::T0_64, Mips::T1_64, Mips::T2_64, Mips::T3_64, Mips::T4_64, Mips::T5_64, Mips::T6_64, Mips::T7_64, Mips::T8_64, Mips::V1_64 };
843const MCRegister CC_MipsN_SoftFloat_ArgRegs[] = { 0 };
844const MCRegister CC_MipsN_VarArg_ArgRegs[] = { Mips::A0, Mips::A0_64, Mips::A1, Mips::A1_64, Mips::A2, Mips::A2_64, Mips::A3, Mips::A3_64, Mips::T0, Mips::T0_64, Mips::T1, Mips::T1_64, Mips::T2, Mips::T2_64, Mips::T3, Mips::T3_64 };
845const MCRegister CC_MipsO32_ArgRegs[] = { 0 };
846const MCRegister CC_MipsO32_FP_ArgRegs[] = { 0 };
847const MCRegister CC_MipsO32_FastCC_ArgRegs[] = { Mips::D0, Mips::D0_64, Mips::D1, Mips::D10_64, Mips::D11_64, Mips::D12_64, Mips::D13_64, Mips::D14_64, Mips::D15_64, Mips::D16_64, Mips::D17_64, Mips::D18_64, Mips::D19_64, Mips::D1_64, Mips::D2, Mips::D2_64, Mips::D3, Mips::D3_64, Mips::D4, Mips::D4_64, Mips::D5, Mips::D5_64, Mips::D6, Mips::D6_64, Mips::D7, Mips::D7_64, Mips::D8, Mips::D8_64, Mips::D9, Mips::D9_64 };
848const MCRegister CC_Mips_ByVal_ArgRegs[] = { 0 };
849const MCRegister CC_Mips_FastCC_ArgRegs[] = { Mips::A0, Mips::A1, Mips::A2, Mips::A3, Mips::F0, Mips::F1, Mips::F10, Mips::F11, Mips::F12, Mips::F13, Mips::F14, Mips::F15, Mips::F16, Mips::F17, Mips::F18, Mips::F19, Mips::F2, Mips::F3, Mips::F4, Mips::F5, Mips::F6, Mips::F7, Mips::F8, Mips::F9, Mips::T0, Mips::T1, Mips::T2, Mips::T3, Mips::T4, Mips::T5, Mips::T6, Mips::T7, Mips::T8, Mips::V1 };
850const MCRegister CC_Mips_FixedArg_ArgRegs[] = { 0 };
851const MCRegister CC_Mips_VarArg_ArgRegs[] = { 0 };
852const MCRegister RetCC_F128_ArgRegs[] = { 0 };
853const MCRegister RetCC_F128HardFloat_ArgRegs[] = { Mips::D0_64, Mips::D1_64, Mips::D2_64 };
854const MCRegister RetCC_F128SoftFloat_ArgRegs[] = { Mips::A0_64, Mips::V0_64 };
855const MCRegister RetCC_Mips_ArgRegs[] = { 0 };
856const MCRegister RetCC_MipsN_ArgRegs[] = { Mips::D0_64, Mips::D2_64, Mips::F0, Mips::F2, Mips::V0_64, Mips::V1_64 };
857const MCRegister RetCC_MipsO32_ArgRegs[] = { Mips::A0, Mips::A1, Mips::D0, Mips::D0_64, Mips::D1, Mips::D2_64, Mips::F0, Mips::F2, Mips::V0, Mips::V1 };
858
859#endif // !defined(GET_CC_REGISTER_LISTS)
860
861