Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/llvm/lib/Target/SPIRV/MCTargetDesc/SPIRVBaseInfo.h
35294 views
1
//===-- SPIRVBaseInfo.h - Top level SPIRV definitions -----------*- 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 file contains TableGen generated enum definitions, mnemonic lookup
10
// functions, versioning/capabilities/extensions getters for symbolic/named
11
// operands for various SPIR-V instructions.
12
//
13
//===----------------------------------------------------------------------===//
14
15
#ifndef LLVM_LIB_TARGET_SPIRV_SPIRVSYMBOLICOPERANDS_H
16
#define LLVM_LIB_TARGET_SPIRV_SPIRVSYMBOLICOPERANDS_H
17
18
#include "llvm/ADT/SmallVector.h"
19
#include "llvm/ADT/StringRef.h"
20
#include "llvm/Support/VersionTuple.h"
21
#include <string>
22
23
namespace llvm {
24
namespace SPIRV {
25
namespace OperandCategory {
26
#define GET_OperandCategory_DECL
27
#include "SPIRVGenTables.inc"
28
} // namespace OperandCategory
29
30
namespace Extension {
31
#define GET_Extension_DECL
32
#include "SPIRVGenTables.inc"
33
} // namespace Extension
34
35
namespace Capability {
36
#define GET_Capability_DECL
37
#include "SPIRVGenTables.inc"
38
} // namespace Capability
39
40
namespace SourceLanguage {
41
#define GET_SourceLanguage_DECL
42
#include "SPIRVGenTables.inc"
43
} // namespace SourceLanguage
44
45
namespace AddressingModel {
46
#define GET_AddressingModel_DECL
47
#include "SPIRVGenTables.inc"
48
} // namespace AddressingModel
49
50
namespace ExecutionModel {
51
#define GET_ExecutionModel_DECL
52
#include "SPIRVGenTables.inc"
53
} // namespace ExecutionModel
54
55
namespace MemoryModel {
56
#define GET_MemoryModel_DECL
57
#include "SPIRVGenTables.inc"
58
} // namespace MemoryModel
59
60
namespace ExecutionMode {
61
#define GET_ExecutionMode_DECL
62
#include "SPIRVGenTables.inc"
63
} // namespace ExecutionMode
64
65
namespace StorageClass {
66
#define GET_StorageClass_DECL
67
#include "SPIRVGenTables.inc"
68
} // namespace StorageClass
69
70
namespace Dim {
71
#define GET_Dim_DECL
72
#include "SPIRVGenTables.inc"
73
} // namespace Dim
74
75
namespace SamplerAddressingMode {
76
#define GET_SamplerAddressingMode_DECL
77
#include "SPIRVGenTables.inc"
78
} // namespace SamplerAddressingMode
79
80
namespace SamplerFilterMode {
81
#define GET_SamplerFilterMode_DECL
82
#include "SPIRVGenTables.inc"
83
} // namespace SamplerFilterMode
84
85
namespace ImageFormat {
86
#define GET_ImageFormat_DECL
87
#include "SPIRVGenTables.inc"
88
} // namespace ImageFormat
89
90
namespace ImageChannelOrder {
91
#define GET_ImageChannelOrder_DECL
92
#include "SPIRVGenTables.inc"
93
} // namespace ImageChannelOrder
94
95
namespace ImageChannelDataType {
96
#define GET_ImageChannelDataType_DECL
97
#include "SPIRVGenTables.inc"
98
} // namespace ImageChannelDataType
99
100
namespace ImageOperand {
101
#define GET_ImageOperand_DECL
102
#include "SPIRVGenTables.inc"
103
} // namespace ImageOperand
104
105
namespace FPFastMathMode {
106
#define GET_FPFastMathMode_DECL
107
#include "SPIRVGenTables.inc"
108
} // namespace FPFastMathMode
109
110
namespace FPRoundingMode {
111
#define GET_FPRoundingMode_DECL
112
#include "SPIRVGenTables.inc"
113
} // namespace FPRoundingMode
114
115
namespace LinkageType {
116
#define GET_LinkageType_DECL
117
#include "SPIRVGenTables.inc"
118
} // namespace LinkageType
119
120
namespace AccessQualifier {
121
#define GET_AccessQualifier_DECL
122
#include "SPIRVGenTables.inc"
123
} // namespace AccessQualifier
124
125
namespace FunctionParameterAttribute {
126
#define GET_FunctionParameterAttribute_DECL
127
#include "SPIRVGenTables.inc"
128
} // namespace FunctionParameterAttribute
129
130
namespace Decoration {
131
#define GET_Decoration_DECL
132
#include "SPIRVGenTables.inc"
133
} // namespace Decoration
134
135
namespace BuiltIn {
136
#define GET_BuiltIn_DECL
137
#include "SPIRVGenTables.inc"
138
} // namespace BuiltIn
139
140
namespace SelectionControl {
141
#define GET_SelectionControl_DECL
142
#include "SPIRVGenTables.inc"
143
} // namespace SelectionControl
144
145
namespace LoopControl {
146
#define GET_LoopControl_DECL
147
#include "SPIRVGenTables.inc"
148
} // namespace LoopControl
149
150
namespace FunctionControl {
151
#define GET_FunctionControl_DECL
152
#include "SPIRVGenTables.inc"
153
} // namespace FunctionControl
154
155
namespace MemorySemantics {
156
#define GET_MemorySemantics_DECL
157
#include "SPIRVGenTables.inc"
158
} // namespace MemorySemantics
159
160
namespace MemoryOperand {
161
#define GET_MemoryOperand_DECL
162
#include "SPIRVGenTables.inc"
163
} // namespace MemoryOperand
164
165
namespace Scope {
166
#define GET_Scope_DECL
167
#include "SPIRVGenTables.inc"
168
} // namespace Scope
169
170
namespace GroupOperation {
171
#define GET_GroupOperation_DECL
172
#include "SPIRVGenTables.inc"
173
} // namespace GroupOperation
174
175
namespace KernelEnqueueFlags {
176
#define GET_KernelEnqueueFlags_DECL
177
#include "SPIRVGenTables.inc"
178
} // namespace KernelEnqueueFlags
179
180
namespace KernelProfilingInfo {
181
#define GET_KernelProfilingInfo_DECL
182
#include "SPIRVGenTables.inc"
183
} // namespace KernelProfilingInfo
184
185
namespace InstructionSet {
186
#define GET_InstructionSet_DECL
187
#include "SPIRVGenTables.inc"
188
} // namespace InstructionSet
189
190
namespace OpenCLExtInst {
191
#define GET_OpenCLExtInst_DECL
192
#include "SPIRVGenTables.inc"
193
} // namespace OpenCLExtInst
194
195
namespace GLSLExtInst {
196
#define GET_GLSLExtInst_DECL
197
#include "SPIRVGenTables.inc"
198
} // namespace GLSLExtInst
199
200
namespace NonSemanticExtInst {
201
#define GET_NonSemanticExtInst_DECL
202
#include "SPIRVGenTables.inc"
203
} // namespace NonSemanticExtInst
204
205
namespace Opcode {
206
#define GET_Opcode_DECL
207
#include "SPIRVGenTables.inc"
208
} // namespace Opcode
209
210
struct ExtendedBuiltin {
211
StringRef Name;
212
InstructionSet::InstructionSet Set;
213
uint32_t Number;
214
};
215
} // namespace SPIRV
216
217
using CapabilityList = SmallVector<SPIRV::Capability::Capability, 8>;
218
using ExtensionList = SmallVector<SPIRV::Extension::Extension, 8>;
219
220
std::string
221
getSymbolicOperandMnemonic(SPIRV::OperandCategory::OperandCategory Category,
222
int32_t Value);
223
VersionTuple
224
getSymbolicOperandMinVersion(SPIRV::OperandCategory::OperandCategory Category,
225
uint32_t Value);
226
VersionTuple
227
getSymbolicOperandMaxVersion(SPIRV::OperandCategory::OperandCategory Category,
228
uint32_t Value);
229
CapabilityList
230
getSymbolicOperandCapabilities(SPIRV::OperandCategory::OperandCategory Category,
231
uint32_t Value);
232
CapabilityList
233
getCapabilitiesEnabledByExtension(SPIRV::Extension::Extension Extension);
234
ExtensionList
235
getSymbolicOperandExtensions(SPIRV::OperandCategory::OperandCategory Category,
236
uint32_t Value);
237
std::string getLinkStringForBuiltIn(SPIRV::BuiltIn::BuiltIn BuiltInValue);
238
239
bool getSpirvBuiltInIdByName(StringRef Name, SPIRV::BuiltIn::BuiltIn &BI);
240
241
std::string getExtInstSetName(SPIRV::InstructionSet::InstructionSet Set);
242
SPIRV::InstructionSet::InstructionSet
243
getExtInstSetFromString(std::string SetName);
244
std::string getExtInstName(SPIRV::InstructionSet::InstructionSet Set,
245
uint32_t InstructionNumber);
246
247
// Return a string representation of the operands from startIndex onwards.
248
// Templated to allow both MachineInstr and MCInst to use the same logic.
249
template <class InstType>
250
std::string getSPIRVStringOperand(const InstType &MI, unsigned StartIndex) {
251
std::string s; // Iteratively append to this string.
252
253
const unsigned NumOps = MI.getNumOperands();
254
bool IsFinished = false;
255
for (unsigned i = StartIndex; i < NumOps && !IsFinished; ++i) {
256
const auto &Op = MI.getOperand(i);
257
if (!Op.isImm()) // Stop if we hit a register operand.
258
break;
259
assert((Op.getImm() >> 32) == 0 && "Imm operand should be i32 word");
260
const uint32_t Imm = Op.getImm(); // Each i32 word is up to 4 characters.
261
for (unsigned ShiftAmount = 0; ShiftAmount < 32; ShiftAmount += 8) {
262
char c = (Imm >> ShiftAmount) & 0xff;
263
if (c == 0) { // Stop if we hit a null-terminator character.
264
IsFinished = true;
265
break;
266
}
267
s += c; // Otherwise, append the character to the result string.
268
}
269
}
270
return s;
271
}
272
} // namespace llvm
273
#endif // LLVM_LIB_TARGET_SPIRV_SPIRVSYMBOLICOPERANDS_H
274
275