ARMBaseRegisterInfo.cpp revision 4a8979320ced9b38019f6f2c074f2d3dbe1b189e
1//===- ARMBaseRegisterInfo.cpp - ARM Register Information -----------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file contains the base ARM implementation of TargetRegisterInfo class. 11// 12//===----------------------------------------------------------------------===// 13 14#include "ARM.h" 15#include "ARMAddressingModes.h" 16#include "ARMBaseInstrInfo.h" 17#include "ARMBaseRegisterInfo.h" 18#include "ARMInstrInfo.h" 19#include "ARMMachineFunctionInfo.h" 20#include "ARMSubtarget.h" 21#include "llvm/Constants.h" 22#include "llvm/DerivedTypes.h" 23#include "llvm/CodeGen/MachineConstantPool.h" 24#include "llvm/CodeGen/MachineFrameInfo.h" 25#include "llvm/CodeGen/MachineFunction.h" 26#include "llvm/CodeGen/MachineInstrBuilder.h" 27#include "llvm/CodeGen/MachineLocation.h" 28#include "llvm/CodeGen/MachineRegisterInfo.h" 29#include "llvm/CodeGen/RegisterScavenging.h" 30#include "llvm/Support/ErrorHandling.h" 31#include "llvm/Support/raw_ostream.h" 32#include "llvm/Target/TargetFrameInfo.h" 33#include "llvm/Target/TargetMachine.h" 34#include "llvm/Target/TargetOptions.h" 35#include "llvm/ADT/BitVector.h" 36#include "llvm/ADT/SmallVector.h" 37using namespace llvm; 38 39unsigned ARMBaseRegisterInfo::getRegisterNumbering(unsigned RegEnum) { 40 using namespace ARM; 41 switch (RegEnum) { 42 case R0: case S0: case D0: return 0; 43 case R1: case S1: case D1: return 1; 44 case R2: case S2: case D2: return 2; 45 case R3: case S3: case D3: return 3; 46 case R4: case S4: case D4: return 4; 47 case R5: case S5: case D5: return 5; 48 case R6: case S6: case D6: return 6; 49 case R7: case S7: case D7: return 7; 50 case R8: case S8: case D8: return 8; 51 case R9: case S9: case D9: return 9; 52 case R10: case S10: case D10: return 10; 53 case R11: case S11: case D11: return 11; 54 case R12: case S12: case D12: return 12; 55 case SP: case S13: case D13: return 13; 56 case LR: case S14: case D14: return 14; 57 case PC: case S15: case D15: return 15; 58 case S16: return 16; 59 case S17: return 17; 60 case S18: return 18; 61 case S19: return 19; 62 case S20: return 20; 63 case S21: return 21; 64 case S22: return 22; 65 case S23: return 23; 66 case S24: return 24; 67 case S25: return 25; 68 case S26: return 26; 69 case S27: return 27; 70 case S28: return 28; 71 case S29: return 29; 72 case S30: return 30; 73 case S31: return 31; 74 default: 75 LLVM_UNREACHABLE("Unknown ARM register!"); 76 } 77} 78 79unsigned ARMBaseRegisterInfo::getRegisterNumbering(unsigned RegEnum, 80 bool &isSPVFP) { 81 isSPVFP = false; 82 83 using namespace ARM; 84 switch (RegEnum) { 85 default: 86 LLVM_UNREACHABLE("Unknown ARM register!"); 87 case R0: case D0: return 0; 88 case R1: case D1: return 1; 89 case R2: case D2: return 2; 90 case R3: case D3: return 3; 91 case R4: case D4: return 4; 92 case R5: case D5: return 5; 93 case R6: case D6: return 6; 94 case R7: case D7: return 7; 95 case R8: case D8: return 8; 96 case R9: case D9: return 9; 97 case R10: case D10: return 10; 98 case R11: case D11: return 11; 99 case R12: case D12: return 12; 100 case SP: case D13: return 13; 101 case LR: case D14: return 14; 102 case PC: case D15: return 15; 103 104 case S0: case S1: case S2: case S3: 105 case S4: case S5: case S6: case S7: 106 case S8: case S9: case S10: case S11: 107 case S12: case S13: case S14: case S15: 108 case S16: case S17: case S18: case S19: 109 case S20: case S21: case S22: case S23: 110 case S24: case S25: case S26: case S27: 111 case S28: case S29: case S30: case S31: { 112 isSPVFP = true; 113 switch (RegEnum) { 114 default: return 0; // Avoid compile time warning. 115 case S0: return 0; 116 case S1: return 1; 117 case S2: return 2; 118 case S3: return 3; 119 case S4: return 4; 120 case S5: return 5; 121 case S6: return 6; 122 case S7: return 7; 123 case S8: return 8; 124 case S9: return 9; 125 case S10: return 10; 126 case S11: return 11; 127 case S12: return 12; 128 case S13: return 13; 129 case S14: return 14; 130 case S15: return 15; 131 case S16: return 16; 132 case S17: return 17; 133 case S18: return 18; 134 case S19: return 19; 135 case S20: return 20; 136 case S21: return 21; 137 case S22: return 22; 138 case S23: return 23; 139 case S24: return 24; 140 case S25: return 25; 141 case S26: return 26; 142 case S27: return 27; 143 case S28: return 28; 144 case S29: return 29; 145 case S30: return 30; 146 case S31: return 31; 147 } 148 } 149 } 150} 151 152ARMBaseRegisterInfo::ARMBaseRegisterInfo(const ARMBaseInstrInfo &tii, 153 const ARMSubtarget &sti) 154 : ARMGenRegisterInfo(ARM::ADJCALLSTACKDOWN, ARM::ADJCALLSTACKUP), 155 TII(tii), STI(sti), 156 FramePtr((STI.isTargetDarwin() || STI.isThumb()) ? ARM::R7 : ARM::R11) { 157} 158 159unsigned ARMBaseRegisterInfo:: 160getOpcode(int Op) const { 161 return TII.getOpcode((ARMII::Op)Op); 162} 163 164const unsigned* 165ARMBaseRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const { 166 static const unsigned CalleeSavedRegs[] = { 167 ARM::LR, ARM::R11, ARM::R10, ARM::R9, ARM::R8, 168 ARM::R7, ARM::R6, ARM::R5, ARM::R4, 169 170 ARM::D15, ARM::D14, ARM::D13, ARM::D12, 171 ARM::D11, ARM::D10, ARM::D9, ARM::D8, 172 0 173 }; 174 175 static const unsigned DarwinCalleeSavedRegs[] = { 176 // Darwin ABI deviates from ARM standard ABI. R9 is not a callee-saved 177 // register. 178 ARM::LR, ARM::R7, ARM::R6, ARM::R5, ARM::R4, 179 ARM::R11, ARM::R10, ARM::R8, 180 181 ARM::D15, ARM::D14, ARM::D13, ARM::D12, 182 ARM::D11, ARM::D10, ARM::D9, ARM::D8, 183 0 184 }; 185 return STI.isTargetDarwin() ? DarwinCalleeSavedRegs : CalleeSavedRegs; 186} 187 188const TargetRegisterClass* const * 189ARMBaseRegisterInfo::getCalleeSavedRegClasses(const MachineFunction *MF) const { 190 static const TargetRegisterClass * const CalleeSavedRegClasses[] = { 191 &ARM::GPRRegClass, &ARM::GPRRegClass, &ARM::GPRRegClass, 192 &ARM::GPRRegClass, &ARM::GPRRegClass, &ARM::GPRRegClass, 193 &ARM::GPRRegClass, &ARM::GPRRegClass, &ARM::GPRRegClass, 194 195 &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, 196 &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, 197 0 198 }; 199 200 static const TargetRegisterClass * const ThumbCalleeSavedRegClasses[] = { 201 &ARM::GPRRegClass, &ARM::GPRRegClass, &ARM::GPRRegClass, 202 &ARM::GPRRegClass, &ARM::GPRRegClass, &ARM::tGPRRegClass, 203 &ARM::tGPRRegClass,&ARM::tGPRRegClass,&ARM::tGPRRegClass, 204 205 &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, 206 &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, 207 0 208 }; 209 210 static const TargetRegisterClass * const DarwinCalleeSavedRegClasses[] = { 211 &ARM::GPRRegClass, &ARM::GPRRegClass, &ARM::GPRRegClass, 212 &ARM::GPRRegClass, &ARM::GPRRegClass, &ARM::GPRRegClass, 213 &ARM::GPRRegClass, &ARM::GPRRegClass, 214 215 &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, 216 &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, 217 0 218 }; 219 220 static const TargetRegisterClass * const DarwinThumbCalleeSavedRegClasses[] ={ 221 &ARM::GPRRegClass, &ARM::tGPRRegClass, &ARM::tGPRRegClass, 222 &ARM::tGPRRegClass, &ARM::tGPRRegClass, &ARM::GPRRegClass, 223 &ARM::GPRRegClass, &ARM::GPRRegClass, 224 225 &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, 226 &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, 227 0 228 }; 229 230 if (STI.isThumb1Only()) { 231 return STI.isTargetDarwin() 232 ? DarwinThumbCalleeSavedRegClasses : ThumbCalleeSavedRegClasses; 233 } 234 return STI.isTargetDarwin() 235 ? DarwinCalleeSavedRegClasses : CalleeSavedRegClasses; 236} 237 238BitVector ARMBaseRegisterInfo::getReservedRegs(const MachineFunction &MF) const { 239 // FIXME: avoid re-calculating this everytime. 240 BitVector Reserved(getNumRegs()); 241 Reserved.set(ARM::SP); 242 Reserved.set(ARM::PC); 243 if (STI.isTargetDarwin() || hasFP(MF)) 244 Reserved.set(FramePtr); 245 // Some targets reserve R9. 246 if (STI.isR9Reserved()) 247 Reserved.set(ARM::R9); 248 return Reserved; 249} 250 251bool 252ARMBaseRegisterInfo::isReservedReg(const MachineFunction &MF, unsigned Reg) const { 253 switch (Reg) { 254 default: break; 255 case ARM::SP: 256 case ARM::PC: 257 return true; 258 case ARM::R7: 259 case ARM::R11: 260 if (FramePtr == Reg && (STI.isTargetDarwin() || hasFP(MF))) 261 return true; 262 break; 263 case ARM::R9: 264 return STI.isR9Reserved(); 265 } 266 267 return false; 268} 269 270const TargetRegisterClass *ARMBaseRegisterInfo::getPointerRegClass() const { 271 return &ARM::GPRRegClass; 272} 273 274/// getAllocationOrder - Returns the register allocation order for a specified 275/// register class in the form of a pair of TargetRegisterClass iterators. 276std::pair<TargetRegisterClass::iterator,TargetRegisterClass::iterator> 277ARMBaseRegisterInfo::getAllocationOrder(const TargetRegisterClass *RC, 278 unsigned HintType, unsigned HintReg, 279 const MachineFunction &MF) const { 280 // Alternative register allocation orders when favoring even / odd registers 281 // of register pairs. 282 283 // No FP, R9 is available. 284 static const unsigned GPREven1[] = { 285 ARM::R0, ARM::R2, ARM::R4, ARM::R6, ARM::R8, ARM::R10, 286 ARM::R1, ARM::R3, ARM::R12,ARM::LR, ARM::R5, ARM::R7, 287 ARM::R9, ARM::R11 288 }; 289 static const unsigned GPROdd1[] = { 290 ARM::R1, ARM::R3, ARM::R5, ARM::R7, ARM::R9, ARM::R11, 291 ARM::R0, ARM::R2, ARM::R12,ARM::LR, ARM::R4, ARM::R6, 292 ARM::R8, ARM::R10 293 }; 294 295 // FP is R7, R9 is available. 296 static const unsigned GPREven2[] = { 297 ARM::R0, ARM::R2, ARM::R4, ARM::R8, ARM::R10, 298 ARM::R1, ARM::R3, ARM::R12,ARM::LR, ARM::R5, ARM::R6, 299 ARM::R9, ARM::R11 300 }; 301 static const unsigned GPROdd2[] = { 302 ARM::R1, ARM::R3, ARM::R5, ARM::R9, ARM::R11, 303 ARM::R0, ARM::R2, ARM::R12,ARM::LR, ARM::R4, ARM::R6, 304 ARM::R8, ARM::R10 305 }; 306 307 // FP is R11, R9 is available. 308 static const unsigned GPREven3[] = { 309 ARM::R0, ARM::R2, ARM::R4, ARM::R6, ARM::R8, 310 ARM::R1, ARM::R3, ARM::R10,ARM::R12,ARM::LR, ARM::R5, ARM::R7, 311 ARM::R9 312 }; 313 static const unsigned GPROdd3[] = { 314 ARM::R1, ARM::R3, ARM::R5, ARM::R6, ARM::R9, 315 ARM::R0, ARM::R2, ARM::R10,ARM::R12,ARM::LR, ARM::R4, ARM::R7, 316 ARM::R8 317 }; 318 319 // No FP, R9 is not available. 320 static const unsigned GPREven4[] = { 321 ARM::R0, ARM::R2, ARM::R4, ARM::R6, ARM::R10, 322 ARM::R1, ARM::R3, ARM::R12,ARM::LR, ARM::R5, ARM::R7, ARM::R8, 323 ARM::R11 324 }; 325 static const unsigned GPROdd4[] = { 326 ARM::R1, ARM::R3, ARM::R5, ARM::R7, ARM::R11, 327 ARM::R0, ARM::R2, ARM::R12,ARM::LR, ARM::R4, ARM::R6, ARM::R8, 328 ARM::R10 329 }; 330 331 // FP is R7, R9 is not available. 332 static const unsigned GPREven5[] = { 333 ARM::R0, ARM::R2, ARM::R4, ARM::R10, 334 ARM::R1, ARM::R3, ARM::R12,ARM::LR, ARM::R5, ARM::R6, ARM::R8, 335 ARM::R11 336 }; 337 static const unsigned GPROdd5[] = { 338 ARM::R1, ARM::R3, ARM::R5, ARM::R11, 339 ARM::R0, ARM::R2, ARM::R12,ARM::LR, ARM::R4, ARM::R6, ARM::R8, 340 ARM::R10 341 }; 342 343 // FP is R11, R9 is not available. 344 static const unsigned GPREven6[] = { 345 ARM::R0, ARM::R2, ARM::R4, ARM::R6, 346 ARM::R1, ARM::R3, ARM::R10,ARM::R12,ARM::LR, ARM::R5, ARM::R7, ARM::R8 347 }; 348 static const unsigned GPROdd6[] = { 349 ARM::R1, ARM::R3, ARM::R5, ARM::R7, 350 ARM::R0, ARM::R2, ARM::R10,ARM::R12,ARM::LR, ARM::R4, ARM::R6, ARM::R8 351 }; 352 353 354 if (HintType == ARMRI::RegPairEven) { 355 if (isPhysicalRegister(HintReg) && getRegisterPairEven(HintReg, MF) == 0) 356 // It's no longer possible to fulfill this hint. Return the default 357 // allocation order. 358 return std::make_pair(RC->allocation_order_begin(MF), 359 RC->allocation_order_end(MF)); 360 361 if (!STI.isTargetDarwin() && !hasFP(MF)) { 362 if (!STI.isR9Reserved()) 363 return std::make_pair(GPREven1, 364 GPREven1 + (sizeof(GPREven1)/sizeof(unsigned))); 365 else 366 return std::make_pair(GPREven4, 367 GPREven4 + (sizeof(GPREven4)/sizeof(unsigned))); 368 } else if (FramePtr == ARM::R7) { 369 if (!STI.isR9Reserved()) 370 return std::make_pair(GPREven2, 371 GPREven2 + (sizeof(GPREven2)/sizeof(unsigned))); 372 else 373 return std::make_pair(GPREven5, 374 GPREven5 + (sizeof(GPREven5)/sizeof(unsigned))); 375 } else { // FramePtr == ARM::R11 376 if (!STI.isR9Reserved()) 377 return std::make_pair(GPREven3, 378 GPREven3 + (sizeof(GPREven3)/sizeof(unsigned))); 379 else 380 return std::make_pair(GPREven6, 381 GPREven6 + (sizeof(GPREven6)/sizeof(unsigned))); 382 } 383 } else if (HintType == ARMRI::RegPairOdd) { 384 if (isPhysicalRegister(HintReg) && getRegisterPairOdd(HintReg, MF) == 0) 385 // It's no longer possible to fulfill this hint. Return the default 386 // allocation order. 387 return std::make_pair(RC->allocation_order_begin(MF), 388 RC->allocation_order_end(MF)); 389 390 if (!STI.isTargetDarwin() && !hasFP(MF)) { 391 if (!STI.isR9Reserved()) 392 return std::make_pair(GPROdd1, 393 GPROdd1 + (sizeof(GPROdd1)/sizeof(unsigned))); 394 else 395 return std::make_pair(GPROdd4, 396 GPROdd4 + (sizeof(GPROdd4)/sizeof(unsigned))); 397 } else if (FramePtr == ARM::R7) { 398 if (!STI.isR9Reserved()) 399 return std::make_pair(GPROdd2, 400 GPROdd2 + (sizeof(GPROdd2)/sizeof(unsigned))); 401 else 402 return std::make_pair(GPROdd5, 403 GPROdd5 + (sizeof(GPROdd5)/sizeof(unsigned))); 404 } else { // FramePtr == ARM::R11 405 if (!STI.isR9Reserved()) 406 return std::make_pair(GPROdd3, 407 GPROdd3 + (sizeof(GPROdd3)/sizeof(unsigned))); 408 else 409 return std::make_pair(GPROdd6, 410 GPROdd6 + (sizeof(GPROdd6)/sizeof(unsigned))); 411 } 412 } 413 return std::make_pair(RC->allocation_order_begin(MF), 414 RC->allocation_order_end(MF)); 415} 416 417/// ResolveRegAllocHint - Resolves the specified register allocation hint 418/// to a physical register. Returns the physical register if it is successful. 419unsigned 420ARMBaseRegisterInfo::ResolveRegAllocHint(unsigned Type, unsigned Reg, 421 const MachineFunction &MF) const { 422 if (Reg == 0 || !isPhysicalRegister(Reg)) 423 return 0; 424 if (Type == 0) 425 return Reg; 426 else if (Type == (unsigned)ARMRI::RegPairOdd) 427 // Odd register. 428 return getRegisterPairOdd(Reg, MF); 429 else if (Type == (unsigned)ARMRI::RegPairEven) 430 // Even register. 431 return getRegisterPairEven(Reg, MF); 432 return 0; 433} 434 435void 436ARMBaseRegisterInfo::UpdateRegAllocHint(unsigned Reg, unsigned NewReg, 437 MachineFunction &MF) const { 438 MachineRegisterInfo *MRI = &MF.getRegInfo(); 439 std::pair<unsigned, unsigned> Hint = MRI->getRegAllocationHint(Reg); 440 if ((Hint.first == (unsigned)ARMRI::RegPairOdd || 441 Hint.first == (unsigned)ARMRI::RegPairEven) && 442 Hint.second && TargetRegisterInfo::isVirtualRegister(Hint.second)) { 443 // If 'Reg' is one of the even / odd register pair and it's now changed 444 // (e.g. coalesced) into a different register. The other register of the 445 // pair allocation hint must be updated to reflect the relationship 446 // change. 447 unsigned OtherReg = Hint.second; 448 Hint = MRI->getRegAllocationHint(OtherReg); 449 if (Hint.second == Reg) 450 // Make sure the pair has not already divorced. 451 MRI->setRegAllocationHint(OtherReg, Hint.first, NewReg); 452 } 453} 454 455/// hasFP - Return true if the specified function should have a dedicated frame 456/// pointer register. This is true if the function has variable sized allocas 457/// or if frame pointer elimination is disabled. 458/// 459bool ARMBaseRegisterInfo::hasFP(const MachineFunction &MF) const { 460 const MachineFrameInfo *MFI = MF.getFrameInfo(); 461 return (NoFramePointerElim || 462 MFI->hasVarSizedObjects() || 463 MFI->isFrameAddressTaken()); 464} 465 466static unsigned estimateStackSize(MachineFunction &MF, MachineFrameInfo *MFI) { 467 const MachineFrameInfo *FFI = MF.getFrameInfo(); 468 int Offset = 0; 469 for (int i = FFI->getObjectIndexBegin(); i != 0; ++i) { 470 int FixedOff = -FFI->getObjectOffset(i); 471 if (FixedOff > Offset) Offset = FixedOff; 472 } 473 for (unsigned i = 0, e = FFI->getObjectIndexEnd(); i != e; ++i) { 474 if (FFI->isDeadObjectIndex(i)) 475 continue; 476 Offset += FFI->getObjectSize(i); 477 unsigned Align = FFI->getObjectAlignment(i); 478 // Adjust to alignment boundary 479 Offset = (Offset+Align-1)/Align*Align; 480 } 481 return (unsigned)Offset; 482} 483 484void 485ARMBaseRegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF, 486 RegScavenger *RS) const { 487 // This tells PEI to spill the FP as if it is any other callee-save register 488 // to take advantage the eliminateFrameIndex machinery. This also ensures it 489 // is spilled in the order specified by getCalleeSavedRegs() to make it easier 490 // to combine multiple loads / stores. 491 bool CanEliminateFrame = true; 492 bool CS1Spilled = false; 493 bool LRSpilled = false; 494 unsigned NumGPRSpills = 0; 495 SmallVector<unsigned, 4> UnspilledCS1GPRs; 496 SmallVector<unsigned, 4> UnspilledCS2GPRs; 497 ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>(); 498 499 // Don't spill FP if the frame can be eliminated. This is determined 500 // by scanning the callee-save registers to see if any is used. 501 const unsigned *CSRegs = getCalleeSavedRegs(); 502 const TargetRegisterClass* const *CSRegClasses = getCalleeSavedRegClasses(); 503 for (unsigned i = 0; CSRegs[i]; ++i) { 504 unsigned Reg = CSRegs[i]; 505 bool Spilled = false; 506 if (MF.getRegInfo().isPhysRegUsed(Reg)) { 507 AFI->setCSRegisterIsSpilled(Reg); 508 Spilled = true; 509 CanEliminateFrame = false; 510 } else { 511 // Check alias registers too. 512 for (const unsigned *Aliases = getAliasSet(Reg); *Aliases; ++Aliases) { 513 if (MF.getRegInfo().isPhysRegUsed(*Aliases)) { 514 Spilled = true; 515 CanEliminateFrame = false; 516 } 517 } 518 } 519 520 if (CSRegClasses[i] == &ARM::GPRRegClass) { 521 if (Spilled) { 522 NumGPRSpills++; 523 524 if (!STI.isTargetDarwin()) { 525 if (Reg == ARM::LR) 526 LRSpilled = true; 527 CS1Spilled = true; 528 continue; 529 } 530 531 // Keep track if LR and any of R4, R5, R6, and R7 is spilled. 532 switch (Reg) { 533 case ARM::LR: 534 LRSpilled = true; 535 // Fallthrough 536 case ARM::R4: 537 case ARM::R5: 538 case ARM::R6: 539 case ARM::R7: 540 CS1Spilled = true; 541 break; 542 default: 543 break; 544 } 545 } else { 546 if (!STI.isTargetDarwin()) { 547 UnspilledCS1GPRs.push_back(Reg); 548 continue; 549 } 550 551 switch (Reg) { 552 case ARM::R4: 553 case ARM::R5: 554 case ARM::R6: 555 case ARM::R7: 556 case ARM::LR: 557 UnspilledCS1GPRs.push_back(Reg); 558 break; 559 default: 560 UnspilledCS2GPRs.push_back(Reg); 561 break; 562 } 563 } 564 } 565 } 566 567 bool ForceLRSpill = false; 568 if (!LRSpilled && AFI->isThumb1OnlyFunction()) { 569 unsigned FnSize = TII.GetFunctionSizeInBytes(MF); 570 // Force LR to be spilled if the Thumb function size is > 2048. This enables 571 // use of BL to implement far jump. If it turns out that it's not needed 572 // then the branch fix up path will undo it. 573 if (FnSize >= (1 << 11)) { 574 CanEliminateFrame = false; 575 ForceLRSpill = true; 576 } 577 } 578 579 bool ExtraCSSpill = false; 580 if (!CanEliminateFrame || hasFP(MF)) { 581 AFI->setHasStackFrame(true); 582 583 // If LR is not spilled, but at least one of R4, R5, R6, and R7 is spilled. 584 // Spill LR as well so we can fold BX_RET to the registers restore (LDM). 585 if (!LRSpilled && CS1Spilled) { 586 MF.getRegInfo().setPhysRegUsed(ARM::LR); 587 AFI->setCSRegisterIsSpilled(ARM::LR); 588 NumGPRSpills++; 589 UnspilledCS1GPRs.erase(std::find(UnspilledCS1GPRs.begin(), 590 UnspilledCS1GPRs.end(), (unsigned)ARM::LR)); 591 ForceLRSpill = false; 592 ExtraCSSpill = true; 593 } 594 595 // Darwin ABI requires FP to point to the stack slot that contains the 596 // previous FP. 597 if (STI.isTargetDarwin() || hasFP(MF)) { 598 MF.getRegInfo().setPhysRegUsed(FramePtr); 599 NumGPRSpills++; 600 } 601 602 // If stack and double are 8-byte aligned and we are spilling an odd number 603 // of GPRs. Spill one extra callee save GPR so we won't have to pad between 604 // the integer and double callee save areas. 605 unsigned TargetAlign = MF.getTarget().getFrameInfo()->getStackAlignment(); 606 if (TargetAlign == 8 && (NumGPRSpills & 1)) { 607 if (CS1Spilled && !UnspilledCS1GPRs.empty()) { 608 for (unsigned i = 0, e = UnspilledCS1GPRs.size(); i != e; ++i) { 609 unsigned Reg = UnspilledCS1GPRs[i]; 610 // Don't spill high register if the function is thumb1 611 if (!AFI->isThumb1OnlyFunction() || 612 isARMLowRegister(Reg) || Reg == ARM::LR) { 613 MF.getRegInfo().setPhysRegUsed(Reg); 614 AFI->setCSRegisterIsSpilled(Reg); 615 if (!isReservedReg(MF, Reg)) 616 ExtraCSSpill = true; 617 break; 618 } 619 } 620 } else if (!UnspilledCS2GPRs.empty() && 621 !AFI->isThumb1OnlyFunction()) { 622 unsigned Reg = UnspilledCS2GPRs.front(); 623 MF.getRegInfo().setPhysRegUsed(Reg); 624 AFI->setCSRegisterIsSpilled(Reg); 625 if (!isReservedReg(MF, Reg)) 626 ExtraCSSpill = true; 627 } 628 } 629 630 // Estimate if we might need to scavenge a register at some point in order 631 // to materialize a stack offset. If so, either spill one additional 632 // callee-saved register or reserve a special spill slot to facilitate 633 // register scavenging. 634 if (RS && !ExtraCSSpill && !AFI->isThumb1OnlyFunction()) { 635 MachineFrameInfo *MFI = MF.getFrameInfo(); 636 unsigned Size = estimateStackSize(MF, MFI); 637 unsigned Limit = (1 << 12) - 1; 638 for (MachineFunction::iterator BB = MF.begin(),E = MF.end();BB != E; ++BB) 639 for (MachineBasicBlock::iterator I= BB->begin(); I != BB->end(); ++I) { 640 for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) 641 if (I->getOperand(i).isFI()) { 642 unsigned Opcode = I->getOpcode(); 643 const TargetInstrDesc &Desc = TII.get(Opcode); 644 unsigned AddrMode = (Desc.TSFlags & ARMII::AddrModeMask); 645 if (AddrMode == ARMII::AddrMode3) { 646 Limit = (1 << 8) - 1; 647 goto DoneEstimating; 648 } else if (AddrMode == ARMII::AddrMode5) { 649 unsigned ThisLimit = ((1 << 8) - 1) * 4; 650 if (ThisLimit < Limit) 651 Limit = ThisLimit; 652 } 653 } 654 } 655 DoneEstimating: 656 if (Size >= Limit) { 657 // If any non-reserved CS register isn't spilled, just spill one or two 658 // extra. That should take care of it! 659 unsigned NumExtras = TargetAlign / 4; 660 SmallVector<unsigned, 2> Extras; 661 while (NumExtras && !UnspilledCS1GPRs.empty()) { 662 unsigned Reg = UnspilledCS1GPRs.back(); 663 UnspilledCS1GPRs.pop_back(); 664 if (!isReservedReg(MF, Reg)) { 665 Extras.push_back(Reg); 666 NumExtras--; 667 } 668 } 669 while (NumExtras && !UnspilledCS2GPRs.empty()) { 670 unsigned Reg = UnspilledCS2GPRs.back(); 671 UnspilledCS2GPRs.pop_back(); 672 if (!isReservedReg(MF, Reg)) { 673 Extras.push_back(Reg); 674 NumExtras--; 675 } 676 } 677 if (Extras.size() && NumExtras == 0) { 678 for (unsigned i = 0, e = Extras.size(); i != e; ++i) { 679 MF.getRegInfo().setPhysRegUsed(Extras[i]); 680 AFI->setCSRegisterIsSpilled(Extras[i]); 681 } 682 } else { 683 // Reserve a slot closest to SP or frame pointer. 684 const TargetRegisterClass *RC = &ARM::GPRRegClass; 685 RS->setScavengingFrameIndex(MFI->CreateStackObject(RC->getSize(), 686 RC->getAlignment())); 687 } 688 } 689 } 690 } 691 692 if (ForceLRSpill) { 693 MF.getRegInfo().setPhysRegUsed(ARM::LR); 694 AFI->setCSRegisterIsSpilled(ARM::LR); 695 AFI->setLRIsSpilledForFarJump(true); 696 } 697} 698 699unsigned ARMBaseRegisterInfo::getRARegister() const { 700 return ARM::LR; 701} 702 703unsigned ARMBaseRegisterInfo::getFrameRegister(MachineFunction &MF) const { 704 if (STI.isTargetDarwin() || hasFP(MF)) 705 return FramePtr; 706 return ARM::SP; 707} 708 709unsigned ARMBaseRegisterInfo::getEHExceptionRegister() const { 710 assert(0 && "What is the exception register"); 711 return 0; 712} 713 714unsigned ARMBaseRegisterInfo::getEHHandlerRegister() const { 715 assert(0 && "What is the exception handler register"); 716 return 0; 717} 718 719int ARMBaseRegisterInfo::getDwarfRegNum(unsigned RegNum, bool isEH) const { 720 return ARMGenRegisterInfo::getDwarfRegNumFull(RegNum, 0); 721} 722 723unsigned ARMBaseRegisterInfo::getRegisterPairEven(unsigned Reg, 724 const MachineFunction &MF) const { 725 switch (Reg) { 726 default: break; 727 // Return 0 if either register of the pair is a special register. 728 // So no R12, etc. 729 case ARM::R1: 730 return ARM::R0; 731 case ARM::R3: 732 // FIXME! 733 return STI.isThumb1Only() ? 0 : ARM::R2; 734 case ARM::R5: 735 return ARM::R4; 736 case ARM::R7: 737 return isReservedReg(MF, ARM::R7) ? 0 : ARM::R6; 738 case ARM::R9: 739 return isReservedReg(MF, ARM::R9) ? 0 :ARM::R8; 740 case ARM::R11: 741 return isReservedReg(MF, ARM::R11) ? 0 : ARM::R10; 742 743 case ARM::S1: 744 return ARM::S0; 745 case ARM::S3: 746 return ARM::S2; 747 case ARM::S5: 748 return ARM::S4; 749 case ARM::S7: 750 return ARM::S6; 751 case ARM::S9: 752 return ARM::S8; 753 case ARM::S11: 754 return ARM::S10; 755 case ARM::S13: 756 return ARM::S12; 757 case ARM::S15: 758 return ARM::S14; 759 case ARM::S17: 760 return ARM::S16; 761 case ARM::S19: 762 return ARM::S18; 763 case ARM::S21: 764 return ARM::S20; 765 case ARM::S23: 766 return ARM::S22; 767 case ARM::S25: 768 return ARM::S24; 769 case ARM::S27: 770 return ARM::S26; 771 case ARM::S29: 772 return ARM::S28; 773 case ARM::S31: 774 return ARM::S30; 775 776 case ARM::D1: 777 return ARM::D0; 778 case ARM::D3: 779 return ARM::D2; 780 case ARM::D5: 781 return ARM::D4; 782 case ARM::D7: 783 return ARM::D6; 784 case ARM::D9: 785 return ARM::D8; 786 case ARM::D11: 787 return ARM::D10; 788 case ARM::D13: 789 return ARM::D12; 790 case ARM::D15: 791 return ARM::D14; 792 } 793 794 return 0; 795} 796 797unsigned ARMBaseRegisterInfo::getRegisterPairOdd(unsigned Reg, 798 const MachineFunction &MF) const { 799 switch (Reg) { 800 default: break; 801 // Return 0 if either register of the pair is a special register. 802 // So no R12, etc. 803 case ARM::R0: 804 return ARM::R1; 805 case ARM::R2: 806 // FIXME! 807 return STI.isThumb1Only() ? 0 : ARM::R3; 808 case ARM::R4: 809 return ARM::R5; 810 case ARM::R6: 811 return isReservedReg(MF, ARM::R7) ? 0 : ARM::R7; 812 case ARM::R8: 813 return isReservedReg(MF, ARM::R9) ? 0 :ARM::R9; 814 case ARM::R10: 815 return isReservedReg(MF, ARM::R11) ? 0 : ARM::R11; 816 817 case ARM::S0: 818 return ARM::S1; 819 case ARM::S2: 820 return ARM::S3; 821 case ARM::S4: 822 return ARM::S5; 823 case ARM::S6: 824 return ARM::S7; 825 case ARM::S8: 826 return ARM::S9; 827 case ARM::S10: 828 return ARM::S11; 829 case ARM::S12: 830 return ARM::S13; 831 case ARM::S14: 832 return ARM::S15; 833 case ARM::S16: 834 return ARM::S17; 835 case ARM::S18: 836 return ARM::S19; 837 case ARM::S20: 838 return ARM::S21; 839 case ARM::S22: 840 return ARM::S23; 841 case ARM::S24: 842 return ARM::S25; 843 case ARM::S26: 844 return ARM::S27; 845 case ARM::S28: 846 return ARM::S29; 847 case ARM::S30: 848 return ARM::S31; 849 850 case ARM::D0: 851 return ARM::D1; 852 case ARM::D2: 853 return ARM::D3; 854 case ARM::D4: 855 return ARM::D5; 856 case ARM::D6: 857 return ARM::D7; 858 case ARM::D8: 859 return ARM::D9; 860 case ARM::D10: 861 return ARM::D11; 862 case ARM::D12: 863 return ARM::D13; 864 case ARM::D14: 865 return ARM::D15; 866 } 867 868 return 0; 869} 870 871 872static inline 873const MachineInstrBuilder &AddDefaultPred(const MachineInstrBuilder &MIB) { 874 return MIB.addImm((int64_t)ARMCC::AL).addReg(0); 875} 876 877static inline 878const MachineInstrBuilder &AddDefaultCC(const MachineInstrBuilder &MIB) { 879 return MIB.addReg(0); 880} 881 882/// emitLoadConstPool - Emits a load from constpool to materialize the 883/// specified immediate. 884void ARMBaseRegisterInfo:: 885emitLoadConstPool(MachineBasicBlock &MBB, 886 MachineBasicBlock::iterator &MBBI, 887 DebugLoc dl, 888 unsigned DestReg, int Val, 889 ARMCC::CondCodes Pred, 890 unsigned PredReg) const { 891 MachineFunction &MF = *MBB.getParent(); 892 MachineConstantPool *ConstantPool = MF.getConstantPool(); 893 Constant *C = ConstantInt::get(Type::Int32Ty, Val); 894 unsigned Idx = ConstantPool->getConstantPoolIndex(C, 4); 895 896 BuildMI(MBB, MBBI, dl, TII.get(ARM::LDRcp), DestReg) 897 .addConstantPoolIndex(Idx) 898 .addReg(0).addImm(0).addImm(Pred).addReg(PredReg); 899} 900 901bool ARMBaseRegisterInfo:: 902requiresRegisterScavenging(const MachineFunction &MF) const { 903 return true; 904} 905 906// hasReservedCallFrame - Under normal circumstances, when a frame pointer is 907// not required, we reserve argument space for call sites in the function 908// immediately on entry to the current function. This eliminates the need for 909// add/sub sp brackets around call sites. Returns true if the call frame is 910// included as part of the stack frame. 911bool ARMBaseRegisterInfo:: 912hasReservedCallFrame(MachineFunction &MF) const { 913 const MachineFrameInfo *FFI = MF.getFrameInfo(); 914 unsigned CFSize = FFI->getMaxCallFrameSize(); 915 // It's not always a good idea to include the call frame as part of the 916 // stack frame. ARM (especially Thumb) has small immediate offset to 917 // address the stack frame. So a large call frame can cause poor codegen 918 // and may even makes it impossible to scavenge a register. 919 if (CFSize >= ((1 << 12) - 1) / 2) // Half of imm12 920 return false; 921 922 return !MF.getFrameInfo()->hasVarSizedObjects(); 923} 924 925/// emitARMRegPlusImmediate - Emits a series of instructions to materialize 926/// a destreg = basereg + immediate in ARM code. 927static 928void emitARMRegPlusImmediate(MachineBasicBlock &MBB, 929 MachineBasicBlock::iterator &MBBI, 930 unsigned DestReg, unsigned BaseReg, int NumBytes, 931 ARMCC::CondCodes Pred, unsigned PredReg, 932 const ARMBaseInstrInfo &TII, 933 DebugLoc dl) { 934 bool isSub = NumBytes < 0; 935 if (isSub) NumBytes = -NumBytes; 936 937 while (NumBytes) { 938 unsigned RotAmt = ARM_AM::getSOImmValRotate(NumBytes); 939 unsigned ThisVal = NumBytes & ARM_AM::rotr32(0xFF, RotAmt); 940 assert(ThisVal && "Didn't extract field correctly"); 941 942 // We will handle these bits from offset, clear them. 943 NumBytes &= ~ThisVal; 944 945 assert(ARM_AM::getSOImmVal(ThisVal) != -1 && "Bit extraction didn't work?"); 946 947 // Build the new ADD / SUB. 948 BuildMI(MBB, MBBI, dl, TII.get(TII.getOpcode(isSub ? ARMII::SUBri : ARMII::ADDri)), DestReg) 949 .addReg(BaseReg, RegState::Kill).addImm(ThisVal) 950 .addImm((unsigned)Pred).addReg(PredReg).addReg(0); 951 BaseReg = DestReg; 952 } 953} 954 955static void 956emitSPUpdate(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, 957 const ARMBaseInstrInfo &TII, DebugLoc dl, 958 int NumBytes, 959 ARMCC::CondCodes Pred = ARMCC::AL, unsigned PredReg = 0) { 960 emitARMRegPlusImmediate(MBB, MBBI, ARM::SP, ARM::SP, NumBytes, 961 Pred, PredReg, TII, dl); 962} 963 964void ARMBaseRegisterInfo:: 965eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, 966 MachineBasicBlock::iterator I) const { 967 if (!hasReservedCallFrame(MF)) { 968 // If we have alloca, convert as follows: 969 // ADJCALLSTACKDOWN -> sub, sp, sp, amount 970 // ADJCALLSTACKUP -> add, sp, sp, amount 971 MachineInstr *Old = I; 972 DebugLoc dl = Old->getDebugLoc(); 973 unsigned Amount = Old->getOperand(0).getImm(); 974 if (Amount != 0) { 975 // We need to keep the stack aligned properly. To do this, we round the 976 // amount of space needed for the outgoing arguments up to the next 977 // alignment boundary. 978 unsigned Align = MF.getTarget().getFrameInfo()->getStackAlignment(); 979 Amount = (Amount+Align-1)/Align*Align; 980 981 // Replace the pseudo instruction with a new instruction... 982 unsigned Opc = Old->getOpcode(); 983 ARMCC::CondCodes Pred = (ARMCC::CondCodes)Old->getOperand(1).getImm(); 984 if (Opc == ARM::ADJCALLSTACKDOWN || Opc == ARM::tADJCALLSTACKDOWN) { 985 // Note: PredReg is operand 2 for ADJCALLSTACKDOWN. 986 unsigned PredReg = Old->getOperand(2).getReg(); 987 emitSPUpdate(MBB, I, TII, dl, -Amount, Pred, PredReg); 988 } else { 989 // Note: PredReg is operand 3 for ADJCALLSTACKUP. 990 unsigned PredReg = Old->getOperand(3).getReg(); 991 assert(Opc == ARM::ADJCALLSTACKUP || Opc == ARM::tADJCALLSTACKUP); 992 emitSPUpdate(MBB, I, TII, dl, Amount, Pred, PredReg); 993 } 994 } 995 } 996 MBB.erase(I); 997} 998 999/// findScratchRegister - Find a 'free' ARM register. If register scavenger 1000/// is not being used, R12 is available. Otherwise, try for a call-clobbered 1001/// register first and then a spilled callee-saved register if that fails. 1002static 1003unsigned findScratchRegister(RegScavenger *RS, const TargetRegisterClass *RC, 1004 ARMFunctionInfo *AFI) { 1005 unsigned Reg = RS ? RS->FindUnusedReg(RC, true) : (unsigned) ARM::R12; 1006 assert (!AFI->isThumb1OnlyFunction()); 1007 if (Reg == 0) 1008 // Try a already spilled CS register. 1009 Reg = RS->FindUnusedReg(RC, AFI->getSpilledCSRegisters()); 1010 1011 return Reg; 1012} 1013 1014void ARMBaseRegisterInfo:: 1015eliminateFrameIndex(MachineBasicBlock::iterator II, 1016 int SPAdj, RegScavenger *RS) const{ 1017 unsigned i = 0; 1018 MachineInstr &MI = *II; 1019 MachineBasicBlock &MBB = *MI.getParent(); 1020 MachineFunction &MF = *MBB.getParent(); 1021 ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>(); 1022 DebugLoc dl = MI.getDebugLoc(); 1023 1024 while (!MI.getOperand(i).isFI()) { 1025 ++i; 1026 assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!"); 1027 } 1028 1029 unsigned FrameReg = ARM::SP; 1030 int FrameIndex = MI.getOperand(i).getIndex(); 1031 int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex) + 1032 MF.getFrameInfo()->getStackSize() + SPAdj; 1033 1034 if (AFI->isGPRCalleeSavedArea1Frame(FrameIndex)) 1035 Offset -= AFI->getGPRCalleeSavedArea1Offset(); 1036 else if (AFI->isGPRCalleeSavedArea2Frame(FrameIndex)) 1037 Offset -= AFI->getGPRCalleeSavedArea2Offset(); 1038 else if (AFI->isDPRCalleeSavedAreaFrame(FrameIndex)) 1039 Offset -= AFI->getDPRCalleeSavedAreaOffset(); 1040 else if (hasFP(MF)) { 1041 assert(SPAdj == 0 && "Unexpected"); 1042 // There is alloca()'s in this function, must reference off the frame 1043 // pointer instead. 1044 FrameReg = getFrameRegister(MF); 1045 Offset -= AFI->getFramePtrSpillOffset(); 1046 } 1047 1048 unsigned Opcode = MI.getOpcode(); 1049 const TargetInstrDesc &Desc = MI.getDesc(); 1050 unsigned AddrMode = (Desc.TSFlags & ARMII::AddrModeMask); 1051 bool isSub = false; 1052 1053 // Memory operands in inline assembly always use AddrMode2. 1054 if (Opcode == ARM::INLINEASM) 1055 AddrMode = ARMII::AddrMode2; 1056 1057 if (Opcode == getOpcode(ARMII::ADDri)) { 1058 Offset += MI.getOperand(i+1).getImm(); 1059 if (Offset == 0) { 1060 // Turn it into a move. 1061 MI.setDesc(TII.get(getOpcode(ARMII::MOVr))); 1062 MI.getOperand(i).ChangeToRegister(FrameReg, false); 1063 MI.RemoveOperand(i+1); 1064 return; 1065 } else if (Offset < 0) { 1066 Offset = -Offset; 1067 isSub = true; 1068 MI.setDesc(TII.get(getOpcode(ARMII::SUBri))); 1069 } 1070 1071 // Common case: small offset, fits into instruction. 1072 if (ARM_AM::getSOImmVal(Offset) != -1) { 1073 // Replace the FrameIndex with sp / fp 1074 MI.getOperand(i).ChangeToRegister(FrameReg, false); 1075 MI.getOperand(i+1).ChangeToImmediate(Offset); 1076 return; 1077 } 1078 1079 // Otherwise, we fallback to common code below to form the imm offset with 1080 // a sequence of ADDri instructions. First though, pull as much of the imm 1081 // into this ADDri as possible. 1082 unsigned RotAmt = ARM_AM::getSOImmValRotate(Offset); 1083 unsigned ThisImmVal = Offset & ARM_AM::rotr32(0xFF, RotAmt); 1084 1085 // We will handle these bits from offset, clear them. 1086 Offset &= ~ThisImmVal; 1087 1088 // Get the properly encoded SOImmVal field. 1089 assert(ARM_AM::getSOImmVal(ThisImmVal) != -1 && 1090 "Bit extraction didn't work?"); 1091 MI.getOperand(i+1).ChangeToImmediate(ThisImmVal); 1092 } else { 1093 unsigned ImmIdx = 0; 1094 int InstrOffs = 0; 1095 unsigned NumBits = 0; 1096 unsigned Scale = 1; 1097 switch (AddrMode) { 1098 case ARMII::AddrMode2: { 1099 ImmIdx = i+2; 1100 InstrOffs = ARM_AM::getAM2Offset(MI.getOperand(ImmIdx).getImm()); 1101 if (ARM_AM::getAM2Op(MI.getOperand(ImmIdx).getImm()) == ARM_AM::sub) 1102 InstrOffs *= -1; 1103 NumBits = 12; 1104 break; 1105 } 1106 case ARMII::AddrMode3: { 1107 ImmIdx = i+2; 1108 InstrOffs = ARM_AM::getAM3Offset(MI.getOperand(ImmIdx).getImm()); 1109 if (ARM_AM::getAM3Op(MI.getOperand(ImmIdx).getImm()) == ARM_AM::sub) 1110 InstrOffs *= -1; 1111 NumBits = 8; 1112 break; 1113 } 1114 case ARMII::AddrMode5: { 1115 ImmIdx = i+1; 1116 InstrOffs = ARM_AM::getAM5Offset(MI.getOperand(ImmIdx).getImm()); 1117 if (ARM_AM::getAM5Op(MI.getOperand(ImmIdx).getImm()) == ARM_AM::sub) 1118 InstrOffs *= -1; 1119 NumBits = 8; 1120 Scale = 4; 1121 break; 1122 } 1123 default: 1124 LLVM_UNREACHABLE("Unsupported addressing mode!"); 1125 break; 1126 } 1127 1128 Offset += InstrOffs * Scale; 1129 assert((Offset & (Scale-1)) == 0 && "Can't encode this offset!"); 1130 if (Offset < 0) { 1131 Offset = -Offset; 1132 isSub = true; 1133 } 1134 1135 // Common case: small offset, fits into instruction. 1136 MachineOperand &ImmOp = MI.getOperand(ImmIdx); 1137 int ImmedOffset = Offset / Scale; 1138 unsigned Mask = (1 << NumBits) - 1; 1139 if ((unsigned)Offset <= Mask * Scale) { 1140 // Replace the FrameIndex with sp 1141 MI.getOperand(i).ChangeToRegister(FrameReg, false); 1142 if (isSub) 1143 ImmedOffset |= 1 << NumBits; 1144 ImmOp.ChangeToImmediate(ImmedOffset); 1145 return; 1146 } 1147 1148 // Otherwise, it didn't fit. Pull in what we can to simplify the immed. 1149 ImmedOffset = ImmedOffset & Mask; 1150 if (isSub) 1151 ImmedOffset |= 1 << NumBits; 1152 ImmOp.ChangeToImmediate(ImmedOffset); 1153 Offset &= ~(Mask*Scale); 1154 } 1155 1156 // If we get here, the immediate doesn't fit into the instruction. We folded 1157 // as much as possible above, handle the rest, providing a register that is 1158 // SP+LargeImm. 1159 assert(Offset && "This code isn't needed if offset already handled!"); 1160 1161 // Insert a set of r12 with the full address: r12 = sp + offset 1162 // If the offset we have is too large to fit into the instruction, we need 1163 // to form it with a series of ADDri's. Do this by taking 8-bit chunks 1164 // out of 'Offset'. 1165 unsigned ScratchReg = findScratchRegister(RS, &ARM::GPRRegClass, AFI); 1166 if (ScratchReg == 0) 1167 // No register is "free". Scavenge a register. 1168 ScratchReg = RS->scavengeRegister(&ARM::GPRRegClass, II, SPAdj); 1169 int PIdx = MI.findFirstPredOperandIdx(); 1170 ARMCC::CondCodes Pred = (PIdx == -1) 1171 ? ARMCC::AL : (ARMCC::CondCodes)MI.getOperand(PIdx).getImm(); 1172 unsigned PredReg = (PIdx == -1) ? 0 : MI.getOperand(PIdx+1).getReg(); 1173 emitARMRegPlusImmediate(MBB, II, ScratchReg, FrameReg, 1174 isSub ? -Offset : Offset, Pred, PredReg, TII, dl); 1175 MI.getOperand(i).ChangeToRegister(ScratchReg, false, false, true); 1176} 1177 1178/// Move iterator pass the next bunch of callee save load / store ops for 1179/// the particular spill area (1: integer area 1, 2: integer area 2, 1180/// 3: fp area, 0: don't care). 1181static void movePastCSLoadStoreOps(MachineBasicBlock &MBB, 1182 MachineBasicBlock::iterator &MBBI, 1183 int Opc, unsigned Area, 1184 const ARMSubtarget &STI) { 1185 while (MBBI != MBB.end() && 1186 MBBI->getOpcode() == Opc && MBBI->getOperand(1).isFI()) { 1187 if (Area != 0) { 1188 bool Done = false; 1189 unsigned Category = 0; 1190 switch (MBBI->getOperand(0).getReg()) { 1191 case ARM::R4: case ARM::R5: case ARM::R6: case ARM::R7: 1192 case ARM::LR: 1193 Category = 1; 1194 break; 1195 case ARM::R8: case ARM::R9: case ARM::R10: case ARM::R11: 1196 Category = STI.isTargetDarwin() ? 2 : 1; 1197 break; 1198 case ARM::D8: case ARM::D9: case ARM::D10: case ARM::D11: 1199 case ARM::D12: case ARM::D13: case ARM::D14: case ARM::D15: 1200 Category = 3; 1201 break; 1202 default: 1203 Done = true; 1204 break; 1205 } 1206 if (Done || Category != Area) 1207 break; 1208 } 1209 1210 ++MBBI; 1211 } 1212} 1213 1214void ARMBaseRegisterInfo:: 1215emitPrologue(MachineFunction &MF) const { 1216 MachineBasicBlock &MBB = MF.front(); 1217 MachineBasicBlock::iterator MBBI = MBB.begin(); 1218 MachineFrameInfo *MFI = MF.getFrameInfo(); 1219 ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>(); 1220 unsigned VARegSaveSize = AFI->getVarArgsRegSaveSize(); 1221 unsigned NumBytes = MFI->getStackSize(); 1222 const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo(); 1223 DebugLoc dl = (MBBI != MBB.end() ? 1224 MBBI->getDebugLoc() : DebugLoc::getUnknownLoc()); 1225 1226 // Determine the sizes of each callee-save spill areas and record which frame 1227 // belongs to which callee-save spill areas. 1228 unsigned GPRCS1Size = 0, GPRCS2Size = 0, DPRCSSize = 0; 1229 int FramePtrSpillFI = 0; 1230 1231 if (VARegSaveSize) 1232 emitSPUpdate(MBB, MBBI, TII, dl, -VARegSaveSize); 1233 1234 if (!AFI->hasStackFrame()) { 1235 if (NumBytes != 0) 1236 emitSPUpdate(MBB, MBBI, TII, dl, -NumBytes); 1237 return; 1238 } 1239 1240 for (unsigned i = 0, e = CSI.size(); i != e; ++i) { 1241 unsigned Reg = CSI[i].getReg(); 1242 int FI = CSI[i].getFrameIdx(); 1243 switch (Reg) { 1244 case ARM::R4: 1245 case ARM::R5: 1246 case ARM::R6: 1247 case ARM::R7: 1248 case ARM::LR: 1249 if (Reg == FramePtr) 1250 FramePtrSpillFI = FI; 1251 AFI->addGPRCalleeSavedArea1Frame(FI); 1252 GPRCS1Size += 4; 1253 break; 1254 case ARM::R8: 1255 case ARM::R9: 1256 case ARM::R10: 1257 case ARM::R11: 1258 if (Reg == FramePtr) 1259 FramePtrSpillFI = FI; 1260 if (STI.isTargetDarwin()) { 1261 AFI->addGPRCalleeSavedArea2Frame(FI); 1262 GPRCS2Size += 4; 1263 } else { 1264 AFI->addGPRCalleeSavedArea1Frame(FI); 1265 GPRCS1Size += 4; 1266 } 1267 break; 1268 default: 1269 AFI->addDPRCalleeSavedAreaFrame(FI); 1270 DPRCSSize += 8; 1271 } 1272 } 1273 1274 // Build the new SUBri to adjust SP for integer callee-save spill area 1. 1275 emitSPUpdate(MBB, MBBI, TII, dl, -GPRCS1Size); 1276 movePastCSLoadStoreOps(MBB, MBBI, getOpcode(ARMII::STR), 1, STI); 1277 1278 // Darwin ABI requires FP to point to the stack slot that contains the 1279 // previous FP. 1280 if (STI.isTargetDarwin() || hasFP(MF)) { 1281 MachineInstrBuilder MIB = 1282 BuildMI(MBB, MBBI, dl, TII.get(getOpcode(ARMII::ADDri)), FramePtr) 1283 .addFrameIndex(FramePtrSpillFI).addImm(0); 1284 AddDefaultCC(AddDefaultPred(MIB)); 1285 } 1286 1287 // Build the new SUBri to adjust SP for integer callee-save spill area 2. 1288 emitSPUpdate(MBB, MBBI, TII, dl, -GPRCS2Size); 1289 1290 // Build the new SUBri to adjust SP for FP callee-save spill area. 1291 movePastCSLoadStoreOps(MBB, MBBI, getOpcode(ARMII::STR), 2, STI); 1292 emitSPUpdate(MBB, MBBI, TII, dl, -DPRCSSize); 1293 1294 // Determine starting offsets of spill areas. 1295 unsigned DPRCSOffset = NumBytes - (GPRCS1Size + GPRCS2Size + DPRCSSize); 1296 unsigned GPRCS2Offset = DPRCSOffset + DPRCSSize; 1297 unsigned GPRCS1Offset = GPRCS2Offset + GPRCS2Size; 1298 AFI->setFramePtrSpillOffset(MFI->getObjectOffset(FramePtrSpillFI) + NumBytes); 1299 AFI->setGPRCalleeSavedArea1Offset(GPRCS1Offset); 1300 AFI->setGPRCalleeSavedArea2Offset(GPRCS2Offset); 1301 AFI->setDPRCalleeSavedAreaOffset(DPRCSOffset); 1302 1303 NumBytes = DPRCSOffset; 1304 if (NumBytes) { 1305 // Insert it after all the callee-save spills. 1306 movePastCSLoadStoreOps(MBB, MBBI, getOpcode(ARMII::FSTD), 3, STI); 1307 emitSPUpdate(MBB, MBBI, TII, dl, -NumBytes); 1308 } 1309 1310 if (STI.isTargetELF() && hasFP(MF)) { 1311 MFI->setOffsetAdjustment(MFI->getOffsetAdjustment() - 1312 AFI->getFramePtrSpillOffset()); 1313 } 1314 1315 AFI->setGPRCalleeSavedArea1Size(GPRCS1Size); 1316 AFI->setGPRCalleeSavedArea2Size(GPRCS2Size); 1317 AFI->setDPRCalleeSavedAreaSize(DPRCSSize); 1318} 1319 1320static bool isCalleeSavedRegister(unsigned Reg, const unsigned *CSRegs) { 1321 for (unsigned i = 0; CSRegs[i]; ++i) 1322 if (Reg == CSRegs[i]) 1323 return true; 1324 return false; 1325} 1326 1327static bool isCSRestore(MachineInstr *MI, 1328 const ARMBaseInstrInfo &TII, 1329 const unsigned *CSRegs) { 1330 return ((MI->getOpcode() == (int)TII.getOpcode(ARMII::FLDD) || 1331 MI->getOpcode() == (int)TII.getOpcode(ARMII::LDR)) && 1332 MI->getOperand(1).isFI() && 1333 isCalleeSavedRegister(MI->getOperand(0).getReg(), CSRegs)); 1334} 1335 1336void ARMBaseRegisterInfo:: 1337emitEpilogue(MachineFunction &MF, 1338 MachineBasicBlock &MBB) const { 1339 MachineBasicBlock::iterator MBBI = prior(MBB.end()); 1340 assert(MBBI->getOpcode() == (int)getOpcode(ARMII::BX_RET) && 1341 "Can only insert epilog into returning blocks"); 1342 DebugLoc dl = MBBI->getDebugLoc(); 1343 MachineFrameInfo *MFI = MF.getFrameInfo(); 1344 ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>(); 1345 unsigned VARegSaveSize = AFI->getVarArgsRegSaveSize(); 1346 int NumBytes = (int)MFI->getStackSize(); 1347 1348 if (!AFI->hasStackFrame()) { 1349 if (NumBytes != 0) 1350 emitSPUpdate(MBB, MBBI, TII, dl, NumBytes); 1351 } else { 1352 // Unwind MBBI to point to first LDR / FLDD. 1353 const unsigned *CSRegs = getCalleeSavedRegs(); 1354 if (MBBI != MBB.begin()) { 1355 do 1356 --MBBI; 1357 while (MBBI != MBB.begin() && isCSRestore(MBBI, TII, CSRegs)); 1358 if (!isCSRestore(MBBI, TII, CSRegs)) 1359 ++MBBI; 1360 } 1361 1362 // Move SP to start of FP callee save spill area. 1363 NumBytes -= (AFI->getGPRCalleeSavedArea1Size() + 1364 AFI->getGPRCalleeSavedArea2Size() + 1365 AFI->getDPRCalleeSavedAreaSize()); 1366 1367 // Darwin ABI requires FP to point to the stack slot that contains the 1368 // previous FP. 1369 if ((STI.isTargetDarwin() && NumBytes) || hasFP(MF)) { 1370 NumBytes = AFI->getFramePtrSpillOffset() - NumBytes; 1371 // Reset SP based on frame pointer only if the stack frame extends beyond 1372 // frame pointer stack slot or target is ELF and the function has FP. 1373 if (AFI->getGPRCalleeSavedArea2Size() || 1374 AFI->getDPRCalleeSavedAreaSize() || 1375 AFI->getDPRCalleeSavedAreaOffset()|| 1376 hasFP(MF)) { 1377 if (NumBytes) 1378 BuildMI(MBB, MBBI, dl, TII.get(getOpcode(ARMII::SUBri)), ARM::SP).addReg(FramePtr) 1379 .addImm(NumBytes) 1380 .addImm((unsigned)ARMCC::AL).addReg(0).addReg(0); 1381 else 1382 BuildMI(MBB, MBBI, dl, TII.get(getOpcode(ARMII::MOVr)), ARM::SP).addReg(FramePtr) 1383 .addImm((unsigned)ARMCC::AL).addReg(0).addReg(0); 1384 } 1385 } else if (NumBytes) { 1386 emitSPUpdate(MBB, MBBI, TII, dl, NumBytes); 1387 } 1388 1389 // Move SP to start of integer callee save spill area 2. 1390 movePastCSLoadStoreOps(MBB, MBBI, getOpcode(ARMII::FLDD), 3, STI); 1391 emitSPUpdate(MBB, MBBI, TII, dl, AFI->getDPRCalleeSavedAreaSize()); 1392 1393 // Move SP to start of integer callee save spill area 1. 1394 movePastCSLoadStoreOps(MBB, MBBI, getOpcode(ARMII::LDR), 2, STI); 1395 emitSPUpdate(MBB, MBBI, TII, dl, AFI->getGPRCalleeSavedArea2Size()); 1396 1397 // Move SP to SP upon entry to the function. 1398 movePastCSLoadStoreOps(MBB, MBBI, getOpcode(ARMII::LDR), 1, STI); 1399 emitSPUpdate(MBB, MBBI, TII, dl, AFI->getGPRCalleeSavedArea1Size()); 1400 } 1401 1402 if (VARegSaveSize) 1403 emitSPUpdate(MBB, MBBI, TII, dl, VARegSaveSize); 1404 1405} 1406 1407#include "ARMGenRegisterInfo.inc" 1408