1 //===-- SPIRVInstPrinter.h - Output SPIR-V MCInsts as ASM -------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This class prints a SPIR-V MCInst to a .s file.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_LIB_TARGET_SPIRV_INSTPRINTER_SPIRVINSTPRINTER_H
14 #define LLVM_LIB_TARGET_SPIRV_INSTPRINTER_SPIRVINSTPRINTER_H
15 
16 #include "llvm/MC/MCInstPrinter.h"
17 
18 namespace llvm {
19 class SPIRVInstPrinter : public MCInstPrinter {
20 private:
21   void recordOpExtInstImport(const MCInst *MI);
22 
23 public:
24   using MCInstPrinter::MCInstPrinter;
25 
26   void printInst(const MCInst *MI, uint64_t Address, StringRef Annot,
27                  const MCSubtargetInfo &STI, raw_ostream &OS) override;
28   void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O,
29                     const char *Modifier = nullptr);
30 
31   void printStringImm(const MCInst *MI, unsigned OpNo, raw_ostream &O);
32 
33   void printOpDecorate(const MCInst *MI, raw_ostream &O);
34   void printOpExtInst(const MCInst *MI, raw_ostream &O);
35   void printRemainingVariableOps(const MCInst *MI, unsigned StartIndex,
36                                  raw_ostream &O, bool SkipFirstSpace = false,
37                                  bool SkipImmediates = false);
38   void printOpConstantVarOps(const MCInst *MI, unsigned StartIndex,
39                              raw_ostream &O);
40 
41   void printExtInst(const MCInst *MI, unsigned OpNo, raw_ostream &O);
42 
43   // SPIR-V enumerations printing.
44   void printCapability(const MCInst *MI, unsigned OpNo, raw_ostream &O);
45   void printSourceLanguage(const MCInst *MI, unsigned OpNo, raw_ostream &O);
46   void printExecutionModel(const MCInst *MI, unsigned OpNo, raw_ostream &O);
47   void printAddressingModel(const MCInst *MI, unsigned OpNo, raw_ostream &O);
48   void printMemoryModel(const MCInst *MI, unsigned OpNo, raw_ostream &O);
49   void printExecutionMode(const MCInst *MI, unsigned OpNo, raw_ostream &O);
50   void printStorageClass(const MCInst *MI, unsigned OpNo, raw_ostream &O);
51   void printDim(const MCInst *MI, unsigned OpNo, raw_ostream &O);
52 
53   void printSamplerAddressingMode(const MCInst *MI, unsigned OpNo,
54                                   raw_ostream &O);
55   void printSamplerFilterMode(const MCInst *MI, unsigned OpNo, raw_ostream &O);
56 
57   void printImageFormat(const MCInst *MI, unsigned OpNo, raw_ostream &O);
58   void printImageChannelOrder(const MCInst *MI, unsigned OpNo, raw_ostream &O);
59   void printImageChannelDataType(const MCInst *MI, unsigned OpNo,
60                                  raw_ostream &O);
61   void printImageOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
62 
63   void printFPFastMathMode(const MCInst *MI, unsigned OpNo, raw_ostream &O);
64   void printFPRoundingMode(const MCInst *MI, unsigned OpNo, raw_ostream &O);
65 
66   void printLinkageType(const MCInst *MI, unsigned OpNo, raw_ostream &O);
67   void printAccessQualifier(const MCInst *MI, unsigned OpNo, raw_ostream &O);
68   void printFunctionParameterAttribute(const MCInst *MI, unsigned OpNo,
69                                        raw_ostream &O);
70 
71   void printDecoration(const MCInst *MI, unsigned OpNo, raw_ostream &O);
72   void printBuiltIn(const MCInst *MI, unsigned OpNo, raw_ostream &O);
73 
74   void printSelectionControl(const MCInst *MI, unsigned OpNo, raw_ostream &O);
75   void printLoopControl(const MCInst *MI, unsigned OpNo, raw_ostream &O);
76   void printFunctionControl(const MCInst *MI, unsigned OpNo, raw_ostream &O);
77 
78   void printMemorySemantics(const MCInst *MI, unsigned OpNo, raw_ostream &O);
79   void printMemoryOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
80 
81   void printScope(const MCInst *MI, unsigned OpNo, raw_ostream &O);
82   void printGroupOperation(const MCInst *MI, unsigned OpNo, raw_ostream &O);
83 
84   void printKernelEnqueueFlags(const MCInst *MI, unsigned OpNo, raw_ostream &O);
85   void printKernelProfilingInfo(const MCInst *MI, unsigned OpNo,
86                                 raw_ostream &O);
87   // Autogenerated by tblgen.
88   std::pair<const char *, uint64_t> getMnemonic(const MCInst *MI) override;
89   void printInstruction(const MCInst *MI, uint64_t Address, raw_ostream &O);
90   static const char *getRegisterName(unsigned RegNo);
91 };
92 } // namespace llvm
93 
94 #endif // LLVM_LIB_TARGET_SPIRV_INSTPRINTER_SPIRVINSTPRINTER_H
95