149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===- NVPTXRegisterInfo.cpp - NVPTX Register Information -----------------===// 249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// 349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// The LLVM Compiler Infrastructure 449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// 549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// This file is distributed under the University of Illinois Open Source 649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// License. See LICENSE.TXT for details. 749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// 849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===----------------------------------------------------------------------===// 949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// 1049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// This file contains the NVPTX implementation of the TargetRegisterInfo class. 1149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// 1249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===----------------------------------------------------------------------===// 1349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 1449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#define DEBUG_TYPE "nvptx-reg-info" 1549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 1649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTXRegisterInfo.h" 17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "NVPTX.h" 1849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTXSubtarget.h" 1949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/ADT/BitVector.h" 2049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/CodeGen/MachineFrameInfo.h" 21d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineFunction.h" 22d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineInstrBuilder.h" 2349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/MC/MachineLocation.h" 2449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Target/TargetInstrInfo.h" 2549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 2649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 2749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiusing namespace llvm; 2849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 2949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskinamespace llvm 3049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski{ 3149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskistd::string getNVPTXRegClassName (TargetRegisterClass const *RC) { 3249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski if (RC == &NVPTX::Float32RegsRegClass) { 3349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return ".f32"; 3449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 3549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski if (RC == &NVPTX::Float64RegsRegClass) { 3649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return ".f64"; 3749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 3849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski else if (RC == &NVPTX::Int64RegsRegClass) { 3949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return ".s64"; 4049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 4149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski else if (RC == &NVPTX::Int32RegsRegClass) { 4249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return ".s32"; 4349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 4449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski else if (RC == &NVPTX::Int16RegsRegClass) { 4549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return ".s16"; 4649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 4749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski // Int8Regs become 16-bit registers in PTX 4849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski else if (RC == &NVPTX::Int8RegsRegClass) { 4949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return ".s16"; 5049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 5149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski else if (RC == &NVPTX::Int1RegsRegClass) { 5249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return ".pred"; 5349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 5449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski else if (RC == &NVPTX::SpecialRegsRegClass) { 5549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return "!Special!"; 5649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 5749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski else { 5849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return "INTERNAL"; 5949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 6049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return ""; 6149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 6249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 6349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskistd::string getNVPTXRegClassStr (TargetRegisterClass const *RC) { 6449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski if (RC == &NVPTX::Float32RegsRegClass) { 6549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return "%f"; 6649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 6749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski if (RC == &NVPTX::Float64RegsRegClass) { 6849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return "%fd"; 6949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 7049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski else if (RC == &NVPTX::Int64RegsRegClass) { 7149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return "%rd"; 7249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 7349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski else if (RC == &NVPTX::Int32RegsRegClass) { 7449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return "%r"; 7549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 7649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski else if (RC == &NVPTX::Int16RegsRegClass) { 7749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return "%rs"; 7849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 7949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski else if (RC == &NVPTX::Int8RegsRegClass) { 8049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return "%rc"; 8149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 8249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski else if (RC == &NVPTX::Int1RegsRegClass) { 8349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return "%p"; 8449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 8549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski else if (RC == &NVPTX::SpecialRegsRegClass) { 8649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return "!Special!"; 8749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 8849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski else { 8949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return "INTERNAL"; 9049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 9149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return ""; 9249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 9349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 9449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 9549683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiNVPTXRegisterInfo::NVPTXRegisterInfo(const TargetInstrInfo &tii, 9649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski const NVPTXSubtarget &st) 9795a9d937728ca9cf2bf44f86ff1184df318b3bd7Benjamin Kramer : NVPTXGenRegisterInfo(0), 9895a9d937728ca9cf2bf44f86ff1184df318b3bd7Benjamin Kramer Is64Bit(st.is64Bit()) {} 9949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 10049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#define GET_REGINFO_TARGET_DESC 10149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTXGenRegisterInfo.inc" 10249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 10349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/// NVPTX Callee Saved Registers 10449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiconst uint16_t* NVPTXRegisterInfo:: 10549683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskigetCalleeSavedRegs(const MachineFunction *MF) const { 10649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski static const uint16_t CalleeSavedRegs[] = { 0 }; 10749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return CalleeSavedRegs; 10849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 10949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 11049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// NVPTX Callee Saved Reg Classes 11149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiconst TargetRegisterClass* const* 11249683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiNVPTXRegisterInfo::getCalleeSavedRegClasses(const MachineFunction *MF) const { 11349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski static const TargetRegisterClass * const CalleeSavedRegClasses[] = { 0 }; 11449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return CalleeSavedRegClasses; 11549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 11649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 11749683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiBitVector NVPTXRegisterInfo::getReservedRegs(const MachineFunction &MF) const { 11849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski BitVector Reserved(getNumRegs()); 11949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return Reserved; 12049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 12149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 12249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskivoid NVPTXRegisterInfo:: 12349683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskieliminateFrameIndex(MachineBasicBlock::iterator II, 124108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier int SPAdj, unsigned FIOperandNum, 12549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski RegScavenger *RS) const { 12649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski assert(SPAdj == 0 && "Unexpected"); 12749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 12849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski MachineInstr &MI = *II; 129108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier int FrameIndex = MI.getOperand(FIOperandNum).getIndex(); 13049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 13149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski MachineFunction &MF = *MI.getParent()->getParent(); 13249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex) + 133108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier MI.getOperand(FIOperandNum+1).getImm(); 13449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 13549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski // Using I0 as the frame pointer 136108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier MI.getOperand(FIOperandNum).ChangeToRegister(NVPTX::VRFrame, false); 137108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier MI.getOperand(FIOperandNum+1).ChangeToImmediate(Offset); 13849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 13949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 14049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiint NVPTXRegisterInfo:: 14149683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskigetDwarfRegNum(unsigned RegNum, bool isEH) const { 14249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return 0; 14349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 14449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 14549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiunsigned NVPTXRegisterInfo::getFrameRegister(const MachineFunction &MF) const { 14649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return NVPTX::VRFrame; 14749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 14849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 14949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiunsigned NVPTXRegisterInfo::getRARegister() const { 15049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return 0; 15149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 15249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 153