xref: /aosp_15_r20/external/angle/src/common/spirv/spirv_instruction_parser_autogen.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1 // GENERATED FILE - DO NOT EDIT.
2 // Generated by gen_spirv_builder_and_parser.py using data from spirv.core.grammar.json.
3 //
4 // Copyright 2021 The ANGLE Project Authors. All rights reserved.
5 // Use of this source code is governed by a BSD-style license that can be
6 // found in the LICENSE file.
7 //
8 // spirv_instruction_parser_autogen.cpp:
9 //   Functions to parse SPIR-V binary for each instruction.
10 
11 #include "spirv_instruction_parser_autogen.h"
12 
13 #include <string.h>
14 
15 #include "common/debug.h"
16 
17 namespace angle
18 {
19 namespace spirv
20 {
21 
GetInstructionOpAndLength(const uint32_t * _instruction,spv::Op * opOut,uint32_t * lengthOut)22 void GetInstructionOpAndLength(const uint32_t *_instruction, spv::Op *opOut, uint32_t *lengthOut)
23 {
24     constexpr uint32_t kOpMask = 0xFFFFu;
25     *opOut                     = static_cast<spv::Op>(_instruction[0] & kOpMask);
26     *lengthOut                 = _instruction[0] >> 16;
27 }
ParseUndef(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2)28 void ParseUndef(const uint32_t *_instruction, IdResultType *idResultType1, IdResult *idResult2)
29 {
30     spv::Op _op;
31     uint32_t _length;
32     GetInstructionOpAndLength(_instruction, &_op, &_length);
33     ASSERT(_op == spv::OpUndef);
34     uint32_t _o    = 1;
35     *idResultType1 = IdResultType(_instruction[_o++]);
36     *idResult2     = IdResult(_instruction[_o++]);
37 }
ParseSourceContinued(const uint32_t * _instruction,LiteralString * continuedSource)38 void ParseSourceContinued(const uint32_t *_instruction, LiteralString *continuedSource)
39 {
40     spv::Op _op;
41     uint32_t _length;
42     GetInstructionOpAndLength(_instruction, &_op, &_length);
43     ASSERT(_op == spv::OpSourceContinued);
44     uint32_t _o = 1;
45     ASSERT(IsLittleEndian());
46     *continuedSource = reinterpret_cast<const char *>(&_instruction[_o]);
47     _o += strlen(*continuedSource) / 4 + 1;
48 }
ParseSource(const uint32_t * _instruction,spv::SourceLanguage * sourceLanguage1,LiteralInteger * version,IdRef * file,LiteralString * source)49 void ParseSource(const uint32_t *_instruction,
50                  spv::SourceLanguage *sourceLanguage1,
51                  LiteralInteger *version,
52                  IdRef *file,
53                  LiteralString *source)
54 {
55     spv::Op _op;
56     uint32_t _length;
57     GetInstructionOpAndLength(_instruction, &_op, &_length);
58     ASSERT(_op == spv::OpSource);
59     uint32_t _o      = 1;
60     *sourceLanguage1 = spv::SourceLanguage(_instruction[_o++]);
61     *version         = LiteralInteger(_instruction[_o++]);
62     if (file && _o < _length)
63     {
64         *file = IdRef(_instruction[_o++]);
65     }
66     if (source && _o < _length)
67     {
68         ASSERT(IsLittleEndian());
69         *source = reinterpret_cast<const char *>(&_instruction[_o]);
70         _o += strlen(*source) / 4 + 1;
71     }
72 }
ParseSourceExtension(const uint32_t * _instruction,LiteralString * extension)73 void ParseSourceExtension(const uint32_t *_instruction, LiteralString *extension)
74 {
75     spv::Op _op;
76     uint32_t _length;
77     GetInstructionOpAndLength(_instruction, &_op, &_length);
78     ASSERT(_op == spv::OpSourceExtension);
79     uint32_t _o = 1;
80     ASSERT(IsLittleEndian());
81     *extension = reinterpret_cast<const char *>(&_instruction[_o]);
82     _o += strlen(*extension) / 4 + 1;
83 }
ParseName(const uint32_t * _instruction,IdRef * target,LiteralString * name)84 void ParseName(const uint32_t *_instruction, IdRef *target, LiteralString *name)
85 {
86     spv::Op _op;
87     uint32_t _length;
88     GetInstructionOpAndLength(_instruction, &_op, &_length);
89     ASSERT(_op == spv::OpName);
90     uint32_t _o = 1;
91     *target     = IdRef(_instruction[_o++]);
92     ASSERT(IsLittleEndian());
93     *name = reinterpret_cast<const char *>(&_instruction[_o]);
94     _o += strlen(*name) / 4 + 1;
95 }
ParseMemberName(const uint32_t * _instruction,IdRef * type,LiteralInteger * member,LiteralString * name)96 void ParseMemberName(const uint32_t *_instruction,
97                      IdRef *type,
98                      LiteralInteger *member,
99                      LiteralString *name)
100 {
101     spv::Op _op;
102     uint32_t _length;
103     GetInstructionOpAndLength(_instruction, &_op, &_length);
104     ASSERT(_op == spv::OpMemberName);
105     uint32_t _o = 1;
106     *type       = IdRef(_instruction[_o++]);
107     *member     = LiteralInteger(_instruction[_o++]);
108     ASSERT(IsLittleEndian());
109     *name = reinterpret_cast<const char *>(&_instruction[_o]);
110     _o += strlen(*name) / 4 + 1;
111 }
ParseString(const uint32_t * _instruction,IdResult * idResult1,LiteralString * string)112 void ParseString(const uint32_t *_instruction, IdResult *idResult1, LiteralString *string)
113 {
114     spv::Op _op;
115     uint32_t _length;
116     GetInstructionOpAndLength(_instruction, &_op, &_length);
117     ASSERT(_op == spv::OpString);
118     uint32_t _o = 1;
119     *idResult1  = IdResult(_instruction[_o++]);
120     ASSERT(IsLittleEndian());
121     *string = reinterpret_cast<const char *>(&_instruction[_o]);
122     _o += strlen(*string) / 4 + 1;
123 }
ParseLine(const uint32_t * _instruction,IdRef * file,LiteralInteger * line,LiteralInteger * column)124 void ParseLine(const uint32_t *_instruction,
125                IdRef *file,
126                LiteralInteger *line,
127                LiteralInteger *column)
128 {
129     spv::Op _op;
130     uint32_t _length;
131     GetInstructionOpAndLength(_instruction, &_op, &_length);
132     ASSERT(_op == spv::OpLine);
133     uint32_t _o = 1;
134     *file       = IdRef(_instruction[_o++]);
135     *line       = LiteralInteger(_instruction[_o++]);
136     *column     = LiteralInteger(_instruction[_o++]);
137 }
ParseExtension(const uint32_t * _instruction,LiteralString * name)138 void ParseExtension(const uint32_t *_instruction, LiteralString *name)
139 {
140     spv::Op _op;
141     uint32_t _length;
142     GetInstructionOpAndLength(_instruction, &_op, &_length);
143     ASSERT(_op == spv::OpExtension);
144     uint32_t _o = 1;
145     ASSERT(IsLittleEndian());
146     *name = reinterpret_cast<const char *>(&_instruction[_o]);
147     _o += strlen(*name) / 4 + 1;
148 }
ParseExtInstImport(const uint32_t * _instruction,IdResult * idResult1,LiteralString * name)149 void ParseExtInstImport(const uint32_t *_instruction, IdResult *idResult1, LiteralString *name)
150 {
151     spv::Op _op;
152     uint32_t _length;
153     GetInstructionOpAndLength(_instruction, &_op, &_length);
154     ASSERT(_op == spv::OpExtInstImport);
155     uint32_t _o = 1;
156     *idResult1  = IdResult(_instruction[_o++]);
157     ASSERT(IsLittleEndian());
158     *name = reinterpret_cast<const char *>(&_instruction[_o]);
159     _o += strlen(*name) / 4 + 1;
160 }
ParseExtInst(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * set,LiteralExtInstInteger * instruction,IdRefList * operandList)161 void ParseExtInst(const uint32_t *_instruction,
162                   IdResultType *idResultType1,
163                   IdResult *idResult2,
164                   IdRef *set,
165                   LiteralExtInstInteger *instruction,
166                   IdRefList *operandList)
167 {
168     spv::Op _op;
169     uint32_t _length;
170     GetInstructionOpAndLength(_instruction, &_op, &_length);
171     ASSERT(_op == spv::OpExtInst);
172     uint32_t _o    = 1;
173     *idResultType1 = IdResultType(_instruction[_o++]);
174     *idResult2     = IdResult(_instruction[_o++]);
175     *set           = IdRef(_instruction[_o++]);
176     *instruction   = LiteralExtInstInteger(_instruction[_o++]);
177     if (operandList)
178     {
179         while (_o < _length)
180         {
181             operandList->emplace_back(_instruction[_o++]);
182         }
183     }
184 }
ParseMemoryModel(const uint32_t * _instruction,spv::AddressingModel * addressingModel1,spv::MemoryModel * memoryModel2)185 void ParseMemoryModel(const uint32_t *_instruction,
186                       spv::AddressingModel *addressingModel1,
187                       spv::MemoryModel *memoryModel2)
188 {
189     spv::Op _op;
190     uint32_t _length;
191     GetInstructionOpAndLength(_instruction, &_op, &_length);
192     ASSERT(_op == spv::OpMemoryModel);
193     uint32_t _o       = 1;
194     *addressingModel1 = spv::AddressingModel(_instruction[_o++]);
195     *memoryModel2     = spv::MemoryModel(_instruction[_o++]);
196 }
ParseEntryPoint(const uint32_t * _instruction,spv::ExecutionModel * executionModel1,IdRef * entryPoint,LiteralString * name,IdRefList * interfaceList)197 void ParseEntryPoint(const uint32_t *_instruction,
198                      spv::ExecutionModel *executionModel1,
199                      IdRef *entryPoint,
200                      LiteralString *name,
201                      IdRefList *interfaceList)
202 {
203     spv::Op _op;
204     uint32_t _length;
205     GetInstructionOpAndLength(_instruction, &_op, &_length);
206     ASSERT(_op == spv::OpEntryPoint);
207     uint32_t _o      = 1;
208     *executionModel1 = spv::ExecutionModel(_instruction[_o++]);
209     *entryPoint      = IdRef(_instruction[_o++]);
210     ASSERT(IsLittleEndian());
211     *name = reinterpret_cast<const char *>(&_instruction[_o]);
212     _o += strlen(*name) / 4 + 1;
213     if (interfaceList)
214     {
215         while (_o < _length)
216         {
217             interfaceList->emplace_back(_instruction[_o++]);
218         }
219     }
220 }
ParseExecutionMode(const uint32_t * _instruction,IdRef * entryPoint,spv::ExecutionMode * mode,LiteralIntegerList * operandsList)221 void ParseExecutionMode(const uint32_t *_instruction,
222                         IdRef *entryPoint,
223                         spv::ExecutionMode *mode,
224                         LiteralIntegerList *operandsList)
225 {
226     spv::Op _op;
227     uint32_t _length;
228     GetInstructionOpAndLength(_instruction, &_op, &_length);
229     ASSERT(_op == spv::OpExecutionMode);
230     uint32_t _o = 1;
231     *entryPoint = IdRef(_instruction[_o++]);
232     *mode       = spv::ExecutionMode(_instruction[_o++]);
233     if (operandsList)
234     {
235         while (_o < _length)
236         {
237             operandsList->emplace_back(_instruction[_o++]);
238         }
239     }
240 }
ParseCapability(const uint32_t * _instruction,spv::Capability * capability)241 void ParseCapability(const uint32_t *_instruction, spv::Capability *capability)
242 {
243     spv::Op _op;
244     uint32_t _length;
245     GetInstructionOpAndLength(_instruction, &_op, &_length);
246     ASSERT(_op == spv::OpCapability);
247     uint32_t _o = 1;
248     *capability = spv::Capability(_instruction[_o++]);
249 }
ParseTypeVoid(const uint32_t * _instruction,IdResult * idResult1)250 void ParseTypeVoid(const uint32_t *_instruction, IdResult *idResult1)
251 {
252     spv::Op _op;
253     uint32_t _length;
254     GetInstructionOpAndLength(_instruction, &_op, &_length);
255     ASSERT(_op == spv::OpTypeVoid);
256     uint32_t _o = 1;
257     *idResult1  = IdResult(_instruction[_o++]);
258 }
ParseTypeBool(const uint32_t * _instruction,IdResult * idResult1)259 void ParseTypeBool(const uint32_t *_instruction, IdResult *idResult1)
260 {
261     spv::Op _op;
262     uint32_t _length;
263     GetInstructionOpAndLength(_instruction, &_op, &_length);
264     ASSERT(_op == spv::OpTypeBool);
265     uint32_t _o = 1;
266     *idResult1  = IdResult(_instruction[_o++]);
267 }
ParseTypeInt(const uint32_t * _instruction,IdResult * idResult1,LiteralInteger * width,LiteralInteger * signedness)268 void ParseTypeInt(const uint32_t *_instruction,
269                   IdResult *idResult1,
270                   LiteralInteger *width,
271                   LiteralInteger *signedness)
272 {
273     spv::Op _op;
274     uint32_t _length;
275     GetInstructionOpAndLength(_instruction, &_op, &_length);
276     ASSERT(_op == spv::OpTypeInt);
277     uint32_t _o = 1;
278     *idResult1  = IdResult(_instruction[_o++]);
279     *width      = LiteralInteger(_instruction[_o++]);
280     *signedness = LiteralInteger(_instruction[_o++]);
281 }
ParseTypeFloat(const uint32_t * _instruction,IdResult * idResult1,LiteralInteger * width,spv::FPEncoding * floatingPointEncoding)282 void ParseTypeFloat(const uint32_t *_instruction,
283                     IdResult *idResult1,
284                     LiteralInteger *width,
285                     spv::FPEncoding *floatingPointEncoding)
286 {
287     spv::Op _op;
288     uint32_t _length;
289     GetInstructionOpAndLength(_instruction, &_op, &_length);
290     ASSERT(_op == spv::OpTypeFloat);
291     uint32_t _o = 1;
292     *idResult1  = IdResult(_instruction[_o++]);
293     *width      = LiteralInteger(_instruction[_o++]);
294     if (floatingPointEncoding && _o < _length)
295     {
296         *floatingPointEncoding = spv::FPEncoding(_instruction[_o++]);
297     }
298 }
ParseTypeVector(const uint32_t * _instruction,IdResult * idResult1,IdRef * componentType,LiteralInteger * componentCount)299 void ParseTypeVector(const uint32_t *_instruction,
300                      IdResult *idResult1,
301                      IdRef *componentType,
302                      LiteralInteger *componentCount)
303 {
304     spv::Op _op;
305     uint32_t _length;
306     GetInstructionOpAndLength(_instruction, &_op, &_length);
307     ASSERT(_op == spv::OpTypeVector);
308     uint32_t _o     = 1;
309     *idResult1      = IdResult(_instruction[_o++]);
310     *componentType  = IdRef(_instruction[_o++]);
311     *componentCount = LiteralInteger(_instruction[_o++]);
312 }
ParseTypeMatrix(const uint32_t * _instruction,IdResult * idResult1,IdRef * columnType,LiteralInteger * columnCount)313 void ParseTypeMatrix(const uint32_t *_instruction,
314                      IdResult *idResult1,
315                      IdRef *columnType,
316                      LiteralInteger *columnCount)
317 {
318     spv::Op _op;
319     uint32_t _length;
320     GetInstructionOpAndLength(_instruction, &_op, &_length);
321     ASSERT(_op == spv::OpTypeMatrix);
322     uint32_t _o  = 1;
323     *idResult1   = IdResult(_instruction[_o++]);
324     *columnType  = IdRef(_instruction[_o++]);
325     *columnCount = LiteralInteger(_instruction[_o++]);
326 }
ParseTypeImage(const uint32_t * _instruction,IdResult * idResult1,IdRef * sampledType,spv::Dim * dim3,LiteralInteger * depth,LiteralInteger * arrayed,LiteralInteger * mS,LiteralInteger * sampled,spv::ImageFormat * imageFormat8,spv::AccessQualifier * accessQualifier9)327 void ParseTypeImage(const uint32_t *_instruction,
328                     IdResult *idResult1,
329                     IdRef *sampledType,
330                     spv::Dim *dim3,
331                     LiteralInteger *depth,
332                     LiteralInteger *arrayed,
333                     LiteralInteger *mS,
334                     LiteralInteger *sampled,
335                     spv::ImageFormat *imageFormat8,
336                     spv::AccessQualifier *accessQualifier9)
337 {
338     spv::Op _op;
339     uint32_t _length;
340     GetInstructionOpAndLength(_instruction, &_op, &_length);
341     ASSERT(_op == spv::OpTypeImage);
342     uint32_t _o   = 1;
343     *idResult1    = IdResult(_instruction[_o++]);
344     *sampledType  = IdRef(_instruction[_o++]);
345     *dim3         = spv::Dim(_instruction[_o++]);
346     *depth        = LiteralInteger(_instruction[_o++]);
347     *arrayed      = LiteralInteger(_instruction[_o++]);
348     *mS           = LiteralInteger(_instruction[_o++]);
349     *sampled      = LiteralInteger(_instruction[_o++]);
350     *imageFormat8 = spv::ImageFormat(_instruction[_o++]);
351     if (accessQualifier9 && _o < _length)
352     {
353         *accessQualifier9 = spv::AccessQualifier(_instruction[_o++]);
354     }
355 }
ParseTypeSampler(const uint32_t * _instruction,IdResult * idResult1)356 void ParseTypeSampler(const uint32_t *_instruction, IdResult *idResult1)
357 {
358     spv::Op _op;
359     uint32_t _length;
360     GetInstructionOpAndLength(_instruction, &_op, &_length);
361     ASSERT(_op == spv::OpTypeSampler);
362     uint32_t _o = 1;
363     *idResult1  = IdResult(_instruction[_o++]);
364 }
ParseTypeSampledImage(const uint32_t * _instruction,IdResult * idResult1,IdRef * imageType)365 void ParseTypeSampledImage(const uint32_t *_instruction, IdResult *idResult1, IdRef *imageType)
366 {
367     spv::Op _op;
368     uint32_t _length;
369     GetInstructionOpAndLength(_instruction, &_op, &_length);
370     ASSERT(_op == spv::OpTypeSampledImage);
371     uint32_t _o = 1;
372     *idResult1  = IdResult(_instruction[_o++]);
373     *imageType  = IdRef(_instruction[_o++]);
374 }
ParseTypeArray(const uint32_t * _instruction,IdResult * idResult1,IdRef * elementType,IdRef * length)375 void ParseTypeArray(const uint32_t *_instruction,
376                     IdResult *idResult1,
377                     IdRef *elementType,
378                     IdRef *length)
379 {
380     spv::Op _op;
381     uint32_t _length;
382     GetInstructionOpAndLength(_instruction, &_op, &_length);
383     ASSERT(_op == spv::OpTypeArray);
384     uint32_t _o  = 1;
385     *idResult1   = IdResult(_instruction[_o++]);
386     *elementType = IdRef(_instruction[_o++]);
387     *length      = IdRef(_instruction[_o++]);
388 }
ParseTypeRuntimeArray(const uint32_t * _instruction,IdResult * idResult1,IdRef * elementType)389 void ParseTypeRuntimeArray(const uint32_t *_instruction, IdResult *idResult1, IdRef *elementType)
390 {
391     spv::Op _op;
392     uint32_t _length;
393     GetInstructionOpAndLength(_instruction, &_op, &_length);
394     ASSERT(_op == spv::OpTypeRuntimeArray);
395     uint32_t _o  = 1;
396     *idResult1   = IdResult(_instruction[_o++]);
397     *elementType = IdRef(_instruction[_o++]);
398 }
ParseTypeStruct(const uint32_t * _instruction,IdResult * idResult1,IdRefList * memberList)399 void ParseTypeStruct(const uint32_t *_instruction, IdResult *idResult1, IdRefList *memberList)
400 {
401     spv::Op _op;
402     uint32_t _length;
403     GetInstructionOpAndLength(_instruction, &_op, &_length);
404     ASSERT(_op == spv::OpTypeStruct);
405     uint32_t _o = 1;
406     *idResult1  = IdResult(_instruction[_o++]);
407     if (memberList)
408     {
409         while (_o < _length)
410         {
411             memberList->emplace_back(_instruction[_o++]);
412         }
413     }
414 }
ParseTypePointer(const uint32_t * _instruction,IdResult * idResult1,spv::StorageClass * storageClass2,IdRef * type)415 void ParseTypePointer(const uint32_t *_instruction,
416                       IdResult *idResult1,
417                       spv::StorageClass *storageClass2,
418                       IdRef *type)
419 {
420     spv::Op _op;
421     uint32_t _length;
422     GetInstructionOpAndLength(_instruction, &_op, &_length);
423     ASSERT(_op == spv::OpTypePointer);
424     uint32_t _o    = 1;
425     *idResult1     = IdResult(_instruction[_o++]);
426     *storageClass2 = spv::StorageClass(_instruction[_o++]);
427     *type          = IdRef(_instruction[_o++]);
428 }
ParseTypeFunction(const uint32_t * _instruction,IdResult * idResult1,IdRef * returnType,IdRefList * parameterList)429 void ParseTypeFunction(const uint32_t *_instruction,
430                        IdResult *idResult1,
431                        IdRef *returnType,
432                        IdRefList *parameterList)
433 {
434     spv::Op _op;
435     uint32_t _length;
436     GetInstructionOpAndLength(_instruction, &_op, &_length);
437     ASSERT(_op == spv::OpTypeFunction);
438     uint32_t _o = 1;
439     *idResult1  = IdResult(_instruction[_o++]);
440     *returnType = IdRef(_instruction[_o++]);
441     if (parameterList)
442     {
443         while (_o < _length)
444         {
445             parameterList->emplace_back(_instruction[_o++]);
446         }
447     }
448 }
ParseConstantTrue(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2)449 void ParseConstantTrue(const uint32_t *_instruction,
450                        IdResultType *idResultType1,
451                        IdResult *idResult2)
452 {
453     spv::Op _op;
454     uint32_t _length;
455     GetInstructionOpAndLength(_instruction, &_op, &_length);
456     ASSERT(_op == spv::OpConstantTrue);
457     uint32_t _o    = 1;
458     *idResultType1 = IdResultType(_instruction[_o++]);
459     *idResult2     = IdResult(_instruction[_o++]);
460 }
ParseConstantFalse(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2)461 void ParseConstantFalse(const uint32_t *_instruction,
462                         IdResultType *idResultType1,
463                         IdResult *idResult2)
464 {
465     spv::Op _op;
466     uint32_t _length;
467     GetInstructionOpAndLength(_instruction, &_op, &_length);
468     ASSERT(_op == spv::OpConstantFalse);
469     uint32_t _o    = 1;
470     *idResultType1 = IdResultType(_instruction[_o++]);
471     *idResult2     = IdResult(_instruction[_o++]);
472 }
ParseConstant(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,LiteralContextDependentNumber * value)473 void ParseConstant(const uint32_t *_instruction,
474                    IdResultType *idResultType1,
475                    IdResult *idResult2,
476                    LiteralContextDependentNumber *value)
477 {
478     spv::Op _op;
479     uint32_t _length;
480     GetInstructionOpAndLength(_instruction, &_op, &_length);
481     ASSERT(_op == spv::OpConstant);
482     uint32_t _o    = 1;
483     *idResultType1 = IdResultType(_instruction[_o++]);
484     *idResult2     = IdResult(_instruction[_o++]);
485     *value         = LiteralContextDependentNumber(_instruction[_o++]);
486 }
ParseConstantComposite(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRefList * constituentsList)487 void ParseConstantComposite(const uint32_t *_instruction,
488                             IdResultType *idResultType1,
489                             IdResult *idResult2,
490                             IdRefList *constituentsList)
491 {
492     spv::Op _op;
493     uint32_t _length;
494     GetInstructionOpAndLength(_instruction, &_op, &_length);
495     ASSERT(_op == spv::OpConstantComposite);
496     uint32_t _o    = 1;
497     *idResultType1 = IdResultType(_instruction[_o++]);
498     *idResult2     = IdResult(_instruction[_o++]);
499     if (constituentsList)
500     {
501         while (_o < _length)
502         {
503             constituentsList->emplace_back(_instruction[_o++]);
504         }
505     }
506 }
ParseConstantNull(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2)507 void ParseConstantNull(const uint32_t *_instruction,
508                        IdResultType *idResultType1,
509                        IdResult *idResult2)
510 {
511     spv::Op _op;
512     uint32_t _length;
513     GetInstructionOpAndLength(_instruction, &_op, &_length);
514     ASSERT(_op == spv::OpConstantNull);
515     uint32_t _o    = 1;
516     *idResultType1 = IdResultType(_instruction[_o++]);
517     *idResult2     = IdResult(_instruction[_o++]);
518 }
ParseSpecConstantTrue(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2)519 void ParseSpecConstantTrue(const uint32_t *_instruction,
520                            IdResultType *idResultType1,
521                            IdResult *idResult2)
522 {
523     spv::Op _op;
524     uint32_t _length;
525     GetInstructionOpAndLength(_instruction, &_op, &_length);
526     ASSERT(_op == spv::OpSpecConstantTrue);
527     uint32_t _o    = 1;
528     *idResultType1 = IdResultType(_instruction[_o++]);
529     *idResult2     = IdResult(_instruction[_o++]);
530 }
ParseSpecConstantFalse(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2)531 void ParseSpecConstantFalse(const uint32_t *_instruction,
532                             IdResultType *idResultType1,
533                             IdResult *idResult2)
534 {
535     spv::Op _op;
536     uint32_t _length;
537     GetInstructionOpAndLength(_instruction, &_op, &_length);
538     ASSERT(_op == spv::OpSpecConstantFalse);
539     uint32_t _o    = 1;
540     *idResultType1 = IdResultType(_instruction[_o++]);
541     *idResult2     = IdResult(_instruction[_o++]);
542 }
ParseSpecConstant(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,LiteralContextDependentNumber * value)543 void ParseSpecConstant(const uint32_t *_instruction,
544                        IdResultType *idResultType1,
545                        IdResult *idResult2,
546                        LiteralContextDependentNumber *value)
547 {
548     spv::Op _op;
549     uint32_t _length;
550     GetInstructionOpAndLength(_instruction, &_op, &_length);
551     ASSERT(_op == spv::OpSpecConstant);
552     uint32_t _o    = 1;
553     *idResultType1 = IdResultType(_instruction[_o++]);
554     *idResult2     = IdResult(_instruction[_o++]);
555     *value         = LiteralContextDependentNumber(_instruction[_o++]);
556 }
ParseSpecConstantComposite(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRefList * constituentsList)557 void ParseSpecConstantComposite(const uint32_t *_instruction,
558                                 IdResultType *idResultType1,
559                                 IdResult *idResult2,
560                                 IdRefList *constituentsList)
561 {
562     spv::Op _op;
563     uint32_t _length;
564     GetInstructionOpAndLength(_instruction, &_op, &_length);
565     ASSERT(_op == spv::OpSpecConstantComposite);
566     uint32_t _o    = 1;
567     *idResultType1 = IdResultType(_instruction[_o++]);
568     *idResult2     = IdResult(_instruction[_o++]);
569     if (constituentsList)
570     {
571         while (_o < _length)
572         {
573             constituentsList->emplace_back(_instruction[_o++]);
574         }
575     }
576 }
ParseFunction(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,spv::FunctionControlMask * functionControl3,IdRef * functionType)577 void ParseFunction(const uint32_t *_instruction,
578                    IdResultType *idResultType1,
579                    IdResult *idResult2,
580                    spv::FunctionControlMask *functionControl3,
581                    IdRef *functionType)
582 {
583     spv::Op _op;
584     uint32_t _length;
585     GetInstructionOpAndLength(_instruction, &_op, &_length);
586     ASSERT(_op == spv::OpFunction);
587     uint32_t _o       = 1;
588     *idResultType1    = IdResultType(_instruction[_o++]);
589     *idResult2        = IdResult(_instruction[_o++]);
590     *functionControl3 = spv::FunctionControlMask(_instruction[_o++]);
591     *functionType     = IdRef(_instruction[_o++]);
592 }
ParseFunctionParameter(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2)593 void ParseFunctionParameter(const uint32_t *_instruction,
594                             IdResultType *idResultType1,
595                             IdResult *idResult2)
596 {
597     spv::Op _op;
598     uint32_t _length;
599     GetInstructionOpAndLength(_instruction, &_op, &_length);
600     ASSERT(_op == spv::OpFunctionParameter);
601     uint32_t _o    = 1;
602     *idResultType1 = IdResultType(_instruction[_o++]);
603     *idResult2     = IdResult(_instruction[_o++]);
604 }
ParseFunctionCall(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * function,IdRefList * argumentList)605 void ParseFunctionCall(const uint32_t *_instruction,
606                        IdResultType *idResultType1,
607                        IdResult *idResult2,
608                        IdRef *function,
609                        IdRefList *argumentList)
610 {
611     spv::Op _op;
612     uint32_t _length;
613     GetInstructionOpAndLength(_instruction, &_op, &_length);
614     ASSERT(_op == spv::OpFunctionCall);
615     uint32_t _o    = 1;
616     *idResultType1 = IdResultType(_instruction[_o++]);
617     *idResult2     = IdResult(_instruction[_o++]);
618     *function      = IdRef(_instruction[_o++]);
619     if (argumentList)
620     {
621         while (_o < _length)
622         {
623             argumentList->emplace_back(_instruction[_o++]);
624         }
625     }
626 }
ParseVariable(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,spv::StorageClass * storageClass3,IdRef * initializer)627 void ParseVariable(const uint32_t *_instruction,
628                    IdResultType *idResultType1,
629                    IdResult *idResult2,
630                    spv::StorageClass *storageClass3,
631                    IdRef *initializer)
632 {
633     spv::Op _op;
634     uint32_t _length;
635     GetInstructionOpAndLength(_instruction, &_op, &_length);
636     ASSERT(_op == spv::OpVariable);
637     uint32_t _o    = 1;
638     *idResultType1 = IdResultType(_instruction[_o++]);
639     *idResult2     = IdResult(_instruction[_o++]);
640     *storageClass3 = spv::StorageClass(_instruction[_o++]);
641     if (initializer && _o < _length)
642     {
643         *initializer = IdRef(_instruction[_o++]);
644     }
645 }
ParseImageTexelPointer(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * image,IdRef * coordinate,IdRef * sample)646 void ParseImageTexelPointer(const uint32_t *_instruction,
647                             IdResultType *idResultType1,
648                             IdResult *idResult2,
649                             IdRef *image,
650                             IdRef *coordinate,
651                             IdRef *sample)
652 {
653     spv::Op _op;
654     uint32_t _length;
655     GetInstructionOpAndLength(_instruction, &_op, &_length);
656     ASSERT(_op == spv::OpImageTexelPointer);
657     uint32_t _o    = 1;
658     *idResultType1 = IdResultType(_instruction[_o++]);
659     *idResult2     = IdResult(_instruction[_o++]);
660     *image         = IdRef(_instruction[_o++]);
661     *coordinate    = IdRef(_instruction[_o++]);
662     *sample        = IdRef(_instruction[_o++]);
663 }
ParseLoad(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * pointer,spv::MemoryAccessMask * memoryAccess4)664 void ParseLoad(const uint32_t *_instruction,
665                IdResultType *idResultType1,
666                IdResult *idResult2,
667                IdRef *pointer,
668                spv::MemoryAccessMask *memoryAccess4)
669 {
670     spv::Op _op;
671     uint32_t _length;
672     GetInstructionOpAndLength(_instruction, &_op, &_length);
673     ASSERT(_op == spv::OpLoad);
674     uint32_t _o    = 1;
675     *idResultType1 = IdResultType(_instruction[_o++]);
676     *idResult2     = IdResult(_instruction[_o++]);
677     *pointer       = IdRef(_instruction[_o++]);
678     if (memoryAccess4 && _o < _length)
679     {
680         *memoryAccess4 = spv::MemoryAccessMask(_instruction[_o++]);
681     }
682 }
ParseStore(const uint32_t * _instruction,IdRef * pointer,IdRef * object,spv::MemoryAccessMask * memoryAccess3)683 void ParseStore(const uint32_t *_instruction,
684                 IdRef *pointer,
685                 IdRef *object,
686                 spv::MemoryAccessMask *memoryAccess3)
687 {
688     spv::Op _op;
689     uint32_t _length;
690     GetInstructionOpAndLength(_instruction, &_op, &_length);
691     ASSERT(_op == spv::OpStore);
692     uint32_t _o = 1;
693     *pointer    = IdRef(_instruction[_o++]);
694     *object     = IdRef(_instruction[_o++]);
695     if (memoryAccess3 && _o < _length)
696     {
697         *memoryAccess3 = spv::MemoryAccessMask(_instruction[_o++]);
698     }
699 }
ParseCopyMemory(const uint32_t * _instruction,IdRef * target,IdRef * source,spv::MemoryAccessMask * memoryAccess3,spv::MemoryAccessMask * memoryAccess4)700 void ParseCopyMemory(const uint32_t *_instruction,
701                      IdRef *target,
702                      IdRef *source,
703                      spv::MemoryAccessMask *memoryAccess3,
704                      spv::MemoryAccessMask *memoryAccess4)
705 {
706     spv::Op _op;
707     uint32_t _length;
708     GetInstructionOpAndLength(_instruction, &_op, &_length);
709     ASSERT(_op == spv::OpCopyMemory);
710     uint32_t _o = 1;
711     *target     = IdRef(_instruction[_o++]);
712     *source     = IdRef(_instruction[_o++]);
713     if (memoryAccess3 && _o < _length)
714     {
715         *memoryAccess3 = spv::MemoryAccessMask(_instruction[_o++]);
716     }
717     if (memoryAccess4 && _o < _length)
718     {
719         *memoryAccess4 = spv::MemoryAccessMask(_instruction[_o++]);
720     }
721 }
ParseAccessChain(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * base,IdRefList * indexesList)722 void ParseAccessChain(const uint32_t *_instruction,
723                       IdResultType *idResultType1,
724                       IdResult *idResult2,
725                       IdRef *base,
726                       IdRefList *indexesList)
727 {
728     spv::Op _op;
729     uint32_t _length;
730     GetInstructionOpAndLength(_instruction, &_op, &_length);
731     ASSERT(_op == spv::OpAccessChain);
732     uint32_t _o    = 1;
733     *idResultType1 = IdResultType(_instruction[_o++]);
734     *idResult2     = IdResult(_instruction[_o++]);
735     *base          = IdRef(_instruction[_o++]);
736     if (indexesList)
737     {
738         while (_o < _length)
739         {
740             indexesList->emplace_back(_instruction[_o++]);
741         }
742     }
743 }
ParseInBoundsAccessChain(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * base,IdRefList * indexesList)744 void ParseInBoundsAccessChain(const uint32_t *_instruction,
745                               IdResultType *idResultType1,
746                               IdResult *idResult2,
747                               IdRef *base,
748                               IdRefList *indexesList)
749 {
750     spv::Op _op;
751     uint32_t _length;
752     GetInstructionOpAndLength(_instruction, &_op, &_length);
753     ASSERT(_op == spv::OpInBoundsAccessChain);
754     uint32_t _o    = 1;
755     *idResultType1 = IdResultType(_instruction[_o++]);
756     *idResult2     = IdResult(_instruction[_o++]);
757     *base          = IdRef(_instruction[_o++]);
758     if (indexesList)
759     {
760         while (_o < _length)
761         {
762             indexesList->emplace_back(_instruction[_o++]);
763         }
764     }
765 }
ParseArrayLength(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * structure,LiteralInteger * arraymember)766 void ParseArrayLength(const uint32_t *_instruction,
767                       IdResultType *idResultType1,
768                       IdResult *idResult2,
769                       IdRef *structure,
770                       LiteralInteger *arraymember)
771 {
772     spv::Op _op;
773     uint32_t _length;
774     GetInstructionOpAndLength(_instruction, &_op, &_length);
775     ASSERT(_op == spv::OpArrayLength);
776     uint32_t _o    = 1;
777     *idResultType1 = IdResultType(_instruction[_o++]);
778     *idResult2     = IdResult(_instruction[_o++]);
779     *structure     = IdRef(_instruction[_o++]);
780     *arraymember   = LiteralInteger(_instruction[_o++]);
781 }
ParseDecorate(const uint32_t * _instruction,IdRef * target,spv::Decoration * decoration2,LiteralIntegerList * valuesList)782 void ParseDecorate(const uint32_t *_instruction,
783                    IdRef *target,
784                    spv::Decoration *decoration2,
785                    LiteralIntegerList *valuesList)
786 {
787     spv::Op _op;
788     uint32_t _length;
789     GetInstructionOpAndLength(_instruction, &_op, &_length);
790     ASSERT(_op == spv::OpDecorate);
791     uint32_t _o  = 1;
792     *target      = IdRef(_instruction[_o++]);
793     *decoration2 = spv::Decoration(_instruction[_o++]);
794     if (valuesList)
795     {
796         while (_o < _length)
797         {
798             valuesList->emplace_back(_instruction[_o++]);
799         }
800     }
801 }
ParseMemberDecorate(const uint32_t * _instruction,IdRef * structureType,LiteralInteger * member,spv::Decoration * decoration3,LiteralIntegerList * valuesList)802 void ParseMemberDecorate(const uint32_t *_instruction,
803                          IdRef *structureType,
804                          LiteralInteger *member,
805                          spv::Decoration *decoration3,
806                          LiteralIntegerList *valuesList)
807 {
808     spv::Op _op;
809     uint32_t _length;
810     GetInstructionOpAndLength(_instruction, &_op, &_length);
811     ASSERT(_op == spv::OpMemberDecorate);
812     uint32_t _o    = 1;
813     *structureType = IdRef(_instruction[_o++]);
814     *member        = LiteralInteger(_instruction[_o++]);
815     *decoration3   = spv::Decoration(_instruction[_o++]);
816     if (valuesList)
817     {
818         while (_o < _length)
819         {
820             valuesList->emplace_back(_instruction[_o++]);
821         }
822     }
823 }
ParseDecorationGroup(const uint32_t * _instruction,IdResult * idResult1)824 void ParseDecorationGroup(const uint32_t *_instruction, IdResult *idResult1)
825 {
826     spv::Op _op;
827     uint32_t _length;
828     GetInstructionOpAndLength(_instruction, &_op, &_length);
829     ASSERT(_op == spv::OpDecorationGroup);
830     uint32_t _o = 1;
831     *idResult1  = IdResult(_instruction[_o++]);
832 }
ParseGroupDecorate(const uint32_t * _instruction,IdRef * decorationGroup,IdRefList * targetsList)833 void ParseGroupDecorate(const uint32_t *_instruction,
834                         IdRef *decorationGroup,
835                         IdRefList *targetsList)
836 {
837     spv::Op _op;
838     uint32_t _length;
839     GetInstructionOpAndLength(_instruction, &_op, &_length);
840     ASSERT(_op == spv::OpGroupDecorate);
841     uint32_t _o      = 1;
842     *decorationGroup = IdRef(_instruction[_o++]);
843     if (targetsList)
844     {
845         while (_o < _length)
846         {
847             targetsList->emplace_back(_instruction[_o++]);
848         }
849     }
850 }
ParseGroupMemberDecorate(const uint32_t * _instruction,IdRef * decorationGroup,PairIdRefLiteralIntegerList * targetsPairList)851 void ParseGroupMemberDecorate(const uint32_t *_instruction,
852                               IdRef *decorationGroup,
853                               PairIdRefLiteralIntegerList *targetsPairList)
854 {
855     spv::Op _op;
856     uint32_t _length;
857     GetInstructionOpAndLength(_instruction, &_op, &_length);
858     ASSERT(_op == spv::OpGroupMemberDecorate);
859     uint32_t _o      = 1;
860     *decorationGroup = IdRef(_instruction[_o++]);
861     if (targetsPairList)
862     {
863         while (_o < _length)
864         {
865             targetsPairList->emplace_back(PairIdRefLiteralInteger{
866                 IdRef(_instruction[_o]), LiteralInteger(_instruction[_o + 1])});
867             _o += 2;
868         }
869     }
870 }
ParseVectorExtractDynamic(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * vector,IdRef * index)871 void ParseVectorExtractDynamic(const uint32_t *_instruction,
872                                IdResultType *idResultType1,
873                                IdResult *idResult2,
874                                IdRef *vector,
875                                IdRef *index)
876 {
877     spv::Op _op;
878     uint32_t _length;
879     GetInstructionOpAndLength(_instruction, &_op, &_length);
880     ASSERT(_op == spv::OpVectorExtractDynamic);
881     uint32_t _o    = 1;
882     *idResultType1 = IdResultType(_instruction[_o++]);
883     *idResult2     = IdResult(_instruction[_o++]);
884     *vector        = IdRef(_instruction[_o++]);
885     *index         = IdRef(_instruction[_o++]);
886 }
ParseVectorInsertDynamic(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * vector,IdRef * component,IdRef * index)887 void ParseVectorInsertDynamic(const uint32_t *_instruction,
888                               IdResultType *idResultType1,
889                               IdResult *idResult2,
890                               IdRef *vector,
891                               IdRef *component,
892                               IdRef *index)
893 {
894     spv::Op _op;
895     uint32_t _length;
896     GetInstructionOpAndLength(_instruction, &_op, &_length);
897     ASSERT(_op == spv::OpVectorInsertDynamic);
898     uint32_t _o    = 1;
899     *idResultType1 = IdResultType(_instruction[_o++]);
900     *idResult2     = IdResult(_instruction[_o++]);
901     *vector        = IdRef(_instruction[_o++]);
902     *component     = IdRef(_instruction[_o++]);
903     *index         = IdRef(_instruction[_o++]);
904 }
ParseVectorShuffle(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * vector1,IdRef * vector2,LiteralIntegerList * componentsList)905 void ParseVectorShuffle(const uint32_t *_instruction,
906                         IdResultType *idResultType1,
907                         IdResult *idResult2,
908                         IdRef *vector1,
909                         IdRef *vector2,
910                         LiteralIntegerList *componentsList)
911 {
912     spv::Op _op;
913     uint32_t _length;
914     GetInstructionOpAndLength(_instruction, &_op, &_length);
915     ASSERT(_op == spv::OpVectorShuffle);
916     uint32_t _o    = 1;
917     *idResultType1 = IdResultType(_instruction[_o++]);
918     *idResult2     = IdResult(_instruction[_o++]);
919     *vector1       = IdRef(_instruction[_o++]);
920     *vector2       = IdRef(_instruction[_o++]);
921     if (componentsList)
922     {
923         while (_o < _length)
924         {
925             componentsList->emplace_back(_instruction[_o++]);
926         }
927     }
928 }
ParseCompositeConstruct(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRefList * constituentsList)929 void ParseCompositeConstruct(const uint32_t *_instruction,
930                              IdResultType *idResultType1,
931                              IdResult *idResult2,
932                              IdRefList *constituentsList)
933 {
934     spv::Op _op;
935     uint32_t _length;
936     GetInstructionOpAndLength(_instruction, &_op, &_length);
937     ASSERT(_op == spv::OpCompositeConstruct);
938     uint32_t _o    = 1;
939     *idResultType1 = IdResultType(_instruction[_o++]);
940     *idResult2     = IdResult(_instruction[_o++]);
941     if (constituentsList)
942     {
943         while (_o < _length)
944         {
945             constituentsList->emplace_back(_instruction[_o++]);
946         }
947     }
948 }
ParseCompositeExtract(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * composite,LiteralIntegerList * indexesList)949 void ParseCompositeExtract(const uint32_t *_instruction,
950                            IdResultType *idResultType1,
951                            IdResult *idResult2,
952                            IdRef *composite,
953                            LiteralIntegerList *indexesList)
954 {
955     spv::Op _op;
956     uint32_t _length;
957     GetInstructionOpAndLength(_instruction, &_op, &_length);
958     ASSERT(_op == spv::OpCompositeExtract);
959     uint32_t _o    = 1;
960     *idResultType1 = IdResultType(_instruction[_o++]);
961     *idResult2     = IdResult(_instruction[_o++]);
962     *composite     = IdRef(_instruction[_o++]);
963     if (indexesList)
964     {
965         while (_o < _length)
966         {
967             indexesList->emplace_back(_instruction[_o++]);
968         }
969     }
970 }
ParseCompositeInsert(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * object,IdRef * composite,LiteralIntegerList * indexesList)971 void ParseCompositeInsert(const uint32_t *_instruction,
972                           IdResultType *idResultType1,
973                           IdResult *idResult2,
974                           IdRef *object,
975                           IdRef *composite,
976                           LiteralIntegerList *indexesList)
977 {
978     spv::Op _op;
979     uint32_t _length;
980     GetInstructionOpAndLength(_instruction, &_op, &_length);
981     ASSERT(_op == spv::OpCompositeInsert);
982     uint32_t _o    = 1;
983     *idResultType1 = IdResultType(_instruction[_o++]);
984     *idResult2     = IdResult(_instruction[_o++]);
985     *object        = IdRef(_instruction[_o++]);
986     *composite     = IdRef(_instruction[_o++]);
987     if (indexesList)
988     {
989         while (_o < _length)
990         {
991             indexesList->emplace_back(_instruction[_o++]);
992         }
993     }
994 }
ParseCopyObject(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand)995 void ParseCopyObject(const uint32_t *_instruction,
996                      IdResultType *idResultType1,
997                      IdResult *idResult2,
998                      IdRef *operand)
999 {
1000     spv::Op _op;
1001     uint32_t _length;
1002     GetInstructionOpAndLength(_instruction, &_op, &_length);
1003     ASSERT(_op == spv::OpCopyObject);
1004     uint32_t _o    = 1;
1005     *idResultType1 = IdResultType(_instruction[_o++]);
1006     *idResult2     = IdResult(_instruction[_o++]);
1007     *operand       = IdRef(_instruction[_o++]);
1008 }
ParseTranspose(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * matrix)1009 void ParseTranspose(const uint32_t *_instruction,
1010                     IdResultType *idResultType1,
1011                     IdResult *idResult2,
1012                     IdRef *matrix)
1013 {
1014     spv::Op _op;
1015     uint32_t _length;
1016     GetInstructionOpAndLength(_instruction, &_op, &_length);
1017     ASSERT(_op == spv::OpTranspose);
1018     uint32_t _o    = 1;
1019     *idResultType1 = IdResultType(_instruction[_o++]);
1020     *idResult2     = IdResult(_instruction[_o++]);
1021     *matrix        = IdRef(_instruction[_o++]);
1022 }
ParseSampledImage(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * image,IdRef * sampler)1023 void ParseSampledImage(const uint32_t *_instruction,
1024                        IdResultType *idResultType1,
1025                        IdResult *idResult2,
1026                        IdRef *image,
1027                        IdRef *sampler)
1028 {
1029     spv::Op _op;
1030     uint32_t _length;
1031     GetInstructionOpAndLength(_instruction, &_op, &_length);
1032     ASSERT(_op == spv::OpSampledImage);
1033     uint32_t _o    = 1;
1034     *idResultType1 = IdResultType(_instruction[_o++]);
1035     *idResult2     = IdResult(_instruction[_o++]);
1036     *image         = IdRef(_instruction[_o++]);
1037     *sampler       = IdRef(_instruction[_o++]);
1038 }
ParseImageSampleImplicitLod(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * sampledImage,IdRef * coordinate,spv::ImageOperandsMask * imageOperands5,IdRefList * imageOperandIdsList)1039 void ParseImageSampleImplicitLod(const uint32_t *_instruction,
1040                                  IdResultType *idResultType1,
1041                                  IdResult *idResult2,
1042                                  IdRef *sampledImage,
1043                                  IdRef *coordinate,
1044                                  spv::ImageOperandsMask *imageOperands5,
1045                                  IdRefList *imageOperandIdsList)
1046 {
1047     spv::Op _op;
1048     uint32_t _length;
1049     GetInstructionOpAndLength(_instruction, &_op, &_length);
1050     ASSERT(_op == spv::OpImageSampleImplicitLod);
1051     uint32_t _o    = 1;
1052     *idResultType1 = IdResultType(_instruction[_o++]);
1053     *idResult2     = IdResult(_instruction[_o++]);
1054     *sampledImage  = IdRef(_instruction[_o++]);
1055     *coordinate    = IdRef(_instruction[_o++]);
1056     if (imageOperands5 && _o < _length)
1057     {
1058         *imageOperands5 = spv::ImageOperandsMask(_instruction[_o++]);
1059     }
1060     if (imageOperandIdsList)
1061     {
1062         while (_o < _length)
1063         {
1064             imageOperandIdsList->emplace_back(_instruction[_o++]);
1065         }
1066     }
1067 }
ParseImageSampleExplicitLod(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * sampledImage,IdRef * coordinate,spv::ImageOperandsMask * imageOperands5,IdRefList * imageOperandIdsList)1068 void ParseImageSampleExplicitLod(const uint32_t *_instruction,
1069                                  IdResultType *idResultType1,
1070                                  IdResult *idResult2,
1071                                  IdRef *sampledImage,
1072                                  IdRef *coordinate,
1073                                  spv::ImageOperandsMask *imageOperands5,
1074                                  IdRefList *imageOperandIdsList)
1075 {
1076     spv::Op _op;
1077     uint32_t _length;
1078     GetInstructionOpAndLength(_instruction, &_op, &_length);
1079     ASSERT(_op == spv::OpImageSampleExplicitLod);
1080     uint32_t _o     = 1;
1081     *idResultType1  = IdResultType(_instruction[_o++]);
1082     *idResult2      = IdResult(_instruction[_o++]);
1083     *sampledImage   = IdRef(_instruction[_o++]);
1084     *coordinate     = IdRef(_instruction[_o++]);
1085     *imageOperands5 = spv::ImageOperandsMask(_instruction[_o++]);
1086     if (imageOperandIdsList)
1087     {
1088         while (_o < _length)
1089         {
1090             imageOperandIdsList->emplace_back(_instruction[_o++]);
1091         }
1092     }
1093 }
ParseImageSampleDrefImplicitLod(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * sampledImage,IdRef * coordinate,IdRef * dref,spv::ImageOperandsMask * imageOperands6,IdRefList * imageOperandIdsList)1094 void ParseImageSampleDrefImplicitLod(const uint32_t *_instruction,
1095                                      IdResultType *idResultType1,
1096                                      IdResult *idResult2,
1097                                      IdRef *sampledImage,
1098                                      IdRef *coordinate,
1099                                      IdRef *dref,
1100                                      spv::ImageOperandsMask *imageOperands6,
1101                                      IdRefList *imageOperandIdsList)
1102 {
1103     spv::Op _op;
1104     uint32_t _length;
1105     GetInstructionOpAndLength(_instruction, &_op, &_length);
1106     ASSERT(_op == spv::OpImageSampleDrefImplicitLod);
1107     uint32_t _o    = 1;
1108     *idResultType1 = IdResultType(_instruction[_o++]);
1109     *idResult2     = IdResult(_instruction[_o++]);
1110     *sampledImage  = IdRef(_instruction[_o++]);
1111     *coordinate    = IdRef(_instruction[_o++]);
1112     *dref          = IdRef(_instruction[_o++]);
1113     if (imageOperands6 && _o < _length)
1114     {
1115         *imageOperands6 = spv::ImageOperandsMask(_instruction[_o++]);
1116     }
1117     if (imageOperandIdsList)
1118     {
1119         while (_o < _length)
1120         {
1121             imageOperandIdsList->emplace_back(_instruction[_o++]);
1122         }
1123     }
1124 }
ParseImageSampleDrefExplicitLod(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * sampledImage,IdRef * coordinate,IdRef * dref,spv::ImageOperandsMask * imageOperands6,IdRefList * imageOperandIdsList)1125 void ParseImageSampleDrefExplicitLod(const uint32_t *_instruction,
1126                                      IdResultType *idResultType1,
1127                                      IdResult *idResult2,
1128                                      IdRef *sampledImage,
1129                                      IdRef *coordinate,
1130                                      IdRef *dref,
1131                                      spv::ImageOperandsMask *imageOperands6,
1132                                      IdRefList *imageOperandIdsList)
1133 {
1134     spv::Op _op;
1135     uint32_t _length;
1136     GetInstructionOpAndLength(_instruction, &_op, &_length);
1137     ASSERT(_op == spv::OpImageSampleDrefExplicitLod);
1138     uint32_t _o     = 1;
1139     *idResultType1  = IdResultType(_instruction[_o++]);
1140     *idResult2      = IdResult(_instruction[_o++]);
1141     *sampledImage   = IdRef(_instruction[_o++]);
1142     *coordinate     = IdRef(_instruction[_o++]);
1143     *dref           = IdRef(_instruction[_o++]);
1144     *imageOperands6 = spv::ImageOperandsMask(_instruction[_o++]);
1145     if (imageOperandIdsList)
1146     {
1147         while (_o < _length)
1148         {
1149             imageOperandIdsList->emplace_back(_instruction[_o++]);
1150         }
1151     }
1152 }
ParseImageSampleProjImplicitLod(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * sampledImage,IdRef * coordinate,spv::ImageOperandsMask * imageOperands5,IdRefList * imageOperandIdsList)1153 void ParseImageSampleProjImplicitLod(const uint32_t *_instruction,
1154                                      IdResultType *idResultType1,
1155                                      IdResult *idResult2,
1156                                      IdRef *sampledImage,
1157                                      IdRef *coordinate,
1158                                      spv::ImageOperandsMask *imageOperands5,
1159                                      IdRefList *imageOperandIdsList)
1160 {
1161     spv::Op _op;
1162     uint32_t _length;
1163     GetInstructionOpAndLength(_instruction, &_op, &_length);
1164     ASSERT(_op == spv::OpImageSampleProjImplicitLod);
1165     uint32_t _o    = 1;
1166     *idResultType1 = IdResultType(_instruction[_o++]);
1167     *idResult2     = IdResult(_instruction[_o++]);
1168     *sampledImage  = IdRef(_instruction[_o++]);
1169     *coordinate    = IdRef(_instruction[_o++]);
1170     if (imageOperands5 && _o < _length)
1171     {
1172         *imageOperands5 = spv::ImageOperandsMask(_instruction[_o++]);
1173     }
1174     if (imageOperandIdsList)
1175     {
1176         while (_o < _length)
1177         {
1178             imageOperandIdsList->emplace_back(_instruction[_o++]);
1179         }
1180     }
1181 }
ParseImageSampleProjExplicitLod(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * sampledImage,IdRef * coordinate,spv::ImageOperandsMask * imageOperands5,IdRefList * imageOperandIdsList)1182 void ParseImageSampleProjExplicitLod(const uint32_t *_instruction,
1183                                      IdResultType *idResultType1,
1184                                      IdResult *idResult2,
1185                                      IdRef *sampledImage,
1186                                      IdRef *coordinate,
1187                                      spv::ImageOperandsMask *imageOperands5,
1188                                      IdRefList *imageOperandIdsList)
1189 {
1190     spv::Op _op;
1191     uint32_t _length;
1192     GetInstructionOpAndLength(_instruction, &_op, &_length);
1193     ASSERT(_op == spv::OpImageSampleProjExplicitLod);
1194     uint32_t _o     = 1;
1195     *idResultType1  = IdResultType(_instruction[_o++]);
1196     *idResult2      = IdResult(_instruction[_o++]);
1197     *sampledImage   = IdRef(_instruction[_o++]);
1198     *coordinate     = IdRef(_instruction[_o++]);
1199     *imageOperands5 = spv::ImageOperandsMask(_instruction[_o++]);
1200     if (imageOperandIdsList)
1201     {
1202         while (_o < _length)
1203         {
1204             imageOperandIdsList->emplace_back(_instruction[_o++]);
1205         }
1206     }
1207 }
ParseImageSampleProjDrefImplicitLod(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * sampledImage,IdRef * coordinate,IdRef * dref,spv::ImageOperandsMask * imageOperands6,IdRefList * imageOperandIdsList)1208 void ParseImageSampleProjDrefImplicitLod(const uint32_t *_instruction,
1209                                          IdResultType *idResultType1,
1210                                          IdResult *idResult2,
1211                                          IdRef *sampledImage,
1212                                          IdRef *coordinate,
1213                                          IdRef *dref,
1214                                          spv::ImageOperandsMask *imageOperands6,
1215                                          IdRefList *imageOperandIdsList)
1216 {
1217     spv::Op _op;
1218     uint32_t _length;
1219     GetInstructionOpAndLength(_instruction, &_op, &_length);
1220     ASSERT(_op == spv::OpImageSampleProjDrefImplicitLod);
1221     uint32_t _o    = 1;
1222     *idResultType1 = IdResultType(_instruction[_o++]);
1223     *idResult2     = IdResult(_instruction[_o++]);
1224     *sampledImage  = IdRef(_instruction[_o++]);
1225     *coordinate    = IdRef(_instruction[_o++]);
1226     *dref          = IdRef(_instruction[_o++]);
1227     if (imageOperands6 && _o < _length)
1228     {
1229         *imageOperands6 = spv::ImageOperandsMask(_instruction[_o++]);
1230     }
1231     if (imageOperandIdsList)
1232     {
1233         while (_o < _length)
1234         {
1235             imageOperandIdsList->emplace_back(_instruction[_o++]);
1236         }
1237     }
1238 }
ParseImageSampleProjDrefExplicitLod(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * sampledImage,IdRef * coordinate,IdRef * dref,spv::ImageOperandsMask * imageOperands6,IdRefList * imageOperandIdsList)1239 void ParseImageSampleProjDrefExplicitLod(const uint32_t *_instruction,
1240                                          IdResultType *idResultType1,
1241                                          IdResult *idResult2,
1242                                          IdRef *sampledImage,
1243                                          IdRef *coordinate,
1244                                          IdRef *dref,
1245                                          spv::ImageOperandsMask *imageOperands6,
1246                                          IdRefList *imageOperandIdsList)
1247 {
1248     spv::Op _op;
1249     uint32_t _length;
1250     GetInstructionOpAndLength(_instruction, &_op, &_length);
1251     ASSERT(_op == spv::OpImageSampleProjDrefExplicitLod);
1252     uint32_t _o     = 1;
1253     *idResultType1  = IdResultType(_instruction[_o++]);
1254     *idResult2      = IdResult(_instruction[_o++]);
1255     *sampledImage   = IdRef(_instruction[_o++]);
1256     *coordinate     = IdRef(_instruction[_o++]);
1257     *dref           = IdRef(_instruction[_o++]);
1258     *imageOperands6 = spv::ImageOperandsMask(_instruction[_o++]);
1259     if (imageOperandIdsList)
1260     {
1261         while (_o < _length)
1262         {
1263             imageOperandIdsList->emplace_back(_instruction[_o++]);
1264         }
1265     }
1266 }
ParseImageFetch(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * image,IdRef * coordinate,spv::ImageOperandsMask * imageOperands5,IdRefList * imageOperandIdsList)1267 void ParseImageFetch(const uint32_t *_instruction,
1268                      IdResultType *idResultType1,
1269                      IdResult *idResult2,
1270                      IdRef *image,
1271                      IdRef *coordinate,
1272                      spv::ImageOperandsMask *imageOperands5,
1273                      IdRefList *imageOperandIdsList)
1274 {
1275     spv::Op _op;
1276     uint32_t _length;
1277     GetInstructionOpAndLength(_instruction, &_op, &_length);
1278     ASSERT(_op == spv::OpImageFetch);
1279     uint32_t _o    = 1;
1280     *idResultType1 = IdResultType(_instruction[_o++]);
1281     *idResult2     = IdResult(_instruction[_o++]);
1282     *image         = IdRef(_instruction[_o++]);
1283     *coordinate    = IdRef(_instruction[_o++]);
1284     if (imageOperands5 && _o < _length)
1285     {
1286         *imageOperands5 = spv::ImageOperandsMask(_instruction[_o++]);
1287     }
1288     if (imageOperandIdsList)
1289     {
1290         while (_o < _length)
1291         {
1292             imageOperandIdsList->emplace_back(_instruction[_o++]);
1293         }
1294     }
1295 }
ParseImageGather(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * sampledImage,IdRef * coordinate,IdRef * component,spv::ImageOperandsMask * imageOperands6,IdRefList * imageOperandIdsList)1296 void ParseImageGather(const uint32_t *_instruction,
1297                       IdResultType *idResultType1,
1298                       IdResult *idResult2,
1299                       IdRef *sampledImage,
1300                       IdRef *coordinate,
1301                       IdRef *component,
1302                       spv::ImageOperandsMask *imageOperands6,
1303                       IdRefList *imageOperandIdsList)
1304 {
1305     spv::Op _op;
1306     uint32_t _length;
1307     GetInstructionOpAndLength(_instruction, &_op, &_length);
1308     ASSERT(_op == spv::OpImageGather);
1309     uint32_t _o    = 1;
1310     *idResultType1 = IdResultType(_instruction[_o++]);
1311     *idResult2     = IdResult(_instruction[_o++]);
1312     *sampledImage  = IdRef(_instruction[_o++]);
1313     *coordinate    = IdRef(_instruction[_o++]);
1314     *component     = IdRef(_instruction[_o++]);
1315     if (imageOperands6 && _o < _length)
1316     {
1317         *imageOperands6 = spv::ImageOperandsMask(_instruction[_o++]);
1318     }
1319     if (imageOperandIdsList)
1320     {
1321         while (_o < _length)
1322         {
1323             imageOperandIdsList->emplace_back(_instruction[_o++]);
1324         }
1325     }
1326 }
ParseImageDrefGather(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * sampledImage,IdRef * coordinate,IdRef * dref,spv::ImageOperandsMask * imageOperands6,IdRefList * imageOperandIdsList)1327 void ParseImageDrefGather(const uint32_t *_instruction,
1328                           IdResultType *idResultType1,
1329                           IdResult *idResult2,
1330                           IdRef *sampledImage,
1331                           IdRef *coordinate,
1332                           IdRef *dref,
1333                           spv::ImageOperandsMask *imageOperands6,
1334                           IdRefList *imageOperandIdsList)
1335 {
1336     spv::Op _op;
1337     uint32_t _length;
1338     GetInstructionOpAndLength(_instruction, &_op, &_length);
1339     ASSERT(_op == spv::OpImageDrefGather);
1340     uint32_t _o    = 1;
1341     *idResultType1 = IdResultType(_instruction[_o++]);
1342     *idResult2     = IdResult(_instruction[_o++]);
1343     *sampledImage  = IdRef(_instruction[_o++]);
1344     *coordinate    = IdRef(_instruction[_o++]);
1345     *dref          = IdRef(_instruction[_o++]);
1346     if (imageOperands6 && _o < _length)
1347     {
1348         *imageOperands6 = spv::ImageOperandsMask(_instruction[_o++]);
1349     }
1350     if (imageOperandIdsList)
1351     {
1352         while (_o < _length)
1353         {
1354             imageOperandIdsList->emplace_back(_instruction[_o++]);
1355         }
1356     }
1357 }
ParseImageRead(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * image,IdRef * coordinate,spv::ImageOperandsMask * imageOperands5,IdRefList * imageOperandIdsList)1358 void ParseImageRead(const uint32_t *_instruction,
1359                     IdResultType *idResultType1,
1360                     IdResult *idResult2,
1361                     IdRef *image,
1362                     IdRef *coordinate,
1363                     spv::ImageOperandsMask *imageOperands5,
1364                     IdRefList *imageOperandIdsList)
1365 {
1366     spv::Op _op;
1367     uint32_t _length;
1368     GetInstructionOpAndLength(_instruction, &_op, &_length);
1369     ASSERT(_op == spv::OpImageRead);
1370     uint32_t _o    = 1;
1371     *idResultType1 = IdResultType(_instruction[_o++]);
1372     *idResult2     = IdResult(_instruction[_o++]);
1373     *image         = IdRef(_instruction[_o++]);
1374     *coordinate    = IdRef(_instruction[_o++]);
1375     if (imageOperands5 && _o < _length)
1376     {
1377         *imageOperands5 = spv::ImageOperandsMask(_instruction[_o++]);
1378     }
1379     if (imageOperandIdsList)
1380     {
1381         while (_o < _length)
1382         {
1383             imageOperandIdsList->emplace_back(_instruction[_o++]);
1384         }
1385     }
1386 }
ParseImageWrite(const uint32_t * _instruction,IdRef * image,IdRef * coordinate,IdRef * texel,spv::ImageOperandsMask * imageOperands4,IdRefList * imageOperandIdsList)1387 void ParseImageWrite(const uint32_t *_instruction,
1388                      IdRef *image,
1389                      IdRef *coordinate,
1390                      IdRef *texel,
1391                      spv::ImageOperandsMask *imageOperands4,
1392                      IdRefList *imageOperandIdsList)
1393 {
1394     spv::Op _op;
1395     uint32_t _length;
1396     GetInstructionOpAndLength(_instruction, &_op, &_length);
1397     ASSERT(_op == spv::OpImageWrite);
1398     uint32_t _o = 1;
1399     *image      = IdRef(_instruction[_o++]);
1400     *coordinate = IdRef(_instruction[_o++]);
1401     *texel      = IdRef(_instruction[_o++]);
1402     if (imageOperands4 && _o < _length)
1403     {
1404         *imageOperands4 = spv::ImageOperandsMask(_instruction[_o++]);
1405     }
1406     if (imageOperandIdsList)
1407     {
1408         while (_o < _length)
1409         {
1410             imageOperandIdsList->emplace_back(_instruction[_o++]);
1411         }
1412     }
1413 }
ParseImage(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * sampledImage)1414 void ParseImage(const uint32_t *_instruction,
1415                 IdResultType *idResultType1,
1416                 IdResult *idResult2,
1417                 IdRef *sampledImage)
1418 {
1419     spv::Op _op;
1420     uint32_t _length;
1421     GetInstructionOpAndLength(_instruction, &_op, &_length);
1422     ASSERT(_op == spv::OpImage);
1423     uint32_t _o    = 1;
1424     *idResultType1 = IdResultType(_instruction[_o++]);
1425     *idResult2     = IdResult(_instruction[_o++]);
1426     *sampledImage  = IdRef(_instruction[_o++]);
1427 }
ParseImageQuerySizeLod(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * image,IdRef * levelofDetail)1428 void ParseImageQuerySizeLod(const uint32_t *_instruction,
1429                             IdResultType *idResultType1,
1430                             IdResult *idResult2,
1431                             IdRef *image,
1432                             IdRef *levelofDetail)
1433 {
1434     spv::Op _op;
1435     uint32_t _length;
1436     GetInstructionOpAndLength(_instruction, &_op, &_length);
1437     ASSERT(_op == spv::OpImageQuerySizeLod);
1438     uint32_t _o    = 1;
1439     *idResultType1 = IdResultType(_instruction[_o++]);
1440     *idResult2     = IdResult(_instruction[_o++]);
1441     *image         = IdRef(_instruction[_o++]);
1442     *levelofDetail = IdRef(_instruction[_o++]);
1443 }
ParseImageQuerySize(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * image)1444 void ParseImageQuerySize(const uint32_t *_instruction,
1445                          IdResultType *idResultType1,
1446                          IdResult *idResult2,
1447                          IdRef *image)
1448 {
1449     spv::Op _op;
1450     uint32_t _length;
1451     GetInstructionOpAndLength(_instruction, &_op, &_length);
1452     ASSERT(_op == spv::OpImageQuerySize);
1453     uint32_t _o    = 1;
1454     *idResultType1 = IdResultType(_instruction[_o++]);
1455     *idResult2     = IdResult(_instruction[_o++]);
1456     *image         = IdRef(_instruction[_o++]);
1457 }
ParseImageQueryLod(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * sampledImage,IdRef * coordinate)1458 void ParseImageQueryLod(const uint32_t *_instruction,
1459                         IdResultType *idResultType1,
1460                         IdResult *idResult2,
1461                         IdRef *sampledImage,
1462                         IdRef *coordinate)
1463 {
1464     spv::Op _op;
1465     uint32_t _length;
1466     GetInstructionOpAndLength(_instruction, &_op, &_length);
1467     ASSERT(_op == spv::OpImageQueryLod);
1468     uint32_t _o    = 1;
1469     *idResultType1 = IdResultType(_instruction[_o++]);
1470     *idResult2     = IdResult(_instruction[_o++]);
1471     *sampledImage  = IdRef(_instruction[_o++]);
1472     *coordinate    = IdRef(_instruction[_o++]);
1473 }
ParseImageQueryLevels(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * image)1474 void ParseImageQueryLevels(const uint32_t *_instruction,
1475                            IdResultType *idResultType1,
1476                            IdResult *idResult2,
1477                            IdRef *image)
1478 {
1479     spv::Op _op;
1480     uint32_t _length;
1481     GetInstructionOpAndLength(_instruction, &_op, &_length);
1482     ASSERT(_op == spv::OpImageQueryLevels);
1483     uint32_t _o    = 1;
1484     *idResultType1 = IdResultType(_instruction[_o++]);
1485     *idResult2     = IdResult(_instruction[_o++]);
1486     *image         = IdRef(_instruction[_o++]);
1487 }
ParseImageQuerySamples(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * image)1488 void ParseImageQuerySamples(const uint32_t *_instruction,
1489                             IdResultType *idResultType1,
1490                             IdResult *idResult2,
1491                             IdRef *image)
1492 {
1493     spv::Op _op;
1494     uint32_t _length;
1495     GetInstructionOpAndLength(_instruction, &_op, &_length);
1496     ASSERT(_op == spv::OpImageQuerySamples);
1497     uint32_t _o    = 1;
1498     *idResultType1 = IdResultType(_instruction[_o++]);
1499     *idResult2     = IdResult(_instruction[_o++]);
1500     *image         = IdRef(_instruction[_o++]);
1501 }
ParseConvertFToU(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * floatValue)1502 void ParseConvertFToU(const uint32_t *_instruction,
1503                       IdResultType *idResultType1,
1504                       IdResult *idResult2,
1505                       IdRef *floatValue)
1506 {
1507     spv::Op _op;
1508     uint32_t _length;
1509     GetInstructionOpAndLength(_instruction, &_op, &_length);
1510     ASSERT(_op == spv::OpConvertFToU);
1511     uint32_t _o    = 1;
1512     *idResultType1 = IdResultType(_instruction[_o++]);
1513     *idResult2     = IdResult(_instruction[_o++]);
1514     *floatValue    = IdRef(_instruction[_o++]);
1515 }
ParseConvertFToS(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * floatValue)1516 void ParseConvertFToS(const uint32_t *_instruction,
1517                       IdResultType *idResultType1,
1518                       IdResult *idResult2,
1519                       IdRef *floatValue)
1520 {
1521     spv::Op _op;
1522     uint32_t _length;
1523     GetInstructionOpAndLength(_instruction, &_op, &_length);
1524     ASSERT(_op == spv::OpConvertFToS);
1525     uint32_t _o    = 1;
1526     *idResultType1 = IdResultType(_instruction[_o++]);
1527     *idResult2     = IdResult(_instruction[_o++]);
1528     *floatValue    = IdRef(_instruction[_o++]);
1529 }
ParseConvertSToF(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * signedValue)1530 void ParseConvertSToF(const uint32_t *_instruction,
1531                       IdResultType *idResultType1,
1532                       IdResult *idResult2,
1533                       IdRef *signedValue)
1534 {
1535     spv::Op _op;
1536     uint32_t _length;
1537     GetInstructionOpAndLength(_instruction, &_op, &_length);
1538     ASSERT(_op == spv::OpConvertSToF);
1539     uint32_t _o    = 1;
1540     *idResultType1 = IdResultType(_instruction[_o++]);
1541     *idResult2     = IdResult(_instruction[_o++]);
1542     *signedValue   = IdRef(_instruction[_o++]);
1543 }
ParseConvertUToF(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * unsignedValue)1544 void ParseConvertUToF(const uint32_t *_instruction,
1545                       IdResultType *idResultType1,
1546                       IdResult *idResult2,
1547                       IdRef *unsignedValue)
1548 {
1549     spv::Op _op;
1550     uint32_t _length;
1551     GetInstructionOpAndLength(_instruction, &_op, &_length);
1552     ASSERT(_op == spv::OpConvertUToF);
1553     uint32_t _o    = 1;
1554     *idResultType1 = IdResultType(_instruction[_o++]);
1555     *idResult2     = IdResult(_instruction[_o++]);
1556     *unsignedValue = IdRef(_instruction[_o++]);
1557 }
ParseUConvert(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * unsignedValue)1558 void ParseUConvert(const uint32_t *_instruction,
1559                    IdResultType *idResultType1,
1560                    IdResult *idResult2,
1561                    IdRef *unsignedValue)
1562 {
1563     spv::Op _op;
1564     uint32_t _length;
1565     GetInstructionOpAndLength(_instruction, &_op, &_length);
1566     ASSERT(_op == spv::OpUConvert);
1567     uint32_t _o    = 1;
1568     *idResultType1 = IdResultType(_instruction[_o++]);
1569     *idResult2     = IdResult(_instruction[_o++]);
1570     *unsignedValue = IdRef(_instruction[_o++]);
1571 }
ParseSConvert(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * signedValue)1572 void ParseSConvert(const uint32_t *_instruction,
1573                    IdResultType *idResultType1,
1574                    IdResult *idResult2,
1575                    IdRef *signedValue)
1576 {
1577     spv::Op _op;
1578     uint32_t _length;
1579     GetInstructionOpAndLength(_instruction, &_op, &_length);
1580     ASSERT(_op == spv::OpSConvert);
1581     uint32_t _o    = 1;
1582     *idResultType1 = IdResultType(_instruction[_o++]);
1583     *idResult2     = IdResult(_instruction[_o++]);
1584     *signedValue   = IdRef(_instruction[_o++]);
1585 }
ParseFConvert(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * floatValue)1586 void ParseFConvert(const uint32_t *_instruction,
1587                    IdResultType *idResultType1,
1588                    IdResult *idResult2,
1589                    IdRef *floatValue)
1590 {
1591     spv::Op _op;
1592     uint32_t _length;
1593     GetInstructionOpAndLength(_instruction, &_op, &_length);
1594     ASSERT(_op == spv::OpFConvert);
1595     uint32_t _o    = 1;
1596     *idResultType1 = IdResultType(_instruction[_o++]);
1597     *idResult2     = IdResult(_instruction[_o++]);
1598     *floatValue    = IdRef(_instruction[_o++]);
1599 }
ParseQuantizeToF16(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * value)1600 void ParseQuantizeToF16(const uint32_t *_instruction,
1601                         IdResultType *idResultType1,
1602                         IdResult *idResult2,
1603                         IdRef *value)
1604 {
1605     spv::Op _op;
1606     uint32_t _length;
1607     GetInstructionOpAndLength(_instruction, &_op, &_length);
1608     ASSERT(_op == spv::OpQuantizeToF16);
1609     uint32_t _o    = 1;
1610     *idResultType1 = IdResultType(_instruction[_o++]);
1611     *idResult2     = IdResult(_instruction[_o++]);
1612     *value         = IdRef(_instruction[_o++]);
1613 }
ParseBitcast(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand)1614 void ParseBitcast(const uint32_t *_instruction,
1615                   IdResultType *idResultType1,
1616                   IdResult *idResult2,
1617                   IdRef *operand)
1618 {
1619     spv::Op _op;
1620     uint32_t _length;
1621     GetInstructionOpAndLength(_instruction, &_op, &_length);
1622     ASSERT(_op == spv::OpBitcast);
1623     uint32_t _o    = 1;
1624     *idResultType1 = IdResultType(_instruction[_o++]);
1625     *idResult2     = IdResult(_instruction[_o++]);
1626     *operand       = IdRef(_instruction[_o++]);
1627 }
ParseSNegate(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand)1628 void ParseSNegate(const uint32_t *_instruction,
1629                   IdResultType *idResultType1,
1630                   IdResult *idResult2,
1631                   IdRef *operand)
1632 {
1633     spv::Op _op;
1634     uint32_t _length;
1635     GetInstructionOpAndLength(_instruction, &_op, &_length);
1636     ASSERT(_op == spv::OpSNegate);
1637     uint32_t _o    = 1;
1638     *idResultType1 = IdResultType(_instruction[_o++]);
1639     *idResult2     = IdResult(_instruction[_o++]);
1640     *operand       = IdRef(_instruction[_o++]);
1641 }
ParseFNegate(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand)1642 void ParseFNegate(const uint32_t *_instruction,
1643                   IdResultType *idResultType1,
1644                   IdResult *idResult2,
1645                   IdRef *operand)
1646 {
1647     spv::Op _op;
1648     uint32_t _length;
1649     GetInstructionOpAndLength(_instruction, &_op, &_length);
1650     ASSERT(_op == spv::OpFNegate);
1651     uint32_t _o    = 1;
1652     *idResultType1 = IdResultType(_instruction[_o++]);
1653     *idResult2     = IdResult(_instruction[_o++]);
1654     *operand       = IdRef(_instruction[_o++]);
1655 }
ParseIAdd(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)1656 void ParseIAdd(const uint32_t *_instruction,
1657                IdResultType *idResultType1,
1658                IdResult *idResult2,
1659                IdRef *operand1,
1660                IdRef *operand2)
1661 {
1662     spv::Op _op;
1663     uint32_t _length;
1664     GetInstructionOpAndLength(_instruction, &_op, &_length);
1665     ASSERT(_op == spv::OpIAdd);
1666     uint32_t _o    = 1;
1667     *idResultType1 = IdResultType(_instruction[_o++]);
1668     *idResult2     = IdResult(_instruction[_o++]);
1669     *operand1      = IdRef(_instruction[_o++]);
1670     *operand2      = IdRef(_instruction[_o++]);
1671 }
ParseFAdd(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)1672 void ParseFAdd(const uint32_t *_instruction,
1673                IdResultType *idResultType1,
1674                IdResult *idResult2,
1675                IdRef *operand1,
1676                IdRef *operand2)
1677 {
1678     spv::Op _op;
1679     uint32_t _length;
1680     GetInstructionOpAndLength(_instruction, &_op, &_length);
1681     ASSERT(_op == spv::OpFAdd);
1682     uint32_t _o    = 1;
1683     *idResultType1 = IdResultType(_instruction[_o++]);
1684     *idResult2     = IdResult(_instruction[_o++]);
1685     *operand1      = IdRef(_instruction[_o++]);
1686     *operand2      = IdRef(_instruction[_o++]);
1687 }
ParseISub(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)1688 void ParseISub(const uint32_t *_instruction,
1689                IdResultType *idResultType1,
1690                IdResult *idResult2,
1691                IdRef *operand1,
1692                IdRef *operand2)
1693 {
1694     spv::Op _op;
1695     uint32_t _length;
1696     GetInstructionOpAndLength(_instruction, &_op, &_length);
1697     ASSERT(_op == spv::OpISub);
1698     uint32_t _o    = 1;
1699     *idResultType1 = IdResultType(_instruction[_o++]);
1700     *idResult2     = IdResult(_instruction[_o++]);
1701     *operand1      = IdRef(_instruction[_o++]);
1702     *operand2      = IdRef(_instruction[_o++]);
1703 }
ParseFSub(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)1704 void ParseFSub(const uint32_t *_instruction,
1705                IdResultType *idResultType1,
1706                IdResult *idResult2,
1707                IdRef *operand1,
1708                IdRef *operand2)
1709 {
1710     spv::Op _op;
1711     uint32_t _length;
1712     GetInstructionOpAndLength(_instruction, &_op, &_length);
1713     ASSERT(_op == spv::OpFSub);
1714     uint32_t _o    = 1;
1715     *idResultType1 = IdResultType(_instruction[_o++]);
1716     *idResult2     = IdResult(_instruction[_o++]);
1717     *operand1      = IdRef(_instruction[_o++]);
1718     *operand2      = IdRef(_instruction[_o++]);
1719 }
ParseIMul(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)1720 void ParseIMul(const uint32_t *_instruction,
1721                IdResultType *idResultType1,
1722                IdResult *idResult2,
1723                IdRef *operand1,
1724                IdRef *operand2)
1725 {
1726     spv::Op _op;
1727     uint32_t _length;
1728     GetInstructionOpAndLength(_instruction, &_op, &_length);
1729     ASSERT(_op == spv::OpIMul);
1730     uint32_t _o    = 1;
1731     *idResultType1 = IdResultType(_instruction[_o++]);
1732     *idResult2     = IdResult(_instruction[_o++]);
1733     *operand1      = IdRef(_instruction[_o++]);
1734     *operand2      = IdRef(_instruction[_o++]);
1735 }
ParseFMul(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)1736 void ParseFMul(const uint32_t *_instruction,
1737                IdResultType *idResultType1,
1738                IdResult *idResult2,
1739                IdRef *operand1,
1740                IdRef *operand2)
1741 {
1742     spv::Op _op;
1743     uint32_t _length;
1744     GetInstructionOpAndLength(_instruction, &_op, &_length);
1745     ASSERT(_op == spv::OpFMul);
1746     uint32_t _o    = 1;
1747     *idResultType1 = IdResultType(_instruction[_o++]);
1748     *idResult2     = IdResult(_instruction[_o++]);
1749     *operand1      = IdRef(_instruction[_o++]);
1750     *operand2      = IdRef(_instruction[_o++]);
1751 }
ParseUDiv(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)1752 void ParseUDiv(const uint32_t *_instruction,
1753                IdResultType *idResultType1,
1754                IdResult *idResult2,
1755                IdRef *operand1,
1756                IdRef *operand2)
1757 {
1758     spv::Op _op;
1759     uint32_t _length;
1760     GetInstructionOpAndLength(_instruction, &_op, &_length);
1761     ASSERT(_op == spv::OpUDiv);
1762     uint32_t _o    = 1;
1763     *idResultType1 = IdResultType(_instruction[_o++]);
1764     *idResult2     = IdResult(_instruction[_o++]);
1765     *operand1      = IdRef(_instruction[_o++]);
1766     *operand2      = IdRef(_instruction[_o++]);
1767 }
ParseSDiv(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)1768 void ParseSDiv(const uint32_t *_instruction,
1769                IdResultType *idResultType1,
1770                IdResult *idResult2,
1771                IdRef *operand1,
1772                IdRef *operand2)
1773 {
1774     spv::Op _op;
1775     uint32_t _length;
1776     GetInstructionOpAndLength(_instruction, &_op, &_length);
1777     ASSERT(_op == spv::OpSDiv);
1778     uint32_t _o    = 1;
1779     *idResultType1 = IdResultType(_instruction[_o++]);
1780     *idResult2     = IdResult(_instruction[_o++]);
1781     *operand1      = IdRef(_instruction[_o++]);
1782     *operand2      = IdRef(_instruction[_o++]);
1783 }
ParseFDiv(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)1784 void ParseFDiv(const uint32_t *_instruction,
1785                IdResultType *idResultType1,
1786                IdResult *idResult2,
1787                IdRef *operand1,
1788                IdRef *operand2)
1789 {
1790     spv::Op _op;
1791     uint32_t _length;
1792     GetInstructionOpAndLength(_instruction, &_op, &_length);
1793     ASSERT(_op == spv::OpFDiv);
1794     uint32_t _o    = 1;
1795     *idResultType1 = IdResultType(_instruction[_o++]);
1796     *idResult2     = IdResult(_instruction[_o++]);
1797     *operand1      = IdRef(_instruction[_o++]);
1798     *operand2      = IdRef(_instruction[_o++]);
1799 }
ParseUMod(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)1800 void ParseUMod(const uint32_t *_instruction,
1801                IdResultType *idResultType1,
1802                IdResult *idResult2,
1803                IdRef *operand1,
1804                IdRef *operand2)
1805 {
1806     spv::Op _op;
1807     uint32_t _length;
1808     GetInstructionOpAndLength(_instruction, &_op, &_length);
1809     ASSERT(_op == spv::OpUMod);
1810     uint32_t _o    = 1;
1811     *idResultType1 = IdResultType(_instruction[_o++]);
1812     *idResult2     = IdResult(_instruction[_o++]);
1813     *operand1      = IdRef(_instruction[_o++]);
1814     *operand2      = IdRef(_instruction[_o++]);
1815 }
ParseSRem(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)1816 void ParseSRem(const uint32_t *_instruction,
1817                IdResultType *idResultType1,
1818                IdResult *idResult2,
1819                IdRef *operand1,
1820                IdRef *operand2)
1821 {
1822     spv::Op _op;
1823     uint32_t _length;
1824     GetInstructionOpAndLength(_instruction, &_op, &_length);
1825     ASSERT(_op == spv::OpSRem);
1826     uint32_t _o    = 1;
1827     *idResultType1 = IdResultType(_instruction[_o++]);
1828     *idResult2     = IdResult(_instruction[_o++]);
1829     *operand1      = IdRef(_instruction[_o++]);
1830     *operand2      = IdRef(_instruction[_o++]);
1831 }
ParseSMod(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)1832 void ParseSMod(const uint32_t *_instruction,
1833                IdResultType *idResultType1,
1834                IdResult *idResult2,
1835                IdRef *operand1,
1836                IdRef *operand2)
1837 {
1838     spv::Op _op;
1839     uint32_t _length;
1840     GetInstructionOpAndLength(_instruction, &_op, &_length);
1841     ASSERT(_op == spv::OpSMod);
1842     uint32_t _o    = 1;
1843     *idResultType1 = IdResultType(_instruction[_o++]);
1844     *idResult2     = IdResult(_instruction[_o++]);
1845     *operand1      = IdRef(_instruction[_o++]);
1846     *operand2      = IdRef(_instruction[_o++]);
1847 }
ParseFRem(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)1848 void ParseFRem(const uint32_t *_instruction,
1849                IdResultType *idResultType1,
1850                IdResult *idResult2,
1851                IdRef *operand1,
1852                IdRef *operand2)
1853 {
1854     spv::Op _op;
1855     uint32_t _length;
1856     GetInstructionOpAndLength(_instruction, &_op, &_length);
1857     ASSERT(_op == spv::OpFRem);
1858     uint32_t _o    = 1;
1859     *idResultType1 = IdResultType(_instruction[_o++]);
1860     *idResult2     = IdResult(_instruction[_o++]);
1861     *operand1      = IdRef(_instruction[_o++]);
1862     *operand2      = IdRef(_instruction[_o++]);
1863 }
ParseFMod(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)1864 void ParseFMod(const uint32_t *_instruction,
1865                IdResultType *idResultType1,
1866                IdResult *idResult2,
1867                IdRef *operand1,
1868                IdRef *operand2)
1869 {
1870     spv::Op _op;
1871     uint32_t _length;
1872     GetInstructionOpAndLength(_instruction, &_op, &_length);
1873     ASSERT(_op == spv::OpFMod);
1874     uint32_t _o    = 1;
1875     *idResultType1 = IdResultType(_instruction[_o++]);
1876     *idResult2     = IdResult(_instruction[_o++]);
1877     *operand1      = IdRef(_instruction[_o++]);
1878     *operand2      = IdRef(_instruction[_o++]);
1879 }
ParseVectorTimesScalar(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * vector,IdRef * scalar)1880 void ParseVectorTimesScalar(const uint32_t *_instruction,
1881                             IdResultType *idResultType1,
1882                             IdResult *idResult2,
1883                             IdRef *vector,
1884                             IdRef *scalar)
1885 {
1886     spv::Op _op;
1887     uint32_t _length;
1888     GetInstructionOpAndLength(_instruction, &_op, &_length);
1889     ASSERT(_op == spv::OpVectorTimesScalar);
1890     uint32_t _o    = 1;
1891     *idResultType1 = IdResultType(_instruction[_o++]);
1892     *idResult2     = IdResult(_instruction[_o++]);
1893     *vector        = IdRef(_instruction[_o++]);
1894     *scalar        = IdRef(_instruction[_o++]);
1895 }
ParseMatrixTimesScalar(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * matrix,IdRef * scalar)1896 void ParseMatrixTimesScalar(const uint32_t *_instruction,
1897                             IdResultType *idResultType1,
1898                             IdResult *idResult2,
1899                             IdRef *matrix,
1900                             IdRef *scalar)
1901 {
1902     spv::Op _op;
1903     uint32_t _length;
1904     GetInstructionOpAndLength(_instruction, &_op, &_length);
1905     ASSERT(_op == spv::OpMatrixTimesScalar);
1906     uint32_t _o    = 1;
1907     *idResultType1 = IdResultType(_instruction[_o++]);
1908     *idResult2     = IdResult(_instruction[_o++]);
1909     *matrix        = IdRef(_instruction[_o++]);
1910     *scalar        = IdRef(_instruction[_o++]);
1911 }
ParseVectorTimesMatrix(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * vector,IdRef * matrix)1912 void ParseVectorTimesMatrix(const uint32_t *_instruction,
1913                             IdResultType *idResultType1,
1914                             IdResult *idResult2,
1915                             IdRef *vector,
1916                             IdRef *matrix)
1917 {
1918     spv::Op _op;
1919     uint32_t _length;
1920     GetInstructionOpAndLength(_instruction, &_op, &_length);
1921     ASSERT(_op == spv::OpVectorTimesMatrix);
1922     uint32_t _o    = 1;
1923     *idResultType1 = IdResultType(_instruction[_o++]);
1924     *idResult2     = IdResult(_instruction[_o++]);
1925     *vector        = IdRef(_instruction[_o++]);
1926     *matrix        = IdRef(_instruction[_o++]);
1927 }
ParseMatrixTimesVector(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * matrix,IdRef * vector)1928 void ParseMatrixTimesVector(const uint32_t *_instruction,
1929                             IdResultType *idResultType1,
1930                             IdResult *idResult2,
1931                             IdRef *matrix,
1932                             IdRef *vector)
1933 {
1934     spv::Op _op;
1935     uint32_t _length;
1936     GetInstructionOpAndLength(_instruction, &_op, &_length);
1937     ASSERT(_op == spv::OpMatrixTimesVector);
1938     uint32_t _o    = 1;
1939     *idResultType1 = IdResultType(_instruction[_o++]);
1940     *idResult2     = IdResult(_instruction[_o++]);
1941     *matrix        = IdRef(_instruction[_o++]);
1942     *vector        = IdRef(_instruction[_o++]);
1943 }
ParseMatrixTimesMatrix(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * leftMatrix,IdRef * rightMatrix)1944 void ParseMatrixTimesMatrix(const uint32_t *_instruction,
1945                             IdResultType *idResultType1,
1946                             IdResult *idResult2,
1947                             IdRef *leftMatrix,
1948                             IdRef *rightMatrix)
1949 {
1950     spv::Op _op;
1951     uint32_t _length;
1952     GetInstructionOpAndLength(_instruction, &_op, &_length);
1953     ASSERT(_op == spv::OpMatrixTimesMatrix);
1954     uint32_t _o    = 1;
1955     *idResultType1 = IdResultType(_instruction[_o++]);
1956     *idResult2     = IdResult(_instruction[_o++]);
1957     *leftMatrix    = IdRef(_instruction[_o++]);
1958     *rightMatrix   = IdRef(_instruction[_o++]);
1959 }
ParseOuterProduct(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * vector1,IdRef * vector2)1960 void ParseOuterProduct(const uint32_t *_instruction,
1961                        IdResultType *idResultType1,
1962                        IdResult *idResult2,
1963                        IdRef *vector1,
1964                        IdRef *vector2)
1965 {
1966     spv::Op _op;
1967     uint32_t _length;
1968     GetInstructionOpAndLength(_instruction, &_op, &_length);
1969     ASSERT(_op == spv::OpOuterProduct);
1970     uint32_t _o    = 1;
1971     *idResultType1 = IdResultType(_instruction[_o++]);
1972     *idResult2     = IdResult(_instruction[_o++]);
1973     *vector1       = IdRef(_instruction[_o++]);
1974     *vector2       = IdRef(_instruction[_o++]);
1975 }
ParseDot(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * vector1,IdRef * vector2)1976 void ParseDot(const uint32_t *_instruction,
1977               IdResultType *idResultType1,
1978               IdResult *idResult2,
1979               IdRef *vector1,
1980               IdRef *vector2)
1981 {
1982     spv::Op _op;
1983     uint32_t _length;
1984     GetInstructionOpAndLength(_instruction, &_op, &_length);
1985     ASSERT(_op == spv::OpDot);
1986     uint32_t _o    = 1;
1987     *idResultType1 = IdResultType(_instruction[_o++]);
1988     *idResult2     = IdResult(_instruction[_o++]);
1989     *vector1       = IdRef(_instruction[_o++]);
1990     *vector2       = IdRef(_instruction[_o++]);
1991 }
ParseIAddCarry(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)1992 void ParseIAddCarry(const uint32_t *_instruction,
1993                     IdResultType *idResultType1,
1994                     IdResult *idResult2,
1995                     IdRef *operand1,
1996                     IdRef *operand2)
1997 {
1998     spv::Op _op;
1999     uint32_t _length;
2000     GetInstructionOpAndLength(_instruction, &_op, &_length);
2001     ASSERT(_op == spv::OpIAddCarry);
2002     uint32_t _o    = 1;
2003     *idResultType1 = IdResultType(_instruction[_o++]);
2004     *idResult2     = IdResult(_instruction[_o++]);
2005     *operand1      = IdRef(_instruction[_o++]);
2006     *operand2      = IdRef(_instruction[_o++]);
2007 }
ParseISubBorrow(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2008 void ParseISubBorrow(const uint32_t *_instruction,
2009                      IdResultType *idResultType1,
2010                      IdResult *idResult2,
2011                      IdRef *operand1,
2012                      IdRef *operand2)
2013 {
2014     spv::Op _op;
2015     uint32_t _length;
2016     GetInstructionOpAndLength(_instruction, &_op, &_length);
2017     ASSERT(_op == spv::OpISubBorrow);
2018     uint32_t _o    = 1;
2019     *idResultType1 = IdResultType(_instruction[_o++]);
2020     *idResult2     = IdResult(_instruction[_o++]);
2021     *operand1      = IdRef(_instruction[_o++]);
2022     *operand2      = IdRef(_instruction[_o++]);
2023 }
ParseUMulExtended(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2024 void ParseUMulExtended(const uint32_t *_instruction,
2025                        IdResultType *idResultType1,
2026                        IdResult *idResult2,
2027                        IdRef *operand1,
2028                        IdRef *operand2)
2029 {
2030     spv::Op _op;
2031     uint32_t _length;
2032     GetInstructionOpAndLength(_instruction, &_op, &_length);
2033     ASSERT(_op == spv::OpUMulExtended);
2034     uint32_t _o    = 1;
2035     *idResultType1 = IdResultType(_instruction[_o++]);
2036     *idResult2     = IdResult(_instruction[_o++]);
2037     *operand1      = IdRef(_instruction[_o++]);
2038     *operand2      = IdRef(_instruction[_o++]);
2039 }
ParseSMulExtended(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2040 void ParseSMulExtended(const uint32_t *_instruction,
2041                        IdResultType *idResultType1,
2042                        IdResult *idResult2,
2043                        IdRef *operand1,
2044                        IdRef *operand2)
2045 {
2046     spv::Op _op;
2047     uint32_t _length;
2048     GetInstructionOpAndLength(_instruction, &_op, &_length);
2049     ASSERT(_op == spv::OpSMulExtended);
2050     uint32_t _o    = 1;
2051     *idResultType1 = IdResultType(_instruction[_o++]);
2052     *idResult2     = IdResult(_instruction[_o++]);
2053     *operand1      = IdRef(_instruction[_o++]);
2054     *operand2      = IdRef(_instruction[_o++]);
2055 }
ParseAny(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * vector)2056 void ParseAny(const uint32_t *_instruction,
2057               IdResultType *idResultType1,
2058               IdResult *idResult2,
2059               IdRef *vector)
2060 {
2061     spv::Op _op;
2062     uint32_t _length;
2063     GetInstructionOpAndLength(_instruction, &_op, &_length);
2064     ASSERT(_op == spv::OpAny);
2065     uint32_t _o    = 1;
2066     *idResultType1 = IdResultType(_instruction[_o++]);
2067     *idResult2     = IdResult(_instruction[_o++]);
2068     *vector        = IdRef(_instruction[_o++]);
2069 }
ParseAll(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * vector)2070 void ParseAll(const uint32_t *_instruction,
2071               IdResultType *idResultType1,
2072               IdResult *idResult2,
2073               IdRef *vector)
2074 {
2075     spv::Op _op;
2076     uint32_t _length;
2077     GetInstructionOpAndLength(_instruction, &_op, &_length);
2078     ASSERT(_op == spv::OpAll);
2079     uint32_t _o    = 1;
2080     *idResultType1 = IdResultType(_instruction[_o++]);
2081     *idResult2     = IdResult(_instruction[_o++]);
2082     *vector        = IdRef(_instruction[_o++]);
2083 }
ParseIsNan(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * x)2084 void ParseIsNan(const uint32_t *_instruction,
2085                 IdResultType *idResultType1,
2086                 IdResult *idResult2,
2087                 IdRef *x)
2088 {
2089     spv::Op _op;
2090     uint32_t _length;
2091     GetInstructionOpAndLength(_instruction, &_op, &_length);
2092     ASSERT(_op == spv::OpIsNan);
2093     uint32_t _o    = 1;
2094     *idResultType1 = IdResultType(_instruction[_o++]);
2095     *idResult2     = IdResult(_instruction[_o++]);
2096     *x             = IdRef(_instruction[_o++]);
2097 }
ParseIsInf(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * x)2098 void ParseIsInf(const uint32_t *_instruction,
2099                 IdResultType *idResultType1,
2100                 IdResult *idResult2,
2101                 IdRef *x)
2102 {
2103     spv::Op _op;
2104     uint32_t _length;
2105     GetInstructionOpAndLength(_instruction, &_op, &_length);
2106     ASSERT(_op == spv::OpIsInf);
2107     uint32_t _o    = 1;
2108     *idResultType1 = IdResultType(_instruction[_o++]);
2109     *idResult2     = IdResult(_instruction[_o++]);
2110     *x             = IdRef(_instruction[_o++]);
2111 }
ParseLogicalEqual(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2112 void ParseLogicalEqual(const uint32_t *_instruction,
2113                        IdResultType *idResultType1,
2114                        IdResult *idResult2,
2115                        IdRef *operand1,
2116                        IdRef *operand2)
2117 {
2118     spv::Op _op;
2119     uint32_t _length;
2120     GetInstructionOpAndLength(_instruction, &_op, &_length);
2121     ASSERT(_op == spv::OpLogicalEqual);
2122     uint32_t _o    = 1;
2123     *idResultType1 = IdResultType(_instruction[_o++]);
2124     *idResult2     = IdResult(_instruction[_o++]);
2125     *operand1      = IdRef(_instruction[_o++]);
2126     *operand2      = IdRef(_instruction[_o++]);
2127 }
ParseLogicalNotEqual(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2128 void ParseLogicalNotEqual(const uint32_t *_instruction,
2129                           IdResultType *idResultType1,
2130                           IdResult *idResult2,
2131                           IdRef *operand1,
2132                           IdRef *operand2)
2133 {
2134     spv::Op _op;
2135     uint32_t _length;
2136     GetInstructionOpAndLength(_instruction, &_op, &_length);
2137     ASSERT(_op == spv::OpLogicalNotEqual);
2138     uint32_t _o    = 1;
2139     *idResultType1 = IdResultType(_instruction[_o++]);
2140     *idResult2     = IdResult(_instruction[_o++]);
2141     *operand1      = IdRef(_instruction[_o++]);
2142     *operand2      = IdRef(_instruction[_o++]);
2143 }
ParseLogicalOr(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2144 void ParseLogicalOr(const uint32_t *_instruction,
2145                     IdResultType *idResultType1,
2146                     IdResult *idResult2,
2147                     IdRef *operand1,
2148                     IdRef *operand2)
2149 {
2150     spv::Op _op;
2151     uint32_t _length;
2152     GetInstructionOpAndLength(_instruction, &_op, &_length);
2153     ASSERT(_op == spv::OpLogicalOr);
2154     uint32_t _o    = 1;
2155     *idResultType1 = IdResultType(_instruction[_o++]);
2156     *idResult2     = IdResult(_instruction[_o++]);
2157     *operand1      = IdRef(_instruction[_o++]);
2158     *operand2      = IdRef(_instruction[_o++]);
2159 }
ParseLogicalAnd(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2160 void ParseLogicalAnd(const uint32_t *_instruction,
2161                      IdResultType *idResultType1,
2162                      IdResult *idResult2,
2163                      IdRef *operand1,
2164                      IdRef *operand2)
2165 {
2166     spv::Op _op;
2167     uint32_t _length;
2168     GetInstructionOpAndLength(_instruction, &_op, &_length);
2169     ASSERT(_op == spv::OpLogicalAnd);
2170     uint32_t _o    = 1;
2171     *idResultType1 = IdResultType(_instruction[_o++]);
2172     *idResult2     = IdResult(_instruction[_o++]);
2173     *operand1      = IdRef(_instruction[_o++]);
2174     *operand2      = IdRef(_instruction[_o++]);
2175 }
ParseLogicalNot(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand)2176 void ParseLogicalNot(const uint32_t *_instruction,
2177                      IdResultType *idResultType1,
2178                      IdResult *idResult2,
2179                      IdRef *operand)
2180 {
2181     spv::Op _op;
2182     uint32_t _length;
2183     GetInstructionOpAndLength(_instruction, &_op, &_length);
2184     ASSERT(_op == spv::OpLogicalNot);
2185     uint32_t _o    = 1;
2186     *idResultType1 = IdResultType(_instruction[_o++]);
2187     *idResult2     = IdResult(_instruction[_o++]);
2188     *operand       = IdRef(_instruction[_o++]);
2189 }
ParseSelect(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * condition,IdRef * object1,IdRef * object2)2190 void ParseSelect(const uint32_t *_instruction,
2191                  IdResultType *idResultType1,
2192                  IdResult *idResult2,
2193                  IdRef *condition,
2194                  IdRef *object1,
2195                  IdRef *object2)
2196 {
2197     spv::Op _op;
2198     uint32_t _length;
2199     GetInstructionOpAndLength(_instruction, &_op, &_length);
2200     ASSERT(_op == spv::OpSelect);
2201     uint32_t _o    = 1;
2202     *idResultType1 = IdResultType(_instruction[_o++]);
2203     *idResult2     = IdResult(_instruction[_o++]);
2204     *condition     = IdRef(_instruction[_o++]);
2205     *object1       = IdRef(_instruction[_o++]);
2206     *object2       = IdRef(_instruction[_o++]);
2207 }
ParseIEqual(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2208 void ParseIEqual(const uint32_t *_instruction,
2209                  IdResultType *idResultType1,
2210                  IdResult *idResult2,
2211                  IdRef *operand1,
2212                  IdRef *operand2)
2213 {
2214     spv::Op _op;
2215     uint32_t _length;
2216     GetInstructionOpAndLength(_instruction, &_op, &_length);
2217     ASSERT(_op == spv::OpIEqual);
2218     uint32_t _o    = 1;
2219     *idResultType1 = IdResultType(_instruction[_o++]);
2220     *idResult2     = IdResult(_instruction[_o++]);
2221     *operand1      = IdRef(_instruction[_o++]);
2222     *operand2      = IdRef(_instruction[_o++]);
2223 }
ParseINotEqual(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2224 void ParseINotEqual(const uint32_t *_instruction,
2225                     IdResultType *idResultType1,
2226                     IdResult *idResult2,
2227                     IdRef *operand1,
2228                     IdRef *operand2)
2229 {
2230     spv::Op _op;
2231     uint32_t _length;
2232     GetInstructionOpAndLength(_instruction, &_op, &_length);
2233     ASSERT(_op == spv::OpINotEqual);
2234     uint32_t _o    = 1;
2235     *idResultType1 = IdResultType(_instruction[_o++]);
2236     *idResult2     = IdResult(_instruction[_o++]);
2237     *operand1      = IdRef(_instruction[_o++]);
2238     *operand2      = IdRef(_instruction[_o++]);
2239 }
ParseUGreaterThan(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2240 void ParseUGreaterThan(const uint32_t *_instruction,
2241                        IdResultType *idResultType1,
2242                        IdResult *idResult2,
2243                        IdRef *operand1,
2244                        IdRef *operand2)
2245 {
2246     spv::Op _op;
2247     uint32_t _length;
2248     GetInstructionOpAndLength(_instruction, &_op, &_length);
2249     ASSERT(_op == spv::OpUGreaterThan);
2250     uint32_t _o    = 1;
2251     *idResultType1 = IdResultType(_instruction[_o++]);
2252     *idResult2     = IdResult(_instruction[_o++]);
2253     *operand1      = IdRef(_instruction[_o++]);
2254     *operand2      = IdRef(_instruction[_o++]);
2255 }
ParseSGreaterThan(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2256 void ParseSGreaterThan(const uint32_t *_instruction,
2257                        IdResultType *idResultType1,
2258                        IdResult *idResult2,
2259                        IdRef *operand1,
2260                        IdRef *operand2)
2261 {
2262     spv::Op _op;
2263     uint32_t _length;
2264     GetInstructionOpAndLength(_instruction, &_op, &_length);
2265     ASSERT(_op == spv::OpSGreaterThan);
2266     uint32_t _o    = 1;
2267     *idResultType1 = IdResultType(_instruction[_o++]);
2268     *idResult2     = IdResult(_instruction[_o++]);
2269     *operand1      = IdRef(_instruction[_o++]);
2270     *operand2      = IdRef(_instruction[_o++]);
2271 }
ParseUGreaterThanEqual(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2272 void ParseUGreaterThanEqual(const uint32_t *_instruction,
2273                             IdResultType *idResultType1,
2274                             IdResult *idResult2,
2275                             IdRef *operand1,
2276                             IdRef *operand2)
2277 {
2278     spv::Op _op;
2279     uint32_t _length;
2280     GetInstructionOpAndLength(_instruction, &_op, &_length);
2281     ASSERT(_op == spv::OpUGreaterThanEqual);
2282     uint32_t _o    = 1;
2283     *idResultType1 = IdResultType(_instruction[_o++]);
2284     *idResult2     = IdResult(_instruction[_o++]);
2285     *operand1      = IdRef(_instruction[_o++]);
2286     *operand2      = IdRef(_instruction[_o++]);
2287 }
ParseSGreaterThanEqual(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2288 void ParseSGreaterThanEqual(const uint32_t *_instruction,
2289                             IdResultType *idResultType1,
2290                             IdResult *idResult2,
2291                             IdRef *operand1,
2292                             IdRef *operand2)
2293 {
2294     spv::Op _op;
2295     uint32_t _length;
2296     GetInstructionOpAndLength(_instruction, &_op, &_length);
2297     ASSERT(_op == spv::OpSGreaterThanEqual);
2298     uint32_t _o    = 1;
2299     *idResultType1 = IdResultType(_instruction[_o++]);
2300     *idResult2     = IdResult(_instruction[_o++]);
2301     *operand1      = IdRef(_instruction[_o++]);
2302     *operand2      = IdRef(_instruction[_o++]);
2303 }
ParseULessThan(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2304 void ParseULessThan(const uint32_t *_instruction,
2305                     IdResultType *idResultType1,
2306                     IdResult *idResult2,
2307                     IdRef *operand1,
2308                     IdRef *operand2)
2309 {
2310     spv::Op _op;
2311     uint32_t _length;
2312     GetInstructionOpAndLength(_instruction, &_op, &_length);
2313     ASSERT(_op == spv::OpULessThan);
2314     uint32_t _o    = 1;
2315     *idResultType1 = IdResultType(_instruction[_o++]);
2316     *idResult2     = IdResult(_instruction[_o++]);
2317     *operand1      = IdRef(_instruction[_o++]);
2318     *operand2      = IdRef(_instruction[_o++]);
2319 }
ParseSLessThan(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2320 void ParseSLessThan(const uint32_t *_instruction,
2321                     IdResultType *idResultType1,
2322                     IdResult *idResult2,
2323                     IdRef *operand1,
2324                     IdRef *operand2)
2325 {
2326     spv::Op _op;
2327     uint32_t _length;
2328     GetInstructionOpAndLength(_instruction, &_op, &_length);
2329     ASSERT(_op == spv::OpSLessThan);
2330     uint32_t _o    = 1;
2331     *idResultType1 = IdResultType(_instruction[_o++]);
2332     *idResult2     = IdResult(_instruction[_o++]);
2333     *operand1      = IdRef(_instruction[_o++]);
2334     *operand2      = IdRef(_instruction[_o++]);
2335 }
ParseULessThanEqual(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2336 void ParseULessThanEqual(const uint32_t *_instruction,
2337                          IdResultType *idResultType1,
2338                          IdResult *idResult2,
2339                          IdRef *operand1,
2340                          IdRef *operand2)
2341 {
2342     spv::Op _op;
2343     uint32_t _length;
2344     GetInstructionOpAndLength(_instruction, &_op, &_length);
2345     ASSERT(_op == spv::OpULessThanEqual);
2346     uint32_t _o    = 1;
2347     *idResultType1 = IdResultType(_instruction[_o++]);
2348     *idResult2     = IdResult(_instruction[_o++]);
2349     *operand1      = IdRef(_instruction[_o++]);
2350     *operand2      = IdRef(_instruction[_o++]);
2351 }
ParseSLessThanEqual(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2352 void ParseSLessThanEqual(const uint32_t *_instruction,
2353                          IdResultType *idResultType1,
2354                          IdResult *idResult2,
2355                          IdRef *operand1,
2356                          IdRef *operand2)
2357 {
2358     spv::Op _op;
2359     uint32_t _length;
2360     GetInstructionOpAndLength(_instruction, &_op, &_length);
2361     ASSERT(_op == spv::OpSLessThanEqual);
2362     uint32_t _o    = 1;
2363     *idResultType1 = IdResultType(_instruction[_o++]);
2364     *idResult2     = IdResult(_instruction[_o++]);
2365     *operand1      = IdRef(_instruction[_o++]);
2366     *operand2      = IdRef(_instruction[_o++]);
2367 }
ParseFOrdEqual(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2368 void ParseFOrdEqual(const uint32_t *_instruction,
2369                     IdResultType *idResultType1,
2370                     IdResult *idResult2,
2371                     IdRef *operand1,
2372                     IdRef *operand2)
2373 {
2374     spv::Op _op;
2375     uint32_t _length;
2376     GetInstructionOpAndLength(_instruction, &_op, &_length);
2377     ASSERT(_op == spv::OpFOrdEqual);
2378     uint32_t _o    = 1;
2379     *idResultType1 = IdResultType(_instruction[_o++]);
2380     *idResult2     = IdResult(_instruction[_o++]);
2381     *operand1      = IdRef(_instruction[_o++]);
2382     *operand2      = IdRef(_instruction[_o++]);
2383 }
ParseFUnordEqual(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2384 void ParseFUnordEqual(const uint32_t *_instruction,
2385                       IdResultType *idResultType1,
2386                       IdResult *idResult2,
2387                       IdRef *operand1,
2388                       IdRef *operand2)
2389 {
2390     spv::Op _op;
2391     uint32_t _length;
2392     GetInstructionOpAndLength(_instruction, &_op, &_length);
2393     ASSERT(_op == spv::OpFUnordEqual);
2394     uint32_t _o    = 1;
2395     *idResultType1 = IdResultType(_instruction[_o++]);
2396     *idResult2     = IdResult(_instruction[_o++]);
2397     *operand1      = IdRef(_instruction[_o++]);
2398     *operand2      = IdRef(_instruction[_o++]);
2399 }
ParseFOrdNotEqual(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2400 void ParseFOrdNotEqual(const uint32_t *_instruction,
2401                        IdResultType *idResultType1,
2402                        IdResult *idResult2,
2403                        IdRef *operand1,
2404                        IdRef *operand2)
2405 {
2406     spv::Op _op;
2407     uint32_t _length;
2408     GetInstructionOpAndLength(_instruction, &_op, &_length);
2409     ASSERT(_op == spv::OpFOrdNotEqual);
2410     uint32_t _o    = 1;
2411     *idResultType1 = IdResultType(_instruction[_o++]);
2412     *idResult2     = IdResult(_instruction[_o++]);
2413     *operand1      = IdRef(_instruction[_o++]);
2414     *operand2      = IdRef(_instruction[_o++]);
2415 }
ParseFUnordNotEqual(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2416 void ParseFUnordNotEqual(const uint32_t *_instruction,
2417                          IdResultType *idResultType1,
2418                          IdResult *idResult2,
2419                          IdRef *operand1,
2420                          IdRef *operand2)
2421 {
2422     spv::Op _op;
2423     uint32_t _length;
2424     GetInstructionOpAndLength(_instruction, &_op, &_length);
2425     ASSERT(_op == spv::OpFUnordNotEqual);
2426     uint32_t _o    = 1;
2427     *idResultType1 = IdResultType(_instruction[_o++]);
2428     *idResult2     = IdResult(_instruction[_o++]);
2429     *operand1      = IdRef(_instruction[_o++]);
2430     *operand2      = IdRef(_instruction[_o++]);
2431 }
ParseFOrdLessThan(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2432 void ParseFOrdLessThan(const uint32_t *_instruction,
2433                        IdResultType *idResultType1,
2434                        IdResult *idResult2,
2435                        IdRef *operand1,
2436                        IdRef *operand2)
2437 {
2438     spv::Op _op;
2439     uint32_t _length;
2440     GetInstructionOpAndLength(_instruction, &_op, &_length);
2441     ASSERT(_op == spv::OpFOrdLessThan);
2442     uint32_t _o    = 1;
2443     *idResultType1 = IdResultType(_instruction[_o++]);
2444     *idResult2     = IdResult(_instruction[_o++]);
2445     *operand1      = IdRef(_instruction[_o++]);
2446     *operand2      = IdRef(_instruction[_o++]);
2447 }
ParseFUnordLessThan(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2448 void ParseFUnordLessThan(const uint32_t *_instruction,
2449                          IdResultType *idResultType1,
2450                          IdResult *idResult2,
2451                          IdRef *operand1,
2452                          IdRef *operand2)
2453 {
2454     spv::Op _op;
2455     uint32_t _length;
2456     GetInstructionOpAndLength(_instruction, &_op, &_length);
2457     ASSERT(_op == spv::OpFUnordLessThan);
2458     uint32_t _o    = 1;
2459     *idResultType1 = IdResultType(_instruction[_o++]);
2460     *idResult2     = IdResult(_instruction[_o++]);
2461     *operand1      = IdRef(_instruction[_o++]);
2462     *operand2      = IdRef(_instruction[_o++]);
2463 }
ParseFOrdGreaterThan(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2464 void ParseFOrdGreaterThan(const uint32_t *_instruction,
2465                           IdResultType *idResultType1,
2466                           IdResult *idResult2,
2467                           IdRef *operand1,
2468                           IdRef *operand2)
2469 {
2470     spv::Op _op;
2471     uint32_t _length;
2472     GetInstructionOpAndLength(_instruction, &_op, &_length);
2473     ASSERT(_op == spv::OpFOrdGreaterThan);
2474     uint32_t _o    = 1;
2475     *idResultType1 = IdResultType(_instruction[_o++]);
2476     *idResult2     = IdResult(_instruction[_o++]);
2477     *operand1      = IdRef(_instruction[_o++]);
2478     *operand2      = IdRef(_instruction[_o++]);
2479 }
ParseFUnordGreaterThan(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2480 void ParseFUnordGreaterThan(const uint32_t *_instruction,
2481                             IdResultType *idResultType1,
2482                             IdResult *idResult2,
2483                             IdRef *operand1,
2484                             IdRef *operand2)
2485 {
2486     spv::Op _op;
2487     uint32_t _length;
2488     GetInstructionOpAndLength(_instruction, &_op, &_length);
2489     ASSERT(_op == spv::OpFUnordGreaterThan);
2490     uint32_t _o    = 1;
2491     *idResultType1 = IdResultType(_instruction[_o++]);
2492     *idResult2     = IdResult(_instruction[_o++]);
2493     *operand1      = IdRef(_instruction[_o++]);
2494     *operand2      = IdRef(_instruction[_o++]);
2495 }
ParseFOrdLessThanEqual(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2496 void ParseFOrdLessThanEqual(const uint32_t *_instruction,
2497                             IdResultType *idResultType1,
2498                             IdResult *idResult2,
2499                             IdRef *operand1,
2500                             IdRef *operand2)
2501 {
2502     spv::Op _op;
2503     uint32_t _length;
2504     GetInstructionOpAndLength(_instruction, &_op, &_length);
2505     ASSERT(_op == spv::OpFOrdLessThanEqual);
2506     uint32_t _o    = 1;
2507     *idResultType1 = IdResultType(_instruction[_o++]);
2508     *idResult2     = IdResult(_instruction[_o++]);
2509     *operand1      = IdRef(_instruction[_o++]);
2510     *operand2      = IdRef(_instruction[_o++]);
2511 }
ParseFUnordLessThanEqual(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2512 void ParseFUnordLessThanEqual(const uint32_t *_instruction,
2513                               IdResultType *idResultType1,
2514                               IdResult *idResult2,
2515                               IdRef *operand1,
2516                               IdRef *operand2)
2517 {
2518     spv::Op _op;
2519     uint32_t _length;
2520     GetInstructionOpAndLength(_instruction, &_op, &_length);
2521     ASSERT(_op == spv::OpFUnordLessThanEqual);
2522     uint32_t _o    = 1;
2523     *idResultType1 = IdResultType(_instruction[_o++]);
2524     *idResult2     = IdResult(_instruction[_o++]);
2525     *operand1      = IdRef(_instruction[_o++]);
2526     *operand2      = IdRef(_instruction[_o++]);
2527 }
ParseFOrdGreaterThanEqual(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2528 void ParseFOrdGreaterThanEqual(const uint32_t *_instruction,
2529                                IdResultType *idResultType1,
2530                                IdResult *idResult2,
2531                                IdRef *operand1,
2532                                IdRef *operand2)
2533 {
2534     spv::Op _op;
2535     uint32_t _length;
2536     GetInstructionOpAndLength(_instruction, &_op, &_length);
2537     ASSERT(_op == spv::OpFOrdGreaterThanEqual);
2538     uint32_t _o    = 1;
2539     *idResultType1 = IdResultType(_instruction[_o++]);
2540     *idResult2     = IdResult(_instruction[_o++]);
2541     *operand1      = IdRef(_instruction[_o++]);
2542     *operand2      = IdRef(_instruction[_o++]);
2543 }
ParseFUnordGreaterThanEqual(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2544 void ParseFUnordGreaterThanEqual(const uint32_t *_instruction,
2545                                  IdResultType *idResultType1,
2546                                  IdResult *idResult2,
2547                                  IdRef *operand1,
2548                                  IdRef *operand2)
2549 {
2550     spv::Op _op;
2551     uint32_t _length;
2552     GetInstructionOpAndLength(_instruction, &_op, &_length);
2553     ASSERT(_op == spv::OpFUnordGreaterThanEqual);
2554     uint32_t _o    = 1;
2555     *idResultType1 = IdResultType(_instruction[_o++]);
2556     *idResult2     = IdResult(_instruction[_o++]);
2557     *operand1      = IdRef(_instruction[_o++]);
2558     *operand2      = IdRef(_instruction[_o++]);
2559 }
ParseShiftRightLogical(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * base,IdRef * shift)2560 void ParseShiftRightLogical(const uint32_t *_instruction,
2561                             IdResultType *idResultType1,
2562                             IdResult *idResult2,
2563                             IdRef *base,
2564                             IdRef *shift)
2565 {
2566     spv::Op _op;
2567     uint32_t _length;
2568     GetInstructionOpAndLength(_instruction, &_op, &_length);
2569     ASSERT(_op == spv::OpShiftRightLogical);
2570     uint32_t _o    = 1;
2571     *idResultType1 = IdResultType(_instruction[_o++]);
2572     *idResult2     = IdResult(_instruction[_o++]);
2573     *base          = IdRef(_instruction[_o++]);
2574     *shift         = IdRef(_instruction[_o++]);
2575 }
ParseShiftRightArithmetic(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * base,IdRef * shift)2576 void ParseShiftRightArithmetic(const uint32_t *_instruction,
2577                                IdResultType *idResultType1,
2578                                IdResult *idResult2,
2579                                IdRef *base,
2580                                IdRef *shift)
2581 {
2582     spv::Op _op;
2583     uint32_t _length;
2584     GetInstructionOpAndLength(_instruction, &_op, &_length);
2585     ASSERT(_op == spv::OpShiftRightArithmetic);
2586     uint32_t _o    = 1;
2587     *idResultType1 = IdResultType(_instruction[_o++]);
2588     *idResult2     = IdResult(_instruction[_o++]);
2589     *base          = IdRef(_instruction[_o++]);
2590     *shift         = IdRef(_instruction[_o++]);
2591 }
ParseShiftLeftLogical(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * base,IdRef * shift)2592 void ParseShiftLeftLogical(const uint32_t *_instruction,
2593                            IdResultType *idResultType1,
2594                            IdResult *idResult2,
2595                            IdRef *base,
2596                            IdRef *shift)
2597 {
2598     spv::Op _op;
2599     uint32_t _length;
2600     GetInstructionOpAndLength(_instruction, &_op, &_length);
2601     ASSERT(_op == spv::OpShiftLeftLogical);
2602     uint32_t _o    = 1;
2603     *idResultType1 = IdResultType(_instruction[_o++]);
2604     *idResult2     = IdResult(_instruction[_o++]);
2605     *base          = IdRef(_instruction[_o++]);
2606     *shift         = IdRef(_instruction[_o++]);
2607 }
ParseBitwiseOr(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2608 void ParseBitwiseOr(const uint32_t *_instruction,
2609                     IdResultType *idResultType1,
2610                     IdResult *idResult2,
2611                     IdRef *operand1,
2612                     IdRef *operand2)
2613 {
2614     spv::Op _op;
2615     uint32_t _length;
2616     GetInstructionOpAndLength(_instruction, &_op, &_length);
2617     ASSERT(_op == spv::OpBitwiseOr);
2618     uint32_t _o    = 1;
2619     *idResultType1 = IdResultType(_instruction[_o++]);
2620     *idResult2     = IdResult(_instruction[_o++]);
2621     *operand1      = IdRef(_instruction[_o++]);
2622     *operand2      = IdRef(_instruction[_o++]);
2623 }
ParseBitwiseXor(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2624 void ParseBitwiseXor(const uint32_t *_instruction,
2625                      IdResultType *idResultType1,
2626                      IdResult *idResult2,
2627                      IdRef *operand1,
2628                      IdRef *operand2)
2629 {
2630     spv::Op _op;
2631     uint32_t _length;
2632     GetInstructionOpAndLength(_instruction, &_op, &_length);
2633     ASSERT(_op == spv::OpBitwiseXor);
2634     uint32_t _o    = 1;
2635     *idResultType1 = IdResultType(_instruction[_o++]);
2636     *idResult2     = IdResult(_instruction[_o++]);
2637     *operand1      = IdRef(_instruction[_o++]);
2638     *operand2      = IdRef(_instruction[_o++]);
2639 }
ParseBitwiseAnd(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)2640 void ParseBitwiseAnd(const uint32_t *_instruction,
2641                      IdResultType *idResultType1,
2642                      IdResult *idResult2,
2643                      IdRef *operand1,
2644                      IdRef *operand2)
2645 {
2646     spv::Op _op;
2647     uint32_t _length;
2648     GetInstructionOpAndLength(_instruction, &_op, &_length);
2649     ASSERT(_op == spv::OpBitwiseAnd);
2650     uint32_t _o    = 1;
2651     *idResultType1 = IdResultType(_instruction[_o++]);
2652     *idResult2     = IdResult(_instruction[_o++]);
2653     *operand1      = IdRef(_instruction[_o++]);
2654     *operand2      = IdRef(_instruction[_o++]);
2655 }
ParseNot(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand)2656 void ParseNot(const uint32_t *_instruction,
2657               IdResultType *idResultType1,
2658               IdResult *idResult2,
2659               IdRef *operand)
2660 {
2661     spv::Op _op;
2662     uint32_t _length;
2663     GetInstructionOpAndLength(_instruction, &_op, &_length);
2664     ASSERT(_op == spv::OpNot);
2665     uint32_t _o    = 1;
2666     *idResultType1 = IdResultType(_instruction[_o++]);
2667     *idResult2     = IdResult(_instruction[_o++]);
2668     *operand       = IdRef(_instruction[_o++]);
2669 }
ParseBitFieldInsert(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * base,IdRef * insert,IdRef * offset,IdRef * count)2670 void ParseBitFieldInsert(const uint32_t *_instruction,
2671                          IdResultType *idResultType1,
2672                          IdResult *idResult2,
2673                          IdRef *base,
2674                          IdRef *insert,
2675                          IdRef *offset,
2676                          IdRef *count)
2677 {
2678     spv::Op _op;
2679     uint32_t _length;
2680     GetInstructionOpAndLength(_instruction, &_op, &_length);
2681     ASSERT(_op == spv::OpBitFieldInsert);
2682     uint32_t _o    = 1;
2683     *idResultType1 = IdResultType(_instruction[_o++]);
2684     *idResult2     = IdResult(_instruction[_o++]);
2685     *base          = IdRef(_instruction[_o++]);
2686     *insert        = IdRef(_instruction[_o++]);
2687     *offset        = IdRef(_instruction[_o++]);
2688     *count         = IdRef(_instruction[_o++]);
2689 }
ParseBitFieldSExtract(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * base,IdRef * offset,IdRef * count)2690 void ParseBitFieldSExtract(const uint32_t *_instruction,
2691                            IdResultType *idResultType1,
2692                            IdResult *idResult2,
2693                            IdRef *base,
2694                            IdRef *offset,
2695                            IdRef *count)
2696 {
2697     spv::Op _op;
2698     uint32_t _length;
2699     GetInstructionOpAndLength(_instruction, &_op, &_length);
2700     ASSERT(_op == spv::OpBitFieldSExtract);
2701     uint32_t _o    = 1;
2702     *idResultType1 = IdResultType(_instruction[_o++]);
2703     *idResult2     = IdResult(_instruction[_o++]);
2704     *base          = IdRef(_instruction[_o++]);
2705     *offset        = IdRef(_instruction[_o++]);
2706     *count         = IdRef(_instruction[_o++]);
2707 }
ParseBitFieldUExtract(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * base,IdRef * offset,IdRef * count)2708 void ParseBitFieldUExtract(const uint32_t *_instruction,
2709                            IdResultType *idResultType1,
2710                            IdResult *idResult2,
2711                            IdRef *base,
2712                            IdRef *offset,
2713                            IdRef *count)
2714 {
2715     spv::Op _op;
2716     uint32_t _length;
2717     GetInstructionOpAndLength(_instruction, &_op, &_length);
2718     ASSERT(_op == spv::OpBitFieldUExtract);
2719     uint32_t _o    = 1;
2720     *idResultType1 = IdResultType(_instruction[_o++]);
2721     *idResult2     = IdResult(_instruction[_o++]);
2722     *base          = IdRef(_instruction[_o++]);
2723     *offset        = IdRef(_instruction[_o++]);
2724     *count         = IdRef(_instruction[_o++]);
2725 }
ParseBitReverse(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * base)2726 void ParseBitReverse(const uint32_t *_instruction,
2727                      IdResultType *idResultType1,
2728                      IdResult *idResult2,
2729                      IdRef *base)
2730 {
2731     spv::Op _op;
2732     uint32_t _length;
2733     GetInstructionOpAndLength(_instruction, &_op, &_length);
2734     ASSERT(_op == spv::OpBitReverse);
2735     uint32_t _o    = 1;
2736     *idResultType1 = IdResultType(_instruction[_o++]);
2737     *idResult2     = IdResult(_instruction[_o++]);
2738     *base          = IdRef(_instruction[_o++]);
2739 }
ParseBitCount(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * base)2740 void ParseBitCount(const uint32_t *_instruction,
2741                    IdResultType *idResultType1,
2742                    IdResult *idResult2,
2743                    IdRef *base)
2744 {
2745     spv::Op _op;
2746     uint32_t _length;
2747     GetInstructionOpAndLength(_instruction, &_op, &_length);
2748     ASSERT(_op == spv::OpBitCount);
2749     uint32_t _o    = 1;
2750     *idResultType1 = IdResultType(_instruction[_o++]);
2751     *idResult2     = IdResult(_instruction[_o++]);
2752     *base          = IdRef(_instruction[_o++]);
2753 }
ParseDPdx(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * p)2754 void ParseDPdx(const uint32_t *_instruction,
2755                IdResultType *idResultType1,
2756                IdResult *idResult2,
2757                IdRef *p)
2758 {
2759     spv::Op _op;
2760     uint32_t _length;
2761     GetInstructionOpAndLength(_instruction, &_op, &_length);
2762     ASSERT(_op == spv::OpDPdx);
2763     uint32_t _o    = 1;
2764     *idResultType1 = IdResultType(_instruction[_o++]);
2765     *idResult2     = IdResult(_instruction[_o++]);
2766     *p             = IdRef(_instruction[_o++]);
2767 }
ParseDPdy(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * p)2768 void ParseDPdy(const uint32_t *_instruction,
2769                IdResultType *idResultType1,
2770                IdResult *idResult2,
2771                IdRef *p)
2772 {
2773     spv::Op _op;
2774     uint32_t _length;
2775     GetInstructionOpAndLength(_instruction, &_op, &_length);
2776     ASSERT(_op == spv::OpDPdy);
2777     uint32_t _o    = 1;
2778     *idResultType1 = IdResultType(_instruction[_o++]);
2779     *idResult2     = IdResult(_instruction[_o++]);
2780     *p             = IdRef(_instruction[_o++]);
2781 }
ParseFwidth(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * p)2782 void ParseFwidth(const uint32_t *_instruction,
2783                  IdResultType *idResultType1,
2784                  IdResult *idResult2,
2785                  IdRef *p)
2786 {
2787     spv::Op _op;
2788     uint32_t _length;
2789     GetInstructionOpAndLength(_instruction, &_op, &_length);
2790     ASSERT(_op == spv::OpFwidth);
2791     uint32_t _o    = 1;
2792     *idResultType1 = IdResultType(_instruction[_o++]);
2793     *idResult2     = IdResult(_instruction[_o++]);
2794     *p             = IdRef(_instruction[_o++]);
2795 }
ParseDPdxFine(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * p)2796 void ParseDPdxFine(const uint32_t *_instruction,
2797                    IdResultType *idResultType1,
2798                    IdResult *idResult2,
2799                    IdRef *p)
2800 {
2801     spv::Op _op;
2802     uint32_t _length;
2803     GetInstructionOpAndLength(_instruction, &_op, &_length);
2804     ASSERT(_op == spv::OpDPdxFine);
2805     uint32_t _o    = 1;
2806     *idResultType1 = IdResultType(_instruction[_o++]);
2807     *idResult2     = IdResult(_instruction[_o++]);
2808     *p             = IdRef(_instruction[_o++]);
2809 }
ParseDPdyFine(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * p)2810 void ParseDPdyFine(const uint32_t *_instruction,
2811                    IdResultType *idResultType1,
2812                    IdResult *idResult2,
2813                    IdRef *p)
2814 {
2815     spv::Op _op;
2816     uint32_t _length;
2817     GetInstructionOpAndLength(_instruction, &_op, &_length);
2818     ASSERT(_op == spv::OpDPdyFine);
2819     uint32_t _o    = 1;
2820     *idResultType1 = IdResultType(_instruction[_o++]);
2821     *idResult2     = IdResult(_instruction[_o++]);
2822     *p             = IdRef(_instruction[_o++]);
2823 }
ParseFwidthFine(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * p)2824 void ParseFwidthFine(const uint32_t *_instruction,
2825                      IdResultType *idResultType1,
2826                      IdResult *idResult2,
2827                      IdRef *p)
2828 {
2829     spv::Op _op;
2830     uint32_t _length;
2831     GetInstructionOpAndLength(_instruction, &_op, &_length);
2832     ASSERT(_op == spv::OpFwidthFine);
2833     uint32_t _o    = 1;
2834     *idResultType1 = IdResultType(_instruction[_o++]);
2835     *idResult2     = IdResult(_instruction[_o++]);
2836     *p             = IdRef(_instruction[_o++]);
2837 }
ParseDPdxCoarse(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * p)2838 void ParseDPdxCoarse(const uint32_t *_instruction,
2839                      IdResultType *idResultType1,
2840                      IdResult *idResult2,
2841                      IdRef *p)
2842 {
2843     spv::Op _op;
2844     uint32_t _length;
2845     GetInstructionOpAndLength(_instruction, &_op, &_length);
2846     ASSERT(_op == spv::OpDPdxCoarse);
2847     uint32_t _o    = 1;
2848     *idResultType1 = IdResultType(_instruction[_o++]);
2849     *idResult2     = IdResult(_instruction[_o++]);
2850     *p             = IdRef(_instruction[_o++]);
2851 }
ParseDPdyCoarse(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * p)2852 void ParseDPdyCoarse(const uint32_t *_instruction,
2853                      IdResultType *idResultType1,
2854                      IdResult *idResult2,
2855                      IdRef *p)
2856 {
2857     spv::Op _op;
2858     uint32_t _length;
2859     GetInstructionOpAndLength(_instruction, &_op, &_length);
2860     ASSERT(_op == spv::OpDPdyCoarse);
2861     uint32_t _o    = 1;
2862     *idResultType1 = IdResultType(_instruction[_o++]);
2863     *idResult2     = IdResult(_instruction[_o++]);
2864     *p             = IdRef(_instruction[_o++]);
2865 }
ParseFwidthCoarse(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * p)2866 void ParseFwidthCoarse(const uint32_t *_instruction,
2867                        IdResultType *idResultType1,
2868                        IdResult *idResult2,
2869                        IdRef *p)
2870 {
2871     spv::Op _op;
2872     uint32_t _length;
2873     GetInstructionOpAndLength(_instruction, &_op, &_length);
2874     ASSERT(_op == spv::OpFwidthCoarse);
2875     uint32_t _o    = 1;
2876     *idResultType1 = IdResultType(_instruction[_o++]);
2877     *idResult2     = IdResult(_instruction[_o++]);
2878     *p             = IdRef(_instruction[_o++]);
2879 }
ParseEmitStreamVertex(const uint32_t * _instruction,IdRef * stream)2880 void ParseEmitStreamVertex(const uint32_t *_instruction, IdRef *stream)
2881 {
2882     spv::Op _op;
2883     uint32_t _length;
2884     GetInstructionOpAndLength(_instruction, &_op, &_length);
2885     ASSERT(_op == spv::OpEmitStreamVertex);
2886     uint32_t _o = 1;
2887     *stream     = IdRef(_instruction[_o++]);
2888 }
ParseEndStreamPrimitive(const uint32_t * _instruction,IdRef * stream)2889 void ParseEndStreamPrimitive(const uint32_t *_instruction, IdRef *stream)
2890 {
2891     spv::Op _op;
2892     uint32_t _length;
2893     GetInstructionOpAndLength(_instruction, &_op, &_length);
2894     ASSERT(_op == spv::OpEndStreamPrimitive);
2895     uint32_t _o = 1;
2896     *stream     = IdRef(_instruction[_o++]);
2897 }
ParseControlBarrier(const uint32_t * _instruction,IdScope * execution,IdScope * memory,IdMemorySemantics * semantics)2898 void ParseControlBarrier(const uint32_t *_instruction,
2899                          IdScope *execution,
2900                          IdScope *memory,
2901                          IdMemorySemantics *semantics)
2902 {
2903     spv::Op _op;
2904     uint32_t _length;
2905     GetInstructionOpAndLength(_instruction, &_op, &_length);
2906     ASSERT(_op == spv::OpControlBarrier);
2907     uint32_t _o = 1;
2908     *execution  = IdScope(_instruction[_o++]);
2909     *memory     = IdScope(_instruction[_o++]);
2910     *semantics  = IdMemorySemantics(_instruction[_o++]);
2911 }
ParseMemoryBarrier(const uint32_t * _instruction,IdScope * memory,IdMemorySemantics * semantics)2912 void ParseMemoryBarrier(const uint32_t *_instruction, IdScope *memory, IdMemorySemantics *semantics)
2913 {
2914     spv::Op _op;
2915     uint32_t _length;
2916     GetInstructionOpAndLength(_instruction, &_op, &_length);
2917     ASSERT(_op == spv::OpMemoryBarrier);
2918     uint32_t _o = 1;
2919     *memory     = IdScope(_instruction[_o++]);
2920     *semantics  = IdMemorySemantics(_instruction[_o++]);
2921 }
ParseAtomicLoad(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * pointer,IdScope * memory,IdMemorySemantics * semantics)2922 void ParseAtomicLoad(const uint32_t *_instruction,
2923                      IdResultType *idResultType1,
2924                      IdResult *idResult2,
2925                      IdRef *pointer,
2926                      IdScope *memory,
2927                      IdMemorySemantics *semantics)
2928 {
2929     spv::Op _op;
2930     uint32_t _length;
2931     GetInstructionOpAndLength(_instruction, &_op, &_length);
2932     ASSERT(_op == spv::OpAtomicLoad);
2933     uint32_t _o    = 1;
2934     *idResultType1 = IdResultType(_instruction[_o++]);
2935     *idResult2     = IdResult(_instruction[_o++]);
2936     *pointer       = IdRef(_instruction[_o++]);
2937     *memory        = IdScope(_instruction[_o++]);
2938     *semantics     = IdMemorySemantics(_instruction[_o++]);
2939 }
ParseAtomicStore(const uint32_t * _instruction,IdRef * pointer,IdScope * memory,IdMemorySemantics * semantics,IdRef * value)2940 void ParseAtomicStore(const uint32_t *_instruction,
2941                       IdRef *pointer,
2942                       IdScope *memory,
2943                       IdMemorySemantics *semantics,
2944                       IdRef *value)
2945 {
2946     spv::Op _op;
2947     uint32_t _length;
2948     GetInstructionOpAndLength(_instruction, &_op, &_length);
2949     ASSERT(_op == spv::OpAtomicStore);
2950     uint32_t _o = 1;
2951     *pointer    = IdRef(_instruction[_o++]);
2952     *memory     = IdScope(_instruction[_o++]);
2953     *semantics  = IdMemorySemantics(_instruction[_o++]);
2954     *value      = IdRef(_instruction[_o++]);
2955 }
ParseAtomicExchange(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * pointer,IdScope * memory,IdMemorySemantics * semantics,IdRef * value)2956 void ParseAtomicExchange(const uint32_t *_instruction,
2957                          IdResultType *idResultType1,
2958                          IdResult *idResult2,
2959                          IdRef *pointer,
2960                          IdScope *memory,
2961                          IdMemorySemantics *semantics,
2962                          IdRef *value)
2963 {
2964     spv::Op _op;
2965     uint32_t _length;
2966     GetInstructionOpAndLength(_instruction, &_op, &_length);
2967     ASSERT(_op == spv::OpAtomicExchange);
2968     uint32_t _o    = 1;
2969     *idResultType1 = IdResultType(_instruction[_o++]);
2970     *idResult2     = IdResult(_instruction[_o++]);
2971     *pointer       = IdRef(_instruction[_o++]);
2972     *memory        = IdScope(_instruction[_o++]);
2973     *semantics     = IdMemorySemantics(_instruction[_o++]);
2974     *value         = IdRef(_instruction[_o++]);
2975 }
ParseAtomicCompareExchange(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * pointer,IdScope * memory,IdMemorySemantics * equal,IdMemorySemantics * unequal,IdRef * value,IdRef * comparator)2976 void ParseAtomicCompareExchange(const uint32_t *_instruction,
2977                                 IdResultType *idResultType1,
2978                                 IdResult *idResult2,
2979                                 IdRef *pointer,
2980                                 IdScope *memory,
2981                                 IdMemorySemantics *equal,
2982                                 IdMemorySemantics *unequal,
2983                                 IdRef *value,
2984                                 IdRef *comparator)
2985 {
2986     spv::Op _op;
2987     uint32_t _length;
2988     GetInstructionOpAndLength(_instruction, &_op, &_length);
2989     ASSERT(_op == spv::OpAtomicCompareExchange);
2990     uint32_t _o    = 1;
2991     *idResultType1 = IdResultType(_instruction[_o++]);
2992     *idResult2     = IdResult(_instruction[_o++]);
2993     *pointer       = IdRef(_instruction[_o++]);
2994     *memory        = IdScope(_instruction[_o++]);
2995     *equal         = IdMemorySemantics(_instruction[_o++]);
2996     *unequal       = IdMemorySemantics(_instruction[_o++]);
2997     *value         = IdRef(_instruction[_o++]);
2998     *comparator    = IdRef(_instruction[_o++]);
2999 }
ParseAtomicIIncrement(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * pointer,IdScope * memory,IdMemorySemantics * semantics)3000 void ParseAtomicIIncrement(const uint32_t *_instruction,
3001                            IdResultType *idResultType1,
3002                            IdResult *idResult2,
3003                            IdRef *pointer,
3004                            IdScope *memory,
3005                            IdMemorySemantics *semantics)
3006 {
3007     spv::Op _op;
3008     uint32_t _length;
3009     GetInstructionOpAndLength(_instruction, &_op, &_length);
3010     ASSERT(_op == spv::OpAtomicIIncrement);
3011     uint32_t _o    = 1;
3012     *idResultType1 = IdResultType(_instruction[_o++]);
3013     *idResult2     = IdResult(_instruction[_o++]);
3014     *pointer       = IdRef(_instruction[_o++]);
3015     *memory        = IdScope(_instruction[_o++]);
3016     *semantics     = IdMemorySemantics(_instruction[_o++]);
3017 }
ParseAtomicIDecrement(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * pointer,IdScope * memory,IdMemorySemantics * semantics)3018 void ParseAtomicIDecrement(const uint32_t *_instruction,
3019                            IdResultType *idResultType1,
3020                            IdResult *idResult2,
3021                            IdRef *pointer,
3022                            IdScope *memory,
3023                            IdMemorySemantics *semantics)
3024 {
3025     spv::Op _op;
3026     uint32_t _length;
3027     GetInstructionOpAndLength(_instruction, &_op, &_length);
3028     ASSERT(_op == spv::OpAtomicIDecrement);
3029     uint32_t _o    = 1;
3030     *idResultType1 = IdResultType(_instruction[_o++]);
3031     *idResult2     = IdResult(_instruction[_o++]);
3032     *pointer       = IdRef(_instruction[_o++]);
3033     *memory        = IdScope(_instruction[_o++]);
3034     *semantics     = IdMemorySemantics(_instruction[_o++]);
3035 }
ParseAtomicIAdd(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * pointer,IdScope * memory,IdMemorySemantics * semantics,IdRef * value)3036 void ParseAtomicIAdd(const uint32_t *_instruction,
3037                      IdResultType *idResultType1,
3038                      IdResult *idResult2,
3039                      IdRef *pointer,
3040                      IdScope *memory,
3041                      IdMemorySemantics *semantics,
3042                      IdRef *value)
3043 {
3044     spv::Op _op;
3045     uint32_t _length;
3046     GetInstructionOpAndLength(_instruction, &_op, &_length);
3047     ASSERT(_op == spv::OpAtomicIAdd);
3048     uint32_t _o    = 1;
3049     *idResultType1 = IdResultType(_instruction[_o++]);
3050     *idResult2     = IdResult(_instruction[_o++]);
3051     *pointer       = IdRef(_instruction[_o++]);
3052     *memory        = IdScope(_instruction[_o++]);
3053     *semantics     = IdMemorySemantics(_instruction[_o++]);
3054     *value         = IdRef(_instruction[_o++]);
3055 }
ParseAtomicISub(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * pointer,IdScope * memory,IdMemorySemantics * semantics,IdRef * value)3056 void ParseAtomicISub(const uint32_t *_instruction,
3057                      IdResultType *idResultType1,
3058                      IdResult *idResult2,
3059                      IdRef *pointer,
3060                      IdScope *memory,
3061                      IdMemorySemantics *semantics,
3062                      IdRef *value)
3063 {
3064     spv::Op _op;
3065     uint32_t _length;
3066     GetInstructionOpAndLength(_instruction, &_op, &_length);
3067     ASSERT(_op == spv::OpAtomicISub);
3068     uint32_t _o    = 1;
3069     *idResultType1 = IdResultType(_instruction[_o++]);
3070     *idResult2     = IdResult(_instruction[_o++]);
3071     *pointer       = IdRef(_instruction[_o++]);
3072     *memory        = IdScope(_instruction[_o++]);
3073     *semantics     = IdMemorySemantics(_instruction[_o++]);
3074     *value         = IdRef(_instruction[_o++]);
3075 }
ParseAtomicSMin(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * pointer,IdScope * memory,IdMemorySemantics * semantics,IdRef * value)3076 void ParseAtomicSMin(const uint32_t *_instruction,
3077                      IdResultType *idResultType1,
3078                      IdResult *idResult2,
3079                      IdRef *pointer,
3080                      IdScope *memory,
3081                      IdMemorySemantics *semantics,
3082                      IdRef *value)
3083 {
3084     spv::Op _op;
3085     uint32_t _length;
3086     GetInstructionOpAndLength(_instruction, &_op, &_length);
3087     ASSERT(_op == spv::OpAtomicSMin);
3088     uint32_t _o    = 1;
3089     *idResultType1 = IdResultType(_instruction[_o++]);
3090     *idResult2     = IdResult(_instruction[_o++]);
3091     *pointer       = IdRef(_instruction[_o++]);
3092     *memory        = IdScope(_instruction[_o++]);
3093     *semantics     = IdMemorySemantics(_instruction[_o++]);
3094     *value         = IdRef(_instruction[_o++]);
3095 }
ParseAtomicUMin(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * pointer,IdScope * memory,IdMemorySemantics * semantics,IdRef * value)3096 void ParseAtomicUMin(const uint32_t *_instruction,
3097                      IdResultType *idResultType1,
3098                      IdResult *idResult2,
3099                      IdRef *pointer,
3100                      IdScope *memory,
3101                      IdMemorySemantics *semantics,
3102                      IdRef *value)
3103 {
3104     spv::Op _op;
3105     uint32_t _length;
3106     GetInstructionOpAndLength(_instruction, &_op, &_length);
3107     ASSERT(_op == spv::OpAtomicUMin);
3108     uint32_t _o    = 1;
3109     *idResultType1 = IdResultType(_instruction[_o++]);
3110     *idResult2     = IdResult(_instruction[_o++]);
3111     *pointer       = IdRef(_instruction[_o++]);
3112     *memory        = IdScope(_instruction[_o++]);
3113     *semantics     = IdMemorySemantics(_instruction[_o++]);
3114     *value         = IdRef(_instruction[_o++]);
3115 }
ParseAtomicSMax(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * pointer,IdScope * memory,IdMemorySemantics * semantics,IdRef * value)3116 void ParseAtomicSMax(const uint32_t *_instruction,
3117                      IdResultType *idResultType1,
3118                      IdResult *idResult2,
3119                      IdRef *pointer,
3120                      IdScope *memory,
3121                      IdMemorySemantics *semantics,
3122                      IdRef *value)
3123 {
3124     spv::Op _op;
3125     uint32_t _length;
3126     GetInstructionOpAndLength(_instruction, &_op, &_length);
3127     ASSERT(_op == spv::OpAtomicSMax);
3128     uint32_t _o    = 1;
3129     *idResultType1 = IdResultType(_instruction[_o++]);
3130     *idResult2     = IdResult(_instruction[_o++]);
3131     *pointer       = IdRef(_instruction[_o++]);
3132     *memory        = IdScope(_instruction[_o++]);
3133     *semantics     = IdMemorySemantics(_instruction[_o++]);
3134     *value         = IdRef(_instruction[_o++]);
3135 }
ParseAtomicUMax(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * pointer,IdScope * memory,IdMemorySemantics * semantics,IdRef * value)3136 void ParseAtomicUMax(const uint32_t *_instruction,
3137                      IdResultType *idResultType1,
3138                      IdResult *idResult2,
3139                      IdRef *pointer,
3140                      IdScope *memory,
3141                      IdMemorySemantics *semantics,
3142                      IdRef *value)
3143 {
3144     spv::Op _op;
3145     uint32_t _length;
3146     GetInstructionOpAndLength(_instruction, &_op, &_length);
3147     ASSERT(_op == spv::OpAtomicUMax);
3148     uint32_t _o    = 1;
3149     *idResultType1 = IdResultType(_instruction[_o++]);
3150     *idResult2     = IdResult(_instruction[_o++]);
3151     *pointer       = IdRef(_instruction[_o++]);
3152     *memory        = IdScope(_instruction[_o++]);
3153     *semantics     = IdMemorySemantics(_instruction[_o++]);
3154     *value         = IdRef(_instruction[_o++]);
3155 }
ParseAtomicAnd(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * pointer,IdScope * memory,IdMemorySemantics * semantics,IdRef * value)3156 void ParseAtomicAnd(const uint32_t *_instruction,
3157                     IdResultType *idResultType1,
3158                     IdResult *idResult2,
3159                     IdRef *pointer,
3160                     IdScope *memory,
3161                     IdMemorySemantics *semantics,
3162                     IdRef *value)
3163 {
3164     spv::Op _op;
3165     uint32_t _length;
3166     GetInstructionOpAndLength(_instruction, &_op, &_length);
3167     ASSERT(_op == spv::OpAtomicAnd);
3168     uint32_t _o    = 1;
3169     *idResultType1 = IdResultType(_instruction[_o++]);
3170     *idResult2     = IdResult(_instruction[_o++]);
3171     *pointer       = IdRef(_instruction[_o++]);
3172     *memory        = IdScope(_instruction[_o++]);
3173     *semantics     = IdMemorySemantics(_instruction[_o++]);
3174     *value         = IdRef(_instruction[_o++]);
3175 }
ParseAtomicOr(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * pointer,IdScope * memory,IdMemorySemantics * semantics,IdRef * value)3176 void ParseAtomicOr(const uint32_t *_instruction,
3177                    IdResultType *idResultType1,
3178                    IdResult *idResult2,
3179                    IdRef *pointer,
3180                    IdScope *memory,
3181                    IdMemorySemantics *semantics,
3182                    IdRef *value)
3183 {
3184     spv::Op _op;
3185     uint32_t _length;
3186     GetInstructionOpAndLength(_instruction, &_op, &_length);
3187     ASSERT(_op == spv::OpAtomicOr);
3188     uint32_t _o    = 1;
3189     *idResultType1 = IdResultType(_instruction[_o++]);
3190     *idResult2     = IdResult(_instruction[_o++]);
3191     *pointer       = IdRef(_instruction[_o++]);
3192     *memory        = IdScope(_instruction[_o++]);
3193     *semantics     = IdMemorySemantics(_instruction[_o++]);
3194     *value         = IdRef(_instruction[_o++]);
3195 }
ParseAtomicXor(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * pointer,IdScope * memory,IdMemorySemantics * semantics,IdRef * value)3196 void ParseAtomicXor(const uint32_t *_instruction,
3197                     IdResultType *idResultType1,
3198                     IdResult *idResult2,
3199                     IdRef *pointer,
3200                     IdScope *memory,
3201                     IdMemorySemantics *semantics,
3202                     IdRef *value)
3203 {
3204     spv::Op _op;
3205     uint32_t _length;
3206     GetInstructionOpAndLength(_instruction, &_op, &_length);
3207     ASSERT(_op == spv::OpAtomicXor);
3208     uint32_t _o    = 1;
3209     *idResultType1 = IdResultType(_instruction[_o++]);
3210     *idResult2     = IdResult(_instruction[_o++]);
3211     *pointer       = IdRef(_instruction[_o++]);
3212     *memory        = IdScope(_instruction[_o++]);
3213     *semantics     = IdMemorySemantics(_instruction[_o++]);
3214     *value         = IdRef(_instruction[_o++]);
3215 }
ParsePhi(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,PairIdRefIdRefList * variableParentPairList)3216 void ParsePhi(const uint32_t *_instruction,
3217               IdResultType *idResultType1,
3218               IdResult *idResult2,
3219               PairIdRefIdRefList *variableParentPairList)
3220 {
3221     spv::Op _op;
3222     uint32_t _length;
3223     GetInstructionOpAndLength(_instruction, &_op, &_length);
3224     ASSERT(_op == spv::OpPhi);
3225     uint32_t _o    = 1;
3226     *idResultType1 = IdResultType(_instruction[_o++]);
3227     *idResult2     = IdResult(_instruction[_o++]);
3228     if (variableParentPairList)
3229     {
3230         while (_o < _length)
3231         {
3232             variableParentPairList->emplace_back(
3233                 PairIdRefIdRef{IdRef(_instruction[_o]), IdRef(_instruction[_o + 1])});
3234             _o += 2;
3235         }
3236     }
3237 }
ParseLoopMerge(const uint32_t * _instruction,IdRef * mergeBlock,IdRef * continueTarget,spv::LoopControlMask * loopControl3)3238 void ParseLoopMerge(const uint32_t *_instruction,
3239                     IdRef *mergeBlock,
3240                     IdRef *continueTarget,
3241                     spv::LoopControlMask *loopControl3)
3242 {
3243     spv::Op _op;
3244     uint32_t _length;
3245     GetInstructionOpAndLength(_instruction, &_op, &_length);
3246     ASSERT(_op == spv::OpLoopMerge);
3247     uint32_t _o     = 1;
3248     *mergeBlock     = IdRef(_instruction[_o++]);
3249     *continueTarget = IdRef(_instruction[_o++]);
3250     *loopControl3   = spv::LoopControlMask(_instruction[_o++]);
3251 }
ParseSelectionMerge(const uint32_t * _instruction,IdRef * mergeBlock,spv::SelectionControlMask * selectionControl2)3252 void ParseSelectionMerge(const uint32_t *_instruction,
3253                          IdRef *mergeBlock,
3254                          spv::SelectionControlMask *selectionControl2)
3255 {
3256     spv::Op _op;
3257     uint32_t _length;
3258     GetInstructionOpAndLength(_instruction, &_op, &_length);
3259     ASSERT(_op == spv::OpSelectionMerge);
3260     uint32_t _o        = 1;
3261     *mergeBlock        = IdRef(_instruction[_o++]);
3262     *selectionControl2 = spv::SelectionControlMask(_instruction[_o++]);
3263 }
ParseLabel(const uint32_t * _instruction,IdResult * idResult1)3264 void ParseLabel(const uint32_t *_instruction, IdResult *idResult1)
3265 {
3266     spv::Op _op;
3267     uint32_t _length;
3268     GetInstructionOpAndLength(_instruction, &_op, &_length);
3269     ASSERT(_op == spv::OpLabel);
3270     uint32_t _o = 1;
3271     *idResult1  = IdResult(_instruction[_o++]);
3272 }
ParseBranch(const uint32_t * _instruction,IdRef * targetLabel)3273 void ParseBranch(const uint32_t *_instruction, IdRef *targetLabel)
3274 {
3275     spv::Op _op;
3276     uint32_t _length;
3277     GetInstructionOpAndLength(_instruction, &_op, &_length);
3278     ASSERT(_op == spv::OpBranch);
3279     uint32_t _o  = 1;
3280     *targetLabel = IdRef(_instruction[_o++]);
3281 }
ParseBranchConditional(const uint32_t * _instruction,IdRef * condition,IdRef * trueLabel,IdRef * falseLabel,LiteralIntegerList * branchweightsList)3282 void ParseBranchConditional(const uint32_t *_instruction,
3283                             IdRef *condition,
3284                             IdRef *trueLabel,
3285                             IdRef *falseLabel,
3286                             LiteralIntegerList *branchweightsList)
3287 {
3288     spv::Op _op;
3289     uint32_t _length;
3290     GetInstructionOpAndLength(_instruction, &_op, &_length);
3291     ASSERT(_op == spv::OpBranchConditional);
3292     uint32_t _o = 1;
3293     *condition  = IdRef(_instruction[_o++]);
3294     *trueLabel  = IdRef(_instruction[_o++]);
3295     *falseLabel = IdRef(_instruction[_o++]);
3296     if (branchweightsList)
3297     {
3298         while (_o < _length)
3299         {
3300             branchweightsList->emplace_back(_instruction[_o++]);
3301         }
3302     }
3303 }
ParseSwitch(const uint32_t * _instruction,IdRef * selector,IdRef * default_,PairLiteralIntegerIdRefList * targetPairList)3304 void ParseSwitch(const uint32_t *_instruction,
3305                  IdRef *selector,
3306                  IdRef *default_,
3307                  PairLiteralIntegerIdRefList *targetPairList)
3308 {
3309     spv::Op _op;
3310     uint32_t _length;
3311     GetInstructionOpAndLength(_instruction, &_op, &_length);
3312     ASSERT(_op == spv::OpSwitch);
3313     uint32_t _o = 1;
3314     *selector   = IdRef(_instruction[_o++]);
3315     *default_   = IdRef(_instruction[_o++]);
3316     if (targetPairList)
3317     {
3318         while (_o < _length)
3319         {
3320             targetPairList->emplace_back(PairLiteralIntegerIdRef{LiteralInteger(_instruction[_o]),
3321                                                                  IdRef(_instruction[_o + 1])});
3322             _o += 2;
3323         }
3324     }
3325 }
ParseReturnValue(const uint32_t * _instruction,IdRef * value)3326 void ParseReturnValue(const uint32_t *_instruction, IdRef *value)
3327 {
3328     spv::Op _op;
3329     uint32_t _length;
3330     GetInstructionOpAndLength(_instruction, &_op, &_length);
3331     ASSERT(_op == spv::OpReturnValue);
3332     uint32_t _o = 1;
3333     *value      = IdRef(_instruction[_o++]);
3334 }
ParseImageSparseSampleImplicitLod(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * sampledImage,IdRef * coordinate,spv::ImageOperandsMask * imageOperands5,IdRefList * imageOperandIdsList)3335 void ParseImageSparseSampleImplicitLod(const uint32_t *_instruction,
3336                                        IdResultType *idResultType1,
3337                                        IdResult *idResult2,
3338                                        IdRef *sampledImage,
3339                                        IdRef *coordinate,
3340                                        spv::ImageOperandsMask *imageOperands5,
3341                                        IdRefList *imageOperandIdsList)
3342 {
3343     spv::Op _op;
3344     uint32_t _length;
3345     GetInstructionOpAndLength(_instruction, &_op, &_length);
3346     ASSERT(_op == spv::OpImageSparseSampleImplicitLod);
3347     uint32_t _o    = 1;
3348     *idResultType1 = IdResultType(_instruction[_o++]);
3349     *idResult2     = IdResult(_instruction[_o++]);
3350     *sampledImage  = IdRef(_instruction[_o++]);
3351     *coordinate    = IdRef(_instruction[_o++]);
3352     if (imageOperands5 && _o < _length)
3353     {
3354         *imageOperands5 = spv::ImageOperandsMask(_instruction[_o++]);
3355     }
3356     if (imageOperandIdsList)
3357     {
3358         while (_o < _length)
3359         {
3360             imageOperandIdsList->emplace_back(_instruction[_o++]);
3361         }
3362     }
3363 }
ParseImageSparseSampleExplicitLod(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * sampledImage,IdRef * coordinate,spv::ImageOperandsMask * imageOperands5,IdRefList * imageOperandIdsList)3364 void ParseImageSparseSampleExplicitLod(const uint32_t *_instruction,
3365                                        IdResultType *idResultType1,
3366                                        IdResult *idResult2,
3367                                        IdRef *sampledImage,
3368                                        IdRef *coordinate,
3369                                        spv::ImageOperandsMask *imageOperands5,
3370                                        IdRefList *imageOperandIdsList)
3371 {
3372     spv::Op _op;
3373     uint32_t _length;
3374     GetInstructionOpAndLength(_instruction, &_op, &_length);
3375     ASSERT(_op == spv::OpImageSparseSampleExplicitLod);
3376     uint32_t _o     = 1;
3377     *idResultType1  = IdResultType(_instruction[_o++]);
3378     *idResult2      = IdResult(_instruction[_o++]);
3379     *sampledImage   = IdRef(_instruction[_o++]);
3380     *coordinate     = IdRef(_instruction[_o++]);
3381     *imageOperands5 = spv::ImageOperandsMask(_instruction[_o++]);
3382     if (imageOperandIdsList)
3383     {
3384         while (_o < _length)
3385         {
3386             imageOperandIdsList->emplace_back(_instruction[_o++]);
3387         }
3388     }
3389 }
ParseImageSparseSampleDrefImplicitLod(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * sampledImage,IdRef * coordinate,IdRef * dref,spv::ImageOperandsMask * imageOperands6,IdRefList * imageOperandIdsList)3390 void ParseImageSparseSampleDrefImplicitLod(const uint32_t *_instruction,
3391                                            IdResultType *idResultType1,
3392                                            IdResult *idResult2,
3393                                            IdRef *sampledImage,
3394                                            IdRef *coordinate,
3395                                            IdRef *dref,
3396                                            spv::ImageOperandsMask *imageOperands6,
3397                                            IdRefList *imageOperandIdsList)
3398 {
3399     spv::Op _op;
3400     uint32_t _length;
3401     GetInstructionOpAndLength(_instruction, &_op, &_length);
3402     ASSERT(_op == spv::OpImageSparseSampleDrefImplicitLod);
3403     uint32_t _o    = 1;
3404     *idResultType1 = IdResultType(_instruction[_o++]);
3405     *idResult2     = IdResult(_instruction[_o++]);
3406     *sampledImage  = IdRef(_instruction[_o++]);
3407     *coordinate    = IdRef(_instruction[_o++]);
3408     *dref          = IdRef(_instruction[_o++]);
3409     if (imageOperands6 && _o < _length)
3410     {
3411         *imageOperands6 = spv::ImageOperandsMask(_instruction[_o++]);
3412     }
3413     if (imageOperandIdsList)
3414     {
3415         while (_o < _length)
3416         {
3417             imageOperandIdsList->emplace_back(_instruction[_o++]);
3418         }
3419     }
3420 }
ParseImageSparseSampleDrefExplicitLod(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * sampledImage,IdRef * coordinate,IdRef * dref,spv::ImageOperandsMask * imageOperands6,IdRefList * imageOperandIdsList)3421 void ParseImageSparseSampleDrefExplicitLod(const uint32_t *_instruction,
3422                                            IdResultType *idResultType1,
3423                                            IdResult *idResult2,
3424                                            IdRef *sampledImage,
3425                                            IdRef *coordinate,
3426                                            IdRef *dref,
3427                                            spv::ImageOperandsMask *imageOperands6,
3428                                            IdRefList *imageOperandIdsList)
3429 {
3430     spv::Op _op;
3431     uint32_t _length;
3432     GetInstructionOpAndLength(_instruction, &_op, &_length);
3433     ASSERT(_op == spv::OpImageSparseSampleDrefExplicitLod);
3434     uint32_t _o     = 1;
3435     *idResultType1  = IdResultType(_instruction[_o++]);
3436     *idResult2      = IdResult(_instruction[_o++]);
3437     *sampledImage   = IdRef(_instruction[_o++]);
3438     *coordinate     = IdRef(_instruction[_o++]);
3439     *dref           = IdRef(_instruction[_o++]);
3440     *imageOperands6 = spv::ImageOperandsMask(_instruction[_o++]);
3441     if (imageOperandIdsList)
3442     {
3443         while (_o < _length)
3444         {
3445             imageOperandIdsList->emplace_back(_instruction[_o++]);
3446         }
3447     }
3448 }
ParseImageSparseSampleProjImplicitLod(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * sampledImage,IdRef * coordinate,spv::ImageOperandsMask * imageOperands5,IdRefList * imageOperandIdsList)3449 void ParseImageSparseSampleProjImplicitLod(const uint32_t *_instruction,
3450                                            IdResultType *idResultType1,
3451                                            IdResult *idResult2,
3452                                            IdRef *sampledImage,
3453                                            IdRef *coordinate,
3454                                            spv::ImageOperandsMask *imageOperands5,
3455                                            IdRefList *imageOperandIdsList)
3456 {
3457     spv::Op _op;
3458     uint32_t _length;
3459     GetInstructionOpAndLength(_instruction, &_op, &_length);
3460     ASSERT(_op == spv::OpImageSparseSampleProjImplicitLod);
3461     uint32_t _o    = 1;
3462     *idResultType1 = IdResultType(_instruction[_o++]);
3463     *idResult2     = IdResult(_instruction[_o++]);
3464     *sampledImage  = IdRef(_instruction[_o++]);
3465     *coordinate    = IdRef(_instruction[_o++]);
3466     if (imageOperands5 && _o < _length)
3467     {
3468         *imageOperands5 = spv::ImageOperandsMask(_instruction[_o++]);
3469     }
3470     if (imageOperandIdsList)
3471     {
3472         while (_o < _length)
3473         {
3474             imageOperandIdsList->emplace_back(_instruction[_o++]);
3475         }
3476     }
3477 }
ParseImageSparseSampleProjExplicitLod(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * sampledImage,IdRef * coordinate,spv::ImageOperandsMask * imageOperands5,IdRefList * imageOperandIdsList)3478 void ParseImageSparseSampleProjExplicitLod(const uint32_t *_instruction,
3479                                            IdResultType *idResultType1,
3480                                            IdResult *idResult2,
3481                                            IdRef *sampledImage,
3482                                            IdRef *coordinate,
3483                                            spv::ImageOperandsMask *imageOperands5,
3484                                            IdRefList *imageOperandIdsList)
3485 {
3486     spv::Op _op;
3487     uint32_t _length;
3488     GetInstructionOpAndLength(_instruction, &_op, &_length);
3489     ASSERT(_op == spv::OpImageSparseSampleProjExplicitLod);
3490     uint32_t _o     = 1;
3491     *idResultType1  = IdResultType(_instruction[_o++]);
3492     *idResult2      = IdResult(_instruction[_o++]);
3493     *sampledImage   = IdRef(_instruction[_o++]);
3494     *coordinate     = IdRef(_instruction[_o++]);
3495     *imageOperands5 = spv::ImageOperandsMask(_instruction[_o++]);
3496     if (imageOperandIdsList)
3497     {
3498         while (_o < _length)
3499         {
3500             imageOperandIdsList->emplace_back(_instruction[_o++]);
3501         }
3502     }
3503 }
ParseImageSparseSampleProjDrefImplicitLod(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * sampledImage,IdRef * coordinate,IdRef * dref,spv::ImageOperandsMask * imageOperands6,IdRefList * imageOperandIdsList)3504 void ParseImageSparseSampleProjDrefImplicitLod(const uint32_t *_instruction,
3505                                                IdResultType *idResultType1,
3506                                                IdResult *idResult2,
3507                                                IdRef *sampledImage,
3508                                                IdRef *coordinate,
3509                                                IdRef *dref,
3510                                                spv::ImageOperandsMask *imageOperands6,
3511                                                IdRefList *imageOperandIdsList)
3512 {
3513     spv::Op _op;
3514     uint32_t _length;
3515     GetInstructionOpAndLength(_instruction, &_op, &_length);
3516     ASSERT(_op == spv::OpImageSparseSampleProjDrefImplicitLod);
3517     uint32_t _o    = 1;
3518     *idResultType1 = IdResultType(_instruction[_o++]);
3519     *idResult2     = IdResult(_instruction[_o++]);
3520     *sampledImage  = IdRef(_instruction[_o++]);
3521     *coordinate    = IdRef(_instruction[_o++]);
3522     *dref          = IdRef(_instruction[_o++]);
3523     if (imageOperands6 && _o < _length)
3524     {
3525         *imageOperands6 = spv::ImageOperandsMask(_instruction[_o++]);
3526     }
3527     if (imageOperandIdsList)
3528     {
3529         while (_o < _length)
3530         {
3531             imageOperandIdsList->emplace_back(_instruction[_o++]);
3532         }
3533     }
3534 }
ParseImageSparseSampleProjDrefExplicitLod(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * sampledImage,IdRef * coordinate,IdRef * dref,spv::ImageOperandsMask * imageOperands6,IdRefList * imageOperandIdsList)3535 void ParseImageSparseSampleProjDrefExplicitLod(const uint32_t *_instruction,
3536                                                IdResultType *idResultType1,
3537                                                IdResult *idResult2,
3538                                                IdRef *sampledImage,
3539                                                IdRef *coordinate,
3540                                                IdRef *dref,
3541                                                spv::ImageOperandsMask *imageOperands6,
3542                                                IdRefList *imageOperandIdsList)
3543 {
3544     spv::Op _op;
3545     uint32_t _length;
3546     GetInstructionOpAndLength(_instruction, &_op, &_length);
3547     ASSERT(_op == spv::OpImageSparseSampleProjDrefExplicitLod);
3548     uint32_t _o     = 1;
3549     *idResultType1  = IdResultType(_instruction[_o++]);
3550     *idResult2      = IdResult(_instruction[_o++]);
3551     *sampledImage   = IdRef(_instruction[_o++]);
3552     *coordinate     = IdRef(_instruction[_o++]);
3553     *dref           = IdRef(_instruction[_o++]);
3554     *imageOperands6 = spv::ImageOperandsMask(_instruction[_o++]);
3555     if (imageOperandIdsList)
3556     {
3557         while (_o < _length)
3558         {
3559             imageOperandIdsList->emplace_back(_instruction[_o++]);
3560         }
3561     }
3562 }
ParseImageSparseFetch(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * image,IdRef * coordinate,spv::ImageOperandsMask * imageOperands5,IdRefList * imageOperandIdsList)3563 void ParseImageSparseFetch(const uint32_t *_instruction,
3564                            IdResultType *idResultType1,
3565                            IdResult *idResult2,
3566                            IdRef *image,
3567                            IdRef *coordinate,
3568                            spv::ImageOperandsMask *imageOperands5,
3569                            IdRefList *imageOperandIdsList)
3570 {
3571     spv::Op _op;
3572     uint32_t _length;
3573     GetInstructionOpAndLength(_instruction, &_op, &_length);
3574     ASSERT(_op == spv::OpImageSparseFetch);
3575     uint32_t _o    = 1;
3576     *idResultType1 = IdResultType(_instruction[_o++]);
3577     *idResult2     = IdResult(_instruction[_o++]);
3578     *image         = IdRef(_instruction[_o++]);
3579     *coordinate    = IdRef(_instruction[_o++]);
3580     if (imageOperands5 && _o < _length)
3581     {
3582         *imageOperands5 = spv::ImageOperandsMask(_instruction[_o++]);
3583     }
3584     if (imageOperandIdsList)
3585     {
3586         while (_o < _length)
3587         {
3588             imageOperandIdsList->emplace_back(_instruction[_o++]);
3589         }
3590     }
3591 }
ParseImageSparseGather(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * sampledImage,IdRef * coordinate,IdRef * component,spv::ImageOperandsMask * imageOperands6,IdRefList * imageOperandIdsList)3592 void ParseImageSparseGather(const uint32_t *_instruction,
3593                             IdResultType *idResultType1,
3594                             IdResult *idResult2,
3595                             IdRef *sampledImage,
3596                             IdRef *coordinate,
3597                             IdRef *component,
3598                             spv::ImageOperandsMask *imageOperands6,
3599                             IdRefList *imageOperandIdsList)
3600 {
3601     spv::Op _op;
3602     uint32_t _length;
3603     GetInstructionOpAndLength(_instruction, &_op, &_length);
3604     ASSERT(_op == spv::OpImageSparseGather);
3605     uint32_t _o    = 1;
3606     *idResultType1 = IdResultType(_instruction[_o++]);
3607     *idResult2     = IdResult(_instruction[_o++]);
3608     *sampledImage  = IdRef(_instruction[_o++]);
3609     *coordinate    = IdRef(_instruction[_o++]);
3610     *component     = IdRef(_instruction[_o++]);
3611     if (imageOperands6 && _o < _length)
3612     {
3613         *imageOperands6 = spv::ImageOperandsMask(_instruction[_o++]);
3614     }
3615     if (imageOperandIdsList)
3616     {
3617         while (_o < _length)
3618         {
3619             imageOperandIdsList->emplace_back(_instruction[_o++]);
3620         }
3621     }
3622 }
ParseImageSparseDrefGather(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * sampledImage,IdRef * coordinate,IdRef * dref,spv::ImageOperandsMask * imageOperands6,IdRefList * imageOperandIdsList)3623 void ParseImageSparseDrefGather(const uint32_t *_instruction,
3624                                 IdResultType *idResultType1,
3625                                 IdResult *idResult2,
3626                                 IdRef *sampledImage,
3627                                 IdRef *coordinate,
3628                                 IdRef *dref,
3629                                 spv::ImageOperandsMask *imageOperands6,
3630                                 IdRefList *imageOperandIdsList)
3631 {
3632     spv::Op _op;
3633     uint32_t _length;
3634     GetInstructionOpAndLength(_instruction, &_op, &_length);
3635     ASSERT(_op == spv::OpImageSparseDrefGather);
3636     uint32_t _o    = 1;
3637     *idResultType1 = IdResultType(_instruction[_o++]);
3638     *idResult2     = IdResult(_instruction[_o++]);
3639     *sampledImage  = IdRef(_instruction[_o++]);
3640     *coordinate    = IdRef(_instruction[_o++]);
3641     *dref          = IdRef(_instruction[_o++]);
3642     if (imageOperands6 && _o < _length)
3643     {
3644         *imageOperands6 = spv::ImageOperandsMask(_instruction[_o++]);
3645     }
3646     if (imageOperandIdsList)
3647     {
3648         while (_o < _length)
3649         {
3650             imageOperandIdsList->emplace_back(_instruction[_o++]);
3651         }
3652     }
3653 }
ParseImageSparseTexelsResident(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * residentCode)3654 void ParseImageSparseTexelsResident(const uint32_t *_instruction,
3655                                     IdResultType *idResultType1,
3656                                     IdResult *idResult2,
3657                                     IdRef *residentCode)
3658 {
3659     spv::Op _op;
3660     uint32_t _length;
3661     GetInstructionOpAndLength(_instruction, &_op, &_length);
3662     ASSERT(_op == spv::OpImageSparseTexelsResident);
3663     uint32_t _o    = 1;
3664     *idResultType1 = IdResultType(_instruction[_o++]);
3665     *idResult2     = IdResult(_instruction[_o++]);
3666     *residentCode  = IdRef(_instruction[_o++]);
3667 }
ParseImageSparseRead(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * image,IdRef * coordinate,spv::ImageOperandsMask * imageOperands5,IdRefList * imageOperandIdsList)3668 void ParseImageSparseRead(const uint32_t *_instruction,
3669                           IdResultType *idResultType1,
3670                           IdResult *idResult2,
3671                           IdRef *image,
3672                           IdRef *coordinate,
3673                           spv::ImageOperandsMask *imageOperands5,
3674                           IdRefList *imageOperandIdsList)
3675 {
3676     spv::Op _op;
3677     uint32_t _length;
3678     GetInstructionOpAndLength(_instruction, &_op, &_length);
3679     ASSERT(_op == spv::OpImageSparseRead);
3680     uint32_t _o    = 1;
3681     *idResultType1 = IdResultType(_instruction[_o++]);
3682     *idResult2     = IdResult(_instruction[_o++]);
3683     *image         = IdRef(_instruction[_o++]);
3684     *coordinate    = IdRef(_instruction[_o++]);
3685     if (imageOperands5 && _o < _length)
3686     {
3687         *imageOperands5 = spv::ImageOperandsMask(_instruction[_o++]);
3688     }
3689     if (imageOperandIdsList)
3690     {
3691         while (_o < _length)
3692         {
3693             imageOperandIdsList->emplace_back(_instruction[_o++]);
3694         }
3695     }
3696 }
ParseModuleProcessed(const uint32_t * _instruction,LiteralString * process)3697 void ParseModuleProcessed(const uint32_t *_instruction, LiteralString *process)
3698 {
3699     spv::Op _op;
3700     uint32_t _length;
3701     GetInstructionOpAndLength(_instruction, &_op, &_length);
3702     ASSERT(_op == spv::OpModuleProcessed);
3703     uint32_t _o = 1;
3704     ASSERT(IsLittleEndian());
3705     *process = reinterpret_cast<const char *>(&_instruction[_o]);
3706     _o += strlen(*process) / 4 + 1;
3707 }
ParseExecutionModeId(const uint32_t * _instruction,IdRef * entryPoint,spv::ExecutionMode * mode,LiteralIntegerList * operandsList)3708 void ParseExecutionModeId(const uint32_t *_instruction,
3709                           IdRef *entryPoint,
3710                           spv::ExecutionMode *mode,
3711                           LiteralIntegerList *operandsList)
3712 {
3713     spv::Op _op;
3714     uint32_t _length;
3715     GetInstructionOpAndLength(_instruction, &_op, &_length);
3716     ASSERT(_op == spv::OpExecutionModeId);
3717     uint32_t _o = 1;
3718     *entryPoint = IdRef(_instruction[_o++]);
3719     *mode       = spv::ExecutionMode(_instruction[_o++]);
3720     if (operandsList)
3721     {
3722         while (_o < _length)
3723         {
3724             operandsList->emplace_back(_instruction[_o++]);
3725         }
3726     }
3727 }
ParseGroupNonUniformElect(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution)3728 void ParseGroupNonUniformElect(const uint32_t *_instruction,
3729                                IdResultType *idResultType1,
3730                                IdResult *idResult2,
3731                                IdScope *execution)
3732 {
3733     spv::Op _op;
3734     uint32_t _length;
3735     GetInstructionOpAndLength(_instruction, &_op, &_length);
3736     ASSERT(_op == spv::OpGroupNonUniformElect);
3737     uint32_t _o    = 1;
3738     *idResultType1 = IdResultType(_instruction[_o++]);
3739     *idResult2     = IdResult(_instruction[_o++]);
3740     *execution     = IdScope(_instruction[_o++]);
3741 }
ParseGroupNonUniformAll(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,IdRef * predicate)3742 void ParseGroupNonUniformAll(const uint32_t *_instruction,
3743                              IdResultType *idResultType1,
3744                              IdResult *idResult2,
3745                              IdScope *execution,
3746                              IdRef *predicate)
3747 {
3748     spv::Op _op;
3749     uint32_t _length;
3750     GetInstructionOpAndLength(_instruction, &_op, &_length);
3751     ASSERT(_op == spv::OpGroupNonUniformAll);
3752     uint32_t _o    = 1;
3753     *idResultType1 = IdResultType(_instruction[_o++]);
3754     *idResult2     = IdResult(_instruction[_o++]);
3755     *execution     = IdScope(_instruction[_o++]);
3756     *predicate     = IdRef(_instruction[_o++]);
3757 }
ParseGroupNonUniformAny(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,IdRef * predicate)3758 void ParseGroupNonUniformAny(const uint32_t *_instruction,
3759                              IdResultType *idResultType1,
3760                              IdResult *idResult2,
3761                              IdScope *execution,
3762                              IdRef *predicate)
3763 {
3764     spv::Op _op;
3765     uint32_t _length;
3766     GetInstructionOpAndLength(_instruction, &_op, &_length);
3767     ASSERT(_op == spv::OpGroupNonUniformAny);
3768     uint32_t _o    = 1;
3769     *idResultType1 = IdResultType(_instruction[_o++]);
3770     *idResult2     = IdResult(_instruction[_o++]);
3771     *execution     = IdScope(_instruction[_o++]);
3772     *predicate     = IdRef(_instruction[_o++]);
3773 }
ParseGroupNonUniformAllEqual(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,IdRef * value)3774 void ParseGroupNonUniformAllEqual(const uint32_t *_instruction,
3775                                   IdResultType *idResultType1,
3776                                   IdResult *idResult2,
3777                                   IdScope *execution,
3778                                   IdRef *value)
3779 {
3780     spv::Op _op;
3781     uint32_t _length;
3782     GetInstructionOpAndLength(_instruction, &_op, &_length);
3783     ASSERT(_op == spv::OpGroupNonUniformAllEqual);
3784     uint32_t _o    = 1;
3785     *idResultType1 = IdResultType(_instruction[_o++]);
3786     *idResult2     = IdResult(_instruction[_o++]);
3787     *execution     = IdScope(_instruction[_o++]);
3788     *value         = IdRef(_instruction[_o++]);
3789 }
ParseGroupNonUniformBroadcast(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,IdRef * value,IdRef * id)3790 void ParseGroupNonUniformBroadcast(const uint32_t *_instruction,
3791                                    IdResultType *idResultType1,
3792                                    IdResult *idResult2,
3793                                    IdScope *execution,
3794                                    IdRef *value,
3795                                    IdRef *id)
3796 {
3797     spv::Op _op;
3798     uint32_t _length;
3799     GetInstructionOpAndLength(_instruction, &_op, &_length);
3800     ASSERT(_op == spv::OpGroupNonUniformBroadcast);
3801     uint32_t _o    = 1;
3802     *idResultType1 = IdResultType(_instruction[_o++]);
3803     *idResult2     = IdResult(_instruction[_o++]);
3804     *execution     = IdScope(_instruction[_o++]);
3805     *value         = IdRef(_instruction[_o++]);
3806     *id            = IdRef(_instruction[_o++]);
3807 }
ParseGroupNonUniformBroadcastFirst(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,IdRef * value)3808 void ParseGroupNonUniformBroadcastFirst(const uint32_t *_instruction,
3809                                         IdResultType *idResultType1,
3810                                         IdResult *idResult2,
3811                                         IdScope *execution,
3812                                         IdRef *value)
3813 {
3814     spv::Op _op;
3815     uint32_t _length;
3816     GetInstructionOpAndLength(_instruction, &_op, &_length);
3817     ASSERT(_op == spv::OpGroupNonUniformBroadcastFirst);
3818     uint32_t _o    = 1;
3819     *idResultType1 = IdResultType(_instruction[_o++]);
3820     *idResult2     = IdResult(_instruction[_o++]);
3821     *execution     = IdScope(_instruction[_o++]);
3822     *value         = IdRef(_instruction[_o++]);
3823 }
ParseGroupNonUniformBallot(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,IdRef * predicate)3824 void ParseGroupNonUniformBallot(const uint32_t *_instruction,
3825                                 IdResultType *idResultType1,
3826                                 IdResult *idResult2,
3827                                 IdScope *execution,
3828                                 IdRef *predicate)
3829 {
3830     spv::Op _op;
3831     uint32_t _length;
3832     GetInstructionOpAndLength(_instruction, &_op, &_length);
3833     ASSERT(_op == spv::OpGroupNonUniformBallot);
3834     uint32_t _o    = 1;
3835     *idResultType1 = IdResultType(_instruction[_o++]);
3836     *idResult2     = IdResult(_instruction[_o++]);
3837     *execution     = IdScope(_instruction[_o++]);
3838     *predicate     = IdRef(_instruction[_o++]);
3839 }
ParseGroupNonUniformInverseBallot(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,IdRef * value)3840 void ParseGroupNonUniformInverseBallot(const uint32_t *_instruction,
3841                                        IdResultType *idResultType1,
3842                                        IdResult *idResult2,
3843                                        IdScope *execution,
3844                                        IdRef *value)
3845 {
3846     spv::Op _op;
3847     uint32_t _length;
3848     GetInstructionOpAndLength(_instruction, &_op, &_length);
3849     ASSERT(_op == spv::OpGroupNonUniformInverseBallot);
3850     uint32_t _o    = 1;
3851     *idResultType1 = IdResultType(_instruction[_o++]);
3852     *idResult2     = IdResult(_instruction[_o++]);
3853     *execution     = IdScope(_instruction[_o++]);
3854     *value         = IdRef(_instruction[_o++]);
3855 }
ParseGroupNonUniformBallotBitExtract(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,IdRef * value,IdRef * index)3856 void ParseGroupNonUniformBallotBitExtract(const uint32_t *_instruction,
3857                                           IdResultType *idResultType1,
3858                                           IdResult *idResult2,
3859                                           IdScope *execution,
3860                                           IdRef *value,
3861                                           IdRef *index)
3862 {
3863     spv::Op _op;
3864     uint32_t _length;
3865     GetInstructionOpAndLength(_instruction, &_op, &_length);
3866     ASSERT(_op == spv::OpGroupNonUniformBallotBitExtract);
3867     uint32_t _o    = 1;
3868     *idResultType1 = IdResultType(_instruction[_o++]);
3869     *idResult2     = IdResult(_instruction[_o++]);
3870     *execution     = IdScope(_instruction[_o++]);
3871     *value         = IdRef(_instruction[_o++]);
3872     *index         = IdRef(_instruction[_o++]);
3873 }
ParseGroupNonUniformBallotBitCount(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,spv::GroupOperation * operation,IdRef * value)3874 void ParseGroupNonUniformBallotBitCount(const uint32_t *_instruction,
3875                                         IdResultType *idResultType1,
3876                                         IdResult *idResult2,
3877                                         IdScope *execution,
3878                                         spv::GroupOperation *operation,
3879                                         IdRef *value)
3880 {
3881     spv::Op _op;
3882     uint32_t _length;
3883     GetInstructionOpAndLength(_instruction, &_op, &_length);
3884     ASSERT(_op == spv::OpGroupNonUniformBallotBitCount);
3885     uint32_t _o    = 1;
3886     *idResultType1 = IdResultType(_instruction[_o++]);
3887     *idResult2     = IdResult(_instruction[_o++]);
3888     *execution     = IdScope(_instruction[_o++]);
3889     *operation     = spv::GroupOperation(_instruction[_o++]);
3890     *value         = IdRef(_instruction[_o++]);
3891 }
ParseGroupNonUniformBallotFindLSB(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,IdRef * value)3892 void ParseGroupNonUniformBallotFindLSB(const uint32_t *_instruction,
3893                                        IdResultType *idResultType1,
3894                                        IdResult *idResult2,
3895                                        IdScope *execution,
3896                                        IdRef *value)
3897 {
3898     spv::Op _op;
3899     uint32_t _length;
3900     GetInstructionOpAndLength(_instruction, &_op, &_length);
3901     ASSERT(_op == spv::OpGroupNonUniformBallotFindLSB);
3902     uint32_t _o    = 1;
3903     *idResultType1 = IdResultType(_instruction[_o++]);
3904     *idResult2     = IdResult(_instruction[_o++]);
3905     *execution     = IdScope(_instruction[_o++]);
3906     *value         = IdRef(_instruction[_o++]);
3907 }
ParseGroupNonUniformBallotFindMSB(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,IdRef * value)3908 void ParseGroupNonUniformBallotFindMSB(const uint32_t *_instruction,
3909                                        IdResultType *idResultType1,
3910                                        IdResult *idResult2,
3911                                        IdScope *execution,
3912                                        IdRef *value)
3913 {
3914     spv::Op _op;
3915     uint32_t _length;
3916     GetInstructionOpAndLength(_instruction, &_op, &_length);
3917     ASSERT(_op == spv::OpGroupNonUniformBallotFindMSB);
3918     uint32_t _o    = 1;
3919     *idResultType1 = IdResultType(_instruction[_o++]);
3920     *idResult2     = IdResult(_instruction[_o++]);
3921     *execution     = IdScope(_instruction[_o++]);
3922     *value         = IdRef(_instruction[_o++]);
3923 }
ParseGroupNonUniformShuffle(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,IdRef * value,IdRef * id)3924 void ParseGroupNonUniformShuffle(const uint32_t *_instruction,
3925                                  IdResultType *idResultType1,
3926                                  IdResult *idResult2,
3927                                  IdScope *execution,
3928                                  IdRef *value,
3929                                  IdRef *id)
3930 {
3931     spv::Op _op;
3932     uint32_t _length;
3933     GetInstructionOpAndLength(_instruction, &_op, &_length);
3934     ASSERT(_op == spv::OpGroupNonUniformShuffle);
3935     uint32_t _o    = 1;
3936     *idResultType1 = IdResultType(_instruction[_o++]);
3937     *idResult2     = IdResult(_instruction[_o++]);
3938     *execution     = IdScope(_instruction[_o++]);
3939     *value         = IdRef(_instruction[_o++]);
3940     *id            = IdRef(_instruction[_o++]);
3941 }
ParseGroupNonUniformShuffleXor(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,IdRef * value,IdRef * mask)3942 void ParseGroupNonUniformShuffleXor(const uint32_t *_instruction,
3943                                     IdResultType *idResultType1,
3944                                     IdResult *idResult2,
3945                                     IdScope *execution,
3946                                     IdRef *value,
3947                                     IdRef *mask)
3948 {
3949     spv::Op _op;
3950     uint32_t _length;
3951     GetInstructionOpAndLength(_instruction, &_op, &_length);
3952     ASSERT(_op == spv::OpGroupNonUniformShuffleXor);
3953     uint32_t _o    = 1;
3954     *idResultType1 = IdResultType(_instruction[_o++]);
3955     *idResult2     = IdResult(_instruction[_o++]);
3956     *execution     = IdScope(_instruction[_o++]);
3957     *value         = IdRef(_instruction[_o++]);
3958     *mask          = IdRef(_instruction[_o++]);
3959 }
ParseGroupNonUniformShuffleUp(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,IdRef * value,IdRef * delta)3960 void ParseGroupNonUniformShuffleUp(const uint32_t *_instruction,
3961                                    IdResultType *idResultType1,
3962                                    IdResult *idResult2,
3963                                    IdScope *execution,
3964                                    IdRef *value,
3965                                    IdRef *delta)
3966 {
3967     spv::Op _op;
3968     uint32_t _length;
3969     GetInstructionOpAndLength(_instruction, &_op, &_length);
3970     ASSERT(_op == spv::OpGroupNonUniformShuffleUp);
3971     uint32_t _o    = 1;
3972     *idResultType1 = IdResultType(_instruction[_o++]);
3973     *idResult2     = IdResult(_instruction[_o++]);
3974     *execution     = IdScope(_instruction[_o++]);
3975     *value         = IdRef(_instruction[_o++]);
3976     *delta         = IdRef(_instruction[_o++]);
3977 }
ParseGroupNonUniformShuffleDown(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,IdRef * value,IdRef * delta)3978 void ParseGroupNonUniformShuffleDown(const uint32_t *_instruction,
3979                                      IdResultType *idResultType1,
3980                                      IdResult *idResult2,
3981                                      IdScope *execution,
3982                                      IdRef *value,
3983                                      IdRef *delta)
3984 {
3985     spv::Op _op;
3986     uint32_t _length;
3987     GetInstructionOpAndLength(_instruction, &_op, &_length);
3988     ASSERT(_op == spv::OpGroupNonUniformShuffleDown);
3989     uint32_t _o    = 1;
3990     *idResultType1 = IdResultType(_instruction[_o++]);
3991     *idResult2     = IdResult(_instruction[_o++]);
3992     *execution     = IdScope(_instruction[_o++]);
3993     *value         = IdRef(_instruction[_o++]);
3994     *delta         = IdRef(_instruction[_o++]);
3995 }
ParseGroupNonUniformIAdd(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,spv::GroupOperation * operation,IdRef * value,IdRef * clusterSize)3996 void ParseGroupNonUniformIAdd(const uint32_t *_instruction,
3997                               IdResultType *idResultType1,
3998                               IdResult *idResult2,
3999                               IdScope *execution,
4000                               spv::GroupOperation *operation,
4001                               IdRef *value,
4002                               IdRef *clusterSize)
4003 {
4004     spv::Op _op;
4005     uint32_t _length;
4006     GetInstructionOpAndLength(_instruction, &_op, &_length);
4007     ASSERT(_op == spv::OpGroupNonUniformIAdd);
4008     uint32_t _o    = 1;
4009     *idResultType1 = IdResultType(_instruction[_o++]);
4010     *idResult2     = IdResult(_instruction[_o++]);
4011     *execution     = IdScope(_instruction[_o++]);
4012     *operation     = spv::GroupOperation(_instruction[_o++]);
4013     *value         = IdRef(_instruction[_o++]);
4014     if (clusterSize && _o < _length)
4015     {
4016         *clusterSize = IdRef(_instruction[_o++]);
4017     }
4018 }
ParseGroupNonUniformFAdd(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,spv::GroupOperation * operation,IdRef * value,IdRef * clusterSize)4019 void ParseGroupNonUniformFAdd(const uint32_t *_instruction,
4020                               IdResultType *idResultType1,
4021                               IdResult *idResult2,
4022                               IdScope *execution,
4023                               spv::GroupOperation *operation,
4024                               IdRef *value,
4025                               IdRef *clusterSize)
4026 {
4027     spv::Op _op;
4028     uint32_t _length;
4029     GetInstructionOpAndLength(_instruction, &_op, &_length);
4030     ASSERT(_op == spv::OpGroupNonUniformFAdd);
4031     uint32_t _o    = 1;
4032     *idResultType1 = IdResultType(_instruction[_o++]);
4033     *idResult2     = IdResult(_instruction[_o++]);
4034     *execution     = IdScope(_instruction[_o++]);
4035     *operation     = spv::GroupOperation(_instruction[_o++]);
4036     *value         = IdRef(_instruction[_o++]);
4037     if (clusterSize && _o < _length)
4038     {
4039         *clusterSize = IdRef(_instruction[_o++]);
4040     }
4041 }
ParseGroupNonUniformIMul(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,spv::GroupOperation * operation,IdRef * value,IdRef * clusterSize)4042 void ParseGroupNonUniformIMul(const uint32_t *_instruction,
4043                               IdResultType *idResultType1,
4044                               IdResult *idResult2,
4045                               IdScope *execution,
4046                               spv::GroupOperation *operation,
4047                               IdRef *value,
4048                               IdRef *clusterSize)
4049 {
4050     spv::Op _op;
4051     uint32_t _length;
4052     GetInstructionOpAndLength(_instruction, &_op, &_length);
4053     ASSERT(_op == spv::OpGroupNonUniformIMul);
4054     uint32_t _o    = 1;
4055     *idResultType1 = IdResultType(_instruction[_o++]);
4056     *idResult2     = IdResult(_instruction[_o++]);
4057     *execution     = IdScope(_instruction[_o++]);
4058     *operation     = spv::GroupOperation(_instruction[_o++]);
4059     *value         = IdRef(_instruction[_o++]);
4060     if (clusterSize && _o < _length)
4061     {
4062         *clusterSize = IdRef(_instruction[_o++]);
4063     }
4064 }
ParseGroupNonUniformFMul(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,spv::GroupOperation * operation,IdRef * value,IdRef * clusterSize)4065 void ParseGroupNonUniformFMul(const uint32_t *_instruction,
4066                               IdResultType *idResultType1,
4067                               IdResult *idResult2,
4068                               IdScope *execution,
4069                               spv::GroupOperation *operation,
4070                               IdRef *value,
4071                               IdRef *clusterSize)
4072 {
4073     spv::Op _op;
4074     uint32_t _length;
4075     GetInstructionOpAndLength(_instruction, &_op, &_length);
4076     ASSERT(_op == spv::OpGroupNonUniformFMul);
4077     uint32_t _o    = 1;
4078     *idResultType1 = IdResultType(_instruction[_o++]);
4079     *idResult2     = IdResult(_instruction[_o++]);
4080     *execution     = IdScope(_instruction[_o++]);
4081     *operation     = spv::GroupOperation(_instruction[_o++]);
4082     *value         = IdRef(_instruction[_o++]);
4083     if (clusterSize && _o < _length)
4084     {
4085         *clusterSize = IdRef(_instruction[_o++]);
4086     }
4087 }
ParseGroupNonUniformSMin(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,spv::GroupOperation * operation,IdRef * value,IdRef * clusterSize)4088 void ParseGroupNonUniformSMin(const uint32_t *_instruction,
4089                               IdResultType *idResultType1,
4090                               IdResult *idResult2,
4091                               IdScope *execution,
4092                               spv::GroupOperation *operation,
4093                               IdRef *value,
4094                               IdRef *clusterSize)
4095 {
4096     spv::Op _op;
4097     uint32_t _length;
4098     GetInstructionOpAndLength(_instruction, &_op, &_length);
4099     ASSERT(_op == spv::OpGroupNonUniformSMin);
4100     uint32_t _o    = 1;
4101     *idResultType1 = IdResultType(_instruction[_o++]);
4102     *idResult2     = IdResult(_instruction[_o++]);
4103     *execution     = IdScope(_instruction[_o++]);
4104     *operation     = spv::GroupOperation(_instruction[_o++]);
4105     *value         = IdRef(_instruction[_o++]);
4106     if (clusterSize && _o < _length)
4107     {
4108         *clusterSize = IdRef(_instruction[_o++]);
4109     }
4110 }
ParseGroupNonUniformUMin(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,spv::GroupOperation * operation,IdRef * value,IdRef * clusterSize)4111 void ParseGroupNonUniformUMin(const uint32_t *_instruction,
4112                               IdResultType *idResultType1,
4113                               IdResult *idResult2,
4114                               IdScope *execution,
4115                               spv::GroupOperation *operation,
4116                               IdRef *value,
4117                               IdRef *clusterSize)
4118 {
4119     spv::Op _op;
4120     uint32_t _length;
4121     GetInstructionOpAndLength(_instruction, &_op, &_length);
4122     ASSERT(_op == spv::OpGroupNonUniformUMin);
4123     uint32_t _o    = 1;
4124     *idResultType1 = IdResultType(_instruction[_o++]);
4125     *idResult2     = IdResult(_instruction[_o++]);
4126     *execution     = IdScope(_instruction[_o++]);
4127     *operation     = spv::GroupOperation(_instruction[_o++]);
4128     *value         = IdRef(_instruction[_o++]);
4129     if (clusterSize && _o < _length)
4130     {
4131         *clusterSize = IdRef(_instruction[_o++]);
4132     }
4133 }
ParseGroupNonUniformFMin(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,spv::GroupOperation * operation,IdRef * value,IdRef * clusterSize)4134 void ParseGroupNonUniformFMin(const uint32_t *_instruction,
4135                               IdResultType *idResultType1,
4136                               IdResult *idResult2,
4137                               IdScope *execution,
4138                               spv::GroupOperation *operation,
4139                               IdRef *value,
4140                               IdRef *clusterSize)
4141 {
4142     spv::Op _op;
4143     uint32_t _length;
4144     GetInstructionOpAndLength(_instruction, &_op, &_length);
4145     ASSERT(_op == spv::OpGroupNonUniformFMin);
4146     uint32_t _o    = 1;
4147     *idResultType1 = IdResultType(_instruction[_o++]);
4148     *idResult2     = IdResult(_instruction[_o++]);
4149     *execution     = IdScope(_instruction[_o++]);
4150     *operation     = spv::GroupOperation(_instruction[_o++]);
4151     *value         = IdRef(_instruction[_o++]);
4152     if (clusterSize && _o < _length)
4153     {
4154         *clusterSize = IdRef(_instruction[_o++]);
4155     }
4156 }
ParseGroupNonUniformSMax(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,spv::GroupOperation * operation,IdRef * value,IdRef * clusterSize)4157 void ParseGroupNonUniformSMax(const uint32_t *_instruction,
4158                               IdResultType *idResultType1,
4159                               IdResult *idResult2,
4160                               IdScope *execution,
4161                               spv::GroupOperation *operation,
4162                               IdRef *value,
4163                               IdRef *clusterSize)
4164 {
4165     spv::Op _op;
4166     uint32_t _length;
4167     GetInstructionOpAndLength(_instruction, &_op, &_length);
4168     ASSERT(_op == spv::OpGroupNonUniformSMax);
4169     uint32_t _o    = 1;
4170     *idResultType1 = IdResultType(_instruction[_o++]);
4171     *idResult2     = IdResult(_instruction[_o++]);
4172     *execution     = IdScope(_instruction[_o++]);
4173     *operation     = spv::GroupOperation(_instruction[_o++]);
4174     *value         = IdRef(_instruction[_o++]);
4175     if (clusterSize && _o < _length)
4176     {
4177         *clusterSize = IdRef(_instruction[_o++]);
4178     }
4179 }
ParseGroupNonUniformUMax(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,spv::GroupOperation * operation,IdRef * value,IdRef * clusterSize)4180 void ParseGroupNonUniformUMax(const uint32_t *_instruction,
4181                               IdResultType *idResultType1,
4182                               IdResult *idResult2,
4183                               IdScope *execution,
4184                               spv::GroupOperation *operation,
4185                               IdRef *value,
4186                               IdRef *clusterSize)
4187 {
4188     spv::Op _op;
4189     uint32_t _length;
4190     GetInstructionOpAndLength(_instruction, &_op, &_length);
4191     ASSERT(_op == spv::OpGroupNonUniformUMax);
4192     uint32_t _o    = 1;
4193     *idResultType1 = IdResultType(_instruction[_o++]);
4194     *idResult2     = IdResult(_instruction[_o++]);
4195     *execution     = IdScope(_instruction[_o++]);
4196     *operation     = spv::GroupOperation(_instruction[_o++]);
4197     *value         = IdRef(_instruction[_o++]);
4198     if (clusterSize && _o < _length)
4199     {
4200         *clusterSize = IdRef(_instruction[_o++]);
4201     }
4202 }
ParseGroupNonUniformFMax(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,spv::GroupOperation * operation,IdRef * value,IdRef * clusterSize)4203 void ParseGroupNonUniformFMax(const uint32_t *_instruction,
4204                               IdResultType *idResultType1,
4205                               IdResult *idResult2,
4206                               IdScope *execution,
4207                               spv::GroupOperation *operation,
4208                               IdRef *value,
4209                               IdRef *clusterSize)
4210 {
4211     spv::Op _op;
4212     uint32_t _length;
4213     GetInstructionOpAndLength(_instruction, &_op, &_length);
4214     ASSERT(_op == spv::OpGroupNonUniformFMax);
4215     uint32_t _o    = 1;
4216     *idResultType1 = IdResultType(_instruction[_o++]);
4217     *idResult2     = IdResult(_instruction[_o++]);
4218     *execution     = IdScope(_instruction[_o++]);
4219     *operation     = spv::GroupOperation(_instruction[_o++]);
4220     *value         = IdRef(_instruction[_o++]);
4221     if (clusterSize && _o < _length)
4222     {
4223         *clusterSize = IdRef(_instruction[_o++]);
4224     }
4225 }
ParseGroupNonUniformBitwiseAnd(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,spv::GroupOperation * operation,IdRef * value,IdRef * clusterSize)4226 void ParseGroupNonUniformBitwiseAnd(const uint32_t *_instruction,
4227                                     IdResultType *idResultType1,
4228                                     IdResult *idResult2,
4229                                     IdScope *execution,
4230                                     spv::GroupOperation *operation,
4231                                     IdRef *value,
4232                                     IdRef *clusterSize)
4233 {
4234     spv::Op _op;
4235     uint32_t _length;
4236     GetInstructionOpAndLength(_instruction, &_op, &_length);
4237     ASSERT(_op == spv::OpGroupNonUniformBitwiseAnd);
4238     uint32_t _o    = 1;
4239     *idResultType1 = IdResultType(_instruction[_o++]);
4240     *idResult2     = IdResult(_instruction[_o++]);
4241     *execution     = IdScope(_instruction[_o++]);
4242     *operation     = spv::GroupOperation(_instruction[_o++]);
4243     *value         = IdRef(_instruction[_o++]);
4244     if (clusterSize && _o < _length)
4245     {
4246         *clusterSize = IdRef(_instruction[_o++]);
4247     }
4248 }
ParseGroupNonUniformBitwiseOr(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,spv::GroupOperation * operation,IdRef * value,IdRef * clusterSize)4249 void ParseGroupNonUniformBitwiseOr(const uint32_t *_instruction,
4250                                    IdResultType *idResultType1,
4251                                    IdResult *idResult2,
4252                                    IdScope *execution,
4253                                    spv::GroupOperation *operation,
4254                                    IdRef *value,
4255                                    IdRef *clusterSize)
4256 {
4257     spv::Op _op;
4258     uint32_t _length;
4259     GetInstructionOpAndLength(_instruction, &_op, &_length);
4260     ASSERT(_op == spv::OpGroupNonUniformBitwiseOr);
4261     uint32_t _o    = 1;
4262     *idResultType1 = IdResultType(_instruction[_o++]);
4263     *idResult2     = IdResult(_instruction[_o++]);
4264     *execution     = IdScope(_instruction[_o++]);
4265     *operation     = spv::GroupOperation(_instruction[_o++]);
4266     *value         = IdRef(_instruction[_o++]);
4267     if (clusterSize && _o < _length)
4268     {
4269         *clusterSize = IdRef(_instruction[_o++]);
4270     }
4271 }
ParseGroupNonUniformBitwiseXor(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,spv::GroupOperation * operation,IdRef * value,IdRef * clusterSize)4272 void ParseGroupNonUniformBitwiseXor(const uint32_t *_instruction,
4273                                     IdResultType *idResultType1,
4274                                     IdResult *idResult2,
4275                                     IdScope *execution,
4276                                     spv::GroupOperation *operation,
4277                                     IdRef *value,
4278                                     IdRef *clusterSize)
4279 {
4280     spv::Op _op;
4281     uint32_t _length;
4282     GetInstructionOpAndLength(_instruction, &_op, &_length);
4283     ASSERT(_op == spv::OpGroupNonUniformBitwiseXor);
4284     uint32_t _o    = 1;
4285     *idResultType1 = IdResultType(_instruction[_o++]);
4286     *idResult2     = IdResult(_instruction[_o++]);
4287     *execution     = IdScope(_instruction[_o++]);
4288     *operation     = spv::GroupOperation(_instruction[_o++]);
4289     *value         = IdRef(_instruction[_o++]);
4290     if (clusterSize && _o < _length)
4291     {
4292         *clusterSize = IdRef(_instruction[_o++]);
4293     }
4294 }
ParseGroupNonUniformLogicalAnd(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,spv::GroupOperation * operation,IdRef * value,IdRef * clusterSize)4295 void ParseGroupNonUniformLogicalAnd(const uint32_t *_instruction,
4296                                     IdResultType *idResultType1,
4297                                     IdResult *idResult2,
4298                                     IdScope *execution,
4299                                     spv::GroupOperation *operation,
4300                                     IdRef *value,
4301                                     IdRef *clusterSize)
4302 {
4303     spv::Op _op;
4304     uint32_t _length;
4305     GetInstructionOpAndLength(_instruction, &_op, &_length);
4306     ASSERT(_op == spv::OpGroupNonUniformLogicalAnd);
4307     uint32_t _o    = 1;
4308     *idResultType1 = IdResultType(_instruction[_o++]);
4309     *idResult2     = IdResult(_instruction[_o++]);
4310     *execution     = IdScope(_instruction[_o++]);
4311     *operation     = spv::GroupOperation(_instruction[_o++]);
4312     *value         = IdRef(_instruction[_o++]);
4313     if (clusterSize && _o < _length)
4314     {
4315         *clusterSize = IdRef(_instruction[_o++]);
4316     }
4317 }
ParseGroupNonUniformLogicalOr(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,spv::GroupOperation * operation,IdRef * value,IdRef * clusterSize)4318 void ParseGroupNonUniformLogicalOr(const uint32_t *_instruction,
4319                                    IdResultType *idResultType1,
4320                                    IdResult *idResult2,
4321                                    IdScope *execution,
4322                                    spv::GroupOperation *operation,
4323                                    IdRef *value,
4324                                    IdRef *clusterSize)
4325 {
4326     spv::Op _op;
4327     uint32_t _length;
4328     GetInstructionOpAndLength(_instruction, &_op, &_length);
4329     ASSERT(_op == spv::OpGroupNonUniformLogicalOr);
4330     uint32_t _o    = 1;
4331     *idResultType1 = IdResultType(_instruction[_o++]);
4332     *idResult2     = IdResult(_instruction[_o++]);
4333     *execution     = IdScope(_instruction[_o++]);
4334     *operation     = spv::GroupOperation(_instruction[_o++]);
4335     *value         = IdRef(_instruction[_o++]);
4336     if (clusterSize && _o < _length)
4337     {
4338         *clusterSize = IdRef(_instruction[_o++]);
4339     }
4340 }
ParseGroupNonUniformLogicalXor(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,spv::GroupOperation * operation,IdRef * value,IdRef * clusterSize)4341 void ParseGroupNonUniformLogicalXor(const uint32_t *_instruction,
4342                                     IdResultType *idResultType1,
4343                                     IdResult *idResult2,
4344                                     IdScope *execution,
4345                                     spv::GroupOperation *operation,
4346                                     IdRef *value,
4347                                     IdRef *clusterSize)
4348 {
4349     spv::Op _op;
4350     uint32_t _length;
4351     GetInstructionOpAndLength(_instruction, &_op, &_length);
4352     ASSERT(_op == spv::OpGroupNonUniformLogicalXor);
4353     uint32_t _o    = 1;
4354     *idResultType1 = IdResultType(_instruction[_o++]);
4355     *idResult2     = IdResult(_instruction[_o++]);
4356     *execution     = IdScope(_instruction[_o++]);
4357     *operation     = spv::GroupOperation(_instruction[_o++]);
4358     *value         = IdRef(_instruction[_o++]);
4359     if (clusterSize && _o < _length)
4360     {
4361         *clusterSize = IdRef(_instruction[_o++]);
4362     }
4363 }
ParseGroupNonUniformQuadBroadcast(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,IdRef * value,IdRef * index)4364 void ParseGroupNonUniformQuadBroadcast(const uint32_t *_instruction,
4365                                        IdResultType *idResultType1,
4366                                        IdResult *idResult2,
4367                                        IdScope *execution,
4368                                        IdRef *value,
4369                                        IdRef *index)
4370 {
4371     spv::Op _op;
4372     uint32_t _length;
4373     GetInstructionOpAndLength(_instruction, &_op, &_length);
4374     ASSERT(_op == spv::OpGroupNonUniformQuadBroadcast);
4375     uint32_t _o    = 1;
4376     *idResultType1 = IdResultType(_instruction[_o++]);
4377     *idResult2     = IdResult(_instruction[_o++]);
4378     *execution     = IdScope(_instruction[_o++]);
4379     *value         = IdRef(_instruction[_o++]);
4380     *index         = IdRef(_instruction[_o++]);
4381 }
ParseGroupNonUniformQuadSwap(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdScope * execution,IdRef * value,IdRef * direction)4382 void ParseGroupNonUniformQuadSwap(const uint32_t *_instruction,
4383                                   IdResultType *idResultType1,
4384                                   IdResult *idResult2,
4385                                   IdScope *execution,
4386                                   IdRef *value,
4387                                   IdRef *direction)
4388 {
4389     spv::Op _op;
4390     uint32_t _length;
4391     GetInstructionOpAndLength(_instruction, &_op, &_length);
4392     ASSERT(_op == spv::OpGroupNonUniformQuadSwap);
4393     uint32_t _o    = 1;
4394     *idResultType1 = IdResultType(_instruction[_o++]);
4395     *idResult2     = IdResult(_instruction[_o++]);
4396     *execution     = IdScope(_instruction[_o++]);
4397     *value         = IdRef(_instruction[_o++]);
4398     *direction     = IdRef(_instruction[_o++]);
4399 }
ParseCopyLogical(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand)4400 void ParseCopyLogical(const uint32_t *_instruction,
4401                       IdResultType *idResultType1,
4402                       IdResult *idResult2,
4403                       IdRef *operand)
4404 {
4405     spv::Op _op;
4406     uint32_t _length;
4407     GetInstructionOpAndLength(_instruction, &_op, &_length);
4408     ASSERT(_op == spv::OpCopyLogical);
4409     uint32_t _o    = 1;
4410     *idResultType1 = IdResultType(_instruction[_o++]);
4411     *idResult2     = IdResult(_instruction[_o++]);
4412     *operand       = IdRef(_instruction[_o++]);
4413 }
ParsePtrEqual(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)4414 void ParsePtrEqual(const uint32_t *_instruction,
4415                    IdResultType *idResultType1,
4416                    IdResult *idResult2,
4417                    IdRef *operand1,
4418                    IdRef *operand2)
4419 {
4420     spv::Op _op;
4421     uint32_t _length;
4422     GetInstructionOpAndLength(_instruction, &_op, &_length);
4423     ASSERT(_op == spv::OpPtrEqual);
4424     uint32_t _o    = 1;
4425     *idResultType1 = IdResultType(_instruction[_o++]);
4426     *idResult2     = IdResult(_instruction[_o++]);
4427     *operand1      = IdRef(_instruction[_o++]);
4428     *operand2      = IdRef(_instruction[_o++]);
4429 }
ParsePtrNotEqual(const uint32_t * _instruction,IdResultType * idResultType1,IdResult * idResult2,IdRef * operand1,IdRef * operand2)4430 void ParsePtrNotEqual(const uint32_t *_instruction,
4431                       IdResultType *idResultType1,
4432                       IdResult *idResult2,
4433                       IdRef *operand1,
4434                       IdRef *operand2)
4435 {
4436     spv::Op _op;
4437     uint32_t _length;
4438     GetInstructionOpAndLength(_instruction, &_op, &_length);
4439     ASSERT(_op == spv::OpPtrNotEqual);
4440     uint32_t _o    = 1;
4441     *idResultType1 = IdResultType(_instruction[_o++]);
4442     *idResult2     = IdResult(_instruction[_o++]);
4443     *operand1      = IdRef(_instruction[_o++]);
4444     *operand2      = IdRef(_instruction[_o++]);
4445 }
4446 
4447 }  // namespace spirv
4448 }  // namespace angle
4449