1e8d8bef9SDimitry Andric //===-- SIProgramInfo.cpp ----------------------------------------------===//
2e8d8bef9SDimitry Andric //
3e8d8bef9SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e8d8bef9SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5e8d8bef9SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e8d8bef9SDimitry Andric //
7e8d8bef9SDimitry Andric //===----------------------------------------------------------------------===//
8e8d8bef9SDimitry Andric //
9e8d8bef9SDimitry Andric /// \file
10e8d8bef9SDimitry Andric ///
11e8d8bef9SDimitry Andric /// The SIProgramInfo tracks resource usage and hardware flags for kernels and
12e8d8bef9SDimitry Andric /// entry functions.
13e8d8bef9SDimitry Andric //
14e8d8bef9SDimitry Andric //===----------------------------------------------------------------------===//
15e8d8bef9SDimitry Andric //
16e8d8bef9SDimitry Andric 
17e8d8bef9SDimitry Andric #include "SIProgramInfo.h"
18*c9157d92SDimitry Andric #include "GCNSubtarget.h"
19e8d8bef9SDimitry Andric #include "SIDefines.h"
20e8d8bef9SDimitry Andric #include "Utils/AMDGPUBaseInfo.h"
21e8d8bef9SDimitry Andric 
22e8d8bef9SDimitry Andric using namespace llvm;
23e8d8bef9SDimitry Andric 
getComputePGMRSrc1(const GCNSubtarget & ST) const24*c9157d92SDimitry Andric uint64_t SIProgramInfo::getComputePGMRSrc1(const GCNSubtarget &ST) const {
25*c9157d92SDimitry Andric   uint64_t Reg = S_00B848_VGPRS(VGPRBlocks) | S_00B848_SGPRS(SGPRBlocks) |
26e8d8bef9SDimitry Andric                  S_00B848_PRIORITY(Priority) | S_00B848_FLOAT_MODE(FloatMode) |
27*c9157d92SDimitry Andric                  S_00B848_PRIV(Priv) | S_00B848_DEBUG_MODE(DebugMode) |
28e8d8bef9SDimitry Andric                  S_00B848_WGP_MODE(WgpMode) | S_00B848_MEM_ORDERED(MemOrdered);
29*c9157d92SDimitry Andric 
30*c9157d92SDimitry Andric   if (ST.hasDX10ClampMode())
31*c9157d92SDimitry Andric     Reg |= S_00B848_DX10_CLAMP(DX10Clamp);
32*c9157d92SDimitry Andric 
33*c9157d92SDimitry Andric   if (ST.hasIEEEMode())
34*c9157d92SDimitry Andric     Reg |= S_00B848_IEEE_MODE(IEEEMode);
35*c9157d92SDimitry Andric 
36*c9157d92SDimitry Andric   if (ST.hasRrWGMode())
37*c9157d92SDimitry Andric     Reg |= S_00B848_RR_WG_MODE(RrWgMode);
38*c9157d92SDimitry Andric 
39*c9157d92SDimitry Andric   return Reg;
40e8d8bef9SDimitry Andric }
41e8d8bef9SDimitry Andric 
getPGMRSrc1(CallingConv::ID CC,const GCNSubtarget & ST) const42*c9157d92SDimitry Andric uint64_t SIProgramInfo::getPGMRSrc1(CallingConv::ID CC,
43*c9157d92SDimitry Andric                                     const GCNSubtarget &ST) const {
44e8d8bef9SDimitry Andric   if (AMDGPU::isCompute(CC)) {
45*c9157d92SDimitry Andric     return getComputePGMRSrc1(ST);
46e8d8bef9SDimitry Andric   }
47e8d8bef9SDimitry Andric   uint64_t Reg = S_00B848_VGPRS(VGPRBlocks) | S_00B848_SGPRS(SGPRBlocks) |
48e8d8bef9SDimitry Andric                  S_00B848_PRIORITY(Priority) | S_00B848_FLOAT_MODE(FloatMode) |
49*c9157d92SDimitry Andric                  S_00B848_PRIV(Priv) | S_00B848_DEBUG_MODE(DebugMode);
50*c9157d92SDimitry Andric 
51*c9157d92SDimitry Andric   if (ST.hasDX10ClampMode())
52*c9157d92SDimitry Andric     Reg |= S_00B848_DX10_CLAMP(DX10Clamp);
53*c9157d92SDimitry Andric 
54*c9157d92SDimitry Andric   if (ST.hasIEEEMode())
55*c9157d92SDimitry Andric     Reg |= S_00B848_IEEE_MODE(IEEEMode);
56*c9157d92SDimitry Andric 
57*c9157d92SDimitry Andric   if (ST.hasRrWGMode())
58*c9157d92SDimitry Andric     Reg |= S_00B848_RR_WG_MODE(RrWgMode);
59*c9157d92SDimitry Andric 
60e8d8bef9SDimitry Andric   switch (CC) {
61e8d8bef9SDimitry Andric   case CallingConv::AMDGPU_PS:
62e8d8bef9SDimitry Andric     Reg |= S_00B028_MEM_ORDERED(MemOrdered);
63e8d8bef9SDimitry Andric     break;
64e8d8bef9SDimitry Andric   case CallingConv::AMDGPU_VS:
65e8d8bef9SDimitry Andric     Reg |= S_00B128_MEM_ORDERED(MemOrdered);
66e8d8bef9SDimitry Andric     break;
67e8d8bef9SDimitry Andric   case CallingConv::AMDGPU_GS:
68e8d8bef9SDimitry Andric     Reg |= S_00B228_WGP_MODE(WgpMode) | S_00B228_MEM_ORDERED(MemOrdered);
69e8d8bef9SDimitry Andric     break;
70e8d8bef9SDimitry Andric   case CallingConv::AMDGPU_HS:
71e8d8bef9SDimitry Andric     Reg |= S_00B428_WGP_MODE(WgpMode) | S_00B428_MEM_ORDERED(MemOrdered);
72e8d8bef9SDimitry Andric     break;
73e8d8bef9SDimitry Andric   default:
74e8d8bef9SDimitry Andric     break;
75e8d8bef9SDimitry Andric   }
76e8d8bef9SDimitry Andric   return Reg;
77e8d8bef9SDimitry Andric }
78fe013be4SDimitry Andric 
getComputePGMRSrc2() const79fe013be4SDimitry Andric uint64_t SIProgramInfo::getComputePGMRSrc2() const {
80fe013be4SDimitry Andric   uint64_t Reg =
81fe013be4SDimitry Andric       S_00B84C_SCRATCH_EN(ScratchEnable) | S_00B84C_USER_SGPR(UserSGPR) |
82fe013be4SDimitry Andric       S_00B84C_TRAP_HANDLER(TrapHandlerEnable) |
83fe013be4SDimitry Andric       S_00B84C_TGID_X_EN(TGIdXEnable) | S_00B84C_TGID_Y_EN(TGIdYEnable) |
84fe013be4SDimitry Andric       S_00B84C_TGID_Z_EN(TGIdZEnable) | S_00B84C_TG_SIZE_EN(TGSizeEnable) |
85fe013be4SDimitry Andric       S_00B84C_TIDIG_COMP_CNT(TIdIGCompCount) |
86fe013be4SDimitry Andric       S_00B84C_EXCP_EN_MSB(EXCPEnMSB) | S_00B84C_LDS_SIZE(LdsSize) |
87fe013be4SDimitry Andric       S_00B84C_EXCP_EN(EXCPEnable);
88fe013be4SDimitry Andric 
89fe013be4SDimitry Andric   return Reg;
90fe013be4SDimitry Andric }
91fe013be4SDimitry Andric 
getPGMRSrc2(CallingConv::ID CC) const92fe013be4SDimitry Andric uint64_t SIProgramInfo::getPGMRSrc2(CallingConv::ID CC) const {
93fe013be4SDimitry Andric   if (AMDGPU::isCompute(CC))
94fe013be4SDimitry Andric     return getComputePGMRSrc2();
95fe013be4SDimitry Andric 
96fe013be4SDimitry Andric   return 0;
97fe013be4SDimitry Andric }
98