PPCRegisterInfo.h revision 73f50d9bc3bd46cc0abeba9bb0d46977ba1aea42
121e463b2bf864671a87ebe386cb100ef9349a540Nate Begeman//===- PPCRegisterInfo.h - PowerPC Register Information Impl -----*- C++ -*-==//
2b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman//
3f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//                     The LLVM Compiler Infrastructure
4f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman//
8f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//===----------------------------------------------------------------------===//
9f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//
106f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman// This file contains the PowerPC implementation of the TargetRegisterInfo
116f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman// class.
12f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//
13f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//===----------------------------------------------------------------------===//
14f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
15f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#ifndef POWERPC32_REGISTERINFO_H
16f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#define POWERPC32_REGISTERINFO_H
17f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
182668959b8879097db368aec7d76c455260abc75bChris Lattner#include "PPC.h"
19f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#include <map>
20f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
2173f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng#define GET_REGINFO_HEADER
2273f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng#include "PPCGenRegisterInfo.inc"
2373f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
24f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukmannamespace llvm {
25804e06704261f233111913a047ef7f7dec1b8725Chris Lattnerclass PPCSubtarget;
26c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Chengclass TargetInstrInfo;
27f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukmanclass Type;
28f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
2921e463b2bf864671a87ebe386cb100ef9349a540Nate Begemanclass PPCRegisterInfo : public PPCGenRegisterInfo {
30f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  std::map<unsigned, unsigned> ImmToIdxMap;
31804e06704261f233111913a047ef7f7dec1b8725Chris Lattner  const PPCSubtarget &Subtarget;
327ce45783531cfa81bfd7be561ea7e4738e8c6ca8Evan Cheng  const TargetInstrInfo &TII;
33f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukmanpublic:
347ce45783531cfa81bfd7be561ea7e4738e8c6ca8Evan Cheng  PPCRegisterInfo(const PPCSubtarget &SubTarget, const TargetInstrInfo &tii);
35369503f8412bba4a0138074c97107c09cc4513e0Chris Lattner
36369503f8412bba4a0138074c97107c09cc4513e0Chris Lattner  /// getRegisterNumbering - Given the enum value for some register, e.g.
37369503f8412bba4a0138074c97107c09cc4513e0Chris Lattner  /// PPC::F14, return the number that it corresponds to (e.g. 14).
38369503f8412bba4a0138074c97107c09cc4513e0Chris Lattner  static unsigned getRegisterNumbering(unsigned RegEnum);
39f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
40770bcc7b15adbc978800db70dbb1c3c22913b52cEvan Cheng  /// getPointerRegClass - Return the register class to use to hold pointers.
41770bcc7b15adbc978800db70dbb1c3c22913b52cEvan Cheng  /// This is used for addressing modes.
422cfd52c507bd5790457a171eb9bcb39019cc6860Chris Lattner  virtual const TargetRegisterClass *getPointerRegClass(unsigned Kind=0) const;
43770bcc7b15adbc978800db70dbb1c3c22913b52cEvan Cheng
44f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  /// Code Generation virtual methods...
452365f51ed03afe6993bae962fdc2e5a956a64cd5Anton Korobeynikov  const unsigned *getCalleeSavedRegs(const MachineFunction* MF = 0) const;
460f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng
47b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  BitVector getReservedRegs(const MachineFunction &MF) const;
48b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
497194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  /// requiresRegisterScavenging - We require a register scavenger.
507194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  /// FIXME (64-bit): Should be inlined.
517194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  bool requiresRegisterScavenging(const MachineFunction &MF) const;
527194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
53f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  void eliminateCallFramePseudoInstr(MachineFunction &MF,
54f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman                                     MachineBasicBlock &MBB,
55f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman                                     MachineBasicBlock::iterator I) const;
56f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
577194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  void lowerDynamicAlloc(MachineBasicBlock::iterator II,
587194aaf738a1b89441635340403f1c5b06ae18efBill Wendling                         int SPAdj, RegScavenger *RS) const;
597194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  void lowerCRSpilling(MachineBasicBlock::iterator II, unsigned FrameIndex,
607194aaf738a1b89441635340403f1c5b06ae18efBill Wendling                       int SPAdj, RegScavenger *RS) const;
61fcb4a8ead3cd8d9540d5eaa448af5d14a0ee341aJim Grosbach  void eliminateFrameIndex(MachineBasicBlock::iterator II,
62fcb4a8ead3cd8d9540d5eaa448af5d14a0ee341aJim Grosbach                           int SPAdj, RegScavenger *RS = NULL) const;
63f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
64a99791886d5d4af2b900cd8cc1c9ed1677b6f0f4Jim Laskey  // Debug information queries.
654188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  unsigned getRARegister() const;
66b9c2fd964ee7dd7823ac71db8443055e4d0f1c15David Greene  unsigned getFrameRegister(const MachineFunction &MF) const;
6762819f31440fe1b1415473a89b8683b5b690d5faJim Laskey
6862819f31440fe1b1415473a89b8683b5b690d5faJim Laskey  // Exception handling queries.
6962819f31440fe1b1415473a89b8683b5b690d5faJim Laskey  unsigned getEHExceptionRegister() const;
7062819f31440fe1b1415473a89b8683b5b690d5faJim Laskey  unsigned getEHHandlerRegister() const;
71f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov
72b97aec663b1591e71c9ddee6dbb327d1b827eda5Dale Johannesen  int getDwarfRegNum(unsigned RegNum, bool isEH) const;
736e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola  int getLLVMRegNum(unsigned RegNum, bool isEH) const;
74f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman};
75f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
76f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman} // end namespace llvm
77f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
78f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#endif
79