1 //===- PPCRegisterInfo.h - PowerPC Register Information Impl -----*- C++ -*-==//
3 // The LLVM Compiler Infrastructure
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file contains the PowerPC implementation of the MRegisterInfo class.
12 //===----------------------------------------------------------------------===//
14 #ifndef POWERPC32_REGISTERINFO_H
15 #define POWERPC32_REGISTERINFO_H
18 #include "PPCGenRegisterInfo.h.inc"
23 class TargetInstrInfo
;
26 class PPCRegisterInfo
: public PPCGenRegisterInfo
{
27 std::map
<unsigned, unsigned> ImmToIdxMap
;
28 const PPCSubtarget
&Subtarget
;
29 const TargetInstrInfo
&TII
;
31 PPCRegisterInfo(const PPCSubtarget
&SubTarget
, const TargetInstrInfo
&tii
);
33 /// getRegisterNumbering - Given the enum value for some register, e.g.
34 /// PPC::F14, return the number that it corresponds to (e.g. 14).
35 static unsigned getRegisterNumbering(unsigned RegEnum
);
37 /// Code Generation virtual methods...
38 void storeRegToStackSlot(MachineBasicBlock
&MBB
,
39 MachineBasicBlock::iterator MBBI
,
40 unsigned SrcReg
, int FrameIndex
,
41 const TargetRegisterClass
*RC
) const;
43 void loadRegFromStackSlot(MachineBasicBlock
&MBB
,
44 MachineBasicBlock::iterator MBBI
,
45 unsigned DestReg
, int FrameIndex
,
46 const TargetRegisterClass
*RC
) const;
48 void copyRegToReg(MachineBasicBlock
&MBB
, MachineBasicBlock::iterator MBBI
,
49 unsigned DestReg
, unsigned SrcReg
,
50 const TargetRegisterClass
*DestRC
,
51 const TargetRegisterClass
*SrcRC
) const;
53 void reMaterialize(MachineBasicBlock
&MBB
, MachineBasicBlock::iterator MI
,
54 unsigned DestReg
, const MachineInstr
*Orig
) const;
56 /// foldMemoryOperand - PowerPC (like most RISC's) can only fold spills into
57 /// copy instructions, turning them into load/store instructions.
58 virtual MachineInstr
* foldMemoryOperand(MachineInstr
* MI
, unsigned OpNum
,
59 int FrameIndex
) const;
61 virtual MachineInstr
* foldMemoryOperand(MachineInstr
* MI
, unsigned OpNum
,
62 MachineInstr
* LoadMI
) const {
66 const unsigned *getCalleeSavedRegs(const MachineFunction
* MF
= 0) const;
68 const TargetRegisterClass
* const*
69 getCalleeSavedRegClasses(const MachineFunction
*MF
= 0) const;
71 BitVector
getReservedRegs(const MachineFunction
&MF
) const;
73 /// targetHandlesStackFrameRounding - Returns true if the target is
74 /// responsible for rounding up the stack frame (probably at emitPrologue
76 bool targetHandlesStackFrameRounding() const { return true; }
78 bool hasFP(const MachineFunction
&MF
) const;
80 void eliminateCallFramePseudoInstr(MachineFunction
&MF
,
81 MachineBasicBlock
&MBB
,
82 MachineBasicBlock::iterator I
) const;
84 /// usesLR - Returns if the link registers (LR) has been used in the function.
86 bool usesLR(MachineFunction
&MF
) const;
88 void lowerDynamicAlloc(MachineBasicBlock::iterator II
) const;
89 void eliminateFrameIndex(MachineBasicBlock::iterator II
,
90 int SPAdj
, RegScavenger
*RS
= NULL
) const;
92 /// determineFrameLayout - Determine the size of the frame and maximum call
94 void determineFrameLayout(MachineFunction
&MF
) const;
96 void processFunctionBeforeCalleeSavedScan(MachineFunction
&MF
,
97 RegScavenger
*RS
= NULL
) const;
98 void emitPrologue(MachineFunction
&MF
) const;
99 void emitEpilogue(MachineFunction
&MF
, MachineBasicBlock
&MBB
) const;
101 // Debug information queries.
102 unsigned getRARegister() const;
103 unsigned getFrameRegister(MachineFunction
&MF
) const;
104 void getInitialFrameState(std::vector
<MachineMove
> &Moves
) const;
106 // Exception handling queries.
107 unsigned getEHExceptionRegister() const;
108 unsigned getEHHandlerRegister() const;
111 } // end namespace llvm