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