6b9ac39a41269af24dd2a231d5fbb6b653b8756e
[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 #include <set>
21
22 namespace llvm {
23   class TargetInstrInfo;
24   class ARMSubtarget;
25   class Type;
26
27 struct ARMRegisterInfo : public ARMGenRegisterInfo {
28   const TargetInstrInfo &TII;
29   const ARMSubtarget &STI;
30 private:
31   /// FramePtr - ARM physical register used as frame ptr.
32   unsigned FramePtr;
33
34 public:
35   ARMRegisterInfo(const TargetInstrInfo &tii, const ARMSubtarget &STI);
36
37   /// getRegisterNumbering - Given the enum value for some register, e.g.
38   /// ARM::LR, return the number that it corresponds to (e.g. 14).
39   static unsigned getRegisterNumbering(unsigned RegEnum);
40
41   /// Code Generation virtual methods...
42   bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
43                                  MachineBasicBlock::iterator MI,
44                                  const std::vector<CalleeSavedInfo> &CSI) const;
45
46   bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
47                                    MachineBasicBlock::iterator MI,
48                                  const std::vector<CalleeSavedInfo> &CSI) const;
49
50   void storeRegToStackSlot(MachineBasicBlock &MBB,
51                            MachineBasicBlock::iterator MBBI,
52                            unsigned SrcReg, int FrameIndex,
53                            const TargetRegisterClass *RC) const;
54
55   void loadRegFromStackSlot(MachineBasicBlock &MBB,
56                             MachineBasicBlock::iterator MBBI,
57                             unsigned DestReg, int FrameIndex,
58                             const TargetRegisterClass *RC) const;
59
60   void copyRegToReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
61                     unsigned DestReg, unsigned SrcReg,
62                     const TargetRegisterClass *RC) const;
63
64   MachineInstr* foldMemoryOperand(MachineInstr* MI, unsigned OpNum,
65                                   int FrameIndex) const;
66
67   const unsigned *getCalleeSavedRegs() const;
68
69   const TargetRegisterClass* const* getCalleeSavedRegClasses() const;
70
71   void eliminateCallFramePseudoInstr(MachineFunction &MF,
72                                      MachineBasicBlock &MBB,
73                                      MachineBasicBlock::iterator I) const;
74
75   void eliminateFrameIndex(MachineBasicBlock::iterator II) const;
76
77   void processFunctionBeforeCalleeSavedScan(MachineFunction &MF) const;
78
79   void emitPrologue(MachineFunction &MF) const;
80   void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
81
82   // Debug information queries.
83   unsigned getRARegister() const;
84   unsigned getFrameRegister(MachineFunction &MF) const;
85 };
86
87 } // end namespace llvm
88
89 #endif