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 11static bool CC_Mips(unsigned ValNo, MVT ValVT, 12 MVT LocVT, CCValAssign::LocInfo LocInfo, 13 ISD::ArgFlagsTy ArgFlags, CCState &State); 14static bool CC_Mips16RetHelper(unsigned ValNo, MVT ValVT, 15 MVT LocVT, CCValAssign::LocInfo LocInfo, 16 ISD::ArgFlagsTy ArgFlags, CCState &State); 17static bool CC_MipsN(unsigned ValNo, MVT ValVT, 18 MVT LocVT, CCValAssign::LocInfo LocInfo, 19 ISD::ArgFlagsTy ArgFlags, CCState &State); 20static bool CC_MipsN_FastCC(unsigned ValNo, MVT ValVT, 21 MVT LocVT, CCValAssign::LocInfo LocInfo, 22 ISD::ArgFlagsTy ArgFlags, CCState &State); 23static bool CC_MipsN_SoftFloat(unsigned ValNo, MVT ValVT, 24 MVT LocVT, CCValAssign::LocInfo LocInfo, 25 ISD::ArgFlagsTy ArgFlags, CCState &State); 26static bool CC_MipsN_VarArg(unsigned ValNo, MVT ValVT, 27 MVT LocVT, CCValAssign::LocInfo LocInfo, 28 ISD::ArgFlagsTy ArgFlags, CCState &State); 29static bool CC_MipsO32(unsigned ValNo, MVT ValVT, 30 MVT LocVT, CCValAssign::LocInfo LocInfo, 31 ISD::ArgFlagsTy ArgFlags, CCState &State); 32static bool CC_MipsO32_FP(unsigned ValNo, MVT ValVT, 33 MVT LocVT, CCValAssign::LocInfo LocInfo, 34 ISD::ArgFlagsTy ArgFlags, CCState &State); 35static bool CC_MipsO32_FastCC(unsigned ValNo, MVT ValVT, 36 MVT LocVT, CCValAssign::LocInfo LocInfo, 37 ISD::ArgFlagsTy ArgFlags, CCState &State); 38static bool CC_Mips_ByVal(unsigned ValNo, MVT ValVT, 39 MVT LocVT, CCValAssign::LocInfo LocInfo, 40 ISD::ArgFlagsTy ArgFlags, CCState &State); 41static bool CC_Mips_FastCC(unsigned ValNo, MVT ValVT, 42 MVT LocVT, CCValAssign::LocInfo LocInfo, 43 ISD::ArgFlagsTy ArgFlags, CCState &State); 44static bool CC_Mips_FixedArg(unsigned ValNo, MVT ValVT, 45 MVT LocVT, CCValAssign::LocInfo LocInfo, 46 ISD::ArgFlagsTy ArgFlags, CCState &State); 47static bool CC_Mips_VarArg(unsigned ValNo, MVT ValVT, 48 MVT LocVT, CCValAssign::LocInfo LocInfo, 49 ISD::ArgFlagsTy ArgFlags, CCState &State); 50static bool RetCC_F128(unsigned ValNo, MVT ValVT, 51 MVT LocVT, CCValAssign::LocInfo LocInfo, 52 ISD::ArgFlagsTy ArgFlags, CCState &State); 53static bool RetCC_F128HardFloat(unsigned ValNo, MVT ValVT, 54 MVT LocVT, CCValAssign::LocInfo LocInfo, 55 ISD::ArgFlagsTy ArgFlags, CCState &State); 56static bool RetCC_F128SoftFloat(unsigned ValNo, MVT ValVT, 57 MVT LocVT, CCValAssign::LocInfo LocInfo, 58 ISD::ArgFlagsTy ArgFlags, CCState &State); 59static bool RetCC_Mips(unsigned ValNo, MVT ValVT, 60 MVT LocVT, CCValAssign::LocInfo LocInfo, 61 ISD::ArgFlagsTy ArgFlags, CCState &State); 62static bool RetCC_MipsN(unsigned ValNo, MVT ValVT, 63 MVT LocVT, CCValAssign::LocInfo LocInfo, 64 ISD::ArgFlagsTy ArgFlags, CCState &State); 65static bool RetCC_MipsO32(unsigned ValNo, MVT ValVT, 66 MVT LocVT, CCValAssign::LocInfo LocInfo, 67 ISD::ArgFlagsTy ArgFlags, CCState &State); 68 69 70static bool CC_Mips(unsigned ValNo, MVT ValVT, 71 MVT LocVT, CCValAssign::LocInfo LocInfo, 72 ISD::ArgFlagsTy ArgFlags, CCState &State) { 73 74 if (State.isVarArg()) { 75 if (!static_cast<MipsCCState *>(&State)->IsCallOperandFixed(ValNo)) { 76 if (!CC_Mips_VarArg(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 77 return false; 78 } 79 } 80 81 if (!CC_Mips_FixedArg(ValNo, ValVT, LocVT, LocInfo, ArgFlags, 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, CCState &State) { 91 92 if (ArgFlags.isByVal()) { 93 if (!CC_Mips_ByVal(ValNo, ValVT, LocVT, LocInfo, ArgFlags, 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 (unsigned Reg = State.AllocateReg(RegList1)) { 102 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, 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, CCState &State) { 114 115 if (LocVT == MVT::i8 || 116 LocVT == MVT::i16 || 117 LocVT == MVT::i32 || 118 LocVT == MVT::i64) { 119 if (!static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).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::i8 || 133 LocVT == MVT::i16 || 134 LocVT == MVT::i32) { 135 if (!static_cast<MipsCCState *>(&State)->WasOriginalArgFloat(ValNo)) { 136 LocVT = MVT::i64; 137 if (ArgFlags.isSExt()) 138 LocInfo = CCValAssign::SExt; 139 else if (ArgFlags.isZExt()) 140 LocInfo = CCValAssign::ZExt; 141 else 142 LocInfo = CCValAssign::AExt; 143 } 144 } 145 146 if (static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).useSoftFloat()) { 147 if (LocVT == MVT::i32) { 148 if (!CC_MipsN_SoftFloat(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 149 return false; 150 } 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 (unsigned Reg = State.AllocateReg(RegList1, RegList2)) { 161 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, 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 (unsigned Reg = State.AllocateReg(RegList3, RegList4)) { 174 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, 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 (unsigned Reg = State.AllocateReg(RegList5, RegList6)) { 187 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 188 return false; 189 } 190 } 191 192 if (LocVT == MVT::f32) { 193 unsigned Offset7 = State.AllocateStack(4, Align(8)); 194 State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset7, LocVT, LocInfo)); 195 return false; 196 } 197 198 if (LocVT == MVT::i64 || 199 LocVT == MVT::f64) { 200 unsigned Offset8 = State.AllocateStack(8, Align(8)); 201 State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset8, LocVT, 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, 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 (unsigned Reg = State.AllocateReg(RegList1)) { 218 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, 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 (unsigned Reg = State.AllocateReg(RegList2)) { 228 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 229 return false; 230 } 231 } 232 233 if (LocVT == MVT::i64 || 234 LocVT == MVT::f64) { 235 unsigned Offset3 = State.AllocateStack(8, Align(8)); 236 State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset3, LocVT, 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, 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 (unsigned Reg = State.AllocateReg(RegList1, RegList2)) { 255 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 256 return false; 257 } 258 259 unsigned Offset3 = State.AllocateStack(4, Align(8)); 260 State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset3, LocVT, 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, CCState &State) { 270 271 if (LocVT == MVT::i8 || 272 LocVT == MVT::i16 || 273 LocVT == MVT::i32 || 274 LocVT == MVT::i64) { 275 if (!static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).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 (unsigned Reg = State.AllocateReg(RegList1)) { 305 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, 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 (unsigned Reg = State.AllocateReg(RegList2)) { 316 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 317 return false; 318 } 319 } 320 321 if (LocVT == MVT::f32) { 322 unsigned Offset3 = State.AllocateStack(4, Align(8)); 323 State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset3, LocVT, LocInfo)); 324 return false; 325 } 326 327 if (LocVT == MVT::i64 || 328 LocVT == MVT::f64) { 329 unsigned Offset4 = State.AllocateStack(8, Align(8)); 330 State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset4, LocVT, 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, 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 unsigned Offset1 = State.AllocateStack(4, Align(4)); 357 State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset1, LocVT, LocInfo)); 358 return false; 359 } 360 361 if (LocVT == MVT::f64) { 362 unsigned Offset2 = State.AllocateStack(8, Align(8)); 363 State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset2, LocVT, 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, CCState &State) { 374 375 if (!static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).isFP64bit()) { 376 if (!CC_MipsO32_FP32(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 377 return false; 378 } 379 380 if (static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).isFP64bit()) { 381 if (!CC_MipsO32_FP64(ValNo, ValVT, LocVT, LocInfo, ArgFlags, 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, CCState &State) { 392 393 if (LocVT == MVT::f64) { 394 if (!static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).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 (unsigned Reg = State.AllocateReg(RegList1)) { 399 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 400 return false; 401 } 402 } 403 } 404 405 if (LocVT == MVT::f64) { 406 if (static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).isFP64bit()) { 407 if (static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).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 (unsigned Reg = State.AllocateReg(RegList2)) { 412 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 413 return false; 414 } 415 } 416 } 417 } 418 419 if (LocVT == MVT::f64) { 420 if (static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).isFP64bit()) { 421 if (static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).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 (unsigned Reg = State.AllocateReg(RegList3)) { 426 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 427 return false; 428 } 429 } 430 } 431 } 432 433 if (LocVT == MVT::f64) { 434 unsigned Offset4 = State.AllocateStack(8, Align(8)); 435 State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset4, LocVT, 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, CCState &State) { 446 447 if (static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).isABI_O32()) { 448 if (ArgFlags.isByVal()) { 449 State.HandleByVal(ValNo, ValVT, LocVT, LocInfo, 4, Align(4), ArgFlags); 450 return false; 451 } 452 } 453 454 if (ArgFlags.isByVal()) { 455 State.HandleByVal(ValNo, ValVT, LocVT, LocInfo, 8, 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, CCState &State) { 466 467 if (ArgFlags.isByVal()) { 468 State.HandleByVal(ValNo, ValVT, LocVT, LocInfo, 4, 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 if (!static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).isTargetNaCl()) { 485 static const MCPhysReg RegList1[] = { 486 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 487 }; 488 if (unsigned Reg = State.AllocateReg(RegList1)) { 489 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 490 return false; 491 } 492 } 493 } 494 495 if (LocVT == MVT::i32) { 496 if (static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).isTargetNaCl()) { 497 static const MCPhysReg RegList2[] = { 498 Mips::A0, Mips::A1, Mips::A2, Mips::A3, Mips::T0, Mips::T1, Mips::T2, Mips::T3, Mips::T4, Mips::T5, Mips::V1 499 }; 500 if (unsigned Reg = State.AllocateReg(RegList2)) { 501 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 502 return false; 503 } 504 } 505 } 506 507 if (LocVT == MVT::f32) { 508 if (static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).useOddSPReg()) { 509 static const MCPhysReg RegList3[] = { 510 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 511 }; 512 if (unsigned Reg = State.AllocateReg(RegList3)) { 513 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 514 return false; 515 } 516 } 517 } 518 519 if (LocVT == MVT::f32) { 520 if (static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).noOddSPReg()) { 521 static const MCPhysReg RegList4[] = { 522 Mips::F0, Mips::F2, Mips::F4, Mips::F6, Mips::F8, Mips::F10, Mips::F12, Mips::F14, Mips::F16, Mips::F18 523 }; 524 if (unsigned Reg = State.AllocateReg(RegList4)) { 525 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 526 return false; 527 } 528 } 529 } 530 531 if (LocVT == MVT::i32 || 532 LocVT == MVT::f32) { 533 unsigned Offset5 = State.AllocateStack(4, Align(4)); 534 State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset5, LocVT, LocInfo)); 535 return false; 536 } 537 538 if (static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).isABI_O32()) { 539 if (!CC_MipsO32_FastCC(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 540 return false; 541 } 542 543 if (!CC_MipsN_FastCC(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 544 return false; 545 546 return true; // CC didn't match. 547} 548 549 550static bool CC_Mips_FixedArg(unsigned ValNo, MVT ValVT, 551 MVT LocVT, CCValAssign::LocInfo LocInfo, 552 ISD::ArgFlagsTy ArgFlags, CCState &State) { 553 554 if (State.getCallingConv() != CallingConv::Fast) { 555 if (static_cast<MipsCCState *>(&State)->getSpecialCallingConv() == MipsCCState::Mips16RetHelperConv) { 556 if (!CC_Mips16RetHelper(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 557 return false; 558 } 559 } 560 561 if (ArgFlags.isByVal()) { 562 if (!CC_Mips_ByVal(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 563 return false; 564 } 565 566 if (LocVT == MVT::i64) { 567 if (!static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).useSoftFloat()) { 568 if (static_cast<MipsCCState *>(&State)->WasOriginalArgF128(ValNo)) { 569 LocVT = MVT::f64; 570 LocInfo = CCValAssign::BCvt; 571 } 572 } 573 } 574 575 if (State.getCallingConv() == CallingConv::Fast) { 576 if (!CC_Mips_FastCC(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 577 return false; 578 } 579 580 if (static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).isABI_O32()) { 581 if (!CC_MipsO32_FP(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 582 return false; 583 } 584 585 if (!CC_MipsN(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 586 return false; 587 588 return true; // CC didn't match. 589} 590 591 592static bool CC_Mips_VarArg(unsigned ValNo, MVT ValVT, 593 MVT LocVT, CCValAssign::LocInfo LocInfo, 594 ISD::ArgFlagsTy ArgFlags, CCState &State) { 595 596 if (ArgFlags.isByVal()) { 597 if (!CC_Mips_ByVal(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 598 return false; 599 } 600 601 if (static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).isABI_O32()) { 602 if (!CC_MipsO32_FP(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 603 return false; 604 } 605 606 if (!CC_MipsN_VarArg(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 607 return false; 608 609 return true; // CC didn't match. 610} 611 612 613static bool RetCC_F128(unsigned ValNo, MVT ValVT, 614 MVT LocVT, CCValAssign::LocInfo LocInfo, 615 ISD::ArgFlagsTy ArgFlags, CCState &State) { 616 617 if (static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).useSoftFloat()) { 618 if (LocVT == MVT::i64) { 619 if (!RetCC_F128SoftFloat(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 620 return false; 621 } 622 } 623 624 if (!static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).useSoftFloat()) { 625 if (LocVT == MVT::i64) { 626 if (!RetCC_F128HardFloat(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 627 return false; 628 } 629 } 630 631 return true; // CC didn't match. 632} 633 634 635static bool RetCC_F128HardFloat(unsigned ValNo, MVT ValVT, 636 MVT LocVT, CCValAssign::LocInfo LocInfo, 637 ISD::ArgFlagsTy ArgFlags, CCState &State) { 638 639 LocVT = MVT::f64; 640 LocInfo = CCValAssign::BCvt; 641 642 if (ArgFlags.isInReg()) { 643 static const MCPhysReg RegList1[] = { 644 Mips::D0_64, Mips::D1_64 645 }; 646 if (unsigned Reg = State.AllocateReg(RegList1)) { 647 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 648 return false; 649 } 650 } 651 652 static const MCPhysReg RegList2[] = { 653 Mips::D0_64, Mips::D2_64 654 }; 655 if (unsigned Reg = State.AllocateReg(RegList2)) { 656 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 657 return false; 658 } 659 660 return true; // CC didn't match. 661} 662 663 664static bool RetCC_F128SoftFloat(unsigned ValNo, MVT ValVT, 665 MVT LocVT, CCValAssign::LocInfo LocInfo, 666 ISD::ArgFlagsTy ArgFlags, CCState &State) { 667 668 static const MCPhysReg RegList1[] = { 669 Mips::V0_64, Mips::A0_64 670 }; 671 if (unsigned Reg = State.AllocateReg(RegList1)) { 672 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 673 return false; 674 } 675 676 return true; // CC didn't match. 677} 678 679 680static bool RetCC_Mips(unsigned ValNo, MVT ValVT, 681 MVT LocVT, CCValAssign::LocInfo LocInfo, 682 ISD::ArgFlagsTy ArgFlags, CCState &State) { 683 684 if (static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).isABI_N32()) { 685 if (!RetCC_MipsN(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 686 return false; 687 } 688 689 if (static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).isABI_N64()) { 690 if (!RetCC_MipsN(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 691 return false; 692 } 693 694 if (!RetCC_MipsO32(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 695 return false; 696 697 return true; // CC didn't match. 698} 699 700 701static bool RetCC_MipsN(unsigned ValNo, MVT ValVT, 702 MVT LocVT, CCValAssign::LocInfo LocInfo, 703 ISD::ArgFlagsTy ArgFlags, CCState &State) { 704 705 if (LocVT == MVT::i64) { 706 if (static_cast<MipsCCState *>(&State)->WasOriginalArgF128(ValNo)) { 707 if (!RetCC_F128(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 708 return false; 709 } 710 } 711 712 if (static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).isLittle()) { 713 if (LocVT == MVT::i8 || 714 LocVT == MVT::i16 || 715 LocVT == MVT::i32 || 716 LocVT == MVT::i64) { 717 if (ArgFlags.isInReg()) { 718 LocVT = MVT::i64; 719 if (ArgFlags.isSExt()) 720 LocInfo = CCValAssign::SExt; 721 else if (ArgFlags.isZExt()) 722 LocInfo = CCValAssign::ZExt; 723 else 724 LocInfo = CCValAssign::AExt; 725 } 726 } 727 } 728 729 if (!static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).isLittle()) { 730 if (LocVT == MVT::i8 || 731 LocVT == MVT::i16 || 732 LocVT == MVT::i32 || 733 LocVT == MVT::i64) { 734 if (ArgFlags.isInReg()) { 735 LocVT = MVT::i64; 736 if (ArgFlags.isSExt()) 737 LocInfo = CCValAssign::SExtUpper; 738 else if (ArgFlags.isZExt()) 739 LocInfo = CCValAssign::ZExtUpper; 740 else 741 LocInfo = CCValAssign::AExtUpper; 742 } 743 } 744 } 745 746 if (LocVT == MVT::i64) { 747 static const MCPhysReg RegList1[] = { 748 Mips::V0_64, Mips::V1_64 749 }; 750 if (unsigned Reg = State.AllocateReg(RegList1)) { 751 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 752 return false; 753 } 754 } 755 756 if (LocVT == MVT::f32) { 757 static const MCPhysReg RegList2[] = { 758 Mips::F0, Mips::F2 759 }; 760 if (unsigned Reg = State.AllocateReg(RegList2)) { 761 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 762 return false; 763 } 764 } 765 766 if (LocVT == MVT::f64) { 767 static const MCPhysReg RegList3[] = { 768 Mips::D0_64, Mips::D2_64 769 }; 770 if (unsigned Reg = State.AllocateReg(RegList3)) { 771 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 772 return false; 773 } 774 } 775 776 return true; // CC didn't match. 777} 778 779 780static bool RetCC_MipsO32(unsigned ValNo, MVT ValVT, 781 MVT LocVT, CCValAssign::LocInfo LocInfo, 782 ISD::ArgFlagsTy ArgFlags, CCState &State) { 783 784 if (LocVT == MVT::i1 || 785 LocVT == MVT::i8 || 786 LocVT == MVT::i16) { 787 LocVT = MVT::i32; 788 if (ArgFlags.isSExt()) 789 LocInfo = CCValAssign::SExt; 790 else if (ArgFlags.isZExt()) 791 LocInfo = CCValAssign::ZExt; 792 else 793 LocInfo = CCValAssign::AExt; 794 } 795 796 if (!static_cast<MipsCCState *>(&State)->WasOriginalRetVectorFloat(ValNo)) { 797 if (LocVT == MVT::i32) { 798 static const MCPhysReg RegList1[] = { 799 Mips::V0, Mips::V1, Mips::A0, Mips::A1 800 }; 801 if (unsigned Reg = State.AllocateReg(RegList1)) { 802 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 803 return false; 804 } 805 } 806 } 807 808 if (LocVT == MVT::f32) { 809 static const MCPhysReg RegList2[] = { 810 Mips::F0, Mips::F2 811 }; 812 if (unsigned Reg = State.AllocateReg(RegList2)) { 813 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 814 return false; 815 } 816 } 817 818 if (LocVT == MVT::f64) { 819 if (static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).isFP64bit()) { 820 static const MCPhysReg RegList3[] = { 821 Mips::D0_64, Mips::D2_64 822 }; 823 if (unsigned Reg = State.AllocateReg(RegList3)) { 824 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 825 return false; 826 } 827 } 828 } 829 830 if (LocVT == MVT::f64) { 831 if (!static_cast<const MipsSubtarget&>(State.getMachineFunction().getSubtarget()).isFP64bit()) { 832 static const MCPhysReg RegList4[] = { 833 Mips::D0, Mips::D1 834 }; 835 if (unsigned Reg = State.AllocateReg(RegList4)) { 836 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 837 return false; 838 } 839 } 840 } 841 842 return true; // CC didn't match. 843} 844 845#else 846 847const MCRegister CC_Mips_ArgRegs[] = { 0 }; 848const MCRegister CC_Mips16RetHelper_ArgRegs[] = { Mips::A0, Mips::A1, Mips::V0, Mips::V1 }; 849const MCRegister CC_MipsN_ArgRegs[] = { 0 }; 850const 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 }; 851const MCRegister CC_MipsN_SoftFloat_ArgRegs[] = { 0 }; 852const 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 }; 853const MCRegister CC_MipsO32_ArgRegs[] = { 0 }; 854const MCRegister CC_MipsO32_FP_ArgRegs[] = { 0 }; 855const 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 }; 856const MCRegister CC_Mips_ByVal_ArgRegs[] = { 0 }; 857const 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 }; 858const MCRegister CC_Mips_FixedArg_ArgRegs[] = { 0 }; 859const MCRegister CC_Mips_VarArg_ArgRegs[] = { 0 }; 860const MCRegister RetCC_F128_ArgRegs[] = { 0 }; 861const MCRegister RetCC_F128HardFloat_ArgRegs[] = { Mips::D0_64, Mips::D1_64, Mips::D2_64 }; 862const MCRegister RetCC_F128SoftFloat_ArgRegs[] = { Mips::A0_64, Mips::V0_64 }; 863const MCRegister RetCC_Mips_ArgRegs[] = { 0 }; 864const MCRegister RetCC_MipsN_ArgRegs[] = { Mips::D0_64, Mips::D2_64, Mips::F0, Mips::F2, Mips::V0_64, Mips::V1_64 }; 865const 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 }; 866 867#endif // CC_REGISTER_LIST 868