1*9880d681SAndroid Build Coastguard Worker //=====-- NVPTXSubtarget.h - Define Subtarget for the NVPTX ---*- C++ -*--====// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // This file declares the NVPTX specific subclass of TargetSubtarget. 11*9880d681SAndroid Build Coastguard Worker // 12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_NVPTX_NVPTXSUBTARGET_H 15*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_NVPTX_NVPTXSUBTARGET_H 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker #include "NVPTX.h" 18*9880d681SAndroid Build Coastguard Worker #include "NVPTXFrameLowering.h" 19*9880d681SAndroid Build Coastguard Worker #include "NVPTXISelLowering.h" 20*9880d681SAndroid Build Coastguard Worker #include "NVPTXInstrInfo.h" 21*9880d681SAndroid Build Coastguard Worker #include "NVPTXRegisterInfo.h" 22*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/SelectionDAGTargetInfo.h" 23*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DataLayout.h" 24*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetSubtargetInfo.h" 25*9880d681SAndroid Build Coastguard Worker #include <string> 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker #define GET_SUBTARGETINFO_HEADER 28*9880d681SAndroid Build Coastguard Worker #include "NVPTXGenSubtargetInfo.inc" 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker namespace llvm { 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker class NVPTXSubtarget : public NVPTXGenSubtargetInfo { 33*9880d681SAndroid Build Coastguard Worker virtual void anchor(); 34*9880d681SAndroid Build Coastguard Worker std::string TargetName; 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker // PTX version x.y is represented as 10*x+y, e.g. 3.1 == 31 37*9880d681SAndroid Build Coastguard Worker unsigned PTXVersion; 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker // SM version x.y is represented as 10*x+y, e.g. 3.1 == 31 40*9880d681SAndroid Build Coastguard Worker unsigned int SmVersion; 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker const NVPTXTargetMachine &TM; 43*9880d681SAndroid Build Coastguard Worker NVPTXInstrInfo InstrInfo; 44*9880d681SAndroid Build Coastguard Worker NVPTXTargetLowering TLInfo; 45*9880d681SAndroid Build Coastguard Worker SelectionDAGTargetInfo TSInfo; 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker // NVPTX does not have any call stack frame, but need a NVPTX specific 48*9880d681SAndroid Build Coastguard Worker // FrameLowering class because TargetFrameLowering is abstract. 49*9880d681SAndroid Build Coastguard Worker NVPTXFrameLowering FrameLowering; 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker public: 52*9880d681SAndroid Build Coastguard Worker /// This constructor initializes the data members to match that 53*9880d681SAndroid Build Coastguard Worker /// of the specified module. 54*9880d681SAndroid Build Coastguard Worker /// 55*9880d681SAndroid Build Coastguard Worker NVPTXSubtarget(const Triple &TT, const std::string &CPU, 56*9880d681SAndroid Build Coastguard Worker const std::string &FS, const NVPTXTargetMachine &TM); 57*9880d681SAndroid Build Coastguard Worker getFrameLowering()58*9880d681SAndroid Build Coastguard Worker const TargetFrameLowering *getFrameLowering() const override { 59*9880d681SAndroid Build Coastguard Worker return &FrameLowering; 60*9880d681SAndroid Build Coastguard Worker } getInstrInfo()61*9880d681SAndroid Build Coastguard Worker const NVPTXInstrInfo *getInstrInfo() const override { return &InstrInfo; } getRegisterInfo()62*9880d681SAndroid Build Coastguard Worker const NVPTXRegisterInfo *getRegisterInfo() const override { 63*9880d681SAndroid Build Coastguard Worker return &InstrInfo.getRegisterInfo(); 64*9880d681SAndroid Build Coastguard Worker } getTargetLowering()65*9880d681SAndroid Build Coastguard Worker const NVPTXTargetLowering *getTargetLowering() const override { 66*9880d681SAndroid Build Coastguard Worker return &TLInfo; 67*9880d681SAndroid Build Coastguard Worker } getSelectionDAGInfo()68*9880d681SAndroid Build Coastguard Worker const SelectionDAGTargetInfo *getSelectionDAGInfo() const override { 69*9880d681SAndroid Build Coastguard Worker return &TSInfo; 70*9880d681SAndroid Build Coastguard Worker } 71*9880d681SAndroid Build Coastguard Worker hasBrkPt()72*9880d681SAndroid Build Coastguard Worker bool hasBrkPt() const { return SmVersion >= 11; } hasAtomRedG32()73*9880d681SAndroid Build Coastguard Worker bool hasAtomRedG32() const { return SmVersion >= 11; } hasAtomRedS32()74*9880d681SAndroid Build Coastguard Worker bool hasAtomRedS32() const { return SmVersion >= 12; } hasAtomRedG64()75*9880d681SAndroid Build Coastguard Worker bool hasAtomRedG64() const { return SmVersion >= 12; } hasAtomRedS64()76*9880d681SAndroid Build Coastguard Worker bool hasAtomRedS64() const { return SmVersion >= 20; } hasAtomRedGen32()77*9880d681SAndroid Build Coastguard Worker bool hasAtomRedGen32() const { return SmVersion >= 20; } hasAtomRedGen64()78*9880d681SAndroid Build Coastguard Worker bool hasAtomRedGen64() const { return SmVersion >= 20; } hasAtomAddF32()79*9880d681SAndroid Build Coastguard Worker bool hasAtomAddF32() const { return SmVersion >= 20; } hasVote()80*9880d681SAndroid Build Coastguard Worker bool hasVote() const { return SmVersion >= 12; } hasDouble()81*9880d681SAndroid Build Coastguard Worker bool hasDouble() const { return SmVersion >= 13; } reqPTX20()82*9880d681SAndroid Build Coastguard Worker bool reqPTX20() const { return SmVersion >= 20; } hasF32FTZ()83*9880d681SAndroid Build Coastguard Worker bool hasF32FTZ() const { return SmVersion >= 20; } hasFMAF32()84*9880d681SAndroid Build Coastguard Worker bool hasFMAF32() const { return SmVersion >= 20; } hasFMAF64()85*9880d681SAndroid Build Coastguard Worker bool hasFMAF64() const { return SmVersion >= 13; } hasLDG()86*9880d681SAndroid Build Coastguard Worker bool hasLDG() const { return SmVersion >= 32; } hasLDU()87*9880d681SAndroid Build Coastguard Worker bool hasLDU() const { return ((SmVersion >= 20) && (SmVersion < 30)); } hasGenericLdSt()88*9880d681SAndroid Build Coastguard Worker bool hasGenericLdSt() const { return SmVersion >= 20; } hasHWROT32()89*9880d681SAndroid Build Coastguard Worker inline bool hasHWROT32() const { return SmVersion >= 32; } hasSWROT32()90*9880d681SAndroid Build Coastguard Worker inline bool hasSWROT32() const { 91*9880d681SAndroid Build Coastguard Worker return ((SmVersion >= 20) && (SmVersion < 32)); 92*9880d681SAndroid Build Coastguard Worker } hasROT32()93*9880d681SAndroid Build Coastguard Worker inline bool hasROT32() const { return hasHWROT32() || hasSWROT32(); } hasROT64()94*9880d681SAndroid Build Coastguard Worker inline bool hasROT64() const { return SmVersion >= 20; } 95*9880d681SAndroid Build Coastguard Worker bool hasImageHandles() const; 96*9880d681SAndroid Build Coastguard Worker getSmVersion()97*9880d681SAndroid Build Coastguard Worker unsigned int getSmVersion() const { return SmVersion; } getTargetName()98*9880d681SAndroid Build Coastguard Worker std::string getTargetName() const { return TargetName; } 99*9880d681SAndroid Build Coastguard Worker getPTXVersion()100*9880d681SAndroid Build Coastguard Worker unsigned getPTXVersion() const { return PTXVersion; } 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker NVPTXSubtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS); 103*9880d681SAndroid Build Coastguard Worker void ParseSubtargetFeatures(StringRef CPU, StringRef FS); 104*9880d681SAndroid Build Coastguard Worker }; 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Worker } // End llvm namespace 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker #endif 109