X86RegisterInfo.h revision 0e41094d499efa585c11904cf088016140c462d1
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; 616811c6e1d72e55f79202b69acd15f6098967913eChris Lattner 625a051f65d3074126b762eaf44b30c44e996577feChris Lattner /// foldMemoryOperand - If this target supports it, fold a load or store of 635a051f65d3074126b762eaf44b30c44e996577feChris Lattner /// the specified stack slot into the specified machine instruction for the 645a051f65d3074126b762eaf44b30c44e996577feChris Lattner /// specified operand. If this is possible, the target should perform the 655a051f65d3074126b762eaf44b30c44e996577feChris Lattner /// folding and return true, otherwise it should return false. If it folds 665a051f65d3074126b762eaf44b30c44e996577feChris Lattner /// the instruction, it is likely that the MachineInstruction the iterator 675a051f65d3074126b762eaf44b30c44e996577feChris Lattner /// references has been changed. 680f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng MachineInstr* foldMemoryOperand(MachineInstr* MI, 690f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng unsigned OpNum, 700f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng int FrameIndex) const; 710f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng 72c2b861da18c54a4252fecba866341e1513fa18ccEvan Cheng /// getCalleeSavedRegs - Return a null-terminated list of all of the 730f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng /// callee-save registers on this target. 74c2b861da18c54a4252fecba866341e1513fa18ccEvan Cheng const unsigned *getCalleeSavedRegs() const; 750f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng 76c2b861da18c54a4252fecba866341e1513fa18ccEvan Cheng /// getCalleeSavedRegClasses - Return a null-terminated list of the preferred 770f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng /// register classes to spill each callee-saved register with. The order and 78c2b861da18c54a4252fecba866341e1513fa18ccEvan Cheng /// length of this list match the getCalleeSavedRegs() list. 79c2b861da18c54a4252fecba866341e1513fa18ccEvan Cheng const TargetRegisterClass* const* getCalleeSavedRegClasses() const; 80b499866c05cac0e97a22c5e1f477c89096be836bAlkis Evlogimenos 81dc77540d9506dc151d79b94bae88bd841880ef37Evan Cheng bool hasFP(const MachineFunction &MF) const; 82dc77540d9506dc151d79b94bae88bd841880ef37Evan Cheng 83bb07ef97cfbe88eb5d69784acab5f36815738881Chris Lattner void eliminateCallFramePseudoInstr(MachineFunction &MF, 84bb07ef97cfbe88eb5d69784acab5f36815738881Chris Lattner MachineBasicBlock &MBB, 85bb07ef97cfbe88eb5d69784acab5f36815738881Chris Lattner MachineBasicBlock::iterator MI) const; 862b46e8ecccfe8a6adc861158a21b67fb9e786885Misha Brukman 87f8be5e94aaf70d53dc043f5e541fc0bf6771db22Nate Begeman void eliminateFrameIndex(MachineBasicBlock::iterator MI) const; 88b83b28697ccabfcb6b8ddbc73fb3c4554f6d17ceMisha Brukman 89bb07ef97cfbe88eb5d69784acab5f36815738881Chris Lattner void processFunctionBeforeFrameFinalized(MachineFunction &MF) const; 9003c6fafd05c067d934d15ce8f472cb09740d0133Misha Brukman 91bb07ef97cfbe88eb5d69784acab5f36815738881Chris Lattner void emitPrologue(MachineFunction &MF) const; 92bb07ef97cfbe88eb5d69784acab5f36815738881Chris Lattner void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const; 93f1d78e83356a412e525c30ac90dabf090a8cfc99Jim Laskey 94a99791886d5d4af2b900cd8cc1c9ed1677b6f0f4Jim Laskey // Debug information queries. 954188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey unsigned getRARegister() const; 96a99791886d5d4af2b900cd8cc1c9ed1677b6f0f4Jim Laskey unsigned getFrameRegister(MachineFunction &MF) const; 970e41094d499efa585c11904cf088016140c462d1Jim Laskey void getInitialFrameState(std::vector<MachineMove> &Moves) const; 98726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner}; 99726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner 1008f7f7125e95e4fce29a4b8acbc88f708e7fae42fEvan Cheng// getX86SubSuperRegister - X86 utility function. It returns the sub or super 1018f7f7125e95e4fce29a4b8acbc88f708e7fae42fEvan Cheng// register of a specific X86 register. 1028f7f7125e95e4fce29a4b8acbc88f708e7fae42fEvan Cheng// e.g. getX86SubSuperRegister(X86::EAX, MVT::i16) return X86:AX 1038f7f7125e95e4fce29a4b8acbc88f708e7fae42fEvan Chengunsigned getX86SubSuperRegister(unsigned, MVT::ValueType, bool High=false); 1048f7f7125e95e4fce29a4b8acbc88f708e7fae42fEvan Cheng 105d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 106d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 107726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner#endif 108