149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===- NVPTXSubtarget.cpp - NVPTX Subtarget 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 implements the NVPTX specific subclass of TargetSubtarget.
1149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//
1249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===----------------------------------------------------------------------===//
1349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
1449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTXSubtarget.h"
1549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#define GET_SUBTARGETINFO_ENUM
1649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#define GET_SUBTARGETINFO_TARGET_DESC
1749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#define GET_SUBTARGETINFO_CTOR
1849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTXGenSubtargetInfo.inc"
1949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
2049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiusing namespace llvm;
2149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
2249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// Select Driver Interface
2349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Support/CommandLine.h"
2449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskinamespace {
2549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskicl::opt<NVPTX::DrvInterface>
2649683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiDriverInterface(cl::desc("Choose driver interface:"),
2749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                cl::values(
2849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                    clEnumValN(NVPTX::NVCL, "drvnvcl", "Nvidia OpenCL driver"),
2949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                    clEnumValN(NVPTX::CUDA, "drvcuda", "Nvidia CUDA driver"),
3049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                    clEnumValN(NVPTX::TEST, "drvtest", "Plain Test"),
3149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                    clEnumValEnd),
3249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                    cl::init(NVPTX::NVCL));
3349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
3449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
3549683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiNVPTXSubtarget::NVPTXSubtarget(const std::string &TT, const std::string &CPU,
3649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                               const std::string &FS, bool is64Bit)
3749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski:NVPTXGenSubtargetInfo(TT, "", FS), // Don't pass CPU to subtarget,
3849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski // because we don't register all
3949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski // nvptx targets.
4049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski Is64Bit(is64Bit) {
4149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
4249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  drvInterface = DriverInterface;
4349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
4449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Provide the default CPU if none
4549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  std::string defCPU = "sm_10";
4649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
4749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Get the TargetName from the FS if available
4849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (FS.empty() && CPU.empty())
4949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    TargetName = defCPU;
5049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  else if (!CPU.empty())
5149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    TargetName = CPU;
5249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  else
5349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    llvm_unreachable("we are not using FeatureStr");
5449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
5549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Set up the SmVersion
5649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SmVersion = atoi(TargetName.c_str()+3);
5749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
58