Make requiresRegisterScavenging determination on a per MachineFunction basis.
[oota-llvm.git] / lib / Target / ARM / ARMRegisterInfo.h
1 //===- ARMRegisterInfo.h - ARM Register Information Impl --------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by the "Instituto Nokia de Tecnologia" and
6 // is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10 //
11 // This file contains the ARM implementation of the MRegisterInfo class.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #ifndef ARMREGISTERINFO_H
16 #define ARMREGISTERINFO_H
17
18 #include "llvm/Target/MRegisterInfo.h"
19 #include "ARMGenRegisterInfo.h.inc"
20
21 namespace llvm {
22   class ARMSubtarget;
23   class TargetInstrInfo;
24   class Type;
25
26 struct ARMRegisterInfo : public ARMGenRegisterInfo {
27   const TargetInstrInfo &TII;
28   const ARMSubtarget &STI;
29 private:
30   /// RS - An instance of the register scavenger.
31   RegScavenger *RS;
32
33   /// FramePtr - ARM physical register used as frame ptr.
34   unsigned FramePtr;
35
36 public:
37   ARMRegisterInfo(const TargetInstrInfo &tii, const ARMSubtarget &STI);
38
39   ~ARMRegisterInfo();
40
41   /// getRegisterNumbering - Given the enum value for some register, e.g.
42   /// ARM::LR, return the number that it corresponds to (e.g. 14).
43   static unsigned getRegisterNumbering(unsigned RegEnum);
44
45   /// Code Generation virtual methods...
46   bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
47                                  MachineBasicBlock::iterator MI,
48                                  const std::vector<CalleeSavedInfo> &CSI) const;
49
50   bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
51                                    MachineBasicBlock::iterator MI,
52                                  const std::vector<CalleeSavedInfo> &CSI) const;
53
54   void storeRegToStackSlot(MachineBasicBlock &MBB,
55                            MachineBasicBlock::iterator MBBI,
56                            unsigned SrcReg, int FrameIndex,
57                            const TargetRegisterClass *RC) const;
58
59   void loadRegFromStackSlot(MachineBasicBlock &MBB,
60                             MachineBasicBlock::iterator MBBI,
61                             unsigned DestReg, int FrameIndex,
62                             const TargetRegisterClass *RC) const;
63
64   void copyRegToReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
65                     unsigned DestReg, unsigned SrcReg,
66                     const TargetRegisterClass *RC) const;
67
68   MachineInstr* foldMemoryOperand(MachineInstr* MI, unsigned OpNum,
69                                   int FrameIndex) const;
70
71   const unsigned *getCalleeSavedRegs() const;
72
73   const TargetRegisterClass* const* getCalleeSavedRegClasses() const;
74
75   BitVector getReservedRegs(const MachineFunction &MF) const;
76
77   bool requiresRegisterScavenging(const MachineFunction &MF) const;
78
79   bool hasFP(const MachineFunction &MF) const;
80
81   void eliminateCallFramePseudoInstr(MachineFunction &MF,
82                                      MachineBasicBlock &MBB,
83                                      MachineBasicBlock::iterator I) const;
84
85   void eliminateFrameIndex(MachineBasicBlock::iterator II,
86                            RegScavenger *RS = NULL) const;
87
88   void processFunctionBeforeCalleeSavedScan(MachineFunction &MF) const;
89
90   void emitPrologue(MachineFunction &MF) const;
91   void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
92
93   // Debug information queries.
94   unsigned getRARegister() const;
95   unsigned getFrameRegister(MachineFunction &MF) const;
96
97   // Exception handling queries.
98   unsigned getEHExceptionRegister() const;
99   unsigned getEHHandlerRegister() const;
100 };
101
102 } // end namespace llvm
103
104 #endif