AMDGPUAsmPrinter.cpp revision 29a651af8a4b522daf1f9102c93e4c8ecc2ef3c2
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
48f9318673178309288f9320efe02d529419ac32a2Tom StellardAMDGPUAsmPrinter::AMDGPUAsmPrinter(TargetMachine &TM, MCStreamer &Streamer)
49f9318673178309288f9320efe02d529419ac32a2Tom Stellard    : AsmPrinter(TM, Streamer)
50f9318673178309288f9320efe02d529419ac32a2Tom Stellard{
51f9318673178309288f9320efe02d529419ac32a2Tom Stellard  DisasmEnabled = TM.getSubtarget<AMDGPUSubtarget>().dumpCode() &&
52f9318673178309288f9320efe02d529419ac32a2Tom Stellard                  ! Streamer.hasRawTextSupport();
53f9318673178309288f9320efe02d529419ac32a2Tom Stellard}
54f9318673178309288f9320efe02d529419ac32a2Tom Stellard
55f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard/// We need to override this function so we can avoid
56f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard/// the call to EmitFunctionHeader(), which the MCPureStreamer can't handle.
57f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardbool AMDGPUAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
58f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  SetupMachineFunction(MF);
593ce2ec847885b004c768869b825be1ff9d98eca3Tom Stellard  if (OutStreamer.hasRawTextSupport()) {
603ce2ec847885b004c768869b825be1ff9d98eca3Tom Stellard    OutStreamer.EmitRawText("@" + MF.getName() + ":");
613ce2ec847885b004c768869b825be1ff9d98eca3Tom Stellard  }
62141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune
63f9318673178309288f9320efe02d529419ac32a2Tom Stellard  MCContext &Context = getObjFileLowering().getContext();
64f9318673178309288f9320efe02d529419ac32a2Tom Stellard  const MCSectionELF *ConfigSection = Context.getELFSection(".AMDGPU.config",
6587cba4a4c1d5b8b026c83b0916b37255600ecd5fTom Stellard                                              ELF::SHT_PROGBITS, 0,
66141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune                                              SectionKind::getReadOnly());
67141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune  OutStreamer.SwitchSection(ConfigSection);
68f9318673178309288f9320efe02d529419ac32a2Tom Stellard  const AMDGPUSubtarget &STM = TM.getSubtarget<AMDGPUSubtarget>();
693ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  if (STM.getGeneration() > AMDGPUSubtarget::NORTHERN_ISLANDS) {
70141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune    EmitProgramInfoSI(MF);
71141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune  } else {
72141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune    EmitProgramInfoR600(MF);
73f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
74f9318673178309288f9320efe02d529419ac32a2Tom Stellard
75f9318673178309288f9320efe02d529419ac32a2Tom Stellard  DisasmLines.clear();
76f9318673178309288f9320efe02d529419ac32a2Tom Stellard  HexLines.clear();
77f9318673178309288f9320efe02d529419ac32a2Tom Stellard  DisasmLineMaxLen = 0;
78f9318673178309288f9320efe02d529419ac32a2Tom Stellard
79bf1efe642111043eeb7ccaf3da759f4d2d1e4647Tom Stellard  OutStreamer.SwitchSection(getObjFileLowering().getTextSection());
80f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  EmitFunctionBody();
81f9318673178309288f9320efe02d529419ac32a2Tom Stellard
82f9318673178309288f9320efe02d529419ac32a2Tom Stellard  if (STM.dumpCode()) {
83f9318673178309288f9320efe02d529419ac32a2Tom Stellard#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
84f9318673178309288f9320efe02d529419ac32a2Tom Stellard    MF.dump();
85f9318673178309288f9320efe02d529419ac32a2Tom Stellard#endif
86f9318673178309288f9320efe02d529419ac32a2Tom Stellard
87f9318673178309288f9320efe02d529419ac32a2Tom Stellard    if (DisasmEnabled) {
88f9318673178309288f9320efe02d529419ac32a2Tom Stellard      OutStreamer.SwitchSection(Context.getELFSection(".AMDGPU.disasm",
89f9318673178309288f9320efe02d529419ac32a2Tom Stellard                                                  ELF::SHT_NOTE, 0,
90f9318673178309288f9320efe02d529419ac32a2Tom Stellard                                                  SectionKind::getReadOnly()));
91f9318673178309288f9320efe02d529419ac32a2Tom Stellard
92f9318673178309288f9320efe02d529419ac32a2Tom Stellard      for (size_t i = 0; i < DisasmLines.size(); ++i) {
93f9318673178309288f9320efe02d529419ac32a2Tom Stellard        std::string Comment(DisasmLineMaxLen - DisasmLines[i].size(), ' ');
94f9318673178309288f9320efe02d529419ac32a2Tom Stellard        Comment += " ; " + HexLines[i] + "\n";
95f9318673178309288f9320efe02d529419ac32a2Tom Stellard
96f9318673178309288f9320efe02d529419ac32a2Tom Stellard        OutStreamer.EmitBytes(StringRef(DisasmLines[i]));
97f9318673178309288f9320efe02d529419ac32a2Tom Stellard        OutStreamer.EmitBytes(StringRef(Comment));
98f9318673178309288f9320efe02d529419ac32a2Tom Stellard      }
99f9318673178309288f9320efe02d529419ac32a2Tom Stellard    }
100f9318673178309288f9320efe02d529419ac32a2Tom Stellard  }
101f9318673178309288f9320efe02d529419ac32a2Tom Stellard
102f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  return false;
103f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
104f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
105141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeunevoid AMDGPUAsmPrinter::EmitProgramInfoR600(MachineFunction &MF) {
106141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune  unsigned MaxGPR = 0;
10786cdb704174828b8e91e94132a19634e3c11d87dVincent Lejeune  bool killPixel = false;
108141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune  const R600RegisterInfo * RI =
109141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune                static_cast<const R600RegisterInfo*>(TM.getRegisterInfo());
1102a74639bc7713146b1182328892807c421c84265Vincent Lejeune  R600MachineFunctionInfo *MFI = MF.getInfo<R600MachineFunctionInfo>();
111f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard  const AMDGPUSubtarget &STM = TM.getSubtarget<AMDGPUSubtarget>();
112141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune
113141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune  for (MachineFunction::iterator BB = MF.begin(), BB_E = MF.end();
114141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune                                                  BB != BB_E; ++BB) {
115141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune    MachineBasicBlock &MBB = *BB;
116141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune    for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end();
117141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune                                                    I != E; ++I) {
118141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune      MachineInstr &MI = *I;
11986cdb704174828b8e91e94132a19634e3c11d87dVincent Lejeune      if (MI.getOpcode() == AMDGPU::KILLGT)
12086cdb704174828b8e91e94132a19634e3c11d87dVincent Lejeune        killPixel = true;
121141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune      unsigned numOperands = MI.getNumOperands();
122141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune      for (unsigned op_idx = 0; op_idx < numOperands; op_idx++) {
123141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune        MachineOperand & MO = MI.getOperand(op_idx);
124141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune        if (!MO.isReg())
125141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune          continue;
126141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune        unsigned HWReg = RI->getEncodingValue(MO.getReg()) & 0xff;
127141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune
128141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune        // Register with value > 127 aren't GPR
129141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune        if (HWReg > 127)
130141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune          continue;
131141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune        MaxGPR = std::max(MaxGPR, HWReg);
132141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune      }
133141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune    }
134141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune  }
135f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard
136f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard  unsigned RsrcReg;
1373ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  if (STM.getGeneration() >= AMDGPUSubtarget::EVERGREEN) {
138f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    // Evergreen / Northern Islands
139f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    switch (MFI->ShaderType) {
140f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    default: // Fall through
141f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    case ShaderType::COMPUTE:  RsrcReg = R_0288D4_SQ_PGM_RESOURCES_LS; break;
142f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    case ShaderType::GEOMETRY: RsrcReg = R_028878_SQ_PGM_RESOURCES_GS; break;
143f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    case ShaderType::PIXEL:    RsrcReg = R_028844_SQ_PGM_RESOURCES_PS; break;
144f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    case ShaderType::VERTEX:   RsrcReg = R_028860_SQ_PGM_RESOURCES_VS; break;
145f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    }
146f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard  } else {
147f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    // R600 / R700
148f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    switch (MFI->ShaderType) {
149f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    default: // Fall through
150f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    case ShaderType::GEOMETRY: // Fall through
151f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    case ShaderType::COMPUTE:  // Fall through
152f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    case ShaderType::VERTEX:   RsrcReg = R_028868_SQ_PGM_RESOURCES_VS; break;
153f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    case ShaderType::PIXEL:    RsrcReg = R_028850_SQ_PGM_RESOURCES_PS; break;
154f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard    }
155f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard  }
156f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard
157f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard  OutStreamer.EmitIntValue(RsrcReg, 4);
158f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard  OutStreamer.EmitIntValue(S_NUM_GPRS(MaxGPR + 1) |
159f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard                           S_STACK_SIZE(MFI->StackSize), 4);
160f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard  OutStreamer.EmitIntValue(R_02880C_DB_SHADER_CONTROL, 4);
161f07b5373d7493d29cd758ababf135c2d0d8da127Tom Stellard  OutStreamer.EmitIntValue(S_02880C_KILL_ENABLE(killPixel), 4);
162e3d4cbc7d25061441adafa47450a31571c87bf85Tom Stellard
163e3d4cbc7d25061441adafa47450a31571c87bf85Tom Stellard  if (MFI->ShaderType == ShaderType::COMPUTE) {
164e3d4cbc7d25061441adafa47450a31571c87bf85Tom Stellard    OutStreamer.EmitIntValue(R_0288E8_SQ_LDS_ALLOC, 4);
165e3d4cbc7d25061441adafa47450a31571c87bf85Tom Stellard    OutStreamer.EmitIntValue(RoundUpToAlignment(MFI->LDSSize, 4) >> 2, 4);
166e3d4cbc7d25061441adafa47450a31571c87bf85Tom Stellard  }
167141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune}
168141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeune
169141ca7fc6488bfb20ad59854cc12039e16688ed3Vincent Lejeunevoid AMDGPUAsmPrinter::EmitProgramInfoSI(MachineFunction &MF) {
17054328c772c5519e56c13667c2b1d1e830580c44dTom Stellard  const AMDGPUSubtarget &STM = TM.getSubtarget<AMDGPUSubtarget>();
171f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  unsigned MaxSGPR = 0;
172f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  unsigned MaxVGPR = 0;
173f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  bool VCCUsed = false;
174f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  const SIRegisterInfo * RI =
175f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                static_cast<const SIRegisterInfo*>(TM.getRegisterInfo());
176f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
177f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  for (MachineFunction::iterator BB = MF.begin(), BB_E = MF.end();
178f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                                  BB != BB_E; ++BB) {
179f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    MachineBasicBlock &MBB = *BB;
180f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end();
181f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                                    I != E; ++I) {
182f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard      MachineInstr &MI = *I;
183f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
184f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard      unsigned numOperands = MI.getNumOperands();
185f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard      for (unsigned op_idx = 0; op_idx < numOperands; op_idx++) {
18629a651af8a4b522daf1f9102c93e4c8ecc2ef3c2Matt Arsenault        MachineOperand &MO = MI.getOperand(op_idx);
187f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        unsigned maxUsed;
188f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        unsigned width = 0;
189f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        bool isSGPR = false;
190f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        unsigned reg;
191f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        unsigned hwReg;
192f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        if (!MO.isReg()) {
193f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          continue;
194f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        }
195f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        reg = MO.getReg();
196f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        if (reg == AMDGPU::VCC) {
197f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          VCCUsed = true;
198f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          continue;
199f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        }
2008305cae0045f804b7cca7c69f83f20ad847817bdMatt Arsenault
201f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        switch (reg) {
202f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        default: break;
2038305cae0045f804b7cca7c69f83f20ad847817bdMatt Arsenault        case AMDGPU::SCC:
204f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        case AMDGPU::EXEC:
205f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        case AMDGPU::M0:
206f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          continue;
207f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        }
208f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
209f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        if (AMDGPU::SReg_32RegClass.contains(reg)) {
210f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          isSGPR = true;
211f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          width = 1;
212f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        } else if (AMDGPU::VReg_32RegClass.contains(reg)) {
213f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          isSGPR = false;
214f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          width = 1;
215f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        } else if (AMDGPU::SReg_64RegClass.contains(reg)) {
216f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          isSGPR = true;
217f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          width = 2;
218f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        } else if (AMDGPU::VReg_64RegClass.contains(reg)) {
219f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          isSGPR = false;
220f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          width = 2;
2214d0e8a8a3e2e5b98f598acad4d57452b99d52e74Christian Konig        } else if (AMDGPU::VReg_96RegClass.contains(reg)) {
2224d0e8a8a3e2e5b98f598acad4d57452b99d52e74Christian Konig          isSGPR = false;
2234d0e8a8a3e2e5b98f598acad4d57452b99d52e74Christian Konig          width = 3;
224f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        } else if (AMDGPU::SReg_128RegClass.contains(reg)) {
225f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          isSGPR = true;
226f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          width = 4;
227f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        } else if (AMDGPU::VReg_128RegClass.contains(reg)) {
228f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          isSGPR = false;
229f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          width = 4;
230f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        } else if (AMDGPU::SReg_256RegClass.contains(reg)) {
231f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          isSGPR = true;
232f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          width = 8;
23336ba9091843bd1205fe3499ba4b55bbedc6583c9Tom Stellard        } else if (AMDGPU::VReg_256RegClass.contains(reg)) {
23436ba9091843bd1205fe3499ba4b55bbedc6583c9Tom Stellard          isSGPR = false;
23536ba9091843bd1205fe3499ba4b55bbedc6583c9Tom Stellard          width = 8;
236f9e5c398119a77202dc0f7861f5131a7b9f7b8b3Tom Stellard        } else if (AMDGPU::SReg_512RegClass.contains(reg)) {
237f9e5c398119a77202dc0f7861f5131a7b9f7b8b3Tom Stellard          isSGPR = true;
238f9e5c398119a77202dc0f7861f5131a7b9f7b8b3Tom Stellard          width = 16;
23936ba9091843bd1205fe3499ba4b55bbedc6583c9Tom Stellard        } else if (AMDGPU::VReg_512RegClass.contains(reg)) {
24036ba9091843bd1205fe3499ba4b55bbedc6583c9Tom Stellard          isSGPR = false;
24136ba9091843bd1205fe3499ba4b55bbedc6583c9Tom Stellard          width = 16;
242f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        } else {
243f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          assert(!"Unknown register class");
244f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        }
245184f5c1545e06a99951f14d846a1d853ff19a2b8Tom Stellard        hwReg = RI->getEncodingValue(reg) & 0xff;
246f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        maxUsed = hwReg + width - 1;
247f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        if (isSGPR) {
248f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          MaxSGPR = maxUsed > MaxSGPR ? maxUsed : MaxSGPR;
249f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        } else {
250f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard          MaxVGPR = maxUsed > MaxVGPR ? maxUsed : MaxVGPR;
251f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard        }
252f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard      }
253f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    }
254f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
255f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  if (VCCUsed) {
256f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    MaxSGPR += 2;
257f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
258f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  SIMachineFunctionInfo * MFI = MF.getInfo<SIMachineFunctionInfo>();
2599a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  unsigned RsrcReg;
2609a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  switch (MFI->ShaderType) {
2619a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  default: // Fall through
2629a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  case ShaderType::COMPUTE:  RsrcReg = R_00B848_COMPUTE_PGM_RSRC1; break;
2639a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  case ShaderType::GEOMETRY: RsrcReg = R_00B228_SPI_SHADER_PGM_RSRC1_GS; break;
2649a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  case ShaderType::PIXEL:    RsrcReg = R_00B028_SPI_SHADER_PGM_RSRC1_PS; break;
2659a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  case ShaderType::VERTEX:   RsrcReg = R_00B128_SPI_SHADER_PGM_RSRC1_VS; break;
2669a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  }
2679a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard
2689a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  OutStreamer.EmitIntValue(RsrcReg, 4);
2699a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  OutStreamer.EmitIntValue(S_00B028_VGPRS(MaxVGPR / 4) | S_00B028_SGPRS(MaxSGPR / 8), 4);
270a3e39dc7055486cbf514ccd868cfabc69d7f6f4eMichel Danzer
27154328c772c5519e56c13667c2b1d1e830580c44dTom Stellard  unsigned LDSAlignShift;
27254328c772c5519e56c13667c2b1d1e830580c44dTom Stellard  if (STM.getGeneration() < AMDGPUSubtarget::SEA_ISLANDS) {
27354328c772c5519e56c13667c2b1d1e830580c44dTom Stellard    // LDS is allocated in 64 dword blocks
27454328c772c5519e56c13667c2b1d1e830580c44dTom Stellard    LDSAlignShift = 8;
27554328c772c5519e56c13667c2b1d1e830580c44dTom Stellard  } else {
27654328c772c5519e56c13667c2b1d1e830580c44dTom Stellard    // LDS is allocated in 128 dword blocks
27754328c772c5519e56c13667c2b1d1e830580c44dTom Stellard    LDSAlignShift = 9;
27854328c772c5519e56c13667c2b1d1e830580c44dTom Stellard  }
27954328c772c5519e56c13667c2b1d1e830580c44dTom Stellard  unsigned LDSBlocks =
28054328c772c5519e56c13667c2b1d1e830580c44dTom Stellard          RoundUpToAlignment(MFI->LDSSize, 1 << LDSAlignShift) >> LDSAlignShift;
28154328c772c5519e56c13667c2b1d1e830580c44dTom Stellard
282a3e39dc7055486cbf514ccd868cfabc69d7f6f4eMichel Danzer  if (MFI->ShaderType == ShaderType::COMPUTE) {
283a3e39dc7055486cbf514ccd868cfabc69d7f6f4eMichel Danzer    OutStreamer.EmitIntValue(R_00B84C_COMPUTE_PGM_RSRC2, 4);
28454328c772c5519e56c13667c2b1d1e830580c44dTom Stellard    OutStreamer.EmitIntValue(S_00B84C_LDS_SIZE(LDSBlocks), 4);
285a3e39dc7055486cbf514ccd868cfabc69d7f6f4eMichel Danzer  }
2869a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  if (MFI->ShaderType == ShaderType::PIXEL) {
287a3e39dc7055486cbf514ccd868cfabc69d7f6f4eMichel Danzer    OutStreamer.EmitIntValue(R_00B02C_SPI_SHADER_PGM_RSRC2_PS, 4);
28854328c772c5519e56c13667c2b1d1e830580c44dTom Stellard    OutStreamer.EmitIntValue(S_00B02C_EXTRA_LDS_SIZE(LDSBlocks), 4);
2899a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard    OutStreamer.EmitIntValue(R_0286CC_SPI_PS_INPUT_ENA, 4);
2909a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard    OutStreamer.EmitIntValue(MFI->PSInputAddr, 4);
2919a256300f8f61937f5f7a148b9cb09936d103a97Tom Stellard  }
292f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
293