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