1*9880d681SAndroid Build Coastguard Worker //=- HexagonFrameLowering.h - Define frame lowering for Hexagon --*- C++ -*--=// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_HEXAGON_HEXAGONFRAMELOWERING_H 11*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_HEXAGON_HEXAGONFRAMELOWERING_H 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker #include "Hexagon.h" 14*9880d681SAndroid Build Coastguard Worker #include "HexagonBlockRanges.h" 15*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetFrameLowering.h" 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker namespace llvm { 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker class HexagonInstrInfo; 20*9880d681SAndroid Build Coastguard Worker class HexagonRegisterInfo; 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker class HexagonFrameLowering : public TargetFrameLowering { 23*9880d681SAndroid Build Coastguard Worker public: HexagonFrameLowering()24*9880d681SAndroid Build Coastguard Worker explicit HexagonFrameLowering() 25*9880d681SAndroid Build Coastguard Worker : TargetFrameLowering(StackGrowsDown, 8, 0, 1, true) {} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker // All of the prolog/epilog functionality, including saving and restoring 28*9880d681SAndroid Build Coastguard Worker // callee-saved registers is handled in emitPrologue. This is to have the 29*9880d681SAndroid Build Coastguard Worker // logic for shrink-wrapping in one place. 30*9880d681SAndroid Build Coastguard Worker void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const 31*9880d681SAndroid Build Coastguard Worker override; emitEpilogue(MachineFunction & MF,MachineBasicBlock & MBB)32*9880d681SAndroid Build Coastguard Worker void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const 33*9880d681SAndroid Build Coastguard Worker override {} spillCalleeSavedRegisters(MachineBasicBlock & MBB,MachineBasicBlock::iterator MI,const std::vector<CalleeSavedInfo> & CSI,const TargetRegisterInfo * TRI)34*9880d681SAndroid Build Coastguard Worker bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, 35*9880d681SAndroid Build Coastguard Worker MachineBasicBlock::iterator MI, const std::vector<CalleeSavedInfo> &CSI, 36*9880d681SAndroid Build Coastguard Worker const TargetRegisterInfo *TRI) const override { 37*9880d681SAndroid Build Coastguard Worker return true; 38*9880d681SAndroid Build Coastguard Worker } restoreCalleeSavedRegisters(MachineBasicBlock & MBB,MachineBasicBlock::iterator MI,const std::vector<CalleeSavedInfo> & CSI,const TargetRegisterInfo * TRI)39*9880d681SAndroid Build Coastguard Worker bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB, 40*9880d681SAndroid Build Coastguard Worker MachineBasicBlock::iterator MI, const std::vector<CalleeSavedInfo> &CSI, 41*9880d681SAndroid Build Coastguard Worker const TargetRegisterInfo *TRI) const override { 42*9880d681SAndroid Build Coastguard Worker return true; 43*9880d681SAndroid Build Coastguard Worker } 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker MachineBasicBlock::iterator 46*9880d681SAndroid Build Coastguard Worker eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, 47*9880d681SAndroid Build Coastguard Worker MachineBasicBlock::iterator I) const override; 48*9880d681SAndroid Build Coastguard Worker void processFunctionBeforeFrameFinalized(MachineFunction &MF, 49*9880d681SAndroid Build Coastguard Worker RegScavenger *RS = nullptr) const override; 50*9880d681SAndroid Build Coastguard Worker void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs, 51*9880d681SAndroid Build Coastguard Worker RegScavenger *RS) const override; 52*9880d681SAndroid Build Coastguard Worker targetHandlesStackFrameRounding()53*9880d681SAndroid Build Coastguard Worker bool targetHandlesStackFrameRounding() const override { 54*9880d681SAndroid Build Coastguard Worker return true; 55*9880d681SAndroid Build Coastguard Worker } 56*9880d681SAndroid Build Coastguard Worker int getFrameIndexReference(const MachineFunction &MF, int FI, 57*9880d681SAndroid Build Coastguard Worker unsigned &FrameReg) const override; 58*9880d681SAndroid Build Coastguard Worker bool hasFP(const MachineFunction &MF) const override; 59*9880d681SAndroid Build Coastguard Worker getCalleeSavedSpillSlots(unsigned & NumEntries)60*9880d681SAndroid Build Coastguard Worker const SpillSlot *getCalleeSavedSpillSlots(unsigned &NumEntries) 61*9880d681SAndroid Build Coastguard Worker const override { 62*9880d681SAndroid Build Coastguard Worker static const SpillSlot Offsets[] = { 63*9880d681SAndroid Build Coastguard Worker { Hexagon::R17, -4 }, { Hexagon::R16, -8 }, { Hexagon::D8, -8 }, 64*9880d681SAndroid Build Coastguard Worker { Hexagon::R19, -12 }, { Hexagon::R18, -16 }, { Hexagon::D9, -16 }, 65*9880d681SAndroid Build Coastguard Worker { Hexagon::R21, -20 }, { Hexagon::R20, -24 }, { Hexagon::D10, -24 }, 66*9880d681SAndroid Build Coastguard Worker { Hexagon::R23, -28 }, { Hexagon::R22, -32 }, { Hexagon::D11, -32 }, 67*9880d681SAndroid Build Coastguard Worker { Hexagon::R25, -36 }, { Hexagon::R24, -40 }, { Hexagon::D12, -40 }, 68*9880d681SAndroid Build Coastguard Worker { Hexagon::R27, -44 }, { Hexagon::R26, -48 }, { Hexagon::D13, -48 } 69*9880d681SAndroid Build Coastguard Worker }; 70*9880d681SAndroid Build Coastguard Worker NumEntries = array_lengthof(Offsets); 71*9880d681SAndroid Build Coastguard Worker return Offsets; 72*9880d681SAndroid Build Coastguard Worker } 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker bool assignCalleeSavedSpillSlots(MachineFunction &MF, 75*9880d681SAndroid Build Coastguard Worker const TargetRegisterInfo *TRI, std::vector<CalleeSavedInfo> &CSI) 76*9880d681SAndroid Build Coastguard Worker const override; 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker bool needsAligna(const MachineFunction &MF) const; 79*9880d681SAndroid Build Coastguard Worker const MachineInstr *getAlignaInstr(const MachineFunction &MF) const; 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker void insertCFIInstructions(MachineFunction &MF) const; 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker private: 84*9880d681SAndroid Build Coastguard Worker typedef std::vector<CalleeSavedInfo> CSIVect; 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker void expandAlloca(MachineInstr *AI, const HexagonInstrInfo &TII, 87*9880d681SAndroid Build Coastguard Worker unsigned SP, unsigned CF) const; 88*9880d681SAndroid Build Coastguard Worker void insertPrologueInBlock(MachineBasicBlock &MBB, bool PrologueStubs) const; 89*9880d681SAndroid Build Coastguard Worker void insertEpilogueInBlock(MachineBasicBlock &MBB) const; 90*9880d681SAndroid Build Coastguard Worker bool insertCSRSpillsInBlock(MachineBasicBlock &MBB, const CSIVect &CSI, 91*9880d681SAndroid Build Coastguard Worker const HexagonRegisterInfo &HRI, bool &PrologueStubs) const; 92*9880d681SAndroid Build Coastguard Worker bool insertCSRRestoresInBlock(MachineBasicBlock &MBB, const CSIVect &CSI, 93*9880d681SAndroid Build Coastguard Worker const HexagonRegisterInfo &HRI) const; 94*9880d681SAndroid Build Coastguard Worker bool updateExitPaths(MachineBasicBlock &MBB, MachineBasicBlock *RestoreB, 95*9880d681SAndroid Build Coastguard Worker BitVector &DoneT, BitVector &DoneF, BitVector &Path) const; 96*9880d681SAndroid Build Coastguard Worker void insertCFIInstructionsAt(MachineBasicBlock &MBB, 97*9880d681SAndroid Build Coastguard Worker MachineBasicBlock::iterator At) const; 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker void adjustForCalleeSavedRegsSpillCall(MachineFunction &MF) const; 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker bool expandCopy(MachineBasicBlock &B, MachineBasicBlock::iterator It, 102*9880d681SAndroid Build Coastguard Worker MachineRegisterInfo &MRI, const HexagonInstrInfo &HII, 103*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewRegs) const; 104*9880d681SAndroid Build Coastguard Worker bool expandStoreInt(MachineBasicBlock &B, MachineBasicBlock::iterator It, 105*9880d681SAndroid Build Coastguard Worker MachineRegisterInfo &MRI, const HexagonInstrInfo &HII, 106*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewRegs) const; 107*9880d681SAndroid Build Coastguard Worker bool expandLoadInt(MachineBasicBlock &B, MachineBasicBlock::iterator It, 108*9880d681SAndroid Build Coastguard Worker MachineRegisterInfo &MRI, const HexagonInstrInfo &HII, 109*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewRegs) const; 110*9880d681SAndroid Build Coastguard Worker bool expandStoreVecPred(MachineBasicBlock &B, MachineBasicBlock::iterator It, 111*9880d681SAndroid Build Coastguard Worker MachineRegisterInfo &MRI, const HexagonInstrInfo &HII, 112*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewRegs) const; 113*9880d681SAndroid Build Coastguard Worker bool expandLoadVecPred(MachineBasicBlock &B, MachineBasicBlock::iterator It, 114*9880d681SAndroid Build Coastguard Worker MachineRegisterInfo &MRI, const HexagonInstrInfo &HII, 115*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewRegs) const; 116*9880d681SAndroid Build Coastguard Worker bool expandStoreVec2(MachineBasicBlock &B, MachineBasicBlock::iterator It, 117*9880d681SAndroid Build Coastguard Worker MachineRegisterInfo &MRI, const HexagonInstrInfo &HII, 118*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewRegs) const; 119*9880d681SAndroid Build Coastguard Worker bool expandLoadVec2(MachineBasicBlock &B, MachineBasicBlock::iterator It, 120*9880d681SAndroid Build Coastguard Worker MachineRegisterInfo &MRI, const HexagonInstrInfo &HII, 121*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewRegs) const; 122*9880d681SAndroid Build Coastguard Worker bool expandStoreVec(MachineBasicBlock &B, MachineBasicBlock::iterator It, 123*9880d681SAndroid Build Coastguard Worker MachineRegisterInfo &MRI, const HexagonInstrInfo &HII, 124*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewRegs) const; 125*9880d681SAndroid Build Coastguard Worker bool expandLoadVec(MachineBasicBlock &B, MachineBasicBlock::iterator It, 126*9880d681SAndroid Build Coastguard Worker MachineRegisterInfo &MRI, const HexagonInstrInfo &HII, 127*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewRegs) const; 128*9880d681SAndroid Build Coastguard Worker bool expandSpillMacros(MachineFunction &MF, 129*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewRegs) const; 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker unsigned findPhysReg(MachineFunction &MF, HexagonBlockRanges::IndexRange &FIR, 132*9880d681SAndroid Build Coastguard Worker HexagonBlockRanges::InstrIndexMap &IndexMap, 133*9880d681SAndroid Build Coastguard Worker HexagonBlockRanges::RegToRangeMap &DeadMap, 134*9880d681SAndroid Build Coastguard Worker const TargetRegisterClass *RC) const; 135*9880d681SAndroid Build Coastguard Worker void optimizeSpillSlots(MachineFunction &MF, 136*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &VRegs) const; 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker void findShrunkPrologEpilog(MachineFunction &MF, MachineBasicBlock *&PrologB, 139*9880d681SAndroid Build Coastguard Worker MachineBasicBlock *&EpilogB) const; 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Worker void addCalleeSaveRegistersAsImpOperand(MachineInstr *MI, const CSIVect &CSI, 142*9880d681SAndroid Build Coastguard Worker bool IsDef, bool IsKill) const; 143*9880d681SAndroid Build Coastguard Worker bool shouldInlineCSR(llvm::MachineFunction &MF, const CSIVect &CSI) const; 144*9880d681SAndroid Build Coastguard Worker bool useSpillFunction(MachineFunction &MF, const CSIVect &CSI) const; 145*9880d681SAndroid Build Coastguard Worker bool useRestoreFunction(MachineFunction &MF, const CSIVect &CSI) const; 146*9880d681SAndroid Build Coastguard Worker }; 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker } // End llvm namespace 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker #endif 151