blob: 8feb6567a696c6e4056f7fbc209f10662592948e [file] [log] [blame]
Dejan Mircevskib6fe02f2016-01-07 13:44:22 -05001// Copyright (c) 2015-2016 The Khronos Group Inc.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01002//
David Neto9fc86582016-09-01 15:33:59 -04003// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01006//
David Neto9fc86582016-09-01 15:33:59 -04007// http://www.apache.org/licenses/LICENSE-2.0
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01008//
David Neto9fc86582016-09-01 15:33:59 -04009// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010014
15#include "operand.h"
16
17#include <assert.h>
18#include <string.h>
Chris Forbes78338d52017-06-27 16:28:22 -070019#include <algorithm>
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010020
Lei Zhangca1bf942016-04-27 16:47:13 -040021#include "macro.h"
David Netoba73a7c2016-01-06 13:08:39 -050022
Lei Zhang4f293b72016-03-21 16:36:14 -040023// Pull in operand info tables automatically generated from JSON grammar.
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040024namespace v1_0 {
Lei Zhang10dba912016-04-14 14:05:53 -040025#include "operand.kinds-1.0.inc"
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040026} // namespace v1_0
27namespace v1_1 {
Lei Zhang10dba912016-04-14 14:05:53 -040028#include "operand.kinds-1.1.inc"
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040029} // namespace v1_1
David Netodbc20492017-03-14 12:43:41 -040030namespace v1_2 {
31#include "operand.kinds-1.2.inc"
32} // namespace v1_2
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010033
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040034spv_result_t spvOperandTableGet(spv_operand_table* pOperandTable,
35 spv_target_env env) {
Lei Zhang40056702015-09-11 14:31:27 -040036 if (!pOperandTable) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010037
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040038 static const spv_operand_table_t table_1_0 = {
39 ARRAY_SIZE(v1_0::pygen_variable_OperandInfoTable),
40 v1_0::pygen_variable_OperandInfoTable};
41 static const spv_operand_table_t table_1_1 = {
42 ARRAY_SIZE(v1_1::pygen_variable_OperandInfoTable),
43 v1_1::pygen_variable_OperandInfoTable};
David Netodbc20492017-03-14 12:43:41 -040044 static const spv_operand_table_t table_1_2 = {
45 ARRAY_SIZE(v1_2::pygen_variable_OperandInfoTable),
46 v1_2::pygen_variable_OperandInfoTable};
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010047
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040048 switch (env) {
49 case SPV_ENV_UNIVERSAL_1_0:
50 case SPV_ENV_VULKAN_1_0:
David Netoc2967012016-08-05 18:19:30 -040051 case SPV_ENV_OPENCL_2_1:
52 case SPV_ENV_OPENGL_4_0:
53 case SPV_ENV_OPENGL_4_1:
54 case SPV_ENV_OPENGL_4_2:
55 case SPV_ENV_OPENGL_4_3:
56 case SPV_ENV_OPENGL_4_5:
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040057 *pOperandTable = &table_1_0;
58 return SPV_SUCCESS;
59 case SPV_ENV_UNIVERSAL_1_1:
60 *pOperandTable = &table_1_1;
61 return SPV_SUCCESS;
David Netodbc20492017-03-14 12:43:41 -040062 case SPV_ENV_UNIVERSAL_1_2:
63 case SPV_ENV_OPENCL_2_2:
64 *pOperandTable = &table_1_2;
65 return SPV_SUCCESS;
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040066 }
67 assert(0 && "Unknown spv_target_env in spvOperandTableGet()");
68 return SPV_ERROR_INVALID_TABLE;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010069}
70
Dejan Mircevski3e6b2df2016-01-07 11:00:38 -050071#undef ARRAY_SIZE
72
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010073spv_result_t spvOperandTableNameLookup(const spv_operand_table table,
74 const spv_operand_type_t type,
David Neto388c40d2015-09-16 16:42:56 -040075 const char* name,
76 const size_t nameLength,
77 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -040078 if (!table) return SPV_ERROR_INVALID_TABLE;
79 if (!name || !pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010080
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010081 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
Lei Zhangca1bf942016-04-27 16:47:13 -040082 const auto& group = table->types[typeIndex];
83 if (type != group.type) continue;
84 for (uint64_t index = 0; index < group.count; ++index) {
85 const auto& entry = group.entries[index];
86 if (nameLength == strlen(entry.name) &&
87 !strncmp(entry.name, name, nameLength)) {
88 *pEntry = &entry;
89 return SPV_SUCCESS;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010090 }
91 }
92 }
93
94 return SPV_ERROR_INVALID_LOOKUP;
95}
96
97spv_result_t spvOperandTableValueLookup(const spv_operand_table table,
98 const spv_operand_type_t type,
99 const uint32_t value,
Dejan Mircevski50babb22015-09-29 10:56:32 -0400100 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -0400101 if (!table) return SPV_ERROR_INVALID_TABLE;
102 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100103
104 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
Lei Zhangca1bf942016-04-27 16:47:13 -0400105 const auto& group = table->types[typeIndex];
106 if (type != group.type) continue;
107 for (uint64_t index = 0; index < group.count; ++index) {
108 const auto& entry = group.entries[index];
109 if (value == entry.value) {
110 *pEntry = &entry;
111 return SPV_SUCCESS;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100112 }
113 }
114 }
115
116 return SPV_ERROR_INVALID_LOOKUP;
117}
118
Dejan Mircevski50babb22015-09-29 10:56:32 -0400119const char* spvOperandTypeStr(spv_operand_type_t type) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100120 switch (type) {
121 case SPV_OPERAND_TYPE_ID:
David Netofadbf622015-09-14 17:07:11 -0400122 case SPV_OPERAND_TYPE_OPTIONAL_ID:
David Netofadbf622015-09-14 17:07:11 -0400123 return "ID";
David Neto201caf72015-11-04 17:38:17 -0500124 case SPV_OPERAND_TYPE_TYPE_ID:
125 return "type ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100126 case SPV_OPERAND_TYPE_RESULT_ID:
127 return "result ID";
Lei Zhang6483bd72015-10-14 17:02:39 -0400128 case SPV_OPERAND_TYPE_LITERAL_INTEGER:
David Neto201caf72015-11-04 17:38:17 -0500129 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER:
130 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100131 return "literal number";
David Neto201caf72015-11-04 17:38:17 -0500132 case SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER:
133 return "possibly multi-word literal integer";
134 case SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER:
135 return "possibly multi-word literal number";
136 case SPV_OPERAND_TYPE_EXTENSION_INSTRUCTION_NUMBER:
137 return "extension instruction number";
David Neto0f166be2015-11-11 01:56:49 -0500138 case SPV_OPERAND_TYPE_SPEC_CONSTANT_OP_NUMBER:
139 return "OpSpecConstantOp opcode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100140 case SPV_OPERAND_TYPE_LITERAL_STRING:
David Neto201caf72015-11-04 17:38:17 -0500141 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100142 return "literal string";
143 case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
Dejan Mircevskid2c81cf2015-10-09 11:06:10 -0400144 return "source language";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100145 case SPV_OPERAND_TYPE_EXECUTION_MODEL:
146 return "execution model";
147 case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
148 return "addressing model";
149 case SPV_OPERAND_TYPE_MEMORY_MODEL:
150 return "memory model";
151 case SPV_OPERAND_TYPE_EXECUTION_MODE:
152 return "execution mode";
153 case SPV_OPERAND_TYPE_STORAGE_CLASS:
154 return "storage class";
155 case SPV_OPERAND_TYPE_DIMENSIONALITY:
156 return "dimensionality";
157 case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
David Netod9ad0502015-11-24 18:37:24 -0500158 return "sampler addressing mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100159 case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
160 return "sampler filter mode";
David Netob30a0c52015-09-16 15:56:43 -0400161 case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
Dejan Mircevski971b3442015-10-13 12:54:47 -0400162 return "image format";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100163 case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
Dejan Mircevski355cc0c2015-10-13 15:02:03 -0400164 return "floating-point fast math mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100165 case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
Dejan Mircevski355cc0c2015-10-13 15:02:03 -0400166 return "floating-point rounding mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100167 case SPV_OPERAND_TYPE_LINKAGE_TYPE:
168 return "linkage type";
169 case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
David Neto2889a0c2016-02-15 13:50:00 -0500170 case SPV_OPERAND_TYPE_OPTIONAL_ACCESS_QUALIFIER:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100171 return "access qualifier";
172 case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
173 return "function parameter attribute";
174 case SPV_OPERAND_TYPE_DECORATION:
175 return "decoration";
176 case SPV_OPERAND_TYPE_BUILT_IN:
Dejan Mircevskid7b0f832015-10-13 15:39:38 -0400177 return "built-in";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100178 case SPV_OPERAND_TYPE_SELECTION_CONTROL:
179 return "selection control";
180 case SPV_OPERAND_TYPE_LOOP_CONTROL:
181 return "loop control";
182 case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
183 return "function control";
David Neto64a9be92015-11-18 15:48:32 -0500184 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID:
David Netod9ad0502015-11-24 18:37:24 -0500185 return "memory semantics ID";
David Neto201caf72015-11-04 17:38:17 -0500186 case SPV_OPERAND_TYPE_MEMORY_ACCESS:
David Neto78c3b432015-08-27 13:03:52 -0400187 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100188 return "memory access";
David Neto64a9be92015-11-18 15:48:32 -0500189 case SPV_OPERAND_TYPE_SCOPE_ID:
David Netod9ad0502015-11-24 18:37:24 -0500190 return "scope ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100191 case SPV_OPERAND_TYPE_GROUP_OPERATION:
192 return "group operation";
193 case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
194 return "kernel enqeue flags";
David Neto47994822015-08-27 13:11:01 -0400195 case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100196 return "kernel profiling info";
197 case SPV_OPERAND_TYPE_CAPABILITY:
198 return "capability";
David Neto201caf72015-11-04 17:38:17 -0500199 case SPV_OPERAND_TYPE_IMAGE:
David Netoee1b3bb2015-09-18 11:19:18 -0400200 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
David Netod9ad0502015-11-24 18:37:24 -0500201 return "image";
David Neto201caf72015-11-04 17:38:17 -0500202 case SPV_OPERAND_TYPE_OPTIONAL_CIV:
203 return "context-insensitive value";
204
205 // The next values are for values returned from an instruction, not actually
206 // an operand. So the specific strings don't matter. But let's add them
207 // for completeness and ease of testing.
208 case SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER:
209 return "image channel order";
210 case SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE:
211 return "image channel data type";
212
David Neto78c3b432015-08-27 13:03:52 -0400213 case SPV_OPERAND_TYPE_NONE:
214 return "NONE";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100215 default:
216 assert(0 && "Unhandled operand type!");
217 break;
218 }
219 return "unknown";
220}
David Neto78c3b432015-08-27 13:03:52 -0400221
Chris Forbes78338d52017-06-27 16:28:22 -0700222void spvPushOperandTypes(const spv_operand_type_t* types,
223 spv_operand_pattern_t* pattern) {
David Neto78c3b432015-08-27 13:03:52 -0400224 const spv_operand_type_t* endTypes;
Dejan Mircevski50babb22015-09-29 10:56:32 -0400225 for (endTypes = types; *endTypes != SPV_OPERAND_TYPE_NONE; ++endTypes)
David Neto78c3b432015-08-27 13:03:52 -0400226 ;
Chris Forbes78338d52017-06-27 16:28:22 -0700227 while (endTypes-- != types) {
228 pattern->push_back(*endTypes);
229 }
David Neto78c3b432015-08-27 13:03:52 -0400230}
231
Chris Forbes78338d52017-06-27 16:28:22 -0700232void spvPushOperandTypesForMask(const spv_operand_table operandTable,
233 const spv_operand_type_t type,
234 const uint32_t mask,
235 spv_operand_pattern_t* pattern) {
236 // Scan from highest bits to lowest bits because we will append in LIFO
237 // fashion, and we need the operands for lower order bits to be consumed first
Jamie Madill34cb0032016-04-29 14:36:00 -0400238 for (uint32_t candidate_bit = (1u << 31u); candidate_bit; candidate_bit >>= 1) {
David Neto5bf88fc2015-09-17 17:06:10 -0400239 if (candidate_bit & mask) {
240 spv_operand_desc entry = nullptr;
241 if (SPV_SUCCESS == spvOperandTableValueLookup(operandTable, type,
242 candidate_bit, &entry)) {
Chris Forbes78338d52017-06-27 16:28:22 -0700243 spvPushOperandTypes(entry->operandTypes, pattern);
David Neto5bf88fc2015-09-17 17:06:10 -0400244 }
245 }
246 }
247}
248
David Netob5267562016-02-02 12:05:34 -0500249bool spvOperandIsConcreteMask(spv_operand_type_t type) {
250 return SPV_OPERAND_TYPE_FIRST_CONCRETE_MASK_TYPE <= type &&
251 type <= SPV_OPERAND_TYPE_LAST_CONCRETE_MASK_TYPE;
252}
253
David Neto78c3b432015-08-27 13:03:52 -0400254bool spvOperandIsOptional(spv_operand_type_t type) {
David Neto201caf72015-11-04 17:38:17 -0500255 return SPV_OPERAND_TYPE_FIRST_OPTIONAL_TYPE <= type &&
256 type <= SPV_OPERAND_TYPE_LAST_OPTIONAL_TYPE;
David Neto78c3b432015-08-27 13:03:52 -0400257}
258
259bool spvOperandIsVariable(spv_operand_type_t type) {
David Neto201caf72015-11-04 17:38:17 -0500260 return SPV_OPERAND_TYPE_FIRST_VARIABLE_TYPE <= type &&
261 type <= SPV_OPERAND_TYPE_LAST_VARIABLE_TYPE;
David Neto78c3b432015-08-27 13:03:52 -0400262}
263
David Neto78c3b432015-08-27 13:03:52 -0400264bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
265 spv_operand_pattern_t* pattern) {
266 switch (type) {
267 case SPV_OPERAND_TYPE_VARIABLE_ID:
Chris Forbes78338d52017-06-27 16:28:22 -0700268 pattern->push_back(type);
269 pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_ID);
David Neto78c3b432015-08-27 13:03:52 -0400270 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -0400271 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER:
Chris Forbes78338d52017-06-27 16:28:22 -0700272 pattern->push_back(type);
273 pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER);
David Neto78c3b432015-08-27 13:03:52 -0400274 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -0400275 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER_ID:
David Neto201caf72015-11-04 17:38:17 -0500276 // Represents Zero or more (Literal number, Id) pairs,
277 // where the literal number must be a scalar integer.
Chris Forbes78338d52017-06-27 16:28:22 -0700278 pattern->push_back(type);
279 pattern->push_back(SPV_OPERAND_TYPE_ID);
280 pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER);
David Neto78c3b432015-08-27 13:03:52 -0400281 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -0400282 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_INTEGER:
David Neto561dc4e2015-09-25 14:23:29 -0400283 // Represents Zero or more (Id, Literal number) pairs.
Chris Forbes78338d52017-06-27 16:28:22 -0700284 pattern->push_back(type);
285 pattern->push_back(SPV_OPERAND_TYPE_LITERAL_INTEGER);
286 pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_ID);
David Neto78c3b432015-08-27 13:03:52 -0400287 return true;
David Neto78c3b432015-08-27 13:03:52 -0400288 default:
289 break;
290 }
291 return false;
292}
293
Dejan Mircevski50babb22015-09-29 10:56:32 -0400294spv_operand_type_t spvTakeFirstMatchableOperand(
295 spv_operand_pattern_t* pattern) {
David Neto78c3b432015-08-27 13:03:52 -0400296 assert(!pattern->empty());
297 spv_operand_type_t result;
298 do {
Chris Forbes78338d52017-06-27 16:28:22 -0700299 result = pattern->back();
300 pattern->pop_back();
Dejan Mircevski50babb22015-09-29 10:56:32 -0400301 } while (spvExpandOperandSequenceOnce(result, pattern));
David Neto78c3b432015-08-27 13:03:52 -0400302 return result;
303}
Dejan Mircevski903f9d62015-09-28 17:04:39 -0400304
Dejan Mircevski897bff92015-09-29 10:38:18 -0400305spv_operand_pattern_t spvAlternatePatternFollowingImmediate(
306 const spv_operand_pattern_t& pattern) {
Chris Forbes78338d52017-06-27 16:28:22 -0700307
308 auto it = std::find(pattern.crbegin(), pattern.crend(), SPV_OPERAND_TYPE_RESULT_ID);
309 if (it != pattern.crend()) {
310 spv_operand_pattern_t alternatePattern(it - pattern.crbegin() + 2, SPV_OPERAND_TYPE_OPTIONAL_CIV);
311 alternatePattern[1] = SPV_OPERAND_TYPE_RESULT_ID;
312 return alternatePattern;
Dejan Mircevski903f9d62015-09-28 17:04:39 -0400313 }
Chris Forbes78338d52017-06-27 16:28:22 -0700314
Dejan Mircevski897bff92015-09-29 10:38:18 -0400315 // No result-id found, so just expect CIVs.
Chris Forbes78338d52017-06-27 16:28:22 -0700316 return{ SPV_OPERAND_TYPE_OPTIONAL_CIV };
Dejan Mircevski903f9d62015-09-28 17:04:39 -0400317}
Dejan Mircevski961f5dc2016-01-15 11:25:11 -0500318
319bool spvIsIdType(spv_operand_type_t type) {
320 switch (type) {
321 case SPV_OPERAND_TYPE_ID:
322 case SPV_OPERAND_TYPE_TYPE_ID:
323 case SPV_OPERAND_TYPE_RESULT_ID:
324 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID:
325 case SPV_OPERAND_TYPE_SCOPE_ID:
326 return true;
327 default:
328 return false;
329 }
Dejan Mircevski961f5dc2016-01-15 11:25:11 -0500330}
Andrey Tuganovb36acbe2017-08-09 14:01:12 -0400331
332std::function<bool(unsigned)> spvOperandCanBeForwardDeclaredFunction(
333 SpvOp opcode) {
334 std::function<bool(unsigned index)> out;
335 switch (opcode) {
336 case SpvOpExecutionMode:
337 case SpvOpEntryPoint:
338 case SpvOpName:
339 case SpvOpMemberName:
340 case SpvOpSelectionMerge:
341 case SpvOpDecorate:
342 case SpvOpMemberDecorate:
343 case SpvOpTypeStruct:
344 case SpvOpBranch:
345 case SpvOpLoopMerge:
346 out = [](unsigned) { return true; };
347 break;
348 case SpvOpGroupDecorate:
349 case SpvOpGroupMemberDecorate:
350 case SpvOpBranchConditional:
351 case SpvOpSwitch:
352 out = [](unsigned index) { return index != 0; };
353 break;
354
355 case SpvOpFunctionCall:
356 // The Function parameter.
357 out = [](unsigned index) { return index == 2; };
358 break;
359
360 case SpvOpPhi:
361 out = [](unsigned index) { return index > 1; };
362 break;
363
364 case SpvOpEnqueueKernel:
365 // The Invoke parameter.
366 out = [](unsigned index) { return index == 8; };
367 break;
368
369 case SpvOpGetKernelNDrangeSubGroupCount:
370 case SpvOpGetKernelNDrangeMaxSubGroupSize:
371 // The Invoke parameter.
372 out = [](unsigned index) { return index == 3; };
373 break;
374
375 case SpvOpGetKernelWorkGroupSize:
376 case SpvOpGetKernelPreferredWorkGroupSizeMultiple:
377 // The Invoke parameter.
378 out = [](unsigned index) { return index == 2; };
379 break;
380 case SpvOpTypeForwardPointer:
381 out = [](unsigned index) { return index == 0; };
382 break;
383 default:
384 out = [](unsigned) { return false; };
385 break;
386 }
387 return out;
388}