1*bdd1243dSDimitry Andric //===-- TargetParser - Parser for target features ---------------*- C++ -*-===// 2*bdd1243dSDimitry Andric // 3*bdd1243dSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*bdd1243dSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*bdd1243dSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*bdd1243dSDimitry Andric // 7*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===// 8*bdd1243dSDimitry Andric // 9*bdd1243dSDimitry Andric // This file implements a target parser to recognise hardware features such as 10*bdd1243dSDimitry Andric // FPU/CPU/ARCH names as well as specific support such as HDIV, etc. 11*bdd1243dSDimitry Andric // 12*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===// 13*bdd1243dSDimitry Andric 14*bdd1243dSDimitry Andric #ifndef LLVM_TARGETPARSER_TARGETPARSER_H 15*bdd1243dSDimitry Andric #define LLVM_TARGETPARSER_TARGETPARSER_H 16*bdd1243dSDimitry Andric 17*bdd1243dSDimitry Andric #include "llvm/ADT/StringRef.h" 18*bdd1243dSDimitry Andric #include <cstdint> 19*bdd1243dSDimitry Andric // FIXME: vector is used because that's what clang uses for subtarget feature 20*bdd1243dSDimitry Andric // lists, but SmallVector would probably be better 21*bdd1243dSDimitry Andric #include <vector> 22*bdd1243dSDimitry Andric 23*bdd1243dSDimitry Andric namespace llvm { 24*bdd1243dSDimitry Andric 25*bdd1243dSDimitry Andric template <typename T> class SmallVectorImpl; 26*bdd1243dSDimitry Andric class Triple; 27*bdd1243dSDimitry Andric 28*bdd1243dSDimitry Andric // Target specific information in their own namespaces. 29*bdd1243dSDimitry Andric // (ARM/AArch64/X86 are declared in ARM/AArch64/X86TargetParser.h) 30*bdd1243dSDimitry Andric // These should be generated from TableGen because the information is already 31*bdd1243dSDimitry Andric // there, and there is where new information about targets will be added. 32*bdd1243dSDimitry Andric // FIXME: To TableGen this we need to make some table generated files available 33*bdd1243dSDimitry Andric // even if the back-end is not compiled with LLVM, plus we need to create a new 34*bdd1243dSDimitry Andric // back-end to TableGen to create these clean tables. 35*bdd1243dSDimitry Andric namespace AMDGPU { 36*bdd1243dSDimitry Andric 37*bdd1243dSDimitry Andric /// GPU kinds supported by the AMDGPU target. 38*bdd1243dSDimitry Andric enum GPUKind : uint32_t { 39*bdd1243dSDimitry Andric // Not specified processor. 40*bdd1243dSDimitry Andric GK_NONE = 0, 41*bdd1243dSDimitry Andric 42*bdd1243dSDimitry Andric // R600-based processors. 43*bdd1243dSDimitry Andric GK_R600 = 1, 44*bdd1243dSDimitry Andric GK_R630 = 2, 45*bdd1243dSDimitry Andric GK_RS880 = 3, 46*bdd1243dSDimitry Andric GK_RV670 = 4, 47*bdd1243dSDimitry Andric GK_RV710 = 5, 48*bdd1243dSDimitry Andric GK_RV730 = 6, 49*bdd1243dSDimitry Andric GK_RV770 = 7, 50*bdd1243dSDimitry Andric GK_CEDAR = 8, 51*bdd1243dSDimitry Andric GK_CYPRESS = 9, 52*bdd1243dSDimitry Andric GK_JUNIPER = 10, 53*bdd1243dSDimitry Andric GK_REDWOOD = 11, 54*bdd1243dSDimitry Andric GK_SUMO = 12, 55*bdd1243dSDimitry Andric GK_BARTS = 13, 56*bdd1243dSDimitry Andric GK_CAICOS = 14, 57*bdd1243dSDimitry Andric GK_CAYMAN = 15, 58*bdd1243dSDimitry Andric GK_TURKS = 16, 59*bdd1243dSDimitry Andric 60*bdd1243dSDimitry Andric GK_R600_FIRST = GK_R600, 61*bdd1243dSDimitry Andric GK_R600_LAST = GK_TURKS, 62*bdd1243dSDimitry Andric 63*bdd1243dSDimitry Andric // AMDGCN-based processors. 64*bdd1243dSDimitry Andric GK_GFX600 = 32, 65*bdd1243dSDimitry Andric GK_GFX601 = 33, 66*bdd1243dSDimitry Andric GK_GFX602 = 34, 67*bdd1243dSDimitry Andric 68*bdd1243dSDimitry Andric GK_GFX700 = 40, 69*bdd1243dSDimitry Andric GK_GFX701 = 41, 70*bdd1243dSDimitry Andric GK_GFX702 = 42, 71*bdd1243dSDimitry Andric GK_GFX703 = 43, 72*bdd1243dSDimitry Andric GK_GFX704 = 44, 73*bdd1243dSDimitry Andric GK_GFX705 = 45, 74*bdd1243dSDimitry Andric 75*bdd1243dSDimitry Andric GK_GFX801 = 50, 76*bdd1243dSDimitry Andric GK_GFX802 = 51, 77*bdd1243dSDimitry Andric GK_GFX803 = 52, 78*bdd1243dSDimitry Andric GK_GFX805 = 53, 79*bdd1243dSDimitry Andric GK_GFX810 = 54, 80*bdd1243dSDimitry Andric 81*bdd1243dSDimitry Andric GK_GFX900 = 60, 82*bdd1243dSDimitry Andric GK_GFX902 = 61, 83*bdd1243dSDimitry Andric GK_GFX904 = 62, 84*bdd1243dSDimitry Andric GK_GFX906 = 63, 85*bdd1243dSDimitry Andric GK_GFX908 = 64, 86*bdd1243dSDimitry Andric GK_GFX909 = 65, 87*bdd1243dSDimitry Andric GK_GFX90A = 66, 88*bdd1243dSDimitry Andric GK_GFX90C = 67, 89*bdd1243dSDimitry Andric GK_GFX940 = 68, 90*bdd1243dSDimitry Andric 91*bdd1243dSDimitry Andric GK_GFX1010 = 71, 92*bdd1243dSDimitry Andric GK_GFX1011 = 72, 93*bdd1243dSDimitry Andric GK_GFX1012 = 73, 94*bdd1243dSDimitry Andric GK_GFX1013 = 74, 95*bdd1243dSDimitry Andric GK_GFX1030 = 75, 96*bdd1243dSDimitry Andric GK_GFX1031 = 76, 97*bdd1243dSDimitry Andric GK_GFX1032 = 77, 98*bdd1243dSDimitry Andric GK_GFX1033 = 78, 99*bdd1243dSDimitry Andric GK_GFX1034 = 79, 100*bdd1243dSDimitry Andric GK_GFX1035 = 80, 101*bdd1243dSDimitry Andric GK_GFX1036 = 81, 102*bdd1243dSDimitry Andric 103*bdd1243dSDimitry Andric GK_GFX1100 = 90, 104*bdd1243dSDimitry Andric GK_GFX1101 = 91, 105*bdd1243dSDimitry Andric GK_GFX1102 = 92, 106*bdd1243dSDimitry Andric GK_GFX1103 = 93, 107*bdd1243dSDimitry Andric 108*bdd1243dSDimitry Andric GK_AMDGCN_FIRST = GK_GFX600, 109*bdd1243dSDimitry Andric GK_AMDGCN_LAST = GK_GFX1103, 110*bdd1243dSDimitry Andric }; 111*bdd1243dSDimitry Andric 112*bdd1243dSDimitry Andric /// Instruction set architecture version. 113*bdd1243dSDimitry Andric struct IsaVersion { 114*bdd1243dSDimitry Andric unsigned Major; 115*bdd1243dSDimitry Andric unsigned Minor; 116*bdd1243dSDimitry Andric unsigned Stepping; 117*bdd1243dSDimitry Andric }; 118*bdd1243dSDimitry Andric 119*bdd1243dSDimitry Andric // This isn't comprehensive for now, just things that are needed from the 120*bdd1243dSDimitry Andric // frontend driver. 121*bdd1243dSDimitry Andric enum ArchFeatureKind : uint32_t { 122*bdd1243dSDimitry Andric FEATURE_NONE = 0, 123*bdd1243dSDimitry Andric 124*bdd1243dSDimitry Andric // These features only exist for r600, and are implied true for amdgcn. 125*bdd1243dSDimitry Andric FEATURE_FMA = 1 << 1, 126*bdd1243dSDimitry Andric FEATURE_LDEXP = 1 << 2, 127*bdd1243dSDimitry Andric FEATURE_FP64 = 1 << 3, 128*bdd1243dSDimitry Andric 129*bdd1243dSDimitry Andric // Common features. 130*bdd1243dSDimitry Andric FEATURE_FAST_FMA_F32 = 1 << 4, 131*bdd1243dSDimitry Andric FEATURE_FAST_DENORMAL_F32 = 1 << 5, 132*bdd1243dSDimitry Andric 133*bdd1243dSDimitry Andric // Wavefront 32 is available. 134*bdd1243dSDimitry Andric FEATURE_WAVE32 = 1 << 6, 135*bdd1243dSDimitry Andric 136*bdd1243dSDimitry Andric // Xnack is available. 137*bdd1243dSDimitry Andric FEATURE_XNACK = 1 << 7, 138*bdd1243dSDimitry Andric 139*bdd1243dSDimitry Andric // Sram-ecc is available. 140*bdd1243dSDimitry Andric FEATURE_SRAMECC = 1 << 8, 141*bdd1243dSDimitry Andric }; 142*bdd1243dSDimitry Andric 143*bdd1243dSDimitry Andric StringRef getArchNameAMDGCN(GPUKind AK); 144*bdd1243dSDimitry Andric StringRef getArchNameR600(GPUKind AK); 145*bdd1243dSDimitry Andric StringRef getCanonicalArchName(const Triple &T, StringRef Arch); 146*bdd1243dSDimitry Andric GPUKind parseArchAMDGCN(StringRef CPU); 147*bdd1243dSDimitry Andric GPUKind parseArchR600(StringRef CPU); 148*bdd1243dSDimitry Andric unsigned getArchAttrAMDGCN(GPUKind AK); 149*bdd1243dSDimitry Andric unsigned getArchAttrR600(GPUKind AK); 150*bdd1243dSDimitry Andric 151*bdd1243dSDimitry Andric void fillValidArchListAMDGCN(SmallVectorImpl<StringRef> &Values); 152*bdd1243dSDimitry Andric void fillValidArchListR600(SmallVectorImpl<StringRef> &Values); 153*bdd1243dSDimitry Andric 154*bdd1243dSDimitry Andric IsaVersion getIsaVersion(StringRef GPU); 155*bdd1243dSDimitry Andric 156*bdd1243dSDimitry Andric } // namespace AMDGPU 157*bdd1243dSDimitry Andric } // namespace llvm 158*bdd1243dSDimitry Andric 159*bdd1243dSDimitry Andric #endif 160