AMDGPUAsmPrinter.cpp revision e3d4cbc7d25061441adafa47450a31571c87bf85
1f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//===-- AMDGPUAsmPrinter.cpp - AMDGPU Assebly printer  --------------------===//
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///
12f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard/// The AMDGPUAsmPrinter is used to print both assembly string and also binary
13f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard/// code.  When passed an MCAsmStreamer it prints assembly and when passed
14f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard/// an MCObjectStreamer it outputs binary code.
15f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//
16f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//===----------------------------------------------------------------------===//
17f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//
18f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
19f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
20f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "AMDGPUAsmPrinter.h"
21f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "AMDGPU.h"
22f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard#include "R600Defines.h"
232a74639bc7713146b1182328892807c421c84265Vincent Lejeune#include "R600MachineFunctionInfo.h"
24141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune#include "R600RegisterInfo.h"
255c35290fa35ae234fed02496404cb0fc37e1c8a5Benjamin Kramer#include "SIDefines.h"
265c35290fa35ae234fed02496404cb0fc37e1c8a5Benjamin Kramer#include "SIMachineFunctionInfo.h"
275c35290fa35ae234fed02496404cb0fc37e1c8a5Benjamin Kramer#include "SIRegisterInfo.h"
28bf1efe642111043eeb7ccaf3da759f4d2d1e4647Tom Stellard#include "llvm/MC/MCContext.h"
29bf1efe642111043eeb7ccaf3da759f4d2d1e4647Tom Stellard#include "llvm/MC/MCSectionELF.h"
30f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "llvm/MC/MCStreamer.h"
31bf1efe642111043eeb7ccaf3da759f4d2d1e4647Tom Stellard#include "llvm/Support/ELF.h"
32e3d4cbc7d25061441adafa47450a31571c87bf85Tom Stellard#include "llvm/Support/MathExtras.h"
33f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "llvm/Support/TargetRegistry.h"
3458a2cbef4aac9ee7d530dfb690c78d6fc11a2371Chandler Carruth#include "llvm/Target/TargetLoweringObjectFile.h"
35f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
36f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardusing namespace llvm;
37f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
38f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
39f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardstatic AsmPrinter *createAMDGPUAsmPrinterPass(TargetMachine &tm,
40f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                              MCStreamer &Streamer) {
41f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  return new AMDGPUAsmPrinter(tm, Streamer);
42f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
43f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
44f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardextern "C" void LLVMInitializeR600AsmPrinter() {
45f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  TargetRegistry::RegisterAsmPrinter(TheAMDGPUTarget, createAMDGPUAsmPrinterPass);
46f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
47f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
48f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard/// We need to override this function so we can avoid
49f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard/// the call to EmitFunctionHeader(), which the MCPureStreamer can't handle.
50f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardbool AMDGPUAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
51f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  const AMDGPUSubtarget &STM = TM.getSubtarget<AMDGPUSubtarget>();
52f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  if (STM.dumpCode()) {
53f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
54f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    MF.dump();
55f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#endif
56f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
57f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  SetupMachineFunction(MF);
583ce2ec847885b004c768869b825be1ff9d98eca3Tom Stellard  if (OutStreamer.hasRawTextSupport()) {
593ce2ec847885b004c768869b825be1ff9d98eca3Tom Stellard    OutStreamer.EmitRawText("@" + MF.getName() + ":");
603ce2ec847885b004c768869b825be1ff9d98eca3Tom Stellard  }
61141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune
62141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune  const MCSectionELF *ConfigSection = getObjFileLowering().getContext()
63141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune                                              .getELFSection(".AMDGPU.config",
6487cba4a4c1d5b8b026c83b0916b37255600ecd5fTom Stellard                                              ELF::SHT_PROGBITS, 0,
65141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune                                              SectionKind::getReadOnly());
66141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune  OutStreamer.SwitchSection(ConfigSection);
673ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  if (STM.getGeneration() > AMDGPUSubtarget::NORTHERN_ISLANDS) {
68141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune    EmitProgramInfoSI(MF);
69141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune  } else {
70141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune    EmitProgramInfoR600(MF);
71f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
72bf1efe642111043eeb7ccaf3da759f4d2d1e4647Tom Stellard  OutStreamer.SwitchSection(getObjFileLowering().getTextSection());
73f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  EmitFunctionBody();
74f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  return false;
75f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
76f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
77141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeunevoid AMDGPUAsmPrinter::EmitProgramInfoR600(MachineFunction &MF) {
78141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune  unsigned MaxGPR = 0;
7986cdb704174828b8e91e94132a19634e3c11d87dVincent Lejeune  bool killPixel = false;
80141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune  const R600RegisterInfo * RI =
81141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune                static_cast<const R600RegisterInfo*>(TM.getRegisterInfo());
822a74639bc7713146b1182328892807c421c84265Vincent Lejeune  R600MachineFunctionInfo *MFI = MF.getInfo<R600MachineFunctionInfo>();
83f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard  const AMDGPUSubtarget &STM = TM.getSubtarget<AMDGPUSubtarget>();
84141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune
85141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune  for (MachineFunction::iterator BB = MF.begin(), BB_E = MF.end();
86141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune                                                  BB != BB_E; ++BB) {
87141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune    MachineBasicBlock &MBB = *BB;
88141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune    for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end();
89141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune                                                    I != E; ++I) {
90141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune      MachineInstr &MI = *I;
9186cdb704174828b8e91e94132a19634e3c11d87dVincent Lejeune      if (MI.getOpcode() == AMDGPU::KILLGT)
9286cdb704174828b8e91e94132a19634e3c11d87dVincent Lejeune        killPixel = true;
93141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune      unsigned numOperands = MI.getNumOperands();
94141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune      for (unsigned op_idx = 0; op_idx < numOperands; op_idx++) {
95141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune        MachineOperand & MO = MI.getOperand(op_idx);
96141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune        if (!MO.isReg())
97141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune          continue;
98141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune        unsigned HWReg = RI->getEncodingValue(MO.getReg()) & 0xff;
99141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune
100141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune        // Register with value > 127 aren't GPR
101141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune        if (HWReg > 127)
102141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune          continue;
103141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune        MaxGPR = std::max(MaxGPR, HWReg);
104141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune      }
105141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune    }
106141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune  }
107f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard
108f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard  unsigned RsrcReg;
1093ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  if (STM.getGeneration() >= AMDGPUSubtarget::EVERGREEN) {
110f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    // Evergreen / Northern Islands
111f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    switch (MFI->ShaderType) {
112f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    default: // Fall through
113f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    case ShaderType::COMPUTE:  RsrcReg = R_0288D4_SQ_PGM_RESOURCES_LS; break;
114f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    case ShaderType::GEOMETRY: RsrcReg = R_028878_SQ_PGM_RESOURCES_GS; break;
115f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    case ShaderType::PIXEL:    RsrcReg = R_028844_SQ_PGM_RESOURCES_PS; break;
116f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    case ShaderType::VERTEX:   RsrcReg = R_028860_SQ_PGM_RESOURCES_VS; break;
117f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    }
118f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard  } else {
119f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    // R600 / R700
120f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    switch (MFI->ShaderType) {
121f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    default: // Fall through
122f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    case ShaderType::GEOMETRY: // Fall through
123f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    case ShaderType::COMPUTE:  // Fall through
124f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    case ShaderType::VERTEX:   RsrcReg = R_028868_SQ_PGM_RESOURCES_VS; break;
125f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    case ShaderType::PIXEL:    RsrcReg = R_028850_SQ_PGM_RESOURCES_PS; break;
126f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    }
127f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard  }
128f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard
129f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard  OutStreamer.EmitIntValue(RsrcReg, 4);
130f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard  OutStreamer.EmitIntValue(S_NUM_GPRS(MaxGPR + 1) |
131f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard                           S_STACK_SIZE(MFI->StackSize), 4);
132f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard  OutStreamer.EmitIntValue(R_02880C_DB_SHADER_CONTROL, 4);
133f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard  OutStreamer.EmitIntValue(S_02880C_KILL_ENABLE(killPixel), 4);
134e3d4cbc7d25061441adafa47450a31571c87bf85Tom Stellard
135e3d4cbc7d25061441adafa47450a31571c87bf85Tom Stellard  if (MFI->ShaderType == ShaderType::COMPUTE) {
136e3d4cbc7d25061441adafa47450a31571c87bf85Tom Stellard    OutStreamer.EmitIntValue(R_0288E8_SQ_LDS_ALLOC, 4);
137e3d4cbc7d25061441adafa47450a31571c87bf85Tom Stellard    OutStreamer.EmitIntValue(RoundUpToAlignment(MFI->LDSSize, 4) >> 2, 4);
138e3d4cbc7d25061441adafa47450a31571c87bf85Tom Stellard  }
139141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune}
140141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune
141141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeunevoid AMDGPUAsmPrinter::EmitProgramInfoSI(MachineFunction &MF) {
142f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  unsigned MaxSGPR = 0;
143f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  unsigned MaxVGPR = 0;
144f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  bool VCCUsed = false;
145f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  const SIRegisterInfo * RI =
146f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                static_cast<const SIRegisterInfo*>(TM.getRegisterInfo());
147f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
148f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  for (MachineFunction::iterator BB = MF.begin(), BB_E = MF.end();
149f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                                  BB != BB_E; ++BB) {
150f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    MachineBasicBlock &MBB = *BB;
151f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end();
152f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                                    I != E; ++I) {
153f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard      MachineInstr &MI = *I;
154f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
155f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard      unsigned numOperands = MI.getNumOperands();
156f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard      for (unsigned op_idx = 0; op_idx < numOperands; op_idx++) {
157f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        MachineOperand & MO = MI.getOperand(op_idx);
158f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        unsigned maxUsed;
159f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        unsigned width = 0;
160f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        bool isSGPR = false;
161f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        unsigned reg;
162f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        unsigned hwReg;
163f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        if (!MO.isReg()) {
164f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          continue;
165f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        }
166f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        reg = MO.getReg();
167f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        if (reg == AMDGPU::VCC) {
168f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          VCCUsed = true;
169f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          continue;
170f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        }
171f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        switch (reg) {
172f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        default: break;
173f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        case AMDGPU::EXEC:
174f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        case AMDGPU::M0:
175f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          continue;
176f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        }
177f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
178f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        if (AMDGPU::SReg_32RegClass.contains(reg)) {
179f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          isSGPR = true;
180f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          width = 1;
181f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        } else if (AMDGPU::VReg_32RegClass.contains(reg)) {
182f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          isSGPR = false;
183f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          width = 1;
184f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        } else if (AMDGPU::SReg_64RegClass.contains(reg)) {
185f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          isSGPR = true;
186f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          width = 2;
187f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        } else if (AMDGPU::VReg_64RegClass.contains(reg)) {
188f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          isSGPR = false;
189f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          width = 2;
1904d0e8a8a3e2e5b98f598acad4d57452b99d52e74Christian Konig        } else if (AMDGPU::VReg_96RegClass.contains(reg)) {
1914d0e8a8a3e2e5b98f598acad4d57452b99d52e74Christian Konig          isSGPR = false;
1924d0e8a8a3e2e5b98f598acad4d57452b99d52e74Christian Konig          width = 3;
193f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        } else if (AMDGPU::SReg_128RegClass.contains(reg)) {
194f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          isSGPR = true;
195f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          width = 4;
196f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        } else if (AMDGPU::VReg_128RegClass.contains(reg)) {
197f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          isSGPR = false;
198f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          width = 4;
199f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        } else if (AMDGPU::SReg_256RegClass.contains(reg)) {
200f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          isSGPR = true;
201f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          width = 8;
20236ba9091843bd1205fe3499ba4b55bbedc6583c9Tom Stellard        } else if (AMDGPU::VReg_256RegClass.contains(reg)) {
20336ba9091843bd1205fe3499ba4b55bbedc6583c9Tom Stellard          isSGPR = false;
20436ba9091843bd1205fe3499ba4b55bbedc6583c9Tom Stellard          width = 8;
20536ba9091843bd1205fe3499ba4b55bbedc6583c9Tom Stellard        } else if (AMDGPU::VReg_512RegClass.contains(reg)) {
20636ba9091843bd1205fe3499ba4b55bbedc6583c9Tom Stellard          isSGPR = false;
20736ba9091843bd1205fe3499ba4b55bbedc6583c9Tom Stellard          width = 16;
208f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        } else {
209f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          assert(!"Unknown register class");
210f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        }
211184f5c1545e06a99951f14d846a1d853ff19a2b8Tom Stellard        hwReg = RI->getEncodingValue(reg) & 0xff;
212f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        maxUsed = hwReg + width - 1;
213f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        if (isSGPR) {
214f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          MaxSGPR = maxUsed > MaxSGPR ? maxUsed : MaxSGPR;
215f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        } else {
216f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          MaxVGPR = maxUsed > MaxVGPR ? maxUsed : MaxVGPR;
217f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        }
218f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard      }
219f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    }
220f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
221f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  if (VCCUsed) {
222f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    MaxSGPR += 2;
223f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
224f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  SIMachineFunctionInfo * MFI = MF.getInfo<SIMachineFunctionInfo>();
2259a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  unsigned RsrcReg;
2269a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  switch (MFI->ShaderType) {
2279a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  default: // Fall through
2289a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  case ShaderType::COMPUTE:  RsrcReg = R_00B848_COMPUTE_PGM_RSRC1; break;
2299a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  case ShaderType::GEOMETRY: RsrcReg = R_00B228_SPI_SHADER_PGM_RSRC1_GS; break;
2309a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  case ShaderType::PIXEL:    RsrcReg = R_00B028_SPI_SHADER_PGM_RSRC1_PS; break;
2319a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  case ShaderType::VERTEX:   RsrcReg = R_00B128_SPI_SHADER_PGM_RSRC1_VS; break;
2329a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  }
2339a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard
2349a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  OutStreamer.EmitIntValue(RsrcReg, 4);
2359a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  OutStreamer.EmitIntValue(S_00B028_VGPRS(MaxVGPR / 4) | S_00B028_SGPRS(MaxSGPR / 8), 4);
2369a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  if (MFI->ShaderType == ShaderType::PIXEL) {
2379a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard    OutStreamer.EmitIntValue(R_0286CC_SPI_PS_INPUT_ENA, 4);
2389a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard    OutStreamer.EmitIntValue(MFI->PSInputAddr, 4);
2399a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  }
240f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
241