1*0b57cec5SDimitry Andric //===- NVPTXSubtarget.cpp - NVPTX Subtarget Information -------------------===// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric // 9*0b57cec5SDimitry Andric // This file implements the NVPTX specific subclass of TargetSubtarget. 10*0b57cec5SDimitry Andric // 11*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 12*0b57cec5SDimitry Andric 13*0b57cec5SDimitry Andric #include "NVPTXSubtarget.h" 14*0b57cec5SDimitry Andric #include "NVPTXTargetMachine.h" 15*0b57cec5SDimitry Andric 16*0b57cec5SDimitry Andric using namespace llvm; 17*0b57cec5SDimitry Andric 18*0b57cec5SDimitry Andric #define DEBUG_TYPE "nvptx-subtarget" 19*0b57cec5SDimitry Andric 20*0b57cec5SDimitry Andric #define GET_SUBTARGETINFO_ENUM 21*0b57cec5SDimitry Andric #define GET_SUBTARGETINFO_TARGET_DESC 22*0b57cec5SDimitry Andric #define GET_SUBTARGETINFO_CTOR 23*0b57cec5SDimitry Andric #include "NVPTXGenSubtargetInfo.inc" 24*0b57cec5SDimitry Andric 25*0b57cec5SDimitry Andric static cl::opt<bool> 26*0b57cec5SDimitry Andric NoF16Math("nvptx-no-f16-math", cl::ZeroOrMore, cl::Hidden, 27*0b57cec5SDimitry Andric cl::desc("NVPTX Specific: Disable generation of f16 math ops."), 28*0b57cec5SDimitry Andric cl::init(false)); 29*0b57cec5SDimitry Andric 30*0b57cec5SDimitry Andric // Pin the vtable to this file. 31*0b57cec5SDimitry Andric void NVPTXSubtarget::anchor() {} 32*0b57cec5SDimitry Andric 33*0b57cec5SDimitry Andric NVPTXSubtarget &NVPTXSubtarget::initializeSubtargetDependencies(StringRef CPU, 34*0b57cec5SDimitry Andric StringRef FS) { 35*0b57cec5SDimitry Andric // Provide the default CPU if we don't have one. 36*0b57cec5SDimitry Andric TargetName = CPU.empty() ? "sm_20" : CPU; 37*0b57cec5SDimitry Andric 38*0b57cec5SDimitry Andric ParseSubtargetFeatures(TargetName, FS); 39*0b57cec5SDimitry Andric 40*0b57cec5SDimitry Andric // Set default to PTX 3.2 (CUDA 5.5) 41*0b57cec5SDimitry Andric if (PTXVersion == 0) { 42*0b57cec5SDimitry Andric PTXVersion = 32; 43*0b57cec5SDimitry Andric } 44*0b57cec5SDimitry Andric 45*0b57cec5SDimitry Andric return *this; 46*0b57cec5SDimitry Andric } 47*0b57cec5SDimitry Andric 48*0b57cec5SDimitry Andric NVPTXSubtarget::NVPTXSubtarget(const Triple &TT, const std::string &CPU, 49*0b57cec5SDimitry Andric const std::string &FS, 50*0b57cec5SDimitry Andric const NVPTXTargetMachine &TM) 51*0b57cec5SDimitry Andric : NVPTXGenSubtargetInfo(TT, CPU, FS), PTXVersion(0), SmVersion(20), TM(TM), 52*0b57cec5SDimitry Andric InstrInfo(), TLInfo(TM, initializeSubtargetDependencies(CPU, FS)), 53*0b57cec5SDimitry Andric FrameLowering() {} 54*0b57cec5SDimitry Andric 55*0b57cec5SDimitry Andric bool NVPTXSubtarget::hasImageHandles() const { 56*0b57cec5SDimitry Andric // Enable handles for Kepler+, where CUDA supports indirect surfaces and 57*0b57cec5SDimitry Andric // textures 58*0b57cec5SDimitry Andric if (TM.getDrvInterface() == NVPTX::CUDA) 59*0b57cec5SDimitry Andric return (SmVersion >= 30); 60*0b57cec5SDimitry Andric 61*0b57cec5SDimitry Andric // Disabled, otherwise 62*0b57cec5SDimitry Andric return false; 63*0b57cec5SDimitry Andric } 64*0b57cec5SDimitry Andric 65*0b57cec5SDimitry Andric bool NVPTXSubtarget::allowFP16Math() const { 66*0b57cec5SDimitry Andric return hasFP16Math() && NoF16Math == false; 67*0b57cec5SDimitry Andric } 68