1*9880d681SAndroid Build Coastguard Worker //===- NVPTXRegisterInfo.cpp - NVPTX Register Information -----------------===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // This file contains the NVPTX implementation of the TargetRegisterInfo class. 11*9880d681SAndroid Build Coastguard Worker // 12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker #include "NVPTXRegisterInfo.h" 15*9880d681SAndroid Build Coastguard Worker #include "NVPTX.h" 16*9880d681SAndroid Build Coastguard Worker #include "NVPTXSubtarget.h" 17*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/BitVector.h" 18*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineFrameInfo.h" 19*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineFunction.h" 20*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineInstrBuilder.h" 21*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MachineLocation.h" 22*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetInstrInfo.h" 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker using namespace llvm; 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker #define DEBUG_TYPE "nvptx-reg-info" 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker namespace llvm { getNVPTXRegClassName(TargetRegisterClass const * RC)29*9880d681SAndroid Build Coastguard Workerstd::string getNVPTXRegClassName(TargetRegisterClass const *RC) { 30*9880d681SAndroid Build Coastguard Worker if (RC == &NVPTX::Float32RegsRegClass) { 31*9880d681SAndroid Build Coastguard Worker return ".f32"; 32*9880d681SAndroid Build Coastguard Worker } 33*9880d681SAndroid Build Coastguard Worker if (RC == &NVPTX::Float64RegsRegClass) { 34*9880d681SAndroid Build Coastguard Worker return ".f64"; 35*9880d681SAndroid Build Coastguard Worker } else if (RC == &NVPTX::Int64RegsRegClass) { 36*9880d681SAndroid Build Coastguard Worker return ".s64"; 37*9880d681SAndroid Build Coastguard Worker } else if (RC == &NVPTX::Int32RegsRegClass) { 38*9880d681SAndroid Build Coastguard Worker return ".s32"; 39*9880d681SAndroid Build Coastguard Worker } else if (RC == &NVPTX::Int16RegsRegClass) { 40*9880d681SAndroid Build Coastguard Worker return ".s16"; 41*9880d681SAndroid Build Coastguard Worker } else if (RC == &NVPTX::Int1RegsRegClass) { 42*9880d681SAndroid Build Coastguard Worker return ".pred"; 43*9880d681SAndroid Build Coastguard Worker } else if (RC == &NVPTX::SpecialRegsRegClass) { 44*9880d681SAndroid Build Coastguard Worker return "!Special!"; 45*9880d681SAndroid Build Coastguard Worker } else { 46*9880d681SAndroid Build Coastguard Worker return "INTERNAL"; 47*9880d681SAndroid Build Coastguard Worker } 48*9880d681SAndroid Build Coastguard Worker return ""; 49*9880d681SAndroid Build Coastguard Worker } 50*9880d681SAndroid Build Coastguard Worker getNVPTXRegClassStr(TargetRegisterClass const * RC)51*9880d681SAndroid Build Coastguard Workerstd::string getNVPTXRegClassStr(TargetRegisterClass const *RC) { 52*9880d681SAndroid Build Coastguard Worker if (RC == &NVPTX::Float32RegsRegClass) { 53*9880d681SAndroid Build Coastguard Worker return "%f"; 54*9880d681SAndroid Build Coastguard Worker } 55*9880d681SAndroid Build Coastguard Worker if (RC == &NVPTX::Float64RegsRegClass) { 56*9880d681SAndroid Build Coastguard Worker return "%fd"; 57*9880d681SAndroid Build Coastguard Worker } else if (RC == &NVPTX::Int64RegsRegClass) { 58*9880d681SAndroid Build Coastguard Worker return "%rd"; 59*9880d681SAndroid Build Coastguard Worker } else if (RC == &NVPTX::Int32RegsRegClass) { 60*9880d681SAndroid Build Coastguard Worker return "%r"; 61*9880d681SAndroid Build Coastguard Worker } else if (RC == &NVPTX::Int16RegsRegClass) { 62*9880d681SAndroid Build Coastguard Worker return "%rs"; 63*9880d681SAndroid Build Coastguard Worker } else if (RC == &NVPTX::Int1RegsRegClass) { 64*9880d681SAndroid Build Coastguard Worker return "%p"; 65*9880d681SAndroid Build Coastguard Worker } else if (RC == &NVPTX::SpecialRegsRegClass) { 66*9880d681SAndroid Build Coastguard Worker return "!Special!"; 67*9880d681SAndroid Build Coastguard Worker } else { 68*9880d681SAndroid Build Coastguard Worker return "INTERNAL"; 69*9880d681SAndroid Build Coastguard Worker } 70*9880d681SAndroid Build Coastguard Worker return ""; 71*9880d681SAndroid Build Coastguard Worker } 72*9880d681SAndroid Build Coastguard Worker } 73*9880d681SAndroid Build Coastguard Worker NVPTXRegisterInfo()74*9880d681SAndroid Build Coastguard WorkerNVPTXRegisterInfo::NVPTXRegisterInfo() : NVPTXGenRegisterInfo(0) {} 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker #define GET_REGINFO_TARGET_DESC 77*9880d681SAndroid Build Coastguard Worker #include "NVPTXGenRegisterInfo.inc" 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker /// NVPTX Callee Saved Registers 80*9880d681SAndroid Build Coastguard Worker const MCPhysReg * getCalleeSavedRegs(const MachineFunction *) const81*9880d681SAndroid Build Coastguard WorkerNVPTXRegisterInfo::getCalleeSavedRegs(const MachineFunction *) const { 82*9880d681SAndroid Build Coastguard Worker static const MCPhysReg CalleeSavedRegs[] = { 0 }; 83*9880d681SAndroid Build Coastguard Worker return CalleeSavedRegs; 84*9880d681SAndroid Build Coastguard Worker } 85*9880d681SAndroid Build Coastguard Worker getReservedRegs(const MachineFunction & MF) const86*9880d681SAndroid Build Coastguard WorkerBitVector NVPTXRegisterInfo::getReservedRegs(const MachineFunction &MF) const { 87*9880d681SAndroid Build Coastguard Worker BitVector Reserved(getNumRegs()); 88*9880d681SAndroid Build Coastguard Worker return Reserved; 89*9880d681SAndroid Build Coastguard Worker } 90*9880d681SAndroid Build Coastguard Worker eliminateFrameIndex(MachineBasicBlock::iterator II,int SPAdj,unsigned FIOperandNum,RegScavenger * RS) const91*9880d681SAndroid Build Coastguard Workervoid NVPTXRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, 92*9880d681SAndroid Build Coastguard Worker int SPAdj, unsigned FIOperandNum, 93*9880d681SAndroid Build Coastguard Worker RegScavenger *RS) const { 94*9880d681SAndroid Build Coastguard Worker assert(SPAdj == 0 && "Unexpected"); 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker MachineInstr &MI = *II; 97*9880d681SAndroid Build Coastguard Worker int FrameIndex = MI.getOperand(FIOperandNum).getIndex(); 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker MachineFunction &MF = *MI.getParent()->getParent(); 100*9880d681SAndroid Build Coastguard Worker int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex) + 101*9880d681SAndroid Build Coastguard Worker MI.getOperand(FIOperandNum + 1).getImm(); 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker // Using I0 as the frame pointer 104*9880d681SAndroid Build Coastguard Worker MI.getOperand(FIOperandNum).ChangeToRegister(NVPTX::VRFrame, false); 105*9880d681SAndroid Build Coastguard Worker MI.getOperand(FIOperandNum + 1).ChangeToImmediate(Offset); 106*9880d681SAndroid Build Coastguard Worker } 107*9880d681SAndroid Build Coastguard Worker getFrameRegister(const MachineFunction & MF) const108*9880d681SAndroid Build Coastguard Workerunsigned NVPTXRegisterInfo::getFrameRegister(const MachineFunction &MF) const { 109*9880d681SAndroid Build Coastguard Worker return NVPTX::VRFrame; 110*9880d681SAndroid Build Coastguard Worker } 111