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"
15dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
16dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesusing namespace llvm;
17dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
18dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "nvptx-subtarget"
19dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
2049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#define GET_SUBTARGETINFO_ENUM
2149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#define GET_SUBTARGETINFO_TARGET_DESC
2249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#define GET_SUBTARGETINFO_CTOR
2349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTXGenSubtargetInfo.inc"
2449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
25354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzka// Pin the vtable to this file.
26354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzkavoid NVPTXSubtarget::anchor() {}
27354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzka
28cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesstatic std::string computeDataLayout(bool is64Bit) {
29cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::string Ret = "e";
30cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
31cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (!is64Bit)
32cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Ret += "-p:32:32";
33cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
34cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  Ret += "-i64:64-v16:16-v32:32-n16:32:64";
35cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
36cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return Ret;
37cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
38cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
39cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesNVPTXSubtarget &NVPTXSubtarget::initializeSubtargetDependencies(StringRef CPU,
40cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                                                StringRef FS) {
41cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    // Provide the default CPU if we don't have one.
42cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (CPU.empty() && FS.size())
43cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    llvm_unreachable("we are not using FeatureStr");
44cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  TargetName = CPU.empty() ? "sm_20" : CPU;
45cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
46cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  ParseSubtargetFeatures(TargetName, FS);
47cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
48cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Set default to PTX 3.2 (CUDA 5.5)
49cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (PTXVersion == 0) {
50cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    PTXVersion = 32;
51cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
52cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
53cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return *this;
54cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
55cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
5649683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiNVPTXSubtarget::NVPTXSubtarget(const std::string &TT, const std::string &CPU,
57cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                               const std::string &FS, const TargetMachine &TM,
58cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                               bool is64Bit)
593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    : NVPTXGenSubtargetInfo(TT, CPU, FS), Is64Bit(is64Bit), PTXVersion(0),
60cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      SmVersion(20), DL(computeDataLayout(is64Bit)),
61cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      InstrInfo(initializeSubtargetDependencies(CPU, FS)),
62cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      TLInfo((NVPTXTargetMachine &)TM), TSInfo(&DL), FrameLowering(*this) {
6349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
640ff4287fe2245f417ed78fa535fce360b8b8df23Justin Holewinski  Triple T(TT);
650ff4287fe2245f417ed78fa535fce360b8b8df23Justin Holewinski
660ff4287fe2245f417ed78fa535fce360b8b8df23Justin Holewinski  if (T.getOS() == Triple::NVCL)
670ff4287fe2245f417ed78fa535fce360b8b8df23Justin Holewinski    drvInterface = NVPTX::NVCL;
680ff4287fe2245f417ed78fa535fce360b8b8df23Justin Holewinski  else
690ff4287fe2245f417ed78fa535fce360b8b8df23Justin Holewinski    drvInterface = NVPTX::CUDA;
7049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
71