blob: e9833e5823c3f3e632a42c86b1e316e85cf9ae28 [file] [log] [blame]
Justin Holewinskiae556d32012-05-04 20:18:50 +00001//=====-- NVPTXSubtarget.h - Define Subtarget for the NVPTX ---*- C++ -*--====//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file declares the NVPTX specific subclass of TargetSubtarget.
11//
12//===----------------------------------------------------------------------===//
13
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000014#ifndef LLVM_LIB_TARGET_NVPTX_NVPTXSUBTARGET_H
15#define LLVM_LIB_TARGET_NVPTX_NVPTXSUBTARGET_H
Justin Holewinskiae556d32012-05-04 20:18:50 +000016
Justin Holewinskiae556d32012-05-04 20:18:50 +000017#include "NVPTX.h"
Eric Christopher493f91b2014-06-27 04:33:14 +000018#include "NVPTXFrameLowering.h"
19#include "NVPTXISelLowering.h"
20#include "NVPTXInstrInfo.h"
21#include "NVPTXRegisterInfo.h"
22#include "llvm/IR/DataLayout.h"
23#include "llvm/Target/TargetSelectionDAGInfo.h"
Chandler Carruth802d7552012-12-04 07:12:27 +000024#include "llvm/Target/TargetSubtargetInfo.h"
Chandler Carruthff555932014-04-22 02:28:45 +000025#include <string>
Justin Holewinskiae556d32012-05-04 20:18:50 +000026
27#define GET_SUBTARGETINFO_HEADER
28#include "NVPTXGenSubtargetInfo.inc"
29
Justin Holewinskiae556d32012-05-04 20:18:50 +000030namespace llvm {
31
32class NVPTXSubtarget : public NVPTXGenSubtargetInfo {
Juergen Ributzkad12ccbd2013-11-19 00:57:56 +000033 virtual void anchor();
Justin Holewinskiae556d32012-05-04 20:18:50 +000034 std::string TargetName;
Justin Holewinskiae556d32012-05-04 20:18:50 +000035
Justin Holewinski1812ee92012-11-12 03:16:43 +000036 // PTX version x.y is represented as 10*x+y, e.g. 3.1 == 31
37 unsigned PTXVersion;
38
39 // SM version x.y is represented as 10*x+y, e.g. 3.1 == 31
40 unsigned int SmVersion;
41
Eric Christopher6aad8b12015-02-19 00:08:14 +000042 const NVPTXTargetMachine &TM;
Eric Christopher493f91b2014-06-27 04:33:14 +000043 NVPTXInstrInfo InstrInfo;
44 NVPTXTargetLowering TLInfo;
45 TargetSelectionDAGInfo TSInfo;
46
47 // NVPTX does not have any call stack frame, but need a NVPTX specific
48 // FrameLowering class because TargetFrameLowering is abstract.
49 NVPTXFrameLowering FrameLowering;
50
Justin Holewinskiae556d32012-05-04 20:18:50 +000051public:
52 /// This constructor initializes the data members to match that
53 /// of the specified module.
54 ///
55 NVPTXSubtarget(const std::string &TT, const std::string &CPU,
Eric Christopher02389e32015-02-19 00:08:27 +000056 const std::string &FS, const NVPTXTargetMachine &TM);
Eric Christopher493f91b2014-06-27 04:33:14 +000057
Eric Christopherd9134482014-08-04 21:25:23 +000058 const TargetFrameLowering *getFrameLowering() const override {
59 return &FrameLowering;
60 }
61 const NVPTXInstrInfo *getInstrInfo() const override { return &InstrInfo; }
Eric Christopherd9134482014-08-04 21:25:23 +000062 const NVPTXRegisterInfo *getRegisterInfo() const override {
Eric Christopher493f91b2014-06-27 04:33:14 +000063 return &InstrInfo.getRegisterInfo();
64 }
Eric Christopherd9134482014-08-04 21:25:23 +000065 const NVPTXTargetLowering *getTargetLowering() const override {
66 return &TLInfo;
67 }
68 const TargetSelectionDAGInfo *getSelectionDAGInfo() const override {
69 return &TSInfo;
70 }
Justin Holewinskiae556d32012-05-04 20:18:50 +000071
72 bool hasBrkPt() const { return SmVersion >= 11; }
73 bool hasAtomRedG32() const { return SmVersion >= 11; }
74 bool hasAtomRedS32() const { return SmVersion >= 12; }
75 bool hasAtomRedG64() const { return SmVersion >= 12; }
76 bool hasAtomRedS64() const { return SmVersion >= 20; }
77 bool hasAtomRedGen32() const { return SmVersion >= 20; }
78 bool hasAtomRedGen64() const { return SmVersion >= 20; }
79 bool hasAtomAddF32() const { return SmVersion >= 20; }
80 bool hasVote() const { return SmVersion >= 12; }
81 bool hasDouble() const { return SmVersion >= 13; }
82 bool reqPTX20() const { return SmVersion >= 20; }
83 bool hasF32FTZ() const { return SmVersion >= 20; }
84 bool hasFMAF32() const { return SmVersion >= 20; }
85 bool hasFMAF64() const { return SmVersion >= 13; }
Justin Holewinskibe8dc642013-02-12 14:18:49 +000086 bool hasLDG() const { return SmVersion >= 32; }
Justin Holewinskic3f31eb2014-06-27 18:35:16 +000087 bool hasLDU() const { return ((SmVersion >= 20) && (SmVersion < 30)); }
Justin Holewinskiae556d32012-05-04 20:18:50 +000088 bool hasGenericLdSt() const { return SmVersion >= 20; }
Justin Holewinskic3f31eb2014-06-27 18:35:16 +000089 inline bool hasHWROT32() const { return SmVersion >= 32; }
90 inline bool hasSWROT32() const {
91 return ((SmVersion >= 20) && (SmVersion < 32));
92 }
Justin Holewinski0497ab12013-03-30 14:29:21 +000093 inline bool hasROT32() const { return hasHWROT32() || hasSWROT32(); }
Justin Holewinskiae556d32012-05-04 20:18:50 +000094 inline bool hasROT64() const { return SmVersion >= 20; }
Eric Christopherbeffc4e2015-02-19 00:08:23 +000095 bool hasImageHandles() const;
Justin Holewinskiae556d32012-05-04 20:18:50 +000096
97 unsigned int getSmVersion() const { return SmVersion; }
Justin Holewinskiae556d32012-05-04 20:18:50 +000098 std::string getTargetName() const { return TargetName; }
99
Justin Holewinski1812ee92012-11-12 03:16:43 +0000100 unsigned getPTXVersion() const { return PTXVersion; }
101
Eric Christopher493f91b2014-06-27 04:33:14 +0000102 NVPTXSubtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS);
Justin Holewinskiae556d32012-05-04 20:18:50 +0000103 void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
Justin Holewinskiae556d32012-05-04 20:18:50 +0000104};
105
106} // End llvm namespace
107
Benjamin Kramera7c40ef2014-08-13 16:26:38 +0000108#endif