131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- X86RegisterInfo.h - X86 Register Information Impl -------*- C++ -*-===//
20e0a7a45d3d0a8c865a078459d2e1c6d8967a100Misha Brukman//
3856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell//                     The LLVM Compiler Infrastructure
4856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
70e0a7a45d3d0a8c865a078459d2e1c6d8967a100Misha Brukman//
8856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell//===----------------------------------------------------------------------===//
9726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner//
106f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman// This file contains the X86 implementation of the TargetRegisterInfo class.
11726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner//
12726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner//===----------------------------------------------------------------------===//
13726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner
14726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner#ifndef X86REGISTERINFO_H
15726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner#define X86REGISTERINFO_H
16726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner
176f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman#include "llvm/Target/TargetRegisterInfo.h"
1873f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
1973f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng#define GET_REGINFO_HEADER
2073f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng#include "X86GenRegisterInfo.inc"
216811c6e1d72e55f79202b69acd15f6098967913eChris Lattner
22d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
232926869b4a083fc951484de03a9867eabf81e880Chris Lattner  class Type;
242926869b4a083fc951484de03a9867eabf81e880Chris Lattner  class TargetInstrInfo;
25cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  class X86Subtarget;
26d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass X86RegisterInfo final : public X86GenRegisterInfo {
28d41b30def3181bce4bf87e8bde664d15663165d0Jeff Cohenpublic:
29cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const X86Subtarget &Subtarget;
30d41b30def3181bce4bf87e8bde664d15663165d0Jeff Cohen
3125ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Chengprivate:
3225ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng  /// Is64Bit - Is the target 64-bits.
337f3394f3796883707961f2f61ea761cee15a0308Evan Cheng  ///
3425ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng  bool Is64Bit;
3525ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng
361dcce2148d855af67f845319414a94db5601be3eAnton Korobeynikov  /// IsWin64 - Is the target on of win64 flavours
371dcce2148d855af67f845319414a94db5601be3eAnton Korobeynikov  ///
381dcce2148d855af67f845319414a94db5601be3eAnton Korobeynikov  bool IsWin64;
391dcce2148d855af67f845319414a94db5601be3eAnton Korobeynikov
4025ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng  /// SlotSize - Stack slot size in bytes.
417f3394f3796883707961f2f61ea761cee15a0308Evan Cheng  ///
4225ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng  unsigned SlotSize;
4325ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng
4425ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng  /// StackPtr - X86 physical register used as stack ptr.
457f3394f3796883707961f2f61ea761cee15a0308Evan Cheng  ///
4625ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng  unsigned StackPtr;
4725ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng
4825ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng  /// FramePtr - X86 physical register used as frame ptr.
497f3394f3796883707961f2f61ea761cee15a0308Evan Cheng  ///
5025ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng  unsigned FramePtr;
5125ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng
523f0dbab963197cadb32f70e1ee1a106fe35f5c8eChad Rosier  /// BasePtr - X86 physical register used as a base ptr in complex stack
533f0dbab963197cadb32f70e1ee1a106fe35f5c8eChad Rosier  /// frames. I.e., when we need a 3rd base, not just SP and FP, due to
543f0dbab963197cadb32f70e1ee1a106fe35f5c8eChad Rosier  /// variable size stack objects.
553f0dbab963197cadb32f70e1ee1a106fe35f5c8eChad Rosier  unsigned BasePtr;
563f0dbab963197cadb32f70e1ee1a106fe35f5c8eChad Rosier
5725ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Chengpublic:
58cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  X86RegisterInfo(const X86Subtarget &STI);
596811c6e1d72e55f79202b69acd15f6098967913eChris Lattner
606b918b84661687f7b5fc92dabd6d58e258bf39f2Charles Davis  // FIXME: This should be tablegen'd like getDwarfRegNum is
616b918b84661687f7b5fc92dabd6d58e258bf39f2Charles Davis  int getSEHRegNum(unsigned i) const;
626b918b84661687f7b5fc92dabd6d58e258bf39f2Charles Davis
63128aff4f9502a99af3573b98eb254490b3137646Chris Lattner  /// Code Generation virtual methods...
646a8c7bf8e72338e55f0f9583e1828f62da165d4aPreston Gurd  ///
6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool trackLivenessAfterRegAlloc(const MachineFunction &MF) const override;
6623066288fdf4867f53f208f9aaf2952b1c049394Evan Cheng
675248468473f0488a652b545ad95f7abda302b7b5Evan Cheng  /// getMatchingSuperRegClass - Return a subclass of the specified register
685248468473f0488a652b545ad95f7abda302b7b5Evan Cheng  /// class A so that each register in it has a sub-register of the
695248468473f0488a652b545ad95f7abda302b7b5Evan Cheng  /// specified sub-register index which is in the specified register class B.
7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const TargetRegisterClass *
715248468473f0488a652b545ad95f7abda302b7b5Evan Cheng  getMatchingSuperRegClass(const TargetRegisterClass *A,
7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                           const TargetRegisterClass *B,
7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                           unsigned Idx) const override;
745248468473f0488a652b545ad95f7abda302b7b5Evan Cheng
7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const TargetRegisterClass *
7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  getSubClassWithSubReg(const TargetRegisterClass *RC,
7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        unsigned Idx) const override;
789bb272c900b46ebf78aa1b9daa7e3991bec8ff18Jakob Stoklund Olesen
79c9e5015dece0a1a73bec358e11bc87594831279dJakob Stoklund Olesen  const TargetRegisterClass*
8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  getLargestLegalSuperClass(const TargetRegisterClass *RC) const override;
81c9e5015dece0a1a73bec358e11bc87594831279dJakob Stoklund Olesen
82770bcc7b15adbc978800db70dbb1c3c22913b52cEvan Cheng  /// getPointerRegClass - Returns a TargetRegisterClass used for pointer
83770bcc7b15adbc978800db70dbb1c3c22913b52cEvan Cheng  /// values.
84397fc4874efe9c17e737d4c5c50bd19dc3bf27f5Jakob Stoklund Olesen  const TargetRegisterClass *
8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  getPointerRegClass(const MachineFunction &MF,
8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                     unsigned Kind = 0) const override;
87770bcc7b15adbc978800db70dbb1c3c22913b52cEvan Cheng
8823066288fdf4867f53f208f9aaf2952b1c049394Evan Cheng  /// getCrossCopyRegClass - Returns a legal register class to copy a register
8923066288fdf4867f53f208f9aaf2952b1c049394Evan Cheng  /// in the specified class to or from. Returns NULL if it is possible to copy
9023066288fdf4867f53f208f9aaf2952b1c049394Evan Cheng  /// between a two registers of the specified class.
91ff110265753c19daf0468ee1facf357460497b7eEvan Cheng  const TargetRegisterClass *
9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  getCrossCopyRegClass(const TargetRegisterClass *RC) const override;
93ff110265753c19daf0468ee1facf357460497b7eEvan Cheng
94be2119e8e2bc7006cfd638a24367acbfda625d16Cameron Zwarich  unsigned getRegPressureLimit(const TargetRegisterClass *RC,
9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                               MachineFunction &MF) const override;
96be2119e8e2bc7006cfd638a24367acbfda625d16Cameron Zwarich
97c2b861da18c54a4252fecba866341e1513fa18ccEvan Cheng  /// getCalleeSavedRegs - Return a null-terminated list of all of the
980f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng  /// callee-save registers on this target.
99dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MCPhysReg *
10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  getCalleeSavedRegs(const MachineFunction* MF) const override;
10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const uint32_t *getCallPreservedMask(CallingConv::ID) const override;
1026c0e04c823cf4034214b050e338c99a401edd2acMichael Liao  const uint32_t *getNoPreservedMask() const;
1030f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng
104b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  /// getReservedRegs - Returns a bitset indexed by physical register number
105b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  /// indicating if a register is a special register that has particular uses and
106b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  /// should be considered unavailable at all times, e.g. SP, RA. This is used by
107b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  /// register scavenger to determine what registers are free.
10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  BitVector getReservedRegs(const MachineFunction &MF) const override;
109b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
1103f0dbab963197cadb32f70e1ee1a106fe35f5c8eChad Rosier  bool hasBasePointer(const MachineFunction &MF) const;
1113f0dbab963197cadb32f70e1ee1a106fe35f5c8eChad Rosier
112e45ab8a0a90e4f3a59d8c38038ae3e495ee1fef3Jim Grosbach  bool canRealignStack(const MachineFunction &MF) const;
113e45ab8a0a90e4f3a59d8c38038ae3e495ee1fef3Jim Grosbach
11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool needsStackRealignment(const MachineFunction &MF) const override;
1159bbbea568c6a48a5be6a5f7c1449c164fed55e70Anton Korobeynikov
11672852a8cfb605056d87b644d2e36b1346051413dEric Christopher  bool hasReservedSpillSlot(const MachineFunction &MF, unsigned Reg,
11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                            int &FrameIdx) const override;
118910139f9ca53fc20a680d51ae61bb1e072095141Evan Cheng
119fcb4a8ead3cd8d9540d5eaa448af5d14a0ee341aJim Grosbach  void eliminateFrameIndex(MachineBasicBlock::iterator MI,
120108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier                           int SPAdj, unsigned FIOperandNum,
121dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                           RegScavenger *RS = nullptr) const override;
122b83b28697ccabfcb6b8ddbc73fb3c4554f6d17ceMisha Brukman
123a99791886d5d4af2b900cd8cc1c9ed1677b6f0f4Jim Laskey  // Debug information queries.
12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned getFrameRegister(const MachineFunction &MF) const override;
12533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  unsigned getStackRegister() const { return StackPtr; }
1263f0dbab963197cadb32f70e1ee1a106fe35f5c8eChad Rosier  unsigned getBaseRegister() const { return BasePtr; }
12733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  // FIXME: Move to FrameInfok
12833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  unsigned getSlotSize() const { return SlotSize; }
129726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner};
130726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner
1318f7f7125e95e4fce29a4b8acbc88f708e7fae42fEvan Cheng// getX86SubSuperRegister - X86 utility function. It returns the sub or super
1328f7f7125e95e4fce29a4b8acbc88f708e7fae42fEvan Cheng// register of a specific X86 register.
133f4d25a2c461f7a64fcc643a6ea2541e87067d036Craig Topper// e.g. getX86SubSuperRegister(X86::EAX, MVT::i16) return X86:AX
134f4d25a2c461f7a64fcc643a6ea2541e87067d036Craig Topperunsigned getX86SubSuperRegister(unsigned, MVT::SimpleValueType, bool High=false);
1358f7f7125e95e4fce29a4b8acbc88f708e7fae42fEvan Cheng
136e3809eed34f000581a464689596eefde2a6d1f24Elena Demikhovsky//get512BitRegister - X86 utility - returns 512-bit super register
137e3809eed34f000581a464689596eefde2a6d1f24Elena Demikhovskyunsigned get512BitSuperRegister(unsigned Reg);
138e3809eed34f000581a464689596eefde2a6d1f24Elena Demikhovsky
139d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
140d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
141726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner#endif
142