blob: de0c817f6f517c4530c6b92550b43faf38e80208 [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}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100189 {"Capability",
190 2,
191 OpCapability,
192 SPV_OPCODE_FLAGS_NONE,
193 0,
194 {SPV_OPERAND_TYPE_CAPABILITY}},
195 {"TypeVoid",
196 2,
197 OpTypeVoid,
198 SPV_OPCODE_FLAGS_NONE,
199 0,
200 {SPV_OPERAND_TYPE_RESULT_ID}},
201 {"TypeBool",
202 2,
203 OpTypeBool,
204 SPV_OPCODE_FLAGS_NONE,
205 0,
206 {SPV_OPERAND_TYPE_RESULT_ID}},
207 {"TypeInt",
208 4,
209 OpTypeInt,
210 SPV_OPCODE_FLAGS_NONE,
211 0,
212 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL_NUMBER,
213 SPV_OPERAND_TYPE_LITERAL_NUMBER}},
214 {"TypeFloat",
215 3,
216 OpTypeFloat,
217 SPV_OPCODE_FLAGS_NONE,
218 0,
219 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL_NUMBER}},
220 {"TypeVector",
221 4,
222 OpTypeVector,
223 SPV_OPCODE_FLAGS_NONE,
224 0,
225 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
226 SPV_OPERAND_TYPE_LITERAL_NUMBER}},
227 {"TypeMatrix",
228 4,
229 OpTypeMatrix,
230 SPV_OPCODE_FLAGS_CAPABILITIES,
231 CapabilityMatrix,
232 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
233 SPV_OPERAND_TYPE_LITERAL_NUMBER}},
234 {"TypeSampler",
235 8,
236 OpTypeSampler,
237 SPV_OPCODE_FLAGS_VARIABLE,
238 0,
239 {
240 SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
241 SPV_OPERAND_TYPE_DIMENSIONALITY, SPV_OPERAND_TYPE_LITERAL_NUMBER,
242 SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_LITERAL_NUMBER,
243 SPV_OPERAND_TYPE_LITERAL_NUMBER,
244 SPV_OPERAND_TYPE_ID // TODO: See Khronos bug 13755
245 }},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100246 {"TypeArray",
247 4,
248 OpTypeArray,
249 SPV_OPCODE_FLAGS_NONE,
250 0,
251 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
252 {"TypeRuntimeArray",
253 3,
254 OpTypeRuntimeArray,
255 SPV_OPCODE_FLAGS_CAPABILITIES,
256 CapabilityShader,
257 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
258 {"TypeStruct",
259 2,
260 OpTypeStruct,
261 SPV_OPCODE_FLAGS_VARIABLE,
262 0,
263 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
264 SPV_OPERAND_TYPE_ELLIPSIS}},
265 {"TypeOpaque",
266 2,
267 OpTypeOpaque,
268 SPV_OPCODE_FLAGS_VARIABLE | SPV_OPCODE_FLAGS_CAPABILITIES,
269 CapabilityKernel,
270 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL_STRING}},
271 {"TypePointer",
272 4,
273 OpTypePointer,
274 SPV_OPCODE_FLAGS_NONE,
275 0,
276 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_STORAGE_CLASS,
277 SPV_OPERAND_TYPE_ID}},
278 {"TypeFunction",
279 3,
280 OpTypeFunction,
281 SPV_OPCODE_FLAGS_VARIABLE,
282 0,
283 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
284 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}},
285 {"TypeEvent",
286 2,
287 OpTypeEvent,
288 SPV_OPCODE_FLAGS_CAPABILITIES,
289 CapabilityKernel,
290 {SPV_OPERAND_TYPE_RESULT_ID}},
291 {"TypeDeviceEvent",
292 2,
293 OpTypeDeviceEvent,
294 SPV_OPCODE_FLAGS_CAPABILITIES,
295 CapabilityKernel,
296 {SPV_OPERAND_TYPE_RESULT_ID}},
297 {"TypeReserveId",
298 2,
299 OpTypeReserveId,
300 SPV_OPCODE_FLAGS_CAPABILITIES,
301 CapabilityKernel,
302 {SPV_OPERAND_TYPE_RESULT_ID}},
303 {"TypeQueue",
304 2,
305 OpTypeQueue,
306 SPV_OPCODE_FLAGS_CAPABILITIES,
307 CapabilityKernel,
308 {SPV_OPERAND_TYPE_RESULT_ID}},
309 {"TypePipe",
310 4,
311 OpTypePipe,
312 SPV_OPCODE_FLAGS_CAPABILITIES,
313 CapabilityPipes,
314 {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
315 SPV_OPERAND_TYPE_ACCESS_QUALIFIER}},
316 {"ConstantTrue",
317 3,
318 OpConstantTrue,
319 SPV_OPCODE_FLAGS_NONE,
320 0,
321 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}},
322 {"ConstantFalse",
323 3,
324 OpConstantFalse,
325 SPV_OPCODE_FLAGS_NONE,
326 0,
327 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}},
328 {"Constant",
329 3,
330 OpConstant,
331 SPV_OPCODE_FLAGS_VARIABLE,
332 0,
333 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL,
334 SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_ELLIPSIS}},
335 {"ConstantComposite",
336 3,
337 OpConstantComposite,
338 SPV_OPCODE_FLAGS_VARIABLE,
339 0,
340 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
341 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}},
342 {"ConstantSampler",
343 6,
344 OpConstantSampler,
345 SPV_OPCODE_FLAGS_CAPABILITIES,
346 CapabilityKernel,
347 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
348 SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE, SPV_OPERAND_TYPE_LITERAL_NUMBER,
349 SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE}},
350 {"ConstantNull",
351 3,
352 OpConstantNull,
353 SPV_OPCODE_FLAGS_NONE,
354 0,
355 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}},
356 {"SpecConstantTrue",
357 3,
358 OpSpecConstantTrue,
359 SPV_OPCODE_FLAGS_CAPABILITIES,
360 CapabilityShader,
361 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}},
362 {"SpecConstantFalse",
363 3,
364 OpSpecConstantFalse,
365 SPV_OPCODE_FLAGS_CAPABILITIES,
366 CapabilityKernel,
367 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}},
368 {"SpecConstant",
369 3,
370 OpSpecConstant,
371 SPV_OPCODE_FLAGS_VARIABLE | SPV_OPCODE_FLAGS_CAPABILITIES,
372 CapabilityShader,
373 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL,
374 SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_ELLIPSIS}},
375 {"SpecConstantComposite",
376 3,
377 OpSpecConstantComposite,
378 SPV_OPCODE_FLAGS_VARIABLE | SPV_OPCODE_FLAGS_CAPABILITIES,
379 CapabilityShader,
380 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
381 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}},
382 {
383 "SpecConstantOp",
384 4,
385 OpSpecConstantOp,
386 SPV_OPCODE_FLAGS_VARIABLE,
387 0,
388 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
389 SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
390 SPV_OPERAND_TYPE_ELLIPSIS},
391
392 },
393 {"Variable",
394 4,
395 OpVariable,
396 SPV_OPCODE_FLAGS_VARIABLE,
397 0,
398 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
399 SPV_OPERAND_TYPE_STORAGE_CLASS, SPV_OPERAND_TYPE_ID}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100400 {"Load",
401 4,
402 OpLoad,
403 SPV_OPCODE_FLAGS_VARIABLE,
404 0,
405 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
406 SPV_OPERAND_TYPE_MEMORY_ACCESS, SPV_OPERAND_TYPE_MEMORY_ACCESS,
407 SPV_OPERAND_TYPE_ELLIPSIS}},
408 {"Store",
409 3,
410 OpStore,
411 SPV_OPCODE_FLAGS_VARIABLE,
412 0,
413 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_MEMORY_ACCESS,
414 SPV_OPERAND_TYPE_MEMORY_ACCESS, SPV_OPERAND_TYPE_ELLIPSIS}},
415 {"CopyMemory",
416 3,
417 OpCopyMemory,
418 SPV_OPCODE_FLAGS_VARIABLE,
419 0,
420 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_MEMORY_ACCESS,
421 SPV_OPERAND_TYPE_MEMORY_ACCESS, SPV_OPERAND_TYPE_ELLIPSIS}},
422 {"CopyMemorySized",
423 4,
424 OpCopyMemorySized,
425 SPV_OPCODE_FLAGS_VARIABLE | SPV_OPCODE_FLAGS_CAPABILITIES,
426 CapabilityAddresses,
427 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
428 SPV_OPERAND_TYPE_MEMORY_ACCESS, SPV_OPERAND_TYPE_MEMORY_ACCESS,
429 SPV_OPERAND_TYPE_ELLIPSIS}},
430 {"AccessChain",
431 4,
432 OpAccessChain,
433 SPV_OPCODE_FLAGS_VARIABLE,
434 0,
435 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
436 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}},
437 {"InBoundsAccessChain",
438 4,
439 OpInBoundsAccessChain,
440 SPV_OPCODE_FLAGS_VARIABLE,
441 0,
442 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
443 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}},
444 {"ArrayLength",
445 5,
446 OpArrayLength,
447 SPV_OPCODE_FLAGS_CAPABILITIES,
448 CapabilityShader,
449 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
450 SPV_OPERAND_TYPE_LITERAL_NUMBER}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100451 {"GenericPtrMemSemantics",
452 4,
453 OpGenericPtrMemSemantics,
454 SPV_OPCODE_FLAGS_CAPABILITIES,
455 CapabilityKernel,
456 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
457 {"Function",
458 5,
459 OpFunction,
460 SPV_OPCODE_FLAGS_NONE,
461 0,
462 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
463 SPV_OPERAND_TYPE_FUNCTION_CONTROL, SPV_OPERAND_TYPE_ID}},
464 {"FunctionParameter",
465 3,
466 OpFunctionParameter,
467 SPV_OPCODE_FLAGS_NONE,
468 0,
469 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}},
470 {"FunctionEnd", 1, OpFunctionEnd, SPV_OPCODE_FLAGS_NONE, 0, {}},
471 {"FunctionCall",
472 4,
473 OpFunctionCall,
474 SPV_OPCODE_FLAGS_VARIABLE,
475 0,
476 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
477 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100478 {"ConvertFToU",
479 4,
480 OpConvertFToU,
481 SPV_OPCODE_FLAGS_NONE,
482 0,
483 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
484 {"ConvertFToS",
485 4,
486 OpConvertFToS,
487 SPV_OPCODE_FLAGS_NONE,
488 0,
489 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
490 {"ConvertSToF",
491 4,
492 OpConvertSToF,
493 SPV_OPCODE_FLAGS_NONE,
494 0,
495 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
496 {"ConvertUToF",
497 4,
498 OpConvertUToF,
499 SPV_OPCODE_FLAGS_NONE,
500 0,
501 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
502 {"UConvert",
503 4,
504 OpUConvert,
505 SPV_OPCODE_FLAGS_NONE,
506 0,
507 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
508 {"SConvert",
509 4,
510 OpSConvert,
511 SPV_OPCODE_FLAGS_NONE,
512 0,
513 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
514 {"FConvert",
515 4,
516 OpFConvert,
517 SPV_OPCODE_FLAGS_NONE,
518 0,
519 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
520 {"ConvertPtrToU",
521 4,
522 OpConvertPtrToU,
523 SPV_OPCODE_FLAGS_CAPABILITIES,
524 CapabilityAddresses,
525 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
526 {"ConvertUToPtr",
527 4,
528 OpConvertUToPtr,
529 SPV_OPCODE_FLAGS_CAPABILITIES,
530 CapabilityAddresses,
531 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
532 {"PtrCastToGeneric",
533 4,
534 OpPtrCastToGeneric,
535 SPV_OPCODE_FLAGS_CAPABILITIES,
536 CapabilityKernel,
537 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
538 {"GenericCastToPtr",
539 4,
540 OpGenericCastToPtr,
541 SPV_OPCODE_FLAGS_CAPABILITIES,
542 CapabilityKernel,
543 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
544 {"Bitcast",
545 4,
546 OpBitcast,
547 SPV_OPCODE_FLAGS_NONE,
548 0,
549 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
550 {"GenericCastToPtrExplicit",
551 5,
552 OpGenericCastToPtrExplicit,
553 SPV_OPCODE_FLAGS_CAPABILITIES,
554 CapabilityKernel,
555 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
556 SPV_OPERAND_TYPE_STORAGE_CLASS}},
557 {"SatConvertSToU",
558 4,
559 OpSatConvertSToU,
560 SPV_OPCODE_FLAGS_CAPABILITIES,
561 CapabilityKernel,
562 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
563 {"SatConvertUToS",
564 4,
565 OpSatConvertUToS,
566 SPV_OPCODE_FLAGS_CAPABILITIES,
567 CapabilityKernel,
568 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
569 {"VectorExtractDynamic",
570 5,
571 OpVectorExtractDynamic,
572 SPV_OPCODE_FLAGS_NONE,
573 0,
574 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
575 SPV_OPERAND_TYPE_ID}},
576 {"VectorInsertDynamic",
577 6,
578 OpVectorInsertDynamic,
579 SPV_OPCODE_FLAGS_NONE,
580 0,
581 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
582 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
583 {"VectorShuffle",
584 5,
585 OpVectorShuffle,
586 SPV_OPCODE_FLAGS_VARIABLE,
587 0,
588 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
589 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_LITERAL,
590 SPV_OPERAND_TYPE_ELLIPSIS}},
591 {"CompositeConstruct",
592 3,
593 OpCompositeConstruct,
594 SPV_OPCODE_FLAGS_VARIABLE,
595 0,
596 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
597 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}},
598 {"CompositeExtract",
599 4,
600 OpCompositeExtract,
601 SPV_OPCODE_FLAGS_VARIABLE,
602 0,
603 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
604 SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_LITERAL,
605 SPV_OPERAND_TYPE_ELLIPSIS}},
606 {"CompositeInsert",
607 5,
608 OpCompositeInsert,
609 SPV_OPCODE_FLAGS_VARIABLE,
610 0,
611 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
612 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_LITERAL,
613 SPV_OPERAND_TYPE_ELLIPSIS}},
614 {"CopyObject",
615 4,
616 OpCopyObject,
617 SPV_OPCODE_FLAGS_NONE,
618 0,
619 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
620 {"Transpose",
621 4,
622 OpTranspose,
623 SPV_OPCODE_FLAGS_CAPABILITIES,
624 CapabilityMatrix,
625 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
626 {"SNegate",
627 4,
628 OpSNegate,
629 SPV_OPCODE_FLAGS_NONE,
630 0,
631 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
632 {"FNegate",
633 4,
634 OpFNegate,
635 SPV_OPCODE_FLAGS_NONE,
636 0,
637 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
638 {"Not",
639 4,
640 OpNot,
641 SPV_OPCODE_FLAGS_NONE,
642 0,
643 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
644 {"IAdd",
645 5,
646 OpIAdd,
647 SPV_OPCODE_FLAGS_NONE,
648 0,
649 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
650 SPV_OPERAND_TYPE_ID}},
651 {"FAdd",
652 5,
653 OpFAdd,
654 SPV_OPCODE_FLAGS_NONE,
655 0,
656 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
657 SPV_OPERAND_TYPE_ID}},
658 {"ISub",
659 5,
660 OpISub,
661 SPV_OPCODE_FLAGS_NONE,
662 0,
663 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
664 SPV_OPERAND_TYPE_ID}},
665 {"FSub",
666 5,
667 OpFSub,
668 SPV_OPCODE_FLAGS_NONE,
669 0,
670 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
671 SPV_OPERAND_TYPE_ID}},
672 {"IMul",
673 5,
674 OpIMul,
675 SPV_OPCODE_FLAGS_NONE,
676 0,
677 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
678 SPV_OPERAND_TYPE_ID}},
679 {"FMul",
680 5,
681 OpFMul,
682 SPV_OPCODE_FLAGS_NONE,
683 0,
684 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
685 SPV_OPERAND_TYPE_ID}},
686 {"UDiv",
687 5,
688 OpUDiv,
689 SPV_OPCODE_FLAGS_NONE,
690 0,
691 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
692 SPV_OPERAND_TYPE_ID}},
693 {"SDiv",
694 5,
695 OpSDiv,
696 SPV_OPCODE_FLAGS_NONE,
697 0,
698 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
699 SPV_OPERAND_TYPE_ID}},
700 {"FDiv",
701 5,
702 OpFDiv,
703 SPV_OPCODE_FLAGS_NONE,
704 0,
705 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
706 SPV_OPERAND_TYPE_ID}},
707 {"UMod",
708 5,
709 OpUMod,
710 SPV_OPCODE_FLAGS_NONE,
711 0,
712 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
713 SPV_OPERAND_TYPE_ID}},
714 {"SRem",
715 5,
716 OpSRem,
717 SPV_OPCODE_FLAGS_NONE,
718 0,
719 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
720 SPV_OPERAND_TYPE_ID}},
721 {"SMod",
722 5,
723 OpSMod,
724 SPV_OPCODE_FLAGS_NONE,
725 0,
726 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
727 SPV_OPERAND_TYPE_ID}},
728 {"FRem",
729 5,
730 OpFRem,
731 SPV_OPCODE_FLAGS_NONE,
732 0,
733 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
734 SPV_OPERAND_TYPE_ID}},
735 {"FMod",
736 5,
737 OpFMod,
738 SPV_OPCODE_FLAGS_NONE,
739 0,
740 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
741 SPV_OPERAND_TYPE_ID}},
742 {"VectorTimesScalar",
743 5,
744 OpVectorTimesScalar,
745 SPV_OPCODE_FLAGS_NONE,
746 0,
747 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
748 SPV_OPERAND_TYPE_ID}},
749 {"MatrixTimesScalar",
750 5,
751 OpMatrixTimesScalar,
752 SPV_OPCODE_FLAGS_CAPABILITIES,
753 CapabilityMatrix,
754 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
755 SPV_OPERAND_TYPE_ID}},
756 {"VectorTimesMatrix",
757 5,
758 OpVectorTimesMatrix,
759 SPV_OPCODE_FLAGS_CAPABILITIES,
760 CapabilityMatrix,
761 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
762 SPV_OPERAND_TYPE_ID}},
763 {"MatrixTimesVector",
764 5,
765 OpMatrixTimesVector,
766 SPV_OPCODE_FLAGS_CAPABILITIES,
767 CapabilityMatrix,
768 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
769 SPV_OPERAND_TYPE_ID}},
770 {"MatrixTimesMatrix",
771 5,
772 OpMatrixTimesMatrix,
773 SPV_OPCODE_FLAGS_CAPABILITIES,
774 CapabilityMatrix,
775 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
776 SPV_OPERAND_TYPE_ID}},
777 {"OuterProduct",
778 5,
779 OpOuterProduct,
780 SPV_OPCODE_FLAGS_CAPABILITIES,
781 CapabilityMatrix,
782 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
783 SPV_OPERAND_TYPE_ID}},
784 {"Dot",
785 5,
786 OpDot,
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}},
791 {"ShiftRightLogical",
792 5,
793 OpShiftRightLogical,
794 SPV_OPCODE_FLAGS_NONE,
795 0,
796 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
797 SPV_OPERAND_TYPE_ID}},
798 {"ShiftRightArithmetic",
799 5,
800 OpShiftRightArithmetic,
801 SPV_OPCODE_FLAGS_NONE,
802 0,
803 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
804 SPV_OPERAND_TYPE_ID}},
805 {"ShiftLeftLogical",
806 5,
807 OpShiftLeftLogical,
808 SPV_OPCODE_FLAGS_NONE,
809 0,
810 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
811 SPV_OPERAND_TYPE_ID}},
812 {"BitwiseOr",
813 5,
814 OpBitwiseOr,
815 SPV_OPCODE_FLAGS_NONE,
816 0,
817 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
818 SPV_OPERAND_TYPE_ID}},
819 {"BitwiseXor",
820 5,
821 OpBitwiseXor,
822 SPV_OPCODE_FLAGS_NONE,
823 0,
824 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
825 SPV_OPERAND_TYPE_ID}},
826 {"BitwiseAnd",
827 5,
828 OpBitwiseAnd,
829 SPV_OPCODE_FLAGS_NONE,
830 0,
831 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
832 SPV_OPERAND_TYPE_ID}},
833 {"Any",
834 4,
835 OpAny,
836 SPV_OPCODE_FLAGS_NONE,
837 0,
838 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
839 {"All",
840 4,
841 OpAll,
842 SPV_OPCODE_FLAGS_NONE,
843 0,
844 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
845 {"IsNan",
846 4,
847 OpIsNan,
848 SPV_OPCODE_FLAGS_NONE,
849 0,
850 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
851 {"IsInf",
852 4,
853 OpIsInf,
854 SPV_OPCODE_FLAGS_NONE,
855 0,
856 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
857 {"IsFinite",
858 4,
859 OpIsFinite,
860 SPV_OPCODE_FLAGS_CAPABILITIES,
861 CapabilityKernel,
862 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
863 {"IsNormal",
864 4,
865 OpIsNormal,
866 SPV_OPCODE_FLAGS_CAPABILITIES,
867 CapabilityKernel,
868 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
869 {"SignBitSet",
870 4,
871 OpSignBitSet,
872 SPV_OPCODE_FLAGS_CAPABILITIES,
873 CapabilityKernel,
874 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
875 {"LessOrGreater",
876 5,
877 OpLessOrGreater,
878 SPV_OPCODE_FLAGS_CAPABILITIES,
879 CapabilityKernel,
880 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
881 SPV_OPERAND_TYPE_ID}},
882 {"Ordered",
883 5,
884 OpOrdered,
885 SPV_OPCODE_FLAGS_CAPABILITIES,
886 CapabilityKernel,
887 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
888 SPV_OPERAND_TYPE_ID}},
889 {"Unordered",
890 5,
891 OpUnordered,
892 SPV_OPCODE_FLAGS_CAPABILITIES,
893 CapabilityKernel,
894 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
895 SPV_OPERAND_TYPE_ID}},
896 {"LogicalOr",
897 5,
898 OpLogicalOr,
899 SPV_OPCODE_FLAGS_NONE,
900 0,
901 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
902 SPV_OPERAND_TYPE_ID}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100903 {"LogicalAnd",
904 5,
905 OpLogicalAnd,
906 SPV_OPCODE_FLAGS_NONE,
907 0,
908 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
909 SPV_OPERAND_TYPE_ID}},
910 {"Select",
911 6,
912 OpSelect,
913 SPV_OPCODE_FLAGS_NONE,
914 0,
915 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
916 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
917 {"IEqual",
918 5,
919 OpIEqual,
920 SPV_OPCODE_FLAGS_NONE,
921 0,
922 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
923 SPV_OPERAND_TYPE_ID}},
924 {"FOrdEqual",
925 5,
926 OpFOrdEqual,
927 SPV_OPCODE_FLAGS_NONE,
928 0,
929 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
930 SPV_OPERAND_TYPE_ID}},
931 {"FUnordEqual",
932 5,
933 OpFUnordEqual,
934 SPV_OPCODE_FLAGS_NONE,
935 0,
936 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
937 SPV_OPERAND_TYPE_ID}},
938 {"INotEqual",
939 5,
940 OpINotEqual,
941 SPV_OPCODE_FLAGS_NONE,
942 0,
943 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
944 SPV_OPERAND_TYPE_ID}},
945 {"FOrdNotEqual",
946 5,
947 OpFOrdNotEqual,
948 SPV_OPCODE_FLAGS_NONE,
949 0,
950 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
951 SPV_OPERAND_TYPE_ID}},
952 {"FUnordNotEqual",
953 5,
954 OpFUnordNotEqual,
955 SPV_OPCODE_FLAGS_NONE,
956 0,
957 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
958 SPV_OPERAND_TYPE_ID}},
959 {"ULessThan",
960 5,
961 OpULessThan,
962 SPV_OPCODE_FLAGS_NONE,
963 0,
964 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
965 SPV_OPERAND_TYPE_ID}},
966 {"SLessThan",
967 5,
968 OpSLessThan,
969 SPV_OPCODE_FLAGS_NONE,
970 0,
971 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
972 SPV_OPERAND_TYPE_ID}},
973 {"FOrdLessThan",
974 5,
975 OpFOrdLessThan,
976 SPV_OPCODE_FLAGS_NONE,
977 0,
978 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
979 SPV_OPERAND_TYPE_ID}},
980 {"FUnordLessThan",
981 5,
982 OpFUnordLessThan,
983 SPV_OPCODE_FLAGS_NONE,
984 0,
985 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
986 SPV_OPERAND_TYPE_ID}},
987 {"UGreaterThan",
988 5,
989 OpUGreaterThan,
990 SPV_OPCODE_FLAGS_NONE,
991 0,
992 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
993 SPV_OPERAND_TYPE_ID}},
994 {"SGreaterThan",
995 5,
996 OpSGreaterThan,
997 SPV_OPCODE_FLAGS_NONE,
998 0,
999 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1000 SPV_OPERAND_TYPE_ID}},
1001 {"FOrdGreaterThan",
1002 5,
1003 OpFOrdGreaterThan,
1004 SPV_OPCODE_FLAGS_NONE,
1005 0,
1006 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1007 SPV_OPERAND_TYPE_ID}},
1008 {"FUnordGreaterThan",
1009 5,
1010 OpFUnordGreaterThan,
1011 SPV_OPCODE_FLAGS_NONE,
1012 0,
1013 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1014 SPV_OPERAND_TYPE_ID}},
1015 {"ULessThanEqual",
1016 5,
1017 OpULessThanEqual,
1018 SPV_OPCODE_FLAGS_NONE,
1019 0,
1020 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1021 SPV_OPERAND_TYPE_ID}},
1022 {"SLessThanEqual",
1023 5,
1024 OpSLessThanEqual,
1025 SPV_OPCODE_FLAGS_NONE,
1026 0,
1027 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1028 SPV_OPERAND_TYPE_ID}},
1029 {"FOrdLessThanEqual",
1030 5,
1031 OpFOrdLessThanEqual,
1032 SPV_OPCODE_FLAGS_NONE,
1033 0,
1034 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1035 SPV_OPERAND_TYPE_ID}},
1036 {"FUnordLessThanEqual",
1037 5,
1038 OpFUnordLessThanEqual,
1039 SPV_OPCODE_FLAGS_NONE,
1040 0,
1041 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1042 SPV_OPERAND_TYPE_ID}},
1043 {"UGreaterThanEqual",
1044 5,
1045 OpUGreaterThanEqual,
1046 SPV_OPCODE_FLAGS_NONE,
1047 0,
1048 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1049 SPV_OPERAND_TYPE_ID}},
1050 {"SGreaterThanEqual",
1051 5,
1052 OpSGreaterThanEqual,
1053 SPV_OPCODE_FLAGS_NONE,
1054 0,
1055 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1056 SPV_OPERAND_TYPE_ID}},
1057 {"FOrdGreaterThanEqual",
1058 5,
1059 OpFOrdGreaterThanEqual,
1060 SPV_OPCODE_FLAGS_NONE,
1061 0,
1062 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1063 SPV_OPERAND_TYPE_ID}},
1064 {"FUnordGreaterThanEqual",
1065 5,
1066 OpFUnordGreaterThanEqual,
1067 SPV_OPCODE_FLAGS_NONE,
1068 0,
1069 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1070 SPV_OPERAND_TYPE_ID}},
1071 {"DPdx",
1072 4,
1073 OpDPdx,
1074 SPV_OPCODE_FLAGS_CAPABILITIES,
1075 CapabilityShader,
1076 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1077 {"DPdy",
1078 4,
1079 OpDPdy,
1080 SPV_OPCODE_FLAGS_CAPABILITIES,
1081 CapabilityShader,
1082 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1083 {
1084 "Fwidth",
1085 4,
1086 OpFwidth,
1087 SPV_OPCODE_FLAGS_CAPABILITIES,
1088 CapabilityShader,
1089 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID},
1090 },
1091 {"DPdxFine",
1092 4,
1093 OpDPdxFine,
1094 SPV_OPCODE_FLAGS_CAPABILITIES,
1095 CapabilityShader,
1096 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1097 {"DPdyFine",
1098 4,
1099 OpDPdyFine,
1100 SPV_OPCODE_FLAGS_CAPABILITIES,
1101 CapabilityShader,
1102 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1103 {
1104 "FwidthFine",
1105 4,
1106 OpFwidthFine,
1107 SPV_OPCODE_FLAGS_CAPABILITIES,
1108 CapabilityShader,
1109 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID},
1110 },
1111 {"DPdxCoarse",
1112 4,
1113 OpDPdxCoarse,
1114 SPV_OPCODE_FLAGS_CAPABILITIES,
1115 CapabilityShader,
1116 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1117 {"DPdyCoarse",
1118 4,
1119 OpDPdyCoarse,
1120 SPV_OPCODE_FLAGS_CAPABILITIES,
1121 CapabilityShader,
1122 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1123 {
1124 "FwidthCoarse",
1125 4,
1126 OpFwidthCoarse,
1127 SPV_OPCODE_FLAGS_CAPABILITIES,
1128 CapabilityShader,
1129 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID},
1130 },
1131 {"Phi",
1132 3,
1133 OpPhi,
1134 SPV_OPCODE_FLAGS_VARIABLE,
1135 0,
1136 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1137 SPV_OPERAND_TYPE_ID}},
1138 {"LoopMerge",
1139 3,
1140 OpLoopMerge,
1141 SPV_OPCODE_FLAGS_NONE,
1142 0,
1143 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LOOP_CONTROL}},
1144 {"SelectionMerge",
1145 3,
1146 OpSelectionMerge,
1147 SPV_OPCODE_FLAGS_NONE,
1148 0,
1149 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_SELECTION_CONTROL}},
1150 {"Label",
1151 2,
1152 OpLabel,
1153 SPV_OPCODE_FLAGS_NONE,
1154 0,
1155 {SPV_OPERAND_TYPE_RESULT_ID}},
1156 {"Branch", 2, OpBranch, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID}},
1157 {"BranchConditional",
1158 4,
1159 OpBranchConditional,
1160 SPV_OPCODE_FLAGS_VARIABLE,
1161 0,
1162 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
1163 SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_LITERAL,
1164 SPV_OPERAND_TYPE_ELLIPSIS}},
1165 {"Switch",
1166 3,
1167 OpSwitch,
1168 SPV_OPCODE_FLAGS_VARIABLE,
1169 0,
1170 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
1171 SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL,
1172 SPV_OPERAND_TYPE_ID}},
1173 {"Kill", 1, OpKill, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, {}},
1174 {"Return", 1, OpReturn, SPV_OPCODE_FLAGS_NONE, 0, {}},
1175 {"ReturnValue",
1176 2,
1177 OpReturnValue,
1178 SPV_OPCODE_FLAGS_NONE,
1179 0,
1180 {SPV_OPERAND_TYPE_ID}},
1181 {"Unreachable",
1182 1,
1183 OpUnreachable,
1184 SPV_OPCODE_FLAGS_CAPABILITIES,
1185 CapabilityKernel,
1186 {}},
1187 {"LifetimeStart",
1188 3,
1189 OpLifetimeStart,
1190 SPV_OPCODE_FLAGS_NONE,
1191 0,
1192 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_NUMBER}},
1193 {"LifetimeStop",
1194 3,
1195 OpLifetimeStop,
1196 SPV_OPCODE_FLAGS_NONE,
1197 0,
1198 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_NUMBER}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001199 {"AtomicLoad",
1200 6,
1201 OpAtomicLoad,
1202 SPV_OPCODE_FLAGS_NONE,
1203 0,
1204 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1205 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS}},
1206 {"AtomicStore",
1207 5,
1208 OpAtomicStore,
1209 SPV_OPCODE_FLAGS_NONE,
1210 0,
1211 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE,
1212 SPV_OPERAND_TYPE_MEMORY_SEMANTICS, SPV_OPERAND_TYPE_ID}},
1213 {"AtomicExchange",
1214 7,
1215 OpAtomicExchange,
1216 SPV_OPCODE_FLAGS_NONE,
1217 0,
1218 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1219 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1220 SPV_OPERAND_TYPE_ID}},
1221 {"AtomicCompareExchange",
1222 8,
1223 OpAtomicCompareExchange,
1224 SPV_OPCODE_FLAGS_NONE,
1225 0,
1226 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1227 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1228 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
1229 {"AtomicCompareExchangeWeak",
1230 8,
1231 OpAtomicCompareExchangeWeak,
1232 SPV_OPCODE_FLAGS_NONE,
1233 0,
1234 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1235 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1236 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
1237 {"AtomicIIncrement",
1238 6,
1239 OpAtomicIIncrement,
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_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS}},
1244 {"AtomicIDecrement",
1245 6,
1246 OpAtomicIDecrement,
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_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS}},
1251 {"AtomicIAdd",
1252 7,
1253 OpAtomicIAdd,
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_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1258 SPV_OPERAND_TYPE_ID}},
1259 {"AtomicISub",
1260 7,
1261 OpAtomicISub,
1262 SPV_OPCODE_FLAGS_NONE,
1263 0,
1264 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1265 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1266 SPV_OPERAND_TYPE_ID}},
1267 {"AtomicUMin",
1268 7,
1269 OpAtomicUMin,
1270 SPV_OPCODE_FLAGS_NONE,
1271 0,
1272 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1273 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1274 SPV_OPERAND_TYPE_ID}},
1275 {"AtomicUMax",
1276 7,
1277 OpAtomicUMax,
1278 SPV_OPCODE_FLAGS_NONE,
1279 0,
1280 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1281 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1282 SPV_OPERAND_TYPE_ID}},
1283 {"AtomicAnd",
1284 7,
1285 OpAtomicAnd,
1286 SPV_OPCODE_FLAGS_NONE,
1287 0,
1288 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1289 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1290 SPV_OPERAND_TYPE_ID}},
1291 {"AtomicOr",
1292 7,
1293 OpAtomicOr,
1294 SPV_OPCODE_FLAGS_NONE,
1295 0,
1296 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1297 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1298 SPV_OPERAND_TYPE_ID}},
1299 {"AtomicXor",
1300 7,
1301 OpAtomicXor,
1302 SPV_OPCODE_FLAGS_NONE,
1303 0,
1304 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1305 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1306 SPV_OPERAND_TYPE_ID}},
Lei Zhang604e5ce2015-08-14 14:46:43 -04001307 {"AtomicSMin",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001308 7,
Lei Zhang604e5ce2015-08-14 14:46:43 -04001309 OpAtomicSMin,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001310 SPV_OPCODE_FLAGS_NONE,
1311 0,
1312 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1313 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1314 SPV_OPERAND_TYPE_ID}},
Lei Zhang604e5ce2015-08-14 14:46:43 -04001315 {"AtomicUMin",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001316 7,
Lei Zhang604e5ce2015-08-14 14:46:43 -04001317 OpAtomicUMin,
1318 SPV_OPCODE_FLAGS_NONE,
1319 0,
1320 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1321 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1322 SPV_OPERAND_TYPE_ID}},
1323 {"AtomicSMax",
1324 7,
1325 OpAtomicSMax,
1326 SPV_OPCODE_FLAGS_NONE,
1327 0,
1328 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1329 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1330 SPV_OPERAND_TYPE_ID}},
1331 {"AtomicUMax",
1332 7,
1333 OpAtomicUMax,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001334 SPV_OPCODE_FLAGS_NONE,
1335 0,
1336 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1337 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1338 SPV_OPERAND_TYPE_ID}},
1339 {"EmitVertex",
1340 1,
1341 OpEmitVertex,
1342 SPV_OPCODE_FLAGS_CAPABILITIES,
1343 CapabilityGeometry,
1344 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_STRING}},
1345 {"EndPrimitive",
1346 1,
1347 OpEndPrimitive,
1348 SPV_OPCODE_FLAGS_CAPABILITIES,
1349 CapabilityGeometry,
1350 {}},
1351 {"EmitStreamVertex",
1352 2,
1353 OpEmitStreamVertex,
1354 SPV_OPCODE_FLAGS_CAPABILITIES,
1355 CapabilityGeometry,
1356 {SPV_OPERAND_TYPE_ID}},
1357 {"EndStreamPrimitive",
1358 2,
1359 OpEndStreamPrimitive,
1360 SPV_OPCODE_FLAGS_CAPABILITIES,
1361 CapabilityGeometry,
1362 {SPV_OPERAND_TYPE_ID}},
1363 {"ControlBarrier",
1364 2,
1365 OpControlBarrier,
1366 SPV_OPCODE_FLAGS_NONE,
1367 0,
1368 {SPV_OPERAND_TYPE_EXECUTION_SCOPE}},
1369 {"MemoryBarrier",
1370 3,
1371 OpMemoryBarrier,
1372 SPV_OPCODE_FLAGS_NONE,
1373 0,
1374 {SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS}},
1375 {"AsyncGroupCopy",
1376 9,
1377 OpAsyncGroupCopy,
1378 SPV_OPCODE_FLAGS_CAPABILITIES,
1379 CapabilityKernel,
1380 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1381 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID,
1382 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
1383 SPV_OPERAND_TYPE_ID}},
1384 {"WaitGroupEvents",
1385 6,
1386 OpWaitGroupEvents,
1387 SPV_OPCODE_FLAGS_CAPABILITIES,
1388 CapabilityKernel,
1389 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1390 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID,
1391 SPV_OPERAND_TYPE_ID}},
1392 {"GroupAll",
1393 5,
1394 OpGroupAll,
1395 SPV_OPCODE_FLAGS_CAPABILITIES,
1396 CapabilityGroups,
1397 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1398 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID}},
1399 {"GroupAny",
1400 5,
1401 OpGroupAny,
1402 SPV_OPCODE_FLAGS_CAPABILITIES,
1403 CapabilityGroups,
1404 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1405 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID}},
1406 {"GroupBroadcast",
1407 6,
1408 OpGroupBroadcast,
1409 SPV_OPCODE_FLAGS_CAPABILITIES,
1410 CapabilityGroups,
1411 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1412 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID,
1413 SPV_OPERAND_TYPE_ID}},
1414 {"GroupIAdd",
1415 6,
1416 OpGroupIAdd,
1417 SPV_OPCODE_FLAGS_CAPABILITIES,
1418 CapabilityGroups,
1419 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1420 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION,
1421 SPV_OPERAND_TYPE_ID}},
1422 {"GroupFAdd",
1423 6,
1424 OpGroupFAdd,
1425 SPV_OPCODE_FLAGS_CAPABILITIES,
1426 CapabilityGroups,
1427 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1428 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION,
1429 SPV_OPERAND_TYPE_ID}},
1430 {"GroupFMin",
1431 6,
1432 OpGroupFMin,
1433 SPV_OPCODE_FLAGS_CAPABILITIES,
1434 CapabilityGroups,
1435 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1436 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION,
1437 SPV_OPERAND_TYPE_ID}},
1438 {"GroupUMin",
1439 6,
1440 OpGroupUMin,
1441 SPV_OPCODE_FLAGS_CAPABILITIES,
1442 CapabilityGroups,
1443 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1444 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION,
1445 SPV_OPERAND_TYPE_ID}},
1446 {"GroupSMin",
1447 6,
1448 OpGroupSMin,
1449 SPV_OPCODE_FLAGS_CAPABILITIES,
1450 CapabilityGroups,
1451 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1452 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION,
1453 SPV_OPERAND_TYPE_ID}},
1454 {"GroupFMax",
1455 6,
1456 OpGroupFMax,
1457 SPV_OPCODE_FLAGS_CAPABILITIES,
1458 CapabilityGroups,
1459 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1460 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION,
1461 SPV_OPERAND_TYPE_ID}},
1462 {"GroupUMax",
1463 6,
1464 OpGroupUMax,
1465 SPV_OPCODE_FLAGS_CAPABILITIES,
1466 CapabilityGroups,
1467 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1468 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION,
1469 SPV_OPERAND_TYPE_ID}},
1470 {"GroupSMax",
1471 6,
1472 OpGroupSMax,
1473 SPV_OPCODE_FLAGS_CAPABILITIES,
1474 CapabilityGroups,
1475 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1476 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION,
1477 SPV_OPERAND_TYPE_ID}},
1478 {"EnqueueMarker",
1479 7,
1480 OpEnqueueMarker,
1481 SPV_OPCODE_FLAGS_CAPABILITIES,
1482 CapabilityDeviceEnqueue,
1483 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1484 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
1485 {"EnqueueKernel",
1486 13,
1487 OpEnqueueKernel,
1488 SPV_OPCODE_FLAGS_VARIABLE | SPV_OPCODE_FLAGS_CAPABILITIES,
1489 CapabilityDeviceEnqueue,
1490 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1491 SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS, SPV_OPERAND_TYPE_ID,
1492 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
1493 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
1494 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID,
1495 SPV_OPERAND_TYPE_ELLIPSIS}},
1496 {"GetKernelNDrangeSubGroupCount",
1497 5,
1498 OpGetKernelNDrangeSubGroupCount,
1499 SPV_OPCODE_FLAGS_CAPABILITIES,
1500 CapabilityDeviceEnqueue,
1501 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1502 SPV_OPERAND_TYPE_ID}},
1503 {"GetKernelNDrangeMaxSubGroupSize",
1504 5,
1505 OpGetKernelNDrangeMaxSubGroupSize,
1506 SPV_OPCODE_FLAGS_CAPABILITIES,
1507 CapabilityDeviceEnqueue,
1508 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1509 SPV_OPERAND_TYPE_ID}},
1510 {"GetKernelWorkGroupSize",
1511 4,
1512 OpGetKernelWorkGroupSize,
1513 SPV_OPCODE_FLAGS_CAPABILITIES,
1514 CapabilityDeviceEnqueue,
1515 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1516 {"GetKernelPreferredWorkGroupSizeMultiple",
1517 4,
1518 OpGetKernelPreferredWorkGroupSizeMultiple,
1519 SPV_OPCODE_FLAGS_CAPABILITIES,
1520 CapabilityDeviceEnqueue,
1521 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1522 {"RetainEvent",
1523 2,
1524 OpRetainEvent,
1525 SPV_OPCODE_FLAGS_CAPABILITIES,
1526 CapabilityDeviceEnqueue,
1527 {SPV_OPERAND_TYPE_ID}},
1528 {"ReleaseEvent",
1529 2,
1530 OpRetainEvent,
1531 SPV_OPCODE_FLAGS_CAPABILITIES,
1532 CapabilityDeviceEnqueue,
1533 {SPV_OPERAND_TYPE_ID}},
1534 {"CreateUserEvent",
1535 3,
1536 OpCreateUserEvent,
1537 SPV_OPCODE_FLAGS_CAPABILITIES,
1538 CapabilityDeviceEnqueue,
1539 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}},
1540 {"IsValidEvent",
1541 4,
1542 OpIsValidEvent,
1543 SPV_OPCODE_FLAGS_CAPABILITIES,
1544 CapabilityDeviceEnqueue,
1545 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1546 {"SetUserEventStatus",
1547 3,
1548 OpSetUserEventStatus,
1549 SPV_OPCODE_FLAGS_CAPABILITIES,
1550 CapabilityDeviceEnqueue,
1551 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
1552 {"CapabilitytureEventProfilingInfo",
1553 4,
1554 OpCaptureEventProfilingInfo,
1555 SPV_OPCODE_FLAGS_CAPABILITIES,
1556 CapabilityDeviceEnqueue,
1557 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_KERENL_PROFILING_INFO,
1558 SPV_OPERAND_TYPE_ID}},
1559 {"GetDefaultQueue",
1560 3,
1561 OpGetDefaultQueue,
1562 SPV_OPCODE_FLAGS_CAPABILITIES,
1563 CapabilityDeviceEnqueue,
1564 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}},
1565 {"BuildNDRange",
1566 6,
1567 OpBuildNDRange,
1568 SPV_OPCODE_FLAGS_CAPABILITIES,
1569 CapabilityDeviceEnqueue,
1570 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1571 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
1572 {"ReadPipe",
1573 5,
1574 OpReadPipe,
1575 SPV_OPCODE_FLAGS_CAPABILITIES,
1576 CapabilityPipes,
1577 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1578 SPV_OPERAND_TYPE_ID}},
1579 {"WritePipe",
1580 5,
1581 OpWritePipe,
1582 SPV_OPCODE_FLAGS_CAPABILITIES,
1583 CapabilityPipes,
1584 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1585 SPV_OPERAND_TYPE_ID}},
1586 {"ReservedReadPipe",
1587 7,
1588 OpReservedReadPipe,
1589 SPV_OPCODE_FLAGS_CAPABILITIES,
1590 CapabilityPipes,
1591 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1592 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
1593 {"ReservedWritePipe",
1594 7,
1595 OpReservedWritePipe,
1596 SPV_OPCODE_FLAGS_CAPABILITIES,
1597 CapabilityPipes,
1598 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1599 SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
1600 {"ReserveReadPipePackets",
1601 5,
1602 OpReserveReadPipePackets,
1603 SPV_OPCODE_FLAGS_CAPABILITIES,
1604 CapabilityPipes,
1605 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1606 SPV_OPERAND_TYPE_ID}},
1607 {"ReserveWritePipePackets",
1608 5,
1609 OpReserveWritePipePackets,
1610 SPV_OPCODE_FLAGS_CAPABILITIES,
1611 CapabilityPipes,
1612 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID,
1613 SPV_OPERAND_TYPE_ID}},
1614 {"CommitReadPipe",
1615 3,
1616 OpCommitReadPipe,
1617 SPV_OPCODE_FLAGS_CAPABILITIES,
1618 CapabilityPipes,
1619 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
1620 {"CommitWritePipe",
1621 3,
1622 OpCommitWritePipe,
1623 SPV_OPCODE_FLAGS_CAPABILITIES,
1624 CapabilityPipes,
1625 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}},
1626 {"IsValidReserveId",
1627 4,
1628 OpIsValidReserveId,
1629 SPV_OPCODE_FLAGS_CAPABILITIES,
1630 CapabilityPipes,
1631 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1632 {"GetNumPipePackets",
1633 4,
1634 OpGetNumPipePackets,
1635 SPV_OPCODE_FLAGS_CAPABILITIES,
1636 CapabilityPipes,
1637 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1638 {"GetMaxPipePackets",
1639 4,
1640 OpGetMaxPipePackets,
1641 SPV_OPCODE_FLAGS_CAPABILITIES,
1642 CapabilityPipes,
1643 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}},
1644 {"GroupReserveReadPipePackets",
1645 6,
1646 OpGroupReserveReadPipePackets,
1647 SPV_OPCODE_FLAGS_CAPABILITIES,
1648 CapabilityPipes,
1649 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1650 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID,
1651 SPV_OPERAND_TYPE_ID}},
1652 {"GroupReserveWritePipePackets",
1653 6,
1654 OpGroupReserveWritePipePackets,
1655 SPV_OPCODE_FLAGS_CAPABILITIES,
1656 CapabilityPipes,
1657 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID,
1658 SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID,
1659 SPV_OPERAND_TYPE_ID}},
1660 {"GroupCommitReadPipe",
1661 4,
1662 OpGroupCommitReadPipe,
1663 SPV_OPCODE_FLAGS_CAPABILITIES,
1664 CapabilityPipes,
1665 {SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID,
1666 SPV_OPERAND_TYPE_ID}},
1667 {"GroupCommitWritePipe",
1668 4,
1669 OpGroupCommitWritePipe,
1670 SPV_OPCODE_FLAGS_CAPABILITIES,
1671 CapabilityPipes,
1672 {SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID,
1673 SPV_OPERAND_TYPE_ID}}};
1674
1675spv_result_t spvOpcodeTableGet(spv_opcode_table *pInstTable) {
1676 spvCheck(!pInstTable, return SPV_ERROR_INVALID_POINTER);
1677
1678 static const spv_opcode_table_t table = {
1679 sizeof(opcodeTableEntries) / sizeof(spv_opcode_desc_t),
1680 opcodeTableEntries};
1681
1682 *pInstTable = &table;
1683
1684 return SPV_SUCCESS;
1685}
1686
1687spv_result_t spvOpcodeTableNameLookup(const spv_opcode_table table,
1688 const char *name,
1689 spv_opcode_desc *pEntry) {
1690 spvCheck(!name || !pEntry, return SPV_ERROR_INVALID_POINTER);
1691 spvCheck(!table, return SPV_ERROR_INVALID_TABLE);
1692
1693 // TODO: This lookup of the Opcode table is suboptimal! Binary sort would be
1694 // preferable but the table requires sorting on the Opcode name, but it's
1695 // static
1696 // const initialized and matches the order of the spec.
1697 const size_t nameLength = strlen(name);
1698 for (uint64_t opcodeIndex = 0; opcodeIndex < table->count; ++opcodeIndex) {
1699 if (nameLength == strlen(table->entries[opcodeIndex].name) &&
1700 !strncmp(name, table->entries[opcodeIndex].name, nameLength)) {
1701 // NOTE: Found out Opcode!
1702 *pEntry = &table->entries[opcodeIndex];
1703 return SPV_SUCCESS;
1704 }
1705 }
1706
1707 return SPV_ERROR_INVALID_LOOKUP;
1708}
1709
1710spv_result_t spvOpcodeTableValueLookup(const spv_opcode_table table,
1711 const Op opcode,
1712 spv_opcode_desc *pEntry) {
1713 spvCheck(!table, return SPV_ERROR_INVALID_TABLE);
1714 spvCheck(!pEntry, return SPV_ERROR_INVALID_POINTER);
1715
1716 // TODO: As above this lookup is not optimal.
1717 for (uint64_t opcodeIndex = 0; opcodeIndex < table->count; ++opcodeIndex) {
1718 if (opcode == table->entries[opcodeIndex].opcode) {
1719 // NOTE: Found the Opcode!
1720 *pEntry = &table->entries[opcodeIndex];
1721 return SPV_SUCCESS;
1722 }
1723 }
1724
1725 return SPV_ERROR_INVALID_LOOKUP;
1726}
1727
1728int32_t spvOpcodeIsVariable(spv_opcode_desc entry) {
1729 return SPV_OPCODE_FLAGS_VARIABLE ==
1730 (SPV_OPCODE_FLAGS_VARIABLE & entry->flags);
1731}
1732
1733int32_t spvOpcodeRequiresCapabilities(spv_opcode_desc entry) {
1734 return SPV_OPCODE_FLAGS_CAPABILITIES ==
1735 (SPV_OPCODE_FLAGS_CAPABILITIES & entry->flags);
1736}
1737
1738void spvInstructionCopy(const uint32_t *words, const Op opcode,
1739 const uint16_t wordCount, const spv_endianness_t endian,
1740 spv_instruction_t *pInst) {
1741 pInst->opcode = opcode;
1742 pInst->wordCount = wordCount;
1743 for (uint16_t wordIndex = 0; wordIndex < wordCount; ++wordIndex) {
1744 pInst->words[wordIndex] = spvFixWord(words[wordIndex], endian);
1745 if (!wordIndex) {
1746 uint16_t thisWordCount;
1747 Op thisOpcode;
1748 spvOpcodeSplit(pInst->words[wordIndex], &thisWordCount, &thisOpcode);
1749 assert(opcode == thisOpcode && wordCount == thisWordCount &&
1750 "Endianness failed!");
1751 }
1752 }
1753}
1754
1755const char *spvOpcodeString(const Op opcode) {
1756#define CASE(OPCODE) \
1757 case OPCODE: \
1758 return #OPCODE;
1759 switch (opcode) {
1760 CASE(OpNop)
1761 CASE(OpSource)
1762 CASE(OpSourceExtension)
1763 CASE(OpExtension)
1764 CASE(OpExtInstImport)
1765 CASE(OpMemoryModel)
1766 CASE(OpEntryPoint)
1767 CASE(OpExecutionMode)
1768 CASE(OpTypeVoid)
1769 CASE(OpTypeBool)
1770 CASE(OpTypeInt)
1771 CASE(OpTypeFloat)
1772 CASE(OpTypeVector)
1773 CASE(OpTypeMatrix)
1774 CASE(OpTypeSampler)
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001775 CASE(OpTypeArray)
1776 CASE(OpTypeRuntimeArray)
1777 CASE(OpTypeStruct)
1778 CASE(OpTypeOpaque)
1779 CASE(OpTypePointer)
1780 CASE(OpTypeFunction)
1781 CASE(OpTypeEvent)
1782 CASE(OpTypeDeviceEvent)
1783 CASE(OpTypeReserveId)
1784 CASE(OpTypeQueue)
1785 CASE(OpTypePipe)
1786 CASE(OpConstantTrue)
1787 CASE(OpConstantFalse)
1788 CASE(OpConstant)
1789 CASE(OpConstantComposite)
1790 CASE(OpConstantSampler)
1791 CASE(OpConstantNull)
1792 CASE(OpSpecConstantTrue)
1793 CASE(OpSpecConstantFalse)
1794 CASE(OpSpecConstant)
1795 CASE(OpSpecConstantComposite)
1796 CASE(OpVariable)
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001797 CASE(OpFunction)
1798 CASE(OpFunctionParameter)
1799 CASE(OpFunctionEnd)
1800 CASE(OpFunctionCall)
1801 CASE(OpExtInst)
1802 CASE(OpUndef)
1803 CASE(OpLoad)
1804 CASE(OpStore)
1805 CASE(OpPhi)
1806 CASE(OpDecorationGroup)
1807 CASE(OpDecorate)
1808 CASE(OpMemberDecorate)
1809 CASE(OpGroupDecorate)
1810 CASE(OpGroupMemberDecorate)
1811 CASE(OpName)
1812 CASE(OpMemberName)
1813 CASE(OpString)
1814 CASE(OpLine)
1815 CASE(OpVectorExtractDynamic)
1816 CASE(OpVectorInsertDynamic)
1817 CASE(OpVectorShuffle)
1818 CASE(OpCompositeConstruct)
1819 CASE(OpCompositeExtract)
1820 CASE(OpCompositeInsert)
1821 CASE(OpCopyObject)
1822 CASE(OpCopyMemory)
1823 CASE(OpCopyMemorySized)
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001824 CASE(OpAccessChain)
1825 CASE(OpInBoundsAccessChain)
1826 CASE(OpSNegate)
1827 CASE(OpFNegate)
1828 CASE(OpNot)
1829 CASE(OpAny)
1830 CASE(OpAll)
1831 CASE(OpConvertFToU)
1832 CASE(OpConvertFToS)
1833 CASE(OpConvertSToF)
1834 CASE(OpConvertUToF)
1835 CASE(OpUConvert)
1836 CASE(OpSConvert)
1837 CASE(OpFConvert)
1838 CASE(OpConvertPtrToU)
1839 CASE(OpConvertUToPtr)
1840 CASE(OpPtrCastToGeneric)
1841 CASE(OpGenericCastToPtr)
1842 CASE(OpBitcast)
1843 CASE(OpTranspose)
1844 CASE(OpIsNan)
1845 CASE(OpIsInf)
1846 CASE(OpIsFinite)
1847 CASE(OpIsNormal)
1848 CASE(OpSignBitSet)
1849 CASE(OpLessOrGreater)
1850 CASE(OpOrdered)
1851 CASE(OpUnordered)
1852 CASE(OpArrayLength)
1853 CASE(OpIAdd)
1854 CASE(OpFAdd)
1855 CASE(OpISub)
1856 CASE(OpFSub)
1857 CASE(OpIMul)
1858 CASE(OpFMul)
1859 CASE(OpUDiv)
1860 CASE(OpSDiv)
1861 CASE(OpFDiv)
1862 CASE(OpUMod)
1863 CASE(OpSRem)
1864 CASE(OpSMod)
1865 CASE(OpFRem)
1866 CASE(OpFMod)
1867 CASE(OpVectorTimesScalar)
1868 CASE(OpMatrixTimesScalar)
1869 CASE(OpVectorTimesMatrix)
1870 CASE(OpMatrixTimesVector)
1871 CASE(OpMatrixTimesMatrix)
1872 CASE(OpOuterProduct)
1873 CASE(OpDot)
1874 CASE(OpShiftRightLogical)
1875 CASE(OpShiftRightArithmetic)
1876 CASE(OpShiftLeftLogical)
1877 CASE(OpLogicalOr)
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001878 CASE(OpLogicalAnd)
1879 CASE(OpBitwiseOr)
1880 CASE(OpBitwiseXor)
1881 CASE(OpBitwiseAnd)
1882 CASE(OpSelect)
1883 CASE(OpIEqual)
1884 CASE(OpFOrdEqual)
1885 CASE(OpFUnordEqual)
1886 CASE(OpINotEqual)
1887 CASE(OpFOrdNotEqual)
1888 CASE(OpFUnordNotEqual)
1889 CASE(OpULessThan)
1890 CASE(OpSLessThan)
1891 CASE(OpFOrdLessThan)
1892 CASE(OpFUnordLessThan)
1893 CASE(OpUGreaterThan)
1894 CASE(OpSGreaterThan)
1895 CASE(OpFOrdGreaterThan)
1896 CASE(OpFUnordGreaterThan)
1897 CASE(OpULessThanEqual)
1898 CASE(OpSLessThanEqual)
1899 CASE(OpFOrdLessThanEqual)
1900 CASE(OpFUnordLessThanEqual)
1901 CASE(OpUGreaterThanEqual)
1902 CASE(OpSGreaterThanEqual)
1903 CASE(OpFOrdGreaterThanEqual)
1904 CASE(OpFUnordGreaterThanEqual)
1905 CASE(OpDPdx)
1906 CASE(OpDPdy)
1907 CASE(OpFwidth)
1908 CASE(OpDPdxFine)
1909 CASE(OpDPdyFine)
1910 CASE(OpFwidthFine)
1911 CASE(OpDPdxCoarse)
1912 CASE(OpDPdyCoarse)
1913 CASE(OpFwidthCoarse)
1914 CASE(OpEmitVertex)
1915 CASE(OpEndPrimitive)
1916 CASE(OpEmitStreamVertex)
1917 CASE(OpEndStreamPrimitive)
1918 CASE(OpControlBarrier)
1919 CASE(OpMemoryBarrier)
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001920 CASE(OpAtomicLoad)
1921 CASE(OpAtomicStore)
1922 CASE(OpAtomicExchange)
1923 CASE(OpAtomicCompareExchange)
1924 CASE(OpAtomicCompareExchangeWeak)
1925 CASE(OpAtomicIIncrement)
1926 CASE(OpAtomicIDecrement)
1927 CASE(OpAtomicIAdd)
1928 CASE(OpAtomicISub)
1929 CASE(OpAtomicUMin)
1930 CASE(OpAtomicUMax)
1931 CASE(OpAtomicAnd)
1932 CASE(OpAtomicOr)
1933 CASE(OpAtomicXor)
1934 CASE(OpLoopMerge)
1935 CASE(OpSelectionMerge)
1936 CASE(OpLabel)
1937 CASE(OpBranch)
1938 CASE(OpBranchConditional)
1939 CASE(OpSwitch)
1940 CASE(OpKill)
1941 CASE(OpReturn)
1942 CASE(OpReturnValue)
1943 CASE(OpUnreachable)
1944 CASE(OpLifetimeStart)
1945 CASE(OpLifetimeStop)
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001946 CASE(OpAsyncGroupCopy)
1947 CASE(OpWaitGroupEvents)
1948 CASE(OpGroupAll)
1949 CASE(OpGroupAny)
1950 CASE(OpGroupBroadcast)
1951 CASE(OpGroupIAdd)
1952 CASE(OpGroupFAdd)
1953 CASE(OpGroupFMin)
1954 CASE(OpGroupUMin)
1955 CASE(OpGroupSMin)
1956 CASE(OpGroupFMax)
1957 CASE(OpGroupUMax)
1958 CASE(OpGroupSMax)
1959 CASE(OpGenericCastToPtrExplicit)
1960 CASE(OpGenericPtrMemSemantics)
1961 CASE(OpReadPipe)
1962 CASE(OpWritePipe)
1963 CASE(OpReservedReadPipe)
1964 CASE(OpReservedWritePipe)
1965 CASE(OpReserveReadPipePackets)
1966 CASE(OpReserveWritePipePackets)
1967 CASE(OpCommitReadPipe)
1968 CASE(OpCommitWritePipe)
1969 CASE(OpIsValidReserveId)
1970 CASE(OpGetNumPipePackets)
1971 CASE(OpGetMaxPipePackets)
1972 CASE(OpGroupReserveReadPipePackets)
1973 CASE(OpGroupReserveWritePipePackets)
1974 CASE(OpGroupCommitReadPipe)
1975 CASE(OpGroupCommitWritePipe)
1976 CASE(OpEnqueueMarker)
1977 CASE(OpEnqueueKernel)
1978 CASE(OpGetKernelNDrangeSubGroupCount)
1979 CASE(OpGetKernelNDrangeMaxSubGroupSize)
1980 CASE(OpGetKernelWorkGroupSize)
1981 CASE(OpGetKernelPreferredWorkGroupSizeMultiple)
1982 CASE(OpRetainEvent)
1983 CASE(OpReleaseEvent)
1984 CASE(OpCreateUserEvent)
1985 CASE(OpIsValidEvent)
1986 CASE(OpSetUserEventStatus)
1987 CASE(OpCaptureEventProfilingInfo)
1988 CASE(OpGetDefaultQueue)
1989 CASE(OpBuildNDRange)
1990 default:
1991 assert(0 && "Unreachable!");
1992 }
1993#undef CASE
1994 return "unknown";
1995}
1996
1997int32_t spvOpcodeIsType(const Op opcode) {
1998 switch (opcode) {
1999 case OpTypeVoid:
2000 case OpTypeBool:
2001 case OpTypeInt:
2002 case OpTypeFloat:
2003 case OpTypeVector:
2004 case OpTypeMatrix:
2005 case OpTypeSampler:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01002006 case OpTypeArray:
2007 case OpTypeRuntimeArray:
2008 case OpTypeStruct:
2009 case OpTypeOpaque:
2010 case OpTypePointer:
2011 case OpTypeFunction:
2012 case OpTypeEvent:
2013 case OpTypeDeviceEvent:
2014 case OpTypeReserveId:
2015 case OpTypeQueue:
2016 case OpTypePipe:
2017 return true;
2018 default:
2019 return false;
2020 }
2021}
2022
2023int32_t spvOpcodeIsScalarType(const Op opcode) {
2024 switch (opcode) {
2025 case OpTypeInt:
2026 case OpTypeFloat:
2027 return true;
2028 default:
2029 return false;
2030 }
2031}
2032
2033int32_t spvOpcodeIsConstant(const Op opcode) {
2034 switch (opcode) {
2035 case OpConstantTrue:
2036 case OpConstantFalse:
2037 case OpConstant:
2038 case OpConstantComposite:
2039 case OpConstantSampler:
2040 // case OpConstantNull:
2041 case OpConstantNull:
2042 case OpSpecConstantTrue:
2043 case OpSpecConstantFalse:
2044 case OpSpecConstant:
2045 case OpSpecConstantComposite:
2046 // case OpSpecConstantOp:
2047 return true;
2048 default:
2049 return false;
2050 }
2051}
2052
2053int32_t spvOpcodeIsComposite(const Op opcode) {
2054 switch (opcode) {
2055 case OpTypeVector:
2056 case OpTypeMatrix:
2057 case OpTypeArray:
2058 case OpTypeStruct:
2059 return true;
2060 default:
2061 return false;
2062 }
2063}
2064
2065int32_t spvOpcodeAreTypesEqual(const spv_instruction_t *pTypeInst0,
2066 const spv_instruction_t *pTypeInst1) {
2067 spvCheck(pTypeInst0->opcode != pTypeInst1->opcode, return false);
2068 spvCheck(pTypeInst0->words[1] != pTypeInst1->words[1], return false);
2069 return true;
2070}
2071
2072int32_t spvOpcodeIsPointer(const Op opcode) {
2073 switch (opcode) {
2074 case OpVariable:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01002075 case OpAccessChain:
2076 case OpInBoundsAccessChain:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01002077 case OpFunctionParameter:
2078 return true;
2079 default:
2080 return false;
2081 }
2082}
2083
2084int32_t spvOpcodeIsObject(const Op opcode) {
2085 switch (opcode) {
2086 case OpConstantTrue:
2087 case OpConstantFalse:
2088 case OpConstant:
2089 case OpConstantComposite:
2090 // TODO: case OpConstantSampler:
2091 case OpConstantNull:
2092 case OpSpecConstantTrue:
2093 case OpSpecConstantFalse:
2094 case OpSpecConstant:
2095 case OpSpecConstantComposite:
2096 // TODO: case OpSpecConstantOp:
2097 case OpVariable:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01002098 case OpAccessChain:
2099 case OpInBoundsAccessChain:
2100 case OpConvertFToU:
2101 case OpConvertFToS:
2102 case OpConvertSToF:
2103 case OpConvertUToF:
2104 case OpUConvert:
2105 case OpSConvert:
2106 case OpFConvert:
2107 case OpConvertPtrToU:
2108 // TODO: case OpConvertUToPtr:
2109 case OpPtrCastToGeneric:
2110 // TODO: case OpGenericCastToPtr:
2111 case OpBitcast:
2112 // TODO: case OpGenericCastToPtrExplicit:
2113 case OpSatConvertSToU:
2114 case OpSatConvertUToS:
2115 case OpVectorExtractDynamic:
2116 case OpCompositeConstruct:
2117 case OpCompositeExtract:
2118 case OpCopyObject:
2119 case OpTranspose:
2120 case OpSNegate:
2121 case OpFNegate:
2122 case OpNot:
2123 case OpIAdd:
2124 case OpFAdd:
2125 case OpISub:
2126 case OpFSub:
2127 case OpIMul:
2128 case OpFMul:
2129 case OpUDiv:
2130 case OpSDiv:
2131 case OpFDiv:
2132 case OpUMod:
2133 case OpSRem:
2134 case OpSMod:
2135 case OpVectorTimesScalar:
2136 case OpMatrixTimesScalar:
2137 case OpVectorTimesMatrix:
2138 case OpMatrixTimesVector:
2139 case OpMatrixTimesMatrix:
2140 case OpOuterProduct:
2141 case OpDot:
2142 case OpShiftRightLogical:
2143 case OpShiftRightArithmetic:
2144 case OpShiftLeftLogical:
2145 case OpBitwiseOr:
2146 case OpBitwiseXor:
2147 case OpBitwiseAnd:
2148 case OpAny:
2149 case OpAll:
2150 case OpIsNan:
2151 case OpIsInf:
2152 case OpIsFinite:
2153 case OpIsNormal:
2154 case OpSignBitSet:
2155 case OpLessOrGreater:
2156 case OpOrdered:
2157 case OpUnordered:
2158 case OpLogicalOr:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01002159 case OpLogicalAnd:
2160 case OpSelect:
2161 case OpIEqual:
2162 case OpFOrdEqual:
2163 case OpFUnordEqual:
2164 case OpINotEqual:
2165 case OpFOrdNotEqual:
2166 case OpFUnordNotEqual:
2167 case OpULessThan:
2168 case OpSLessThan:
2169 case OpFOrdLessThan:
2170 case OpFUnordLessThan:
2171 case OpUGreaterThan:
2172 case OpSGreaterThan:
2173 case OpFOrdGreaterThan:
2174 case OpFUnordGreaterThan:
2175 case OpULessThanEqual:
2176 case OpSLessThanEqual:
2177 case OpFOrdLessThanEqual:
2178 case OpFUnordLessThanEqual:
2179 case OpUGreaterThanEqual:
2180 case OpSGreaterThanEqual:
2181 case OpFOrdGreaterThanEqual:
2182 case OpFUnordGreaterThanEqual:
2183 case OpDPdx:
2184 case OpDPdy:
2185 case OpFwidth:
2186 case OpDPdxFine:
2187 case OpDPdyFine:
2188 case OpFwidthFine:
2189 case OpDPdxCoarse:
2190 case OpDPdyCoarse:
2191 case OpFwidthCoarse:
2192 case OpReturnValue:
2193 return true;
2194 default:
2195 return false;
2196 }
2197}
2198
2199int32_t spvOpcodeIsBasicTypeNullable(Op opcode) {
2200 switch (opcode) {
2201 case OpTypeBool:
2202 case OpTypeInt:
2203 case OpTypeFloat:
2204 case OpTypePointer:
2205 case OpTypeEvent:
2206 case OpTypeDeviceEvent:
2207 case OpTypeReserveId:
2208 case OpTypeQueue:
2209 return true;
2210 default:
2211 return false;
2212 }
2213}
2214
2215int32_t spvInstructionIsInBasicBlock(const spv_instruction_t *pFirstInst,
2216 const spv_instruction_t *pInst) {
2217 while (pFirstInst != pInst) {
2218 spvCheck(OpFunction == pInst->opcode, break);
2219 pInst--;
2220 }
2221 spvCheck(OpFunction != pInst->opcode, return false);
2222 return true;
2223}
2224
2225int32_t spvOpcodeIsValue(Op opcode) {
2226 spvCheck(spvOpcodeIsPointer(opcode), return true);
2227 spvCheck(spvOpcodeIsConstant(opcode), return true);
2228 switch (opcode) {
2229 case OpLoad:
2230 // TODO: Other Opcode's resulting in a value
2231 return true;
2232 default:
2233 return false;
2234 }
2235}