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