xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/SPIRV/MCTargetDesc/SPIRVBaseInfo.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1bdd1243dSDimitry Andric //===-- SPIRVBaseInfo.h - Top level SPIRV definitions -----------*- C++ -*-===//
281ad6265SDimitry Andric //
381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
681ad6265SDimitry Andric //
781ad6265SDimitry Andric //===----------------------------------------------------------------------===//
881ad6265SDimitry Andric //
9bdd1243dSDimitry Andric // This file contains TableGen generated enum definitions, mnemonic lookup
10bdd1243dSDimitry Andric // functions, versioning/capabilities/extensions getters for symbolic/named
11bdd1243dSDimitry Andric // operands for various SPIR-V instructions.
1281ad6265SDimitry Andric //
1381ad6265SDimitry Andric //===----------------------------------------------------------------------===//
1481ad6265SDimitry Andric 
15bdd1243dSDimitry Andric #ifndef LLVM_LIB_TARGET_SPIRV_SPIRVSYMBOLICOPERANDS_H
16bdd1243dSDimitry Andric #define LLVM_LIB_TARGET_SPIRV_SPIRVSYMBOLICOPERANDS_H
1781ad6265SDimitry Andric 
18bdd1243dSDimitry Andric #include "llvm/ADT/SmallVector.h"
1981ad6265SDimitry Andric #include "llvm/ADT/StringRef.h"
20*0fca6ea1SDimitry Andric #include "llvm/Support/VersionTuple.h"
2181ad6265SDimitry Andric #include <string>
2281ad6265SDimitry Andric 
2381ad6265SDimitry Andric namespace llvm {
2481ad6265SDimitry Andric namespace SPIRV {
25bdd1243dSDimitry Andric namespace OperandCategory {
26bdd1243dSDimitry Andric #define GET_OperandCategory_DECL
27bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
28bdd1243dSDimitry Andric } // namespace OperandCategory
2981ad6265SDimitry Andric 
30bdd1243dSDimitry Andric namespace Extension {
31bdd1243dSDimitry Andric #define GET_Extension_DECL
32bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
33bdd1243dSDimitry Andric } // namespace Extension
3481ad6265SDimitry Andric 
35bdd1243dSDimitry Andric namespace Capability {
36bdd1243dSDimitry Andric #define GET_Capability_DECL
37bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
38bdd1243dSDimitry Andric } // namespace Capability
3981ad6265SDimitry Andric 
40bdd1243dSDimitry Andric namespace SourceLanguage {
41bdd1243dSDimitry Andric #define GET_SourceLanguage_DECL
42bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
43bdd1243dSDimitry Andric } // namespace SourceLanguage
4481ad6265SDimitry Andric 
45bdd1243dSDimitry Andric namespace AddressingModel {
46bdd1243dSDimitry Andric #define GET_AddressingModel_DECL
47bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
48bdd1243dSDimitry Andric } // namespace AddressingModel
4981ad6265SDimitry Andric 
50bdd1243dSDimitry Andric namespace ExecutionModel {
51bdd1243dSDimitry Andric #define GET_ExecutionModel_DECL
52bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
53bdd1243dSDimitry Andric } // namespace ExecutionModel
5481ad6265SDimitry Andric 
55bdd1243dSDimitry Andric namespace MemoryModel {
56bdd1243dSDimitry Andric #define GET_MemoryModel_DECL
57bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
58bdd1243dSDimitry Andric } // namespace MemoryModel
5981ad6265SDimitry Andric 
60bdd1243dSDimitry Andric namespace ExecutionMode {
61bdd1243dSDimitry Andric #define GET_ExecutionMode_DECL
62bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
63bdd1243dSDimitry Andric } // namespace ExecutionMode
6481ad6265SDimitry Andric 
65bdd1243dSDimitry Andric namespace StorageClass {
66bdd1243dSDimitry Andric #define GET_StorageClass_DECL
67bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
68bdd1243dSDimitry Andric } // namespace StorageClass
6981ad6265SDimitry Andric 
70bdd1243dSDimitry Andric namespace Dim {
71bdd1243dSDimitry Andric #define GET_Dim_DECL
72bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
73bdd1243dSDimitry Andric } // namespace Dim
7481ad6265SDimitry Andric 
75bdd1243dSDimitry Andric namespace SamplerAddressingMode {
76bdd1243dSDimitry Andric #define GET_SamplerAddressingMode_DECL
77bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
78bdd1243dSDimitry Andric } // namespace SamplerAddressingMode
7981ad6265SDimitry Andric 
80bdd1243dSDimitry Andric namespace SamplerFilterMode {
81bdd1243dSDimitry Andric #define GET_SamplerFilterMode_DECL
82bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
83bdd1243dSDimitry Andric } // namespace SamplerFilterMode
8481ad6265SDimitry Andric 
85bdd1243dSDimitry Andric namespace ImageFormat {
86bdd1243dSDimitry Andric #define GET_ImageFormat_DECL
87bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
88bdd1243dSDimitry Andric } // namespace ImageFormat
8981ad6265SDimitry Andric 
90bdd1243dSDimitry Andric namespace ImageChannelOrder {
91bdd1243dSDimitry Andric #define GET_ImageChannelOrder_DECL
92bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
93bdd1243dSDimitry Andric } // namespace ImageChannelOrder
9481ad6265SDimitry Andric 
95bdd1243dSDimitry Andric namespace ImageChannelDataType {
96bdd1243dSDimitry Andric #define GET_ImageChannelDataType_DECL
97bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
98bdd1243dSDimitry Andric } // namespace ImageChannelDataType
9981ad6265SDimitry Andric 
100bdd1243dSDimitry Andric namespace ImageOperand {
101bdd1243dSDimitry Andric #define GET_ImageOperand_DECL
102bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
103bdd1243dSDimitry Andric } // namespace ImageOperand
10481ad6265SDimitry Andric 
105bdd1243dSDimitry Andric namespace FPFastMathMode {
106bdd1243dSDimitry Andric #define GET_FPFastMathMode_DECL
107bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
108bdd1243dSDimitry Andric } // namespace FPFastMathMode
10981ad6265SDimitry Andric 
110bdd1243dSDimitry Andric namespace FPRoundingMode {
111bdd1243dSDimitry Andric #define GET_FPRoundingMode_DECL
112bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
113bdd1243dSDimitry Andric } // namespace FPRoundingMode
11481ad6265SDimitry Andric 
115bdd1243dSDimitry Andric namespace LinkageType {
116bdd1243dSDimitry Andric #define GET_LinkageType_DECL
117bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
118bdd1243dSDimitry Andric } // namespace LinkageType
11981ad6265SDimitry Andric 
120bdd1243dSDimitry Andric namespace AccessQualifier {
121bdd1243dSDimitry Andric #define GET_AccessQualifier_DECL
122bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
123bdd1243dSDimitry Andric } // namespace AccessQualifier
12481ad6265SDimitry Andric 
125bdd1243dSDimitry Andric namespace FunctionParameterAttribute {
126bdd1243dSDimitry Andric #define GET_FunctionParameterAttribute_DECL
127bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
128bdd1243dSDimitry Andric } // namespace FunctionParameterAttribute
12981ad6265SDimitry Andric 
130bdd1243dSDimitry Andric namespace Decoration {
131bdd1243dSDimitry Andric #define GET_Decoration_DECL
132bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
133bdd1243dSDimitry Andric } // namespace Decoration
13481ad6265SDimitry Andric 
135bdd1243dSDimitry Andric namespace BuiltIn {
136bdd1243dSDimitry Andric #define GET_BuiltIn_DECL
137bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
138bdd1243dSDimitry Andric } // namespace BuiltIn
13981ad6265SDimitry Andric 
140bdd1243dSDimitry Andric namespace SelectionControl {
141bdd1243dSDimitry Andric #define GET_SelectionControl_DECL
142bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
143bdd1243dSDimitry Andric } // namespace SelectionControl
14481ad6265SDimitry Andric 
145bdd1243dSDimitry Andric namespace LoopControl {
146bdd1243dSDimitry Andric #define GET_LoopControl_DECL
147bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
148bdd1243dSDimitry Andric } // namespace LoopControl
14981ad6265SDimitry Andric 
150bdd1243dSDimitry Andric namespace FunctionControl {
151bdd1243dSDimitry Andric #define GET_FunctionControl_DECL
152bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
153bdd1243dSDimitry Andric } // namespace FunctionControl
15481ad6265SDimitry Andric 
155bdd1243dSDimitry Andric namespace MemorySemantics {
156bdd1243dSDimitry Andric #define GET_MemorySemantics_DECL
157bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
158bdd1243dSDimitry Andric } // namespace MemorySemantics
15981ad6265SDimitry Andric 
160bdd1243dSDimitry Andric namespace MemoryOperand {
161bdd1243dSDimitry Andric #define GET_MemoryOperand_DECL
162bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
163bdd1243dSDimitry Andric } // namespace MemoryOperand
16481ad6265SDimitry Andric 
165bdd1243dSDimitry Andric namespace Scope {
166bdd1243dSDimitry Andric #define GET_Scope_DECL
167bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
168bdd1243dSDimitry Andric } // namespace Scope
16981ad6265SDimitry Andric 
170bdd1243dSDimitry Andric namespace GroupOperation {
171bdd1243dSDimitry Andric #define GET_GroupOperation_DECL
172bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
173bdd1243dSDimitry Andric } // namespace GroupOperation
174fcaf7f86SDimitry Andric 
175bdd1243dSDimitry Andric namespace KernelEnqueueFlags {
176bdd1243dSDimitry Andric #define GET_KernelEnqueueFlags_DECL
177bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
178bdd1243dSDimitry Andric } // namespace KernelEnqueueFlags
179fcaf7f86SDimitry Andric 
180bdd1243dSDimitry Andric namespace KernelProfilingInfo {
181bdd1243dSDimitry Andric #define GET_KernelProfilingInfo_DECL
182bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
183bdd1243dSDimitry Andric } // namespace KernelProfilingInfo
184bdd1243dSDimitry Andric 
185bdd1243dSDimitry Andric namespace InstructionSet {
186bdd1243dSDimitry Andric #define GET_InstructionSet_DECL
187bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
188bdd1243dSDimitry Andric } // namespace InstructionSet
189bdd1243dSDimitry Andric 
190bdd1243dSDimitry Andric namespace OpenCLExtInst {
191bdd1243dSDimitry Andric #define GET_OpenCLExtInst_DECL
192bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
193bdd1243dSDimitry Andric } // namespace OpenCLExtInst
194bdd1243dSDimitry Andric 
195bdd1243dSDimitry Andric namespace GLSLExtInst {
196bdd1243dSDimitry Andric #define GET_GLSLExtInst_DECL
197bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
198bdd1243dSDimitry Andric } // namespace GLSLExtInst
199bdd1243dSDimitry Andric 
200*0fca6ea1SDimitry Andric namespace NonSemanticExtInst {
201*0fca6ea1SDimitry Andric #define GET_NonSemanticExtInst_DECL
202*0fca6ea1SDimitry Andric #include "SPIRVGenTables.inc"
203*0fca6ea1SDimitry Andric } // namespace NonSemanticExtInst
204*0fca6ea1SDimitry Andric 
205bdd1243dSDimitry Andric namespace Opcode {
206bdd1243dSDimitry Andric #define GET_Opcode_DECL
207bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
208bdd1243dSDimitry Andric } // namespace Opcode
209bdd1243dSDimitry Andric 
210bdd1243dSDimitry Andric struct ExtendedBuiltin {
211bdd1243dSDimitry Andric   StringRef Name;
212bdd1243dSDimitry Andric   InstructionSet::InstructionSet Set;
213bdd1243dSDimitry Andric   uint32_t Number;
214fcaf7f86SDimitry Andric };
21581ad6265SDimitry Andric } // namespace SPIRV
216bdd1243dSDimitry Andric 
217bdd1243dSDimitry Andric using CapabilityList = SmallVector<SPIRV::Capability::Capability, 8>;
218bdd1243dSDimitry Andric using ExtensionList = SmallVector<SPIRV::Extension::Extension, 8>;
219bdd1243dSDimitry Andric 
220bdd1243dSDimitry Andric std::string
221bdd1243dSDimitry Andric getSymbolicOperandMnemonic(SPIRV::OperandCategory::OperandCategory Category,
222bdd1243dSDimitry Andric                            int32_t Value);
223*0fca6ea1SDimitry Andric VersionTuple
224bdd1243dSDimitry Andric getSymbolicOperandMinVersion(SPIRV::OperandCategory::OperandCategory Category,
225bdd1243dSDimitry Andric                              uint32_t Value);
226*0fca6ea1SDimitry Andric VersionTuple
227bdd1243dSDimitry Andric getSymbolicOperandMaxVersion(SPIRV::OperandCategory::OperandCategory Category,
228bdd1243dSDimitry Andric                              uint32_t Value);
229bdd1243dSDimitry Andric CapabilityList
230bdd1243dSDimitry Andric getSymbolicOperandCapabilities(SPIRV::OperandCategory::OperandCategory Category,
231bdd1243dSDimitry Andric                                uint32_t Value);
2325f757f3fSDimitry Andric CapabilityList
2335f757f3fSDimitry Andric getCapabilitiesEnabledByExtension(SPIRV::Extension::Extension Extension);
234bdd1243dSDimitry Andric ExtensionList
235bdd1243dSDimitry Andric getSymbolicOperandExtensions(SPIRV::OperandCategory::OperandCategory Category,
236bdd1243dSDimitry Andric                              uint32_t Value);
237bdd1243dSDimitry Andric std::string getLinkStringForBuiltIn(SPIRV::BuiltIn::BuiltIn BuiltInValue);
238bdd1243dSDimitry Andric 
239bdd1243dSDimitry Andric bool getSpirvBuiltInIdByName(StringRef Name, SPIRV::BuiltIn::BuiltIn &BI);
240bdd1243dSDimitry Andric 
241bdd1243dSDimitry Andric std::string getExtInstSetName(SPIRV::InstructionSet::InstructionSet Set);
242bdd1243dSDimitry Andric SPIRV::InstructionSet::InstructionSet
243bdd1243dSDimitry Andric getExtInstSetFromString(std::string SetName);
244bdd1243dSDimitry Andric std::string getExtInstName(SPIRV::InstructionSet::InstructionSet Set,
245bdd1243dSDimitry Andric                            uint32_t InstructionNumber);
24681ad6265SDimitry Andric 
24781ad6265SDimitry Andric // Return a string representation of the operands from startIndex onwards.
24881ad6265SDimitry Andric // Templated to allow both MachineInstr and MCInst to use the same logic.
24981ad6265SDimitry Andric template <class InstType>
25081ad6265SDimitry Andric std::string getSPIRVStringOperand(const InstType &MI, unsigned StartIndex) {
25181ad6265SDimitry Andric   std::string s; // Iteratively append to this string.
25281ad6265SDimitry Andric 
25381ad6265SDimitry Andric   const unsigned NumOps = MI.getNumOperands();
25481ad6265SDimitry Andric   bool IsFinished = false;
25581ad6265SDimitry Andric   for (unsigned i = StartIndex; i < NumOps && !IsFinished; ++i) {
25681ad6265SDimitry Andric     const auto &Op = MI.getOperand(i);
25781ad6265SDimitry Andric     if (!Op.isImm()) // Stop if we hit a register operand.
25881ad6265SDimitry Andric       break;
25981ad6265SDimitry Andric     assert((Op.getImm() >> 32) == 0 && "Imm operand should be i32 word");
26081ad6265SDimitry Andric     const uint32_t Imm = Op.getImm(); // Each i32 word is up to 4 characters.
26181ad6265SDimitry Andric     for (unsigned ShiftAmount = 0; ShiftAmount < 32; ShiftAmount += 8) {
26281ad6265SDimitry Andric       char c = (Imm >> ShiftAmount) & 0xff;
26381ad6265SDimitry Andric       if (c == 0) { // Stop if we hit a null-terminator character.
26481ad6265SDimitry Andric         IsFinished = true;
26581ad6265SDimitry Andric         break;
26681ad6265SDimitry Andric       }
267bdd1243dSDimitry Andric       s += c; // Otherwise, append the character to the result string.
26881ad6265SDimitry Andric     }
26981ad6265SDimitry Andric   }
27081ad6265SDimitry Andric   return s;
27181ad6265SDimitry Andric }
272bdd1243dSDimitry Andric } // namespace llvm
273bdd1243dSDimitry Andric #endif // LLVM_LIB_TARGET_SPIRV_SPIRVSYMBOLICOPERANDS_H
274