diff options
Diffstat (limited to 'lib/Target/R600/SIRegisterInfo.h')
-rw-r--r-- | lib/Target/R600/SIRegisterInfo.h | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/lib/Target/R600/SIRegisterInfo.h b/lib/Target/R600/SIRegisterInfo.h index c7e54db..d908ffd 100644 --- a/lib/Target/R600/SIRegisterInfo.h +++ b/lib/Target/R600/SIRegisterInfo.h @@ -17,6 +17,7 @@ #define LLVM_LIB_TARGET_R600_SIREGISTERINFO_H #include "AMDGPURegisterInfo.h" +#include "llvm/Support/Debug.h" namespace llvm { @@ -26,8 +27,7 @@ struct SIRegisterInfo : public AMDGPURegisterInfo { BitVector getReservedRegs(const MachineFunction &MF) const override; - unsigned getRegPressureLimit(const TargetRegisterClass *RC, - MachineFunction &MF) const override; + unsigned getRegPressureSetLimit(unsigned Idx) const override; bool requiresRegisterScavenging(const MachineFunction &Fn) const override; @@ -42,7 +42,7 @@ struct SIRegisterInfo : public AMDGPURegisterInfo { unsigned getHWRegIndex(unsigned Reg) const override; /// \brief Return the 'base' register class for this register. - /// e.g. SGPR0 => SReg_32, VGPR => VReg_32 SGPR0_SGPR1 -> SReg_32, etc. + /// e.g. SGPR0 => SReg_32, VGPR => VGPR_32 SGPR0_SGPR1 -> SReg_32, etc. const TargetRegisterClass *getPhysRegClass(unsigned Reg) const; /// \returns true if this class contains only SGPR registers @@ -80,22 +80,14 @@ struct SIRegisterInfo : public AMDGPURegisterInfo { unsigned getPhysRegSubReg(unsigned Reg, const TargetRegisterClass *SubRC, unsigned Channel) const; - /// \returns True if operands defined with this register class can accept + /// \returns True if operands defined with this operand type can accept /// a literal constant (i.e. any 32-bit immediate). - bool regClassCanUseLiteralConstant(int RCID) const; + bool opCanUseLiteralConstant(unsigned OpType) const; - /// \returns True if operands defined with this register class can accept - /// a literal constant (i.e. any 32-bit immediate). - bool regClassCanUseLiteralConstant(const TargetRegisterClass *RC) const; - - /// \returns True if operands defined with this register class can accept + /// \returns True if operands defined with this operand type can accept /// an inline constant. i.e. An integer value in the range (-16, 64) or /// -4.0f, -2.0f, -1.0f, -0.5f, 0.0f, 0.5f, 1.0f, 2.0f, 4.0f. - bool regClassCanUseInlineConstant(int RCID) const; - - /// \returns True if operands defined with this register class can accept - /// a literal constant. i.e. A value in the range (-16, 64). - bool regClassCanUseInlineConstant(const TargetRegisterClass *RC) const; + bool opCanUseInlineConstant(unsigned OpType) const; enum PreloadedValue { TGID_X, @@ -113,7 +105,22 @@ struct SIRegisterInfo : public AMDGPURegisterInfo { unsigned getPreloadedValue(const MachineFunction &MF, enum PreloadedValue Value) const; - unsigned findUnusedVGPR(const MachineRegisterInfo &MRI) const; + /// \brief Give the maximum number of VGPRs that can be used by \p WaveCount + /// concurrent waves. + unsigned getNumVGPRsAllowed(unsigned WaveCount) const; + + /// \brief Give the maximum number of SGPRs that can be used by \p WaveCount + /// concurrent waves. + unsigned getNumSGPRsAllowed(unsigned WaveCount) const; + + unsigned findUnusedRegister(const MachineRegisterInfo &MRI, + const TargetRegisterClass *RC) const; + +private: + void buildScratchLoadStore(MachineBasicBlock::iterator MI, + unsigned LoadStoreOp, unsigned Value, + unsigned ScratchRsrcReg, unsigned ScratchOffset, + int64_t Offset, RegScavenger *RS) const; }; } // End namespace llvm |