X86RegisterInfo.h revision bf2c8b3c96f5c885095a10b0fcb29438f92d73c2
1128aff4f9502a99af3573b98eb254490b3137646Chris Lattner//===- X86RegisterInfo.h - X86 Register Information Impl --------*- C++ -*-===// 20e0a7a45d3d0a8c865a078459d2e1c6d8967a100Misha Brukman// 3856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell// The LLVM Compiler Infrastructure 4856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell// 5856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell// This file was developed by the LLVM research group and is distributed under 6856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details. 70e0a7a45d3d0a8c865a078459d2e1c6d8967a100Misha Brukman// 8856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell//===----------------------------------------------------------------------===// 9726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner// 10726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner// This file contains the X86 implementation of the MRegisterInfo class. 11726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner// 12726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner//===----------------------------------------------------------------------===// 13726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner 14726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner#ifndef X86REGISTERINFO_H 15726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner#define X86REGISTERINFO_H 16726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner 17726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner#include "llvm/Target/MRegisterInfo.h" 187ad3e063f508218a2823bd5cf092ef622ed7ba6cChris Lattner#include "X86GenRegisterInfo.h.inc" 196811c6e1d72e55f79202b69acd15f6098967913eChris Lattner 20d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 212926869b4a083fc951484de03a9867eabf81e880Chris Lattner class Type; 222926869b4a083fc951484de03a9867eabf81e880Chris Lattner class TargetInstrInfo; 2325ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng class X86TargetMachine; 24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 25d41b30def3181bce4bf87e8bde664d15663165d0Jeff Cohenclass X86RegisterInfo : public X86GenRegisterInfo { 26d41b30def3181bce4bf87e8bde664d15663165d0Jeff Cohenpublic: 2725ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng X86TargetMachine &TM; 282926869b4a083fc951484de03a9867eabf81e880Chris Lattner const TargetInstrInfo &TII; 29d41b30def3181bce4bf87e8bde664d15663165d0Jeff Cohen 3025ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Chengprivate: 3125ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng /// Is64Bit - Is the target 64-bits. 3225ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng bool Is64Bit; 3325ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng 3425ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng /// SlotSize - Stack slot size in bytes. 3525ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng unsigned SlotSize; 3625ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng 3725ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng /// StackPtr - X86 physical register used as stack ptr. 3825ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng unsigned StackPtr; 3925ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng 4025ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng /// FramePtr - X86 physical register used as frame ptr. 4125ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng unsigned FramePtr; 4225ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng 4325ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Chengpublic: 4425ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng X86RegisterInfo(X86TargetMachine &tm, const TargetInstrInfo &tii); 456811c6e1d72e55f79202b69acd15f6098967913eChris Lattner 46128aff4f9502a99af3573b98eb254490b3137646Chris Lattner /// Code Generation virtual methods... 4701d0efba3982e98e2dc7bc534406fbf9fd1af137Chris Lattner void storeRegToStackSlot(MachineBasicBlock &MBB, 48024126ee23e6e4430a77025b61d0e713180f03d3Alkis Evlogimenos MachineBasicBlock::iterator MI, 4997d5e6461a28790fa341d9e3b58f043db549dc6aChris Lattner unsigned SrcReg, int FrameIndex, 5097d5e6461a28790fa341d9e3b58f043db549dc6aChris Lattner const TargetRegisterClass *RC) const; 5101d0efba3982e98e2dc7bc534406fbf9fd1af137Chris Lattner 5201d0efba3982e98e2dc7bc534406fbf9fd1af137Chris Lattner void loadRegFromStackSlot(MachineBasicBlock &MBB, 5301d0efba3982e98e2dc7bc534406fbf9fd1af137Chris Lattner MachineBasicBlock::iterator MI, 5497d5e6461a28790fa341d9e3b58f043db549dc6aChris Lattner unsigned DestReg, int FrameIndex, 5597d5e6461a28790fa341d9e3b58f043db549dc6aChris Lattner const TargetRegisterClass *RC) const; 560e0a7a45d3d0a8c865a078459d2e1c6d8967a100Misha Brukman 5701d0efba3982e98e2dc7bc534406fbf9fd1af137Chris Lattner void copyRegToReg(MachineBasicBlock &MBB, 5801d0efba3982e98e2dc7bc534406fbf9fd1af137Chris Lattner MachineBasicBlock::iterator MI, 5901d0efba3982e98e2dc7bc534406fbf9fd1af137Chris Lattner unsigned DestReg, unsigned SrcReg, 6001d0efba3982e98e2dc7bc534406fbf9fd1af137Chris Lattner const TargetRegisterClass *RC) const; 61bf2c8b3c96f5c885095a10b0fcb29438f92d73c2Evan Cheng 62bf2c8b3c96f5c885095a10b0fcb29438f92d73c2Evan Cheng void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, 63bf2c8b3c96f5c885095a10b0fcb29438f92d73c2Evan Cheng unsigned DestReg, const MachineInstr *Orig) const; 646811c6e1d72e55f79202b69acd15f6098967913eChris Lattner 655a051f65d3074126b762eaf44b30c44e996577feChris Lattner /// foldMemoryOperand - If this target supports it, fold a load or store of 665a051f65d3074126b762eaf44b30c44e996577feChris Lattner /// the specified stack slot into the specified machine instruction for the 675a051f65d3074126b762eaf44b30c44e996577feChris Lattner /// specified operand. If this is possible, the target should perform the 685a051f65d3074126b762eaf44b30c44e996577feChris Lattner /// folding and return true, otherwise it should return false. If it folds 695a051f65d3074126b762eaf44b30c44e996577feChris Lattner /// the instruction, it is likely that the MachineInstruction the iterator 705a051f65d3074126b762eaf44b30c44e996577feChris Lattner /// references has been changed. 710f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng MachineInstr* foldMemoryOperand(MachineInstr* MI, 720f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng unsigned OpNum, 730f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng int FrameIndex) const; 740f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng 75c2b861da18c54a4252fecba866341e1513fa18ccEvan Cheng /// getCalleeSavedRegs - Return a null-terminated list of all of the 760f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng /// callee-save registers on this target. 77c2b861da18c54a4252fecba866341e1513fa18ccEvan Cheng const unsigned *getCalleeSavedRegs() const; 780f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng 79c2b861da18c54a4252fecba866341e1513fa18ccEvan Cheng /// getCalleeSavedRegClasses - Return a null-terminated list of the preferred 800f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng /// register classes to spill each callee-saved register with. The order and 81c2b861da18c54a4252fecba866341e1513fa18ccEvan Cheng /// length of this list match the getCalleeSavedRegs() list. 82c2b861da18c54a4252fecba866341e1513fa18ccEvan Cheng const TargetRegisterClass* const* getCalleeSavedRegClasses() const; 83b499866c05cac0e97a22c5e1f477c89096be836bAlkis Evlogimenos 84b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng /// getReservedRegs - Returns a bitset indexed by physical register number 85b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng /// indicating if a register is a special register that has particular uses and 86b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng /// should be considered unavailable at all times, e.g. SP, RA. This is used by 87b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng /// register scavenger to determine what registers are free. 88b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng BitVector getReservedRegs(const MachineFunction &MF) const; 89b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng 90dc77540d9506dc151d79b94bae88bd841880ef37Evan Cheng bool hasFP(const MachineFunction &MF) const; 91dc77540d9506dc151d79b94bae88bd841880ef37Evan Cheng 92bb07ef97cfbe88eb5d69784acab5f36815738881Chris Lattner void eliminateCallFramePseudoInstr(MachineFunction &MF, 93bb07ef97cfbe88eb5d69784acab5f36815738881Chris Lattner MachineBasicBlock &MBB, 94bb07ef97cfbe88eb5d69784acab5f36815738881Chris Lattner MachineBasicBlock::iterator MI) const; 952b46e8ecccfe8a6adc861158a21b67fb9e786885Misha Brukman 965e6df4647e15c50daea9a8a4e7f4f417a266335cEvan Cheng void eliminateFrameIndex(MachineBasicBlock::iterator MI, 975e6df4647e15c50daea9a8a4e7f4f417a266335cEvan Cheng RegScavenger *RS = NULL) const; 98b83b28697ccabfcb6b8ddbc73fb3c4554f6d17ceMisha Brukman 99bb07ef97cfbe88eb5d69784acab5f36815738881Chris Lattner void processFunctionBeforeFrameFinalized(MachineFunction &MF) const; 10003c6fafd05c067d934d15ce8f472cb09740d0133Misha Brukman 101bb07ef97cfbe88eb5d69784acab5f36815738881Chris Lattner void emitPrologue(MachineFunction &MF) const; 102bb07ef97cfbe88eb5d69784acab5f36815738881Chris Lattner void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const; 103f1d78e83356a412e525c30ac90dabf090a8cfc99Jim Laskey 104a99791886d5d4af2b900cd8cc1c9ed1677b6f0f4Jim Laskey // Debug information queries. 1054188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey unsigned getRARegister() const; 106a99791886d5d4af2b900cd8cc1c9ed1677b6f0f4Jim Laskey unsigned getFrameRegister(MachineFunction &MF) const; 1070e41094d499efa585c11904cf088016140c462d1Jim Laskey void getInitialFrameState(std::vector<MachineMove> &Moves) const; 10862819f31440fe1b1415473a89b8683b5b690d5faJim Laskey 10962819f31440fe1b1415473a89b8683b5b690d5faJim Laskey // Exception handling queries. 11062819f31440fe1b1415473a89b8683b5b690d5faJim Laskey unsigned getEHExceptionRegister() const; 11162819f31440fe1b1415473a89b8683b5b690d5faJim Laskey unsigned getEHHandlerRegister() const; 112726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner}; 113726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner 1148f7f7125e95e4fce29a4b8acbc88f708e7fae42fEvan Cheng// getX86SubSuperRegister - X86 utility function. It returns the sub or super 1158f7f7125e95e4fce29a4b8acbc88f708e7fae42fEvan Cheng// register of a specific X86 register. 1168f7f7125e95e4fce29a4b8acbc88f708e7fae42fEvan Cheng// e.g. getX86SubSuperRegister(X86::EAX, MVT::i16) return X86:AX 1178f7f7125e95e4fce29a4b8acbc88f708e7fae42fEvan Chengunsigned getX86SubSuperRegister(unsigned, MVT::ValueType, bool High=false); 1188f7f7125e95e4fce29a4b8acbc88f708e7fae42fEvan Cheng 119d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 120d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 121726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner#endif 122