diff options
Diffstat (limited to 'lib/Target/R600/SIRegisterInfo.h')
-rw-r--r-- | lib/Target/R600/SIRegisterInfo.h | 62 |
1 files changed, 54 insertions, 8 deletions
diff --git a/lib/Target/R600/SIRegisterInfo.h b/lib/Target/R600/SIRegisterInfo.h index c9305fb..c7e54db 100644 --- a/lib/Target/R600/SIRegisterInfo.h +++ b/lib/Target/R600/SIRegisterInfo.h @@ -13,8 +13,8 @@ //===----------------------------------------------------------------------===// -#ifndef SIREGISTERINFO_H_ -#define SIREGISTERINFO_H_ +#ifndef LLVM_LIB_TARGET_R600_SIREGISTERINFO_H +#define LLVM_LIB_TARGET_R600_SIREGISTERINFO_H #include "AMDGPURegisterInfo.h" @@ -29,6 +29,12 @@ struct SIRegisterInfo : public AMDGPURegisterInfo { unsigned getRegPressureLimit(const TargetRegisterClass *RC, MachineFunction &MF) const override; + bool requiresRegisterScavenging(const MachineFunction &Fn) const override; + + void eliminateFrameIndex(MachineBasicBlock::iterator MI, int SPAdj, + unsigned FIOperandNum, + RegScavenger *RS) const override; + /// \brief get the register class of the specified type to use in the /// CFGStructurizer const TargetRegisterClass * getCFGStructurizerRegClass(MVT VT) const override; @@ -40,7 +46,20 @@ struct SIRegisterInfo : public AMDGPURegisterInfo { const TargetRegisterClass *getPhysRegClass(unsigned Reg) const; /// \returns true if this class contains only SGPR registers - bool isSGPRClass(const TargetRegisterClass *RC) const; + bool isSGPRClass(const TargetRegisterClass *RC) const { + if (!RC) + return false; + + return !hasVGPRs(RC); + } + + /// \returns true if this class ID contains only SGPR registers + bool isSGPRClassID(unsigned RCID) const { + if (static_cast<int>(RCID) == -1) + return false; + + return isSGPRClass(getRegClass(RCID)); + } /// \returns true if this class contains VGPR registers. bool hasVGPRs(const TargetRegisterClass *RC) const; @@ -62,14 +81,41 @@ struct SIRegisterInfo : public AMDGPURegisterInfo { unsigned Channel) const; /// \returns True if operands defined with this register class can accept - /// inline immediates. - bool regClassCanUseImmediate(int RCID) const; + /// a literal constant (i.e. any 32-bit immediate). + bool regClassCanUseLiteralConstant(int RCID) 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 + /// 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 - /// inline immediates. - bool regClassCanUseImmediate(const TargetRegisterClass *RC) const; + /// a literal constant. i.e. A value in the range (-16, 64). + bool regClassCanUseInlineConstant(const TargetRegisterClass *RC) const; + + enum PreloadedValue { + TGID_X, + TGID_Y, + TGID_Z, + SCRATCH_WAVE_OFFSET, + SCRATCH_PTR, + INPUT_PTR, + TIDIG_X, + TIDIG_Y, + TIDIG_Z + }; + + /// \brief Returns the physical register that \p Value is stored in. + unsigned getPreloadedValue(const MachineFunction &MF, + enum PreloadedValue Value) const; + + unsigned findUnusedVGPR(const MachineRegisterInfo &MRI) const; }; } // End namespace llvm -#endif // SIREGISTERINFO_H_ +#endif |