1 //===- MipsSEFrameLowering.cpp - Mips32/64 Frame Information --------------===//
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 Mips32/64 implementation of TargetFrameLowering class.
12 //===----------------------------------------------------------------------===//
14 #include "MipsSEFrameLowering.h"
15 #include "MCTargetDesc/MipsABIInfo.h"
16 #include "MipsMachineFunction.h"
17 #include "MipsRegisterInfo.h"
18 #include "MipsSEInstrInfo.h"
19 #include "MipsSubtarget.h"
20 #include "llvm/ADT/BitVector.h"
21 #include "llvm/ADT/StringRef.h"
22 #include "llvm/ADT/StringSwitch.h"
23 #include "llvm/CodeGen/MachineBasicBlock.h"
24 #include "llvm/CodeGen/MachineFrameInfo.h"
25 #include "llvm/CodeGen/MachineFunction.h"
26 #include "llvm/CodeGen/MachineInstr.h"
27 #include "llvm/CodeGen/MachineInstrBuilder.h"
28 #include "llvm/CodeGen/MachineModuleInfo.h"
29 #include "llvm/CodeGen/MachineOperand.h"
30 #include "llvm/CodeGen/MachineRegisterInfo.h"
31 #include "llvm/CodeGen/RegisterScavenging.h"
32 #include "llvm/CodeGen/TargetInstrInfo.h"
33 #include "llvm/CodeGen/TargetRegisterInfo.h"
34 #include "llvm/CodeGen/TargetSubtargetInfo.h"
35 #include "llvm/IR/DebugLoc.h"
36 #include "llvm/IR/Function.h"
37 #include "llvm/MC/MCDwarf.h"
38 #include "llvm/MC/MCRegisterInfo.h"
39 #include "llvm/MC/MachineLocation.h"
40 #include "llvm/Support/CodeGen.h"
41 #include "llvm/Support/ErrorHandling.h"
42 #include "llvm/Support/MathExtras.h"
50 static std::pair
<unsigned, unsigned> getMFHiLoOpc(unsigned Src
) {
51 if (Mips::ACC64RegClass
.contains(Src
))
52 return std::make_pair((unsigned)Mips::PseudoMFHI
,
53 (unsigned)Mips::PseudoMFLO
);
55 if (Mips::ACC64DSPRegClass
.contains(Src
))
56 return std::make_pair((unsigned)Mips::MFHI_DSP
, (unsigned)Mips::MFLO_DSP
);
58 if (Mips::ACC128RegClass
.contains(Src
))
59 return std::make_pair((unsigned)Mips::PseudoMFHI64
,
60 (unsigned)Mips::PseudoMFLO64
);
62 return std::make_pair(0, 0);
67 /// Helper class to expand pseudos.
70 ExpandPseudo(MachineFunction
&MF
);
74 using Iter
= MachineBasicBlock::iterator
;
76 bool expandInstr(MachineBasicBlock
&MBB
, Iter I
);
77 void expandLoadCCond(MachineBasicBlock
&MBB
, Iter I
);
78 void expandStoreCCond(MachineBasicBlock
&MBB
, Iter I
);
79 void expandLoadACC(MachineBasicBlock
&MBB
, Iter I
, unsigned RegSize
);
80 void expandStoreACC(MachineBasicBlock
&MBB
, Iter I
, unsigned MFHiOpc
,
81 unsigned MFLoOpc
, unsigned RegSize
);
82 bool expandCopy(MachineBasicBlock
&MBB
, Iter I
);
83 bool expandCopyACC(MachineBasicBlock
&MBB
, Iter I
, unsigned MFHiOpc
,
85 bool expandBuildPairF64(MachineBasicBlock
&MBB
,
86 MachineBasicBlock::iterator I
, bool FP64
) const;
87 bool expandExtractElementF64(MachineBasicBlock
&MBB
,
88 MachineBasicBlock::iterator I
, bool FP64
) const;
91 MachineRegisterInfo
&MRI
;
92 const MipsSubtarget
&Subtarget
;
93 const MipsSEInstrInfo
&TII
;
94 const MipsRegisterInfo
&RegInfo
;
97 } // end anonymous namespace
99 ExpandPseudo::ExpandPseudo(MachineFunction
&MF_
)
100 : MF(MF_
), MRI(MF
.getRegInfo()),
101 Subtarget(static_cast<const MipsSubtarget
&>(MF
.getSubtarget())),
102 TII(*static_cast<const MipsSEInstrInfo
*>(Subtarget
.getInstrInfo())),
103 RegInfo(*Subtarget
.getRegisterInfo()) {}
105 bool ExpandPseudo::expand() {
106 bool Expanded
= false;
108 for (auto &MBB
: MF
) {
109 for (Iter I
= MBB
.begin(), End
= MBB
.end(); I
!= End
;)
110 Expanded
|= expandInstr(MBB
, I
++);
116 bool ExpandPseudo::expandInstr(MachineBasicBlock
&MBB
, Iter I
) {
117 switch(I
->getOpcode()) {
118 case Mips::LOAD_CCOND_DSP
:
119 expandLoadCCond(MBB
, I
);
121 case Mips::STORE_CCOND_DSP
:
122 expandStoreCCond(MBB
, I
);
124 case Mips::LOAD_ACC64
:
125 case Mips::LOAD_ACC64DSP
:
126 expandLoadACC(MBB
, I
, 4);
128 case Mips::LOAD_ACC128
:
129 expandLoadACC(MBB
, I
, 8);
131 case Mips::STORE_ACC64
:
132 expandStoreACC(MBB
, I
, Mips::PseudoMFHI
, Mips::PseudoMFLO
, 4);
134 case Mips::STORE_ACC64DSP
:
135 expandStoreACC(MBB
, I
, Mips::MFHI_DSP
, Mips::MFLO_DSP
, 4);
137 case Mips::STORE_ACC128
:
138 expandStoreACC(MBB
, I
, Mips::PseudoMFHI64
, Mips::PseudoMFLO64
, 8);
140 case Mips::BuildPairF64
:
141 if (expandBuildPairF64(MBB
, I
, false))
144 case Mips::BuildPairF64_64
:
145 if (expandBuildPairF64(MBB
, I
, true))
148 case Mips::ExtractElementF64
:
149 if (expandExtractElementF64(MBB
, I
, false))
152 case Mips::ExtractElementF64_64
:
153 if (expandExtractElementF64(MBB
, I
, true))
156 case TargetOpcode::COPY
:
157 if (!expandCopy(MBB
, I
))
168 void ExpandPseudo::expandLoadCCond(MachineBasicBlock
&MBB
, Iter I
) {
172 assert(I
->getOperand(0).isReg() && I
->getOperand(1).isFI());
174 const TargetRegisterClass
*RC
= RegInfo
.intRegClass(4);
175 unsigned VR
= MRI
.createVirtualRegister(RC
);
176 unsigned Dst
= I
->getOperand(0).getReg(), FI
= I
->getOperand(1).getIndex();
178 TII
.loadRegFromStack(MBB
, I
, VR
, FI
, RC
, &RegInfo
, 0);
179 BuildMI(MBB
, I
, I
->getDebugLoc(), TII
.get(TargetOpcode::COPY
), Dst
)
180 .addReg(VR
, RegState::Kill
);
183 void ExpandPseudo::expandStoreCCond(MachineBasicBlock
&MBB
, Iter I
) {
187 assert(I
->getOperand(0).isReg() && I
->getOperand(1).isFI());
189 const TargetRegisterClass
*RC
= RegInfo
.intRegClass(4);
190 unsigned VR
= MRI
.createVirtualRegister(RC
);
191 unsigned Src
= I
->getOperand(0).getReg(), FI
= I
->getOperand(1).getIndex();
193 BuildMI(MBB
, I
, I
->getDebugLoc(), TII
.get(TargetOpcode::COPY
), VR
)
194 .addReg(Src
, getKillRegState(I
->getOperand(0).isKill()));
195 TII
.storeRegToStack(MBB
, I
, VR
, true, FI
, RC
, &RegInfo
, 0);
198 void ExpandPseudo::expandLoadACC(MachineBasicBlock
&MBB
, Iter I
,
205 assert(I
->getOperand(0).isReg() && I
->getOperand(1).isFI());
207 const TargetRegisterClass
*RC
= RegInfo
.intRegClass(RegSize
);
208 unsigned VR0
= MRI
.createVirtualRegister(RC
);
209 unsigned VR1
= MRI
.createVirtualRegister(RC
);
210 unsigned Dst
= I
->getOperand(0).getReg(), FI
= I
->getOperand(1).getIndex();
211 unsigned Lo
= RegInfo
.getSubReg(Dst
, Mips::sub_lo
);
212 unsigned Hi
= RegInfo
.getSubReg(Dst
, Mips::sub_hi
);
213 DebugLoc DL
= I
->getDebugLoc();
214 const MCInstrDesc
&Desc
= TII
.get(TargetOpcode::COPY
);
216 TII
.loadRegFromStack(MBB
, I
, VR0
, FI
, RC
, &RegInfo
, 0);
217 BuildMI(MBB
, I
, DL
, Desc
, Lo
).addReg(VR0
, RegState::Kill
);
218 TII
.loadRegFromStack(MBB
, I
, VR1
, FI
, RC
, &RegInfo
, RegSize
);
219 BuildMI(MBB
, I
, DL
, Desc
, Hi
).addReg(VR1
, RegState::Kill
);
222 void ExpandPseudo::expandStoreACC(MachineBasicBlock
&MBB
, Iter I
,
223 unsigned MFHiOpc
, unsigned MFLoOpc
,
228 // store $vr1, FI + 4
230 assert(I
->getOperand(0).isReg() && I
->getOperand(1).isFI());
232 const TargetRegisterClass
*RC
= RegInfo
.intRegClass(RegSize
);
233 unsigned VR0
= MRI
.createVirtualRegister(RC
);
234 unsigned VR1
= MRI
.createVirtualRegister(RC
);
235 unsigned Src
= I
->getOperand(0).getReg(), FI
= I
->getOperand(1).getIndex();
236 unsigned SrcKill
= getKillRegState(I
->getOperand(0).isKill());
237 DebugLoc DL
= I
->getDebugLoc();
239 BuildMI(MBB
, I
, DL
, TII
.get(MFLoOpc
), VR0
).addReg(Src
);
240 TII
.storeRegToStack(MBB
, I
, VR0
, true, FI
, RC
, &RegInfo
, 0);
241 BuildMI(MBB
, I
, DL
, TII
.get(MFHiOpc
), VR1
).addReg(Src
, SrcKill
);
242 TII
.storeRegToStack(MBB
, I
, VR1
, true, FI
, RC
, &RegInfo
, RegSize
);
245 bool ExpandPseudo::expandCopy(MachineBasicBlock
&MBB
, Iter I
) {
246 unsigned Src
= I
->getOperand(1).getReg();
247 std::pair
<unsigned, unsigned> Opcodes
= getMFHiLoOpc(Src
);
252 return expandCopyACC(MBB
, I
, Opcodes
.first
, Opcodes
.second
);
255 bool ExpandPseudo::expandCopyACC(MachineBasicBlock
&MBB
, Iter I
,
256 unsigned MFHiOpc
, unsigned MFLoOpc
) {
262 unsigned Dst
= I
->getOperand(0).getReg(), Src
= I
->getOperand(1).getReg();
263 const TargetRegisterClass
*DstRC
= RegInfo
.getMinimalPhysRegClass(Dst
);
264 unsigned VRegSize
= RegInfo
.getRegSizeInBits(*DstRC
) / 16;
265 const TargetRegisterClass
*RC
= RegInfo
.intRegClass(VRegSize
);
266 unsigned VR0
= MRI
.createVirtualRegister(RC
);
267 unsigned VR1
= MRI
.createVirtualRegister(RC
);
268 unsigned SrcKill
= getKillRegState(I
->getOperand(1).isKill());
269 unsigned DstLo
= RegInfo
.getSubReg(Dst
, Mips::sub_lo
);
270 unsigned DstHi
= RegInfo
.getSubReg(Dst
, Mips::sub_hi
);
271 DebugLoc DL
= I
->getDebugLoc();
273 BuildMI(MBB
, I
, DL
, TII
.get(MFLoOpc
), VR0
).addReg(Src
);
274 BuildMI(MBB
, I
, DL
, TII
.get(TargetOpcode::COPY
), DstLo
)
275 .addReg(VR0
, RegState::Kill
);
276 BuildMI(MBB
, I
, DL
, TII
.get(MFHiOpc
), VR1
).addReg(Src
, SrcKill
);
277 BuildMI(MBB
, I
, DL
, TII
.get(TargetOpcode::COPY
), DstHi
)
278 .addReg(VR1
, RegState::Kill
);
282 /// This method expands the same instruction that MipsSEInstrInfo::
283 /// expandBuildPairF64 does, for the case when ABI is fpxx and mthc1 is not
284 /// available and the case where the ABI is FP64A. It is implemented here
285 /// because frame indexes are eliminated before MipsSEInstrInfo::
286 /// expandBuildPairF64 is called.
287 bool ExpandPseudo::expandBuildPairF64(MachineBasicBlock
&MBB
,
288 MachineBasicBlock::iterator I
,
290 // For fpxx and when mthc1 is not available, use:
291 // spill + reload via ldc1
293 // The case where dmtc1 is available doesn't need to be handled here
294 // because it never creates a BuildPairF64 node.
296 // The FP64A ABI (fp64 with nooddspreg) must also use a spill/reload sequence
297 // for odd-numbered double precision values (because the lower 32-bits is
298 // transferred with mtc1 which is redirected to the upper half of the even
299 // register). Unfortunately, we have to make this decision before register
300 // allocation so for now we use a spill/reload sequence for all
301 // double-precision values in regardless of being an odd/even register.
303 // For the cases that should be covered here MipsSEISelDAGToDAG adds $sp as
304 // implicit operand, so other passes (like ShrinkWrapping) are aware that
306 if (I
->getNumOperands() == 4 && I
->getOperand(3).isReg()
307 && I
->getOperand(3).getReg() == Mips::SP
) {
308 unsigned DstReg
= I
->getOperand(0).getReg();
309 unsigned LoReg
= I
->getOperand(1).getReg();
310 unsigned HiReg
= I
->getOperand(2).getReg();
312 // It should be impossible to have FGR64 on MIPS-II or MIPS32r1 (which are
313 // the cases where mthc1 is not available). 64-bit architectures and
314 // MIPS32r2 or later can use FGR64 though.
315 assert(Subtarget
.isGP64bit() || Subtarget
.hasMTHC1() ||
316 !Subtarget
.isFP64bit());
318 const TargetRegisterClass
*RC
= &Mips::GPR32RegClass
;
319 const TargetRegisterClass
*RC2
=
320 FP64
? &Mips::FGR64RegClass
: &Mips::AFGR64RegClass
;
322 // We re-use the same spill slot each time so that the stack frame doesn't
323 // grow too much in functions with a large number of moves.
324 int FI
= MF
.getInfo
<MipsFunctionInfo
>()->getMoveF64ViaSpillFI(RC2
);
325 if (!Subtarget
.isLittle())
326 std::swap(LoReg
, HiReg
);
327 TII
.storeRegToStack(MBB
, I
, LoReg
, I
->getOperand(1).isKill(), FI
, RC
,
329 TII
.storeRegToStack(MBB
, I
, HiReg
, I
->getOperand(2).isKill(), FI
, RC
,
331 TII
.loadRegFromStack(MBB
, I
, DstReg
, FI
, RC2
, &RegInfo
, 0);
338 /// This method expands the same instruction that MipsSEInstrInfo::
339 /// expandExtractElementF64 does, for the case when ABI is fpxx and mfhc1 is not
340 /// available and the case where the ABI is FP64A. It is implemented here
341 /// because frame indexes are eliminated before MipsSEInstrInfo::
342 /// expandExtractElementF64 is called.
343 bool ExpandPseudo::expandExtractElementF64(MachineBasicBlock
&MBB
,
344 MachineBasicBlock::iterator I
,
346 const MachineOperand
&Op1
= I
->getOperand(1);
347 const MachineOperand
&Op2
= I
->getOperand(2);
349 if ((Op1
.isReg() && Op1
.isUndef()) || (Op2
.isReg() && Op2
.isUndef())) {
350 unsigned DstReg
= I
->getOperand(0).getReg();
351 BuildMI(MBB
, I
, I
->getDebugLoc(), TII
.get(Mips::IMPLICIT_DEF
), DstReg
);
355 // For fpxx and when mfhc1 is not available, use:
356 // spill + reload via ldc1
358 // The case where dmfc1 is available doesn't need to be handled here
359 // because it never creates a ExtractElementF64 node.
361 // The FP64A ABI (fp64 with nooddspreg) must also use a spill/reload sequence
362 // for odd-numbered double precision values (because the lower 32-bits is
363 // transferred with mfc1 which is redirected to the upper half of the even
364 // register). Unfortunately, we have to make this decision before register
365 // allocation so for now we use a spill/reload sequence for all
366 // double-precision values in regardless of being an odd/even register.
368 // For the cases that should be covered here MipsSEISelDAGToDAG adds $sp as
369 // implicit operand, so other passes (like ShrinkWrapping) are aware that
371 if (I
->getNumOperands() == 4 && I
->getOperand(3).isReg()
372 && I
->getOperand(3).getReg() == Mips::SP
) {
373 unsigned DstReg
= I
->getOperand(0).getReg();
374 unsigned SrcReg
= Op1
.getReg();
375 unsigned N
= Op2
.getImm();
376 int64_t Offset
= 4 * (Subtarget
.isLittle() ? N
: (1 - N
));
378 // It should be impossible to have FGR64 on MIPS-II or MIPS32r1 (which are
379 // the cases where mfhc1 is not available). 64-bit architectures and
380 // MIPS32r2 or later can use FGR64 though.
381 assert(Subtarget
.isGP64bit() || Subtarget
.hasMTHC1() ||
382 !Subtarget
.isFP64bit());
384 const TargetRegisterClass
*RC
=
385 FP64
? &Mips::FGR64RegClass
: &Mips::AFGR64RegClass
;
386 const TargetRegisterClass
*RC2
= &Mips::GPR32RegClass
;
388 // We re-use the same spill slot each time so that the stack frame doesn't
389 // grow too much in functions with a large number of moves.
390 int FI
= MF
.getInfo
<MipsFunctionInfo
>()->getMoveF64ViaSpillFI(RC
);
391 TII
.storeRegToStack(MBB
, I
, SrcReg
, Op1
.isKill(), FI
, RC
, &RegInfo
, 0);
392 TII
.loadRegFromStack(MBB
, I
, DstReg
, FI
, RC2
, &RegInfo
, Offset
);
399 MipsSEFrameLowering::MipsSEFrameLowering(const MipsSubtarget
&STI
)
400 : MipsFrameLowering(STI
, STI
.getStackAlignment()) {}
402 void MipsSEFrameLowering::emitPrologue(MachineFunction
&MF
,
403 MachineBasicBlock
&MBB
) const {
404 MachineFrameInfo
&MFI
= MF
.getFrameInfo();
405 MipsFunctionInfo
*MipsFI
= MF
.getInfo
<MipsFunctionInfo
>();
407 const MipsSEInstrInfo
&TII
=
408 *static_cast<const MipsSEInstrInfo
*>(STI
.getInstrInfo());
409 const MipsRegisterInfo
&RegInfo
=
410 *static_cast<const MipsRegisterInfo
*>(STI
.getRegisterInfo());
412 MachineBasicBlock::iterator MBBI
= MBB
.begin();
414 MipsABIInfo ABI
= STI
.getABI();
415 unsigned SP
= ABI
.GetStackPtr();
416 unsigned FP
= ABI
.GetFramePtr();
417 unsigned ZERO
= ABI
.GetNullPtr();
418 unsigned MOVE
= ABI
.GetGPRMoveOp();
419 unsigned ADDiu
= ABI
.GetPtrAddiuOp();
420 unsigned AND
= ABI
.IsN64() ? Mips::AND64
: Mips::AND
;
422 const TargetRegisterClass
*RC
= ABI
.ArePtrs64bit() ?
423 &Mips::GPR64RegClass
: &Mips::GPR32RegClass
;
425 // First, compute final stack size.
426 uint64_t StackSize
= MFI
.getStackSize();
428 // No need to allocate space on the stack.
429 if (StackSize
== 0 && !MFI
.adjustsStack()) return;
431 MachineModuleInfo
&MMI
= MF
.getMMI();
432 const MCRegisterInfo
*MRI
= MMI
.getContext().getRegisterInfo();
435 TII
.adjustStackPtr(SP
, -StackSize
, MBB
, MBBI
);
437 // emit ".cfi_def_cfa_offset StackSize"
438 unsigned CFIIndex
= MF
.addFrameInst(
439 MCCFIInstruction::createDefCfaOffset(nullptr, -StackSize
));
440 BuildMI(MBB
, MBBI
, dl
, TII
.get(TargetOpcode::CFI_INSTRUCTION
))
441 .addCFIIndex(CFIIndex
);
443 if (MF
.getFunction().hasFnAttribute("interrupt"))
444 emitInterruptPrologueStub(MF
, MBB
);
446 const std::vector
<CalleeSavedInfo
> &CSI
= MFI
.getCalleeSavedInfo();
449 // Find the instruction past the last instruction that saves a callee-saved
450 // register to the stack.
451 for (unsigned i
= 0; i
< CSI
.size(); ++i
)
454 // Iterate over list of callee-saved registers and emit .cfi_offset
456 for (std::vector
<CalleeSavedInfo
>::const_iterator I
= CSI
.begin(),
457 E
= CSI
.end(); I
!= E
; ++I
) {
458 int64_t Offset
= MFI
.getObjectOffset(I
->getFrameIdx());
459 unsigned Reg
= I
->getReg();
461 // If Reg is a double precision register, emit two cfa_offsets,
462 // one for each of the paired single precision registers.
463 if (Mips::AFGR64RegClass
.contains(Reg
)) {
465 MRI
->getDwarfRegNum(RegInfo
.getSubReg(Reg
, Mips::sub_lo
), true);
467 MRI
->getDwarfRegNum(RegInfo
.getSubReg(Reg
, Mips::sub_hi
), true);
470 std::swap(Reg0
, Reg1
);
472 unsigned CFIIndex
= MF
.addFrameInst(
473 MCCFIInstruction::createOffset(nullptr, Reg0
, Offset
));
474 BuildMI(MBB
, MBBI
, dl
, TII
.get(TargetOpcode::CFI_INSTRUCTION
))
475 .addCFIIndex(CFIIndex
);
477 CFIIndex
= MF
.addFrameInst(
478 MCCFIInstruction::createOffset(nullptr, Reg1
, Offset
+ 4));
479 BuildMI(MBB
, MBBI
, dl
, TII
.get(TargetOpcode::CFI_INSTRUCTION
))
480 .addCFIIndex(CFIIndex
);
481 } else if (Mips::FGR64RegClass
.contains(Reg
)) {
482 unsigned Reg0
= MRI
->getDwarfRegNum(Reg
, true);
483 unsigned Reg1
= MRI
->getDwarfRegNum(Reg
, true) + 1;
486 std::swap(Reg0
, Reg1
);
488 unsigned CFIIndex
= MF
.addFrameInst(
489 MCCFIInstruction::createOffset(nullptr, Reg0
, Offset
));
490 BuildMI(MBB
, MBBI
, dl
, TII
.get(TargetOpcode::CFI_INSTRUCTION
))
491 .addCFIIndex(CFIIndex
);
493 CFIIndex
= MF
.addFrameInst(
494 MCCFIInstruction::createOffset(nullptr, Reg1
, Offset
+ 4));
495 BuildMI(MBB
, MBBI
, dl
, TII
.get(TargetOpcode::CFI_INSTRUCTION
))
496 .addCFIIndex(CFIIndex
);
498 // Reg is either in GPR32 or FGR32.
499 unsigned CFIIndex
= MF
.addFrameInst(MCCFIInstruction::createOffset(
500 nullptr, MRI
->getDwarfRegNum(Reg
, true), Offset
));
501 BuildMI(MBB
, MBBI
, dl
, TII
.get(TargetOpcode::CFI_INSTRUCTION
))
502 .addCFIIndex(CFIIndex
);
507 if (MipsFI
->callsEhReturn()) {
508 // Insert instructions that spill eh data registers.
509 for (int I
= 0; I
< 4; ++I
) {
510 if (!MBB
.isLiveIn(ABI
.GetEhDataReg(I
)))
511 MBB
.addLiveIn(ABI
.GetEhDataReg(I
));
512 TII
.storeRegToStackSlot(MBB
, MBBI
, ABI
.GetEhDataReg(I
), false,
513 MipsFI
->getEhDataRegFI(I
), RC
, &RegInfo
);
516 // Emit .cfi_offset directives for eh data registers.
517 for (int I
= 0; I
< 4; ++I
) {
518 int64_t Offset
= MFI
.getObjectOffset(MipsFI
->getEhDataRegFI(I
));
519 unsigned Reg
= MRI
->getDwarfRegNum(ABI
.GetEhDataReg(I
), true);
520 unsigned CFIIndex
= MF
.addFrameInst(
521 MCCFIInstruction::createOffset(nullptr, Reg
, Offset
));
522 BuildMI(MBB
, MBBI
, dl
, TII
.get(TargetOpcode::CFI_INSTRUCTION
))
523 .addCFIIndex(CFIIndex
);
527 // if framepointer enabled, set it to point to the stack pointer.
529 // Insert instruction "move $fp, $sp" at this location.
530 BuildMI(MBB
, MBBI
, dl
, TII
.get(MOVE
), FP
).addReg(SP
).addReg(ZERO
)
531 .setMIFlag(MachineInstr::FrameSetup
);
533 // emit ".cfi_def_cfa_register $fp"
534 unsigned CFIIndex
= MF
.addFrameInst(MCCFIInstruction::createDefCfaRegister(
535 nullptr, MRI
->getDwarfRegNum(FP
, true)));
536 BuildMI(MBB
, MBBI
, dl
, TII
.get(TargetOpcode::CFI_INSTRUCTION
))
537 .addCFIIndex(CFIIndex
);
539 if (RegInfo
.needsStackRealignment(MF
)) {
540 // addiu $Reg, $zero, -MaxAlignment
541 // andi $sp, $sp, $Reg
542 unsigned VR
= MF
.getRegInfo().createVirtualRegister(RC
);
543 assert(isInt
<16>(MFI
.getMaxAlignment()) &&
544 "Function's alignment size requirement is not supported.");
545 int MaxAlign
= -(int)MFI
.getMaxAlignment();
547 BuildMI(MBB
, MBBI
, dl
, TII
.get(ADDiu
), VR
).addReg(ZERO
) .addImm(MaxAlign
);
548 BuildMI(MBB
, MBBI
, dl
, TII
.get(AND
), SP
).addReg(SP
).addReg(VR
);
552 unsigned BP
= STI
.isABI_N64() ? Mips::S7_64
: Mips::S7
;
553 BuildMI(MBB
, MBBI
, dl
, TII
.get(MOVE
), BP
)
561 void MipsSEFrameLowering::emitInterruptPrologueStub(
562 MachineFunction
&MF
, MachineBasicBlock
&MBB
) const {
563 MipsFunctionInfo
*MipsFI
= MF
.getInfo
<MipsFunctionInfo
>();
564 MachineBasicBlock::iterator MBBI
= MBB
.begin();
565 DebugLoc DL
= MBBI
!= MBB
.end() ? MBBI
->getDebugLoc() : DebugLoc();
567 // Report an error the target doesn't support Mips32r2 or later.
568 // The epilogue relies on the use of the "ehb" to clear execution
569 // hazards. Pre R2 Mips relies on an implementation defined number
570 // of "ssnop"s to clear the execution hazard. Support for ssnop hazard
571 // clearing is not provided so reject that configuration.
572 if (!STI
.hasMips32r2())
574 "\"interrupt\" attribute is not supported on pre-MIPS32R2 or "
577 // The GP register contains the "user" value, so we cannot perform
578 // any gp relative loads until we restore the "kernel" or "system" gp
579 // value. Until support is written we shall only accept the static
581 if ((STI
.getRelocationModel() != Reloc::Static
))
582 report_fatal_error("\"interrupt\" attribute is only supported for the "
583 "static relocation model on MIPS at the present time.");
585 if (!STI
.isABI_O32() || STI
.hasMips64())
586 report_fatal_error("\"interrupt\" attribute is only supported for the "
587 "O32 ABI on MIPS32R2+ at the present time.");
589 // Perform ISR handling like GCC
591 MF
.getFunction().getFnAttribute("interrupt").getValueAsString();
592 const TargetRegisterClass
*PtrRC
= &Mips::GPR32RegClass
;
594 // EIC interrupt handling needs to read the Cause register to disable
596 if (IntKind
== "eic") {
597 // Coprocessor registers are always live per se.
598 MBB
.addLiveIn(Mips::COP013
);
599 BuildMI(MBB
, MBBI
, DL
, STI
.getInstrInfo()->get(Mips::MFC0
), Mips::K0
)
600 .addReg(Mips::COP013
)
602 .setMIFlag(MachineInstr::FrameSetup
);
604 BuildMI(MBB
, MBBI
, DL
, STI
.getInstrInfo()->get(Mips::EXT
), Mips::K0
)
608 .setMIFlag(MachineInstr::FrameSetup
);
611 // Fetch and spill EPC
612 MBB
.addLiveIn(Mips::COP014
);
613 BuildMI(MBB
, MBBI
, DL
, STI
.getInstrInfo()->get(Mips::MFC0
), Mips::K1
)
614 .addReg(Mips::COP014
)
616 .setMIFlag(MachineInstr::FrameSetup
);
618 STI
.getInstrInfo()->storeRegToStack(MBB
, MBBI
, Mips::K1
, false,
619 MipsFI
->getISRRegFI(0), PtrRC
,
620 STI
.getRegisterInfo(), 0);
622 // Fetch and Spill Status
623 MBB
.addLiveIn(Mips::COP012
);
624 BuildMI(MBB
, MBBI
, DL
, STI
.getInstrInfo()->get(Mips::MFC0
), Mips::K1
)
625 .addReg(Mips::COP012
)
627 .setMIFlag(MachineInstr::FrameSetup
);
629 STI
.getInstrInfo()->storeRegToStack(MBB
, MBBI
, Mips::K1
, false,
630 MipsFI
->getISRRegFI(1), PtrRC
,
631 STI
.getRegisterInfo(), 0);
633 // Build the configuration for disabling lower priority interrupts. Non EIC
634 // interrupts need to be masked off with zero, EIC from the Cause register.
635 unsigned InsPosition
= 8;
636 unsigned InsSize
= 0;
637 unsigned SrcReg
= Mips::ZERO
;
639 // If the interrupt we're tied to is the EIC, switch the source for the
640 // masking off interrupts to the cause register.
641 if (IntKind
== "eic") {
646 InsSize
= StringSwitch
<unsigned>(IntKind
)
656 assert(InsSize
!= 0 && "Unknown interrupt type!");
658 BuildMI(MBB
, MBBI
, DL
, STI
.getInstrInfo()->get(Mips::INS
), Mips::K1
)
663 .setMIFlag(MachineInstr::FrameSetup
);
665 // Mask off KSU, ERL, EXL
666 BuildMI(MBB
, MBBI
, DL
, STI
.getInstrInfo()->get(Mips::INS
), Mips::K1
)
671 .setMIFlag(MachineInstr::FrameSetup
);
673 // Disable the FPU as we are not spilling those register sets.
674 if (!STI
.useSoftFloat())
675 BuildMI(MBB
, MBBI
, DL
, STI
.getInstrInfo()->get(Mips::INS
), Mips::K1
)
680 .setMIFlag(MachineInstr::FrameSetup
);
682 // Set the new status
683 BuildMI(MBB
, MBBI
, DL
, STI
.getInstrInfo()->get(Mips::MTC0
), Mips::COP012
)
686 .setMIFlag(MachineInstr::FrameSetup
);
689 void MipsSEFrameLowering::emitEpilogue(MachineFunction
&MF
,
690 MachineBasicBlock
&MBB
) const {
691 MachineBasicBlock::iterator MBBI
= MBB
.getFirstTerminator();
692 MachineFrameInfo
&MFI
= MF
.getFrameInfo();
693 MipsFunctionInfo
*MipsFI
= MF
.getInfo
<MipsFunctionInfo
>();
695 const MipsSEInstrInfo
&TII
=
696 *static_cast<const MipsSEInstrInfo
*>(STI
.getInstrInfo());
697 const MipsRegisterInfo
&RegInfo
=
698 *static_cast<const MipsRegisterInfo
*>(STI
.getRegisterInfo());
700 DebugLoc DL
= MBBI
!= MBB
.end() ? MBBI
->getDebugLoc() : DebugLoc();
701 MipsABIInfo ABI
= STI
.getABI();
702 unsigned SP
= ABI
.GetStackPtr();
703 unsigned FP
= ABI
.GetFramePtr();
704 unsigned ZERO
= ABI
.GetNullPtr();
705 unsigned MOVE
= ABI
.GetGPRMoveOp();
707 // if framepointer enabled, restore the stack pointer.
709 // Find the first instruction that restores a callee-saved register.
710 MachineBasicBlock::iterator I
= MBBI
;
712 for (unsigned i
= 0; i
< MFI
.getCalleeSavedInfo().size(); ++i
)
715 // Insert instruction "move $sp, $fp" at this location.
716 BuildMI(MBB
, I
, DL
, TII
.get(MOVE
), SP
).addReg(FP
).addReg(ZERO
);
719 if (MipsFI
->callsEhReturn()) {
720 const TargetRegisterClass
*RC
=
721 ABI
.ArePtrs64bit() ? &Mips::GPR64RegClass
: &Mips::GPR32RegClass
;
723 // Find first instruction that restores a callee-saved register.
724 MachineBasicBlock::iterator I
= MBBI
;
725 for (unsigned i
= 0; i
< MFI
.getCalleeSavedInfo().size(); ++i
)
728 // Insert instructions that restore eh data registers.
729 for (int J
= 0; J
< 4; ++J
) {
730 TII
.loadRegFromStackSlot(MBB
, I
, ABI
.GetEhDataReg(J
),
731 MipsFI
->getEhDataRegFI(J
), RC
, &RegInfo
);
735 if (MF
.getFunction().hasFnAttribute("interrupt"))
736 emitInterruptEpilogueStub(MF
, MBB
);
738 // Get the number of bytes from FrameInfo
739 uint64_t StackSize
= MFI
.getStackSize();
745 TII
.adjustStackPtr(SP
, StackSize
, MBB
, MBBI
);
748 void MipsSEFrameLowering::emitInterruptEpilogueStub(
749 MachineFunction
&MF
, MachineBasicBlock
&MBB
) const {
750 MachineBasicBlock::iterator MBBI
= MBB
.getLastNonDebugInstr();
751 MipsFunctionInfo
*MipsFI
= MF
.getInfo
<MipsFunctionInfo
>();
752 DebugLoc DL
= MBBI
!= MBB
.end() ? MBBI
->getDebugLoc() : DebugLoc();
754 // Perform ISR handling like GCC
755 const TargetRegisterClass
*PtrRC
= &Mips::GPR32RegClass
;
757 // Disable Interrupts.
758 BuildMI(MBB
, MBBI
, DL
, STI
.getInstrInfo()->get(Mips::DI
), Mips::ZERO
);
759 BuildMI(MBB
, MBBI
, DL
, STI
.getInstrInfo()->get(Mips::EHB
));
762 STI
.getInstrInfo()->loadRegFromStackSlot(MBB
, MBBI
, Mips::K1
,
763 MipsFI
->getISRRegFI(0), PtrRC
,
764 STI
.getRegisterInfo());
765 BuildMI(MBB
, MBBI
, DL
, STI
.getInstrInfo()->get(Mips::MTC0
), Mips::COP014
)
770 STI
.getInstrInfo()->loadRegFromStackSlot(MBB
, MBBI
, Mips::K1
,
771 MipsFI
->getISRRegFI(1), PtrRC
,
772 STI
.getRegisterInfo());
773 BuildMI(MBB
, MBBI
, DL
, STI
.getInstrInfo()->get(Mips::MTC0
), Mips::COP012
)
778 int MipsSEFrameLowering::getFrameIndexReference(const MachineFunction
&MF
,
780 unsigned &FrameReg
) const {
781 const MachineFrameInfo
&MFI
= MF
.getFrameInfo();
782 MipsABIInfo ABI
= STI
.getABI();
784 if (MFI
.isFixedObjectIndex(FI
))
785 FrameReg
= hasFP(MF
) ? ABI
.GetFramePtr() : ABI
.GetStackPtr();
787 FrameReg
= hasBP(MF
) ? ABI
.GetBasePtr() : ABI
.GetStackPtr();
789 return MFI
.getObjectOffset(FI
) + MFI
.getStackSize() -
790 getOffsetOfLocalArea() + MFI
.getOffsetAdjustment();
793 bool MipsSEFrameLowering::
794 spillCalleeSavedRegisters(MachineBasicBlock
&MBB
,
795 MachineBasicBlock::iterator MI
,
796 const std::vector
<CalleeSavedInfo
> &CSI
,
797 const TargetRegisterInfo
*TRI
) const {
798 MachineFunction
*MF
= MBB
.getParent();
799 const TargetInstrInfo
&TII
= *STI
.getInstrInfo();
801 for (unsigned i
= 0, e
= CSI
.size(); i
!= e
; ++i
) {
802 // Add the callee-saved register as live-in. Do not add if the register is
803 // RA and return address is taken, because it has already been added in
804 // method MipsTargetLowering::lowerRETURNADDR.
805 // It's killed at the spill, unless the register is RA and return address
807 unsigned Reg
= CSI
[i
].getReg();
808 bool IsRAAndRetAddrIsTaken
= (Reg
== Mips::RA
|| Reg
== Mips::RA_64
)
809 && MF
->getFrameInfo().isReturnAddressTaken();
810 if (!IsRAAndRetAddrIsTaken
)
813 // ISRs require HI/LO to be spilled into kernel registers to be then
814 // spilled to the stack frame.
815 bool IsLOHI
= (Reg
== Mips::LO0
|| Reg
== Mips::LO0_64
||
816 Reg
== Mips::HI0
|| Reg
== Mips::HI0_64
);
817 const Function
&Func
= MBB
.getParent()->getFunction();
818 if (IsLOHI
&& Func
.hasFnAttribute("interrupt")) {
819 DebugLoc DL
= MI
->getDebugLoc();
822 if (!STI
.getABI().ArePtrs64bit()) {
823 Op
= (Reg
== Mips::HI0
) ? Mips::MFHI
: Mips::MFLO
;
826 Op
= (Reg
== Mips::HI0
) ? Mips::MFHI64
: Mips::MFLO64
;
829 BuildMI(MBB
, MI
, DL
, TII
.get(Op
), Mips::K0
)
830 .setMIFlag(MachineInstr::FrameSetup
);
833 // Insert the spill to the stack frame.
834 bool IsKill
= !IsRAAndRetAddrIsTaken
;
835 const TargetRegisterClass
*RC
= TRI
->getMinimalPhysRegClass(Reg
);
836 TII
.storeRegToStackSlot(MBB
, MI
, Reg
, IsKill
,
837 CSI
[i
].getFrameIdx(), RC
, TRI
);
844 MipsSEFrameLowering::hasReservedCallFrame(const MachineFunction
&MF
) const {
845 const MachineFrameInfo
&MFI
= MF
.getFrameInfo();
846 // Reserve call frame if the size of the maximum call frame fits into 16-bit
847 // immediate field and there are no variable sized objects on the stack.
848 // Make sure the second register scavenger spill slot can be accessed with one
850 return isInt
<16>(MFI
.getMaxCallFrameSize() + getStackAlignment()) &&
851 !MFI
.hasVarSizedObjects();
854 /// Mark \p Reg and all registers aliasing it in the bitset.
855 static void setAliasRegs(MachineFunction
&MF
, BitVector
&SavedRegs
,
857 const TargetRegisterInfo
*TRI
= MF
.getSubtarget().getRegisterInfo();
858 for (MCRegAliasIterator
AI(Reg
, TRI
, true); AI
.isValid(); ++AI
)
862 void MipsSEFrameLowering::determineCalleeSaves(MachineFunction
&MF
,
863 BitVector
&SavedRegs
,
864 RegScavenger
*RS
) const {
865 TargetFrameLowering::determineCalleeSaves(MF
, SavedRegs
, RS
);
866 const TargetRegisterInfo
*TRI
= MF
.getSubtarget().getRegisterInfo();
867 MipsFunctionInfo
*MipsFI
= MF
.getInfo
<MipsFunctionInfo
>();
868 MipsABIInfo ABI
= STI
.getABI();
869 unsigned FP
= ABI
.GetFramePtr();
870 unsigned BP
= ABI
.IsN64() ? Mips::S7_64
: Mips::S7
;
872 // Mark $fp as used if function has dedicated frame pointer.
874 setAliasRegs(MF
, SavedRegs
, FP
);
875 // Mark $s7 as used if function has dedicated base pointer.
877 setAliasRegs(MF
, SavedRegs
, BP
);
879 // Create spill slots for eh data registers if function calls eh_return.
880 if (MipsFI
->callsEhReturn())
881 MipsFI
->createEhDataRegsFI();
883 // Create spill slots for Coprocessor 0 registers if function is an ISR.
885 MipsFI
->createISRRegFI();
887 // Expand pseudo instructions which load, store or copy accumulators.
888 // Add an emergency spill slot if a pseudo was expanded.
889 if (ExpandPseudo(MF
).expand()) {
890 // The spill slot should be half the size of the accumulator. If target have
891 // general-purpose registers 64 bits wide, it should be 64-bit, otherwise
892 // it should be 32-bit.
893 const TargetRegisterClass
&RC
= STI
.isGP64bit() ?
894 Mips::GPR64RegClass
: Mips::GPR32RegClass
;
895 int FI
= MF
.getFrameInfo().CreateStackObject(TRI
->getSpillSize(RC
),
896 TRI
->getSpillAlignment(RC
),
898 RS
->addScavengingFrameIndex(FI
);
901 // Set scavenging frame index if necessary.
902 uint64_t MaxSPOffset
= estimateStackSize(MF
);
904 // MSA has a minimum offset of 10 bits signed. If there is a variable
905 // sized object on the stack, the estimation cannot account for it.
906 if (isIntN(STI
.hasMSA() ? 10 : 16, MaxSPOffset
) &&
907 !MF
.getFrameInfo().hasVarSizedObjects())
910 const TargetRegisterClass
&RC
=
911 ABI
.ArePtrs64bit() ? Mips::GPR64RegClass
: Mips::GPR32RegClass
;
912 int FI
= MF
.getFrameInfo().CreateStackObject(TRI
->getSpillSize(RC
),
913 TRI
->getSpillAlignment(RC
),
915 RS
->addScavengingFrameIndex(FI
);
918 const MipsFrameLowering
*
919 llvm::createMipsSEFrameLowering(const MipsSubtarget
&ST
) {
920 return new MipsSEFrameLowering(ST
);