blob: 3176eb7d0044875b953c873ef1e82d808fcc51be [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
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040023spv_result_t spvOperandTableGet(spv_operand_table* pOperandTable,
24 spv_target_env env) {
Lei Zhang40056702015-09-11 14:31:27 -040025 if (!pOperandTable) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010026
Lei Zhang16981f82017-09-21 17:24:57 -040027#include "operand.kinds-1.0.inc"
28#include "operand.kinds-1.1.inc"
29#include "operand.kinds-1.2.inc"
30
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040031 static const spv_operand_table_t table_1_0 = {
Lei Zhang16981f82017-09-21 17:24:57 -040032 ARRAY_SIZE(pygen_variable_OperandInfoTable_1_0),
33 pygen_variable_OperandInfoTable_1_0};
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040034 static const spv_operand_table_t table_1_1 = {
Lei Zhang16981f82017-09-21 17:24:57 -040035 ARRAY_SIZE(pygen_variable_OperandInfoTable_1_1),
36 pygen_variable_OperandInfoTable_1_1};
David Netodbc20492017-03-14 12:43:41 -040037 static const spv_operand_table_t table_1_2 = {
Lei Zhang16981f82017-09-21 17:24:57 -040038 ARRAY_SIZE(pygen_variable_OperandInfoTable_1_2),
39 pygen_variable_OperandInfoTable_1_2};
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010040
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040041 switch (env) {
42 case SPV_ENV_UNIVERSAL_1_0:
43 case SPV_ENV_VULKAN_1_0:
David Netoc2967012016-08-05 18:19:30 -040044 case SPV_ENV_OPENCL_2_1:
45 case SPV_ENV_OPENGL_4_0:
46 case SPV_ENV_OPENGL_4_1:
47 case SPV_ENV_OPENGL_4_2:
48 case SPV_ENV_OPENGL_4_3:
49 case SPV_ENV_OPENGL_4_5:
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040050 *pOperandTable = &table_1_0;
51 return SPV_SUCCESS;
52 case SPV_ENV_UNIVERSAL_1_1:
53 *pOperandTable = &table_1_1;
54 return SPV_SUCCESS;
David Netodbc20492017-03-14 12:43:41 -040055 case SPV_ENV_UNIVERSAL_1_2:
56 case SPV_ENV_OPENCL_2_2:
57 *pOperandTable = &table_1_2;
58 return SPV_SUCCESS;
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040059 }
60 assert(0 && "Unknown spv_target_env in spvOperandTableGet()");
61 return SPV_ERROR_INVALID_TABLE;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010062}
63
Dejan Mircevski3e6b2df2016-01-07 11:00:38 -050064#undef ARRAY_SIZE
65
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010066spv_result_t spvOperandTableNameLookup(const spv_operand_table table,
67 const spv_operand_type_t type,
David Neto388c40d2015-09-16 16:42:56 -040068 const char* name,
69 const size_t nameLength,
70 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -040071 if (!table) return SPV_ERROR_INVALID_TABLE;
72 if (!name || !pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010073
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010074 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
Lei Zhangca1bf942016-04-27 16:47:13 -040075 const auto& group = table->types[typeIndex];
76 if (type != group.type) continue;
77 for (uint64_t index = 0; index < group.count; ++index) {
78 const auto& entry = group.entries[index];
79 if (nameLength == strlen(entry.name) &&
80 !strncmp(entry.name, name, nameLength)) {
81 *pEntry = &entry;
82 return SPV_SUCCESS;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010083 }
84 }
85 }
86
87 return SPV_ERROR_INVALID_LOOKUP;
88}
89
90spv_result_t spvOperandTableValueLookup(const spv_operand_table table,
91 const spv_operand_type_t type,
92 const uint32_t value,
Dejan Mircevski50babb22015-09-29 10:56:32 -040093 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -040094 if (!table) return SPV_ERROR_INVALID_TABLE;
95 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010096
97 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
Lei Zhangca1bf942016-04-27 16:47:13 -040098 const auto& group = table->types[typeIndex];
99 if (type != group.type) continue;
100 for (uint64_t index = 0; index < group.count; ++index) {
101 const auto& entry = group.entries[index];
102 if (value == entry.value) {
103 *pEntry = &entry;
104 return SPV_SUCCESS;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100105 }
106 }
107 }
108
109 return SPV_ERROR_INVALID_LOOKUP;
110}
111
Dejan Mircevski50babb22015-09-29 10:56:32 -0400112const char* spvOperandTypeStr(spv_operand_type_t type) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100113 switch (type) {
114 case SPV_OPERAND_TYPE_ID:
David Netofadbf622015-09-14 17:07:11 -0400115 case SPV_OPERAND_TYPE_OPTIONAL_ID:
David Netofadbf622015-09-14 17:07:11 -0400116 return "ID";
David Neto201caf72015-11-04 17:38:17 -0500117 case SPV_OPERAND_TYPE_TYPE_ID:
118 return "type ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100119 case SPV_OPERAND_TYPE_RESULT_ID:
120 return "result ID";
Lei Zhang6483bd72015-10-14 17:02:39 -0400121 case SPV_OPERAND_TYPE_LITERAL_INTEGER:
David Neto201caf72015-11-04 17:38:17 -0500122 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER:
123 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100124 return "literal number";
David Neto201caf72015-11-04 17:38:17 -0500125 case SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER:
126 return "possibly multi-word literal integer";
127 case SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER:
128 return "possibly multi-word literal number";
129 case SPV_OPERAND_TYPE_EXTENSION_INSTRUCTION_NUMBER:
130 return "extension instruction number";
David Neto0f166be2015-11-11 01:56:49 -0500131 case SPV_OPERAND_TYPE_SPEC_CONSTANT_OP_NUMBER:
132 return "OpSpecConstantOp opcode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100133 case SPV_OPERAND_TYPE_LITERAL_STRING:
David Neto201caf72015-11-04 17:38:17 -0500134 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100135 return "literal string";
136 case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
Dejan Mircevskid2c81cf2015-10-09 11:06:10 -0400137 return "source language";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100138 case SPV_OPERAND_TYPE_EXECUTION_MODEL:
139 return "execution model";
140 case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
141 return "addressing model";
142 case SPV_OPERAND_TYPE_MEMORY_MODEL:
143 return "memory model";
144 case SPV_OPERAND_TYPE_EXECUTION_MODE:
145 return "execution mode";
146 case SPV_OPERAND_TYPE_STORAGE_CLASS:
147 return "storage class";
148 case SPV_OPERAND_TYPE_DIMENSIONALITY:
149 return "dimensionality";
150 case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
David Netod9ad0502015-11-24 18:37:24 -0500151 return "sampler addressing mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100152 case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
153 return "sampler filter mode";
David Netob30a0c52015-09-16 15:56:43 -0400154 case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
Dejan Mircevski971b3442015-10-13 12:54:47 -0400155 return "image format";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100156 case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
Dejan Mircevski355cc0c2015-10-13 15:02:03 -0400157 return "floating-point fast math mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100158 case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
Dejan Mircevski355cc0c2015-10-13 15:02:03 -0400159 return "floating-point rounding mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100160 case SPV_OPERAND_TYPE_LINKAGE_TYPE:
161 return "linkage type";
162 case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
David Neto2889a0c2016-02-15 13:50:00 -0500163 case SPV_OPERAND_TYPE_OPTIONAL_ACCESS_QUALIFIER:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100164 return "access qualifier";
165 case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
166 return "function parameter attribute";
167 case SPV_OPERAND_TYPE_DECORATION:
168 return "decoration";
169 case SPV_OPERAND_TYPE_BUILT_IN:
Dejan Mircevskid7b0f832015-10-13 15:39:38 -0400170 return "built-in";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100171 case SPV_OPERAND_TYPE_SELECTION_CONTROL:
172 return "selection control";
173 case SPV_OPERAND_TYPE_LOOP_CONTROL:
174 return "loop control";
175 case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
176 return "function control";
David Neto64a9be92015-11-18 15:48:32 -0500177 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID:
David Netod9ad0502015-11-24 18:37:24 -0500178 return "memory semantics ID";
David Neto201caf72015-11-04 17:38:17 -0500179 case SPV_OPERAND_TYPE_MEMORY_ACCESS:
David Neto78c3b432015-08-27 13:03:52 -0400180 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100181 return "memory access";
David Neto64a9be92015-11-18 15:48:32 -0500182 case SPV_OPERAND_TYPE_SCOPE_ID:
David Netod9ad0502015-11-24 18:37:24 -0500183 return "scope ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100184 case SPV_OPERAND_TYPE_GROUP_OPERATION:
185 return "group operation";
186 case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
187 return "kernel enqeue flags";
David Neto47994822015-08-27 13:11:01 -0400188 case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100189 return "kernel profiling info";
190 case SPV_OPERAND_TYPE_CAPABILITY:
191 return "capability";
David Neto201caf72015-11-04 17:38:17 -0500192 case SPV_OPERAND_TYPE_IMAGE:
David Netoee1b3bb2015-09-18 11:19:18 -0400193 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
David Netod9ad0502015-11-24 18:37:24 -0500194 return "image";
David Neto201caf72015-11-04 17:38:17 -0500195 case SPV_OPERAND_TYPE_OPTIONAL_CIV:
196 return "context-insensitive value";
197
198 // The next values are for values returned from an instruction, not actually
199 // an operand. So the specific strings don't matter. But let's add them
200 // for completeness and ease of testing.
201 case SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER:
202 return "image channel order";
203 case SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE:
204 return "image channel data type";
205
David Neto78c3b432015-08-27 13:03:52 -0400206 case SPV_OPERAND_TYPE_NONE:
207 return "NONE";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100208 default:
209 assert(0 && "Unhandled operand type!");
210 break;
211 }
212 return "unknown";
213}
David Neto78c3b432015-08-27 13:03:52 -0400214
Chris Forbes78338d52017-06-27 16:28:22 -0700215void spvPushOperandTypes(const spv_operand_type_t* types,
216 spv_operand_pattern_t* pattern) {
David Neto78c3b432015-08-27 13:03:52 -0400217 const spv_operand_type_t* endTypes;
Dejan Mircevski50babb22015-09-29 10:56:32 -0400218 for (endTypes = types; *endTypes != SPV_OPERAND_TYPE_NONE; ++endTypes)
David Neto78c3b432015-08-27 13:03:52 -0400219 ;
Chris Forbes78338d52017-06-27 16:28:22 -0700220 while (endTypes-- != types) {
Lei Zhang16981f82017-09-21 17:24:57 -0400221 pattern->push_back(*endTypes);
Chris Forbes78338d52017-06-27 16:28:22 -0700222 }
David Neto78c3b432015-08-27 13:03:52 -0400223}
224
Chris Forbes78338d52017-06-27 16:28:22 -0700225void spvPushOperandTypesForMask(const spv_operand_table operandTable,
226 const spv_operand_type_t type,
227 const uint32_t mask,
228 spv_operand_pattern_t* pattern) {
229 // Scan from highest bits to lowest bits because we will append in LIFO
230 // fashion, and we need the operands for lower order bits to be consumed first
Lei Zhang16981f82017-09-21 17:24:57 -0400231 for (uint32_t candidate_bit = (1u << 31u); candidate_bit;
232 candidate_bit >>= 1) {
David Neto5bf88fc2015-09-17 17:06:10 -0400233 if (candidate_bit & mask) {
234 spv_operand_desc entry = nullptr;
235 if (SPV_SUCCESS == spvOperandTableValueLookup(operandTable, type,
236 candidate_bit, &entry)) {
Chris Forbes78338d52017-06-27 16:28:22 -0700237 spvPushOperandTypes(entry->operandTypes, pattern);
David Neto5bf88fc2015-09-17 17:06:10 -0400238 }
239 }
240 }
241}
242
David Netob5267562016-02-02 12:05:34 -0500243bool spvOperandIsConcreteMask(spv_operand_type_t type) {
244 return SPV_OPERAND_TYPE_FIRST_CONCRETE_MASK_TYPE <= type &&
245 type <= SPV_OPERAND_TYPE_LAST_CONCRETE_MASK_TYPE;
246}
247
David Neto78c3b432015-08-27 13:03:52 -0400248bool spvOperandIsOptional(spv_operand_type_t type) {
David Neto201caf72015-11-04 17:38:17 -0500249 return SPV_OPERAND_TYPE_FIRST_OPTIONAL_TYPE <= type &&
250 type <= SPV_OPERAND_TYPE_LAST_OPTIONAL_TYPE;
David Neto78c3b432015-08-27 13:03:52 -0400251}
252
253bool spvOperandIsVariable(spv_operand_type_t type) {
David Neto201caf72015-11-04 17:38:17 -0500254 return SPV_OPERAND_TYPE_FIRST_VARIABLE_TYPE <= type &&
255 type <= SPV_OPERAND_TYPE_LAST_VARIABLE_TYPE;
David Neto78c3b432015-08-27 13:03:52 -0400256}
257
David Neto78c3b432015-08-27 13:03:52 -0400258bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
259 spv_operand_pattern_t* pattern) {
260 switch (type) {
261 case SPV_OPERAND_TYPE_VARIABLE_ID:
Chris Forbes78338d52017-06-27 16:28:22 -0700262 pattern->push_back(type);
263 pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_ID);
David Neto78c3b432015-08-27 13:03:52 -0400264 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -0400265 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER:
Chris Forbes78338d52017-06-27 16:28:22 -0700266 pattern->push_back(type);
267 pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER);
David Neto78c3b432015-08-27 13:03:52 -0400268 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -0400269 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER_ID:
David Neto201caf72015-11-04 17:38:17 -0500270 // Represents Zero or more (Literal number, Id) pairs,
271 // where the literal number must be a scalar integer.
Chris Forbes78338d52017-06-27 16:28:22 -0700272 pattern->push_back(type);
273 pattern->push_back(SPV_OPERAND_TYPE_ID);
274 pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER);
David Neto78c3b432015-08-27 13:03:52 -0400275 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -0400276 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_INTEGER:
David Neto561dc4e2015-09-25 14:23:29 -0400277 // Represents Zero or more (Id, Literal number) pairs.
Chris Forbes78338d52017-06-27 16:28:22 -0700278 pattern->push_back(type);
279 pattern->push_back(SPV_OPERAND_TYPE_LITERAL_INTEGER);
280 pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_ID);
David Neto78c3b432015-08-27 13:03:52 -0400281 return true;
David Neto78c3b432015-08-27 13:03:52 -0400282 default:
283 break;
284 }
285 return false;
286}
287
Dejan Mircevski50babb22015-09-29 10:56:32 -0400288spv_operand_type_t spvTakeFirstMatchableOperand(
289 spv_operand_pattern_t* pattern) {
David Neto78c3b432015-08-27 13:03:52 -0400290 assert(!pattern->empty());
291 spv_operand_type_t result;
292 do {
Chris Forbes78338d52017-06-27 16:28:22 -0700293 result = pattern->back();
294 pattern->pop_back();
Dejan Mircevski50babb22015-09-29 10:56:32 -0400295 } while (spvExpandOperandSequenceOnce(result, pattern));
David Neto78c3b432015-08-27 13:03:52 -0400296 return result;
297}
Dejan Mircevski903f9d62015-09-28 17:04:39 -0400298
Dejan Mircevski897bff92015-09-29 10:38:18 -0400299spv_operand_pattern_t spvAlternatePatternFollowingImmediate(
300 const spv_operand_pattern_t& pattern) {
Lei Zhang16981f82017-09-21 17:24:57 -0400301 auto it =
302 std::find(pattern.crbegin(), pattern.crend(), SPV_OPERAND_TYPE_RESULT_ID);
Chris Forbes78338d52017-06-27 16:28:22 -0700303 if (it != pattern.crend()) {
Lei Zhang16981f82017-09-21 17:24:57 -0400304 spv_operand_pattern_t alternatePattern(it - pattern.crbegin() + 2,
305 SPV_OPERAND_TYPE_OPTIONAL_CIV);
Chris Forbes78338d52017-06-27 16:28:22 -0700306 alternatePattern[1] = SPV_OPERAND_TYPE_RESULT_ID;
307 return alternatePattern;
Dejan Mircevski903f9d62015-09-28 17:04:39 -0400308 }
Chris Forbes78338d52017-06-27 16:28:22 -0700309
Dejan Mircevski897bff92015-09-29 10:38:18 -0400310 // No result-id found, so just expect CIVs.
Lei Zhang16981f82017-09-21 17:24:57 -0400311 return {SPV_OPERAND_TYPE_OPTIONAL_CIV};
Dejan Mircevski903f9d62015-09-28 17:04:39 -0400312}
Dejan Mircevski961f5dc2016-01-15 11:25:11 -0500313
314bool spvIsIdType(spv_operand_type_t type) {
315 switch (type) {
316 case SPV_OPERAND_TYPE_ID:
317 case SPV_OPERAND_TYPE_TYPE_ID:
318 case SPV_OPERAND_TYPE_RESULT_ID:
319 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID:
320 case SPV_OPERAND_TYPE_SCOPE_ID:
321 return true;
322 default:
323 return false;
324 }
Dejan Mircevski961f5dc2016-01-15 11:25:11 -0500325}
Andrey Tuganovb36acbe2017-08-09 14:01:12 -0400326
327std::function<bool(unsigned)> spvOperandCanBeForwardDeclaredFunction(
328 SpvOp opcode) {
329 std::function<bool(unsigned index)> out;
330 switch (opcode) {
331 case SpvOpExecutionMode:
332 case SpvOpEntryPoint:
333 case SpvOpName:
334 case SpvOpMemberName:
335 case SpvOpSelectionMerge:
336 case SpvOpDecorate:
337 case SpvOpMemberDecorate:
338 case SpvOpTypeStruct:
339 case SpvOpBranch:
340 case SpvOpLoopMerge:
341 out = [](unsigned) { return true; };
342 break;
343 case SpvOpGroupDecorate:
344 case SpvOpGroupMemberDecorate:
345 case SpvOpBranchConditional:
346 case SpvOpSwitch:
347 out = [](unsigned index) { return index != 0; };
348 break;
349
350 case SpvOpFunctionCall:
351 // The Function parameter.
352 out = [](unsigned index) { return index == 2; };
353 break;
354
355 case SpvOpPhi:
356 out = [](unsigned index) { return index > 1; };
357 break;
358
359 case SpvOpEnqueueKernel:
360 // The Invoke parameter.
361 out = [](unsigned index) { return index == 8; };
362 break;
363
364 case SpvOpGetKernelNDrangeSubGroupCount:
365 case SpvOpGetKernelNDrangeMaxSubGroupSize:
366 // The Invoke parameter.
367 out = [](unsigned index) { return index == 3; };
368 break;
369
370 case SpvOpGetKernelWorkGroupSize:
371 case SpvOpGetKernelPreferredWorkGroupSizeMultiple:
372 // The Invoke parameter.
373 out = [](unsigned index) { return index == 2; };
374 break;
375 case SpvOpTypeForwardPointer:
376 out = [](unsigned index) { return index == 0; };
377 break;
378 default:
379 out = [](unsigned) { return false; };
380 break;
381 }
382 return out;
383}