PPCRegisterInfo.h revision b97aec663b1591e71c9ddee6dbb327d1b827eda5
121e463b2bf864671a87ebe386cb100ef9349a540Nate Begeman//===- PPCRegisterInfo.h - PowerPC Register Information Impl -----*- C++ -*-==//
2b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman//
3f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//                     The LLVM Compiler Infrastructure
4f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//
5f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman// This file was developed by the LLVM research group and is distributed under
6f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman// the University of Illinois Open Source License. See LICENSE.TXT for details.
7b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman//
8f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//===----------------------------------------------------------------------===//
9f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//
10f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman// This file contains the PowerPC implementation of the MRegisterInfo class.
11f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//
12f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//===----------------------------------------------------------------------===//
13f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
14f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#ifndef POWERPC32_REGISTERINFO_H
15f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#define POWERPC32_REGISTERINFO_H
16f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
172668959b8879097db368aec7d76c455260abc75bChris Lattner#include "PPC.h"
184c7b43b43fdf943c7298718e15ab5d6dfe345be7Chris Lattner#include "PPCGenRegisterInfo.h.inc"
19f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#include <map>
20f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
21f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukmannamespace llvm {
22804e06704261f233111913a047ef7f7dec1b8725Chris Lattnerclass PPCSubtarget;
23c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Chengclass TargetInstrInfo;
24f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukmanclass Type;
25f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
2621e463b2bf864671a87ebe386cb100ef9349a540Nate Begemanclass PPCRegisterInfo : public PPCGenRegisterInfo {
27f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  std::map<unsigned, unsigned> ImmToIdxMap;
28804e06704261f233111913a047ef7f7dec1b8725Chris Lattner  const PPCSubtarget &Subtarget;
297ce45783531cfa81bfd7be561ea7e4738e8c6ca8Evan Cheng  const TargetInstrInfo &TII;
30f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukmanpublic:
317ce45783531cfa81bfd7be561ea7e4738e8c6ca8Evan Cheng  PPCRegisterInfo(const PPCSubtarget &SubTarget, const TargetInstrInfo &tii);
32369503f8412bba4a0138074c97107c09cc4513e0Chris Lattner
33369503f8412bba4a0138074c97107c09cc4513e0Chris Lattner  /// getRegisterNumbering - Given the enum value for some register, e.g.
34369503f8412bba4a0138074c97107c09cc4513e0Chris Lattner  /// PPC::F14, return the number that it corresponds to (e.g. 14).
35369503f8412bba4a0138074c97107c09cc4513e0Chris Lattner  static unsigned getRegisterNumbering(unsigned RegEnum);
36f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
37f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  /// Code Generation virtual methods...
38f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  void storeRegToStackSlot(MachineBasicBlock &MBB,
39f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman                           MachineBasicBlock::iterator MBBI,
400ffb1a56ff8439604556afd09ee0774655d7197cChris Lattner                           unsigned SrcReg, int FrameIndex,
410ffb1a56ff8439604556afd09ee0774655d7197cChris Lattner                           const TargetRegisterClass *RC) const;
42f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
4366f0f640820b61cf9db814b6d187bae9faf7279cEvan Cheng  void storeRegToAddr(MachineFunction &MF, unsigned SrcReg,
44f0a0cddbcda344a90b7217b744c78dccec71851cEvan Cheng                      SmallVectorImpl<MachineOperand> &Addr,
4566f0f640820b61cf9db814b6d187bae9faf7279cEvan Cheng                      const TargetRegisterClass *RC,
4658184e6878fdab651bc7c9a59dab2687ca82ede2Evan Cheng                      SmallVectorImpl<MachineInstr*> &NewMIs) const;
4766f0f640820b61cf9db814b6d187bae9faf7279cEvan Cheng
48f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  void loadRegFromStackSlot(MachineBasicBlock &MBB,
49f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman                            MachineBasicBlock::iterator MBBI,
500ffb1a56ff8439604556afd09ee0774655d7197cChris Lattner                            unsigned DestReg, int FrameIndex,
510ffb1a56ff8439604556afd09ee0774655d7197cChris Lattner                            const TargetRegisterClass *RC) const;
52b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman
5366f0f640820b61cf9db814b6d187bae9faf7279cEvan Cheng  void loadRegFromAddr(MachineFunction &MF, unsigned DestReg,
54f0a0cddbcda344a90b7217b744c78dccec71851cEvan Cheng                       SmallVectorImpl<MachineOperand> &Addr,
5566f0f640820b61cf9db814b6d187bae9faf7279cEvan Cheng                       const TargetRegisterClass *RC,
5658184e6878fdab651bc7c9a59dab2687ca82ede2Evan Cheng                       SmallVectorImpl<MachineInstr*> &NewMIs) const;
5766f0f640820b61cf9db814b6d187bae9faf7279cEvan Cheng
58f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  void copyRegToReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
59f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman                    unsigned DestReg, unsigned SrcReg,
609efce638d307b2c71bd7f0258d47501661434c27Evan Cheng                    const TargetRegisterClass *DestRC,
619efce638d307b2c71bd7f0258d47501661434c27Evan Cheng                    const TargetRegisterClass *SrcRC) const;
62f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
63bf2c8b3c96f5c885095a10b0fcb29438f92d73c2Evan Cheng  void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
64bf2c8b3c96f5c885095a10b0fcb29438f92d73c2Evan Cheng                     unsigned DestReg, const MachineInstr *Orig) const;
65bf2c8b3c96f5c885095a10b0fcb29438f92d73c2Evan Cheng
66f38df04c3a0c2aa766fa50b254d2d0fc743f8152Chris Lattner  /// foldMemoryOperand - PowerPC (like most RISC's) can only fold spills into
67f38df04c3a0c2aa766fa50b254d2d0fc743f8152Chris Lattner  /// copy instructions, turning them into load/store instructions.
68f38df04c3a0c2aa766fa50b254d2d0fc743f8152Chris Lattner  virtual MachineInstr* foldMemoryOperand(MachineInstr* MI, unsigned OpNum,
69f38df04c3a0c2aa766fa50b254d2d0fc743f8152Chris Lattner                                          int FrameIndex) const;
70f38df04c3a0c2aa766fa50b254d2d0fc743f8152Chris Lattner
7135b35c5c320a71e4611fe2101452da685f8eeda0Evan Cheng  virtual MachineInstr* foldMemoryOperand(MachineInstr* MI, unsigned OpNum,
7235b35c5c320a71e4611fe2101452da685f8eeda0Evan Cheng                                          MachineInstr* LoadMI) const {
7335b35c5c320a71e4611fe2101452da685f8eeda0Evan Cheng    return 0;
7435b35c5c320a71e4611fe2101452da685f8eeda0Evan Cheng  }
7535b35c5c320a71e4611fe2101452da685f8eeda0Evan Cheng
762365f51ed03afe6993bae962fdc2e5a956a64cd5Anton Korobeynikov  const unsigned *getCalleeSavedRegs(const MachineFunction* MF = 0) const;
770f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng
7864d80e3387f328d21cd9cc06464b5de7861e3f27Evan Cheng  const TargetRegisterClass* const*
7964d80e3387f328d21cd9cc06464b5de7861e3f27Evan Cheng  getCalleeSavedRegClasses(const MachineFunction *MF = 0) const;
800f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng
81b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  BitVector getReservedRegs(const MachineFunction &MF) const;
82b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
8399403b6964aead64c1039a8f4007437ef96dfd88Evan Cheng  /// targetHandlesStackFrameRounding - Returns true if the target is
8499403b6964aead64c1039a8f4007437ef96dfd88Evan Cheng  /// responsible for rounding up the stack frame (probably at emitPrologue
8599403b6964aead64c1039a8f4007437ef96dfd88Evan Cheng  /// time).
8699403b6964aead64c1039a8f4007437ef96dfd88Evan Cheng  bool targetHandlesStackFrameRounding() const { return true; }
8799403b6964aead64c1039a8f4007437ef96dfd88Evan Cheng
88dc77540d9506dc151d79b94bae88bd841880ef37Evan Cheng  bool hasFP(const MachineFunction &MF) const;
89dc77540d9506dc151d79b94bae88bd841880ef37Evan Cheng
90f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  void eliminateCallFramePseudoInstr(MachineFunction &MF,
91f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman                                     MachineBasicBlock &MBB,
92f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman                                     MachineBasicBlock::iterator I) const;
93f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
9451fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey  /// usesLR - Returns if the link registers (LR) has been used in the function.
9551fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey  ///
9651fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey  bool usesLR(MachineFunction &MF) const;
9751fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey
982f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  void lowerDynamicAlloc(MachineBasicBlock::iterator II) const;
995e6df4647e15c50daea9a8a4e7f4f417a266335cEvan Cheng  void eliminateFrameIndex(MachineBasicBlock::iterator II,
10097de9138217d6f76f25100df272ec1a3c4d31aadEvan Cheng                           int SPAdj, RegScavenger *RS = NULL) const;
101f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
1022f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  /// determineFrameLayout - Determine the size of the frame and maximum call
1032f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  /// frame size.
1042f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  void determineFrameLayout(MachineFunction &MF) const;
1052f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey
10628b3c45109153bc50d3d9e97dccb25ffd043fa50Evan Cheng  void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
10728b3c45109153bc50d3d9e97dccb25ffd043fa50Evan Cheng                                            RegScavenger *RS = NULL) const;
108f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  void emitPrologue(MachineFunction &MF) const;
109f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
110f1d78e83356a412e525c30ac90dabf090a8cfc99Jim Laskey
111a99791886d5d4af2b900cd8cc1c9ed1677b6f0f4Jim Laskey  // Debug information queries.
1124188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  unsigned getRARegister() const;
113a99791886d5d4af2b900cd8cc1c9ed1677b6f0f4Jim Laskey  unsigned getFrameRegister(MachineFunction &MF) const;
1145e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey  void getInitialFrameState(std::vector<MachineMove> &Moves) const;
11562819f31440fe1b1415473a89b8683b5b690d5faJim Laskey
11662819f31440fe1b1415473a89b8683b5b690d5faJim Laskey  // Exception handling queries.
11762819f31440fe1b1415473a89b8683b5b690d5faJim Laskey  unsigned getEHExceptionRegister() const;
11862819f31440fe1b1415473a89b8683b5b690d5faJim Laskey  unsigned getEHHandlerRegister() const;
119f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov
120b97aec663b1591e71c9ddee6dbb327d1b827eda5Dale Johannesen  int getDwarfRegNum(unsigned RegNum, bool isEH) const;
121f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman};
122f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
123f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman} // end namespace llvm
124f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
125f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#endif
126