1 //===- BlackfinRegisterInfo.cpp - Blackfin Register Information -*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file contains the Blackfin implementation of the TargetRegisterInfo
13 //===----------------------------------------------------------------------===//
16 #include "BlackfinRegisterInfo.h"
17 #include "BlackfinSubtarget.h"
18 #include "llvm/Support/Debug.h"
19 #include "llvm/Support/ErrorHandling.h"
20 #include "llvm/CodeGen/MachineInstrBuilder.h"
21 #include "llvm/CodeGen/MachineFunction.h"
22 #include "llvm/CodeGen/MachineFrameInfo.h"
23 #include "llvm/CodeGen/MachineLocation.h"
24 #include "llvm/CodeGen/RegisterScavenging.h"
25 #include "llvm/Target/TargetFrameInfo.h"
26 #include "llvm/Target/TargetMachine.h"
27 #include "llvm/Target/TargetOptions.h"
28 #include "llvm/Target/TargetInstrInfo.h"
29 #include "llvm/Type.h"
30 #include "llvm/ADT/BitVector.h"
31 #include "llvm/ADT/STLExtras.h"
34 BlackfinRegisterInfo::BlackfinRegisterInfo(BlackfinSubtarget &st,
35 const TargetInstrInfo &tii)
36 : BlackfinGenRegisterInfo(BF::ADJCALLSTACKDOWN, BF::ADJCALLSTACKUP),
41 BlackfinRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
43 static const unsigned CalleeSavedRegs[] = {
48 return CalleeSavedRegs;
51 const TargetRegisterClass* const *BlackfinRegisterInfo::
52 getCalleeSavedRegClasses(const MachineFunction *MF) const {
54 static const TargetRegisterClass * const CalleeSavedRegClasses[] = {
56 &DRegClass, &DRegClass, &DRegClass, &DRegClass,
57 &PRegClass, &PRegClass, &PRegClass,
59 return CalleeSavedRegClasses;
63 BlackfinRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
65 BitVector Reserved(getNumRegs());
77 const TargetRegisterClass*
78 BlackfinRegisterInfo::getPhysicalRegisterRegClass(unsigned reg, MVT VT) const {
79 assert(isPhysicalRegister(reg) && "reg must be a physical register");
81 // Pick the smallest register class of the right type that contains
83 const TargetRegisterClass* BestRC = 0;
84 for (regclass_iterator I = regclass_begin(), E = regclass_end();
86 const TargetRegisterClass* RC = *I;
87 if ((VT == MVT::Other || RC->hasType(VT)) && RC->contains(reg) &&
88 (!BestRC || RC->getNumRegs() < BestRC->getNumRegs()))
92 assert(BestRC && "Couldn't find the register class");
96 // hasFP - Return true if the specified function should have a dedicated frame
97 // pointer register. This is true if the function has variable sized allocas or
98 // if frame pointer elimination is disabled.
99 bool BlackfinRegisterInfo::hasFP(const MachineFunction &MF) const {
100 const MachineFrameInfo *MFI = MF.getFrameInfo();
101 return NoFramePointerElim || MFI->hasCalls() || MFI->hasVarSizedObjects();
104 bool BlackfinRegisterInfo::
105 requiresRegisterScavenging(const MachineFunction &MF) const {
109 // Emit instructions to add delta to D/P register. ScratchReg must be of the
110 // same class as Reg (P).
111 void BlackfinRegisterInfo::adjustRegister(MachineBasicBlock &MBB,
112 MachineBasicBlock::iterator I,
119 if (isImm<7>(delta)) {
120 BuildMI(MBB, I, DL, TII.get(BF::ADDpp_imm7), Reg)
121 .addReg(Reg) // No kill on two-addr operand
126 // We must load delta into ScratchReg and add that.
127 loadConstant(MBB, I, DL, ScratchReg, delta);
128 if (BF::PRegClass.contains(Reg)) {
129 assert (BF::PRegClass.contains(ScratchReg));
130 BuildMI(MBB, I, DL, TII.get(BF::ADDpp), Reg)
131 .addReg(Reg, RegState::Kill)
132 .addReg(ScratchReg, RegState::Kill);
134 assert (BF::DRegClass.contains(Reg));
135 assert (BF::DRegClass.contains(ScratchReg));
136 BuildMI(MBB, I, DL, TII.get(BF::ADD), Reg)
137 .addReg(Reg, RegState::Kill)
138 .addReg(ScratchReg, RegState::Kill);
142 // Emit instructions to load a constant into D/P register
143 void BlackfinRegisterInfo::loadConstant(MachineBasicBlock &MBB,
144 MachineBasicBlock::iterator I,
148 if (isImm<7>(value)) {
149 BuildMI(MBB, I, DL, TII.get(BF::LOADimm7), Reg).addImm(value);
153 if (isUimm<16>(value)) {
154 BuildMI(MBB, I, DL, TII.get(BF::LOADuimm16), Reg).addImm(value);
158 if (isImm<16>(value)) {
159 BuildMI(MBB, I, DL, TII.get(BF::LOADimm16), Reg).addImm(value);
163 // We must split into halves
165 TII.get(BF::LOAD16i), getSubReg(Reg, bfin_subreg_hi16))
166 .addImm((value >> 16) & 0xffff)
167 .addReg(Reg, RegState::ImplicitDefine);
169 TII.get(BF::LOAD16i), getSubReg(Reg, bfin_subreg_lo16))
170 .addImm(value & 0xffff)
171 .addReg(Reg, RegState::ImplicitKill)
172 .addReg(Reg, RegState::ImplicitDefine);
175 void BlackfinRegisterInfo::
176 eliminateCallFramePseudoInstr(MachineFunction &MF,
177 MachineBasicBlock &MBB,
178 MachineBasicBlock::iterator I) const {
179 if (!hasReservedCallFrame(MF)) {
180 int64_t Amount = I->getOperand(0).getImm();
182 assert(Amount%4 == 0);
183 if (I->getOpcode() == BF::ADJCALLSTACKDOWN) {
184 adjustRegister(MBB, I, I->getDebugLoc(), BF::SP, BF::P1, -Amount);
186 assert(I->getOpcode() == BF::ADJCALLSTACKUP);
187 adjustRegister(MBB, I, I->getDebugLoc(), BF::SP, BF::P1, Amount);
194 /// findScratchRegister - Find a 'free' register. Try for a call-clobbered
195 /// register first and then a spilled callee-saved register if that fails.
196 static unsigned findScratchRegister(MachineBasicBlock::iterator II,
198 const TargetRegisterClass *RC,
200 assert(RS && "Register scavenging must be on");
201 unsigned Reg = RS->FindUnusedReg(RC, true);
203 Reg = RS->scavengeRegister(RC, II, SPAdj);
207 void BlackfinRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
209 RegScavenger *RS) const {
211 MachineInstr &MI = *II;
212 MachineBasicBlock &MBB = *MI.getParent();
213 MachineFunction &MF = *MBB.getParent();
214 DebugLoc DL = MI.getDebugLoc();
216 for (i=0; !MI.getOperand(i).isFI(); i++) {
217 assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!");
219 int FrameIndex = MI.getOperand(i).getIndex();
220 assert(i+1 < MI.getNumOperands() && MI.getOperand(i+1).isImm());
221 int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex)
222 + MI.getOperand(i+1).getImm();
223 unsigned BaseReg = BF::FP;
228 Offset += MF.getFrameInfo()->getStackSize() + SPAdj;
231 bool isStore = false;
233 switch (MI.getOpcode()) {
237 assert(Offset%4 == 0 && "Badly aligned i32 stack access");
239 MI.getOperand(i).ChangeToRegister(BaseReg, false);
240 MI.getOperand(i+1).setImm(Offset);
241 if (isUimm<6>(Offset)) {
242 MI.setDesc(TII.get(isStore
243 ? BF::STORE32p_uimm6m4
244 : BF::LOAD32p_uimm6m4));
247 if (BaseReg == BF::FP && isUimm<7>(-Offset)) {
248 MI.setDesc(TII.get(isStore
249 ? BF::STORE32fp_nimm7m4
250 : BF::LOAD32fp_nimm7m4));
251 MI.getOperand(i+1).setImm(-Offset);
254 if (isImm<18>(Offset)) {
255 MI.setDesc(TII.get(isStore
256 ? BF::STORE32p_imm18m4
257 : BF::LOAD32p_imm18m4));
260 // Use RegScavenger to calculate proper offset...
262 llvm_unreachable("Stack frame offset too big");
266 assert(MI.getOperand(0).isReg());
267 unsigned DestReg = MI.getOperand(0).getReg();
268 // We need to produce a stack offset in a P register. We emit:
272 loadConstant(MBB, II, DL, DestReg, Offset);
273 MI.getOperand(1).ChangeToRegister(DestReg, false, false, true);
274 MI.getOperand(2).ChangeToRegister(BaseReg, false);
280 assert(Offset%2 == 0 && "Badly aligned i16 stack access");
282 // We need a P register to use as an address
283 unsigned ScratchReg = findScratchRegister(II, RS, &BF::PRegClass, SPAdj);
285 loadConstant(MBB, II, DL, ScratchReg, Offset);
286 BuildMI(MBB, II, DL, TII.get(BF::ADDpp), ScratchReg)
287 .addReg(ScratchReg, RegState::Kill)
289 MI.setDesc(TII.get(isStore ? BF::STORE16pi : BF::LOAD16pi));
290 MI.getOperand(1).ChangeToRegister(ScratchReg, false, false, true);
295 // This is an AnyCC spill, we need a scratch register.
297 MachineOperand SpillReg = MI.getOperand(0);
298 unsigned ScratchReg = findScratchRegister(II, RS, &BF::DRegClass, SPAdj);
300 if (SpillReg.getReg()==BF::NCC) {
301 BuildMI(MBB, II, DL, TII.get(BF::MOVENCC_z), ScratchReg)
302 .addOperand(SpillReg);
303 BuildMI(MBB, II, DL, TII.get(BF::BITTGL), ScratchReg)
304 .addReg(ScratchReg).addImm(0);
306 BuildMI(MBB, II, DL, TII.get(BF::MOVECC_zext), ScratchReg)
307 .addOperand(SpillReg);
310 MI.setDesc(TII.get(BF::STORE8p_imm16));
311 MI.getOperand(0).ChangeToRegister(ScratchReg, false, false, true);
312 MI.getOperand(i).ChangeToRegister(BaseReg, false);
313 MI.getOperand(i+1).setImm(Offset);
317 // This is an restore, we need a scratch register.
319 MachineOperand SpillReg = MI.getOperand(0);
320 unsigned ScratchReg = findScratchRegister(II, RS, &BF::DRegClass, SPAdj);
322 MI.setDesc(TII.get(BF::LOAD32p_imm16_8z));
323 MI.getOperand(0).ChangeToRegister(ScratchReg, true);
324 MI.getOperand(i).ChangeToRegister(BaseReg, false);
325 MI.getOperand(i+1).setImm(Offset);
327 if (SpillReg.getReg()==BF::CC) {
329 BuildMI(MBB, II, DL, TII.get(BF::MOVECC_nz), BF::CC)
330 .addReg(ScratchReg, RegState::Kill);
332 // Restore NCC (CC = D==0)
333 BuildMI(MBB, II, DL, TII.get(BF::SETEQri_not), BF::NCC)
334 .addReg(ScratchReg, RegState::Kill)
340 llvm_unreachable("Cannot eliminate frame index");
345 void BlackfinRegisterInfo::
346 processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
347 RegScavenger *RS) const {
348 MachineFrameInfo *MFI = MF.getFrameInfo();
349 const TargetRegisterClass *RC = BF::DPRegisterClass;
350 if (requiresRegisterScavenging(MF)) {
351 // Reserve a slot close to SP or frame pointer.
352 RS->setScavengingFrameIndex(MFI->CreateStackObject(RC->getSize(),
353 RC->getAlignment()));
357 void BlackfinRegisterInfo::
358 processFunctionBeforeFrameFinalized(MachineFunction &MF) const {
361 // Emit a prologue that sets up a stack frame.
362 // On function entry, R0-R2 and P0 may hold arguments.
363 // R3, P1, and P2 may be used as scratch registers
364 void BlackfinRegisterInfo::emitPrologue(MachineFunction &MF) const {
365 MachineBasicBlock &MBB = MF.front(); // Prolog goes in entry BB
366 MachineBasicBlock::iterator MBBI = MBB.begin();
367 MachineFrameInfo *MFI = MF.getFrameInfo();
368 DebugLoc dl = (MBBI != MBB.end()
369 ? MBBI->getDebugLoc()
370 : DebugLoc::getUnknownLoc());
372 int FrameSize = MFI->getStackSize();
374 FrameSize = (FrameSize+3) & ~3;
375 MFI->setStackSize(FrameSize);
379 // So far we only support FP elimination on leaf functions
380 assert(!MFI->hasCalls());
381 adjustRegister(MBB, MBBI, dl, BF::SP, BF::P1, -FrameSize);
385 // emit a LINK instruction
386 if (FrameSize <= 0x3ffff) {
387 BuildMI(MBB, MBBI, dl, TII.get(BF::LINK)).addImm(FrameSize);
391 // Frame is too big, do a manual LINK:
397 BuildMI(MBB, MBBI, dl, TII.get(BF::PUSH))
398 .addReg(BF::RETS, RegState::Kill);
399 BuildMI(MBB, MBBI, dl, TII.get(BF::PUSH))
400 .addReg(BF::FP, RegState::Kill);
401 BuildMI(MBB, MBBI, dl, TII.get(BF::MOVE), BF::FP)
403 loadConstant(MBB, MBBI, dl, BF::P1, -FrameSize);
404 BuildMI(MBB, MBBI, dl, TII.get(BF::ADDpp), BF::SP)
405 .addReg(BF::SP, RegState::Kill)
406 .addReg(BF::P1, RegState::Kill);
410 void BlackfinRegisterInfo::emitEpilogue(MachineFunction &MF,
411 MachineBasicBlock &MBB) const {
412 MachineFrameInfo *MFI = MF.getFrameInfo();
413 MachineBasicBlock::iterator MBBI = prior(MBB.end());
414 DebugLoc dl = MBBI->getDebugLoc();
416 int FrameSize = MFI->getStackSize();
417 assert(FrameSize%4 == 0 && "Misaligned frame size");
420 // So far we only support FP elimination on leaf functions
421 assert(!MFI->hasCalls());
422 adjustRegister(MBB, MBBI, dl, BF::SP, BF::P1, FrameSize);
426 // emit an UNLINK instruction
427 BuildMI(MBB, MBBI, dl, TII.get(BF::UNLINK));
430 unsigned BlackfinRegisterInfo::getRARegister() const {
434 unsigned BlackfinRegisterInfo::getFrameRegister(MachineFunction &MF) const {
435 return hasFP(MF) ? BF::FP : BF::SP;
439 BlackfinRegisterInfo::getFrameIndexOffset(MachineFunction &MF, int FI) const {
440 const TargetFrameInfo &TFI = *MF.getTarget().getFrameInfo();
441 MachineFrameInfo *MFI = MF.getFrameInfo();
442 return MFI->getObjectOffset(FI) + MFI->getStackSize() -
443 TFI.getOffsetOfLocalArea() + MFI->getOffsetAdjustment();
446 unsigned BlackfinRegisterInfo::getEHExceptionRegister() const {
447 llvm_unreachable("What is the exception register");
451 unsigned BlackfinRegisterInfo::getEHHandlerRegister() const {
452 llvm_unreachable("What is the exception handler register");
456 int BlackfinRegisterInfo::getDwarfRegNum(unsigned RegNum, bool isEH) const {
457 llvm_unreachable("What is the dwarf register number");
461 #include "BlackfinGenRegisterInfo.inc"