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#include "NVPTXRegisterInfo.h" 15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "NVPTX.h" 1649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTXSubtarget.h" 1749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/ADT/BitVector.h" 1849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/CodeGen/MachineFrameInfo.h" 19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineFunction.h" 20d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineInstrBuilder.h" 2149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/MC/MachineLocation.h" 2249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Target/TargetInstrInfo.h" 2349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 2449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiusing namespace llvm; 2549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "nvptx-reg-info" 27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 283639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskinamespace llvm { 293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskistd::string getNVPTXRegClassName(TargetRegisterClass const *RC) { 3049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski if (RC == &NVPTX::Float32RegsRegClass) { 3149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return ".f32"; 3249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 3349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski if (RC == &NVPTX::Float64RegsRegClass) { 3449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return ".f64"; 353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski } else if (RC == &NVPTX::Int64RegsRegClass) { 3649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return ".s64"; 373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski } else if (RC == &NVPTX::Int32RegsRegClass) { 3849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return ".s32"; 393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski } else if (RC == &NVPTX::Int16RegsRegClass) { 4049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return ".s16"; 413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski } else if (RC == &NVPTX::Int1RegsRegClass) { 4249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return ".pred"; 433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski } else if (RC == &NVPTX::SpecialRegsRegClass) { 4449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return "!Special!"; 453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski } else { 4649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return "INTERNAL"; 4749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 4849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return ""; 4949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 5049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskistd::string getNVPTXRegClassStr(TargetRegisterClass const *RC) { 5249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski if (RC == &NVPTX::Float32RegsRegClass) { 5349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return "%f"; 5449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 5549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski if (RC == &NVPTX::Float64RegsRegClass) { 565443e7d79044f3198f2da044f1b389b40d9bea6fJustin Holewinski return "%fl"; 573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski } else if (RC == &NVPTX::Int64RegsRegClass) { 585443e7d79044f3198f2da044f1b389b40d9bea6fJustin Holewinski return "%rl"; 593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski } else if (RC == &NVPTX::Int32RegsRegClass) { 6049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return "%r"; 613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski } else if (RC == &NVPTX::Int16RegsRegClass) { 6249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return "%rs"; 633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski } else if (RC == &NVPTX::Int1RegsRegClass) { 6449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return "%p"; 653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski } else if (RC == &NVPTX::SpecialRegsRegClass) { 6649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return "!Special!"; 673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski } else { 6849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return "INTERNAL"; 6949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 7049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return ""; 7149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 7249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 7349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 740c92f2a1c73aeccc9e0f4deadcad8dc563dec225Bill WendlingNVPTXRegisterInfo::NVPTXRegisterInfo(const NVPTXSubtarget &st) 753639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski : NVPTXGenRegisterInfo(0), Is64Bit(st.is64Bit()) {} 7649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 7749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#define GET_REGINFO_TARGET_DESC 7849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTXGenRegisterInfo.inc" 7949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 8049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/// NVPTX Callee Saved Registers 81dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesconst MCPhysReg * 823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin HolewinskiNVPTXRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const { 83dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines static const MCPhysReg CalleeSavedRegs[] = { 0 }; 8449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return CalleeSavedRegs; 8549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 8649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 8749683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiBitVector NVPTXRegisterInfo::getReservedRegs(const MachineFunction &MF) const { 8849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski BitVector Reserved(getNumRegs()); 8949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return Reserved; 9049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 9149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskivoid NVPTXRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, 933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski int SPAdj, unsigned FIOperandNum, 943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski RegScavenger *RS) const { 9549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski assert(SPAdj == 0 && "Unexpected"); 9649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 9749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski MachineInstr &MI = *II; 98108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier int FrameIndex = MI.getOperand(FIOperandNum).getIndex(); 9949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 10049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski MachineFunction &MF = *MI.getParent()->getParent(); 10149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex) + 1023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski MI.getOperand(FIOperandNum + 1).getImm(); 10349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 10449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski // Using I0 as the frame pointer 105108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier MI.getOperand(FIOperandNum).ChangeToRegister(NVPTX::VRFrame, false); 1063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski MI.getOperand(FIOperandNum + 1).ChangeToImmediate(Offset); 10749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 10849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 10949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiunsigned NVPTXRegisterInfo::getFrameRegister(const MachineFunction &MF) const { 11049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return NVPTX::VRFrame; 11149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 112