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