• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_builder_autogen.cpp:
9 //   Functions to generate SPIR-V binary for each instruction.
10 
11 #include "spirv_instruction_builder_autogen.h"
12 
13 #include <string.h>
14 
15 #include "common/debug.h"
16 
17 namespace angle
18 {
19 namespace spirv
20 {
21 namespace
22 {
MakeLengthOp(size_t length,spv::Op op)23 uint32_t MakeLengthOp(size_t length, spv::Op op)
24 {
25     ASSERT(length <= 0xFFFFu);
26     ASSERT(op <= 0xFFFFu);
27 
28     // It's easy for a complex shader to be crafted to hit the length limit,
29     // turn that into a crash instead of a security bug.  Ideally, the compiler
30     // would gracefully fail compilation, so this is more of a safety net.
31     if (ANGLE_UNLIKELY(length > 0xFFFFu))
32     {
33         ERR() << "Complex shader not representible in SPIR-V";
34         ANGLE_CRASH();
35     }
36 
37     return static_cast<uint32_t>(length) << 16 | op;
38 }
39 }  // anonymous namespace
40 
WriteSpirvHeader(std::vector<uint32_t> * blob,uint32_t version,uint32_t idCount)41 void WriteSpirvHeader(std::vector<uint32_t> *blob, uint32_t version, uint32_t idCount)
42 {
43     // Header:
44     //
45     //  - Magic number
46     //  - Version (1.X)
47     //  - ANGLE's Generator number:
48     //     * 24 for tool id (higher 16 bits)
49     //     * 1 for tool version (lower 16 bits))
50     //  - Bound (idCount)
51     //  - 0 (reserved)
52     constexpr uint32_t kANGLEGeneratorId      = 24;
53     constexpr uint32_t kANGLEGeneratorVersion = 1;
54 
55     ASSERT(blob->empty());
56 
57     blob->push_back(spv::MagicNumber);
58     blob->push_back(version);
59     blob->push_back(kANGLEGeneratorId << 16 | kANGLEGeneratorVersion);
60     blob->push_back(idCount);
61     blob->push_back(0x00000000);
62 }
63 
WriteNop(Blob * blob)64 void WriteNop(Blob *blob)
65 {
66     const size_t startSize = blob->size();
67     blob->push_back(0);
68 
69     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpNop);
70 }
WriteUndef(Blob * blob,IdResultType idResultType1,IdResult idResult2)71 void WriteUndef(Blob *blob, IdResultType idResultType1, IdResult idResult2)
72 {
73     const size_t startSize = blob->size();
74     blob->push_back(0);
75     blob->push_back(idResultType1);
76     blob->push_back(idResult2);
77     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpUndef);
78 }
WriteSourceContinued(Blob * blob,LiteralString continuedSource)79 void WriteSourceContinued(Blob *blob, LiteralString continuedSource)
80 {
81     const size_t startSize = blob->size();
82     blob->push_back(0);
83     {
84         size_t d = blob->size();
85         blob->resize(d + strlen(continuedSource) / 4 + 1, 0);
86         ASSERT(IsLittleEndian());
87         strcpy(reinterpret_cast<char *>(blob->data() + d), continuedSource);
88     }
89     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSourceContinued);
90 }
WriteSource(Blob * blob,spv::SourceLanguage sourceLanguage1,LiteralInteger version,const IdRef * file,const LiteralString * source)91 void WriteSource(Blob *blob,
92                  spv::SourceLanguage sourceLanguage1,
93                  LiteralInteger version,
94                  const IdRef *file,
95                  const LiteralString *source)
96 {
97     const size_t startSize = blob->size();
98     blob->push_back(0);
99     blob->push_back(sourceLanguage1);
100     blob->push_back(version);
101     if (file)
102     {
103         blob->push_back(*file);
104     }
105     if (source)
106     {
107         {
108             size_t d = blob->size();
109             blob->resize(d + strlen(*source) / 4 + 1, 0);
110             ASSERT(IsLittleEndian());
111             strcpy(reinterpret_cast<char *>(blob->data() + d), *source);
112         }
113     }
114     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSource);
115 }
WriteSourceExtension(Blob * blob,LiteralString extension)116 void WriteSourceExtension(Blob *blob, LiteralString extension)
117 {
118     const size_t startSize = blob->size();
119     blob->push_back(0);
120     {
121         size_t d = blob->size();
122         blob->resize(d + strlen(extension) / 4 + 1, 0);
123         ASSERT(IsLittleEndian());
124         strcpy(reinterpret_cast<char *>(blob->data() + d), extension);
125     }
126     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSourceExtension);
127 }
WriteName(Blob * blob,IdRef target,LiteralString name)128 void WriteName(Blob *blob, IdRef target, LiteralString name)
129 {
130     const size_t startSize = blob->size();
131     blob->push_back(0);
132     blob->push_back(target);
133     {
134         size_t d = blob->size();
135         blob->resize(d + strlen(name) / 4 + 1, 0);
136         ASSERT(IsLittleEndian());
137         strcpy(reinterpret_cast<char *>(blob->data() + d), name);
138     }
139     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpName);
140 }
WriteMemberName(Blob * blob,IdRef type,LiteralInteger member,LiteralString name)141 void WriteMemberName(Blob *blob, IdRef type, LiteralInteger member, LiteralString name)
142 {
143     const size_t startSize = blob->size();
144     blob->push_back(0);
145     blob->push_back(type);
146     blob->push_back(member);
147     {
148         size_t d = blob->size();
149         blob->resize(d + strlen(name) / 4 + 1, 0);
150         ASSERT(IsLittleEndian());
151         strcpy(reinterpret_cast<char *>(blob->data() + d), name);
152     }
153     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpMemberName);
154 }
WriteString(Blob * blob,IdResult idResult1,LiteralString string)155 void WriteString(Blob *blob, IdResult idResult1, LiteralString string)
156 {
157     const size_t startSize = blob->size();
158     blob->push_back(0);
159     blob->push_back(idResult1);
160     {
161         size_t d = blob->size();
162         blob->resize(d + strlen(string) / 4 + 1, 0);
163         ASSERT(IsLittleEndian());
164         strcpy(reinterpret_cast<char *>(blob->data() + d), string);
165     }
166     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpString);
167 }
WriteLine(Blob * blob,IdRef file,LiteralInteger line,LiteralInteger column)168 void WriteLine(Blob *blob, IdRef file, LiteralInteger line, LiteralInteger column)
169 {
170     const size_t startSize = blob->size();
171     blob->push_back(0);
172     blob->push_back(file);
173     blob->push_back(line);
174     blob->push_back(column);
175     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpLine);
176 }
WriteExtension(Blob * blob,LiteralString name)177 void WriteExtension(Blob *blob, LiteralString name)
178 {
179     const size_t startSize = blob->size();
180     blob->push_back(0);
181     {
182         size_t d = blob->size();
183         blob->resize(d + strlen(name) / 4 + 1, 0);
184         ASSERT(IsLittleEndian());
185         strcpy(reinterpret_cast<char *>(blob->data() + d), name);
186     }
187     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpExtension);
188 }
WriteExtInstImport(Blob * blob,IdResult idResult1,LiteralString name)189 void WriteExtInstImport(Blob *blob, IdResult idResult1, LiteralString name)
190 {
191     const size_t startSize = blob->size();
192     blob->push_back(0);
193     blob->push_back(idResult1);
194     {
195         size_t d = blob->size();
196         blob->resize(d + strlen(name) / 4 + 1, 0);
197         ASSERT(IsLittleEndian());
198         strcpy(reinterpret_cast<char *>(blob->data() + d), name);
199     }
200     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpExtInstImport);
201 }
WriteExtInst(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef set,LiteralExtInstInteger instruction,const IdRefList & operandList)202 void WriteExtInst(Blob *blob,
203                   IdResultType idResultType1,
204                   IdResult idResult2,
205                   IdRef set,
206                   LiteralExtInstInteger instruction,
207                   const IdRefList &operandList)
208 {
209     const size_t startSize = blob->size();
210     blob->push_back(0);
211     blob->push_back(idResultType1);
212     blob->push_back(idResult2);
213     blob->push_back(set);
214     blob->push_back(instruction);
215     for (const auto &operand : operandList)
216     {
217         blob->push_back(operand);
218     }
219     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpExtInst);
220 }
WriteMemoryModel(Blob * blob,spv::AddressingModel addressingModel1,spv::MemoryModel memoryModel2)221 void WriteMemoryModel(Blob *blob,
222                       spv::AddressingModel addressingModel1,
223                       spv::MemoryModel memoryModel2)
224 {
225     const size_t startSize = blob->size();
226     blob->push_back(0);
227     blob->push_back(addressingModel1);
228     blob->push_back(memoryModel2);
229     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpMemoryModel);
230 }
WriteEntryPoint(Blob * blob,spv::ExecutionModel executionModel1,IdRef entryPoint,LiteralString name,const IdRefList & interfaceList)231 void WriteEntryPoint(Blob *blob,
232                      spv::ExecutionModel executionModel1,
233                      IdRef entryPoint,
234                      LiteralString name,
235                      const IdRefList &interfaceList)
236 {
237     const size_t startSize = blob->size();
238     blob->push_back(0);
239     blob->push_back(executionModel1);
240     blob->push_back(entryPoint);
241     {
242         size_t d = blob->size();
243         blob->resize(d + strlen(name) / 4 + 1, 0);
244         ASSERT(IsLittleEndian());
245         strcpy(reinterpret_cast<char *>(blob->data() + d), name);
246     }
247     for (const auto &operand : interfaceList)
248     {
249         blob->push_back(operand);
250     }
251     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpEntryPoint);
252 }
WriteExecutionMode(Blob * blob,IdRef entryPoint,spv::ExecutionMode mode,const LiteralIntegerList & operandsList)253 void WriteExecutionMode(Blob *blob,
254                         IdRef entryPoint,
255                         spv::ExecutionMode mode,
256                         const LiteralIntegerList &operandsList)
257 {
258     const size_t startSize = blob->size();
259     blob->push_back(0);
260     blob->push_back(entryPoint);
261     blob->push_back(mode);
262     for (const auto &operand : operandsList)
263     {
264         blob->push_back(operand);
265     }
266     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpExecutionMode);
267 }
WriteCapability(Blob * blob,spv::Capability capability)268 void WriteCapability(Blob *blob, spv::Capability capability)
269 {
270     const size_t startSize = blob->size();
271     blob->push_back(0);
272     blob->push_back(capability);
273     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpCapability);
274 }
WriteTypeVoid(Blob * blob,IdResult idResult1)275 void WriteTypeVoid(Blob *blob, IdResult idResult1)
276 {
277     const size_t startSize = blob->size();
278     blob->push_back(0);
279     blob->push_back(idResult1);
280     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeVoid);
281 }
WriteTypeBool(Blob * blob,IdResult idResult1)282 void WriteTypeBool(Blob *blob, IdResult idResult1)
283 {
284     const size_t startSize = blob->size();
285     blob->push_back(0);
286     blob->push_back(idResult1);
287     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeBool);
288 }
WriteTypeInt(Blob * blob,IdResult idResult1,LiteralInteger width,LiteralInteger signedness)289 void WriteTypeInt(Blob *blob, IdResult idResult1, LiteralInteger width, LiteralInteger signedness)
290 {
291     const size_t startSize = blob->size();
292     blob->push_back(0);
293     blob->push_back(idResult1);
294     blob->push_back(width);
295     blob->push_back(signedness);
296     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeInt);
297 }
WriteTypeFloat(Blob * blob,IdResult idResult1,LiteralInteger width)298 void WriteTypeFloat(Blob *blob, IdResult idResult1, LiteralInteger width)
299 {
300     const size_t startSize = blob->size();
301     blob->push_back(0);
302     blob->push_back(idResult1);
303     blob->push_back(width);
304     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeFloat);
305 }
WriteTypeVector(Blob * blob,IdResult idResult1,IdRef componentType,LiteralInteger componentCount)306 void WriteTypeVector(Blob *blob,
307                      IdResult idResult1,
308                      IdRef componentType,
309                      LiteralInteger componentCount)
310 {
311     const size_t startSize = blob->size();
312     blob->push_back(0);
313     blob->push_back(idResult1);
314     blob->push_back(componentType);
315     blob->push_back(componentCount);
316     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeVector);
317 }
WriteTypeMatrix(Blob * blob,IdResult idResult1,IdRef columnType,LiteralInteger columnCount)318 void WriteTypeMatrix(Blob *blob, IdResult idResult1, IdRef columnType, LiteralInteger columnCount)
319 {
320     const size_t startSize = blob->size();
321     blob->push_back(0);
322     blob->push_back(idResult1);
323     blob->push_back(columnType);
324     blob->push_back(columnCount);
325     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeMatrix);
326 }
WriteTypeImage(Blob * blob,IdResult idResult1,IdRef sampledType,spv::Dim dim3,LiteralInteger depth,LiteralInteger arrayed,LiteralInteger mS,LiteralInteger sampled,spv::ImageFormat imageFormat8,const spv::AccessQualifier * accessQualifier9)327 void WriteTypeImage(Blob *blob,
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                     const spv::AccessQualifier *accessQualifier9)
337 {
338     const size_t startSize = blob->size();
339     blob->push_back(0);
340     blob->push_back(idResult1);
341     blob->push_back(sampledType);
342     blob->push_back(dim3);
343     blob->push_back(depth);
344     blob->push_back(arrayed);
345     blob->push_back(mS);
346     blob->push_back(sampled);
347     blob->push_back(imageFormat8);
348     if (accessQualifier9)
349     {
350         blob->push_back(*accessQualifier9);
351     }
352     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeImage);
353 }
WriteTypeSampler(Blob * blob,IdResult idResult1)354 void WriteTypeSampler(Blob *blob, IdResult idResult1)
355 {
356     const size_t startSize = blob->size();
357     blob->push_back(0);
358     blob->push_back(idResult1);
359     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeSampler);
360 }
WriteTypeSampledImage(Blob * blob,IdResult idResult1,IdRef imageType)361 void WriteTypeSampledImage(Blob *blob, IdResult idResult1, IdRef imageType)
362 {
363     const size_t startSize = blob->size();
364     blob->push_back(0);
365     blob->push_back(idResult1);
366     blob->push_back(imageType);
367     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeSampledImage);
368 }
WriteTypeArray(Blob * blob,IdResult idResult1,IdRef elementType,IdRef length)369 void WriteTypeArray(Blob *blob, IdResult idResult1, IdRef elementType, IdRef length)
370 {
371     const size_t startSize = blob->size();
372     blob->push_back(0);
373     blob->push_back(idResult1);
374     blob->push_back(elementType);
375     blob->push_back(length);
376     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeArray);
377 }
WriteTypeRuntimeArray(Blob * blob,IdResult idResult1,IdRef elementType)378 void WriteTypeRuntimeArray(Blob *blob, IdResult idResult1, IdRef elementType)
379 {
380     const size_t startSize = blob->size();
381     blob->push_back(0);
382     blob->push_back(idResult1);
383     blob->push_back(elementType);
384     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeRuntimeArray);
385 }
WriteTypeStruct(Blob * blob,IdResult idResult1,const IdRefList & memberList)386 void WriteTypeStruct(Blob *blob, IdResult idResult1, const IdRefList &memberList)
387 {
388     const size_t startSize = blob->size();
389     blob->push_back(0);
390     blob->push_back(idResult1);
391     for (const auto &operand : memberList)
392     {
393         blob->push_back(operand);
394     }
395     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeStruct);
396 }
WriteTypePointer(Blob * blob,IdResult idResult1,spv::StorageClass storageClass2,IdRef type)397 void WriteTypePointer(Blob *blob, IdResult idResult1, spv::StorageClass storageClass2, IdRef type)
398 {
399     const size_t startSize = blob->size();
400     blob->push_back(0);
401     blob->push_back(idResult1);
402     blob->push_back(storageClass2);
403     blob->push_back(type);
404     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypePointer);
405 }
WriteTypeFunction(Blob * blob,IdResult idResult1,IdRef returnType,const IdRefList & parameterList)406 void WriteTypeFunction(Blob *blob,
407                        IdResult idResult1,
408                        IdRef returnType,
409                        const IdRefList &parameterList)
410 {
411     const size_t startSize = blob->size();
412     blob->push_back(0);
413     blob->push_back(idResult1);
414     blob->push_back(returnType);
415     for (const auto &operand : parameterList)
416     {
417         blob->push_back(operand);
418     }
419     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeFunction);
420 }
WriteConstantTrue(Blob * blob,IdResultType idResultType1,IdResult idResult2)421 void WriteConstantTrue(Blob *blob, IdResultType idResultType1, IdResult idResult2)
422 {
423     const size_t startSize = blob->size();
424     blob->push_back(0);
425     blob->push_back(idResultType1);
426     blob->push_back(idResult2);
427     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpConstantTrue);
428 }
WriteConstantFalse(Blob * blob,IdResultType idResultType1,IdResult idResult2)429 void WriteConstantFalse(Blob *blob, IdResultType idResultType1, IdResult idResult2)
430 {
431     const size_t startSize = blob->size();
432     blob->push_back(0);
433     blob->push_back(idResultType1);
434     blob->push_back(idResult2);
435     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpConstantFalse);
436 }
WriteConstant(Blob * blob,IdResultType idResultType1,IdResult idResult2,LiteralContextDependentNumber value)437 void WriteConstant(Blob *blob,
438                    IdResultType idResultType1,
439                    IdResult idResult2,
440                    LiteralContextDependentNumber value)
441 {
442     const size_t startSize = blob->size();
443     blob->push_back(0);
444     blob->push_back(idResultType1);
445     blob->push_back(idResult2);
446     blob->push_back(value);
447     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpConstant);
448 }
WriteConstantComposite(Blob * blob,IdResultType idResultType1,IdResult idResult2,const IdRefList & constituentsList)449 void WriteConstantComposite(Blob *blob,
450                             IdResultType idResultType1,
451                             IdResult idResult2,
452                             const IdRefList &constituentsList)
453 {
454     const size_t startSize = blob->size();
455     blob->push_back(0);
456     blob->push_back(idResultType1);
457     blob->push_back(idResult2);
458     for (const auto &operand : constituentsList)
459     {
460         blob->push_back(operand);
461     }
462     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpConstantComposite);
463 }
WriteConstantNull(Blob * blob,IdResultType idResultType1,IdResult idResult2)464 void WriteConstantNull(Blob *blob, IdResultType idResultType1, IdResult idResult2)
465 {
466     const size_t startSize = blob->size();
467     blob->push_back(0);
468     blob->push_back(idResultType1);
469     blob->push_back(idResult2);
470     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpConstantNull);
471 }
WriteSpecConstantTrue(Blob * blob,IdResultType idResultType1,IdResult idResult2)472 void WriteSpecConstantTrue(Blob *blob, IdResultType idResultType1, IdResult idResult2)
473 {
474     const size_t startSize = blob->size();
475     blob->push_back(0);
476     blob->push_back(idResultType1);
477     blob->push_back(idResult2);
478     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSpecConstantTrue);
479 }
WriteSpecConstantFalse(Blob * blob,IdResultType idResultType1,IdResult idResult2)480 void WriteSpecConstantFalse(Blob *blob, IdResultType idResultType1, IdResult idResult2)
481 {
482     const size_t startSize = blob->size();
483     blob->push_back(0);
484     blob->push_back(idResultType1);
485     blob->push_back(idResult2);
486     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSpecConstantFalse);
487 }
WriteSpecConstant(Blob * blob,IdResultType idResultType1,IdResult idResult2,LiteralContextDependentNumber value)488 void WriteSpecConstant(Blob *blob,
489                        IdResultType idResultType1,
490                        IdResult idResult2,
491                        LiteralContextDependentNumber value)
492 {
493     const size_t startSize = blob->size();
494     blob->push_back(0);
495     blob->push_back(idResultType1);
496     blob->push_back(idResult2);
497     blob->push_back(value);
498     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSpecConstant);
499 }
WriteSpecConstantComposite(Blob * blob,IdResultType idResultType1,IdResult idResult2,const IdRefList & constituentsList)500 void WriteSpecConstantComposite(Blob *blob,
501                                 IdResultType idResultType1,
502                                 IdResult idResult2,
503                                 const IdRefList &constituentsList)
504 {
505     const size_t startSize = blob->size();
506     blob->push_back(0);
507     blob->push_back(idResultType1);
508     blob->push_back(idResult2);
509     for (const auto &operand : constituentsList)
510     {
511         blob->push_back(operand);
512     }
513     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSpecConstantComposite);
514 }
WriteFunction(Blob * blob,IdResultType idResultType1,IdResult idResult2,spv::FunctionControlMask functionControl3,IdRef functionType)515 void WriteFunction(Blob *blob,
516                    IdResultType idResultType1,
517                    IdResult idResult2,
518                    spv::FunctionControlMask functionControl3,
519                    IdRef functionType)
520 {
521     const size_t startSize = blob->size();
522     blob->push_back(0);
523     blob->push_back(idResultType1);
524     blob->push_back(idResult2);
525     blob->push_back(functionControl3);
526     blob->push_back(functionType);
527     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFunction);
528 }
WriteFunctionParameter(Blob * blob,IdResultType idResultType1,IdResult idResult2)529 void WriteFunctionParameter(Blob *blob, IdResultType idResultType1, IdResult idResult2)
530 {
531     const size_t startSize = blob->size();
532     blob->push_back(0);
533     blob->push_back(idResultType1);
534     blob->push_back(idResult2);
535     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFunctionParameter);
536 }
WriteFunctionEnd(Blob * blob)537 void WriteFunctionEnd(Blob *blob)
538 {
539     const size_t startSize = blob->size();
540     blob->push_back(0);
541 
542     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFunctionEnd);
543 }
WriteFunctionCall(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef function,const IdRefList & argumentList)544 void WriteFunctionCall(Blob *blob,
545                        IdResultType idResultType1,
546                        IdResult idResult2,
547                        IdRef function,
548                        const IdRefList &argumentList)
549 {
550     const size_t startSize = blob->size();
551     blob->push_back(0);
552     blob->push_back(idResultType1);
553     blob->push_back(idResult2);
554     blob->push_back(function);
555     for (const auto &operand : argumentList)
556     {
557         blob->push_back(operand);
558     }
559     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFunctionCall);
560 }
WriteVariable(Blob * blob,IdResultType idResultType1,IdResult idResult2,spv::StorageClass storageClass3,const IdRef * initializer)561 void WriteVariable(Blob *blob,
562                    IdResultType idResultType1,
563                    IdResult idResult2,
564                    spv::StorageClass storageClass3,
565                    const IdRef *initializer)
566 {
567     const size_t startSize = blob->size();
568     blob->push_back(0);
569     blob->push_back(idResultType1);
570     blob->push_back(idResult2);
571     blob->push_back(storageClass3);
572     if (initializer)
573     {
574         blob->push_back(*initializer);
575     }
576     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpVariable);
577 }
WriteImageTexelPointer(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef image,IdRef coordinate,IdRef sample)578 void WriteImageTexelPointer(Blob *blob,
579                             IdResultType idResultType1,
580                             IdResult idResult2,
581                             IdRef image,
582                             IdRef coordinate,
583                             IdRef sample)
584 {
585     const size_t startSize = blob->size();
586     blob->push_back(0);
587     blob->push_back(idResultType1);
588     blob->push_back(idResult2);
589     blob->push_back(image);
590     blob->push_back(coordinate);
591     blob->push_back(sample);
592     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageTexelPointer);
593 }
WriteLoad(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,const spv::MemoryAccessMask * memoryAccess4)594 void WriteLoad(Blob *blob,
595                IdResultType idResultType1,
596                IdResult idResult2,
597                IdRef pointer,
598                const spv::MemoryAccessMask *memoryAccess4)
599 {
600     const size_t startSize = blob->size();
601     blob->push_back(0);
602     blob->push_back(idResultType1);
603     blob->push_back(idResult2);
604     blob->push_back(pointer);
605     if (memoryAccess4)
606     {
607         blob->push_back(*memoryAccess4);
608     }
609     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpLoad);
610 }
WriteStore(Blob * blob,IdRef pointer,IdRef object,const spv::MemoryAccessMask * memoryAccess3)611 void WriteStore(Blob *blob, IdRef pointer, IdRef object, const spv::MemoryAccessMask *memoryAccess3)
612 {
613     const size_t startSize = blob->size();
614     blob->push_back(0);
615     blob->push_back(pointer);
616     blob->push_back(object);
617     if (memoryAccess3)
618     {
619         blob->push_back(*memoryAccess3);
620     }
621     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpStore);
622 }
WriteCopyMemory(Blob * blob,IdRef target,IdRef source,const spv::MemoryAccessMask * memoryAccess3,const spv::MemoryAccessMask * memoryAccess4)623 void WriteCopyMemory(Blob *blob,
624                      IdRef target,
625                      IdRef source,
626                      const spv::MemoryAccessMask *memoryAccess3,
627                      const spv::MemoryAccessMask *memoryAccess4)
628 {
629     const size_t startSize = blob->size();
630     blob->push_back(0);
631     blob->push_back(target);
632     blob->push_back(source);
633     if (memoryAccess3)
634     {
635         blob->push_back(*memoryAccess3);
636     }
637     if (memoryAccess4)
638     {
639         blob->push_back(*memoryAccess4);
640     }
641     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpCopyMemory);
642 }
WriteAccessChain(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef base,const IdRefList & indexesList)643 void WriteAccessChain(Blob *blob,
644                       IdResultType idResultType1,
645                       IdResult idResult2,
646                       IdRef base,
647                       const IdRefList &indexesList)
648 {
649     const size_t startSize = blob->size();
650     blob->push_back(0);
651     blob->push_back(idResultType1);
652     blob->push_back(idResult2);
653     blob->push_back(base);
654     for (const auto &operand : indexesList)
655     {
656         blob->push_back(operand);
657     }
658     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAccessChain);
659 }
WriteInBoundsAccessChain(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef base,const IdRefList & indexesList)660 void WriteInBoundsAccessChain(Blob *blob,
661                               IdResultType idResultType1,
662                               IdResult idResult2,
663                               IdRef base,
664                               const IdRefList &indexesList)
665 {
666     const size_t startSize = blob->size();
667     blob->push_back(0);
668     blob->push_back(idResultType1);
669     blob->push_back(idResult2);
670     blob->push_back(base);
671     for (const auto &operand : indexesList)
672     {
673         blob->push_back(operand);
674     }
675     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpInBoundsAccessChain);
676 }
WriteArrayLength(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef structure,LiteralInteger arraymember)677 void WriteArrayLength(Blob *blob,
678                       IdResultType idResultType1,
679                       IdResult idResult2,
680                       IdRef structure,
681                       LiteralInteger arraymember)
682 {
683     const size_t startSize = blob->size();
684     blob->push_back(0);
685     blob->push_back(idResultType1);
686     blob->push_back(idResult2);
687     blob->push_back(structure);
688     blob->push_back(arraymember);
689     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpArrayLength);
690 }
WriteDecorate(Blob * blob,IdRef target,spv::Decoration decoration2,const LiteralIntegerList & valuesList)691 void WriteDecorate(Blob *blob,
692                    IdRef target,
693                    spv::Decoration decoration2,
694                    const LiteralIntegerList &valuesList)
695 {
696     const size_t startSize = blob->size();
697     blob->push_back(0);
698     blob->push_back(target);
699     blob->push_back(decoration2);
700     for (const auto &operand : valuesList)
701     {
702         blob->push_back(operand);
703     }
704     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpDecorate);
705 }
WriteMemberDecorate(Blob * blob,IdRef structureType,LiteralInteger member,spv::Decoration decoration3,const LiteralIntegerList & valuesList)706 void WriteMemberDecorate(Blob *blob,
707                          IdRef structureType,
708                          LiteralInteger member,
709                          spv::Decoration decoration3,
710                          const LiteralIntegerList &valuesList)
711 {
712     const size_t startSize = blob->size();
713     blob->push_back(0);
714     blob->push_back(structureType);
715     blob->push_back(member);
716     blob->push_back(decoration3);
717     for (const auto &operand : valuesList)
718     {
719         blob->push_back(operand);
720     }
721     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpMemberDecorate);
722 }
WriteDecorationGroup(Blob * blob,IdResult idResult1)723 void WriteDecorationGroup(Blob *blob, IdResult idResult1)
724 {
725     const size_t startSize = blob->size();
726     blob->push_back(0);
727     blob->push_back(idResult1);
728     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpDecorationGroup);
729 }
WriteGroupDecorate(Blob * blob,IdRef decorationGroup,const IdRefList & targetsList)730 void WriteGroupDecorate(Blob *blob, IdRef decorationGroup, const IdRefList &targetsList)
731 {
732     const size_t startSize = blob->size();
733     blob->push_back(0);
734     blob->push_back(decorationGroup);
735     for (const auto &operand : targetsList)
736     {
737         blob->push_back(operand);
738     }
739     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupDecorate);
740 }
WriteGroupMemberDecorate(Blob * blob,IdRef decorationGroup,const PairIdRefLiteralIntegerList & targetsPairList)741 void WriteGroupMemberDecorate(Blob *blob,
742                               IdRef decorationGroup,
743                               const PairIdRefLiteralIntegerList &targetsPairList)
744 {
745     const size_t startSize = blob->size();
746     blob->push_back(0);
747     blob->push_back(decorationGroup);
748     for (const auto &operand : targetsPairList)
749     {
750         blob->push_back(operand.id);
751         blob->push_back(operand.literal);
752     }
753     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupMemberDecorate);
754 }
WriteVectorExtractDynamic(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector,IdRef index)755 void WriteVectorExtractDynamic(Blob *blob,
756                                IdResultType idResultType1,
757                                IdResult idResult2,
758                                IdRef vector,
759                                IdRef index)
760 {
761     const size_t startSize = blob->size();
762     blob->push_back(0);
763     blob->push_back(idResultType1);
764     blob->push_back(idResult2);
765     blob->push_back(vector);
766     blob->push_back(index);
767     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpVectorExtractDynamic);
768 }
WriteVectorInsertDynamic(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector,IdRef component,IdRef index)769 void WriteVectorInsertDynamic(Blob *blob,
770                               IdResultType idResultType1,
771                               IdResult idResult2,
772                               IdRef vector,
773                               IdRef component,
774                               IdRef index)
775 {
776     const size_t startSize = blob->size();
777     blob->push_back(0);
778     blob->push_back(idResultType1);
779     blob->push_back(idResult2);
780     blob->push_back(vector);
781     blob->push_back(component);
782     blob->push_back(index);
783     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpVectorInsertDynamic);
784 }
WriteVectorShuffle(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector1,IdRef vector2,const LiteralIntegerList & componentsList)785 void WriteVectorShuffle(Blob *blob,
786                         IdResultType idResultType1,
787                         IdResult idResult2,
788                         IdRef vector1,
789                         IdRef vector2,
790                         const LiteralIntegerList &componentsList)
791 {
792     const size_t startSize = blob->size();
793     blob->push_back(0);
794     blob->push_back(idResultType1);
795     blob->push_back(idResult2);
796     blob->push_back(vector1);
797     blob->push_back(vector2);
798     for (const auto &operand : componentsList)
799     {
800         blob->push_back(operand);
801     }
802     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpVectorShuffle);
803 }
WriteCompositeConstruct(Blob * blob,IdResultType idResultType1,IdResult idResult2,const IdRefList & constituentsList)804 void WriteCompositeConstruct(Blob *blob,
805                              IdResultType idResultType1,
806                              IdResult idResult2,
807                              const IdRefList &constituentsList)
808 {
809     const size_t startSize = blob->size();
810     blob->push_back(0);
811     blob->push_back(idResultType1);
812     blob->push_back(idResult2);
813     for (const auto &operand : constituentsList)
814     {
815         blob->push_back(operand);
816     }
817     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpCompositeConstruct);
818 }
WriteCompositeExtract(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef composite,const LiteralIntegerList & indexesList)819 void WriteCompositeExtract(Blob *blob,
820                            IdResultType idResultType1,
821                            IdResult idResult2,
822                            IdRef composite,
823                            const LiteralIntegerList &indexesList)
824 {
825     const size_t startSize = blob->size();
826     blob->push_back(0);
827     blob->push_back(idResultType1);
828     blob->push_back(idResult2);
829     blob->push_back(composite);
830     for (const auto &operand : indexesList)
831     {
832         blob->push_back(operand);
833     }
834     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpCompositeExtract);
835 }
WriteCompositeInsert(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef object,IdRef composite,const LiteralIntegerList & indexesList)836 void WriteCompositeInsert(Blob *blob,
837                           IdResultType idResultType1,
838                           IdResult idResult2,
839                           IdRef object,
840                           IdRef composite,
841                           const LiteralIntegerList &indexesList)
842 {
843     const size_t startSize = blob->size();
844     blob->push_back(0);
845     blob->push_back(idResultType1);
846     blob->push_back(idResult2);
847     blob->push_back(object);
848     blob->push_back(composite);
849     for (const auto &operand : indexesList)
850     {
851         blob->push_back(operand);
852     }
853     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpCompositeInsert);
854 }
WriteCopyObject(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand)855 void WriteCopyObject(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef operand)
856 {
857     const size_t startSize = blob->size();
858     blob->push_back(0);
859     blob->push_back(idResultType1);
860     blob->push_back(idResult2);
861     blob->push_back(operand);
862     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpCopyObject);
863 }
WriteTranspose(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef matrix)864 void WriteTranspose(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef matrix)
865 {
866     const size_t startSize = blob->size();
867     blob->push_back(0);
868     blob->push_back(idResultType1);
869     blob->push_back(idResult2);
870     blob->push_back(matrix);
871     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTranspose);
872 }
WriteSampledImage(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef image,IdRef sampler)873 void WriteSampledImage(Blob *blob,
874                        IdResultType idResultType1,
875                        IdResult idResult2,
876                        IdRef image,
877                        IdRef sampler)
878 {
879     const size_t startSize = blob->size();
880     blob->push_back(0);
881     blob->push_back(idResultType1);
882     blob->push_back(idResult2);
883     blob->push_back(image);
884     blob->push_back(sampler);
885     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSampledImage);
886 }
WriteImageSampleImplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,const spv::ImageOperandsMask * imageOperands5,const IdRefList & imageOperandIdsList)887 void WriteImageSampleImplicitLod(Blob *blob,
888                                  IdResultType idResultType1,
889                                  IdResult idResult2,
890                                  IdRef sampledImage,
891                                  IdRef coordinate,
892                                  const spv::ImageOperandsMask *imageOperands5,
893                                  const IdRefList &imageOperandIdsList)
894 {
895     const size_t startSize = blob->size();
896     blob->push_back(0);
897     blob->push_back(idResultType1);
898     blob->push_back(idResult2);
899     blob->push_back(sampledImage);
900     blob->push_back(coordinate);
901     if (imageOperands5)
902     {
903         blob->push_back(*imageOperands5);
904     }
905     for (const auto &operand : imageOperandIdsList)
906     {
907         blob->push_back(operand);
908     }
909     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageSampleImplicitLod);
910 }
WriteImageSampleExplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,spv::ImageOperandsMask imageOperands5,const IdRefList & imageOperandIdsList)911 void WriteImageSampleExplicitLod(Blob *blob,
912                                  IdResultType idResultType1,
913                                  IdResult idResult2,
914                                  IdRef sampledImage,
915                                  IdRef coordinate,
916                                  spv::ImageOperandsMask imageOperands5,
917                                  const IdRefList &imageOperandIdsList)
918 {
919     const size_t startSize = blob->size();
920     blob->push_back(0);
921     blob->push_back(idResultType1);
922     blob->push_back(idResult2);
923     blob->push_back(sampledImage);
924     blob->push_back(coordinate);
925     blob->push_back(imageOperands5);
926     for (const auto &operand : imageOperandIdsList)
927     {
928         blob->push_back(operand);
929     }
930     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageSampleExplicitLod);
931 }
WriteImageSampleDrefImplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef dref,const spv::ImageOperandsMask * imageOperands6,const IdRefList & imageOperandIdsList)932 void WriteImageSampleDrefImplicitLod(Blob *blob,
933                                      IdResultType idResultType1,
934                                      IdResult idResult2,
935                                      IdRef sampledImage,
936                                      IdRef coordinate,
937                                      IdRef dref,
938                                      const spv::ImageOperandsMask *imageOperands6,
939                                      const IdRefList &imageOperandIdsList)
940 {
941     const size_t startSize = blob->size();
942     blob->push_back(0);
943     blob->push_back(idResultType1);
944     blob->push_back(idResult2);
945     blob->push_back(sampledImage);
946     blob->push_back(coordinate);
947     blob->push_back(dref);
948     if (imageOperands6)
949     {
950         blob->push_back(*imageOperands6);
951     }
952     for (const auto &operand : imageOperandIdsList)
953     {
954         blob->push_back(operand);
955     }
956     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageSampleDrefImplicitLod);
957 }
WriteImageSampleDrefExplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef dref,spv::ImageOperandsMask imageOperands6,const IdRefList & imageOperandIdsList)958 void WriteImageSampleDrefExplicitLod(Blob *blob,
959                                      IdResultType idResultType1,
960                                      IdResult idResult2,
961                                      IdRef sampledImage,
962                                      IdRef coordinate,
963                                      IdRef dref,
964                                      spv::ImageOperandsMask imageOperands6,
965                                      const IdRefList &imageOperandIdsList)
966 {
967     const size_t startSize = blob->size();
968     blob->push_back(0);
969     blob->push_back(idResultType1);
970     blob->push_back(idResult2);
971     blob->push_back(sampledImage);
972     blob->push_back(coordinate);
973     blob->push_back(dref);
974     blob->push_back(imageOperands6);
975     for (const auto &operand : imageOperandIdsList)
976     {
977         blob->push_back(operand);
978     }
979     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageSampleDrefExplicitLod);
980 }
WriteImageSampleProjImplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,const spv::ImageOperandsMask * imageOperands5,const IdRefList & imageOperandIdsList)981 void WriteImageSampleProjImplicitLod(Blob *blob,
982                                      IdResultType idResultType1,
983                                      IdResult idResult2,
984                                      IdRef sampledImage,
985                                      IdRef coordinate,
986                                      const spv::ImageOperandsMask *imageOperands5,
987                                      const IdRefList &imageOperandIdsList)
988 {
989     const size_t startSize = blob->size();
990     blob->push_back(0);
991     blob->push_back(idResultType1);
992     blob->push_back(idResult2);
993     blob->push_back(sampledImage);
994     blob->push_back(coordinate);
995     if (imageOperands5)
996     {
997         blob->push_back(*imageOperands5);
998     }
999     for (const auto &operand : imageOperandIdsList)
1000     {
1001         blob->push_back(operand);
1002     }
1003     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageSampleProjImplicitLod);
1004 }
WriteImageSampleProjExplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,spv::ImageOperandsMask imageOperands5,const IdRefList & imageOperandIdsList)1005 void WriteImageSampleProjExplicitLod(Blob *blob,
1006                                      IdResultType idResultType1,
1007                                      IdResult idResult2,
1008                                      IdRef sampledImage,
1009                                      IdRef coordinate,
1010                                      spv::ImageOperandsMask imageOperands5,
1011                                      const IdRefList &imageOperandIdsList)
1012 {
1013     const size_t startSize = blob->size();
1014     blob->push_back(0);
1015     blob->push_back(idResultType1);
1016     blob->push_back(idResult2);
1017     blob->push_back(sampledImage);
1018     blob->push_back(coordinate);
1019     blob->push_back(imageOperands5);
1020     for (const auto &operand : imageOperandIdsList)
1021     {
1022         blob->push_back(operand);
1023     }
1024     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageSampleProjExplicitLod);
1025 }
WriteImageSampleProjDrefImplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef dref,const spv::ImageOperandsMask * imageOperands6,const IdRefList & imageOperandIdsList)1026 void WriteImageSampleProjDrefImplicitLod(Blob *blob,
1027                                          IdResultType idResultType1,
1028                                          IdResult idResult2,
1029                                          IdRef sampledImage,
1030                                          IdRef coordinate,
1031                                          IdRef dref,
1032                                          const spv::ImageOperandsMask *imageOperands6,
1033                                          const IdRefList &imageOperandIdsList)
1034 {
1035     const size_t startSize = blob->size();
1036     blob->push_back(0);
1037     blob->push_back(idResultType1);
1038     blob->push_back(idResult2);
1039     blob->push_back(sampledImage);
1040     blob->push_back(coordinate);
1041     blob->push_back(dref);
1042     if (imageOperands6)
1043     {
1044         blob->push_back(*imageOperands6);
1045     }
1046     for (const auto &operand : imageOperandIdsList)
1047     {
1048         blob->push_back(operand);
1049     }
1050     (*blob)[startSize] =
1051         MakeLengthOp(blob->size() - startSize, spv::OpImageSampleProjDrefImplicitLod);
1052 }
WriteImageSampleProjDrefExplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef dref,spv::ImageOperandsMask imageOperands6,const IdRefList & imageOperandIdsList)1053 void WriteImageSampleProjDrefExplicitLod(Blob *blob,
1054                                          IdResultType idResultType1,
1055                                          IdResult idResult2,
1056                                          IdRef sampledImage,
1057                                          IdRef coordinate,
1058                                          IdRef dref,
1059                                          spv::ImageOperandsMask imageOperands6,
1060                                          const IdRefList &imageOperandIdsList)
1061 {
1062     const size_t startSize = blob->size();
1063     blob->push_back(0);
1064     blob->push_back(idResultType1);
1065     blob->push_back(idResult2);
1066     blob->push_back(sampledImage);
1067     blob->push_back(coordinate);
1068     blob->push_back(dref);
1069     blob->push_back(imageOperands6);
1070     for (const auto &operand : imageOperandIdsList)
1071     {
1072         blob->push_back(operand);
1073     }
1074     (*blob)[startSize] =
1075         MakeLengthOp(blob->size() - startSize, spv::OpImageSampleProjDrefExplicitLod);
1076 }
WriteImageFetch(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef image,IdRef coordinate,const spv::ImageOperandsMask * imageOperands5,const IdRefList & imageOperandIdsList)1077 void WriteImageFetch(Blob *blob,
1078                      IdResultType idResultType1,
1079                      IdResult idResult2,
1080                      IdRef image,
1081                      IdRef coordinate,
1082                      const spv::ImageOperandsMask *imageOperands5,
1083                      const IdRefList &imageOperandIdsList)
1084 {
1085     const size_t startSize = blob->size();
1086     blob->push_back(0);
1087     blob->push_back(idResultType1);
1088     blob->push_back(idResult2);
1089     blob->push_back(image);
1090     blob->push_back(coordinate);
1091     if (imageOperands5)
1092     {
1093         blob->push_back(*imageOperands5);
1094     }
1095     for (const auto &operand : imageOperandIdsList)
1096     {
1097         blob->push_back(operand);
1098     }
1099     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageFetch);
1100 }
WriteImageGather(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef component,const spv::ImageOperandsMask * imageOperands6,const IdRefList & imageOperandIdsList)1101 void WriteImageGather(Blob *blob,
1102                       IdResultType idResultType1,
1103                       IdResult idResult2,
1104                       IdRef sampledImage,
1105                       IdRef coordinate,
1106                       IdRef component,
1107                       const spv::ImageOperandsMask *imageOperands6,
1108                       const IdRefList &imageOperandIdsList)
1109 {
1110     const size_t startSize = blob->size();
1111     blob->push_back(0);
1112     blob->push_back(idResultType1);
1113     blob->push_back(idResult2);
1114     blob->push_back(sampledImage);
1115     blob->push_back(coordinate);
1116     blob->push_back(component);
1117     if (imageOperands6)
1118     {
1119         blob->push_back(*imageOperands6);
1120     }
1121     for (const auto &operand : imageOperandIdsList)
1122     {
1123         blob->push_back(operand);
1124     }
1125     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageGather);
1126 }
WriteImageDrefGather(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef dref,const spv::ImageOperandsMask * imageOperands6,const IdRefList & imageOperandIdsList)1127 void WriteImageDrefGather(Blob *blob,
1128                           IdResultType idResultType1,
1129                           IdResult idResult2,
1130                           IdRef sampledImage,
1131                           IdRef coordinate,
1132                           IdRef dref,
1133                           const spv::ImageOperandsMask *imageOperands6,
1134                           const IdRefList &imageOperandIdsList)
1135 {
1136     const size_t startSize = blob->size();
1137     blob->push_back(0);
1138     blob->push_back(idResultType1);
1139     blob->push_back(idResult2);
1140     blob->push_back(sampledImage);
1141     blob->push_back(coordinate);
1142     blob->push_back(dref);
1143     if (imageOperands6)
1144     {
1145         blob->push_back(*imageOperands6);
1146     }
1147     for (const auto &operand : imageOperandIdsList)
1148     {
1149         blob->push_back(operand);
1150     }
1151     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageDrefGather);
1152 }
WriteImageRead(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef image,IdRef coordinate,const spv::ImageOperandsMask * imageOperands5,const IdRefList & imageOperandIdsList)1153 void WriteImageRead(Blob *blob,
1154                     IdResultType idResultType1,
1155                     IdResult idResult2,
1156                     IdRef image,
1157                     IdRef coordinate,
1158                     const spv::ImageOperandsMask *imageOperands5,
1159                     const IdRefList &imageOperandIdsList)
1160 {
1161     const size_t startSize = blob->size();
1162     blob->push_back(0);
1163     blob->push_back(idResultType1);
1164     blob->push_back(idResult2);
1165     blob->push_back(image);
1166     blob->push_back(coordinate);
1167     if (imageOperands5)
1168     {
1169         blob->push_back(*imageOperands5);
1170     }
1171     for (const auto &operand : imageOperandIdsList)
1172     {
1173         blob->push_back(operand);
1174     }
1175     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageRead);
1176 }
WriteImageWrite(Blob * blob,IdRef image,IdRef coordinate,IdRef texel,const spv::ImageOperandsMask * imageOperands4,const IdRefList & imageOperandIdsList)1177 void WriteImageWrite(Blob *blob,
1178                      IdRef image,
1179                      IdRef coordinate,
1180                      IdRef texel,
1181                      const spv::ImageOperandsMask *imageOperands4,
1182                      const IdRefList &imageOperandIdsList)
1183 {
1184     const size_t startSize = blob->size();
1185     blob->push_back(0);
1186     blob->push_back(image);
1187     blob->push_back(coordinate);
1188     blob->push_back(texel);
1189     if (imageOperands4)
1190     {
1191         blob->push_back(*imageOperands4);
1192     }
1193     for (const auto &operand : imageOperandIdsList)
1194     {
1195         blob->push_back(operand);
1196     }
1197     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageWrite);
1198 }
WriteImage(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage)1199 void WriteImage(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef sampledImage)
1200 {
1201     const size_t startSize = blob->size();
1202     blob->push_back(0);
1203     blob->push_back(idResultType1);
1204     blob->push_back(idResult2);
1205     blob->push_back(sampledImage);
1206     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImage);
1207 }
WriteImageQuerySizeLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef image,IdRef levelofDetail)1208 void WriteImageQuerySizeLod(Blob *blob,
1209                             IdResultType idResultType1,
1210                             IdResult idResult2,
1211                             IdRef image,
1212                             IdRef levelofDetail)
1213 {
1214     const size_t startSize = blob->size();
1215     blob->push_back(0);
1216     blob->push_back(idResultType1);
1217     blob->push_back(idResult2);
1218     blob->push_back(image);
1219     blob->push_back(levelofDetail);
1220     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageQuerySizeLod);
1221 }
WriteImageQuerySize(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef image)1222 void WriteImageQuerySize(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef image)
1223 {
1224     const size_t startSize = blob->size();
1225     blob->push_back(0);
1226     blob->push_back(idResultType1);
1227     blob->push_back(idResult2);
1228     blob->push_back(image);
1229     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageQuerySize);
1230 }
WriteImageQueryLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate)1231 void WriteImageQueryLod(Blob *blob,
1232                         IdResultType idResultType1,
1233                         IdResult idResult2,
1234                         IdRef sampledImage,
1235                         IdRef coordinate)
1236 {
1237     const size_t startSize = blob->size();
1238     blob->push_back(0);
1239     blob->push_back(idResultType1);
1240     blob->push_back(idResult2);
1241     blob->push_back(sampledImage);
1242     blob->push_back(coordinate);
1243     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageQueryLod);
1244 }
WriteImageQueryLevels(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef image)1245 void WriteImageQueryLevels(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef image)
1246 {
1247     const size_t startSize = blob->size();
1248     blob->push_back(0);
1249     blob->push_back(idResultType1);
1250     blob->push_back(idResult2);
1251     blob->push_back(image);
1252     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageQueryLevels);
1253 }
WriteImageQuerySamples(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef image)1254 void WriteImageQuerySamples(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef image)
1255 {
1256     const size_t startSize = blob->size();
1257     blob->push_back(0);
1258     blob->push_back(idResultType1);
1259     blob->push_back(idResult2);
1260     blob->push_back(image);
1261     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageQuerySamples);
1262 }
WriteConvertFToU(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef floatValue)1263 void WriteConvertFToU(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef floatValue)
1264 {
1265     const size_t startSize = blob->size();
1266     blob->push_back(0);
1267     blob->push_back(idResultType1);
1268     blob->push_back(idResult2);
1269     blob->push_back(floatValue);
1270     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpConvertFToU);
1271 }
WriteConvertFToS(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef floatValue)1272 void WriteConvertFToS(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef floatValue)
1273 {
1274     const size_t startSize = blob->size();
1275     blob->push_back(0);
1276     blob->push_back(idResultType1);
1277     blob->push_back(idResult2);
1278     blob->push_back(floatValue);
1279     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpConvertFToS);
1280 }
WriteConvertSToF(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef signedValue)1281 void WriteConvertSToF(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef signedValue)
1282 {
1283     const size_t startSize = blob->size();
1284     blob->push_back(0);
1285     blob->push_back(idResultType1);
1286     blob->push_back(idResult2);
1287     blob->push_back(signedValue);
1288     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpConvertSToF);
1289 }
WriteConvertUToF(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef unsignedValue)1290 void WriteConvertUToF(Blob *blob,
1291                       IdResultType idResultType1,
1292                       IdResult idResult2,
1293                       IdRef unsignedValue)
1294 {
1295     const size_t startSize = blob->size();
1296     blob->push_back(0);
1297     blob->push_back(idResultType1);
1298     blob->push_back(idResult2);
1299     blob->push_back(unsignedValue);
1300     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpConvertUToF);
1301 }
WriteUConvert(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef unsignedValue)1302 void WriteUConvert(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef unsignedValue)
1303 {
1304     const size_t startSize = blob->size();
1305     blob->push_back(0);
1306     blob->push_back(idResultType1);
1307     blob->push_back(idResult2);
1308     blob->push_back(unsignedValue);
1309     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpUConvert);
1310 }
WriteSConvert(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef signedValue)1311 void WriteSConvert(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef signedValue)
1312 {
1313     const size_t startSize = blob->size();
1314     blob->push_back(0);
1315     blob->push_back(idResultType1);
1316     blob->push_back(idResult2);
1317     blob->push_back(signedValue);
1318     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSConvert);
1319 }
WriteFConvert(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef floatValue)1320 void WriteFConvert(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef floatValue)
1321 {
1322     const size_t startSize = blob->size();
1323     blob->push_back(0);
1324     blob->push_back(idResultType1);
1325     blob->push_back(idResult2);
1326     blob->push_back(floatValue);
1327     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFConvert);
1328 }
WriteQuantizeToF16(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef value)1329 void WriteQuantizeToF16(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef value)
1330 {
1331     const size_t startSize = blob->size();
1332     blob->push_back(0);
1333     blob->push_back(idResultType1);
1334     blob->push_back(idResult2);
1335     blob->push_back(value);
1336     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpQuantizeToF16);
1337 }
WriteBitcast(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand)1338 void WriteBitcast(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef operand)
1339 {
1340     const size_t startSize = blob->size();
1341     blob->push_back(0);
1342     blob->push_back(idResultType1);
1343     blob->push_back(idResult2);
1344     blob->push_back(operand);
1345     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBitcast);
1346 }
WriteSNegate(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand)1347 void WriteSNegate(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef operand)
1348 {
1349     const size_t startSize = blob->size();
1350     blob->push_back(0);
1351     blob->push_back(idResultType1);
1352     blob->push_back(idResult2);
1353     blob->push_back(operand);
1354     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSNegate);
1355 }
WriteFNegate(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand)1356 void WriteFNegate(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef operand)
1357 {
1358     const size_t startSize = blob->size();
1359     blob->push_back(0);
1360     blob->push_back(idResultType1);
1361     blob->push_back(idResult2);
1362     blob->push_back(operand);
1363     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFNegate);
1364 }
WriteIAdd(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1365 void WriteIAdd(Blob *blob,
1366                IdResultType idResultType1,
1367                IdResult idResult2,
1368                IdRef operand1,
1369                IdRef operand2)
1370 {
1371     const size_t startSize = blob->size();
1372     blob->push_back(0);
1373     blob->push_back(idResultType1);
1374     blob->push_back(idResult2);
1375     blob->push_back(operand1);
1376     blob->push_back(operand2);
1377     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpIAdd);
1378 }
WriteFAdd(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1379 void WriteFAdd(Blob *blob,
1380                IdResultType idResultType1,
1381                IdResult idResult2,
1382                IdRef operand1,
1383                IdRef operand2)
1384 {
1385     const size_t startSize = blob->size();
1386     blob->push_back(0);
1387     blob->push_back(idResultType1);
1388     blob->push_back(idResult2);
1389     blob->push_back(operand1);
1390     blob->push_back(operand2);
1391     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFAdd);
1392 }
WriteISub(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1393 void WriteISub(Blob *blob,
1394                IdResultType idResultType1,
1395                IdResult idResult2,
1396                IdRef operand1,
1397                IdRef operand2)
1398 {
1399     const size_t startSize = blob->size();
1400     blob->push_back(0);
1401     blob->push_back(idResultType1);
1402     blob->push_back(idResult2);
1403     blob->push_back(operand1);
1404     blob->push_back(operand2);
1405     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpISub);
1406 }
WriteFSub(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1407 void WriteFSub(Blob *blob,
1408                IdResultType idResultType1,
1409                IdResult idResult2,
1410                IdRef operand1,
1411                IdRef operand2)
1412 {
1413     const size_t startSize = blob->size();
1414     blob->push_back(0);
1415     blob->push_back(idResultType1);
1416     blob->push_back(idResult2);
1417     blob->push_back(operand1);
1418     blob->push_back(operand2);
1419     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFSub);
1420 }
WriteIMul(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1421 void WriteIMul(Blob *blob,
1422                IdResultType idResultType1,
1423                IdResult idResult2,
1424                IdRef operand1,
1425                IdRef operand2)
1426 {
1427     const size_t startSize = blob->size();
1428     blob->push_back(0);
1429     blob->push_back(idResultType1);
1430     blob->push_back(idResult2);
1431     blob->push_back(operand1);
1432     blob->push_back(operand2);
1433     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpIMul);
1434 }
WriteFMul(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1435 void WriteFMul(Blob *blob,
1436                IdResultType idResultType1,
1437                IdResult idResult2,
1438                IdRef operand1,
1439                IdRef operand2)
1440 {
1441     const size_t startSize = blob->size();
1442     blob->push_back(0);
1443     blob->push_back(idResultType1);
1444     blob->push_back(idResult2);
1445     blob->push_back(operand1);
1446     blob->push_back(operand2);
1447     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFMul);
1448 }
WriteUDiv(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1449 void WriteUDiv(Blob *blob,
1450                IdResultType idResultType1,
1451                IdResult idResult2,
1452                IdRef operand1,
1453                IdRef operand2)
1454 {
1455     const size_t startSize = blob->size();
1456     blob->push_back(0);
1457     blob->push_back(idResultType1);
1458     blob->push_back(idResult2);
1459     blob->push_back(operand1);
1460     blob->push_back(operand2);
1461     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpUDiv);
1462 }
WriteSDiv(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1463 void WriteSDiv(Blob *blob,
1464                IdResultType idResultType1,
1465                IdResult idResult2,
1466                IdRef operand1,
1467                IdRef operand2)
1468 {
1469     const size_t startSize = blob->size();
1470     blob->push_back(0);
1471     blob->push_back(idResultType1);
1472     blob->push_back(idResult2);
1473     blob->push_back(operand1);
1474     blob->push_back(operand2);
1475     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSDiv);
1476 }
WriteFDiv(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1477 void WriteFDiv(Blob *blob,
1478                IdResultType idResultType1,
1479                IdResult idResult2,
1480                IdRef operand1,
1481                IdRef operand2)
1482 {
1483     const size_t startSize = blob->size();
1484     blob->push_back(0);
1485     blob->push_back(idResultType1);
1486     blob->push_back(idResult2);
1487     blob->push_back(operand1);
1488     blob->push_back(operand2);
1489     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFDiv);
1490 }
WriteUMod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1491 void WriteUMod(Blob *blob,
1492                IdResultType idResultType1,
1493                IdResult idResult2,
1494                IdRef operand1,
1495                IdRef operand2)
1496 {
1497     const size_t startSize = blob->size();
1498     blob->push_back(0);
1499     blob->push_back(idResultType1);
1500     blob->push_back(idResult2);
1501     blob->push_back(operand1);
1502     blob->push_back(operand2);
1503     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpUMod);
1504 }
WriteSRem(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1505 void WriteSRem(Blob *blob,
1506                IdResultType idResultType1,
1507                IdResult idResult2,
1508                IdRef operand1,
1509                IdRef operand2)
1510 {
1511     const size_t startSize = blob->size();
1512     blob->push_back(0);
1513     blob->push_back(idResultType1);
1514     blob->push_back(idResult2);
1515     blob->push_back(operand1);
1516     blob->push_back(operand2);
1517     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSRem);
1518 }
WriteSMod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1519 void WriteSMod(Blob *blob,
1520                IdResultType idResultType1,
1521                IdResult idResult2,
1522                IdRef operand1,
1523                IdRef operand2)
1524 {
1525     const size_t startSize = blob->size();
1526     blob->push_back(0);
1527     blob->push_back(idResultType1);
1528     blob->push_back(idResult2);
1529     blob->push_back(operand1);
1530     blob->push_back(operand2);
1531     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSMod);
1532 }
WriteFRem(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1533 void WriteFRem(Blob *blob,
1534                IdResultType idResultType1,
1535                IdResult idResult2,
1536                IdRef operand1,
1537                IdRef operand2)
1538 {
1539     const size_t startSize = blob->size();
1540     blob->push_back(0);
1541     blob->push_back(idResultType1);
1542     blob->push_back(idResult2);
1543     blob->push_back(operand1);
1544     blob->push_back(operand2);
1545     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFRem);
1546 }
WriteFMod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1547 void WriteFMod(Blob *blob,
1548                IdResultType idResultType1,
1549                IdResult idResult2,
1550                IdRef operand1,
1551                IdRef operand2)
1552 {
1553     const size_t startSize = blob->size();
1554     blob->push_back(0);
1555     blob->push_back(idResultType1);
1556     blob->push_back(idResult2);
1557     blob->push_back(operand1);
1558     blob->push_back(operand2);
1559     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFMod);
1560 }
WriteVectorTimesScalar(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector,IdRef scalar)1561 void WriteVectorTimesScalar(Blob *blob,
1562                             IdResultType idResultType1,
1563                             IdResult idResult2,
1564                             IdRef vector,
1565                             IdRef scalar)
1566 {
1567     const size_t startSize = blob->size();
1568     blob->push_back(0);
1569     blob->push_back(idResultType1);
1570     blob->push_back(idResult2);
1571     blob->push_back(vector);
1572     blob->push_back(scalar);
1573     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpVectorTimesScalar);
1574 }
WriteMatrixTimesScalar(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef matrix,IdRef scalar)1575 void WriteMatrixTimesScalar(Blob *blob,
1576                             IdResultType idResultType1,
1577                             IdResult idResult2,
1578                             IdRef matrix,
1579                             IdRef scalar)
1580 {
1581     const size_t startSize = blob->size();
1582     blob->push_back(0);
1583     blob->push_back(idResultType1);
1584     blob->push_back(idResult2);
1585     blob->push_back(matrix);
1586     blob->push_back(scalar);
1587     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpMatrixTimesScalar);
1588 }
WriteVectorTimesMatrix(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector,IdRef matrix)1589 void WriteVectorTimesMatrix(Blob *blob,
1590                             IdResultType idResultType1,
1591                             IdResult idResult2,
1592                             IdRef vector,
1593                             IdRef matrix)
1594 {
1595     const size_t startSize = blob->size();
1596     blob->push_back(0);
1597     blob->push_back(idResultType1);
1598     blob->push_back(idResult2);
1599     blob->push_back(vector);
1600     blob->push_back(matrix);
1601     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpVectorTimesMatrix);
1602 }
WriteMatrixTimesVector(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef matrix,IdRef vector)1603 void WriteMatrixTimesVector(Blob *blob,
1604                             IdResultType idResultType1,
1605                             IdResult idResult2,
1606                             IdRef matrix,
1607                             IdRef vector)
1608 {
1609     const size_t startSize = blob->size();
1610     blob->push_back(0);
1611     blob->push_back(idResultType1);
1612     blob->push_back(idResult2);
1613     blob->push_back(matrix);
1614     blob->push_back(vector);
1615     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpMatrixTimesVector);
1616 }
WriteMatrixTimesMatrix(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef leftMatrix,IdRef rightMatrix)1617 void WriteMatrixTimesMatrix(Blob *blob,
1618                             IdResultType idResultType1,
1619                             IdResult idResult2,
1620                             IdRef leftMatrix,
1621                             IdRef rightMatrix)
1622 {
1623     const size_t startSize = blob->size();
1624     blob->push_back(0);
1625     blob->push_back(idResultType1);
1626     blob->push_back(idResult2);
1627     blob->push_back(leftMatrix);
1628     blob->push_back(rightMatrix);
1629     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpMatrixTimesMatrix);
1630 }
WriteOuterProduct(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector1,IdRef vector2)1631 void WriteOuterProduct(Blob *blob,
1632                        IdResultType idResultType1,
1633                        IdResult idResult2,
1634                        IdRef vector1,
1635                        IdRef vector2)
1636 {
1637     const size_t startSize = blob->size();
1638     blob->push_back(0);
1639     blob->push_back(idResultType1);
1640     blob->push_back(idResult2);
1641     blob->push_back(vector1);
1642     blob->push_back(vector2);
1643     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpOuterProduct);
1644 }
WriteDot(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector1,IdRef vector2)1645 void WriteDot(Blob *blob,
1646               IdResultType idResultType1,
1647               IdResult idResult2,
1648               IdRef vector1,
1649               IdRef vector2)
1650 {
1651     const size_t startSize = blob->size();
1652     blob->push_back(0);
1653     blob->push_back(idResultType1);
1654     blob->push_back(idResult2);
1655     blob->push_back(vector1);
1656     blob->push_back(vector2);
1657     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpDot);
1658 }
WriteIAddCarry(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1659 void WriteIAddCarry(Blob *blob,
1660                     IdResultType idResultType1,
1661                     IdResult idResult2,
1662                     IdRef operand1,
1663                     IdRef operand2)
1664 {
1665     const size_t startSize = blob->size();
1666     blob->push_back(0);
1667     blob->push_back(idResultType1);
1668     blob->push_back(idResult2);
1669     blob->push_back(operand1);
1670     blob->push_back(operand2);
1671     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpIAddCarry);
1672 }
WriteISubBorrow(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1673 void WriteISubBorrow(Blob *blob,
1674                      IdResultType idResultType1,
1675                      IdResult idResult2,
1676                      IdRef operand1,
1677                      IdRef operand2)
1678 {
1679     const size_t startSize = blob->size();
1680     blob->push_back(0);
1681     blob->push_back(idResultType1);
1682     blob->push_back(idResult2);
1683     blob->push_back(operand1);
1684     blob->push_back(operand2);
1685     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpISubBorrow);
1686 }
WriteUMulExtended(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1687 void WriteUMulExtended(Blob *blob,
1688                        IdResultType idResultType1,
1689                        IdResult idResult2,
1690                        IdRef operand1,
1691                        IdRef operand2)
1692 {
1693     const size_t startSize = blob->size();
1694     blob->push_back(0);
1695     blob->push_back(idResultType1);
1696     blob->push_back(idResult2);
1697     blob->push_back(operand1);
1698     blob->push_back(operand2);
1699     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpUMulExtended);
1700 }
WriteSMulExtended(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1701 void WriteSMulExtended(Blob *blob,
1702                        IdResultType idResultType1,
1703                        IdResult idResult2,
1704                        IdRef operand1,
1705                        IdRef operand2)
1706 {
1707     const size_t startSize = blob->size();
1708     blob->push_back(0);
1709     blob->push_back(idResultType1);
1710     blob->push_back(idResult2);
1711     blob->push_back(operand1);
1712     blob->push_back(operand2);
1713     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSMulExtended);
1714 }
WriteAny(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector)1715 void WriteAny(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef vector)
1716 {
1717     const size_t startSize = blob->size();
1718     blob->push_back(0);
1719     blob->push_back(idResultType1);
1720     blob->push_back(idResult2);
1721     blob->push_back(vector);
1722     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAny);
1723 }
WriteAll(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector)1724 void WriteAll(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef vector)
1725 {
1726     const size_t startSize = blob->size();
1727     blob->push_back(0);
1728     blob->push_back(idResultType1);
1729     blob->push_back(idResult2);
1730     blob->push_back(vector);
1731     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAll);
1732 }
WriteIsNan(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef x)1733 void WriteIsNan(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef x)
1734 {
1735     const size_t startSize = blob->size();
1736     blob->push_back(0);
1737     blob->push_back(idResultType1);
1738     blob->push_back(idResult2);
1739     blob->push_back(x);
1740     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpIsNan);
1741 }
WriteIsInf(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef x)1742 void WriteIsInf(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef x)
1743 {
1744     const size_t startSize = blob->size();
1745     blob->push_back(0);
1746     blob->push_back(idResultType1);
1747     blob->push_back(idResult2);
1748     blob->push_back(x);
1749     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpIsInf);
1750 }
WriteLogicalEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1751 void WriteLogicalEqual(Blob *blob,
1752                        IdResultType idResultType1,
1753                        IdResult idResult2,
1754                        IdRef operand1,
1755                        IdRef operand2)
1756 {
1757     const size_t startSize = blob->size();
1758     blob->push_back(0);
1759     blob->push_back(idResultType1);
1760     blob->push_back(idResult2);
1761     blob->push_back(operand1);
1762     blob->push_back(operand2);
1763     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpLogicalEqual);
1764 }
WriteLogicalNotEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1765 void WriteLogicalNotEqual(Blob *blob,
1766                           IdResultType idResultType1,
1767                           IdResult idResult2,
1768                           IdRef operand1,
1769                           IdRef operand2)
1770 {
1771     const size_t startSize = blob->size();
1772     blob->push_back(0);
1773     blob->push_back(idResultType1);
1774     blob->push_back(idResult2);
1775     blob->push_back(operand1);
1776     blob->push_back(operand2);
1777     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpLogicalNotEqual);
1778 }
WriteLogicalOr(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1779 void WriteLogicalOr(Blob *blob,
1780                     IdResultType idResultType1,
1781                     IdResult idResult2,
1782                     IdRef operand1,
1783                     IdRef operand2)
1784 {
1785     const size_t startSize = blob->size();
1786     blob->push_back(0);
1787     blob->push_back(idResultType1);
1788     blob->push_back(idResult2);
1789     blob->push_back(operand1);
1790     blob->push_back(operand2);
1791     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpLogicalOr);
1792 }
WriteLogicalAnd(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1793 void WriteLogicalAnd(Blob *blob,
1794                      IdResultType idResultType1,
1795                      IdResult idResult2,
1796                      IdRef operand1,
1797                      IdRef operand2)
1798 {
1799     const size_t startSize = blob->size();
1800     blob->push_back(0);
1801     blob->push_back(idResultType1);
1802     blob->push_back(idResult2);
1803     blob->push_back(operand1);
1804     blob->push_back(operand2);
1805     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpLogicalAnd);
1806 }
WriteLogicalNot(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand)1807 void WriteLogicalNot(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef operand)
1808 {
1809     const size_t startSize = blob->size();
1810     blob->push_back(0);
1811     blob->push_back(idResultType1);
1812     blob->push_back(idResult2);
1813     blob->push_back(operand);
1814     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpLogicalNot);
1815 }
WriteSelect(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef condition,IdRef object1,IdRef object2)1816 void WriteSelect(Blob *blob,
1817                  IdResultType idResultType1,
1818                  IdResult idResult2,
1819                  IdRef condition,
1820                  IdRef object1,
1821                  IdRef object2)
1822 {
1823     const size_t startSize = blob->size();
1824     blob->push_back(0);
1825     blob->push_back(idResultType1);
1826     blob->push_back(idResult2);
1827     blob->push_back(condition);
1828     blob->push_back(object1);
1829     blob->push_back(object2);
1830     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSelect);
1831 }
WriteIEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1832 void WriteIEqual(Blob *blob,
1833                  IdResultType idResultType1,
1834                  IdResult idResult2,
1835                  IdRef operand1,
1836                  IdRef operand2)
1837 {
1838     const size_t startSize = blob->size();
1839     blob->push_back(0);
1840     blob->push_back(idResultType1);
1841     blob->push_back(idResult2);
1842     blob->push_back(operand1);
1843     blob->push_back(operand2);
1844     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpIEqual);
1845 }
WriteINotEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1846 void WriteINotEqual(Blob *blob,
1847                     IdResultType idResultType1,
1848                     IdResult idResult2,
1849                     IdRef operand1,
1850                     IdRef operand2)
1851 {
1852     const size_t startSize = blob->size();
1853     blob->push_back(0);
1854     blob->push_back(idResultType1);
1855     blob->push_back(idResult2);
1856     blob->push_back(operand1);
1857     blob->push_back(operand2);
1858     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpINotEqual);
1859 }
WriteUGreaterThan(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1860 void WriteUGreaterThan(Blob *blob,
1861                        IdResultType idResultType1,
1862                        IdResult idResult2,
1863                        IdRef operand1,
1864                        IdRef operand2)
1865 {
1866     const size_t startSize = blob->size();
1867     blob->push_back(0);
1868     blob->push_back(idResultType1);
1869     blob->push_back(idResult2);
1870     blob->push_back(operand1);
1871     blob->push_back(operand2);
1872     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpUGreaterThan);
1873 }
WriteSGreaterThan(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1874 void WriteSGreaterThan(Blob *blob,
1875                        IdResultType idResultType1,
1876                        IdResult idResult2,
1877                        IdRef operand1,
1878                        IdRef operand2)
1879 {
1880     const size_t startSize = blob->size();
1881     blob->push_back(0);
1882     blob->push_back(idResultType1);
1883     blob->push_back(idResult2);
1884     blob->push_back(operand1);
1885     blob->push_back(operand2);
1886     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSGreaterThan);
1887 }
WriteUGreaterThanEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1888 void WriteUGreaterThanEqual(Blob *blob,
1889                             IdResultType idResultType1,
1890                             IdResult idResult2,
1891                             IdRef operand1,
1892                             IdRef operand2)
1893 {
1894     const size_t startSize = blob->size();
1895     blob->push_back(0);
1896     blob->push_back(idResultType1);
1897     blob->push_back(idResult2);
1898     blob->push_back(operand1);
1899     blob->push_back(operand2);
1900     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpUGreaterThanEqual);
1901 }
WriteSGreaterThanEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1902 void WriteSGreaterThanEqual(Blob *blob,
1903                             IdResultType idResultType1,
1904                             IdResult idResult2,
1905                             IdRef operand1,
1906                             IdRef operand2)
1907 {
1908     const size_t startSize = blob->size();
1909     blob->push_back(0);
1910     blob->push_back(idResultType1);
1911     blob->push_back(idResult2);
1912     blob->push_back(operand1);
1913     blob->push_back(operand2);
1914     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSGreaterThanEqual);
1915 }
WriteULessThan(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1916 void WriteULessThan(Blob *blob,
1917                     IdResultType idResultType1,
1918                     IdResult idResult2,
1919                     IdRef operand1,
1920                     IdRef operand2)
1921 {
1922     const size_t startSize = blob->size();
1923     blob->push_back(0);
1924     blob->push_back(idResultType1);
1925     blob->push_back(idResult2);
1926     blob->push_back(operand1);
1927     blob->push_back(operand2);
1928     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpULessThan);
1929 }
WriteSLessThan(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1930 void WriteSLessThan(Blob *blob,
1931                     IdResultType idResultType1,
1932                     IdResult idResult2,
1933                     IdRef operand1,
1934                     IdRef operand2)
1935 {
1936     const size_t startSize = blob->size();
1937     blob->push_back(0);
1938     blob->push_back(idResultType1);
1939     blob->push_back(idResult2);
1940     blob->push_back(operand1);
1941     blob->push_back(operand2);
1942     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSLessThan);
1943 }
WriteULessThanEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1944 void WriteULessThanEqual(Blob *blob,
1945                          IdResultType idResultType1,
1946                          IdResult idResult2,
1947                          IdRef operand1,
1948                          IdRef operand2)
1949 {
1950     const size_t startSize = blob->size();
1951     blob->push_back(0);
1952     blob->push_back(idResultType1);
1953     blob->push_back(idResult2);
1954     blob->push_back(operand1);
1955     blob->push_back(operand2);
1956     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpULessThanEqual);
1957 }
WriteSLessThanEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1958 void WriteSLessThanEqual(Blob *blob,
1959                          IdResultType idResultType1,
1960                          IdResult idResult2,
1961                          IdRef operand1,
1962                          IdRef operand2)
1963 {
1964     const size_t startSize = blob->size();
1965     blob->push_back(0);
1966     blob->push_back(idResultType1);
1967     blob->push_back(idResult2);
1968     blob->push_back(operand1);
1969     blob->push_back(operand2);
1970     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSLessThanEqual);
1971 }
WriteFOrdEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1972 void WriteFOrdEqual(Blob *blob,
1973                     IdResultType idResultType1,
1974                     IdResult idResult2,
1975                     IdRef operand1,
1976                     IdRef operand2)
1977 {
1978     const size_t startSize = blob->size();
1979     blob->push_back(0);
1980     blob->push_back(idResultType1);
1981     blob->push_back(idResult2);
1982     blob->push_back(operand1);
1983     blob->push_back(operand2);
1984     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFOrdEqual);
1985 }
WriteFUnordEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1986 void WriteFUnordEqual(Blob *blob,
1987                       IdResultType idResultType1,
1988                       IdResult idResult2,
1989                       IdRef operand1,
1990                       IdRef operand2)
1991 {
1992     const size_t startSize = blob->size();
1993     blob->push_back(0);
1994     blob->push_back(idResultType1);
1995     blob->push_back(idResult2);
1996     blob->push_back(operand1);
1997     blob->push_back(operand2);
1998     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFUnordEqual);
1999 }
WriteFOrdNotEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2000 void WriteFOrdNotEqual(Blob *blob,
2001                        IdResultType idResultType1,
2002                        IdResult idResult2,
2003                        IdRef operand1,
2004                        IdRef operand2)
2005 {
2006     const size_t startSize = blob->size();
2007     blob->push_back(0);
2008     blob->push_back(idResultType1);
2009     blob->push_back(idResult2);
2010     blob->push_back(operand1);
2011     blob->push_back(operand2);
2012     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFOrdNotEqual);
2013 }
WriteFUnordNotEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2014 void WriteFUnordNotEqual(Blob *blob,
2015                          IdResultType idResultType1,
2016                          IdResult idResult2,
2017                          IdRef operand1,
2018                          IdRef operand2)
2019 {
2020     const size_t startSize = blob->size();
2021     blob->push_back(0);
2022     blob->push_back(idResultType1);
2023     blob->push_back(idResult2);
2024     blob->push_back(operand1);
2025     blob->push_back(operand2);
2026     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFUnordNotEqual);
2027 }
WriteFOrdLessThan(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2028 void WriteFOrdLessThan(Blob *blob,
2029                        IdResultType idResultType1,
2030                        IdResult idResult2,
2031                        IdRef operand1,
2032                        IdRef operand2)
2033 {
2034     const size_t startSize = blob->size();
2035     blob->push_back(0);
2036     blob->push_back(idResultType1);
2037     blob->push_back(idResult2);
2038     blob->push_back(operand1);
2039     blob->push_back(operand2);
2040     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFOrdLessThan);
2041 }
WriteFUnordLessThan(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2042 void WriteFUnordLessThan(Blob *blob,
2043                          IdResultType idResultType1,
2044                          IdResult idResult2,
2045                          IdRef operand1,
2046                          IdRef operand2)
2047 {
2048     const size_t startSize = blob->size();
2049     blob->push_back(0);
2050     blob->push_back(idResultType1);
2051     blob->push_back(idResult2);
2052     blob->push_back(operand1);
2053     blob->push_back(operand2);
2054     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFUnordLessThan);
2055 }
WriteFOrdGreaterThan(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2056 void WriteFOrdGreaterThan(Blob *blob,
2057                           IdResultType idResultType1,
2058                           IdResult idResult2,
2059                           IdRef operand1,
2060                           IdRef operand2)
2061 {
2062     const size_t startSize = blob->size();
2063     blob->push_back(0);
2064     blob->push_back(idResultType1);
2065     blob->push_back(idResult2);
2066     blob->push_back(operand1);
2067     blob->push_back(operand2);
2068     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFOrdGreaterThan);
2069 }
WriteFUnordGreaterThan(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2070 void WriteFUnordGreaterThan(Blob *blob,
2071                             IdResultType idResultType1,
2072                             IdResult idResult2,
2073                             IdRef operand1,
2074                             IdRef operand2)
2075 {
2076     const size_t startSize = blob->size();
2077     blob->push_back(0);
2078     blob->push_back(idResultType1);
2079     blob->push_back(idResult2);
2080     blob->push_back(operand1);
2081     blob->push_back(operand2);
2082     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFUnordGreaterThan);
2083 }
WriteFOrdLessThanEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2084 void WriteFOrdLessThanEqual(Blob *blob,
2085                             IdResultType idResultType1,
2086                             IdResult idResult2,
2087                             IdRef operand1,
2088                             IdRef operand2)
2089 {
2090     const size_t startSize = blob->size();
2091     blob->push_back(0);
2092     blob->push_back(idResultType1);
2093     blob->push_back(idResult2);
2094     blob->push_back(operand1);
2095     blob->push_back(operand2);
2096     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFOrdLessThanEqual);
2097 }
WriteFUnordLessThanEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2098 void WriteFUnordLessThanEqual(Blob *blob,
2099                               IdResultType idResultType1,
2100                               IdResult idResult2,
2101                               IdRef operand1,
2102                               IdRef operand2)
2103 {
2104     const size_t startSize = blob->size();
2105     blob->push_back(0);
2106     blob->push_back(idResultType1);
2107     blob->push_back(idResult2);
2108     blob->push_back(operand1);
2109     blob->push_back(operand2);
2110     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFUnordLessThanEqual);
2111 }
WriteFOrdGreaterThanEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2112 void WriteFOrdGreaterThanEqual(Blob *blob,
2113                                IdResultType idResultType1,
2114                                IdResult idResult2,
2115                                IdRef operand1,
2116                                IdRef operand2)
2117 {
2118     const size_t startSize = blob->size();
2119     blob->push_back(0);
2120     blob->push_back(idResultType1);
2121     blob->push_back(idResult2);
2122     blob->push_back(operand1);
2123     blob->push_back(operand2);
2124     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFOrdGreaterThanEqual);
2125 }
WriteFUnordGreaterThanEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2126 void WriteFUnordGreaterThanEqual(Blob *blob,
2127                                  IdResultType idResultType1,
2128                                  IdResult idResult2,
2129                                  IdRef operand1,
2130                                  IdRef operand2)
2131 {
2132     const size_t startSize = blob->size();
2133     blob->push_back(0);
2134     blob->push_back(idResultType1);
2135     blob->push_back(idResult2);
2136     blob->push_back(operand1);
2137     blob->push_back(operand2);
2138     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFUnordGreaterThanEqual);
2139 }
WriteShiftRightLogical(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef base,IdRef shift)2140 void WriteShiftRightLogical(Blob *blob,
2141                             IdResultType idResultType1,
2142                             IdResult idResult2,
2143                             IdRef base,
2144                             IdRef shift)
2145 {
2146     const size_t startSize = blob->size();
2147     blob->push_back(0);
2148     blob->push_back(idResultType1);
2149     blob->push_back(idResult2);
2150     blob->push_back(base);
2151     blob->push_back(shift);
2152     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpShiftRightLogical);
2153 }
WriteShiftRightArithmetic(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef base,IdRef shift)2154 void WriteShiftRightArithmetic(Blob *blob,
2155                                IdResultType idResultType1,
2156                                IdResult idResult2,
2157                                IdRef base,
2158                                IdRef shift)
2159 {
2160     const size_t startSize = blob->size();
2161     blob->push_back(0);
2162     blob->push_back(idResultType1);
2163     blob->push_back(idResult2);
2164     blob->push_back(base);
2165     blob->push_back(shift);
2166     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpShiftRightArithmetic);
2167 }
WriteShiftLeftLogical(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef base,IdRef shift)2168 void WriteShiftLeftLogical(Blob *blob,
2169                            IdResultType idResultType1,
2170                            IdResult idResult2,
2171                            IdRef base,
2172                            IdRef shift)
2173 {
2174     const size_t startSize = blob->size();
2175     blob->push_back(0);
2176     blob->push_back(idResultType1);
2177     blob->push_back(idResult2);
2178     blob->push_back(base);
2179     blob->push_back(shift);
2180     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpShiftLeftLogical);
2181 }
WriteBitwiseOr(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2182 void WriteBitwiseOr(Blob *blob,
2183                     IdResultType idResultType1,
2184                     IdResult idResult2,
2185                     IdRef operand1,
2186                     IdRef operand2)
2187 {
2188     const size_t startSize = blob->size();
2189     blob->push_back(0);
2190     blob->push_back(idResultType1);
2191     blob->push_back(idResult2);
2192     blob->push_back(operand1);
2193     blob->push_back(operand2);
2194     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBitwiseOr);
2195 }
WriteBitwiseXor(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2196 void WriteBitwiseXor(Blob *blob,
2197                      IdResultType idResultType1,
2198                      IdResult idResult2,
2199                      IdRef operand1,
2200                      IdRef operand2)
2201 {
2202     const size_t startSize = blob->size();
2203     blob->push_back(0);
2204     blob->push_back(idResultType1);
2205     blob->push_back(idResult2);
2206     blob->push_back(operand1);
2207     blob->push_back(operand2);
2208     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBitwiseXor);
2209 }
WriteBitwiseAnd(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2210 void WriteBitwiseAnd(Blob *blob,
2211                      IdResultType idResultType1,
2212                      IdResult idResult2,
2213                      IdRef operand1,
2214                      IdRef operand2)
2215 {
2216     const size_t startSize = blob->size();
2217     blob->push_back(0);
2218     blob->push_back(idResultType1);
2219     blob->push_back(idResult2);
2220     blob->push_back(operand1);
2221     blob->push_back(operand2);
2222     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBitwiseAnd);
2223 }
WriteNot(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand)2224 void WriteNot(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef operand)
2225 {
2226     const size_t startSize = blob->size();
2227     blob->push_back(0);
2228     blob->push_back(idResultType1);
2229     blob->push_back(idResult2);
2230     blob->push_back(operand);
2231     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpNot);
2232 }
WriteBitFieldInsert(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef base,IdRef insert,IdRef offset,IdRef count)2233 void WriteBitFieldInsert(Blob *blob,
2234                          IdResultType idResultType1,
2235                          IdResult idResult2,
2236                          IdRef base,
2237                          IdRef insert,
2238                          IdRef offset,
2239                          IdRef count)
2240 {
2241     const size_t startSize = blob->size();
2242     blob->push_back(0);
2243     blob->push_back(idResultType1);
2244     blob->push_back(idResult2);
2245     blob->push_back(base);
2246     blob->push_back(insert);
2247     blob->push_back(offset);
2248     blob->push_back(count);
2249     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBitFieldInsert);
2250 }
WriteBitFieldSExtract(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef base,IdRef offset,IdRef count)2251 void WriteBitFieldSExtract(Blob *blob,
2252                            IdResultType idResultType1,
2253                            IdResult idResult2,
2254                            IdRef base,
2255                            IdRef offset,
2256                            IdRef count)
2257 {
2258     const size_t startSize = blob->size();
2259     blob->push_back(0);
2260     blob->push_back(idResultType1);
2261     blob->push_back(idResult2);
2262     blob->push_back(base);
2263     blob->push_back(offset);
2264     blob->push_back(count);
2265     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBitFieldSExtract);
2266 }
WriteBitFieldUExtract(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef base,IdRef offset,IdRef count)2267 void WriteBitFieldUExtract(Blob *blob,
2268                            IdResultType idResultType1,
2269                            IdResult idResult2,
2270                            IdRef base,
2271                            IdRef offset,
2272                            IdRef count)
2273 {
2274     const size_t startSize = blob->size();
2275     blob->push_back(0);
2276     blob->push_back(idResultType1);
2277     blob->push_back(idResult2);
2278     blob->push_back(base);
2279     blob->push_back(offset);
2280     blob->push_back(count);
2281     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBitFieldUExtract);
2282 }
WriteBitReverse(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef base)2283 void WriteBitReverse(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef base)
2284 {
2285     const size_t startSize = blob->size();
2286     blob->push_back(0);
2287     blob->push_back(idResultType1);
2288     blob->push_back(idResult2);
2289     blob->push_back(base);
2290     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBitReverse);
2291 }
WriteBitCount(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef base)2292 void WriteBitCount(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef base)
2293 {
2294     const size_t startSize = blob->size();
2295     blob->push_back(0);
2296     blob->push_back(idResultType1);
2297     blob->push_back(idResult2);
2298     blob->push_back(base);
2299     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBitCount);
2300 }
WriteDPdx(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef p)2301 void WriteDPdx(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef p)
2302 {
2303     const size_t startSize = blob->size();
2304     blob->push_back(0);
2305     blob->push_back(idResultType1);
2306     blob->push_back(idResult2);
2307     blob->push_back(p);
2308     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpDPdx);
2309 }
WriteDPdy(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef p)2310 void WriteDPdy(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef p)
2311 {
2312     const size_t startSize = blob->size();
2313     blob->push_back(0);
2314     blob->push_back(idResultType1);
2315     blob->push_back(idResult2);
2316     blob->push_back(p);
2317     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpDPdy);
2318 }
WriteFwidth(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef p)2319 void WriteFwidth(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef p)
2320 {
2321     const size_t startSize = blob->size();
2322     blob->push_back(0);
2323     blob->push_back(idResultType1);
2324     blob->push_back(idResult2);
2325     blob->push_back(p);
2326     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFwidth);
2327 }
WriteDPdxFine(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef p)2328 void WriteDPdxFine(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef p)
2329 {
2330     const size_t startSize = blob->size();
2331     blob->push_back(0);
2332     blob->push_back(idResultType1);
2333     blob->push_back(idResult2);
2334     blob->push_back(p);
2335     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpDPdxFine);
2336 }
WriteDPdyFine(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef p)2337 void WriteDPdyFine(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef p)
2338 {
2339     const size_t startSize = blob->size();
2340     blob->push_back(0);
2341     blob->push_back(idResultType1);
2342     blob->push_back(idResult2);
2343     blob->push_back(p);
2344     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpDPdyFine);
2345 }
WriteFwidthFine(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef p)2346 void WriteFwidthFine(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef p)
2347 {
2348     const size_t startSize = blob->size();
2349     blob->push_back(0);
2350     blob->push_back(idResultType1);
2351     blob->push_back(idResult2);
2352     blob->push_back(p);
2353     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFwidthFine);
2354 }
WriteDPdxCoarse(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef p)2355 void WriteDPdxCoarse(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef p)
2356 {
2357     const size_t startSize = blob->size();
2358     blob->push_back(0);
2359     blob->push_back(idResultType1);
2360     blob->push_back(idResult2);
2361     blob->push_back(p);
2362     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpDPdxCoarse);
2363 }
WriteDPdyCoarse(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef p)2364 void WriteDPdyCoarse(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef p)
2365 {
2366     const size_t startSize = blob->size();
2367     blob->push_back(0);
2368     blob->push_back(idResultType1);
2369     blob->push_back(idResult2);
2370     blob->push_back(p);
2371     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpDPdyCoarse);
2372 }
WriteFwidthCoarse(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef p)2373 void WriteFwidthCoarse(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef p)
2374 {
2375     const size_t startSize = blob->size();
2376     blob->push_back(0);
2377     blob->push_back(idResultType1);
2378     blob->push_back(idResult2);
2379     blob->push_back(p);
2380     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFwidthCoarse);
2381 }
WriteEmitVertex(Blob * blob)2382 void WriteEmitVertex(Blob *blob)
2383 {
2384     const size_t startSize = blob->size();
2385     blob->push_back(0);
2386 
2387     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpEmitVertex);
2388 }
WriteEndPrimitive(Blob * blob)2389 void WriteEndPrimitive(Blob *blob)
2390 {
2391     const size_t startSize = blob->size();
2392     blob->push_back(0);
2393 
2394     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpEndPrimitive);
2395 }
WriteEmitStreamVertex(Blob * blob,IdRef stream)2396 void WriteEmitStreamVertex(Blob *blob, IdRef stream)
2397 {
2398     const size_t startSize = blob->size();
2399     blob->push_back(0);
2400     blob->push_back(stream);
2401     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpEmitStreamVertex);
2402 }
WriteEndStreamPrimitive(Blob * blob,IdRef stream)2403 void WriteEndStreamPrimitive(Blob *blob, IdRef stream)
2404 {
2405     const size_t startSize = blob->size();
2406     blob->push_back(0);
2407     blob->push_back(stream);
2408     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpEndStreamPrimitive);
2409 }
WriteControlBarrier(Blob * blob,IdScope execution,IdScope memory,IdMemorySemantics semantics)2410 void WriteControlBarrier(Blob *blob, IdScope execution, IdScope memory, IdMemorySemantics semantics)
2411 {
2412     const size_t startSize = blob->size();
2413     blob->push_back(0);
2414     blob->push_back(execution);
2415     blob->push_back(memory);
2416     blob->push_back(semantics);
2417     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpControlBarrier);
2418 }
WriteMemoryBarrier(Blob * blob,IdScope memory,IdMemorySemantics semantics)2419 void WriteMemoryBarrier(Blob *blob, IdScope memory, IdMemorySemantics semantics)
2420 {
2421     const size_t startSize = blob->size();
2422     blob->push_back(0);
2423     blob->push_back(memory);
2424     blob->push_back(semantics);
2425     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpMemoryBarrier);
2426 }
WriteAtomicLoad(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics)2427 void WriteAtomicLoad(Blob *blob,
2428                      IdResultType idResultType1,
2429                      IdResult idResult2,
2430                      IdRef pointer,
2431                      IdScope memory,
2432                      IdMemorySemantics semantics)
2433 {
2434     const size_t startSize = blob->size();
2435     blob->push_back(0);
2436     blob->push_back(idResultType1);
2437     blob->push_back(idResult2);
2438     blob->push_back(pointer);
2439     blob->push_back(memory);
2440     blob->push_back(semantics);
2441     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicLoad);
2442 }
WriteAtomicStore(Blob * blob,IdRef pointer,IdScope memory,IdMemorySemantics semantics,IdRef value)2443 void WriteAtomicStore(Blob *blob,
2444                       IdRef pointer,
2445                       IdScope memory,
2446                       IdMemorySemantics semantics,
2447                       IdRef value)
2448 {
2449     const size_t startSize = blob->size();
2450     blob->push_back(0);
2451     blob->push_back(pointer);
2452     blob->push_back(memory);
2453     blob->push_back(semantics);
2454     blob->push_back(value);
2455     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicStore);
2456 }
WriteAtomicExchange(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics,IdRef value)2457 void WriteAtomicExchange(Blob *blob,
2458                          IdResultType idResultType1,
2459                          IdResult idResult2,
2460                          IdRef pointer,
2461                          IdScope memory,
2462                          IdMemorySemantics semantics,
2463                          IdRef value)
2464 {
2465     const size_t startSize = blob->size();
2466     blob->push_back(0);
2467     blob->push_back(idResultType1);
2468     blob->push_back(idResult2);
2469     blob->push_back(pointer);
2470     blob->push_back(memory);
2471     blob->push_back(semantics);
2472     blob->push_back(value);
2473     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicExchange);
2474 }
WriteAtomicCompareExchange(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics equal,IdMemorySemantics unequal,IdRef value,IdRef comparator)2475 void WriteAtomicCompareExchange(Blob *blob,
2476                                 IdResultType idResultType1,
2477                                 IdResult idResult2,
2478                                 IdRef pointer,
2479                                 IdScope memory,
2480                                 IdMemorySemantics equal,
2481                                 IdMemorySemantics unequal,
2482                                 IdRef value,
2483                                 IdRef comparator)
2484 {
2485     const size_t startSize = blob->size();
2486     blob->push_back(0);
2487     blob->push_back(idResultType1);
2488     blob->push_back(idResult2);
2489     blob->push_back(pointer);
2490     blob->push_back(memory);
2491     blob->push_back(equal);
2492     blob->push_back(unequal);
2493     blob->push_back(value);
2494     blob->push_back(comparator);
2495     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicCompareExchange);
2496 }
WriteAtomicIIncrement(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics)2497 void WriteAtomicIIncrement(Blob *blob,
2498                            IdResultType idResultType1,
2499                            IdResult idResult2,
2500                            IdRef pointer,
2501                            IdScope memory,
2502                            IdMemorySemantics semantics)
2503 {
2504     const size_t startSize = blob->size();
2505     blob->push_back(0);
2506     blob->push_back(idResultType1);
2507     blob->push_back(idResult2);
2508     blob->push_back(pointer);
2509     blob->push_back(memory);
2510     blob->push_back(semantics);
2511     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicIIncrement);
2512 }
WriteAtomicIDecrement(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics)2513 void WriteAtomicIDecrement(Blob *blob,
2514                            IdResultType idResultType1,
2515                            IdResult idResult2,
2516                            IdRef pointer,
2517                            IdScope memory,
2518                            IdMemorySemantics semantics)
2519 {
2520     const size_t startSize = blob->size();
2521     blob->push_back(0);
2522     blob->push_back(idResultType1);
2523     blob->push_back(idResult2);
2524     blob->push_back(pointer);
2525     blob->push_back(memory);
2526     blob->push_back(semantics);
2527     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicIDecrement);
2528 }
WriteAtomicIAdd(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics,IdRef value)2529 void WriteAtomicIAdd(Blob *blob,
2530                      IdResultType idResultType1,
2531                      IdResult idResult2,
2532                      IdRef pointer,
2533                      IdScope memory,
2534                      IdMemorySemantics semantics,
2535                      IdRef value)
2536 {
2537     const size_t startSize = blob->size();
2538     blob->push_back(0);
2539     blob->push_back(idResultType1);
2540     blob->push_back(idResult2);
2541     blob->push_back(pointer);
2542     blob->push_back(memory);
2543     blob->push_back(semantics);
2544     blob->push_back(value);
2545     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicIAdd);
2546 }
WriteAtomicISub(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics,IdRef value)2547 void WriteAtomicISub(Blob *blob,
2548                      IdResultType idResultType1,
2549                      IdResult idResult2,
2550                      IdRef pointer,
2551                      IdScope memory,
2552                      IdMemorySemantics semantics,
2553                      IdRef value)
2554 {
2555     const size_t startSize = blob->size();
2556     blob->push_back(0);
2557     blob->push_back(idResultType1);
2558     blob->push_back(idResult2);
2559     blob->push_back(pointer);
2560     blob->push_back(memory);
2561     blob->push_back(semantics);
2562     blob->push_back(value);
2563     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicISub);
2564 }
WriteAtomicSMin(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics,IdRef value)2565 void WriteAtomicSMin(Blob *blob,
2566                      IdResultType idResultType1,
2567                      IdResult idResult2,
2568                      IdRef pointer,
2569                      IdScope memory,
2570                      IdMemorySemantics semantics,
2571                      IdRef value)
2572 {
2573     const size_t startSize = blob->size();
2574     blob->push_back(0);
2575     blob->push_back(idResultType1);
2576     blob->push_back(idResult2);
2577     blob->push_back(pointer);
2578     blob->push_back(memory);
2579     blob->push_back(semantics);
2580     blob->push_back(value);
2581     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicSMin);
2582 }
WriteAtomicUMin(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics,IdRef value)2583 void WriteAtomicUMin(Blob *blob,
2584                      IdResultType idResultType1,
2585                      IdResult idResult2,
2586                      IdRef pointer,
2587                      IdScope memory,
2588                      IdMemorySemantics semantics,
2589                      IdRef value)
2590 {
2591     const size_t startSize = blob->size();
2592     blob->push_back(0);
2593     blob->push_back(idResultType1);
2594     blob->push_back(idResult2);
2595     blob->push_back(pointer);
2596     blob->push_back(memory);
2597     blob->push_back(semantics);
2598     blob->push_back(value);
2599     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicUMin);
2600 }
WriteAtomicSMax(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics,IdRef value)2601 void WriteAtomicSMax(Blob *blob,
2602                      IdResultType idResultType1,
2603                      IdResult idResult2,
2604                      IdRef pointer,
2605                      IdScope memory,
2606                      IdMemorySemantics semantics,
2607                      IdRef value)
2608 {
2609     const size_t startSize = blob->size();
2610     blob->push_back(0);
2611     blob->push_back(idResultType1);
2612     blob->push_back(idResult2);
2613     blob->push_back(pointer);
2614     blob->push_back(memory);
2615     blob->push_back(semantics);
2616     blob->push_back(value);
2617     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicSMax);
2618 }
WriteAtomicUMax(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics,IdRef value)2619 void WriteAtomicUMax(Blob *blob,
2620                      IdResultType idResultType1,
2621                      IdResult idResult2,
2622                      IdRef pointer,
2623                      IdScope memory,
2624                      IdMemorySemantics semantics,
2625                      IdRef value)
2626 {
2627     const size_t startSize = blob->size();
2628     blob->push_back(0);
2629     blob->push_back(idResultType1);
2630     blob->push_back(idResult2);
2631     blob->push_back(pointer);
2632     blob->push_back(memory);
2633     blob->push_back(semantics);
2634     blob->push_back(value);
2635     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicUMax);
2636 }
WriteAtomicAnd(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics,IdRef value)2637 void WriteAtomicAnd(Blob *blob,
2638                     IdResultType idResultType1,
2639                     IdResult idResult2,
2640                     IdRef pointer,
2641                     IdScope memory,
2642                     IdMemorySemantics semantics,
2643                     IdRef value)
2644 {
2645     const size_t startSize = blob->size();
2646     blob->push_back(0);
2647     blob->push_back(idResultType1);
2648     blob->push_back(idResult2);
2649     blob->push_back(pointer);
2650     blob->push_back(memory);
2651     blob->push_back(semantics);
2652     blob->push_back(value);
2653     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicAnd);
2654 }
WriteAtomicOr(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics,IdRef value)2655 void WriteAtomicOr(Blob *blob,
2656                    IdResultType idResultType1,
2657                    IdResult idResult2,
2658                    IdRef pointer,
2659                    IdScope memory,
2660                    IdMemorySemantics semantics,
2661                    IdRef value)
2662 {
2663     const size_t startSize = blob->size();
2664     blob->push_back(0);
2665     blob->push_back(idResultType1);
2666     blob->push_back(idResult2);
2667     blob->push_back(pointer);
2668     blob->push_back(memory);
2669     blob->push_back(semantics);
2670     blob->push_back(value);
2671     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicOr);
2672 }
WriteAtomicXor(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics,IdRef value)2673 void WriteAtomicXor(Blob *blob,
2674                     IdResultType idResultType1,
2675                     IdResult idResult2,
2676                     IdRef pointer,
2677                     IdScope memory,
2678                     IdMemorySemantics semantics,
2679                     IdRef value)
2680 {
2681     const size_t startSize = blob->size();
2682     blob->push_back(0);
2683     blob->push_back(idResultType1);
2684     blob->push_back(idResult2);
2685     blob->push_back(pointer);
2686     blob->push_back(memory);
2687     blob->push_back(semantics);
2688     blob->push_back(value);
2689     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicXor);
2690 }
WritePhi(Blob * blob,IdResultType idResultType1,IdResult idResult2,const PairIdRefIdRefList & variableParentPairList)2691 void WritePhi(Blob *blob,
2692               IdResultType idResultType1,
2693               IdResult idResult2,
2694               const PairIdRefIdRefList &variableParentPairList)
2695 {
2696     const size_t startSize = blob->size();
2697     blob->push_back(0);
2698     blob->push_back(idResultType1);
2699     blob->push_back(idResult2);
2700     for (const auto &operand : variableParentPairList)
2701     {
2702         blob->push_back(operand.id1);
2703         blob->push_back(operand.id2);
2704     }
2705     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpPhi);
2706 }
WriteLoopMerge(Blob * blob,IdRef mergeBlock,IdRef continueTarget,spv::LoopControlMask loopControl3)2707 void WriteLoopMerge(Blob *blob,
2708                     IdRef mergeBlock,
2709                     IdRef continueTarget,
2710                     spv::LoopControlMask loopControl3)
2711 {
2712     const size_t startSize = blob->size();
2713     blob->push_back(0);
2714     blob->push_back(mergeBlock);
2715     blob->push_back(continueTarget);
2716     blob->push_back(loopControl3);
2717     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpLoopMerge);
2718 }
WriteSelectionMerge(Blob * blob,IdRef mergeBlock,spv::SelectionControlMask selectionControl2)2719 void WriteSelectionMerge(Blob *blob, IdRef mergeBlock, spv::SelectionControlMask selectionControl2)
2720 {
2721     const size_t startSize = blob->size();
2722     blob->push_back(0);
2723     blob->push_back(mergeBlock);
2724     blob->push_back(selectionControl2);
2725     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSelectionMerge);
2726 }
WriteLabel(Blob * blob,IdResult idResult1)2727 void WriteLabel(Blob *blob, IdResult idResult1)
2728 {
2729     const size_t startSize = blob->size();
2730     blob->push_back(0);
2731     blob->push_back(idResult1);
2732     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpLabel);
2733 }
WriteBranch(Blob * blob,IdRef targetLabel)2734 void WriteBranch(Blob *blob, IdRef targetLabel)
2735 {
2736     const size_t startSize = blob->size();
2737     blob->push_back(0);
2738     blob->push_back(targetLabel);
2739     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBranch);
2740 }
WriteBranchConditional(Blob * blob,IdRef condition,IdRef trueLabel,IdRef falseLabel,const LiteralIntegerList & branchweightsList)2741 void WriteBranchConditional(Blob *blob,
2742                             IdRef condition,
2743                             IdRef trueLabel,
2744                             IdRef falseLabel,
2745                             const LiteralIntegerList &branchweightsList)
2746 {
2747     const size_t startSize = blob->size();
2748     blob->push_back(0);
2749     blob->push_back(condition);
2750     blob->push_back(trueLabel);
2751     blob->push_back(falseLabel);
2752     for (const auto &operand : branchweightsList)
2753     {
2754         blob->push_back(operand);
2755     }
2756     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBranchConditional);
2757 }
WriteSwitch(Blob * blob,IdRef selector,IdRef default_,const PairLiteralIntegerIdRefList & targetPairList)2758 void WriteSwitch(Blob *blob,
2759                  IdRef selector,
2760                  IdRef default_,
2761                  const PairLiteralIntegerIdRefList &targetPairList)
2762 {
2763     const size_t startSize = blob->size();
2764     blob->push_back(0);
2765     blob->push_back(selector);
2766     blob->push_back(default_);
2767     for (const auto &operand : targetPairList)
2768     {
2769         blob->push_back(operand.literal);
2770         blob->push_back(operand.id);
2771     }
2772     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSwitch);
2773 }
WriteKill(Blob * blob)2774 void WriteKill(Blob *blob)
2775 {
2776     const size_t startSize = blob->size();
2777     blob->push_back(0);
2778 
2779     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpKill);
2780 }
WriteReturn(Blob * blob)2781 void WriteReturn(Blob *blob)
2782 {
2783     const size_t startSize = blob->size();
2784     blob->push_back(0);
2785 
2786     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpReturn);
2787 }
WriteReturnValue(Blob * blob,IdRef value)2788 void WriteReturnValue(Blob *blob, IdRef value)
2789 {
2790     const size_t startSize = blob->size();
2791     blob->push_back(0);
2792     blob->push_back(value);
2793     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpReturnValue);
2794 }
WriteUnreachable(Blob * blob)2795 void WriteUnreachable(Blob *blob)
2796 {
2797     const size_t startSize = blob->size();
2798     blob->push_back(0);
2799 
2800     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpUnreachable);
2801 }
WriteImageSparseSampleImplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,const spv::ImageOperandsMask * imageOperands5,const IdRefList & imageOperandIdsList)2802 void WriteImageSparseSampleImplicitLod(Blob *blob,
2803                                        IdResultType idResultType1,
2804                                        IdResult idResult2,
2805                                        IdRef sampledImage,
2806                                        IdRef coordinate,
2807                                        const spv::ImageOperandsMask *imageOperands5,
2808                                        const IdRefList &imageOperandIdsList)
2809 {
2810     const size_t startSize = blob->size();
2811     blob->push_back(0);
2812     blob->push_back(idResultType1);
2813     blob->push_back(idResult2);
2814     blob->push_back(sampledImage);
2815     blob->push_back(coordinate);
2816     if (imageOperands5)
2817     {
2818         blob->push_back(*imageOperands5);
2819     }
2820     for (const auto &operand : imageOperandIdsList)
2821     {
2822         blob->push_back(operand);
2823     }
2824     (*blob)[startSize] =
2825         MakeLengthOp(blob->size() - startSize, spv::OpImageSparseSampleImplicitLod);
2826 }
WriteImageSparseSampleExplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,spv::ImageOperandsMask imageOperands5,const IdRefList & imageOperandIdsList)2827 void WriteImageSparseSampleExplicitLod(Blob *blob,
2828                                        IdResultType idResultType1,
2829                                        IdResult idResult2,
2830                                        IdRef sampledImage,
2831                                        IdRef coordinate,
2832                                        spv::ImageOperandsMask imageOperands5,
2833                                        const IdRefList &imageOperandIdsList)
2834 {
2835     const size_t startSize = blob->size();
2836     blob->push_back(0);
2837     blob->push_back(idResultType1);
2838     blob->push_back(idResult2);
2839     blob->push_back(sampledImage);
2840     blob->push_back(coordinate);
2841     blob->push_back(imageOperands5);
2842     for (const auto &operand : imageOperandIdsList)
2843     {
2844         blob->push_back(operand);
2845     }
2846     (*blob)[startSize] =
2847         MakeLengthOp(blob->size() - startSize, spv::OpImageSparseSampleExplicitLod);
2848 }
WriteImageSparseSampleDrefImplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef dref,const spv::ImageOperandsMask * imageOperands6,const IdRefList & imageOperandIdsList)2849 void WriteImageSparseSampleDrefImplicitLod(Blob *blob,
2850                                            IdResultType idResultType1,
2851                                            IdResult idResult2,
2852                                            IdRef sampledImage,
2853                                            IdRef coordinate,
2854                                            IdRef dref,
2855                                            const spv::ImageOperandsMask *imageOperands6,
2856                                            const IdRefList &imageOperandIdsList)
2857 {
2858     const size_t startSize = blob->size();
2859     blob->push_back(0);
2860     blob->push_back(idResultType1);
2861     blob->push_back(idResult2);
2862     blob->push_back(sampledImage);
2863     blob->push_back(coordinate);
2864     blob->push_back(dref);
2865     if (imageOperands6)
2866     {
2867         blob->push_back(*imageOperands6);
2868     }
2869     for (const auto &operand : imageOperandIdsList)
2870     {
2871         blob->push_back(operand);
2872     }
2873     (*blob)[startSize] =
2874         MakeLengthOp(blob->size() - startSize, spv::OpImageSparseSampleDrefImplicitLod);
2875 }
WriteImageSparseSampleDrefExplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef dref,spv::ImageOperandsMask imageOperands6,const IdRefList & imageOperandIdsList)2876 void WriteImageSparseSampleDrefExplicitLod(Blob *blob,
2877                                            IdResultType idResultType1,
2878                                            IdResult idResult2,
2879                                            IdRef sampledImage,
2880                                            IdRef coordinate,
2881                                            IdRef dref,
2882                                            spv::ImageOperandsMask imageOperands6,
2883                                            const IdRefList &imageOperandIdsList)
2884 {
2885     const size_t startSize = blob->size();
2886     blob->push_back(0);
2887     blob->push_back(idResultType1);
2888     blob->push_back(idResult2);
2889     blob->push_back(sampledImage);
2890     blob->push_back(coordinate);
2891     blob->push_back(dref);
2892     blob->push_back(imageOperands6);
2893     for (const auto &operand : imageOperandIdsList)
2894     {
2895         blob->push_back(operand);
2896     }
2897     (*blob)[startSize] =
2898         MakeLengthOp(blob->size() - startSize, spv::OpImageSparseSampleDrefExplicitLod);
2899 }
WriteImageSparseSampleProjImplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,const spv::ImageOperandsMask * imageOperands5,const IdRefList & imageOperandIdsList)2900 void WriteImageSparseSampleProjImplicitLod(Blob *blob,
2901                                            IdResultType idResultType1,
2902                                            IdResult idResult2,
2903                                            IdRef sampledImage,
2904                                            IdRef coordinate,
2905                                            const spv::ImageOperandsMask *imageOperands5,
2906                                            const IdRefList &imageOperandIdsList)
2907 {
2908     const size_t startSize = blob->size();
2909     blob->push_back(0);
2910     blob->push_back(idResultType1);
2911     blob->push_back(idResult2);
2912     blob->push_back(sampledImage);
2913     blob->push_back(coordinate);
2914     if (imageOperands5)
2915     {
2916         blob->push_back(*imageOperands5);
2917     }
2918     for (const auto &operand : imageOperandIdsList)
2919     {
2920         blob->push_back(operand);
2921     }
2922     (*blob)[startSize] =
2923         MakeLengthOp(blob->size() - startSize, spv::OpImageSparseSampleProjImplicitLod);
2924 }
WriteImageSparseSampleProjExplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,spv::ImageOperandsMask imageOperands5,const IdRefList & imageOperandIdsList)2925 void WriteImageSparseSampleProjExplicitLod(Blob *blob,
2926                                            IdResultType idResultType1,
2927                                            IdResult idResult2,
2928                                            IdRef sampledImage,
2929                                            IdRef coordinate,
2930                                            spv::ImageOperandsMask imageOperands5,
2931                                            const IdRefList &imageOperandIdsList)
2932 {
2933     const size_t startSize = blob->size();
2934     blob->push_back(0);
2935     blob->push_back(idResultType1);
2936     blob->push_back(idResult2);
2937     blob->push_back(sampledImage);
2938     blob->push_back(coordinate);
2939     blob->push_back(imageOperands5);
2940     for (const auto &operand : imageOperandIdsList)
2941     {
2942         blob->push_back(operand);
2943     }
2944     (*blob)[startSize] =
2945         MakeLengthOp(blob->size() - startSize, spv::OpImageSparseSampleProjExplicitLod);
2946 }
WriteImageSparseSampleProjDrefImplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef dref,const spv::ImageOperandsMask * imageOperands6,const IdRefList & imageOperandIdsList)2947 void WriteImageSparseSampleProjDrefImplicitLod(Blob *blob,
2948                                                IdResultType idResultType1,
2949                                                IdResult idResult2,
2950                                                IdRef sampledImage,
2951                                                IdRef coordinate,
2952                                                IdRef dref,
2953                                                const spv::ImageOperandsMask *imageOperands6,
2954                                                const IdRefList &imageOperandIdsList)
2955 {
2956     const size_t startSize = blob->size();
2957     blob->push_back(0);
2958     blob->push_back(idResultType1);
2959     blob->push_back(idResult2);
2960     blob->push_back(sampledImage);
2961     blob->push_back(coordinate);
2962     blob->push_back(dref);
2963     if (imageOperands6)
2964     {
2965         blob->push_back(*imageOperands6);
2966     }
2967     for (const auto &operand : imageOperandIdsList)
2968     {
2969         blob->push_back(operand);
2970     }
2971     (*blob)[startSize] =
2972         MakeLengthOp(blob->size() - startSize, spv::OpImageSparseSampleProjDrefImplicitLod);
2973 }
WriteImageSparseSampleProjDrefExplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef dref,spv::ImageOperandsMask imageOperands6,const IdRefList & imageOperandIdsList)2974 void WriteImageSparseSampleProjDrefExplicitLod(Blob *blob,
2975                                                IdResultType idResultType1,
2976                                                IdResult idResult2,
2977                                                IdRef sampledImage,
2978                                                IdRef coordinate,
2979                                                IdRef dref,
2980                                                spv::ImageOperandsMask imageOperands6,
2981                                                const IdRefList &imageOperandIdsList)
2982 {
2983     const size_t startSize = blob->size();
2984     blob->push_back(0);
2985     blob->push_back(idResultType1);
2986     blob->push_back(idResult2);
2987     blob->push_back(sampledImage);
2988     blob->push_back(coordinate);
2989     blob->push_back(dref);
2990     blob->push_back(imageOperands6);
2991     for (const auto &operand : imageOperandIdsList)
2992     {
2993         blob->push_back(operand);
2994     }
2995     (*blob)[startSize] =
2996         MakeLengthOp(blob->size() - startSize, spv::OpImageSparseSampleProjDrefExplicitLod);
2997 }
WriteImageSparseFetch(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef image,IdRef coordinate,const spv::ImageOperandsMask * imageOperands5,const IdRefList & imageOperandIdsList)2998 void WriteImageSparseFetch(Blob *blob,
2999                            IdResultType idResultType1,
3000                            IdResult idResult2,
3001                            IdRef image,
3002                            IdRef coordinate,
3003                            const spv::ImageOperandsMask *imageOperands5,
3004                            const IdRefList &imageOperandIdsList)
3005 {
3006     const size_t startSize = blob->size();
3007     blob->push_back(0);
3008     blob->push_back(idResultType1);
3009     blob->push_back(idResult2);
3010     blob->push_back(image);
3011     blob->push_back(coordinate);
3012     if (imageOperands5)
3013     {
3014         blob->push_back(*imageOperands5);
3015     }
3016     for (const auto &operand : imageOperandIdsList)
3017     {
3018         blob->push_back(operand);
3019     }
3020     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageSparseFetch);
3021 }
WriteImageSparseGather(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef component,const spv::ImageOperandsMask * imageOperands6,const IdRefList & imageOperandIdsList)3022 void WriteImageSparseGather(Blob *blob,
3023                             IdResultType idResultType1,
3024                             IdResult idResult2,
3025                             IdRef sampledImage,
3026                             IdRef coordinate,
3027                             IdRef component,
3028                             const spv::ImageOperandsMask *imageOperands6,
3029                             const IdRefList &imageOperandIdsList)
3030 {
3031     const size_t startSize = blob->size();
3032     blob->push_back(0);
3033     blob->push_back(idResultType1);
3034     blob->push_back(idResult2);
3035     blob->push_back(sampledImage);
3036     blob->push_back(coordinate);
3037     blob->push_back(component);
3038     if (imageOperands6)
3039     {
3040         blob->push_back(*imageOperands6);
3041     }
3042     for (const auto &operand : imageOperandIdsList)
3043     {
3044         blob->push_back(operand);
3045     }
3046     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageSparseGather);
3047 }
WriteImageSparseDrefGather(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef dref,const spv::ImageOperandsMask * imageOperands6,const IdRefList & imageOperandIdsList)3048 void WriteImageSparseDrefGather(Blob *blob,
3049                                 IdResultType idResultType1,
3050                                 IdResult idResult2,
3051                                 IdRef sampledImage,
3052                                 IdRef coordinate,
3053                                 IdRef dref,
3054                                 const spv::ImageOperandsMask *imageOperands6,
3055                                 const IdRefList &imageOperandIdsList)
3056 {
3057     const size_t startSize = blob->size();
3058     blob->push_back(0);
3059     blob->push_back(idResultType1);
3060     blob->push_back(idResult2);
3061     blob->push_back(sampledImage);
3062     blob->push_back(coordinate);
3063     blob->push_back(dref);
3064     if (imageOperands6)
3065     {
3066         blob->push_back(*imageOperands6);
3067     }
3068     for (const auto &operand : imageOperandIdsList)
3069     {
3070         blob->push_back(operand);
3071     }
3072     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageSparseDrefGather);
3073 }
WriteImageSparseTexelsResident(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef residentCode)3074 void WriteImageSparseTexelsResident(Blob *blob,
3075                                     IdResultType idResultType1,
3076                                     IdResult idResult2,
3077                                     IdRef residentCode)
3078 {
3079     const size_t startSize = blob->size();
3080     blob->push_back(0);
3081     blob->push_back(idResultType1);
3082     blob->push_back(idResult2);
3083     blob->push_back(residentCode);
3084     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageSparseTexelsResident);
3085 }
WriteNoLine(Blob * blob)3086 void WriteNoLine(Blob *blob)
3087 {
3088     const size_t startSize = blob->size();
3089     blob->push_back(0);
3090 
3091     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpNoLine);
3092 }
WriteImageSparseRead(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef image,IdRef coordinate,const spv::ImageOperandsMask * imageOperands5,const IdRefList & imageOperandIdsList)3093 void WriteImageSparseRead(Blob *blob,
3094                           IdResultType idResultType1,
3095                           IdResult idResult2,
3096                           IdRef image,
3097                           IdRef coordinate,
3098                           const spv::ImageOperandsMask *imageOperands5,
3099                           const IdRefList &imageOperandIdsList)
3100 {
3101     const size_t startSize = blob->size();
3102     blob->push_back(0);
3103     blob->push_back(idResultType1);
3104     blob->push_back(idResult2);
3105     blob->push_back(image);
3106     blob->push_back(coordinate);
3107     if (imageOperands5)
3108     {
3109         blob->push_back(*imageOperands5);
3110     }
3111     for (const auto &operand : imageOperandIdsList)
3112     {
3113         blob->push_back(operand);
3114     }
3115     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageSparseRead);
3116 }
WriteModuleProcessed(Blob * blob,LiteralString process)3117 void WriteModuleProcessed(Blob *blob, LiteralString process)
3118 {
3119     const size_t startSize = blob->size();
3120     blob->push_back(0);
3121     {
3122         size_t d = blob->size();
3123         blob->resize(d + strlen(process) / 4 + 1, 0);
3124         ASSERT(IsLittleEndian());
3125         strcpy(reinterpret_cast<char *>(blob->data() + d), process);
3126     }
3127     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpModuleProcessed);
3128 }
WriteExecutionModeId(Blob * blob,IdRef entryPoint,spv::ExecutionMode mode,const LiteralIntegerList & operandsList)3129 void WriteExecutionModeId(Blob *blob,
3130                           IdRef entryPoint,
3131                           spv::ExecutionMode mode,
3132                           const LiteralIntegerList &operandsList)
3133 {
3134     const size_t startSize = blob->size();
3135     blob->push_back(0);
3136     blob->push_back(entryPoint);
3137     blob->push_back(mode);
3138     for (const auto &operand : operandsList)
3139     {
3140         blob->push_back(operand);
3141     }
3142     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpExecutionModeId);
3143 }
WriteGroupNonUniformElect(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution)3144 void WriteGroupNonUniformElect(Blob *blob,
3145                                IdResultType idResultType1,
3146                                IdResult idResult2,
3147                                IdScope execution)
3148 {
3149     const size_t startSize = blob->size();
3150     blob->push_back(0);
3151     blob->push_back(idResultType1);
3152     blob->push_back(idResult2);
3153     blob->push_back(execution);
3154     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformElect);
3155 }
WriteGroupNonUniformAll(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef predicate)3156 void WriteGroupNonUniformAll(Blob *blob,
3157                              IdResultType idResultType1,
3158                              IdResult idResult2,
3159                              IdScope execution,
3160                              IdRef predicate)
3161 {
3162     const size_t startSize = blob->size();
3163     blob->push_back(0);
3164     blob->push_back(idResultType1);
3165     blob->push_back(idResult2);
3166     blob->push_back(execution);
3167     blob->push_back(predicate);
3168     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformAll);
3169 }
WriteGroupNonUniformAny(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef predicate)3170 void WriteGroupNonUniformAny(Blob *blob,
3171                              IdResultType idResultType1,
3172                              IdResult idResult2,
3173                              IdScope execution,
3174                              IdRef predicate)
3175 {
3176     const size_t startSize = blob->size();
3177     blob->push_back(0);
3178     blob->push_back(idResultType1);
3179     blob->push_back(idResult2);
3180     blob->push_back(execution);
3181     blob->push_back(predicate);
3182     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformAny);
3183 }
WriteGroupNonUniformAllEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value)3184 void WriteGroupNonUniformAllEqual(Blob *blob,
3185                                   IdResultType idResultType1,
3186                                   IdResult idResult2,
3187                                   IdScope execution,
3188                                   IdRef value)
3189 {
3190     const size_t startSize = blob->size();
3191     blob->push_back(0);
3192     blob->push_back(idResultType1);
3193     blob->push_back(idResult2);
3194     blob->push_back(execution);
3195     blob->push_back(value);
3196     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformAllEqual);
3197 }
WriteGroupNonUniformBroadcast(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value,IdRef id)3198 void WriteGroupNonUniformBroadcast(Blob *blob,
3199                                    IdResultType idResultType1,
3200                                    IdResult idResult2,
3201                                    IdScope execution,
3202                                    IdRef value,
3203                                    IdRef id)
3204 {
3205     const size_t startSize = blob->size();
3206     blob->push_back(0);
3207     blob->push_back(idResultType1);
3208     blob->push_back(idResult2);
3209     blob->push_back(execution);
3210     blob->push_back(value);
3211     blob->push_back(id);
3212     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformBroadcast);
3213 }
WriteGroupNonUniformBroadcastFirst(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value)3214 void WriteGroupNonUniformBroadcastFirst(Blob *blob,
3215                                         IdResultType idResultType1,
3216                                         IdResult idResult2,
3217                                         IdScope execution,
3218                                         IdRef value)
3219 {
3220     const size_t startSize = blob->size();
3221     blob->push_back(0);
3222     blob->push_back(idResultType1);
3223     blob->push_back(idResult2);
3224     blob->push_back(execution);
3225     blob->push_back(value);
3226     (*blob)[startSize] =
3227         MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformBroadcastFirst);
3228 }
WriteGroupNonUniformBallot(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef predicate)3229 void WriteGroupNonUniformBallot(Blob *blob,
3230                                 IdResultType idResultType1,
3231                                 IdResult idResult2,
3232                                 IdScope execution,
3233                                 IdRef predicate)
3234 {
3235     const size_t startSize = blob->size();
3236     blob->push_back(0);
3237     blob->push_back(idResultType1);
3238     blob->push_back(idResult2);
3239     blob->push_back(execution);
3240     blob->push_back(predicate);
3241     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformBallot);
3242 }
WriteGroupNonUniformInverseBallot(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value)3243 void WriteGroupNonUniformInverseBallot(Blob *blob,
3244                                        IdResultType idResultType1,
3245                                        IdResult idResult2,
3246                                        IdScope execution,
3247                                        IdRef value)
3248 {
3249     const size_t startSize = blob->size();
3250     blob->push_back(0);
3251     blob->push_back(idResultType1);
3252     blob->push_back(idResult2);
3253     blob->push_back(execution);
3254     blob->push_back(value);
3255     (*blob)[startSize] =
3256         MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformInverseBallot);
3257 }
WriteGroupNonUniformBallotBitExtract(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value,IdRef index)3258 void WriteGroupNonUniformBallotBitExtract(Blob *blob,
3259                                           IdResultType idResultType1,
3260                                           IdResult idResult2,
3261                                           IdScope execution,
3262                                           IdRef value,
3263                                           IdRef index)
3264 {
3265     const size_t startSize = blob->size();
3266     blob->push_back(0);
3267     blob->push_back(idResultType1);
3268     blob->push_back(idResult2);
3269     blob->push_back(execution);
3270     blob->push_back(value);
3271     blob->push_back(index);
3272     (*blob)[startSize] =
3273         MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformBallotBitExtract);
3274 }
WriteGroupNonUniformBallotBitCount(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value)3275 void WriteGroupNonUniformBallotBitCount(Blob *blob,
3276                                         IdResultType idResultType1,
3277                                         IdResult idResult2,
3278                                         IdScope execution,
3279                                         spv::GroupOperation operation,
3280                                         IdRef value)
3281 {
3282     const size_t startSize = blob->size();
3283     blob->push_back(0);
3284     blob->push_back(idResultType1);
3285     blob->push_back(idResult2);
3286     blob->push_back(execution);
3287     blob->push_back(operation);
3288     blob->push_back(value);
3289     (*blob)[startSize] =
3290         MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformBallotBitCount);
3291 }
WriteGroupNonUniformBallotFindLSB(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value)3292 void WriteGroupNonUniformBallotFindLSB(Blob *blob,
3293                                        IdResultType idResultType1,
3294                                        IdResult idResult2,
3295                                        IdScope execution,
3296                                        IdRef value)
3297 {
3298     const size_t startSize = blob->size();
3299     blob->push_back(0);
3300     blob->push_back(idResultType1);
3301     blob->push_back(idResult2);
3302     blob->push_back(execution);
3303     blob->push_back(value);
3304     (*blob)[startSize] =
3305         MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformBallotFindLSB);
3306 }
WriteGroupNonUniformBallotFindMSB(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value)3307 void WriteGroupNonUniformBallotFindMSB(Blob *blob,
3308                                        IdResultType idResultType1,
3309                                        IdResult idResult2,
3310                                        IdScope execution,
3311                                        IdRef value)
3312 {
3313     const size_t startSize = blob->size();
3314     blob->push_back(0);
3315     blob->push_back(idResultType1);
3316     blob->push_back(idResult2);
3317     blob->push_back(execution);
3318     blob->push_back(value);
3319     (*blob)[startSize] =
3320         MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformBallotFindMSB);
3321 }
WriteGroupNonUniformShuffle(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value,IdRef id)3322 void WriteGroupNonUniformShuffle(Blob *blob,
3323                                  IdResultType idResultType1,
3324                                  IdResult idResult2,
3325                                  IdScope execution,
3326                                  IdRef value,
3327                                  IdRef id)
3328 {
3329     const size_t startSize = blob->size();
3330     blob->push_back(0);
3331     blob->push_back(idResultType1);
3332     blob->push_back(idResult2);
3333     blob->push_back(execution);
3334     blob->push_back(value);
3335     blob->push_back(id);
3336     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformShuffle);
3337 }
WriteGroupNonUniformShuffleXor(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value,IdRef mask)3338 void WriteGroupNonUniformShuffleXor(Blob *blob,
3339                                     IdResultType idResultType1,
3340                                     IdResult idResult2,
3341                                     IdScope execution,
3342                                     IdRef value,
3343                                     IdRef mask)
3344 {
3345     const size_t startSize = blob->size();
3346     blob->push_back(0);
3347     blob->push_back(idResultType1);
3348     blob->push_back(idResult2);
3349     blob->push_back(execution);
3350     blob->push_back(value);
3351     blob->push_back(mask);
3352     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformShuffleXor);
3353 }
WriteGroupNonUniformShuffleUp(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value,IdRef delta)3354 void WriteGroupNonUniformShuffleUp(Blob *blob,
3355                                    IdResultType idResultType1,
3356                                    IdResult idResult2,
3357                                    IdScope execution,
3358                                    IdRef value,
3359                                    IdRef delta)
3360 {
3361     const size_t startSize = blob->size();
3362     blob->push_back(0);
3363     blob->push_back(idResultType1);
3364     blob->push_back(idResult2);
3365     blob->push_back(execution);
3366     blob->push_back(value);
3367     blob->push_back(delta);
3368     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformShuffleUp);
3369 }
WriteGroupNonUniformShuffleDown(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value,IdRef delta)3370 void WriteGroupNonUniformShuffleDown(Blob *blob,
3371                                      IdResultType idResultType1,
3372                                      IdResult idResult2,
3373                                      IdScope execution,
3374                                      IdRef value,
3375                                      IdRef delta)
3376 {
3377     const size_t startSize = blob->size();
3378     blob->push_back(0);
3379     blob->push_back(idResultType1);
3380     blob->push_back(idResult2);
3381     blob->push_back(execution);
3382     blob->push_back(value);
3383     blob->push_back(delta);
3384     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformShuffleDown);
3385 }
WriteGroupNonUniformIAdd(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3386 void WriteGroupNonUniformIAdd(Blob *blob,
3387                               IdResultType idResultType1,
3388                               IdResult idResult2,
3389                               IdScope execution,
3390                               spv::GroupOperation operation,
3391                               IdRef value,
3392                               const IdRef *clusterSize)
3393 {
3394     const size_t startSize = blob->size();
3395     blob->push_back(0);
3396     blob->push_back(idResultType1);
3397     blob->push_back(idResult2);
3398     blob->push_back(execution);
3399     blob->push_back(operation);
3400     blob->push_back(value);
3401     if (clusterSize)
3402     {
3403         blob->push_back(*clusterSize);
3404     }
3405     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformIAdd);
3406 }
WriteGroupNonUniformFAdd(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3407 void WriteGroupNonUniformFAdd(Blob *blob,
3408                               IdResultType idResultType1,
3409                               IdResult idResult2,
3410                               IdScope execution,
3411                               spv::GroupOperation operation,
3412                               IdRef value,
3413                               const IdRef *clusterSize)
3414 {
3415     const size_t startSize = blob->size();
3416     blob->push_back(0);
3417     blob->push_back(idResultType1);
3418     blob->push_back(idResult2);
3419     blob->push_back(execution);
3420     blob->push_back(operation);
3421     blob->push_back(value);
3422     if (clusterSize)
3423     {
3424         blob->push_back(*clusterSize);
3425     }
3426     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformFAdd);
3427 }
WriteGroupNonUniformIMul(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3428 void WriteGroupNonUniformIMul(Blob *blob,
3429                               IdResultType idResultType1,
3430                               IdResult idResult2,
3431                               IdScope execution,
3432                               spv::GroupOperation operation,
3433                               IdRef value,
3434                               const IdRef *clusterSize)
3435 {
3436     const size_t startSize = blob->size();
3437     blob->push_back(0);
3438     blob->push_back(idResultType1);
3439     blob->push_back(idResult2);
3440     blob->push_back(execution);
3441     blob->push_back(operation);
3442     blob->push_back(value);
3443     if (clusterSize)
3444     {
3445         blob->push_back(*clusterSize);
3446     }
3447     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformIMul);
3448 }
WriteGroupNonUniformFMul(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3449 void WriteGroupNonUniformFMul(Blob *blob,
3450                               IdResultType idResultType1,
3451                               IdResult idResult2,
3452                               IdScope execution,
3453                               spv::GroupOperation operation,
3454                               IdRef value,
3455                               const IdRef *clusterSize)
3456 {
3457     const size_t startSize = blob->size();
3458     blob->push_back(0);
3459     blob->push_back(idResultType1);
3460     blob->push_back(idResult2);
3461     blob->push_back(execution);
3462     blob->push_back(operation);
3463     blob->push_back(value);
3464     if (clusterSize)
3465     {
3466         blob->push_back(*clusterSize);
3467     }
3468     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformFMul);
3469 }
WriteGroupNonUniformSMin(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3470 void WriteGroupNonUniformSMin(Blob *blob,
3471                               IdResultType idResultType1,
3472                               IdResult idResult2,
3473                               IdScope execution,
3474                               spv::GroupOperation operation,
3475                               IdRef value,
3476                               const IdRef *clusterSize)
3477 {
3478     const size_t startSize = blob->size();
3479     blob->push_back(0);
3480     blob->push_back(idResultType1);
3481     blob->push_back(idResult2);
3482     blob->push_back(execution);
3483     blob->push_back(operation);
3484     blob->push_back(value);
3485     if (clusterSize)
3486     {
3487         blob->push_back(*clusterSize);
3488     }
3489     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformSMin);
3490 }
WriteGroupNonUniformUMin(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3491 void WriteGroupNonUniformUMin(Blob *blob,
3492                               IdResultType idResultType1,
3493                               IdResult idResult2,
3494                               IdScope execution,
3495                               spv::GroupOperation operation,
3496                               IdRef value,
3497                               const IdRef *clusterSize)
3498 {
3499     const size_t startSize = blob->size();
3500     blob->push_back(0);
3501     blob->push_back(idResultType1);
3502     blob->push_back(idResult2);
3503     blob->push_back(execution);
3504     blob->push_back(operation);
3505     blob->push_back(value);
3506     if (clusterSize)
3507     {
3508         blob->push_back(*clusterSize);
3509     }
3510     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformUMin);
3511 }
WriteGroupNonUniformFMin(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3512 void WriteGroupNonUniformFMin(Blob *blob,
3513                               IdResultType idResultType1,
3514                               IdResult idResult2,
3515                               IdScope execution,
3516                               spv::GroupOperation operation,
3517                               IdRef value,
3518                               const IdRef *clusterSize)
3519 {
3520     const size_t startSize = blob->size();
3521     blob->push_back(0);
3522     blob->push_back(idResultType1);
3523     blob->push_back(idResult2);
3524     blob->push_back(execution);
3525     blob->push_back(operation);
3526     blob->push_back(value);
3527     if (clusterSize)
3528     {
3529         blob->push_back(*clusterSize);
3530     }
3531     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformFMin);
3532 }
WriteGroupNonUniformSMax(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3533 void WriteGroupNonUniformSMax(Blob *blob,
3534                               IdResultType idResultType1,
3535                               IdResult idResult2,
3536                               IdScope execution,
3537                               spv::GroupOperation operation,
3538                               IdRef value,
3539                               const IdRef *clusterSize)
3540 {
3541     const size_t startSize = blob->size();
3542     blob->push_back(0);
3543     blob->push_back(idResultType1);
3544     blob->push_back(idResult2);
3545     blob->push_back(execution);
3546     blob->push_back(operation);
3547     blob->push_back(value);
3548     if (clusterSize)
3549     {
3550         blob->push_back(*clusterSize);
3551     }
3552     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformSMax);
3553 }
WriteGroupNonUniformUMax(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3554 void WriteGroupNonUniformUMax(Blob *blob,
3555                               IdResultType idResultType1,
3556                               IdResult idResult2,
3557                               IdScope execution,
3558                               spv::GroupOperation operation,
3559                               IdRef value,
3560                               const IdRef *clusterSize)
3561 {
3562     const size_t startSize = blob->size();
3563     blob->push_back(0);
3564     blob->push_back(idResultType1);
3565     blob->push_back(idResult2);
3566     blob->push_back(execution);
3567     blob->push_back(operation);
3568     blob->push_back(value);
3569     if (clusterSize)
3570     {
3571         blob->push_back(*clusterSize);
3572     }
3573     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformUMax);
3574 }
WriteGroupNonUniformFMax(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3575 void WriteGroupNonUniformFMax(Blob *blob,
3576                               IdResultType idResultType1,
3577                               IdResult idResult2,
3578                               IdScope execution,
3579                               spv::GroupOperation operation,
3580                               IdRef value,
3581                               const IdRef *clusterSize)
3582 {
3583     const size_t startSize = blob->size();
3584     blob->push_back(0);
3585     blob->push_back(idResultType1);
3586     blob->push_back(idResult2);
3587     blob->push_back(execution);
3588     blob->push_back(operation);
3589     blob->push_back(value);
3590     if (clusterSize)
3591     {
3592         blob->push_back(*clusterSize);
3593     }
3594     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformFMax);
3595 }
WriteGroupNonUniformBitwiseAnd(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3596 void WriteGroupNonUniformBitwiseAnd(Blob *blob,
3597                                     IdResultType idResultType1,
3598                                     IdResult idResult2,
3599                                     IdScope execution,
3600                                     spv::GroupOperation operation,
3601                                     IdRef value,
3602                                     const IdRef *clusterSize)
3603 {
3604     const size_t startSize = blob->size();
3605     blob->push_back(0);
3606     blob->push_back(idResultType1);
3607     blob->push_back(idResult2);
3608     blob->push_back(execution);
3609     blob->push_back(operation);
3610     blob->push_back(value);
3611     if (clusterSize)
3612     {
3613         blob->push_back(*clusterSize);
3614     }
3615     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformBitwiseAnd);
3616 }
WriteGroupNonUniformBitwiseOr(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3617 void WriteGroupNonUniformBitwiseOr(Blob *blob,
3618                                    IdResultType idResultType1,
3619                                    IdResult idResult2,
3620                                    IdScope execution,
3621                                    spv::GroupOperation operation,
3622                                    IdRef value,
3623                                    const IdRef *clusterSize)
3624 {
3625     const size_t startSize = blob->size();
3626     blob->push_back(0);
3627     blob->push_back(idResultType1);
3628     blob->push_back(idResult2);
3629     blob->push_back(execution);
3630     blob->push_back(operation);
3631     blob->push_back(value);
3632     if (clusterSize)
3633     {
3634         blob->push_back(*clusterSize);
3635     }
3636     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformBitwiseOr);
3637 }
WriteGroupNonUniformBitwiseXor(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3638 void WriteGroupNonUniformBitwiseXor(Blob *blob,
3639                                     IdResultType idResultType1,
3640                                     IdResult idResult2,
3641                                     IdScope execution,
3642                                     spv::GroupOperation operation,
3643                                     IdRef value,
3644                                     const IdRef *clusterSize)
3645 {
3646     const size_t startSize = blob->size();
3647     blob->push_back(0);
3648     blob->push_back(idResultType1);
3649     blob->push_back(idResult2);
3650     blob->push_back(execution);
3651     blob->push_back(operation);
3652     blob->push_back(value);
3653     if (clusterSize)
3654     {
3655         blob->push_back(*clusterSize);
3656     }
3657     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformBitwiseXor);
3658 }
WriteGroupNonUniformLogicalAnd(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3659 void WriteGroupNonUniformLogicalAnd(Blob *blob,
3660                                     IdResultType idResultType1,
3661                                     IdResult idResult2,
3662                                     IdScope execution,
3663                                     spv::GroupOperation operation,
3664                                     IdRef value,
3665                                     const IdRef *clusterSize)
3666 {
3667     const size_t startSize = blob->size();
3668     blob->push_back(0);
3669     blob->push_back(idResultType1);
3670     blob->push_back(idResult2);
3671     blob->push_back(execution);
3672     blob->push_back(operation);
3673     blob->push_back(value);
3674     if (clusterSize)
3675     {
3676         blob->push_back(*clusterSize);
3677     }
3678     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformLogicalAnd);
3679 }
WriteGroupNonUniformLogicalOr(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3680 void WriteGroupNonUniformLogicalOr(Blob *blob,
3681                                    IdResultType idResultType1,
3682                                    IdResult idResult2,
3683                                    IdScope execution,
3684                                    spv::GroupOperation operation,
3685                                    IdRef value,
3686                                    const IdRef *clusterSize)
3687 {
3688     const size_t startSize = blob->size();
3689     blob->push_back(0);
3690     blob->push_back(idResultType1);
3691     blob->push_back(idResult2);
3692     blob->push_back(execution);
3693     blob->push_back(operation);
3694     blob->push_back(value);
3695     if (clusterSize)
3696     {
3697         blob->push_back(*clusterSize);
3698     }
3699     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformLogicalOr);
3700 }
WriteGroupNonUniformLogicalXor(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3701 void WriteGroupNonUniformLogicalXor(Blob *blob,
3702                                     IdResultType idResultType1,
3703                                     IdResult idResult2,
3704                                     IdScope execution,
3705                                     spv::GroupOperation operation,
3706                                     IdRef value,
3707                                     const IdRef *clusterSize)
3708 {
3709     const size_t startSize = blob->size();
3710     blob->push_back(0);
3711     blob->push_back(idResultType1);
3712     blob->push_back(idResult2);
3713     blob->push_back(execution);
3714     blob->push_back(operation);
3715     blob->push_back(value);
3716     if (clusterSize)
3717     {
3718         blob->push_back(*clusterSize);
3719     }
3720     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformLogicalXor);
3721 }
WriteGroupNonUniformQuadBroadcast(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value,IdRef index)3722 void WriteGroupNonUniformQuadBroadcast(Blob *blob,
3723                                        IdResultType idResultType1,
3724                                        IdResult idResult2,
3725                                        IdScope execution,
3726                                        IdRef value,
3727                                        IdRef index)
3728 {
3729     const size_t startSize = blob->size();
3730     blob->push_back(0);
3731     blob->push_back(idResultType1);
3732     blob->push_back(idResult2);
3733     blob->push_back(execution);
3734     blob->push_back(value);
3735     blob->push_back(index);
3736     (*blob)[startSize] =
3737         MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformQuadBroadcast);
3738 }
WriteGroupNonUniformQuadSwap(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value,IdRef direction)3739 void WriteGroupNonUniformQuadSwap(Blob *blob,
3740                                   IdResultType idResultType1,
3741                                   IdResult idResult2,
3742                                   IdScope execution,
3743                                   IdRef value,
3744                                   IdRef direction)
3745 {
3746     const size_t startSize = blob->size();
3747     blob->push_back(0);
3748     blob->push_back(idResultType1);
3749     blob->push_back(idResult2);
3750     blob->push_back(execution);
3751     blob->push_back(value);
3752     blob->push_back(direction);
3753     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformQuadSwap);
3754 }
WriteCopyLogical(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand)3755 void WriteCopyLogical(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef operand)
3756 {
3757     const size_t startSize = blob->size();
3758     blob->push_back(0);
3759     blob->push_back(idResultType1);
3760     blob->push_back(idResult2);
3761     blob->push_back(operand);
3762     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpCopyLogical);
3763 }
WritePtrEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)3764 void WritePtrEqual(Blob *blob,
3765                    IdResultType idResultType1,
3766                    IdResult idResult2,
3767                    IdRef operand1,
3768                    IdRef operand2)
3769 {
3770     const size_t startSize = blob->size();
3771     blob->push_back(0);
3772     blob->push_back(idResultType1);
3773     blob->push_back(idResult2);
3774     blob->push_back(operand1);
3775     blob->push_back(operand2);
3776     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpPtrEqual);
3777 }
WritePtrNotEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)3778 void WritePtrNotEqual(Blob *blob,
3779                       IdResultType idResultType1,
3780                       IdResult idResult2,
3781                       IdRef operand1,
3782                       IdRef operand2)
3783 {
3784     const size_t startSize = blob->size();
3785     blob->push_back(0);
3786     blob->push_back(idResultType1);
3787     blob->push_back(idResult2);
3788     blob->push_back(operand1);
3789     blob->push_back(operand2);
3790     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpPtrNotEqual);
3791 }
WriteSDot(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector1,IdRef vector2,const spv::PackedVectorFormat * packedVectorFormat)3792 void WriteSDot(Blob *blob,
3793                IdResultType idResultType1,
3794                IdResult idResult2,
3795                IdRef vector1,
3796                IdRef vector2,
3797                const spv::PackedVectorFormat *packedVectorFormat)
3798 {
3799     const size_t startSize = blob->size();
3800     blob->push_back(0);
3801     blob->push_back(idResultType1);
3802     blob->push_back(idResult2);
3803     blob->push_back(vector1);
3804     blob->push_back(vector2);
3805     if (packedVectorFormat)
3806     {
3807         blob->push_back(*packedVectorFormat);
3808     }
3809     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSDot);
3810 }
WriteUDot(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector1,IdRef vector2,const spv::PackedVectorFormat * packedVectorFormat)3811 void WriteUDot(Blob *blob,
3812                IdResultType idResultType1,
3813                IdResult idResult2,
3814                IdRef vector1,
3815                IdRef vector2,
3816                const spv::PackedVectorFormat *packedVectorFormat)
3817 {
3818     const size_t startSize = blob->size();
3819     blob->push_back(0);
3820     blob->push_back(idResultType1);
3821     blob->push_back(idResult2);
3822     blob->push_back(vector1);
3823     blob->push_back(vector2);
3824     if (packedVectorFormat)
3825     {
3826         blob->push_back(*packedVectorFormat);
3827     }
3828     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpUDot);
3829 }
WriteSUDot(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector1,IdRef vector2,const spv::PackedVectorFormat * packedVectorFormat)3830 void WriteSUDot(Blob *blob,
3831                 IdResultType idResultType1,
3832                 IdResult idResult2,
3833                 IdRef vector1,
3834                 IdRef vector2,
3835                 const spv::PackedVectorFormat *packedVectorFormat)
3836 {
3837     const size_t startSize = blob->size();
3838     blob->push_back(0);
3839     blob->push_back(idResultType1);
3840     blob->push_back(idResult2);
3841     blob->push_back(vector1);
3842     blob->push_back(vector2);
3843     if (packedVectorFormat)
3844     {
3845         blob->push_back(*packedVectorFormat);
3846     }
3847     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSUDot);
3848 }
WriteSDotAccSat(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector1,IdRef vector2,IdRef accumulator,const spv::PackedVectorFormat * packedVectorFormat)3849 void WriteSDotAccSat(Blob *blob,
3850                      IdResultType idResultType1,
3851                      IdResult idResult2,
3852                      IdRef vector1,
3853                      IdRef vector2,
3854                      IdRef accumulator,
3855                      const spv::PackedVectorFormat *packedVectorFormat)
3856 {
3857     const size_t startSize = blob->size();
3858     blob->push_back(0);
3859     blob->push_back(idResultType1);
3860     blob->push_back(idResult2);
3861     blob->push_back(vector1);
3862     blob->push_back(vector2);
3863     blob->push_back(accumulator);
3864     if (packedVectorFormat)
3865     {
3866         blob->push_back(*packedVectorFormat);
3867     }
3868     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSDotAccSat);
3869 }
WriteUDotAccSat(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector1,IdRef vector2,IdRef accumulator,const spv::PackedVectorFormat * packedVectorFormat)3870 void WriteUDotAccSat(Blob *blob,
3871                      IdResultType idResultType1,
3872                      IdResult idResult2,
3873                      IdRef vector1,
3874                      IdRef vector2,
3875                      IdRef accumulator,
3876                      const spv::PackedVectorFormat *packedVectorFormat)
3877 {
3878     const size_t startSize = blob->size();
3879     blob->push_back(0);
3880     blob->push_back(idResultType1);
3881     blob->push_back(idResult2);
3882     blob->push_back(vector1);
3883     blob->push_back(vector2);
3884     blob->push_back(accumulator);
3885     if (packedVectorFormat)
3886     {
3887         blob->push_back(*packedVectorFormat);
3888     }
3889     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpUDotAccSat);
3890 }
WriteSUDotAccSat(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector1,IdRef vector2,IdRef accumulator,const spv::PackedVectorFormat * packedVectorFormat)3891 void WriteSUDotAccSat(Blob *blob,
3892                       IdResultType idResultType1,
3893                       IdResult idResult2,
3894                       IdRef vector1,
3895                       IdRef vector2,
3896                       IdRef accumulator,
3897                       const spv::PackedVectorFormat *packedVectorFormat)
3898 {
3899     const size_t startSize = blob->size();
3900     blob->push_back(0);
3901     blob->push_back(idResultType1);
3902     blob->push_back(idResult2);
3903     blob->push_back(vector1);
3904     blob->push_back(vector2);
3905     blob->push_back(accumulator);
3906     if (packedVectorFormat)
3907     {
3908         blob->push_back(*packedVectorFormat);
3909     }
3910     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSUDotAccSat);
3911 }
WriteBeginInvocationInterlockEXT(Blob * blob)3912 void WriteBeginInvocationInterlockEXT(Blob *blob)
3913 {
3914     const size_t startSize = blob->size();
3915     blob->push_back(0);
3916 
3917     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBeginInvocationInterlockEXT);
3918 }
WriteEndInvocationInterlockEXT(Blob * blob)3919 void WriteEndInvocationInterlockEXT(Blob *blob)
3920 {
3921     const size_t startSize = blob->size();
3922     blob->push_back(0);
3923 
3924     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpEndInvocationInterlockEXT);
3925 }
WriteDemoteToHelperInvocation(Blob * blob)3926 void WriteDemoteToHelperInvocation(Blob *blob)
3927 {
3928     const size_t startSize = blob->size();
3929     blob->push_back(0);
3930 
3931     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpDemoteToHelperInvocation);
3932 }
3933 
3934 }  // namespace spirv
3935 }  // namespace angle
3936