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