131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- PTXSubtarget.cpp - PTX Subtarget Information ----------------------===//
250880d08ec32857fa557281046c81a0506e7f64dEric Christopher//
350880d08ec32857fa557281046c81a0506e7f64dEric Christopher//                     The LLVM Compiler Infrastructure
450880d08ec32857fa557281046c81a0506e7f64dEric Christopher//
550880d08ec32857fa557281046c81a0506e7f64dEric Christopher// This file is distributed under the University of Illinois Open Source
650880d08ec32857fa557281046c81a0506e7f64dEric Christopher// License. See LICENSE.TXT for details.
750880d08ec32857fa557281046c81a0506e7f64dEric Christopher//
850880d08ec32857fa557281046c81a0506e7f64dEric Christopher//===----------------------------------------------------------------------===//
950880d08ec32857fa557281046c81a0506e7f64dEric Christopher//
105b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng// This file implements the PTX specific subclass of TargetSubtargetInfo.
1150880d08ec32857fa557281046c81a0506e7f64dEric Christopher//
1250880d08ec32857fa557281046c81a0506e7f64dEric Christopher//===----------------------------------------------------------------------===//
1350880d08ec32857fa557281046c81a0506e7f64dEric Christopher
1450880d08ec32857fa557281046c81a0506e7f64dEric Christopher#include "PTXSubtarget.h"
15ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng#include "PTX.h"
16fd8978b021dbb0b9b09084dcc707c2054ff76280Che-Liang Chiou#include "llvm/Support/ErrorHandling.h"
173e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h"
1850880d08ec32857fa557281046c81a0506e7f64dEric Christopher
1994214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng#define GET_SUBTARGETINFO_TARGET_DESC
20ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng#define GET_SUBTARGETINFO_CTOR
21385e930d55f3ecd3c9538823dfa5896a12461845Evan Cheng#include "PTXGenSubtargetInfo.inc"
2294214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng
2350880d08ec32857fa557281046c81a0506e7f64dEric Christopherusing namespace llvm;
2450880d08ec32857fa557281046c81a0506e7f64dEric Christopher
252d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid PTXSubtarget::anchor() { }
262d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
27276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan ChengPTXSubtarget::PTXSubtarget(const std::string &TT, const std::string &CPU,
28276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng                           const std::string &FS, bool is64Bit)
290ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng  : PTXGenSubtargetInfo(TT, CPU, FS),
3094214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng    PTXTarget(PTX_COMPUTE_1_0),
31625eec10fef5449f709ecd7a4e348aa94b29aef8Justin Holewinski    PTXVersion(PTX_VERSION_2_0),
32f48817cbf98472c4007e38ff7dad57126531a6e0Che-Liang Chiou    SupportsDouble(false),
33657d1bed2368ab0355ddf69acd737a43d0bfabcfJustin Holewinski    SupportsFMA(true),
3435f4fb34ff60b8f23b2c9691b312bc67cac95eb4Justin Holewinski    Is64Bit(is64Bit) {
35276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng  std::string TARGET = CPU;
36276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng  if (TARGET.empty())
37276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng    TARGET = "generic";
380ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng  ParseSubtargetFeatures(TARGET, FS);
39fd8978b021dbb0b9b09084dcc707c2054ff76280Che-Liang Chiou}
40fd8978b021dbb0b9b09084dcc707c2054ff76280Che-Liang Chiou
41fd8978b021dbb0b9b09084dcc707c2054ff76280Che-Liang Chioustd::string PTXSubtarget::getTargetString() const {
4235f4fb34ff60b8f23b2c9691b312bc67cac95eb4Justin Holewinski  switch(PTXTarget) {
4335f4fb34ff60b8f23b2c9691b312bc67cac95eb4Justin Holewinski    default: llvm_unreachable("Unknown PTX target");
44fd8978b021dbb0b9b09084dcc707c2054ff76280Che-Liang Chiou    case PTX_SM_1_0: return "sm_10";
4535f4fb34ff60b8f23b2c9691b312bc67cac95eb4Justin Holewinski    case PTX_SM_1_1: return "sm_11";
4635f4fb34ff60b8f23b2c9691b312bc67cac95eb4Justin Holewinski    case PTX_SM_1_2: return "sm_12";
47fd8978b021dbb0b9b09084dcc707c2054ff76280Che-Liang Chiou    case PTX_SM_1_3: return "sm_13";
48fd8978b021dbb0b9b09084dcc707c2054ff76280Che-Liang Chiou    case PTX_SM_2_0: return "sm_20";
4935f4fb34ff60b8f23b2c9691b312bc67cac95eb4Justin Holewinski    case PTX_SM_2_1: return "sm_21";
5035f4fb34ff60b8f23b2c9691b312bc67cac95eb4Justin Holewinski    case PTX_SM_2_2: return "sm_22";
5135f4fb34ff60b8f23b2c9691b312bc67cac95eb4Justin Holewinski    case PTX_SM_2_3: return "sm_23";
5235f4fb34ff60b8f23b2c9691b312bc67cac95eb4Justin Holewinski    case PTX_COMPUTE_1_0: return "compute_10";
5335f4fb34ff60b8f23b2c9691b312bc67cac95eb4Justin Holewinski    case PTX_COMPUTE_1_1: return "compute_11";
5435f4fb34ff60b8f23b2c9691b312bc67cac95eb4Justin Holewinski    case PTX_COMPUTE_1_2: return "compute_12";
5535f4fb34ff60b8f23b2c9691b312bc67cac95eb4Justin Holewinski    case PTX_COMPUTE_1_3: return "compute_13";
5635f4fb34ff60b8f23b2c9691b312bc67cac95eb4Justin Holewinski    case PTX_COMPUTE_2_0: return "compute_20";
57fd8978b021dbb0b9b09084dcc707c2054ff76280Che-Liang Chiou  }
58fd8978b021dbb0b9b09084dcc707c2054ff76280Che-Liang Chiou}
59fd8978b021dbb0b9b09084dcc707c2054ff76280Che-Liang Chiou
60fd8978b021dbb0b9b09084dcc707c2054ff76280Che-Liang Chioustd::string PTXSubtarget::getPTXVersionString() const {
61fd8978b021dbb0b9b09084dcc707c2054ff76280Che-Liang Chiou  switch(PTXVersion) {
62fd8978b021dbb0b9b09084dcc707c2054ff76280Che-Liang Chiou    case PTX_VERSION_2_0: return "2.0";
63fd8978b021dbb0b9b09084dcc707c2054ff76280Che-Liang Chiou    case PTX_VERSION_2_1: return "2.1";
64625eec10fef5449f709ecd7a4e348aa94b29aef8Justin Holewinski    case PTX_VERSION_2_2: return "2.2";
65ab0145d2a9fd8500ceb6644dae0b73c9147671abJustin Holewinski    case PTX_VERSION_2_3: return "2.3";
66fd8978b021dbb0b9b09084dcc707c2054ff76280Che-Liang Chiou  }
67e4ad58272970ecd850d233862f40a72d15649639Benjamin Kramer  llvm_unreachable("Invalid PTX version");
6850880d08ec32857fa557281046c81a0506e7f64dEric Christopher}
69