119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//====-- PTXSubtarget.h - Define Subtarget for the PTX ---------*- C++ -*--===// 219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// The LLVM Compiler Infrastructure 419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file is distributed under the University of Illinois Open Source 619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// License. See LICENSE.TXT for details. 719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file declares the PTX specific subclass of TargetSubtargetInfo. 1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 1219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 1319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 1419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#ifndef PTX_SUBTARGET_H 1519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#define PTX_SUBTARGET_H 1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 1719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/TargetSubtargetInfo.h" 1819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#define GET_SUBTARGETINFO_HEADER 2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "PTXGenSubtargetInfo.inc" 2119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 2219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumannamespace llvm { 2319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass StringRef; 2419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 2519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman class PTXSubtarget : public PTXGenSubtargetInfo { 2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman public: 2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman /** 2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman * Enumeration of Shader Models supported by the back-end. 3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman */ 3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman enum PTXTargetEnum { 3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTX_COMPUTE_1_0, /*< Compute Compatibility 1.0 */ 3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTX_COMPUTE_1_1, /*< Compute Compatibility 1.1 */ 3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTX_COMPUTE_1_2, /*< Compute Compatibility 1.2 */ 3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTX_COMPUTE_1_3, /*< Compute Compatibility 1.3 */ 3619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTX_COMPUTE_2_0, /*< Compute Compatibility 2.0 */ 3719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTX_LAST_COMPUTE, 3819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 3919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTX_SM_1_0, /*< Shader Model 1.0 */ 4019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTX_SM_1_1, /*< Shader Model 1.1 */ 4119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTX_SM_1_2, /*< Shader Model 1.2 */ 4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTX_SM_1_3, /*< Shader Model 1.3 */ 4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTX_SM_2_0, /*< Shader Model 2.0 */ 4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTX_SM_2_1, /*< Shader Model 2.1 */ 4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTX_SM_2_2, /*< Shader Model 2.2 */ 4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTX_SM_2_3, /*< Shader Model 2.3 */ 4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTX_LAST_SM 4819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman }; 4919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 5019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman /** 5119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman * Enumeration of PTX versions supported by the back-end. 5219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman * 5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman * Currently, PTX 2.0 is the minimum supported version. 5419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman */ 5519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman enum PTXVersionEnum { 5619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTX_VERSION_2_0, /*< PTX Version 2.0 */ 5719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTX_VERSION_2_1, /*< PTX Version 2.1 */ 5819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTX_VERSION_2_2, /*< PTX Version 2.2 */ 5919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTX_VERSION_2_3 /*< PTX Version 2.3 */ 6019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman }; 6119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 6219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman private: 6319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 6419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman /// Shader Model supported on the target GPU. 6519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTXTargetEnum PTXTarget; 6619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 6719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman /// PTX Language Version. 6819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTXVersionEnum PTXVersion; 6919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 7019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // The native .f64 type is supported on the hardware. 7119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool SupportsDouble; 7219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 7319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Support the fused-multiply add (FMA) and multiply-add (MAD) 7419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // instructions 7519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool SupportsFMA; 7619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 7719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Use .u64 instead of .u32 for addresses. 7819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool Is64Bit; 7919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 8019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman public: 8119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 8219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTXSubtarget(const std::string &TT, const std::string &CPU, 8319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const std::string &FS, bool is64Bit); 8419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 8519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Target architecture accessors 8619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman std::string getTargetString() const; 8719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 8819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman std::string getPTXVersionString() const; 8919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 9019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool supportsDouble() const { return SupportsDouble; } 9119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 9219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool is64Bit() const { return Is64Bit; } 9319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 9419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool supportsFMA() const { return SupportsFMA; } 9519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 9619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool supportsPTX21() const { return PTXVersion >= PTX_VERSION_2_1; } 9719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 9819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool supportsPTX22() const { return PTXVersion >= PTX_VERSION_2_2; } 9919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 10019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool supportsPTX23() const { return PTXVersion >= PTX_VERSION_2_3; } 10119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 10219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool fdivNeedsRoundingMode() const { 10319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return (PTXTarget >= PTX_SM_1_3 && PTXTarget < PTX_LAST_SM) || 10419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman (PTXTarget >= PTX_COMPUTE_1_3 && PTXTarget < PTX_LAST_COMPUTE); 10519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 10619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 10719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool fmadNeedsRoundingMode() const { 10819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return (PTXTarget >= PTX_SM_1_3 && PTXTarget < PTX_LAST_SM) || 10919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman (PTXTarget >= PTX_COMPUTE_1_3 && PTXTarget < PTX_LAST_COMPUTE); 11019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 11119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 11219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool useParamSpaceForDeviceArgs() const { 11319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return (PTXTarget >= PTX_SM_2_0 && PTXTarget < PTX_LAST_SM) || 11419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman (PTXTarget >= PTX_COMPUTE_2_0 && PTXTarget < PTX_LAST_COMPUTE); 11519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 11619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 11719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool callsAreHandled() const { 11819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return (PTXTarget >= PTX_SM_2_0 && PTXTarget < PTX_LAST_SM) || 11919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman (PTXTarget >= PTX_COMPUTE_2_0 && PTXTarget < PTX_LAST_COMPUTE); 12019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 12119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 12219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool emitPtrAttribute() const { 12319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return PTXVersion >= PTX_VERSION_2_2; 12419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 12519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 12619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman void ParseSubtargetFeatures(StringRef CPU, StringRef FS); 12719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman }; // class PTXSubtarget 12819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} // namespace llvm 12919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 13019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#endif // PTX_SUBTARGET_H 131