1*9880d681SAndroid Build Coastguard Worker //===-- AMDGPUBaseInfo.cpp - AMDGPU Base encoding information--------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker #include "AMDGPUBaseInfo.h"
10*9880d681SAndroid Build Coastguard Worker #include "AMDGPU.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LLVMContext.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Function.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/GlobalValue.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCContext.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCSectionELF.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCSubtargetInfo.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/SubtargetFeature.h"
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker #define GET_SUBTARGETINFO_ENUM
20*9880d681SAndroid Build Coastguard Worker #include "AMDGPUGenSubtargetInfo.inc"
21*9880d681SAndroid Build Coastguard Worker #undef GET_SUBTARGETINFO_ENUM
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Worker #define GET_REGINFO_ENUM
24*9880d681SAndroid Build Coastguard Worker #include "AMDGPUGenRegisterInfo.inc"
25*9880d681SAndroid Build Coastguard Worker #undef GET_REGINFO_ENUM
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker namespace llvm {
28*9880d681SAndroid Build Coastguard Worker namespace AMDGPU {
29*9880d681SAndroid Build Coastguard Worker
getIsaVersion(const FeatureBitset & Features)30*9880d681SAndroid Build Coastguard Worker IsaVersion getIsaVersion(const FeatureBitset &Features) {
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker if (Features.test(FeatureISAVersion7_0_0))
33*9880d681SAndroid Build Coastguard Worker return {7, 0, 0};
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker if (Features.test(FeatureISAVersion7_0_1))
36*9880d681SAndroid Build Coastguard Worker return {7, 0, 1};
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker if (Features.test(FeatureISAVersion8_0_0))
39*9880d681SAndroid Build Coastguard Worker return {8, 0, 0};
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker if (Features.test(FeatureISAVersion8_0_1))
42*9880d681SAndroid Build Coastguard Worker return {8, 0, 1};
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker if (Features.test(FeatureISAVersion8_0_3))
45*9880d681SAndroid Build Coastguard Worker return {8, 0, 3};
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker return {0, 0, 0};
48*9880d681SAndroid Build Coastguard Worker }
49*9880d681SAndroid Build Coastguard Worker
initDefaultAMDKernelCodeT(amd_kernel_code_t & Header,const FeatureBitset & Features)50*9880d681SAndroid Build Coastguard Worker void initDefaultAMDKernelCodeT(amd_kernel_code_t &Header,
51*9880d681SAndroid Build Coastguard Worker const FeatureBitset &Features) {
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker IsaVersion ISA = getIsaVersion(Features);
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker memset(&Header, 0, sizeof(Header));
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker Header.amd_kernel_code_version_major = 1;
58*9880d681SAndroid Build Coastguard Worker Header.amd_kernel_code_version_minor = 0;
59*9880d681SAndroid Build Coastguard Worker Header.amd_machine_kind = 1; // AMD_MACHINE_KIND_AMDGPU
60*9880d681SAndroid Build Coastguard Worker Header.amd_machine_version_major = ISA.Major;
61*9880d681SAndroid Build Coastguard Worker Header.amd_machine_version_minor = ISA.Minor;
62*9880d681SAndroid Build Coastguard Worker Header.amd_machine_version_stepping = ISA.Stepping;
63*9880d681SAndroid Build Coastguard Worker Header.kernel_code_entry_byte_offset = sizeof(Header);
64*9880d681SAndroid Build Coastguard Worker // wavefront_size is specified as a power of 2: 2^6 = 64 threads.
65*9880d681SAndroid Build Coastguard Worker Header.wavefront_size = 6;
66*9880d681SAndroid Build Coastguard Worker // These alignment values are specified in powers of two, so alignment =
67*9880d681SAndroid Build Coastguard Worker // 2^n. The minimum alignment is 2^4 = 16.
68*9880d681SAndroid Build Coastguard Worker Header.kernarg_segment_alignment = 4;
69*9880d681SAndroid Build Coastguard Worker Header.group_segment_alignment = 4;
70*9880d681SAndroid Build Coastguard Worker Header.private_segment_alignment = 4;
71*9880d681SAndroid Build Coastguard Worker }
72*9880d681SAndroid Build Coastguard Worker
getHSATextSection(MCContext & Ctx)73*9880d681SAndroid Build Coastguard Worker MCSection *getHSATextSection(MCContext &Ctx) {
74*9880d681SAndroid Build Coastguard Worker return Ctx.getELFSection(".hsatext", ELF::SHT_PROGBITS,
75*9880d681SAndroid Build Coastguard Worker ELF::SHF_ALLOC | ELF::SHF_WRITE |
76*9880d681SAndroid Build Coastguard Worker ELF::SHF_EXECINSTR |
77*9880d681SAndroid Build Coastguard Worker ELF::SHF_AMDGPU_HSA_AGENT |
78*9880d681SAndroid Build Coastguard Worker ELF::SHF_AMDGPU_HSA_CODE);
79*9880d681SAndroid Build Coastguard Worker }
80*9880d681SAndroid Build Coastguard Worker
getHSADataGlobalAgentSection(MCContext & Ctx)81*9880d681SAndroid Build Coastguard Worker MCSection *getHSADataGlobalAgentSection(MCContext &Ctx) {
82*9880d681SAndroid Build Coastguard Worker return Ctx.getELFSection(".hsadata_global_agent", ELF::SHT_PROGBITS,
83*9880d681SAndroid Build Coastguard Worker ELF::SHF_ALLOC | ELF::SHF_WRITE |
84*9880d681SAndroid Build Coastguard Worker ELF::SHF_AMDGPU_HSA_GLOBAL |
85*9880d681SAndroid Build Coastguard Worker ELF::SHF_AMDGPU_HSA_AGENT);
86*9880d681SAndroid Build Coastguard Worker }
87*9880d681SAndroid Build Coastguard Worker
getHSADataGlobalProgramSection(MCContext & Ctx)88*9880d681SAndroid Build Coastguard Worker MCSection *getHSADataGlobalProgramSection(MCContext &Ctx) {
89*9880d681SAndroid Build Coastguard Worker return Ctx.getELFSection(".hsadata_global_program", ELF::SHT_PROGBITS,
90*9880d681SAndroid Build Coastguard Worker ELF::SHF_ALLOC | ELF::SHF_WRITE |
91*9880d681SAndroid Build Coastguard Worker ELF::SHF_AMDGPU_HSA_GLOBAL);
92*9880d681SAndroid Build Coastguard Worker }
93*9880d681SAndroid Build Coastguard Worker
getHSARodataReadonlyAgentSection(MCContext & Ctx)94*9880d681SAndroid Build Coastguard Worker MCSection *getHSARodataReadonlyAgentSection(MCContext &Ctx) {
95*9880d681SAndroid Build Coastguard Worker return Ctx.getELFSection(".hsarodata_readonly_agent", ELF::SHT_PROGBITS,
96*9880d681SAndroid Build Coastguard Worker ELF::SHF_ALLOC | ELF::SHF_AMDGPU_HSA_READONLY |
97*9880d681SAndroid Build Coastguard Worker ELF::SHF_AMDGPU_HSA_AGENT);
98*9880d681SAndroid Build Coastguard Worker }
99*9880d681SAndroid Build Coastguard Worker
isGroupSegment(const GlobalValue * GV)100*9880d681SAndroid Build Coastguard Worker bool isGroupSegment(const GlobalValue *GV) {
101*9880d681SAndroid Build Coastguard Worker return GV->getType()->getAddressSpace() == AMDGPUAS::LOCAL_ADDRESS;
102*9880d681SAndroid Build Coastguard Worker }
103*9880d681SAndroid Build Coastguard Worker
isGlobalSegment(const GlobalValue * GV)104*9880d681SAndroid Build Coastguard Worker bool isGlobalSegment(const GlobalValue *GV) {
105*9880d681SAndroid Build Coastguard Worker return GV->getType()->getAddressSpace() == AMDGPUAS::GLOBAL_ADDRESS;
106*9880d681SAndroid Build Coastguard Worker }
107*9880d681SAndroid Build Coastguard Worker
isReadOnlySegment(const GlobalValue * GV)108*9880d681SAndroid Build Coastguard Worker bool isReadOnlySegment(const GlobalValue *GV) {
109*9880d681SAndroid Build Coastguard Worker return GV->getType()->getAddressSpace() == AMDGPUAS::CONSTANT_ADDRESS;
110*9880d681SAndroid Build Coastguard Worker }
111*9880d681SAndroid Build Coastguard Worker
getIntegerAttribute(const Function & F,StringRef Name,int Default)112*9880d681SAndroid Build Coastguard Worker int getIntegerAttribute(const Function &F, StringRef Name, int Default) {
113*9880d681SAndroid Build Coastguard Worker Attribute A = F.getFnAttribute(Name);
114*9880d681SAndroid Build Coastguard Worker int Result = Default;
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker if (A.isStringAttribute()) {
117*9880d681SAndroid Build Coastguard Worker StringRef Str = A.getValueAsString();
118*9880d681SAndroid Build Coastguard Worker if (Str.getAsInteger(0, Result)) {
119*9880d681SAndroid Build Coastguard Worker LLVMContext &Ctx = F.getContext();
120*9880d681SAndroid Build Coastguard Worker Ctx.emitError("can't parse integer attribute " + Name);
121*9880d681SAndroid Build Coastguard Worker }
122*9880d681SAndroid Build Coastguard Worker }
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker return Result;
125*9880d681SAndroid Build Coastguard Worker }
126*9880d681SAndroid Build Coastguard Worker
getMaximumWorkGroupSize(const Function & F)127*9880d681SAndroid Build Coastguard Worker unsigned getMaximumWorkGroupSize(const Function &F) {
128*9880d681SAndroid Build Coastguard Worker return getIntegerAttribute(F, "amdgpu-max-work-group-size", 256);
129*9880d681SAndroid Build Coastguard Worker }
130*9880d681SAndroid Build Coastguard Worker
getInitialPSInputAddr(const Function & F)131*9880d681SAndroid Build Coastguard Worker unsigned getInitialPSInputAddr(const Function &F) {
132*9880d681SAndroid Build Coastguard Worker return getIntegerAttribute(F, "InitialPSInputAddr", 0);
133*9880d681SAndroid Build Coastguard Worker }
134*9880d681SAndroid Build Coastguard Worker
isShader(CallingConv::ID cc)135*9880d681SAndroid Build Coastguard Worker bool isShader(CallingConv::ID cc) {
136*9880d681SAndroid Build Coastguard Worker switch(cc) {
137*9880d681SAndroid Build Coastguard Worker case CallingConv::AMDGPU_VS:
138*9880d681SAndroid Build Coastguard Worker case CallingConv::AMDGPU_GS:
139*9880d681SAndroid Build Coastguard Worker case CallingConv::AMDGPU_PS:
140*9880d681SAndroid Build Coastguard Worker case CallingConv::AMDGPU_CS:
141*9880d681SAndroid Build Coastguard Worker return true;
142*9880d681SAndroid Build Coastguard Worker default:
143*9880d681SAndroid Build Coastguard Worker return false;
144*9880d681SAndroid Build Coastguard Worker }
145*9880d681SAndroid Build Coastguard Worker }
146*9880d681SAndroid Build Coastguard Worker
isCompute(CallingConv::ID cc)147*9880d681SAndroid Build Coastguard Worker bool isCompute(CallingConv::ID cc) {
148*9880d681SAndroid Build Coastguard Worker return !isShader(cc) || cc == CallingConv::AMDGPU_CS;
149*9880d681SAndroid Build Coastguard Worker }
150*9880d681SAndroid Build Coastguard Worker
isSI(const MCSubtargetInfo & STI)151*9880d681SAndroid Build Coastguard Worker bool isSI(const MCSubtargetInfo &STI) {
152*9880d681SAndroid Build Coastguard Worker return STI.getFeatureBits()[AMDGPU::FeatureSouthernIslands];
153*9880d681SAndroid Build Coastguard Worker }
154*9880d681SAndroid Build Coastguard Worker
isCI(const MCSubtargetInfo & STI)155*9880d681SAndroid Build Coastguard Worker bool isCI(const MCSubtargetInfo &STI) {
156*9880d681SAndroid Build Coastguard Worker return STI.getFeatureBits()[AMDGPU::FeatureSeaIslands];
157*9880d681SAndroid Build Coastguard Worker }
158*9880d681SAndroid Build Coastguard Worker
isVI(const MCSubtargetInfo & STI)159*9880d681SAndroid Build Coastguard Worker bool isVI(const MCSubtargetInfo &STI) {
160*9880d681SAndroid Build Coastguard Worker return STI.getFeatureBits()[AMDGPU::FeatureVolcanicIslands];
161*9880d681SAndroid Build Coastguard Worker }
162*9880d681SAndroid Build Coastguard Worker
getMCReg(unsigned Reg,const MCSubtargetInfo & STI)163*9880d681SAndroid Build Coastguard Worker unsigned getMCReg(unsigned Reg, const MCSubtargetInfo &STI) {
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker switch(Reg) {
166*9880d681SAndroid Build Coastguard Worker default: break;
167*9880d681SAndroid Build Coastguard Worker case AMDGPU::FLAT_SCR:
168*9880d681SAndroid Build Coastguard Worker assert(!isSI(STI));
169*9880d681SAndroid Build Coastguard Worker return isCI(STI) ? AMDGPU::FLAT_SCR_ci : AMDGPU::FLAT_SCR_vi;
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker case AMDGPU::FLAT_SCR_LO:
172*9880d681SAndroid Build Coastguard Worker assert(!isSI(STI));
173*9880d681SAndroid Build Coastguard Worker return isCI(STI) ? AMDGPU::FLAT_SCR_LO_ci : AMDGPU::FLAT_SCR_LO_vi;
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Worker case AMDGPU::FLAT_SCR_HI:
176*9880d681SAndroid Build Coastguard Worker assert(!isSI(STI));
177*9880d681SAndroid Build Coastguard Worker return isCI(STI) ? AMDGPU::FLAT_SCR_HI_ci : AMDGPU::FLAT_SCR_HI_vi;
178*9880d681SAndroid Build Coastguard Worker }
179*9880d681SAndroid Build Coastguard Worker return Reg;
180*9880d681SAndroid Build Coastguard Worker }
181*9880d681SAndroid Build Coastguard Worker
182*9880d681SAndroid Build Coastguard Worker } // End namespace AMDGPU
183*9880d681SAndroid Build Coastguard Worker } // End namespace llvm
184