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