blob: bf203ac49ea492f03f2750292691fd74a49282c7 [file] [log] [blame]
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001// Copyright (c) 2015 The Khronos Group Inc.
2//
3// Permission is hereby granted, free of charge, to any person obtaining a
4// copy of this software and/or associated documentation files (the
5// "Materials"), to deal in the Materials without restriction, including
6// without limitation the rights to use, copy, modify, merge, publish,
7// distribute, sublicense, and/or sell copies of the Materials, and to
8// permit persons to whom the Materials are furnished to do so, subject to
9// the following conditions:
10//
11// The above copyright notice and this permission notice shall be included
12// in all copies or substantial portions of the Materials.
13//
14// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS
15// KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS
16// SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT
17// https://www.khronos.org/registry/
18//
19// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
23// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
26
27#include <libspirv/libspirv.h>
28#include "binary.h"
29#include "opcode.h"
30
31#include <assert.h>
32#include <string.h>
33
34// Opcode API
35
36const char *spvGeneratorStr(uint32_t generator) {
37 switch (generator) {
38 case SPV_GENERATOR_KHRONOS:
39 return "Khronos";
40 case SPV_GENERATOR_VALVE:
41 return "Valve";
42 case SPV_GENERATOR_LUNARG:
43 return "LunarG";
44 case SPV_GENERATOR_CODEPLAY:
45 return "Codeplay Software Ltd.";
46 default:
47 return "Unknown";
48 }
49}
50
51uint32_t spvOpcodeMake(uint16_t wordCount, Op opcode) {
52 return ((uint32_t)opcode) | (((uint32_t)wordCount) << 16);
53}
54
55void spvOpcodeSplit(const uint32_t word, uint16_t *pWordCount, Op *pOpcode) {
56 if (pWordCount) {
57 *pWordCount = (uint16_t)((0xffff0000 & word) >> 16);
58 }
59 if (pOpcode) {
60 *pOpcode = (Op)(0x0000ffff & word);
61 }
62}
63
64static const spv_opcode_desc_t opcodeTableEntries[] = {
65 {"Nop", 1, OpNop, SPV_OPCODE_FLAGS_NONE, 0, {}},
66 {"Undef",
67 3,
68 OpUndef,
69 SPV_OPCODE_FLAGS_NONE,
70 0,
71 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}},
72 {
73 "Source",
74 3,
75 OpSource,
76 SPV_OPCODE_FLAGS_NONE,
77 0,
78 {SPV_OPERAND_TYPE_SOURCE_LANGUAGE, SPV_OPERAND_TYPE_LITERAL_NUMBER},
79 },
80 {"SourceExtension",
81 1,
82 OpSourceExtension,
83 SPV_OPCODE_FLAGS_VARIABLE,
84 0,
85 {SPV_OPERAND_TYPE_LITERAL_STRING}},
86 {"Name",
87 2,
88 OpName,
89 SPV_OPCODE_FLAGS_VARIABLE,
90 0,
91 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_STRING}},
92 {"MemberName",
93 3,
94 OpMemberName,
95 SPV_OPCODE_FLAGS_VARIABLE,
96 0,
97 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_NUMBER,
98 SPV_OPERAND_TYPE_LITERAL_STRING}},
99 {"String",
100 2,
101 OpString,
102 SPV_OPCODE_FLAGS_VARIABLE,
103 0,
104 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL_STRING}},
105 {"Line",
106 5,
107 OpLine,
108 SPV_OPCODE_FLAGS_NONE,
109 0,
110 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_NUMBER,
111 SPV_OPERAND_TYPE_LITERAL_NUMBER}},
112 {"DecorationGroup",
113 2,
114 OpDecorationGroup,
115 SPV_OPCODE_FLAGS_NONE,
116 0,
117 {SPV_OPERAND_TYPE_RESULT_ID}},
118 {"Decorate",
119 3,
120 OpDecorate,
121 SPV_OPCODE_FLAGS_VARIABLE,
122 0,
123 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_DECORATION,
124 SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_LITERAL,
125 SPV_OPERAND_TYPE_ELLIPSIS}},
126 {"MemberDecorate",
127 4,
128 OpMemberDecorate,
129 SPV_OPCODE_FLAGS_VARIABLE,
130 0,
131 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_NUMBER,
132 SPV_OPERAND_TYPE_DECORATION, SPV_OPERAND_TYPE_LITERAL,
133 SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_ELLIPSIS}},
134 {"GroupDecorate",
135 2,
136 OpGroupDecorate,
137 SPV_OPCODE_FLAGS_VARIABLE,
138 0,
139 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
140 SPV_OPERAND_TYPE_ELLIPSIS}},
141 {"GroupMemberDecorate",
142 2,
143 OpGroupMemberDecorate,
144 SPV_OPCODE_FLAGS_VARIABLE,
145 0,
146 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
147 SPV_OPERAND_TYPE_ELLIPSIS}},
148 {"Extension",
149 1,
150 OpExtension,
151 SPV_OPCODE_FLAGS_VARIABLE,
152 0,
153 {SPV_OPERAND_TYPE_LITERAL_STRING}},
154 {"ExtInstImport",
155 2,
156 OpExtInstImport,
157 SPV_OPCODE_FLAGS_VARIABLE,
158 0,
159 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL_STRING}},
160 {"ExtInst",
161 5,
162 OpExtInst,
163 SPV_OPCODE_FLAGS_VARIABLE,
164 0,
165 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
166 SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
167 SPV_OPERAND_TYPE_ELLIPSIS}},
168 {"MemoryModel",
169 3,
170 OpMemoryModel,
171 SPV_OPCODE_FLAGS_NONE,
172 0,
173 {SPV_OPERAND_TYPE_ADDRESSING_MODEL, SPV_OPERAND_TYPE_MEMORY_MODEL}},
174 {"EntryPoint",
175 3,
176 OpEntryPoint,
177 SPV_OPCODE_FLAGS_VARIABLE,
178 0,
179 {SPV_OPERAND_TYPE_EXECUTION_MODEL, SPV_OPERAND_TYPE_ID,
180 SPV_OPERAND_TYPE_LITERAL_STRING}},
181 {"ExecutionMode",
182 3,
183 OpExecutionMode,
184 SPV_OPCODE_FLAGS_VARIABLE,
185 0,
186 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_MODE,
187 SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_LITERAL,
188 SPV_OPERAND_TYPE_ELLIPSIS}},
189 {"CompileFlag",
190 1,
191 OpCompileFlag,
192 SPV_OPCODE_FLAGS_VARIABLE | SPV_OPCODE_FLAGS_CAPABILITIES,
193 CapabilityKernel,
194 {SPV_OPERAND_TYPE_LITERAL_STRING}},
195 {"Capability",
196 2,
197 OpCapability,
198 SPV_OPCODE_FLAGS_NONE,
199 0,
200 {SPV_OPERAND_TYPE_CAPABILITY}},
201 {"TypeVoid",
202 2,
203 OpTypeVoid,
204 SPV_OPCODE_FLAGS_NONE,
205 0,
206 {SPV_OPERAND_TYPE_RESULT_ID}},
207 {"TypeBool",
208 2,
209 OpTypeBool,
210 SPV_OPCODE_FLAGS_NONE,
211 0,
212 {SPV_OPERAND_TYPE_RESULT_ID}},
213 {"TypeInt",
214 4,
215 OpTypeInt,
216 SPV_OPCODE_FLAGS_NONE,
217 0,
218 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL_NUMBER,
219 SPV_OPERAND_TYPE_LITERAL_NUMBER}},
220 {"TypeFloat",
221 3,
222 OpTypeFloat,
223 SPV_OPCODE_FLAGS_NONE,
224 0,
225 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL_NUMBER}},
226 {"TypeVector",
227 4,
228 OpTypeVector,
229 SPV_OPCODE_FLAGS_NONE,
230 0,
231 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
232 SPV_OPERAND_TYPE_LITERAL_NUMBER}},
233 {"TypeMatrix",
234 4,
235 OpTypeMatrix,
236 SPV_OPCODE_FLAGS_CAPABILITIES,
237 CapabilityMatrix,
238 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
239 SPV_OPERAND_TYPE_LITERAL_NUMBER}},
240 {"TypeSampler",
241 8,
242 OpTypeSampler,
243 SPV_OPCODE_FLAGS_VARIABLE,
244 0,
245 {
246 SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
247 SPV_OPERAND_TYPE_DIMENSIONALITY, SPV_OPERAND_TYPE_LITERAL_NUMBER,
248 SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_LITERAL_NUMBER,
249 SPV_OPERAND_TYPE_LITERAL_NUMBER,
250 SPV_OPERAND_TYPE_ID // TODO: See Khronos bug 13755
251 }},
252 {"TypeFilter",
253 2,
254 OpTypeFilter,
255 SPV_OPCODE_FLAGS_NONE,
256 0,
257 {SPV_OPERAND_TYPE_RESULT_ID}},
258 {"TypeArray",
259 4,
260 OpTypeArray,
261 SPV_OPCODE_FLAGS_NONE,
262 0,
263 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
264 {"TypeRuntimeArray",
265 3,
266 OpTypeRuntimeArray,
267 SPV_OPCODE_FLAGS_CAPABILITIES,
268 CapabilityShader,
269 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
270 {"TypeStruct",
271 2,
272 OpTypeStruct,
273 SPV_OPCODE_FLAGS_VARIABLE,
274 0,
275 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
276 SPV_OPERAND_TYPE_ELLIPSIS}},
277 {"TypeOpaque",
278 2,
279 OpTypeOpaque,
280 SPV_OPCODE_FLAGS_VARIABLE | SPV_OPCODE_FLAGS_CAPABILITIES,
281 CapabilityKernel,
282 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL_STRING}},
283 {"TypePointer",
284 4,
285 OpTypePointer,
286 SPV_OPCODE_FLAGS_NONE,
287 0,
288 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_STORAGE_CLASS,
289 SPV_OPERAND_TYPE_ID}},
290 {"TypeFunction",
291 3,
292 OpTypeFunction,
293 SPV_OPCODE_FLAGS_VARIABLE,
294 0,
295 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
296 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}},
297 {"TypeEvent",
298 2,
299 OpTypeEvent,
300 SPV_OPCODE_FLAGS_CAPABILITIES,
301 CapabilityKernel,
302 {SPV_OPERAND_TYPE_RESULT_ID}},
303 {"TypeDeviceEvent",
304 2,
305 OpTypeDeviceEvent,
306 SPV_OPCODE_FLAGS_CAPABILITIES,
307 CapabilityKernel,
308 {SPV_OPERAND_TYPE_RESULT_ID}},
309 {"TypeReserveId",
310 2,
311 OpTypeReserveId,
312 SPV_OPCODE_FLAGS_CAPABILITIES,
313 CapabilityKernel,
314 {SPV_OPERAND_TYPE_RESULT_ID}},
315 {"TypeQueue",
316 2,
317 OpTypeQueue,
318 SPV_OPCODE_FLAGS_CAPABILITIES,
319 CapabilityKernel,
320 {SPV_OPERAND_TYPE_RESULT_ID}},
321 {"TypePipe",
322 4,
323 OpTypePipe,
324 SPV_OPCODE_FLAGS_CAPABILITIES,
325 CapabilityPipes,
326 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
327 SPV_OPERAND_TYPE_ACCESS_QUALIFIER}},
328 {"ConstantTrue",
329 3,
330 OpConstantTrue,
331 SPV_OPCODE_FLAGS_NONE,
332 0,
333 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}},
334 {"ConstantFalse",
335 3,
336 OpConstantFalse,
337 SPV_OPCODE_FLAGS_NONE,
338 0,
339 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}},
340 {"Constant",
341 3,
342 OpConstant,
343 SPV_OPCODE_FLAGS_VARIABLE,
344 0,
345 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL,
346 SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_ELLIPSIS}},
347 {"ConstantComposite",
348 3,
349 OpConstantComposite,
350 SPV_OPCODE_FLAGS_VARIABLE,
351 0,
352 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
353 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}},
354 {"ConstantSampler",
355 6,
356 OpConstantSampler,
357 SPV_OPCODE_FLAGS_CAPABILITIES,
358 CapabilityKernel,
359 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
360 SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE, SPV_OPERAND_TYPE_LITERAL_NUMBER,
361 SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE}},
362 {"ConstantNull",
363 3,
364 OpConstantNull,
365 SPV_OPCODE_FLAGS_NONE,
366 0,
367 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}},
368 {"SpecConstantTrue",
369 3,
370 OpSpecConstantTrue,
371 SPV_OPCODE_FLAGS_CAPABILITIES,
372 CapabilityShader,
373 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}},
374 {"SpecConstantFalse",
375 3,
376 OpSpecConstantFalse,
377 SPV_OPCODE_FLAGS_CAPABILITIES,
378 CapabilityKernel,
379 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}},
380 {"SpecConstant",
381 3,
382 OpSpecConstant,
383 SPV_OPCODE_FLAGS_VARIABLE | SPV_OPCODE_FLAGS_CAPABILITIES,
384 CapabilityShader,
385 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL,
386 SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_ELLIPSIS}},
387 {"SpecConstantComposite",
388 3,
389 OpSpecConstantComposite,
390 SPV_OPCODE_FLAGS_VARIABLE | SPV_OPCODE_FLAGS_CAPABILITIES,
391 CapabilityShader,
392 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
393 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}},
394 {
395 "SpecConstantOp",
396 4,
397 OpSpecConstantOp,
398 SPV_OPCODE_FLAGS_VARIABLE,
399 0,
400 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
401 SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
402 SPV_OPERAND_TYPE_ELLIPSIS},
403
404 },
405 {"Variable",
406 4,
407 OpVariable,
408 SPV_OPCODE_FLAGS_VARIABLE,
409 0,
410 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
411 SPV_OPERAND_TYPE_STORAGE_CLASS, SPV_OPERAND_TYPE_ID}},
412 {"VariableArray",
413 5,
414 OpVariableArray,
415 SPV_OPCODE_FLAGS_CAPABILITIES,
416 CapabilityAddresses,
417 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
418 SPV_OPERAND_TYPE_STORAGE_CLASS, SPV_OPERAND_TYPE_ID}},
419 {"Load",
420 4,
421 OpLoad,
422 SPV_OPCODE_FLAGS_VARIABLE,
423 0,
424 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
425 SPV_OPERAND_TYPE_MEMORY_ACCESS, SPV_OPERAND_TYPE_MEMORY_ACCESS,
426 SPV_OPERAND_TYPE_ELLIPSIS}},
427 {"Store",
428 3,
429 OpStore,
430 SPV_OPCODE_FLAGS_VARIABLE,
431 0,
432 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_MEMORY_ACCESS,
433 SPV_OPERAND_TYPE_MEMORY_ACCESS, SPV_OPERAND_TYPE_ELLIPSIS}},
434 {"CopyMemory",
435 3,
436 OpCopyMemory,
437 SPV_OPCODE_FLAGS_VARIABLE,
438 0,
439 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_MEMORY_ACCESS,
440 SPV_OPERAND_TYPE_MEMORY_ACCESS, SPV_OPERAND_TYPE_ELLIPSIS}},
441 {"CopyMemorySized",
442 4,
443 OpCopyMemorySized,
444 SPV_OPCODE_FLAGS_VARIABLE | SPV_OPCODE_FLAGS_CAPABILITIES,
445 CapabilityAddresses,
446 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
447 SPV_OPERAND_TYPE_MEMORY_ACCESS, SPV_OPERAND_TYPE_MEMORY_ACCESS,
448 SPV_OPERAND_TYPE_ELLIPSIS}},
449 {"AccessChain",
450 4,
451 OpAccessChain,
452 SPV_OPCODE_FLAGS_VARIABLE,
453 0,
454 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
455 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}},
456 {"InBoundsAccessChain",
457 4,
458 OpInBoundsAccessChain,
459 SPV_OPCODE_FLAGS_VARIABLE,
460 0,
461 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
462 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}},
463 {"ArrayLength",
464 5,
465 OpArrayLength,
466 SPV_OPCODE_FLAGS_CAPABILITIES,
467 CapabilityShader,
468 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
469 SPV_OPERAND_TYPE_LITERAL_NUMBER}},
470 {"ImagePointer",
471 6,
472 OpImagePointer,
473 SPV_OPCODE_FLAGS_NONE,
474 0,
475 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
476 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
477 {"GenericPtrMemSemantics",
478 4,
479 OpGenericPtrMemSemantics,
480 SPV_OPCODE_FLAGS_CAPABILITIES,
481 CapabilityKernel,
482 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
483 {"Function",
484 5,
485 OpFunction,
486 SPV_OPCODE_FLAGS_NONE,
487 0,
488 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
489 SPV_OPERAND_TYPE_FUNCTION_CONTROL, SPV_OPERAND_TYPE_ID}},
490 {"FunctionParameter",
491 3,
492 OpFunctionParameter,
493 SPV_OPCODE_FLAGS_NONE,
494 0,
495 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}},
496 {"FunctionEnd", 1, OpFunctionEnd, SPV_OPCODE_FLAGS_NONE, 0, {}},
497 {"FunctionCall",
498 4,
499 OpFunctionCall,
500 SPV_OPCODE_FLAGS_VARIABLE,
501 0,
502 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
503 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}},
504 {"Sampler",
505 5,
506 OpSampler,
507 SPV_OPCODE_FLAGS_NONE,
508 0,
509 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
510 SPV_OPERAND_TYPE_ID}},
511 {"TextureSample",
512 5,
513 OpTextureSample,
514 SPV_OPCODE_FLAGS_VARIABLE | SPV_OPCODE_FLAGS_CAPABILITIES,
515 CapabilityShader,
516 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
517 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
518 {"TextureSampleDref",
519 6,
520 OpTextureSampleDref,
521 SPV_OPCODE_FLAGS_CAPABILITIES,
522 CapabilityShader,
523 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
524 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
525 {"TextureSampleLod",
526 6,
527 OpTextureSampleLod,
528 SPV_OPCODE_FLAGS_CAPABILITIES,
529 CapabilityShader,
530 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
531 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
532 {"TextureSampleProj",
533 5,
534 OpTextureSampleProj,
535 SPV_OPCODE_FLAGS_VARIABLE | SPV_OPCODE_FLAGS_CAPABILITIES,
536 CapabilityShader,
537 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
538 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
539 {"TextureSampleGrad",
540 7,
541 OpTextureSampleGrad,
542 SPV_OPCODE_FLAGS_CAPABILITIES,
543 CapabilityShader,
544 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
545 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
546 {"TextureSampleOffset",
547 6,
548 OpTextureSampleOffset,
549 SPV_OPCODE_FLAGS_VARIABLE | SPV_OPCODE_FLAGS_CAPABILITIES,
550 CapabilityShader,
551 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
552 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
553 {"TextureSampleProjLod",
554 6,
555 OpTextureSampleProjLod,
556 SPV_OPCODE_FLAGS_CAPABILITIES,
557 CapabilityShader,
558 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
559 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
560 {"TextureSampleProjGrad",
561 7,
562 OpTextureSampleProjGrad,
563 SPV_OPCODE_FLAGS_CAPABILITIES,
564 CapabilityShader,
565 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
566 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
567 {"TextureSampleLodOffset",
568 7,
569 OpTextureSampleLodOffset,
570 SPV_OPCODE_FLAGS_CAPABILITIES,
571 CapabilityShader,
572 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
573 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
574 {"TextureSampleProjOffset",
575 6,
576 OpTextureSampleProjOffset,
577 SPV_OPCODE_FLAGS_VARIABLE | SPV_OPCODE_FLAGS_CAPABILITIES,
578 CapabilityShader,
579 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
580 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
581 {"TextureSampleGradOffset",
582 8,
583 OpTextureSampleGradOffset,
584 SPV_OPCODE_FLAGS_CAPABILITIES,
585 CapabilityShader,
586 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
587 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
588 SPV_OPERAND_TYPE_ID}},
589 {"TextureSampleProjLodOffset",
590 7,
591 OpTextureSampleProjLodOffset,
592 SPV_OPCODE_FLAGS_CAPABILITIES,
593 CapabilityShader,
594 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
595 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
596 {"TextureSampleProjGradOffset",
597 8,
598 OpTextureSampleProjGradOffset,
599 SPV_OPCODE_FLAGS_CAPABILITIES,
600 CapabilityShader,
601 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
602 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
603 SPV_OPERAND_TYPE_ID}},
604 {"TextureFetchTexel",
605 6,
606 OpTextureFetchTexel,
607 SPV_OPCODE_FLAGS_CAPABILITIES,
608 CapabilityShader,
609 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
610 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
611 {"TextureFetchTexelOffset",
612 6,
613 OpTextureFetchTexelOffset,
614 SPV_OPCODE_FLAGS_CAPABILITIES,
615 CapabilityShader,
616 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
617 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
618 {"TextureFetchSample",
619 6,
620 OpTextureFetchSample,
621 SPV_OPCODE_FLAGS_CAPABILITIES,
622 CapabilityShader,
623 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
624 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
625 {"TextureFetchTexel",
626 5,
627 OpTextureFetchTexel,
628 SPV_OPCODE_FLAGS_CAPABILITIES,
629 CapabilityShader,
630 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
631 SPV_OPERAND_TYPE_ID}},
632 {"TextureGather",
633 6,
634 OpTextureGather,
635 SPV_OPCODE_FLAGS_CAPABILITIES,
636 CapabilityShader,
637 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
638 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
639 {"TextureGatherOffset",
640 7,
641 OpTextureGatherOffset,
642 SPV_OPCODE_FLAGS_CAPABILITIES,
643 CapabilityShader,
644 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
645 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
646 SPV_OPERAND_TYPE_ID}},
647 {"TextureGatherOffsets",
648 7,
649 OpTextureGatherOffsets,
650 SPV_OPCODE_FLAGS_CAPABILITIES,
651 CapabilityShader,
652 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
653 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
654 {"TextureQuerySizeLod",
655 5,
656 OpTextureQuerySizeLod,
657 SPV_OPCODE_FLAGS_CAPABILITIES,
658 CapabilityShader,
659 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
660 SPV_OPERAND_TYPE_ID}},
661 {"TextureQuerySize",
662 4,
663 OpTextureQuerySize,
664 SPV_OPCODE_FLAGS_CAPABILITIES,
665 CapabilityShader,
666 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
667 {"TextureQueryLod",
668 5,
669 OpTextureQueryLod,
670 SPV_OPCODE_FLAGS_CAPABILITIES,
671 CapabilityShader,
672 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
673 SPV_OPERAND_TYPE_ID}},
674 {"TextureQueryLevels",
675 4,
676 OpTextureQueryLevels,
677 SPV_OPCODE_FLAGS_CAPABILITIES,
678 CapabilityShader,
679 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
680 {"TextureQuerySamples",
681 4,
682 OpTextureQuerySamples,
683 SPV_OPCODE_FLAGS_CAPABILITIES,
684 CapabilityShader,
685 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
686 {"ConvertFToU",
687 4,
688 OpConvertFToU,
689 SPV_OPCODE_FLAGS_NONE,
690 0,
691 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
692 {"ConvertFToS",
693 4,
694 OpConvertFToS,
695 SPV_OPCODE_FLAGS_NONE,
696 0,
697 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
698 {"ConvertSToF",
699 4,
700 OpConvertSToF,
701 SPV_OPCODE_FLAGS_NONE,
702 0,
703 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
704 {"ConvertUToF",
705 4,
706 OpConvertUToF,
707 SPV_OPCODE_FLAGS_NONE,
708 0,
709 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
710 {"UConvert",
711 4,
712 OpUConvert,
713 SPV_OPCODE_FLAGS_NONE,
714 0,
715 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
716 {"SConvert",
717 4,
718 OpSConvert,
719 SPV_OPCODE_FLAGS_NONE,
720 0,
721 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
722 {"FConvert",
723 4,
724 OpFConvert,
725 SPV_OPCODE_FLAGS_NONE,
726 0,
727 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
728 {"ConvertPtrToU",
729 4,
730 OpConvertPtrToU,
731 SPV_OPCODE_FLAGS_CAPABILITIES,
732 CapabilityAddresses,
733 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
734 {"ConvertUToPtr",
735 4,
736 OpConvertUToPtr,
737 SPV_OPCODE_FLAGS_CAPABILITIES,
738 CapabilityAddresses,
739 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
740 {"PtrCastToGeneric",
741 4,
742 OpPtrCastToGeneric,
743 SPV_OPCODE_FLAGS_CAPABILITIES,
744 CapabilityKernel,
745 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
746 {"GenericCastToPtr",
747 4,
748 OpGenericCastToPtr,
749 SPV_OPCODE_FLAGS_CAPABILITIES,
750 CapabilityKernel,
751 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
752 {"Bitcast",
753 4,
754 OpBitcast,
755 SPV_OPCODE_FLAGS_NONE,
756 0,
757 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
758 {"GenericCastToPtrExplicit",
759 5,
760 OpGenericCastToPtrExplicit,
761 SPV_OPCODE_FLAGS_CAPABILITIES,
762 CapabilityKernel,
763 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
764 SPV_OPERAND_TYPE_STORAGE_CLASS}},
765 {"SatConvertSToU",
766 4,
767 OpSatConvertSToU,
768 SPV_OPCODE_FLAGS_CAPABILITIES,
769 CapabilityKernel,
770 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
771 {"SatConvertUToS",
772 4,
773 OpSatConvertUToS,
774 SPV_OPCODE_FLAGS_CAPABILITIES,
775 CapabilityKernel,
776 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
777 {"VectorExtractDynamic",
778 5,
779 OpVectorExtractDynamic,
780 SPV_OPCODE_FLAGS_NONE,
781 0,
782 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
783 SPV_OPERAND_TYPE_ID}},
784 {"VectorInsertDynamic",
785 6,
786 OpVectorInsertDynamic,
787 SPV_OPCODE_FLAGS_NONE,
788 0,
789 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
790 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
791 {"VectorShuffle",
792 5,
793 OpVectorShuffle,
794 SPV_OPCODE_FLAGS_VARIABLE,
795 0,
796 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
797 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_LITERAL,
798 SPV_OPERAND_TYPE_ELLIPSIS}},
799 {"CompositeConstruct",
800 3,
801 OpCompositeConstruct,
802 SPV_OPCODE_FLAGS_VARIABLE,
803 0,
804 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
805 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}},
806 {"CompositeExtract",
807 4,
808 OpCompositeExtract,
809 SPV_OPCODE_FLAGS_VARIABLE,
810 0,
811 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
812 SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_LITERAL,
813 SPV_OPERAND_TYPE_ELLIPSIS}},
814 {"CompositeInsert",
815 5,
816 OpCompositeInsert,
817 SPV_OPCODE_FLAGS_VARIABLE,
818 0,
819 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
820 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_LITERAL,
821 SPV_OPERAND_TYPE_ELLIPSIS}},
822 {"CopyObject",
823 4,
824 OpCopyObject,
825 SPV_OPCODE_FLAGS_NONE,
826 0,
827 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
828 {"Transpose",
829 4,
830 OpTranspose,
831 SPV_OPCODE_FLAGS_CAPABILITIES,
832 CapabilityMatrix,
833 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
834 {"SNegate",
835 4,
836 OpSNegate,
837 SPV_OPCODE_FLAGS_NONE,
838 0,
839 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
840 {"FNegate",
841 4,
842 OpFNegate,
843 SPV_OPCODE_FLAGS_NONE,
844 0,
845 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
846 {"Not",
847 4,
848 OpNot,
849 SPV_OPCODE_FLAGS_NONE,
850 0,
851 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
852 {"IAdd",
853 5,
854 OpIAdd,
855 SPV_OPCODE_FLAGS_NONE,
856 0,
857 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
858 SPV_OPERAND_TYPE_ID}},
859 {"FAdd",
860 5,
861 OpFAdd,
862 SPV_OPCODE_FLAGS_NONE,
863 0,
864 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
865 SPV_OPERAND_TYPE_ID}},
866 {"ISub",
867 5,
868 OpISub,
869 SPV_OPCODE_FLAGS_NONE,
870 0,
871 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
872 SPV_OPERAND_TYPE_ID}},
873 {"FSub",
874 5,
875 OpFSub,
876 SPV_OPCODE_FLAGS_NONE,
877 0,
878 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
879 SPV_OPERAND_TYPE_ID}},
880 {"IMul",
881 5,
882 OpIMul,
883 SPV_OPCODE_FLAGS_NONE,
884 0,
885 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
886 SPV_OPERAND_TYPE_ID}},
887 {"FMul",
888 5,
889 OpFMul,
890 SPV_OPCODE_FLAGS_NONE,
891 0,
892 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
893 SPV_OPERAND_TYPE_ID}},
894 {"UDiv",
895 5,
896 OpUDiv,
897 SPV_OPCODE_FLAGS_NONE,
898 0,
899 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
900 SPV_OPERAND_TYPE_ID}},
901 {"SDiv",
902 5,
903 OpSDiv,
904 SPV_OPCODE_FLAGS_NONE,
905 0,
906 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
907 SPV_OPERAND_TYPE_ID}},
908 {"FDiv",
909 5,
910 OpFDiv,
911 SPV_OPCODE_FLAGS_NONE,
912 0,
913 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
914 SPV_OPERAND_TYPE_ID}},
915 {"UMod",
916 5,
917 OpUMod,
918 SPV_OPCODE_FLAGS_NONE,
919 0,
920 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
921 SPV_OPERAND_TYPE_ID}},
922 {"SRem",
923 5,
924 OpSRem,
925 SPV_OPCODE_FLAGS_NONE,
926 0,
927 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
928 SPV_OPERAND_TYPE_ID}},
929 {"SMod",
930 5,
931 OpSMod,
932 SPV_OPCODE_FLAGS_NONE,
933 0,
934 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
935 SPV_OPERAND_TYPE_ID}},
936 {"FRem",
937 5,
938 OpFRem,
939 SPV_OPCODE_FLAGS_NONE,
940 0,
941 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
942 SPV_OPERAND_TYPE_ID}},
943 {"FMod",
944 5,
945 OpFMod,
946 SPV_OPCODE_FLAGS_NONE,
947 0,
948 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
949 SPV_OPERAND_TYPE_ID}},
950 {"VectorTimesScalar",
951 5,
952 OpVectorTimesScalar,
953 SPV_OPCODE_FLAGS_NONE,
954 0,
955 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
956 SPV_OPERAND_TYPE_ID}},
957 {"MatrixTimesScalar",
958 5,
959 OpMatrixTimesScalar,
960 SPV_OPCODE_FLAGS_CAPABILITIES,
961 CapabilityMatrix,
962 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
963 SPV_OPERAND_TYPE_ID}},
964 {"VectorTimesMatrix",
965 5,
966 OpVectorTimesMatrix,
967 SPV_OPCODE_FLAGS_CAPABILITIES,
968 CapabilityMatrix,
969 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
970 SPV_OPERAND_TYPE_ID}},
971 {"MatrixTimesVector",
972 5,
973 OpMatrixTimesVector,
974 SPV_OPCODE_FLAGS_CAPABILITIES,
975 CapabilityMatrix,
976 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
977 SPV_OPERAND_TYPE_ID}},
978 {"MatrixTimesMatrix",
979 5,
980 OpMatrixTimesMatrix,
981 SPV_OPCODE_FLAGS_CAPABILITIES,
982 CapabilityMatrix,
983 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
984 SPV_OPERAND_TYPE_ID}},
985 {"OuterProduct",
986 5,
987 OpOuterProduct,
988 SPV_OPCODE_FLAGS_CAPABILITIES,
989 CapabilityMatrix,
990 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
991 SPV_OPERAND_TYPE_ID}},
992 {"Dot",
993 5,
994 OpDot,
995 SPV_OPCODE_FLAGS_NONE,
996 0,
997 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
998 SPV_OPERAND_TYPE_ID}},
999 {"ShiftRightLogical",
1000 5,
1001 OpShiftRightLogical,
1002 SPV_OPCODE_FLAGS_NONE,
1003 0,
1004 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1005 SPV_OPERAND_TYPE_ID}},
1006 {"ShiftRightArithmetic",
1007 5,
1008 OpShiftRightArithmetic,
1009 SPV_OPCODE_FLAGS_NONE,
1010 0,
1011 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1012 SPV_OPERAND_TYPE_ID}},
1013 {"ShiftLeftLogical",
1014 5,
1015 OpShiftLeftLogical,
1016 SPV_OPCODE_FLAGS_NONE,
1017 0,
1018 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1019 SPV_OPERAND_TYPE_ID}},
1020 {"BitwiseOr",
1021 5,
1022 OpBitwiseOr,
1023 SPV_OPCODE_FLAGS_NONE,
1024 0,
1025 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1026 SPV_OPERAND_TYPE_ID}},
1027 {"BitwiseXor",
1028 5,
1029 OpBitwiseXor,
1030 SPV_OPCODE_FLAGS_NONE,
1031 0,
1032 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1033 SPV_OPERAND_TYPE_ID}},
1034 {"BitwiseAnd",
1035 5,
1036 OpBitwiseAnd,
1037 SPV_OPCODE_FLAGS_NONE,
1038 0,
1039 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1040 SPV_OPERAND_TYPE_ID}},
1041 {"Any",
1042 4,
1043 OpAny,
1044 SPV_OPCODE_FLAGS_NONE,
1045 0,
1046 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1047 {"All",
1048 4,
1049 OpAll,
1050 SPV_OPCODE_FLAGS_NONE,
1051 0,
1052 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1053 {"IsNan",
1054 4,
1055 OpIsNan,
1056 SPV_OPCODE_FLAGS_NONE,
1057 0,
1058 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1059 {"IsInf",
1060 4,
1061 OpIsInf,
1062 SPV_OPCODE_FLAGS_NONE,
1063 0,
1064 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1065 {"IsFinite",
1066 4,
1067 OpIsFinite,
1068 SPV_OPCODE_FLAGS_CAPABILITIES,
1069 CapabilityKernel,
1070 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1071 {"IsNormal",
1072 4,
1073 OpIsNormal,
1074 SPV_OPCODE_FLAGS_CAPABILITIES,
1075 CapabilityKernel,
1076 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1077 {"SignBitSet",
1078 4,
1079 OpSignBitSet,
1080 SPV_OPCODE_FLAGS_CAPABILITIES,
1081 CapabilityKernel,
1082 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1083 {"LessOrGreater",
1084 5,
1085 OpLessOrGreater,
1086 SPV_OPCODE_FLAGS_CAPABILITIES,
1087 CapabilityKernel,
1088 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1089 SPV_OPERAND_TYPE_ID}},
1090 {"Ordered",
1091 5,
1092 OpOrdered,
1093 SPV_OPCODE_FLAGS_CAPABILITIES,
1094 CapabilityKernel,
1095 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1096 SPV_OPERAND_TYPE_ID}},
1097 {"Unordered",
1098 5,
1099 OpUnordered,
1100 SPV_OPCODE_FLAGS_CAPABILITIES,
1101 CapabilityKernel,
1102 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1103 SPV_OPERAND_TYPE_ID}},
1104 {"LogicalOr",
1105 5,
1106 OpLogicalOr,
1107 SPV_OPCODE_FLAGS_NONE,
1108 0,
1109 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1110 SPV_OPERAND_TYPE_ID}},
1111 {"LogicalXor",
1112 5,
1113 OpLogicalXor,
1114 SPV_OPCODE_FLAGS_NONE,
1115 0,
1116 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1117 SPV_OPERAND_TYPE_ID}},
1118 {"LogicalAnd",
1119 5,
1120 OpLogicalAnd,
1121 SPV_OPCODE_FLAGS_NONE,
1122 0,
1123 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1124 SPV_OPERAND_TYPE_ID}},
1125 {"Select",
1126 6,
1127 OpSelect,
1128 SPV_OPCODE_FLAGS_NONE,
1129 0,
1130 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1131 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
1132 {"IEqual",
1133 5,
1134 OpIEqual,
1135 SPV_OPCODE_FLAGS_NONE,
1136 0,
1137 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1138 SPV_OPERAND_TYPE_ID}},
1139 {"FOrdEqual",
1140 5,
1141 OpFOrdEqual,
1142 SPV_OPCODE_FLAGS_NONE,
1143 0,
1144 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1145 SPV_OPERAND_TYPE_ID}},
1146 {"FUnordEqual",
1147 5,
1148 OpFUnordEqual,
1149 SPV_OPCODE_FLAGS_NONE,
1150 0,
1151 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1152 SPV_OPERAND_TYPE_ID}},
1153 {"INotEqual",
1154 5,
1155 OpINotEqual,
1156 SPV_OPCODE_FLAGS_NONE,
1157 0,
1158 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1159 SPV_OPERAND_TYPE_ID}},
1160 {"FOrdNotEqual",
1161 5,
1162 OpFOrdNotEqual,
1163 SPV_OPCODE_FLAGS_NONE,
1164 0,
1165 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1166 SPV_OPERAND_TYPE_ID}},
1167 {"FUnordNotEqual",
1168 5,
1169 OpFUnordNotEqual,
1170 SPV_OPCODE_FLAGS_NONE,
1171 0,
1172 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1173 SPV_OPERAND_TYPE_ID}},
1174 {"ULessThan",
1175 5,
1176 OpULessThan,
1177 SPV_OPCODE_FLAGS_NONE,
1178 0,
1179 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1180 SPV_OPERAND_TYPE_ID}},
1181 {"SLessThan",
1182 5,
1183 OpSLessThan,
1184 SPV_OPCODE_FLAGS_NONE,
1185 0,
1186 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1187 SPV_OPERAND_TYPE_ID}},
1188 {"FOrdLessThan",
1189 5,
1190 OpFOrdLessThan,
1191 SPV_OPCODE_FLAGS_NONE,
1192 0,
1193 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1194 SPV_OPERAND_TYPE_ID}},
1195 {"FUnordLessThan",
1196 5,
1197 OpFUnordLessThan,
1198 SPV_OPCODE_FLAGS_NONE,
1199 0,
1200 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1201 SPV_OPERAND_TYPE_ID}},
1202 {"UGreaterThan",
1203 5,
1204 OpUGreaterThan,
1205 SPV_OPCODE_FLAGS_NONE,
1206 0,
1207 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1208 SPV_OPERAND_TYPE_ID}},
1209 {"SGreaterThan",
1210 5,
1211 OpSGreaterThan,
1212 SPV_OPCODE_FLAGS_NONE,
1213 0,
1214 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1215 SPV_OPERAND_TYPE_ID}},
1216 {"FOrdGreaterThan",
1217 5,
1218 OpFOrdGreaterThan,
1219 SPV_OPCODE_FLAGS_NONE,
1220 0,
1221 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1222 SPV_OPERAND_TYPE_ID}},
1223 {"FUnordGreaterThan",
1224 5,
1225 OpFUnordGreaterThan,
1226 SPV_OPCODE_FLAGS_NONE,
1227 0,
1228 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1229 SPV_OPERAND_TYPE_ID}},
1230 {"ULessThanEqual",
1231 5,
1232 OpULessThanEqual,
1233 SPV_OPCODE_FLAGS_NONE,
1234 0,
1235 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1236 SPV_OPERAND_TYPE_ID}},
1237 {"SLessThanEqual",
1238 5,
1239 OpSLessThanEqual,
1240 SPV_OPCODE_FLAGS_NONE,
1241 0,
1242 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1243 SPV_OPERAND_TYPE_ID}},
1244 {"FOrdLessThanEqual",
1245 5,
1246 OpFOrdLessThanEqual,
1247 SPV_OPCODE_FLAGS_NONE,
1248 0,
1249 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1250 SPV_OPERAND_TYPE_ID}},
1251 {"FUnordLessThanEqual",
1252 5,
1253 OpFUnordLessThanEqual,
1254 SPV_OPCODE_FLAGS_NONE,
1255 0,
1256 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1257 SPV_OPERAND_TYPE_ID}},
1258 {"UGreaterThanEqual",
1259 5,
1260 OpUGreaterThanEqual,
1261 SPV_OPCODE_FLAGS_NONE,
1262 0,
1263 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1264 SPV_OPERAND_TYPE_ID}},
1265 {"SGreaterThanEqual",
1266 5,
1267 OpSGreaterThanEqual,
1268 SPV_OPCODE_FLAGS_NONE,
1269 0,
1270 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1271 SPV_OPERAND_TYPE_ID}},
1272 {"FOrdGreaterThanEqual",
1273 5,
1274 OpFOrdGreaterThanEqual,
1275 SPV_OPCODE_FLAGS_NONE,
1276 0,
1277 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1278 SPV_OPERAND_TYPE_ID}},
1279 {"FUnordGreaterThanEqual",
1280 5,
1281 OpFUnordGreaterThanEqual,
1282 SPV_OPCODE_FLAGS_NONE,
1283 0,
1284 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1285 SPV_OPERAND_TYPE_ID}},
1286 {"DPdx",
1287 4,
1288 OpDPdx,
1289 SPV_OPCODE_FLAGS_CAPABILITIES,
1290 CapabilityShader,
1291 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1292 {"DPdy",
1293 4,
1294 OpDPdy,
1295 SPV_OPCODE_FLAGS_CAPABILITIES,
1296 CapabilityShader,
1297 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1298 {
1299 "Fwidth",
1300 4,
1301 OpFwidth,
1302 SPV_OPCODE_FLAGS_CAPABILITIES,
1303 CapabilityShader,
1304 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID},
1305 },
1306 {"DPdxFine",
1307 4,
1308 OpDPdxFine,
1309 SPV_OPCODE_FLAGS_CAPABILITIES,
1310 CapabilityShader,
1311 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1312 {"DPdyFine",
1313 4,
1314 OpDPdyFine,
1315 SPV_OPCODE_FLAGS_CAPABILITIES,
1316 CapabilityShader,
1317 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1318 {
1319 "FwidthFine",
1320 4,
1321 OpFwidthFine,
1322 SPV_OPCODE_FLAGS_CAPABILITIES,
1323 CapabilityShader,
1324 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID},
1325 },
1326 {"DPdxCoarse",
1327 4,
1328 OpDPdxCoarse,
1329 SPV_OPCODE_FLAGS_CAPABILITIES,
1330 CapabilityShader,
1331 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1332 {"DPdyCoarse",
1333 4,
1334 OpDPdyCoarse,
1335 SPV_OPCODE_FLAGS_CAPABILITIES,
1336 CapabilityShader,
1337 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1338 {
1339 "FwidthCoarse",
1340 4,
1341 OpFwidthCoarse,
1342 SPV_OPCODE_FLAGS_CAPABILITIES,
1343 CapabilityShader,
1344 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID},
1345 },
1346 {"Phi",
1347 3,
1348 OpPhi,
1349 SPV_OPCODE_FLAGS_VARIABLE,
1350 0,
1351 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1352 SPV_OPERAND_TYPE_ID}},
1353 {"LoopMerge",
1354 3,
1355 OpLoopMerge,
1356 SPV_OPCODE_FLAGS_NONE,
1357 0,
1358 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LOOP_CONTROL}},
1359 {"SelectionMerge",
1360 3,
1361 OpSelectionMerge,
1362 SPV_OPCODE_FLAGS_NONE,
1363 0,
1364 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_SELECTION_CONTROL}},
1365 {"Label",
1366 2,
1367 OpLabel,
1368 SPV_OPCODE_FLAGS_NONE,
1369 0,
1370 {SPV_OPERAND_TYPE_RESULT_ID}},
1371 {"Branch", 2, OpBranch, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID}},
1372 {"BranchConditional",
1373 4,
1374 OpBranchConditional,
1375 SPV_OPCODE_FLAGS_VARIABLE,
1376 0,
1377 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
1378 SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_LITERAL,
1379 SPV_OPERAND_TYPE_ELLIPSIS}},
1380 {"Switch",
1381 3,
1382 OpSwitch,
1383 SPV_OPCODE_FLAGS_VARIABLE,
1384 0,
1385 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
1386 SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL,
1387 SPV_OPERAND_TYPE_ID}},
1388 {"Kill", 1, OpKill, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, {}},
1389 {"Return", 1, OpReturn, SPV_OPCODE_FLAGS_NONE, 0, {}},
1390 {"ReturnValue",
1391 2,
1392 OpReturnValue,
1393 SPV_OPCODE_FLAGS_NONE,
1394 0,
1395 {SPV_OPERAND_TYPE_ID}},
1396 {"Unreachable",
1397 1,
1398 OpUnreachable,
1399 SPV_OPCODE_FLAGS_CAPABILITIES,
1400 CapabilityKernel,
1401 {}},
1402 {"LifetimeStart",
1403 3,
1404 OpLifetimeStart,
1405 SPV_OPCODE_FLAGS_NONE,
1406 0,
1407 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_NUMBER}},
1408 {"LifetimeStop",
1409 3,
1410 OpLifetimeStop,
1411 SPV_OPCODE_FLAGS_NONE,
1412 0,
1413 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_NUMBER}},
1414 {"AtomicInit",
1415 3,
1416 OpAtomicInit,
1417 SPV_OPCODE_FLAGS_NONE,
1418 0,
1419 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
1420 {"AtomicLoad",
1421 6,
1422 OpAtomicLoad,
1423 SPV_OPCODE_FLAGS_NONE,
1424 0,
1425 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1426 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS}},
1427 {"AtomicStore",
1428 5,
1429 OpAtomicStore,
1430 SPV_OPCODE_FLAGS_NONE,
1431 0,
1432 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE,
1433 SPV_OPERAND_TYPE_MEMORY_SEMANTICS, SPV_OPERAND_TYPE_ID}},
1434 {"AtomicExchange",
1435 7,
1436 OpAtomicExchange,
1437 SPV_OPCODE_FLAGS_NONE,
1438 0,
1439 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1440 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1441 SPV_OPERAND_TYPE_ID}},
1442 {"AtomicCompareExchange",
1443 8,
1444 OpAtomicCompareExchange,
1445 SPV_OPCODE_FLAGS_NONE,
1446 0,
1447 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1448 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1449 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
1450 {"AtomicCompareExchangeWeak",
1451 8,
1452 OpAtomicCompareExchangeWeak,
1453 SPV_OPCODE_FLAGS_NONE,
1454 0,
1455 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1456 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1457 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
1458 {"AtomicIIncrement",
1459 6,
1460 OpAtomicIIncrement,
1461 SPV_OPCODE_FLAGS_NONE,
1462 0,
1463 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1464 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS}},
1465 {"AtomicIDecrement",
1466 6,
1467 OpAtomicIDecrement,
1468 SPV_OPCODE_FLAGS_NONE,
1469 0,
1470 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1471 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS}},
1472 {"AtomicIAdd",
1473 7,
1474 OpAtomicIAdd,
1475 SPV_OPCODE_FLAGS_NONE,
1476 0,
1477 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1478 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1479 SPV_OPERAND_TYPE_ID}},
1480 {"AtomicISub",
1481 7,
1482 OpAtomicISub,
1483 SPV_OPCODE_FLAGS_NONE,
1484 0,
1485 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1486 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1487 SPV_OPERAND_TYPE_ID}},
1488 {"AtomicUMin",
1489 7,
1490 OpAtomicUMin,
1491 SPV_OPCODE_FLAGS_NONE,
1492 0,
1493 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1494 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1495 SPV_OPERAND_TYPE_ID}},
1496 {"AtomicUMax",
1497 7,
1498 OpAtomicUMax,
1499 SPV_OPCODE_FLAGS_NONE,
1500 0,
1501 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1502 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1503 SPV_OPERAND_TYPE_ID}},
1504 {"AtomicAnd",
1505 7,
1506 OpAtomicAnd,
1507 SPV_OPCODE_FLAGS_NONE,
1508 0,
1509 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1510 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1511 SPV_OPERAND_TYPE_ID}},
1512 {"AtomicOr",
1513 7,
1514 OpAtomicOr,
1515 SPV_OPCODE_FLAGS_NONE,
1516 0,
1517 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1518 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1519 SPV_OPERAND_TYPE_ID}},
1520 {"AtomicXor",
1521 7,
1522 OpAtomicXor,
1523 SPV_OPCODE_FLAGS_NONE,
1524 0,
1525 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1526 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1527 SPV_OPERAND_TYPE_ID}},
1528 {"AtomicIMin",
1529 7,
1530 OpAtomicIMin,
1531 SPV_OPCODE_FLAGS_NONE,
1532 0,
1533 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1534 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1535 SPV_OPERAND_TYPE_ID}},
1536 {"AtomicIMax",
1537 7,
1538 OpAtomicIMax,
1539 SPV_OPCODE_FLAGS_NONE,
1540 0,
1541 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1542 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1543 SPV_OPERAND_TYPE_ID}},
1544 {"EmitVertex",
1545 1,
1546 OpEmitVertex,
1547 SPV_OPCODE_FLAGS_CAPABILITIES,
1548 CapabilityGeometry,
1549 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_STRING}},
1550 {"EndPrimitive",
1551 1,
1552 OpEndPrimitive,
1553 SPV_OPCODE_FLAGS_CAPABILITIES,
1554 CapabilityGeometry,
1555 {}},
1556 {"EmitStreamVertex",
1557 2,
1558 OpEmitStreamVertex,
1559 SPV_OPCODE_FLAGS_CAPABILITIES,
1560 CapabilityGeometry,
1561 {SPV_OPERAND_TYPE_ID}},
1562 {"EndStreamPrimitive",
1563 2,
1564 OpEndStreamPrimitive,
1565 SPV_OPCODE_FLAGS_CAPABILITIES,
1566 CapabilityGeometry,
1567 {SPV_OPERAND_TYPE_ID}},
1568 {"ControlBarrier",
1569 2,
1570 OpControlBarrier,
1571 SPV_OPCODE_FLAGS_NONE,
1572 0,
1573 {SPV_OPERAND_TYPE_EXECUTION_SCOPE}},
1574 {"MemoryBarrier",
1575 3,
1576 OpMemoryBarrier,
1577 SPV_OPCODE_FLAGS_NONE,
1578 0,
1579 {SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS}},
1580 {"AsyncGroupCopy",
1581 9,
1582 OpAsyncGroupCopy,
1583 SPV_OPCODE_FLAGS_CAPABILITIES,
1584 CapabilityKernel,
1585 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1586 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID,
1587 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
1588 SPV_OPERAND_TYPE_ID}},
1589 {"WaitGroupEvents",
1590 6,
1591 OpWaitGroupEvents,
1592 SPV_OPCODE_FLAGS_CAPABILITIES,
1593 CapabilityKernel,
1594 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1595 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID,
1596 SPV_OPERAND_TYPE_ID}},
1597 {"GroupAll",
1598 5,
1599 OpGroupAll,
1600 SPV_OPCODE_FLAGS_CAPABILITIES,
1601 CapabilityGroups,
1602 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1603 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID}},
1604 {"GroupAny",
1605 5,
1606 OpGroupAny,
1607 SPV_OPCODE_FLAGS_CAPABILITIES,
1608 CapabilityGroups,
1609 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1610 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID}},
1611 {"GroupBroadcast",
1612 6,
1613 OpGroupBroadcast,
1614 SPV_OPCODE_FLAGS_CAPABILITIES,
1615 CapabilityGroups,
1616 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1617 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID,
1618 SPV_OPERAND_TYPE_ID}},
1619 {"GroupIAdd",
1620 6,
1621 OpGroupIAdd,
1622 SPV_OPCODE_FLAGS_CAPABILITIES,
1623 CapabilityGroups,
1624 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1625 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION,
1626 SPV_OPERAND_TYPE_ID}},
1627 {"GroupFAdd",
1628 6,
1629 OpGroupFAdd,
1630 SPV_OPCODE_FLAGS_CAPABILITIES,
1631 CapabilityGroups,
1632 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1633 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION,
1634 SPV_OPERAND_TYPE_ID}},
1635 {"GroupFMin",
1636 6,
1637 OpGroupFMin,
1638 SPV_OPCODE_FLAGS_CAPABILITIES,
1639 CapabilityGroups,
1640 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1641 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION,
1642 SPV_OPERAND_TYPE_ID}},
1643 {"GroupUMin",
1644 6,
1645 OpGroupUMin,
1646 SPV_OPCODE_FLAGS_CAPABILITIES,
1647 CapabilityGroups,
1648 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1649 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION,
1650 SPV_OPERAND_TYPE_ID}},
1651 {"GroupSMin",
1652 6,
1653 OpGroupSMin,
1654 SPV_OPCODE_FLAGS_CAPABILITIES,
1655 CapabilityGroups,
1656 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1657 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION,
1658 SPV_OPERAND_TYPE_ID}},
1659 {"GroupFMax",
1660 6,
1661 OpGroupFMax,
1662 SPV_OPCODE_FLAGS_CAPABILITIES,
1663 CapabilityGroups,
1664 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1665 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION,
1666 SPV_OPERAND_TYPE_ID}},
1667 {"GroupUMax",
1668 6,
1669 OpGroupUMax,
1670 SPV_OPCODE_FLAGS_CAPABILITIES,
1671 CapabilityGroups,
1672 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1673 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION,
1674 SPV_OPERAND_TYPE_ID}},
1675 {"GroupSMax",
1676 6,
1677 OpGroupSMax,
1678 SPV_OPCODE_FLAGS_CAPABILITIES,
1679 CapabilityGroups,
1680 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1681 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION,
1682 SPV_OPERAND_TYPE_ID}},
1683 {"EnqueueMarker",
1684 7,
1685 OpEnqueueMarker,
1686 SPV_OPCODE_FLAGS_CAPABILITIES,
1687 CapabilityDeviceEnqueue,
1688 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1689 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
1690 {"EnqueueKernel",
1691 13,
1692 OpEnqueueKernel,
1693 SPV_OPCODE_FLAGS_VARIABLE | SPV_OPCODE_FLAGS_CAPABILITIES,
1694 CapabilityDeviceEnqueue,
1695 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1696 SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS, SPV_OPERAND_TYPE_ID,
1697 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
1698 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
1699 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
1700 SPV_OPERAND_TYPE_ELLIPSIS}},
1701 {"GetKernelNDrangeSubGroupCount",
1702 5,
1703 OpGetKernelNDrangeSubGroupCount,
1704 SPV_OPCODE_FLAGS_CAPABILITIES,
1705 CapabilityDeviceEnqueue,
1706 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1707 SPV_OPERAND_TYPE_ID}},
1708 {"GetKernelNDrangeMaxSubGroupSize",
1709 5,
1710 OpGetKernelNDrangeMaxSubGroupSize,
1711 SPV_OPCODE_FLAGS_CAPABILITIES,
1712 CapabilityDeviceEnqueue,
1713 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1714 SPV_OPERAND_TYPE_ID}},
1715 {"GetKernelWorkGroupSize",
1716 4,
1717 OpGetKernelWorkGroupSize,
1718 SPV_OPCODE_FLAGS_CAPABILITIES,
1719 CapabilityDeviceEnqueue,
1720 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1721 {"GetKernelPreferredWorkGroupSizeMultiple",
1722 4,
1723 OpGetKernelPreferredWorkGroupSizeMultiple,
1724 SPV_OPCODE_FLAGS_CAPABILITIES,
1725 CapabilityDeviceEnqueue,
1726 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1727 {"RetainEvent",
1728 2,
1729 OpRetainEvent,
1730 SPV_OPCODE_FLAGS_CAPABILITIES,
1731 CapabilityDeviceEnqueue,
1732 {SPV_OPERAND_TYPE_ID}},
1733 {"ReleaseEvent",
1734 2,
1735 OpRetainEvent,
1736 SPV_OPCODE_FLAGS_CAPABILITIES,
1737 CapabilityDeviceEnqueue,
1738 {SPV_OPERAND_TYPE_ID}},
1739 {"CreateUserEvent",
1740 3,
1741 OpCreateUserEvent,
1742 SPV_OPCODE_FLAGS_CAPABILITIES,
1743 CapabilityDeviceEnqueue,
1744 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}},
1745 {"IsValidEvent",
1746 4,
1747 OpIsValidEvent,
1748 SPV_OPCODE_FLAGS_CAPABILITIES,
1749 CapabilityDeviceEnqueue,
1750 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1751 {"SetUserEventStatus",
1752 3,
1753 OpSetUserEventStatus,
1754 SPV_OPCODE_FLAGS_CAPABILITIES,
1755 CapabilityDeviceEnqueue,
1756 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
1757 {"CapabilitytureEventProfilingInfo",
1758 4,
1759 OpCaptureEventProfilingInfo,
1760 SPV_OPCODE_FLAGS_CAPABILITIES,
1761 CapabilityDeviceEnqueue,
1762 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_KERENL_PROFILING_INFO,
1763 SPV_OPERAND_TYPE_ID}},
1764 {"GetDefaultQueue",
1765 3,
1766 OpGetDefaultQueue,
1767 SPV_OPCODE_FLAGS_CAPABILITIES,
1768 CapabilityDeviceEnqueue,
1769 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}},
1770 {"BuildNDRange",
1771 6,
1772 OpBuildNDRange,
1773 SPV_OPCODE_FLAGS_CAPABILITIES,
1774 CapabilityDeviceEnqueue,
1775 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1776 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
1777 {"ReadPipe",
1778 5,
1779 OpReadPipe,
1780 SPV_OPCODE_FLAGS_CAPABILITIES,
1781 CapabilityPipes,
1782 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1783 SPV_OPERAND_TYPE_ID}},
1784 {"WritePipe",
1785 5,
1786 OpWritePipe,
1787 SPV_OPCODE_FLAGS_CAPABILITIES,
1788 CapabilityPipes,
1789 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1790 SPV_OPERAND_TYPE_ID}},
1791 {"ReservedReadPipe",
1792 7,
1793 OpReservedReadPipe,
1794 SPV_OPCODE_FLAGS_CAPABILITIES,
1795 CapabilityPipes,
1796 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1797 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
1798 {"ReservedWritePipe",
1799 7,
1800 OpReservedWritePipe,
1801 SPV_OPCODE_FLAGS_CAPABILITIES,
1802 CapabilityPipes,
1803 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1804 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
1805 {"ReserveReadPipePackets",
1806 5,
1807 OpReserveReadPipePackets,
1808 SPV_OPCODE_FLAGS_CAPABILITIES,
1809 CapabilityPipes,
1810 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1811 SPV_OPERAND_TYPE_ID}},
1812 {"ReserveWritePipePackets",
1813 5,
1814 OpReserveWritePipePackets,
1815 SPV_OPCODE_FLAGS_CAPABILITIES,
1816 CapabilityPipes,
1817 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1818 SPV_OPERAND_TYPE_ID}},
1819 {"CommitReadPipe",
1820 3,
1821 OpCommitReadPipe,
1822 SPV_OPCODE_FLAGS_CAPABILITIES,
1823 CapabilityPipes,
1824 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
1825 {"CommitWritePipe",
1826 3,
1827 OpCommitWritePipe,
1828 SPV_OPCODE_FLAGS_CAPABILITIES,
1829 CapabilityPipes,
1830 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
1831 {"IsValidReserveId",
1832 4,
1833 OpIsValidReserveId,
1834 SPV_OPCODE_FLAGS_CAPABILITIES,
1835 CapabilityPipes,
1836 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1837 {"GetNumPipePackets",
1838 4,
1839 OpGetNumPipePackets,
1840 SPV_OPCODE_FLAGS_CAPABILITIES,
1841 CapabilityPipes,
1842 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1843 {"GetMaxPipePackets",
1844 4,
1845 OpGetMaxPipePackets,
1846 SPV_OPCODE_FLAGS_CAPABILITIES,
1847 CapabilityPipes,
1848 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1849 {"GroupReserveReadPipePackets",
1850 6,
1851 OpGroupReserveReadPipePackets,
1852 SPV_OPCODE_FLAGS_CAPABILITIES,
1853 CapabilityPipes,
1854 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1855 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID,
1856 SPV_OPERAND_TYPE_ID}},
1857 {"GroupReserveWritePipePackets",
1858 6,
1859 OpGroupReserveWritePipePackets,
1860 SPV_OPCODE_FLAGS_CAPABILITIES,
1861 CapabilityPipes,
1862 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1863 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID,
1864 SPV_OPERAND_TYPE_ID}},
1865 {"GroupCommitReadPipe",
1866 4,
1867 OpGroupCommitReadPipe,
1868 SPV_OPCODE_FLAGS_CAPABILITIES,
1869 CapabilityPipes,
1870 {SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID,
1871 SPV_OPERAND_TYPE_ID}},
1872 {"GroupCommitWritePipe",
1873 4,
1874 OpGroupCommitWritePipe,
1875 SPV_OPCODE_FLAGS_CAPABILITIES,
1876 CapabilityPipes,
1877 {SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID,
1878 SPV_OPERAND_TYPE_ID}}};
1879
1880spv_result_t spvOpcodeTableGet(spv_opcode_table *pInstTable) {
1881 spvCheck(!pInstTable, return SPV_ERROR_INVALID_POINTER);
1882
1883 static const spv_opcode_table_t table = {
1884 sizeof(opcodeTableEntries) / sizeof(spv_opcode_desc_t),
1885 opcodeTableEntries};
1886
1887 *pInstTable = &table;
1888
1889 return SPV_SUCCESS;
1890}
1891
1892spv_result_t spvOpcodeTableNameLookup(const spv_opcode_table table,
1893 const char *name,
1894 spv_opcode_desc *pEntry) {
1895 spvCheck(!name || !pEntry, return SPV_ERROR_INVALID_POINTER);
1896 spvCheck(!table, return SPV_ERROR_INVALID_TABLE);
1897
1898 // TODO: This lookup of the Opcode table is suboptimal! Binary sort would be
1899 // preferable but the table requires sorting on the Opcode name, but it's
1900 // static
1901 // const initialized and matches the order of the spec.
1902 const size_t nameLength = strlen(name);
1903 for (uint64_t opcodeIndex = 0; opcodeIndex < table->count; ++opcodeIndex) {
1904 if (nameLength == strlen(table->entries[opcodeIndex].name) &&
1905 !strncmp(name, table->entries[opcodeIndex].name, nameLength)) {
1906 // NOTE: Found out Opcode!
1907 *pEntry = &table->entries[opcodeIndex];
1908 return SPV_SUCCESS;
1909 }
1910 }
1911
1912 return SPV_ERROR_INVALID_LOOKUP;
1913}
1914
1915spv_result_t spvOpcodeTableValueLookup(const spv_opcode_table table,
1916 const Op opcode,
1917 spv_opcode_desc *pEntry) {
1918 spvCheck(!table, return SPV_ERROR_INVALID_TABLE);
1919 spvCheck(!pEntry, return SPV_ERROR_INVALID_POINTER);
1920
1921 // TODO: As above this lookup is not optimal.
1922 for (uint64_t opcodeIndex = 0; opcodeIndex < table->count; ++opcodeIndex) {
1923 if (opcode == table->entries[opcodeIndex].opcode) {
1924 // NOTE: Found the Opcode!
1925 *pEntry = &table->entries[opcodeIndex];
1926 return SPV_SUCCESS;
1927 }
1928 }
1929
1930 return SPV_ERROR_INVALID_LOOKUP;
1931}
1932
1933int32_t spvOpcodeIsVariable(spv_opcode_desc entry) {
1934 return SPV_OPCODE_FLAGS_VARIABLE ==
1935 (SPV_OPCODE_FLAGS_VARIABLE & entry->flags);
1936}
1937
1938int32_t spvOpcodeRequiresCapabilities(spv_opcode_desc entry) {
1939 return SPV_OPCODE_FLAGS_CAPABILITIES ==
1940 (SPV_OPCODE_FLAGS_CAPABILITIES & entry->flags);
1941}
1942
1943void spvInstructionCopy(const uint32_t *words, const Op opcode,
1944 const uint16_t wordCount, const spv_endianness_t endian,
1945 spv_instruction_t *pInst) {
1946 pInst->opcode = opcode;
1947 pInst->wordCount = wordCount;
1948 for (uint16_t wordIndex = 0; wordIndex < wordCount; ++wordIndex) {
1949 pInst->words[wordIndex] = spvFixWord(words[wordIndex], endian);
1950 if (!wordIndex) {
1951 uint16_t thisWordCount;
1952 Op thisOpcode;
1953 spvOpcodeSplit(pInst->words[wordIndex], &thisWordCount, &thisOpcode);
1954 assert(opcode == thisOpcode && wordCount == thisWordCount &&
1955 "Endianness failed!");
1956 }
1957 }
1958}
1959
1960const char *spvOpcodeString(const Op opcode) {
1961#define CASE(OPCODE) \
1962 case OPCODE: \
1963 return #OPCODE;
1964 switch (opcode) {
1965 CASE(OpNop)
1966 CASE(OpSource)
1967 CASE(OpSourceExtension)
1968 CASE(OpExtension)
1969 CASE(OpExtInstImport)
1970 CASE(OpMemoryModel)
1971 CASE(OpEntryPoint)
1972 CASE(OpExecutionMode)
1973 CASE(OpTypeVoid)
1974 CASE(OpTypeBool)
1975 CASE(OpTypeInt)
1976 CASE(OpTypeFloat)
1977 CASE(OpTypeVector)
1978 CASE(OpTypeMatrix)
1979 CASE(OpTypeSampler)
1980 CASE(OpTypeFilter)
1981 CASE(OpTypeArray)
1982 CASE(OpTypeRuntimeArray)
1983 CASE(OpTypeStruct)
1984 CASE(OpTypeOpaque)
1985 CASE(OpTypePointer)
1986 CASE(OpTypeFunction)
1987 CASE(OpTypeEvent)
1988 CASE(OpTypeDeviceEvent)
1989 CASE(OpTypeReserveId)
1990 CASE(OpTypeQueue)
1991 CASE(OpTypePipe)
1992 CASE(OpConstantTrue)
1993 CASE(OpConstantFalse)
1994 CASE(OpConstant)
1995 CASE(OpConstantComposite)
1996 CASE(OpConstantSampler)
1997 CASE(OpConstantNull)
1998 CASE(OpSpecConstantTrue)
1999 CASE(OpSpecConstantFalse)
2000 CASE(OpSpecConstant)
2001 CASE(OpSpecConstantComposite)
2002 CASE(OpVariable)
2003 CASE(OpVariableArray)
2004 CASE(OpFunction)
2005 CASE(OpFunctionParameter)
2006 CASE(OpFunctionEnd)
2007 CASE(OpFunctionCall)
2008 CASE(OpExtInst)
2009 CASE(OpUndef)
2010 CASE(OpLoad)
2011 CASE(OpStore)
2012 CASE(OpPhi)
2013 CASE(OpDecorationGroup)
2014 CASE(OpDecorate)
2015 CASE(OpMemberDecorate)
2016 CASE(OpGroupDecorate)
2017 CASE(OpGroupMemberDecorate)
2018 CASE(OpName)
2019 CASE(OpMemberName)
2020 CASE(OpString)
2021 CASE(OpLine)
2022 CASE(OpVectorExtractDynamic)
2023 CASE(OpVectorInsertDynamic)
2024 CASE(OpVectorShuffle)
2025 CASE(OpCompositeConstruct)
2026 CASE(OpCompositeExtract)
2027 CASE(OpCompositeInsert)
2028 CASE(OpCopyObject)
2029 CASE(OpCopyMemory)
2030 CASE(OpCopyMemorySized)
2031 CASE(OpSampler)
2032 CASE(OpTextureSample)
2033 CASE(OpTextureSampleDref)
2034 CASE(OpTextureSampleLod)
2035 CASE(OpTextureSampleProj)
2036 CASE(OpTextureSampleGrad)
2037 CASE(OpTextureSampleOffset)
2038 CASE(OpTextureSampleProjLod)
2039 CASE(OpTextureSampleProjGrad)
2040 CASE(OpTextureSampleLodOffset)
2041 CASE(OpTextureSampleProjOffset)
2042 CASE(OpTextureSampleGradOffset)
2043 CASE(OpTextureSampleProjLodOffset)
2044 CASE(OpTextureSampleProjGradOffset)
2045 CASE(OpTextureFetchTexelOffset)
2046 CASE(OpTextureFetchSample)
2047 CASE(OpTextureFetchTexel)
2048 CASE(OpTextureGather)
2049 CASE(OpTextureGatherOffset)
2050 CASE(OpTextureGatherOffsets)
2051 CASE(OpTextureQuerySizeLod)
2052 CASE(OpTextureQuerySize)
2053 CASE(OpTextureQueryLod)
2054 CASE(OpTextureQueryLevels)
2055 CASE(OpTextureQuerySamples)
2056 CASE(OpAccessChain)
2057 CASE(OpInBoundsAccessChain)
2058 CASE(OpSNegate)
2059 CASE(OpFNegate)
2060 CASE(OpNot)
2061 CASE(OpAny)
2062 CASE(OpAll)
2063 CASE(OpConvertFToU)
2064 CASE(OpConvertFToS)
2065 CASE(OpConvertSToF)
2066 CASE(OpConvertUToF)
2067 CASE(OpUConvert)
2068 CASE(OpSConvert)
2069 CASE(OpFConvert)
2070 CASE(OpConvertPtrToU)
2071 CASE(OpConvertUToPtr)
2072 CASE(OpPtrCastToGeneric)
2073 CASE(OpGenericCastToPtr)
2074 CASE(OpBitcast)
2075 CASE(OpTranspose)
2076 CASE(OpIsNan)
2077 CASE(OpIsInf)
2078 CASE(OpIsFinite)
2079 CASE(OpIsNormal)
2080 CASE(OpSignBitSet)
2081 CASE(OpLessOrGreater)
2082 CASE(OpOrdered)
2083 CASE(OpUnordered)
2084 CASE(OpArrayLength)
2085 CASE(OpIAdd)
2086 CASE(OpFAdd)
2087 CASE(OpISub)
2088 CASE(OpFSub)
2089 CASE(OpIMul)
2090 CASE(OpFMul)
2091 CASE(OpUDiv)
2092 CASE(OpSDiv)
2093 CASE(OpFDiv)
2094 CASE(OpUMod)
2095 CASE(OpSRem)
2096 CASE(OpSMod)
2097 CASE(OpFRem)
2098 CASE(OpFMod)
2099 CASE(OpVectorTimesScalar)
2100 CASE(OpMatrixTimesScalar)
2101 CASE(OpVectorTimesMatrix)
2102 CASE(OpMatrixTimesVector)
2103 CASE(OpMatrixTimesMatrix)
2104 CASE(OpOuterProduct)
2105 CASE(OpDot)
2106 CASE(OpShiftRightLogical)
2107 CASE(OpShiftRightArithmetic)
2108 CASE(OpShiftLeftLogical)
2109 CASE(OpLogicalOr)
2110 CASE(OpLogicalXor)
2111 CASE(OpLogicalAnd)
2112 CASE(OpBitwiseOr)
2113 CASE(OpBitwiseXor)
2114 CASE(OpBitwiseAnd)
2115 CASE(OpSelect)
2116 CASE(OpIEqual)
2117 CASE(OpFOrdEqual)
2118 CASE(OpFUnordEqual)
2119 CASE(OpINotEqual)
2120 CASE(OpFOrdNotEqual)
2121 CASE(OpFUnordNotEqual)
2122 CASE(OpULessThan)
2123 CASE(OpSLessThan)
2124 CASE(OpFOrdLessThan)
2125 CASE(OpFUnordLessThan)
2126 CASE(OpUGreaterThan)
2127 CASE(OpSGreaterThan)
2128 CASE(OpFOrdGreaterThan)
2129 CASE(OpFUnordGreaterThan)
2130 CASE(OpULessThanEqual)
2131 CASE(OpSLessThanEqual)
2132 CASE(OpFOrdLessThanEqual)
2133 CASE(OpFUnordLessThanEqual)
2134 CASE(OpUGreaterThanEqual)
2135 CASE(OpSGreaterThanEqual)
2136 CASE(OpFOrdGreaterThanEqual)
2137 CASE(OpFUnordGreaterThanEqual)
2138 CASE(OpDPdx)
2139 CASE(OpDPdy)
2140 CASE(OpFwidth)
2141 CASE(OpDPdxFine)
2142 CASE(OpDPdyFine)
2143 CASE(OpFwidthFine)
2144 CASE(OpDPdxCoarse)
2145 CASE(OpDPdyCoarse)
2146 CASE(OpFwidthCoarse)
2147 CASE(OpEmitVertex)
2148 CASE(OpEndPrimitive)
2149 CASE(OpEmitStreamVertex)
2150 CASE(OpEndStreamPrimitive)
2151 CASE(OpControlBarrier)
2152 CASE(OpMemoryBarrier)
2153 CASE(OpImagePointer)
2154 CASE(OpAtomicInit)
2155 CASE(OpAtomicLoad)
2156 CASE(OpAtomicStore)
2157 CASE(OpAtomicExchange)
2158 CASE(OpAtomicCompareExchange)
2159 CASE(OpAtomicCompareExchangeWeak)
2160 CASE(OpAtomicIIncrement)
2161 CASE(OpAtomicIDecrement)
2162 CASE(OpAtomicIAdd)
2163 CASE(OpAtomicISub)
2164 CASE(OpAtomicUMin)
2165 CASE(OpAtomicUMax)
2166 CASE(OpAtomicAnd)
2167 CASE(OpAtomicOr)
2168 CASE(OpAtomicXor)
2169 CASE(OpLoopMerge)
2170 CASE(OpSelectionMerge)
2171 CASE(OpLabel)
2172 CASE(OpBranch)
2173 CASE(OpBranchConditional)
2174 CASE(OpSwitch)
2175 CASE(OpKill)
2176 CASE(OpReturn)
2177 CASE(OpReturnValue)
2178 CASE(OpUnreachable)
2179 CASE(OpLifetimeStart)
2180 CASE(OpLifetimeStop)
2181 CASE(OpCompileFlag)
2182 CASE(OpAsyncGroupCopy)
2183 CASE(OpWaitGroupEvents)
2184 CASE(OpGroupAll)
2185 CASE(OpGroupAny)
2186 CASE(OpGroupBroadcast)
2187 CASE(OpGroupIAdd)
2188 CASE(OpGroupFAdd)
2189 CASE(OpGroupFMin)
2190 CASE(OpGroupUMin)
2191 CASE(OpGroupSMin)
2192 CASE(OpGroupFMax)
2193 CASE(OpGroupUMax)
2194 CASE(OpGroupSMax)
2195 CASE(OpGenericCastToPtrExplicit)
2196 CASE(OpGenericPtrMemSemantics)
2197 CASE(OpReadPipe)
2198 CASE(OpWritePipe)
2199 CASE(OpReservedReadPipe)
2200 CASE(OpReservedWritePipe)
2201 CASE(OpReserveReadPipePackets)
2202 CASE(OpReserveWritePipePackets)
2203 CASE(OpCommitReadPipe)
2204 CASE(OpCommitWritePipe)
2205 CASE(OpIsValidReserveId)
2206 CASE(OpGetNumPipePackets)
2207 CASE(OpGetMaxPipePackets)
2208 CASE(OpGroupReserveReadPipePackets)
2209 CASE(OpGroupReserveWritePipePackets)
2210 CASE(OpGroupCommitReadPipe)
2211 CASE(OpGroupCommitWritePipe)
2212 CASE(OpEnqueueMarker)
2213 CASE(OpEnqueueKernel)
2214 CASE(OpGetKernelNDrangeSubGroupCount)
2215 CASE(OpGetKernelNDrangeMaxSubGroupSize)
2216 CASE(OpGetKernelWorkGroupSize)
2217 CASE(OpGetKernelPreferredWorkGroupSizeMultiple)
2218 CASE(OpRetainEvent)
2219 CASE(OpReleaseEvent)
2220 CASE(OpCreateUserEvent)
2221 CASE(OpIsValidEvent)
2222 CASE(OpSetUserEventStatus)
2223 CASE(OpCaptureEventProfilingInfo)
2224 CASE(OpGetDefaultQueue)
2225 CASE(OpBuildNDRange)
2226 default:
2227 assert(0 && "Unreachable!");
2228 }
2229#undef CASE
2230 return "unknown";
2231}
2232
2233int32_t spvOpcodeIsType(const Op opcode) {
2234 switch (opcode) {
2235 case OpTypeVoid:
2236 case OpTypeBool:
2237 case OpTypeInt:
2238 case OpTypeFloat:
2239 case OpTypeVector:
2240 case OpTypeMatrix:
2241 case OpTypeSampler:
2242 case OpTypeFilter:
2243 case OpTypeArray:
2244 case OpTypeRuntimeArray:
2245 case OpTypeStruct:
2246 case OpTypeOpaque:
2247 case OpTypePointer:
2248 case OpTypeFunction:
2249 case OpTypeEvent:
2250 case OpTypeDeviceEvent:
2251 case OpTypeReserveId:
2252 case OpTypeQueue:
2253 case OpTypePipe:
2254 return true;
2255 default:
2256 return false;
2257 }
2258}
2259
2260int32_t spvOpcodeIsScalarType(const Op opcode) {
2261 switch (opcode) {
2262 case OpTypeInt:
2263 case OpTypeFloat:
2264 return true;
2265 default:
2266 return false;
2267 }
2268}
2269
2270int32_t spvOpcodeIsConstant(const Op opcode) {
2271 switch (opcode) {
2272 case OpConstantTrue:
2273 case OpConstantFalse:
2274 case OpConstant:
2275 case OpConstantComposite:
2276 case OpConstantSampler:
2277 // case OpConstantNull:
2278 case OpConstantNull:
2279 case OpSpecConstantTrue:
2280 case OpSpecConstantFalse:
2281 case OpSpecConstant:
2282 case OpSpecConstantComposite:
2283 // case OpSpecConstantOp:
2284 return true;
2285 default:
2286 return false;
2287 }
2288}
2289
2290int32_t spvOpcodeIsComposite(const Op opcode) {
2291 switch (opcode) {
2292 case OpTypeVector:
2293 case OpTypeMatrix:
2294 case OpTypeArray:
2295 case OpTypeStruct:
2296 return true;
2297 default:
2298 return false;
2299 }
2300}
2301
2302int32_t spvOpcodeAreTypesEqual(const spv_instruction_t *pTypeInst0,
2303 const spv_instruction_t *pTypeInst1) {
2304 spvCheck(pTypeInst0->opcode != pTypeInst1->opcode, return false);
2305 spvCheck(pTypeInst0->words[1] != pTypeInst1->words[1], return false);
2306 return true;
2307}
2308
2309int32_t spvOpcodeIsPointer(const Op opcode) {
2310 switch (opcode) {
2311 case OpVariable:
2312 case OpVariableArray:
2313 case OpAccessChain:
2314 case OpInBoundsAccessChain:
2315 // TODO: case OpImagePointer:
2316 case OpFunctionParameter:
2317 return true;
2318 default:
2319 return false;
2320 }
2321}
2322
2323int32_t spvOpcodeIsObject(const Op opcode) {
2324 switch (opcode) {
2325 case OpConstantTrue:
2326 case OpConstantFalse:
2327 case OpConstant:
2328 case OpConstantComposite:
2329 // TODO: case OpConstantSampler:
2330 case OpConstantNull:
2331 case OpSpecConstantTrue:
2332 case OpSpecConstantFalse:
2333 case OpSpecConstant:
2334 case OpSpecConstantComposite:
2335 // TODO: case OpSpecConstantOp:
2336 case OpVariable:
2337 case OpVariableArray:
2338 case OpAccessChain:
2339 case OpInBoundsAccessChain:
2340 case OpConvertFToU:
2341 case OpConvertFToS:
2342 case OpConvertSToF:
2343 case OpConvertUToF:
2344 case OpUConvert:
2345 case OpSConvert:
2346 case OpFConvert:
2347 case OpConvertPtrToU:
2348 // TODO: case OpConvertUToPtr:
2349 case OpPtrCastToGeneric:
2350 // TODO: case OpGenericCastToPtr:
2351 case OpBitcast:
2352 // TODO: case OpGenericCastToPtrExplicit:
2353 case OpSatConvertSToU:
2354 case OpSatConvertUToS:
2355 case OpVectorExtractDynamic:
2356 case OpCompositeConstruct:
2357 case OpCompositeExtract:
2358 case OpCopyObject:
2359 case OpTranspose:
2360 case OpSNegate:
2361 case OpFNegate:
2362 case OpNot:
2363 case OpIAdd:
2364 case OpFAdd:
2365 case OpISub:
2366 case OpFSub:
2367 case OpIMul:
2368 case OpFMul:
2369 case OpUDiv:
2370 case OpSDiv:
2371 case OpFDiv:
2372 case OpUMod:
2373 case OpSRem:
2374 case OpSMod:
2375 case OpVectorTimesScalar:
2376 case OpMatrixTimesScalar:
2377 case OpVectorTimesMatrix:
2378 case OpMatrixTimesVector:
2379 case OpMatrixTimesMatrix:
2380 case OpOuterProduct:
2381 case OpDot:
2382 case OpShiftRightLogical:
2383 case OpShiftRightArithmetic:
2384 case OpShiftLeftLogical:
2385 case OpBitwiseOr:
2386 case OpBitwiseXor:
2387 case OpBitwiseAnd:
2388 case OpAny:
2389 case OpAll:
2390 case OpIsNan:
2391 case OpIsInf:
2392 case OpIsFinite:
2393 case OpIsNormal:
2394 case OpSignBitSet:
2395 case OpLessOrGreater:
2396 case OpOrdered:
2397 case OpUnordered:
2398 case OpLogicalOr:
2399 case OpLogicalXor:
2400 case OpLogicalAnd:
2401 case OpSelect:
2402 case OpIEqual:
2403 case OpFOrdEqual:
2404 case OpFUnordEqual:
2405 case OpINotEqual:
2406 case OpFOrdNotEqual:
2407 case OpFUnordNotEqual:
2408 case OpULessThan:
2409 case OpSLessThan:
2410 case OpFOrdLessThan:
2411 case OpFUnordLessThan:
2412 case OpUGreaterThan:
2413 case OpSGreaterThan:
2414 case OpFOrdGreaterThan:
2415 case OpFUnordGreaterThan:
2416 case OpULessThanEqual:
2417 case OpSLessThanEqual:
2418 case OpFOrdLessThanEqual:
2419 case OpFUnordLessThanEqual:
2420 case OpUGreaterThanEqual:
2421 case OpSGreaterThanEqual:
2422 case OpFOrdGreaterThanEqual:
2423 case OpFUnordGreaterThanEqual:
2424 case OpDPdx:
2425 case OpDPdy:
2426 case OpFwidth:
2427 case OpDPdxFine:
2428 case OpDPdyFine:
2429 case OpFwidthFine:
2430 case OpDPdxCoarse:
2431 case OpDPdyCoarse:
2432 case OpFwidthCoarse:
2433 case OpReturnValue:
2434 return true;
2435 default:
2436 return false;
2437 }
2438}
2439
2440int32_t spvOpcodeIsBasicTypeNullable(Op opcode) {
2441 switch (opcode) {
2442 case OpTypeBool:
2443 case OpTypeInt:
2444 case OpTypeFloat:
2445 case OpTypePointer:
2446 case OpTypeEvent:
2447 case OpTypeDeviceEvent:
2448 case OpTypeReserveId:
2449 case OpTypeQueue:
2450 return true;
2451 default:
2452 return false;
2453 }
2454}
2455
2456int32_t spvInstructionIsInBasicBlock(const spv_instruction_t *pFirstInst,
2457 const spv_instruction_t *pInst) {
2458 while (pFirstInst != pInst) {
2459 spvCheck(OpFunction == pInst->opcode, break);
2460 pInst--;
2461 }
2462 spvCheck(OpFunction != pInst->opcode, return false);
2463 return true;
2464}
2465
2466int32_t spvOpcodeIsValue(Op opcode) {
2467 spvCheck(spvOpcodeIsPointer(opcode), return true);
2468 spvCheck(spvOpcodeIsConstant(opcode), return true);
2469 switch (opcode) {
2470 case OpLoad:
2471 // TODO: Other Opcode's resulting in a value
2472 return true;
2473 default:
2474 return false;
2475 }
2476}