blob: fc2d58915e7613d07f4d11492b85f93765ca28fc [file] [log] [blame]
Matt Arsenaultd82c1832013-11-10 01:03:59 +00001//===-- AMDGPUAsmPrinter.h - Print AMDGPU assembly code ---------*- C++ -*-===//
Tom Stellard75aadc22012-12-11 21:25:42 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10/// \file
11/// \brief AMDGPU Assembly printer class.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef AMDGPU_ASMPRINTER_H
16#define AMDGPU_ASMPRINTER_H
17
18#include "llvm/CodeGen/AsmPrinter.h"
Tom Stellarded699252013-10-12 05:02:51 +000019#include <vector>
Tom Stellard75aadc22012-12-11 21:25:42 +000020
21namespace llvm {
22
23class AMDGPUAsmPrinter : public AsmPrinter {
Matt Arsenault89cc49f2013-12-05 05:15:35 +000024private:
25 struct SIProgramInfo {
Matt Arsenaulte500e322014-04-15 22:40:47 +000026 SIProgramInfo() :
Matt Arsenault0989d512014-06-26 17:22:30 +000027 NumVGPR(0),
Matt Arsenaulte500e322014-04-15 22:40:47 +000028 NumSGPR(0),
Matt Arsenault0989d512014-06-26 17:22:30 +000029 Priority(0),
30 FloatMode(0),
31 Priv(0),
32 DX10Clamp(0),
33 DebugMode(0),
34 IEEEMode(0),
35 CodeLen(0) {}
Matt Arsenaulte500e322014-04-15 22:40:47 +000036
Matt Arsenault0989d512014-06-26 17:22:30 +000037 // Fields set in PGM_RSRC1 pm4 packet.
38 uint32_t NumVGPR;
39 uint32_t NumSGPR;
40 uint32_t Priority;
41 uint32_t FloatMode;
42 uint32_t Priv;
43 uint32_t DX10Clamp;
44 uint32_t DebugMode;
45 uint32_t IEEEMode;
46
47 // Bonus information for debugging.
Matt Arsenaulte500e322014-04-15 22:40:47 +000048 uint64_t CodeLen;
Matt Arsenault89cc49f2013-12-05 05:15:35 +000049 };
50
Matt Arsenaultd32dbb62014-07-13 03:06:43 +000051 void getSIProgramInfo(SIProgramInfo &Out, const MachineFunction &MF) const;
52 void findNumUsedRegistersSI(const MachineFunction &MF,
Matt Arsenault89cc49f2013-12-05 05:15:35 +000053 unsigned &NumSGPR,
54 unsigned &NumVGPR) const;
55
56 /// \brief Emit register usage information so that the GPU driver
57 /// can correctly setup the GPU state.
Matt Arsenaultd32dbb62014-07-13 03:06:43 +000058 void EmitProgramInfoR600(const MachineFunction &MF);
59 void EmitProgramInfoSI(const MachineFunction &MF, const SIProgramInfo &KernelInfo);
Tom Stellard75aadc22012-12-11 21:25:42 +000060
61public:
Tom Stellarded699252013-10-12 05:02:51 +000062 explicit AMDGPUAsmPrinter(TargetMachine &TM, MCStreamer &Streamer);
Tom Stellard75aadc22012-12-11 21:25:42 +000063
Craig Topper5656db42014-04-29 07:57:24 +000064 bool runOnMachineFunction(MachineFunction &MF) override;
Tom Stellard75aadc22012-12-11 21:25:42 +000065
Craig Topper5656db42014-04-29 07:57:24 +000066 const char *getPassName() const override {
Tom Stellard75aadc22012-12-11 21:25:42 +000067 return "AMDGPU Assembly Printer";
68 }
69
Tom Stellard75aadc22012-12-11 21:25:42 +000070 /// Implemented in AMDGPUMCInstLower.cpp
Craig Topper5656db42014-04-29 07:57:24 +000071 void EmitInstruction(const MachineInstr *MI) override;
Tom Stellarded699252013-10-12 05:02:51 +000072
Tom Stellard067c8152014-07-21 14:01:14 +000073 void EmitEndOfAsmFile(Module &M) override;
74
Tom Stellarded699252013-10-12 05:02:51 +000075protected:
76 bool DisasmEnabled;
77 std::vector<std::string> DisasmLines, HexLines;
78 size_t DisasmLineMaxLen;
Tom Stellard75aadc22012-12-11 21:25:42 +000079};
80
81} // End anonymous llvm
82
83#endif //AMDGPU_ASMPRINTER_H