xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/SPIRV/MCTargetDesc/SPIRVBaseInfo.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
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"
2081ad6265SDimitry Andric #include <string>
2181ad6265SDimitry Andric 
2281ad6265SDimitry Andric namespace llvm {
2381ad6265SDimitry Andric namespace SPIRV {
24bdd1243dSDimitry Andric namespace OperandCategory {
25bdd1243dSDimitry Andric #define GET_OperandCategory_DECL
26bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
27bdd1243dSDimitry Andric } // namespace OperandCategory
2881ad6265SDimitry Andric 
29bdd1243dSDimitry Andric namespace Extension {
30bdd1243dSDimitry Andric #define GET_Extension_DECL
31bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
32bdd1243dSDimitry Andric } // namespace Extension
3381ad6265SDimitry Andric 
34bdd1243dSDimitry Andric namespace Capability {
35bdd1243dSDimitry Andric #define GET_Capability_DECL
36bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
37bdd1243dSDimitry Andric } // namespace Capability
3881ad6265SDimitry Andric 
39bdd1243dSDimitry Andric namespace SourceLanguage {
40bdd1243dSDimitry Andric #define GET_SourceLanguage_DECL
41bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
42bdd1243dSDimitry Andric } // namespace SourceLanguage
4381ad6265SDimitry Andric 
44bdd1243dSDimitry Andric namespace AddressingModel {
45bdd1243dSDimitry Andric #define GET_AddressingModel_DECL
46bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
47bdd1243dSDimitry Andric } // namespace AddressingModel
4881ad6265SDimitry Andric 
49bdd1243dSDimitry Andric namespace ExecutionModel {
50bdd1243dSDimitry Andric #define GET_ExecutionModel_DECL
51bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
52bdd1243dSDimitry Andric } // namespace ExecutionModel
5381ad6265SDimitry Andric 
54bdd1243dSDimitry Andric namespace MemoryModel {
55bdd1243dSDimitry Andric #define GET_MemoryModel_DECL
56bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
57bdd1243dSDimitry Andric } // namespace MemoryModel
5881ad6265SDimitry Andric 
59bdd1243dSDimitry Andric namespace ExecutionMode {
60bdd1243dSDimitry Andric #define GET_ExecutionMode_DECL
61bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
62bdd1243dSDimitry Andric } // namespace ExecutionMode
6381ad6265SDimitry Andric 
64bdd1243dSDimitry Andric namespace StorageClass {
65bdd1243dSDimitry Andric #define GET_StorageClass_DECL
66bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
67bdd1243dSDimitry Andric } // namespace StorageClass
6881ad6265SDimitry Andric 
69bdd1243dSDimitry Andric namespace Dim {
70bdd1243dSDimitry Andric #define GET_Dim_DECL
71bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
72bdd1243dSDimitry Andric } // namespace Dim
7381ad6265SDimitry Andric 
74bdd1243dSDimitry Andric namespace SamplerAddressingMode {
75bdd1243dSDimitry Andric #define GET_SamplerAddressingMode_DECL
76bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
77bdd1243dSDimitry Andric } // namespace SamplerAddressingMode
7881ad6265SDimitry Andric 
79bdd1243dSDimitry Andric namespace SamplerFilterMode {
80bdd1243dSDimitry Andric #define GET_SamplerFilterMode_DECL
81bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
82bdd1243dSDimitry Andric } // namespace SamplerFilterMode
8381ad6265SDimitry Andric 
84bdd1243dSDimitry Andric namespace ImageFormat {
85bdd1243dSDimitry Andric #define GET_ImageFormat_DECL
86bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
87bdd1243dSDimitry Andric } // namespace ImageFormat
8881ad6265SDimitry Andric 
89bdd1243dSDimitry Andric namespace ImageChannelOrder {
90bdd1243dSDimitry Andric #define GET_ImageChannelOrder_DECL
91bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
92bdd1243dSDimitry Andric } // namespace ImageChannelOrder
9381ad6265SDimitry Andric 
94bdd1243dSDimitry Andric namespace ImageChannelDataType {
95bdd1243dSDimitry Andric #define GET_ImageChannelDataType_DECL
96bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
97bdd1243dSDimitry Andric } // namespace ImageChannelDataType
9881ad6265SDimitry Andric 
99bdd1243dSDimitry Andric namespace ImageOperand {
100bdd1243dSDimitry Andric #define GET_ImageOperand_DECL
101bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
102bdd1243dSDimitry Andric } // namespace ImageOperand
10381ad6265SDimitry Andric 
104bdd1243dSDimitry Andric namespace FPFastMathMode {
105bdd1243dSDimitry Andric #define GET_FPFastMathMode_DECL
106bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
107bdd1243dSDimitry Andric } // namespace FPFastMathMode
10881ad6265SDimitry Andric 
109bdd1243dSDimitry Andric namespace FPRoundingMode {
110bdd1243dSDimitry Andric #define GET_FPRoundingMode_DECL
111bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
112bdd1243dSDimitry Andric } // namespace FPRoundingMode
11381ad6265SDimitry Andric 
114bdd1243dSDimitry Andric namespace LinkageType {
115bdd1243dSDimitry Andric #define GET_LinkageType_DECL
116bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
117bdd1243dSDimitry Andric } // namespace LinkageType
11881ad6265SDimitry Andric 
119bdd1243dSDimitry Andric namespace AccessQualifier {
120bdd1243dSDimitry Andric #define GET_AccessQualifier_DECL
121bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
122bdd1243dSDimitry Andric } // namespace AccessQualifier
12381ad6265SDimitry Andric 
124bdd1243dSDimitry Andric namespace FunctionParameterAttribute {
125bdd1243dSDimitry Andric #define GET_FunctionParameterAttribute_DECL
126bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
127bdd1243dSDimitry Andric } // namespace FunctionParameterAttribute
12881ad6265SDimitry Andric 
129bdd1243dSDimitry Andric namespace Decoration {
130bdd1243dSDimitry Andric #define GET_Decoration_DECL
131bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
132bdd1243dSDimitry Andric } // namespace Decoration
13381ad6265SDimitry Andric 
134bdd1243dSDimitry Andric namespace BuiltIn {
135bdd1243dSDimitry Andric #define GET_BuiltIn_DECL
136bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
137bdd1243dSDimitry Andric } // namespace BuiltIn
13881ad6265SDimitry Andric 
139bdd1243dSDimitry Andric namespace SelectionControl {
140bdd1243dSDimitry Andric #define GET_SelectionControl_DECL
141bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
142bdd1243dSDimitry Andric } // namespace SelectionControl
14381ad6265SDimitry Andric 
144bdd1243dSDimitry Andric namespace LoopControl {
145bdd1243dSDimitry Andric #define GET_LoopControl_DECL
146bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
147bdd1243dSDimitry Andric } // namespace LoopControl
14881ad6265SDimitry Andric 
149bdd1243dSDimitry Andric namespace FunctionControl {
150bdd1243dSDimitry Andric #define GET_FunctionControl_DECL
151bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
152bdd1243dSDimitry Andric } // namespace FunctionControl
15381ad6265SDimitry Andric 
154bdd1243dSDimitry Andric namespace MemorySemantics {
155bdd1243dSDimitry Andric #define GET_MemorySemantics_DECL
156bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
157bdd1243dSDimitry Andric } // namespace MemorySemantics
15881ad6265SDimitry Andric 
159bdd1243dSDimitry Andric namespace MemoryOperand {
160bdd1243dSDimitry Andric #define GET_MemoryOperand_DECL
161bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
162bdd1243dSDimitry Andric } // namespace MemoryOperand
16381ad6265SDimitry Andric 
164bdd1243dSDimitry Andric namespace Scope {
165bdd1243dSDimitry Andric #define GET_Scope_DECL
166bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
167bdd1243dSDimitry Andric } // namespace Scope
16881ad6265SDimitry Andric 
169bdd1243dSDimitry Andric namespace GroupOperation {
170bdd1243dSDimitry Andric #define GET_GroupOperation_DECL
171bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
172bdd1243dSDimitry Andric } // namespace GroupOperation
173fcaf7f86SDimitry Andric 
174bdd1243dSDimitry Andric namespace KernelEnqueueFlags {
175bdd1243dSDimitry Andric #define GET_KernelEnqueueFlags_DECL
176bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
177bdd1243dSDimitry Andric } // namespace KernelEnqueueFlags
178fcaf7f86SDimitry Andric 
179bdd1243dSDimitry Andric namespace KernelProfilingInfo {
180bdd1243dSDimitry Andric #define GET_KernelProfilingInfo_DECL
181bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
182bdd1243dSDimitry Andric } // namespace KernelProfilingInfo
183bdd1243dSDimitry Andric 
184bdd1243dSDimitry Andric namespace InstructionSet {
185bdd1243dSDimitry Andric #define GET_InstructionSet_DECL
186bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
187bdd1243dSDimitry Andric } // namespace InstructionSet
188bdd1243dSDimitry Andric 
189bdd1243dSDimitry Andric namespace OpenCLExtInst {
190bdd1243dSDimitry Andric #define GET_OpenCLExtInst_DECL
191bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
192bdd1243dSDimitry Andric } // namespace OpenCLExtInst
193bdd1243dSDimitry Andric 
194bdd1243dSDimitry Andric namespace GLSLExtInst {
195bdd1243dSDimitry Andric #define GET_GLSLExtInst_DECL
196bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
197bdd1243dSDimitry Andric } // namespace GLSLExtInst
198bdd1243dSDimitry Andric 
199bdd1243dSDimitry Andric namespace Opcode {
200bdd1243dSDimitry Andric #define GET_Opcode_DECL
201bdd1243dSDimitry Andric #include "SPIRVGenTables.inc"
202bdd1243dSDimitry Andric } // namespace Opcode
203bdd1243dSDimitry Andric 
204bdd1243dSDimitry Andric struct ExtendedBuiltin {
205bdd1243dSDimitry Andric   StringRef Name;
206bdd1243dSDimitry Andric   InstructionSet::InstructionSet Set;
207bdd1243dSDimitry Andric   uint32_t Number;
208fcaf7f86SDimitry Andric };
20981ad6265SDimitry Andric } // namespace SPIRV
210bdd1243dSDimitry Andric 
211bdd1243dSDimitry Andric using CapabilityList = SmallVector<SPIRV::Capability::Capability, 8>;
212bdd1243dSDimitry Andric using ExtensionList = SmallVector<SPIRV::Extension::Extension, 8>;
213bdd1243dSDimitry Andric 
214bdd1243dSDimitry Andric std::string
215bdd1243dSDimitry Andric getSymbolicOperandMnemonic(SPIRV::OperandCategory::OperandCategory Category,
216bdd1243dSDimitry Andric                            int32_t Value);
217bdd1243dSDimitry Andric uint32_t
218bdd1243dSDimitry Andric getSymbolicOperandMinVersion(SPIRV::OperandCategory::OperandCategory Category,
219bdd1243dSDimitry Andric                              uint32_t Value);
220bdd1243dSDimitry Andric uint32_t
221bdd1243dSDimitry Andric getSymbolicOperandMaxVersion(SPIRV::OperandCategory::OperandCategory Category,
222bdd1243dSDimitry Andric                              uint32_t Value);
223bdd1243dSDimitry Andric CapabilityList
224bdd1243dSDimitry Andric getSymbolicOperandCapabilities(SPIRV::OperandCategory::OperandCategory Category,
225bdd1243dSDimitry Andric                                uint32_t Value);
226*5f757f3fSDimitry Andric CapabilityList
227*5f757f3fSDimitry Andric getCapabilitiesEnabledByExtension(SPIRV::Extension::Extension Extension);
228bdd1243dSDimitry Andric ExtensionList
229bdd1243dSDimitry Andric getSymbolicOperandExtensions(SPIRV::OperandCategory::OperandCategory Category,
230bdd1243dSDimitry Andric                              uint32_t Value);
231bdd1243dSDimitry Andric std::string getLinkStringForBuiltIn(SPIRV::BuiltIn::BuiltIn BuiltInValue);
232bdd1243dSDimitry Andric 
233bdd1243dSDimitry Andric bool getSpirvBuiltInIdByName(StringRef Name, SPIRV::BuiltIn::BuiltIn &BI);
234bdd1243dSDimitry Andric 
235bdd1243dSDimitry Andric std::string getExtInstSetName(SPIRV::InstructionSet::InstructionSet Set);
236bdd1243dSDimitry Andric SPIRV::InstructionSet::InstructionSet
237bdd1243dSDimitry Andric getExtInstSetFromString(std::string SetName);
238bdd1243dSDimitry Andric std::string getExtInstName(SPIRV::InstructionSet::InstructionSet Set,
239bdd1243dSDimitry Andric                            uint32_t InstructionNumber);
24081ad6265SDimitry Andric 
24181ad6265SDimitry Andric // Return a string representation of the operands from startIndex onwards.
24281ad6265SDimitry Andric // Templated to allow both MachineInstr and MCInst to use the same logic.
24381ad6265SDimitry Andric template <class InstType>
24481ad6265SDimitry Andric std::string getSPIRVStringOperand(const InstType &MI, unsigned StartIndex) {
24581ad6265SDimitry Andric   std::string s; // Iteratively append to this string.
24681ad6265SDimitry Andric 
24781ad6265SDimitry Andric   const unsigned NumOps = MI.getNumOperands();
24881ad6265SDimitry Andric   bool IsFinished = false;
24981ad6265SDimitry Andric   for (unsigned i = StartIndex; i < NumOps && !IsFinished; ++i) {
25081ad6265SDimitry Andric     const auto &Op = MI.getOperand(i);
25181ad6265SDimitry Andric     if (!Op.isImm()) // Stop if we hit a register operand.
25281ad6265SDimitry Andric       break;
25381ad6265SDimitry Andric     assert((Op.getImm() >> 32) == 0 && "Imm operand should be i32 word");
25481ad6265SDimitry Andric     const uint32_t Imm = Op.getImm(); // Each i32 word is up to 4 characters.
25581ad6265SDimitry Andric     for (unsigned ShiftAmount = 0; ShiftAmount < 32; ShiftAmount += 8) {
25681ad6265SDimitry Andric       char c = (Imm >> ShiftAmount) & 0xff;
25781ad6265SDimitry Andric       if (c == 0) { // Stop if we hit a null-terminator character.
25881ad6265SDimitry Andric         IsFinished = true;
25981ad6265SDimitry Andric         break;
26081ad6265SDimitry Andric       }
261bdd1243dSDimitry Andric       s += c; // Otherwise, append the character to the result string.
26281ad6265SDimitry Andric     }
26381ad6265SDimitry Andric   }
26481ad6265SDimitry Andric   return s;
26581ad6265SDimitry Andric }
266bdd1243dSDimitry Andric } // namespace llvm
267bdd1243dSDimitry Andric #endif // LLVM_LIB_TARGET_SPIRV_SPIRVSYMBOLICOPERANDS_H
268