| //===- NVPTXSubtarget.cpp - NVPTX Subtarget Information -------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file implements the NVPTX specific subclass of TargetSubtarget. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "NVPTXSubtarget.h" |
| #include "NVPTXTargetMachine.h" |
| |
| using namespace llvm; |
| |
| #define DEBUG_TYPE "nvptx-subtarget" |
| |
| #define GET_SUBTARGETINFO_ENUM |
| #define GET_SUBTARGETINFO_TARGET_DESC |
| #define GET_SUBTARGETINFO_CTOR |
| #include "NVPTXGenSubtargetInfo.inc" |
| |
| static cl::opt<bool> |
| NoF16Math("nvptx-no-f16-math", cl::ZeroOrMore, cl::Hidden, |
| cl::desc("NVPTX Specific: Disable generation of f16 math ops."), |
| cl::init(false)); |
| |
| // Pin the vtable to this file. |
| void NVPTXSubtarget::anchor() {} |
| |
| NVPTXSubtarget &NVPTXSubtarget::initializeSubtargetDependencies(StringRef CPU, |
| StringRef FS) { |
| // Provide the default CPU if we don't have one. |
| TargetName = std::string(CPU.empty() ? "sm_20" : CPU); |
| |
| ParseSubtargetFeatures(TargetName, /*TuneCPU*/ TargetName, FS); |
| |
| // Set default to PTX 3.2 (CUDA 5.5) |
| if (PTXVersion == 0) { |
| PTXVersion = 32; |
| } |
| |
| return *this; |
| } |
| |
| NVPTXSubtarget::NVPTXSubtarget(const Triple &TT, const std::string &CPU, |
| const std::string &FS, |
| const NVPTXTargetMachine &TM) |
| : NVPTXGenSubtargetInfo(TT, CPU, /*TuneCPU*/ CPU, FS), PTXVersion(0), |
| SmVersion(20), TM(TM), InstrInfo(), |
| TLInfo(TM, initializeSubtargetDependencies(CPU, FS)), FrameLowering() {} |
| |
| bool NVPTXSubtarget::hasImageHandles() const { |
| // Enable handles for Kepler+, where CUDA supports indirect surfaces and |
| // textures |
| if (TM.getDrvInterface() == NVPTX::CUDA) |
| return (SmVersion >= 30); |
| |
| // Disabled, otherwise |
| return false; |
| } |
| |
| bool NVPTXSubtarget::allowFP16Math() const { |
| return hasFP16Math() && NoF16Math == false; |
| } |