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;
52 BlackfinRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
54 BitVector Reserved(getNumRegs());
66 Reserved.set(CYCLES).set(CYCLES2);
78 const TargetRegisterClass*
79 BlackfinRegisterInfo::getPhysicalRegisterRegClass(unsigned reg, EVT VT) const {
80 assert(isPhysicalRegister(reg) && "reg must be a physical register");
82 // Pick the smallest register class of the right type that contains
84 const TargetRegisterClass* BestRC = 0;
85 for (regclass_iterator I = regclass_begin(), E = regclass_end();
87 const TargetRegisterClass* RC = *I;
88 if ((VT == MVT::Other || RC->hasType(VT)) && RC->contains(reg) &&
89 (!BestRC || RC->getNumRegs() < BestRC->getNumRegs()))
93 assert(BestRC && "Couldn't find the register class");
97 // hasFP - Return true if the specified function should have a dedicated frame
98 // pointer register. This is true if the function has variable sized allocas or
99 // if frame pointer elimination is disabled.
100 bool BlackfinRegisterInfo::hasFP(const MachineFunction &MF) const {
101 const MachineFrameInfo *MFI = MF.getFrameInfo();
102 return DisableFramePointerElim(MF) ||
103 MFI->adjustsStack() || MFI->hasVarSizedObjects();
106 bool BlackfinRegisterInfo::
107 requiresRegisterScavenging(const MachineFunction &MF) const {
111 // Emit instructions to add delta to D/P register. ScratchReg must be of the
112 // same class as Reg (P).
113 void BlackfinRegisterInfo::adjustRegister(MachineBasicBlock &MBB,
114 MachineBasicBlock::iterator I,
121 if (isInt<7>(delta)) {
122 BuildMI(MBB, I, DL, TII.get(BF::ADDpp_imm7), Reg)
123 .addReg(Reg) // No kill on two-addr operand
128 // We must load delta into ScratchReg and add that.
129 loadConstant(MBB, I, DL, ScratchReg, delta);
130 if (BF::PRegClass.contains(Reg)) {
131 assert(BF::PRegClass.contains(ScratchReg) &&
132 "ScratchReg must be a P register");
133 BuildMI(MBB, I, DL, TII.get(BF::ADDpp), Reg)
134 .addReg(Reg, RegState::Kill)
135 .addReg(ScratchReg, RegState::Kill);
137 assert(BF::DRegClass.contains(Reg) && "Reg must be a D or P register");
138 assert(BF::DRegClass.contains(ScratchReg) &&
139 "ScratchReg must be a D register");
140 BuildMI(MBB, I, DL, TII.get(BF::ADD), Reg)
141 .addReg(Reg, RegState::Kill)
142 .addReg(ScratchReg, RegState::Kill);
146 // Emit instructions to load a constant into D/P register
147 void BlackfinRegisterInfo::loadConstant(MachineBasicBlock &MBB,
148 MachineBasicBlock::iterator I,
152 if (isInt<7>(value)) {
153 BuildMI(MBB, I, DL, TII.get(BF::LOADimm7), Reg).addImm(value);
157 if (isUInt<16>(value)) {
158 BuildMI(MBB, I, DL, TII.get(BF::LOADuimm16), Reg).addImm(value);
162 if (isInt<16>(value)) {
163 BuildMI(MBB, I, DL, TII.get(BF::LOADimm16), Reg).addImm(value);
167 // We must split into halves
169 TII.get(BF::LOAD16i), getSubReg(Reg, BF::hi16))
170 .addImm((value >> 16) & 0xffff)
171 .addReg(Reg, RegState::ImplicitDefine);
173 TII.get(BF::LOAD16i), getSubReg(Reg, BF::lo16))
174 .addImm(value & 0xffff)
175 .addReg(Reg, RegState::ImplicitKill)
176 .addReg(Reg, RegState::ImplicitDefine);
179 void BlackfinRegisterInfo::
180 eliminateCallFramePseudoInstr(MachineFunction &MF,
181 MachineBasicBlock &MBB,
182 MachineBasicBlock::iterator I) const {
183 if (!hasReservedCallFrame(MF)) {
184 int64_t Amount = I->getOperand(0).getImm();
186 assert(Amount%4 == 0 && "Unaligned call frame size");
187 if (I->getOpcode() == BF::ADJCALLSTACKDOWN) {
188 adjustRegister(MBB, I, I->getDebugLoc(), BF::SP, BF::P1, -Amount);
190 assert(I->getOpcode() == BF::ADJCALLSTACKUP &&
191 "Unknown call frame pseudo instruction");
192 adjustRegister(MBB, I, I->getDebugLoc(), BF::SP, BF::P1, Amount);
199 /// findScratchRegister - Find a 'free' register. Try for a call-clobbered
200 /// register first and then a spilled callee-saved register if that fails.
201 static unsigned findScratchRegister(MachineBasicBlock::iterator II,
203 const TargetRegisterClass *RC,
205 assert(RS && "Register scavenging must be on");
206 unsigned Reg = RS->FindUnusedReg(RC);
208 Reg = RS->scavengeRegister(RC, II, SPAdj);
213 BlackfinRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
214 int SPAdj, FrameIndexValue *Value,
215 RegScavenger *RS) const {
216 MachineInstr &MI = *II;
217 MachineBasicBlock &MBB = *MI.getParent();
218 MachineFunction &MF = *MBB.getParent();
219 DebugLoc DL = MI.getDebugLoc();
222 for (FIPos=0; !MI.getOperand(FIPos).isFI(); ++FIPos) {
223 assert(FIPos < MI.getNumOperands() &&
224 "Instr doesn't have FrameIndex operand!");
226 int FrameIndex = MI.getOperand(FIPos).getIndex();
227 assert(FIPos+1 < MI.getNumOperands() && MI.getOperand(FIPos+1).isImm());
228 int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex)
229 + MI.getOperand(FIPos+1).getImm();
230 unsigned BaseReg = BF::FP;
232 assert(SPAdj==0 && "Unexpected SP adjust in function with frame pointer");
235 Offset += MF.getFrameInfo()->getStackSize() + SPAdj;
238 bool isStore = false;
240 switch (MI.getOpcode()) {
244 assert(Offset%4 == 0 && "Unaligned i32 stack access");
245 assert(FIPos==1 && "Bad frame index operand");
246 MI.getOperand(FIPos).ChangeToRegister(BaseReg, false);
247 MI.getOperand(FIPos+1).setImm(Offset);
248 if (isUInt<6>(Offset)) {
249 MI.setDesc(TII.get(isStore
250 ? BF::STORE32p_uimm6m4
251 : BF::LOAD32p_uimm6m4));
254 if (BaseReg == BF::FP && isUInt<7>(-Offset)) {
255 MI.setDesc(TII.get(isStore
256 ? BF::STORE32fp_nimm7m4
257 : BF::LOAD32fp_nimm7m4));
258 MI.getOperand(FIPos+1).setImm(-Offset);
261 if (isInt<18>(Offset)) {
262 MI.setDesc(TII.get(isStore
263 ? BF::STORE32p_imm18m4
264 : BF::LOAD32p_imm18m4));
267 // Use RegScavenger to calculate proper offset...
269 llvm_unreachable("Stack frame offset too big");
273 assert(MI.getOperand(0).isReg() && "ADD instruction needs a register");
274 unsigned DestReg = MI.getOperand(0).getReg();
275 // We need to produce a stack offset in a P register. We emit:
278 assert(FIPos==1 && "Bad frame index operand");
279 loadConstant(MBB, II, DL, DestReg, Offset);
280 MI.getOperand(1).ChangeToRegister(DestReg, false, false, true);
281 MI.getOperand(2).ChangeToRegister(BaseReg, false);
287 assert(Offset%2 == 0 && "Unaligned i16 stack access");
288 assert(FIPos==1 && "Bad frame index operand");
289 // We need a P register to use as an address
290 unsigned ScratchReg = findScratchRegister(II, RS, &BF::PRegClass, SPAdj);
291 assert(ScratchReg && "Could not scavenge register");
292 loadConstant(MBB, II, DL, ScratchReg, Offset);
293 BuildMI(MBB, II, DL, TII.get(BF::ADDpp), ScratchReg)
294 .addReg(ScratchReg, RegState::Kill)
296 MI.setDesc(TII.get(isStore ? BF::STORE16pi : BF::LOAD16pi));
297 MI.getOperand(1).ChangeToRegister(ScratchReg, false, false, true);
302 // This is an AnyCC spill, we need a scratch register.
303 assert(FIPos==1 && "Bad frame index operand");
304 MachineOperand SpillReg = MI.getOperand(0);
305 unsigned ScratchReg = findScratchRegister(II, RS, &BF::DRegClass, SPAdj);
306 assert(ScratchReg && "Could not scavenge register");
307 if (SpillReg.getReg()==BF::NCC) {
308 BuildMI(MBB, II, DL, TII.get(BF::MOVENCC_z), ScratchReg)
309 .addOperand(SpillReg);
310 BuildMI(MBB, II, DL, TII.get(BF::BITTGL), ScratchReg)
311 .addReg(ScratchReg).addImm(0);
313 BuildMI(MBB, II, DL, TII.get(BF::MOVECC_zext), ScratchReg)
314 .addOperand(SpillReg);
317 MI.setDesc(TII.get(BF::STORE8p_imm16));
318 MI.getOperand(0).ChangeToRegister(ScratchReg, false, false, true);
319 MI.getOperand(FIPos).ChangeToRegister(BaseReg, false);
320 MI.getOperand(FIPos+1).setImm(Offset);
324 // This is an restore, we need a scratch register.
325 assert(FIPos==1 && "Bad frame index operand");
326 MachineOperand SpillReg = MI.getOperand(0);
327 unsigned ScratchReg = findScratchRegister(II, RS, &BF::DRegClass, SPAdj);
328 assert(ScratchReg && "Could not scavenge register");
329 MI.setDesc(TII.get(BF::LOAD32p_imm16_8z));
330 MI.getOperand(0).ChangeToRegister(ScratchReg, true);
331 MI.getOperand(FIPos).ChangeToRegister(BaseReg, false);
332 MI.getOperand(FIPos+1).setImm(Offset);
334 if (SpillReg.getReg()==BF::CC) {
336 BuildMI(MBB, II, DL, TII.get(BF::MOVECC_nz), BF::CC)
337 .addReg(ScratchReg, RegState::Kill);
339 // Restore NCC (CC = D==0)
340 BuildMI(MBB, II, DL, TII.get(BF::SETEQri_not), BF::NCC)
341 .addReg(ScratchReg, RegState::Kill)
347 llvm_unreachable("Cannot eliminate frame index");
353 void BlackfinRegisterInfo::
354 processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
355 RegScavenger *RS) const {
356 MachineFrameInfo *MFI = MF.getFrameInfo();
357 const TargetRegisterClass *RC = BF::DPRegisterClass;
358 if (requiresRegisterScavenging(MF)) {
359 // Reserve a slot close to SP or frame pointer.
360 RS->setScavengingFrameIndex(MFI->CreateStackObject(RC->getSize(),
366 void BlackfinRegisterInfo::
367 processFunctionBeforeFrameFinalized(MachineFunction &MF) const {
370 // Emit a prologue that sets up a stack frame.
371 // On function entry, R0-R2 and P0 may hold arguments.
372 // R3, P1, and P2 may be used as scratch registers
373 void BlackfinRegisterInfo::emitPrologue(MachineFunction &MF) const {
374 MachineBasicBlock &MBB = MF.front(); // Prolog goes in entry BB
375 MachineBasicBlock::iterator MBBI = MBB.begin();
376 MachineFrameInfo *MFI = MF.getFrameInfo();
377 DebugLoc dl = MBBI != MBB.end() ? MBBI->getDebugLoc() : DebugLoc();
379 int FrameSize = MFI->getStackSize();
381 FrameSize = (FrameSize+3) & ~3;
382 MFI->setStackSize(FrameSize);
386 assert(!MFI->adjustsStack() &&
387 "FP elimination on a non-leaf function is not supported");
388 adjustRegister(MBB, MBBI, dl, BF::SP, BF::P1, -FrameSize);
392 // emit a LINK instruction
393 if (FrameSize <= 0x3ffff) {
394 BuildMI(MBB, MBBI, dl, TII.get(BF::LINK)).addImm(FrameSize);
398 // Frame is too big, do a manual LINK:
404 BuildMI(MBB, MBBI, dl, TII.get(BF::PUSH))
405 .addReg(BF::RETS, RegState::Kill);
406 BuildMI(MBB, MBBI, dl, TII.get(BF::PUSH))
407 .addReg(BF::FP, RegState::Kill);
408 BuildMI(MBB, MBBI, dl, TII.get(BF::MOVE), BF::FP)
410 loadConstant(MBB, MBBI, dl, BF::P1, -FrameSize);
411 BuildMI(MBB, MBBI, dl, TII.get(BF::ADDpp), BF::SP)
412 .addReg(BF::SP, RegState::Kill)
413 .addReg(BF::P1, RegState::Kill);
417 void BlackfinRegisterInfo::emitEpilogue(MachineFunction &MF,
418 MachineBasicBlock &MBB) const {
419 MachineFrameInfo *MFI = MF.getFrameInfo();
420 MachineBasicBlock::iterator MBBI = prior(MBB.end());
421 DebugLoc dl = MBBI->getDebugLoc();
423 int FrameSize = MFI->getStackSize();
424 assert(FrameSize%4 == 0 && "Misaligned frame size");
427 assert(!MFI->adjustsStack() &&
428 "FP elimination on a non-leaf function is not supported");
429 adjustRegister(MBB, MBBI, dl, BF::SP, BF::P1, FrameSize);
433 // emit an UNLINK instruction
434 BuildMI(MBB, MBBI, dl, TII.get(BF::UNLINK));
437 unsigned BlackfinRegisterInfo::getRARegister() const {
442 BlackfinRegisterInfo::getFrameRegister(const MachineFunction &MF) const {
443 return hasFP(MF) ? BF::FP : BF::SP;
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"