blob: 65e581d2582795f51a224c29d0a357f861907a44 [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
Matt Arsenault6b6a2c32016-03-11 08:00:27 +000015#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUASMPRINTER_H
16#define LLVM_LIB_TARGET_AMDGPU_AMDGPUASMPRINTER_H
Tom Stellard75aadc22012-12-11 21:25:42 +000017
Matt Arsenault11f74022016-10-06 17:19:11 +000018#include "AMDGPUMCInstLower.h"
19
Tom Stellard75aadc22012-12-11 21:25:42 +000020#include "llvm/CodeGen/AsmPrinter.h"
Tom Stellarded699252013-10-12 05:02:51 +000021#include <vector>
Tom Stellard75aadc22012-12-11 21:25:42 +000022
23namespace llvm {
Matt Arsenault11f74022016-10-06 17:19:11 +000024class MCOperand;
Tom Stellard75aadc22012-12-11 21:25:42 +000025
Matt Arsenault6b6a2c32016-03-11 08:00:27 +000026class AMDGPUAsmPrinter final : public AsmPrinter {
Matt Arsenault89cc49f2013-12-05 05:15:35 +000027private:
28 struct SIProgramInfo {
Matt Arsenaulte500e322014-04-15 22:40:47 +000029 SIProgramInfo() :
Tom Stellard4df465b2014-12-02 21:28:53 +000030 VGPRBlocks(0),
31 SGPRBlocks(0),
Matt Arsenault0989d512014-06-26 17:22:30 +000032 Priority(0),
33 FloatMode(0),
34 Priv(0),
35 DX10Clamp(0),
36 DebugMode(0),
37 IEEEMode(0),
Tom Stellardb02094e2014-07-21 15:45:01 +000038 ScratchSize(0),
Tom Stellard4df465b2014-12-02 21:28:53 +000039 ComputePGMRSrc1(0),
40 LDSBlocks(0),
41 ScratchBlocks(0),
42 ComputePGMRSrc2(0),
43 NumVGPR(0),
44 NumSGPR(0),
Matt Arsenault3f981402014-09-15 15:41:53 +000045 FlatUsed(false),
Konstantin Zhuravlyov1d650262016-09-06 20:22:28 +000046 NumSGPRsForWavesPerEU(0),
47 NumVGPRsForWavesPerEU(0),
Konstantin Zhuravlyov1d99c4d2016-04-26 15:43:14 +000048 ReservedVGPRFirst(0),
49 ReservedVGPRCount(0),
Konstantin Zhuravlyovf2f3d142016-06-25 03:11:28 +000050 DebuggerWavefrontPrivateSegmentOffsetSGPR((uint16_t)-1),
51 DebuggerPrivateSegmentBufferSGPR((uint16_t)-1),
Matt Arsenault3f981402014-09-15 15:41:53 +000052 VCCUsed(false),
Matt Arsenault0989d512014-06-26 17:22:30 +000053 CodeLen(0) {}
Matt Arsenaulte500e322014-04-15 22:40:47 +000054
Matt Arsenault0989d512014-06-26 17:22:30 +000055 // Fields set in PGM_RSRC1 pm4 packet.
Tom Stellard4df465b2014-12-02 21:28:53 +000056 uint32_t VGPRBlocks;
57 uint32_t SGPRBlocks;
Matt Arsenault0989d512014-06-26 17:22:30 +000058 uint32_t Priority;
59 uint32_t FloatMode;
60 uint32_t Priv;
61 uint32_t DX10Clamp;
62 uint32_t DebugMode;
63 uint32_t IEEEMode;
Tom Stellardb02094e2014-07-21 15:45:01 +000064 uint32_t ScratchSize;
Matt Arsenault0989d512014-06-26 17:22:30 +000065
Tom Stellard4df465b2014-12-02 21:28:53 +000066 uint64_t ComputePGMRSrc1;
67
68 // Fields set in PGM_RSRC2 pm4 packet.
69 uint32_t LDSBlocks;
70 uint32_t ScratchBlocks;
71
72 uint64_t ComputePGMRSrc2;
73
74 uint32_t NumVGPR;
75 uint32_t NumSGPR;
76 uint32_t LDSSize;
Matt Arsenault3f981402014-09-15 15:41:53 +000077 bool FlatUsed;
78
Konstantin Zhuravlyov1d650262016-09-06 20:22:28 +000079 // Number of SGPRs that meets number of waves per execution unit request.
80 uint32_t NumSGPRsForWavesPerEU;
81
82 // Number of VGPRs that meets number of waves per execution unit request.
83 uint32_t NumVGPRsForWavesPerEU;
84
Konstantin Zhuravlyov71515e52016-04-26 17:24:40 +000085 // If ReservedVGPRCount is 0 then must be 0. Otherwise, this is the first
86 // fixed VGPR number reserved.
Konstantin Zhuravlyov1d99c4d2016-04-26 15:43:14 +000087 uint16_t ReservedVGPRFirst;
Konstantin Zhuravlyov1d650262016-09-06 20:22:28 +000088
Konstantin Zhuravlyov71515e52016-04-26 17:24:40 +000089 // The number of consecutive VGPRs reserved.
Konstantin Zhuravlyov1d99c4d2016-04-26 15:43:14 +000090 uint16_t ReservedVGPRCount;
91
Konstantin Zhuravlyovf2f3d142016-06-25 03:11:28 +000092 // Fixed SGPR number used to hold wave scratch offset for entire kernel
93 // execution, or uint16_t(-1) if the register is not used or not known.
94 uint16_t DebuggerWavefrontPrivateSegmentOffsetSGPR;
Konstantin Zhuravlyov1d650262016-09-06 20:22:28 +000095
Konstantin Zhuravlyovf2f3d142016-06-25 03:11:28 +000096 // Fixed SGPR number of the first 4 SGPRs used to hold scratch V# for entire
97 // kernel execution, or uint16_t(-1) if the register is not used or not
98 // known.
99 uint16_t DebuggerPrivateSegmentBufferSGPR;
100
Matt Arsenault0989d512014-06-26 17:22:30 +0000101 // Bonus information for debugging.
Matt Arsenault3f981402014-09-15 15:41:53 +0000102 bool VCCUsed;
Matt Arsenaulte500e322014-04-15 22:40:47 +0000103 uint64_t CodeLen;
Matt Arsenault89cc49f2013-12-05 05:15:35 +0000104 };
105
Matt Arsenaultd32dbb62014-07-13 03:06:43 +0000106 void getSIProgramInfo(SIProgramInfo &Out, const MachineFunction &MF) const;
107 void findNumUsedRegistersSI(const MachineFunction &MF,
Matt Arsenault89cc49f2013-12-05 05:15:35 +0000108 unsigned &NumSGPR,
109 unsigned &NumVGPR) const;
110
111 /// \brief Emit register usage information so that the GPU driver
112 /// can correctly setup the GPU state.
Matt Arsenaultd32dbb62014-07-13 03:06:43 +0000113 void EmitProgramInfoR600(const MachineFunction &MF);
114 void EmitProgramInfoSI(const MachineFunction &MF, const SIProgramInfo &KernelInfo);
Tom Stellardb8fd6ef2014-12-02 22:00:07 +0000115 void EmitAmdKernelCodeT(const MachineFunction &MF,
116 const SIProgramInfo &KernelInfo) const;
Tom Stellard75aadc22012-12-11 21:25:42 +0000117
118public:
David Blaikie94598322015-01-18 20:29:04 +0000119 explicit AMDGPUAsmPrinter(TargetMachine &TM,
120 std::unique_ptr<MCStreamer> Streamer);
Tom Stellard75aadc22012-12-11 21:25:42 +0000121
Craig Topper5656db42014-04-29 07:57:24 +0000122 bool runOnMachineFunction(MachineFunction &MF) override;
Tom Stellard75aadc22012-12-11 21:25:42 +0000123
Mehdi Amini117296c2016-10-01 02:56:57 +0000124 StringRef getPassName() const override;
Tom Stellard75aadc22012-12-11 21:25:42 +0000125
Matt Arsenault11f74022016-10-06 17:19:11 +0000126 /// \brief Wrapper for MCInstLowering.lowerOperand() for the tblgen'erated
127 /// pseudo lowering.
128 bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp) const;
129
130 /// \brief tblgen'erated driver function for lowering simple MI->MC pseudo
131 /// instructions.
132 bool emitPseudoExpansionLowering(MCStreamer &OutStreamer,
133 const MachineInstr *MI);
134
Tom Stellard75aadc22012-12-11 21:25:42 +0000135 /// Implemented in AMDGPUMCInstLower.cpp
Craig Topper5656db42014-04-29 07:57:24 +0000136 void EmitInstruction(const MachineInstr *MI) override;
Tom Stellarded699252013-10-12 05:02:51 +0000137
Tom Stellardf151a452015-06-26 21:14:58 +0000138 void EmitFunctionBodyStart() override;
139
Tom Stellard1e1b05d2015-11-06 11:45:14 +0000140 void EmitFunctionEntryLabel() override;
141
Tom Stellarde3b5aea2015-12-02 17:00:42 +0000142 void EmitGlobalVariable(const GlobalVariable *GV) override;
143
Tom Stellardf4218372016-01-12 17:18:17 +0000144 void EmitStartOfAsmFile(Module &M) override;
145
Matt Arsenault6bc43d82016-10-06 16:20:41 +0000146 bool isBlockOnlyReachableByFallthrough(
147 const MachineBasicBlock *MBB) const override;
148
Tom Stellardd7e6f132015-04-08 01:09:26 +0000149 bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
150 unsigned AsmVariant, const char *ExtraCode,
Tom Stellard80e169a2015-04-08 02:07:05 +0000151 raw_ostream &O) override;
Tom Stellardd7e6f132015-04-08 01:09:26 +0000152
Yaxun Liua711cc72016-07-16 05:09:21 +0000153 void emitStartOfRuntimeMetadata(const Module &M);
154
155 void emitRuntimeMetadata(const Function &F);
156
Tom Stellarded699252013-10-12 05:02:51 +0000157protected:
Tom Stellarded699252013-10-12 05:02:51 +0000158 std::vector<std::string> DisasmLines, HexLines;
159 size_t DisasmLineMaxLen;
Tom Stellard75aadc22012-12-11 21:25:42 +0000160};
161
Alexander Kornienkof00654e2015-06-23 09:49:53 +0000162} // End anonymous llvm
Tom Stellard75aadc22012-12-11 21:25:42 +0000163
Benjamin Kramera7c40ef2014-08-13 16:26:38 +0000164#endif