X86RegisterInfo.h revision dc77540d9506dc151d79b94bae88bd841880ef37
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;
97726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner};
98726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner
998f7f7125e95e4fce29a4b8acbc88f708e7fae42fEvan Cheng// getX86SubSuperRegister - X86 utility function. It returns the sub or super
1008f7f7125e95e4fce29a4b8acbc88f708e7fae42fEvan Cheng// register of a specific X86 register.
1018f7f7125e95e4fce29a4b8acbc88f708e7fae42fEvan Cheng// e.g. getX86SubSuperRegister(X86::EAX, MVT::i16) return X86:AX
1028f7f7125e95e4fce29a4b8acbc88f708e7fae42fEvan Chengunsigned getX86SubSuperRegister(unsigned, MVT::ValueType, bool High=false);
1038f7f7125e95e4fce29a4b8acbc88f708e7fae42fEvan Cheng
104d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
105d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
106726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner#endif
107