PPCRegisterInfo.h revision 28b3c45109153bc50d3d9e97dccb25ffd043fa50
1//===- PPCRegisterInfo.h - PowerPC Register Information Impl -----*- C++ -*-==//
2//
3//                     The LLVM Compiler Infrastructure
4//
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.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains the PowerPC implementation of the MRegisterInfo class.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef POWERPC32_REGISTERINFO_H
15#define POWERPC32_REGISTERINFO_H
16
17#include "PPC.h"
18#include "PPCGenRegisterInfo.h.inc"
19#include <map>
20
21namespace llvm {
22class PPCSubtarget;
23class TargetInstrInfo;
24class Type;
25
26class PPCRegisterInfo : public PPCGenRegisterInfo {
27  std::map<unsigned, unsigned> ImmToIdxMap;
28  const PPCSubtarget &Subtarget;
29  const TargetInstrInfo &TII;
30public:
31  PPCRegisterInfo(const PPCSubtarget &SubTarget, const TargetInstrInfo &tii);
32
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);
36
37  /// Code Generation virtual methods...
38  void storeRegToStackSlot(MachineBasicBlock &MBB,
39                           MachineBasicBlock::iterator MBBI,
40                           unsigned SrcReg, int FrameIndex,
41                           const TargetRegisterClass *RC) const;
42
43  void loadRegFromStackSlot(MachineBasicBlock &MBB,
44                            MachineBasicBlock::iterator MBBI,
45                            unsigned DestReg, int FrameIndex,
46                            const TargetRegisterClass *RC) const;
47
48  void copyRegToReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
49                    unsigned DestReg, unsigned SrcReg,
50                    const TargetRegisterClass *RC) const;
51
52  /// foldMemoryOperand - PowerPC (like most RISC's) can only fold spills into
53  /// copy instructions, turning them into load/store instructions.
54  virtual MachineInstr* foldMemoryOperand(MachineInstr* MI, unsigned OpNum,
55                                          int FrameIndex) const;
56
57  const unsigned *getCalleeSavedRegs() const;
58
59  const TargetRegisterClass* const* getCalleeSavedRegClasses() const;
60
61  BitVector getReservedRegs(const MachineFunction &MF) const;
62
63  /// targetHandlesStackFrameRounding - Returns true if the target is
64  /// responsible for rounding up the stack frame (probably at emitPrologue
65  /// time).
66  bool targetHandlesStackFrameRounding() const { return true; }
67
68  bool hasFP(const MachineFunction &MF) const;
69
70  void eliminateCallFramePseudoInstr(MachineFunction &MF,
71                                     MachineBasicBlock &MBB,
72                                     MachineBasicBlock::iterator I) const;
73
74  /// usesLR - Returns if the link registers (LR) has been used in the function.
75  ///
76  bool usesLR(MachineFunction &MF) const;
77
78  void lowerDynamicAlloc(MachineBasicBlock::iterator II) const;
79  void eliminateFrameIndex(MachineBasicBlock::iterator II,
80                           RegScavenger *RS = NULL) const;
81
82  /// determineFrameLayout - Determine the size of the frame and maximum call
83  /// frame size.
84  void determineFrameLayout(MachineFunction &MF) const;
85
86  void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
87                                            RegScavenger *RS = NULL) const;
88  void emitPrologue(MachineFunction &MF) const;
89  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
90
91  // Debug information queries.
92  unsigned getRARegister() const;
93  unsigned getFrameRegister(MachineFunction &MF) const;
94  void getInitialFrameState(std::vector<MachineMove> &Moves) const;
95
96  // Exception handling queries.
97  unsigned getEHExceptionRegister() const;
98  unsigned getEHHandlerRegister() const;
99};
100
101} // end namespace llvm
102
103#endif
104