1*9880d681SAndroid Build Coastguard Worker //===-- AMDGPUAsmPrinter.h - Print AMDGPU assembly code ---------*- C++ -*-===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker /// \file 11*9880d681SAndroid Build Coastguard Worker /// \brief AMDGPU Assembly printer class. 12*9880d681SAndroid Build Coastguard Worker // 13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUASMPRINTER_H 16*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_AMDGPU_AMDGPUASMPRINTER_H 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/AsmPrinter.h" 19*9880d681SAndroid Build Coastguard Worker #include <vector> 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker namespace llvm { 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker class AMDGPUAsmPrinter final : public AsmPrinter { 24*9880d681SAndroid Build Coastguard Worker private: 25*9880d681SAndroid Build Coastguard Worker struct SIProgramInfo { SIProgramInfoSIProgramInfo26*9880d681SAndroid Build Coastguard Worker SIProgramInfo() : 27*9880d681SAndroid Build Coastguard Worker VGPRBlocks(0), 28*9880d681SAndroid Build Coastguard Worker SGPRBlocks(0), 29*9880d681SAndroid Build Coastguard Worker Priority(0), 30*9880d681SAndroid Build Coastguard Worker FloatMode(0), 31*9880d681SAndroid Build Coastguard Worker Priv(0), 32*9880d681SAndroid Build Coastguard Worker DX10Clamp(0), 33*9880d681SAndroid Build Coastguard Worker DebugMode(0), 34*9880d681SAndroid Build Coastguard Worker IEEEMode(0), 35*9880d681SAndroid Build Coastguard Worker ScratchSize(0), 36*9880d681SAndroid Build Coastguard Worker ComputePGMRSrc1(0), 37*9880d681SAndroid Build Coastguard Worker LDSBlocks(0), 38*9880d681SAndroid Build Coastguard Worker ScratchBlocks(0), 39*9880d681SAndroid Build Coastguard Worker ComputePGMRSrc2(0), 40*9880d681SAndroid Build Coastguard Worker NumVGPR(0), 41*9880d681SAndroid Build Coastguard Worker NumSGPR(0), 42*9880d681SAndroid Build Coastguard Worker FlatUsed(false), 43*9880d681SAndroid Build Coastguard Worker ReservedVGPRFirst(0), 44*9880d681SAndroid Build Coastguard Worker ReservedVGPRCount(0), 45*9880d681SAndroid Build Coastguard Worker DebuggerWavefrontPrivateSegmentOffsetSGPR((uint16_t)-1), 46*9880d681SAndroid Build Coastguard Worker DebuggerPrivateSegmentBufferSGPR((uint16_t)-1), 47*9880d681SAndroid Build Coastguard Worker VCCUsed(false), 48*9880d681SAndroid Build Coastguard Worker CodeLen(0) {} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker // Fields set in PGM_RSRC1 pm4 packet. 51*9880d681SAndroid Build Coastguard Worker uint32_t VGPRBlocks; 52*9880d681SAndroid Build Coastguard Worker uint32_t SGPRBlocks; 53*9880d681SAndroid Build Coastguard Worker uint32_t Priority; 54*9880d681SAndroid Build Coastguard Worker uint32_t FloatMode; 55*9880d681SAndroid Build Coastguard Worker uint32_t Priv; 56*9880d681SAndroid Build Coastguard Worker uint32_t DX10Clamp; 57*9880d681SAndroid Build Coastguard Worker uint32_t DebugMode; 58*9880d681SAndroid Build Coastguard Worker uint32_t IEEEMode; 59*9880d681SAndroid Build Coastguard Worker uint32_t ScratchSize; 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker uint64_t ComputePGMRSrc1; 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker // Fields set in PGM_RSRC2 pm4 packet. 64*9880d681SAndroid Build Coastguard Worker uint32_t LDSBlocks; 65*9880d681SAndroid Build Coastguard Worker uint32_t ScratchBlocks; 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker uint64_t ComputePGMRSrc2; 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker uint32_t NumVGPR; 70*9880d681SAndroid Build Coastguard Worker uint32_t NumSGPR; 71*9880d681SAndroid Build Coastguard Worker uint32_t LDSSize; 72*9880d681SAndroid Build Coastguard Worker bool FlatUsed; 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker // If ReservedVGPRCount is 0 then must be 0. Otherwise, this is the first 75*9880d681SAndroid Build Coastguard Worker // fixed VGPR number reserved. 76*9880d681SAndroid Build Coastguard Worker uint16_t ReservedVGPRFirst; 77*9880d681SAndroid Build Coastguard Worker // The number of consecutive VGPRs reserved. 78*9880d681SAndroid Build Coastguard Worker uint16_t ReservedVGPRCount; 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker // Fixed SGPR number used to hold wave scratch offset for entire kernel 81*9880d681SAndroid Build Coastguard Worker // execution, or uint16_t(-1) if the register is not used or not known. 82*9880d681SAndroid Build Coastguard Worker uint16_t DebuggerWavefrontPrivateSegmentOffsetSGPR; 83*9880d681SAndroid Build Coastguard Worker // Fixed SGPR number of the first 4 SGPRs used to hold scratch V# for entire 84*9880d681SAndroid Build Coastguard Worker // kernel execution, or uint16_t(-1) if the register is not used or not 85*9880d681SAndroid Build Coastguard Worker // known. 86*9880d681SAndroid Build Coastguard Worker uint16_t DebuggerPrivateSegmentBufferSGPR; 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker // Bonus information for debugging. 89*9880d681SAndroid Build Coastguard Worker bool VCCUsed; 90*9880d681SAndroid Build Coastguard Worker uint64_t CodeLen; 91*9880d681SAndroid Build Coastguard Worker }; 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker void getSIProgramInfo(SIProgramInfo &Out, const MachineFunction &MF) const; 94*9880d681SAndroid Build Coastguard Worker void findNumUsedRegistersSI(const MachineFunction &MF, 95*9880d681SAndroid Build Coastguard Worker unsigned &NumSGPR, 96*9880d681SAndroid Build Coastguard Worker unsigned &NumVGPR) const; 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker /// \brief Emit register usage information so that the GPU driver 99*9880d681SAndroid Build Coastguard Worker /// can correctly setup the GPU state. 100*9880d681SAndroid Build Coastguard Worker void EmitProgramInfoR600(const MachineFunction &MF); 101*9880d681SAndroid Build Coastguard Worker void EmitProgramInfoSI(const MachineFunction &MF, const SIProgramInfo &KernelInfo); 102*9880d681SAndroid Build Coastguard Worker void EmitAmdKernelCodeT(const MachineFunction &MF, 103*9880d681SAndroid Build Coastguard Worker const SIProgramInfo &KernelInfo) const; 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker public: 106*9880d681SAndroid Build Coastguard Worker explicit AMDGPUAsmPrinter(TargetMachine &TM, 107*9880d681SAndroid Build Coastguard Worker std::unique_ptr<MCStreamer> Streamer); 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Worker bool runOnMachineFunction(MachineFunction &MF) override; 110*9880d681SAndroid Build Coastguard Worker getPassName()111*9880d681SAndroid Build Coastguard Worker const char *getPassName() const override { 112*9880d681SAndroid Build Coastguard Worker return "AMDGPU Assembly Printer"; 113*9880d681SAndroid Build Coastguard Worker } 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker /// Implemented in AMDGPUMCInstLower.cpp 116*9880d681SAndroid Build Coastguard Worker void EmitInstruction(const MachineInstr *MI) override; 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker void EmitFunctionBodyStart() override; 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Worker void EmitFunctionEntryLabel() override; 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker void EmitGlobalVariable(const GlobalVariable *GV) override; 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker void EmitStartOfAsmFile(Module &M) override; 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 127*9880d681SAndroid Build Coastguard Worker unsigned AsmVariant, const char *ExtraCode, 128*9880d681SAndroid Build Coastguard Worker raw_ostream &O) override; 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker protected: 131*9880d681SAndroid Build Coastguard Worker std::vector<std::string> DisasmLines, HexLines; 132*9880d681SAndroid Build Coastguard Worker size_t DisasmLineMaxLen; 133*9880d681SAndroid Build Coastguard Worker }; 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker } // End anonymous llvm 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker #endif 138