10b57cec5SDimitry Andric //===- NVPTXRegisterInfo.h - NVPTX Register Information Impl ----*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file contains the NVPTX implementation of the TargetRegisterInfo class.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_NVPTX_NVPTXREGISTERINFO_H
140b57cec5SDimitry Andric #define LLVM_LIB_TARGET_NVPTX_NVPTXREGISTERINFO_H
150b57cec5SDimitry Andric 
160b57cec5SDimitry Andric #include "llvm/CodeGen/TargetRegisterInfo.h"
17bdd1243dSDimitry Andric #include "llvm/Support/StringSaver.h"
180b57cec5SDimitry Andric #include <sstream>
190b57cec5SDimitry Andric 
200b57cec5SDimitry Andric #define GET_REGINFO_HEADER
210b57cec5SDimitry Andric #include "NVPTXGenRegisterInfo.inc"
220b57cec5SDimitry Andric 
230b57cec5SDimitry Andric namespace llvm {
240b57cec5SDimitry Andric class NVPTXRegisterInfo : public NVPTXGenRegisterInfo {
250b57cec5SDimitry Andric private:
260b57cec5SDimitry Andric   // Hold Strings that can be free'd all together with NVPTXRegisterInfo
27bdd1243dSDimitry Andric   BumpPtrAllocator StrAlloc;
28bdd1243dSDimitry Andric   UniqueStringSaver StrPool;
290b57cec5SDimitry Andric 
300b57cec5SDimitry Andric public:
310b57cec5SDimitry Andric   NVPTXRegisterInfo();
320b57cec5SDimitry Andric 
330b57cec5SDimitry Andric   //------------------------------------------------------
340b57cec5SDimitry Andric   // Pure virtual functions from TargetRegisterInfo
350b57cec5SDimitry Andric   //------------------------------------------------------
360b57cec5SDimitry Andric 
370b57cec5SDimitry Andric   // NVPTX callee saved registers
380b57cec5SDimitry Andric   const MCPhysReg *getCalleeSavedRegs(const MachineFunction *MF) const override;
390b57cec5SDimitry Andric 
400b57cec5SDimitry Andric   BitVector getReservedRegs(const MachineFunction &MF) const override;
410b57cec5SDimitry Andric 
42bdd1243dSDimitry Andric   bool eliminateFrameIndex(MachineBasicBlock::iterator MI, int SPAdj,
430b57cec5SDimitry Andric                            unsigned FIOperandNum,
440b57cec5SDimitry Andric                            RegScavenger *RS = nullptr) const override;
450b57cec5SDimitry Andric 
460b57cec5SDimitry Andric   Register getFrameRegister(const MachineFunction &MF) const override;
47349cc55cSDimitry Andric   Register getFrameLocalRegister(const MachineFunction &MF) const;
480b57cec5SDimitry Andric 
getStrPool()49bdd1243dSDimitry Andric   UniqueStringSaver &getStrPool() const {
50bdd1243dSDimitry Andric     return const_cast<UniqueStringSaver &>(StrPool);
510b57cec5SDimitry Andric   }
520b57cec5SDimitry Andric 
getName(unsigned RegNo)530b57cec5SDimitry Andric   const char *getName(unsigned RegNo) const {
540b57cec5SDimitry Andric     std::stringstream O;
550b57cec5SDimitry Andric     O << "reg" << RegNo;
56bdd1243dSDimitry Andric     return getStrPool().save(O.str()).data();
570b57cec5SDimitry Andric   }
580b57cec5SDimitry Andric 
590b57cec5SDimitry Andric };
600b57cec5SDimitry Andric 
610b57cec5SDimitry Andric std::string getNVPTXRegClassName(const TargetRegisterClass *RC);
620b57cec5SDimitry Andric std::string getNVPTXRegClassStr(const TargetRegisterClass *RC);
630b57cec5SDimitry Andric 
640b57cec5SDimitry Andric } // end namespace llvm
650b57cec5SDimitry Andric 
660b57cec5SDimitry Andric #endif
67