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