1f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//=====-- AMDGPUSubtarget.h - Define Subtarget for the AMDIL ---*- C++ -*-====//
2f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//
3f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//                     The LLVM Compiler Infrastructure
4f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//
5f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// This file is distributed under the University of Illinois Open Source
6f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// License. See LICENSE.TXT for details.
7f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//
8f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//==-----------------------------------------------------------------------===//
9f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//
10f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard/// \file
11f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard/// \brief AMDGPU specific subclass of TargetSubtarget.
12f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//
13f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//===----------------------------------------------------------------------===//
14f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
15f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#ifndef AMDGPUSUBTARGET_H
16f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#define AMDGPUSUBTARGET_H
173ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard#include "AMDGPU.h"
18cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "AMDGPUInstrInfo.h"
19f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "llvm/ADT/StringExtras.h"
20f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "llvm/ADT/StringRef.h"
21f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "llvm/Target/TargetSubtargetInfo.h"
22f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
23f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#define GET_SUBTARGETINFO_HEADER
24f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "AMDGPUGenSubtargetInfo.inc"
25f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
26f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#define MAX_CB_SIZE (1 << 16)
27f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
28f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardnamespace llvm {
29f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
30f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardclass AMDGPUSubtarget : public AMDGPUGenSubtargetInfo {
31cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
32cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::unique_ptr<AMDGPUInstrInfo> InstrInfo;
33cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
343ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellardpublic:
353ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  enum Generation {
363ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard    R600 = 0,
373ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard    R700,
383ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard    EVERGREEN,
393ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard    NORTHERN_ISLANDS,
4054328c772c5519e56c13667c2b1d1e830580c44dTom Stellard    SOUTHERN_ISLANDS,
4154328c772c5519e56c13667c2b1d1e830580c44dTom Stellard    SEA_ISLANDS
423ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  };
433ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard
44f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardprivate:
45f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  std::string DevName;
46f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  bool Is64bit;
47f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  bool DumpCode;
48f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  bool R600ALUInst;
49631591e6f3e5119d8a8b1c853279bc4ac7ace4a0Vincent Lejeune  bool HasVertexCache;
50dcfcf1d1ffe72d9c25564a2b8b53763a28648e97Vincent Lejeune  short TexVTXClauseSize;
51cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  Generation Gen;
523ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  bool FP64;
533ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  bool CaymanISA;
54de28bdadff78ceea6bb05e23dc3b4cc92fa359edTom Stellard  bool EnableIRStructurizer;
55ef37e453c407675ab5934d2f6bcec706b7810878Tom Stellard  bool EnableIfCvt;
5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned WavefrontSize;
5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool CFALUBug;
58cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  int LocalMemorySize;
59f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
60f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  InstrItineraryData InstrItins;
61f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
62f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardpublic:
63f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  AMDGPUSubtarget(StringRef TT, StringRef CPU, StringRef FS);
64f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
65cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const AMDGPUInstrInfo *getInstrInfo() const {
66cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return InstrInfo.get();
67cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
68cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
69cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const InstrItineraryData &getInstrItineraryData() const {
70cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return InstrItins;
71cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
72cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
73dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
74f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
75cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool is64bit() const {
76cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return Is64bit;
77cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
78cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
79cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool hasVertexCache() const {
80cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return HasVertexCache;
81cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
82cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
83cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  short getTexVTXClauseSize() const {
84cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      return TexVTXClauseSize;
85cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
86cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
87cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  Generation getGeneration() const {
88cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return Gen;
89cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
90cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
91cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool hasHWFP64() const {
92cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return FP64;
93cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
94cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
95cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool hasCaymanISA() const {
96cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return CaymanISA;
97cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool hasBFE() const {
10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return (getGeneration() >= EVERGREEN);
10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
103cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool hasBFI() const {
104cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return (getGeneration() >= EVERGREEN);
105cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
106cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool hasBFM() const {
10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return hasBFE();
10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
111cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool hasBCNT(unsigned Size) const {
112cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (Size == 32)
113cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      return (getGeneration() >= EVERGREEN);
114cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
115cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    assert(Size == 64);
116cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return (getGeneration() >= SOUTHERN_ISLANDS);
117cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
118cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
119dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool hasMulU24() const {
120dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return (getGeneration() >= EVERGREEN);
121dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
122dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
123dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool hasMulI24() const {
124dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return (getGeneration() >= SOUTHERN_ISLANDS ||
125dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines            hasCaymanISA());
126dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
127dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
128cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool IsIRStructurizerEnabled() const {
129cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return EnableIRStructurizer;
130cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
131cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
132cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool isIfCvtEnabled() const {
133cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return EnableIfCvt;
134cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
135cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
136cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  unsigned getWavefrontSize() const {
137cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return WavefrontSize;
138cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
139cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
14036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned getStackEntrySize() const;
141cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
142cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool hasCFAluBug() const {
143cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    assert(getGeneration() <= NORTHERN_ISLANDS);
144cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return CFALUBug;
145cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
146cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
147cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  int getLocalMemorySize() const {
148cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return LocalMemorySize;
149cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
150f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
151dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool enableMachineScheduler() const override {
152f45edcc3818757234c20d4d5975c0b992bf1f95eAndrew Trick    return getGeneration() <= NORTHERN_ISLANDS;
153f45edcc3818757234c20d4d5975c0b992bf1f95eAndrew Trick  }
154f45edcc3818757234c20d4d5975c0b992bf1f95eAndrew Trick
155f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  // Helper functions to simplify if statements
156cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool isTargetELF() const {
157cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return false;
158cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
159f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
160cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  StringRef getDeviceName() const {
161cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return DevName;
162cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
163cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
164cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool dumpCode() const {
165cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return DumpCode;
166cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
167cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool r600ALUEncoding() const {
168cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return R600ALUInst;
169cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
170f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard};
171f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
172f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard} // End namespace llvm
173f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
174f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#endif // AMDGPUSUBTARGET_H
175