111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Copyright (c) 2015-2016 The Khronos Group Inc. 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Permission is hereby granted, free of charge, to any person obtaining a 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// copy of this software and/or associated documentation files (the 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// "Materials"), to deal in the Materials without restriction, including 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// without limitation the rights to use, copy, modify, merge, publish, 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// distribute, sublicense, and/or sell copies of the Materials, and to 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// permit persons to whom the Materials are furnished to do so, subject to 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// the following conditions: 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// The above copyright notice and this permission notice shall be included 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// in all copies or substantial portions of the Materials. 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// https://www.khronos.org/registry/ 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "validate.h" 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cassert> 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <iostream> 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <unordered_map> 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <vector> 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "diagnostic.h" 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "instruction.h" 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "opcode.h" 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "spirv-tools/libspirv.h" 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "val/ValidationState.h" 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define spvCheck(condition, action) \ 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (condition) { \ 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert action; \ 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertusing UseDefTracker = libspirv::ValidationState_t::UseDefTracker; 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace { 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass idUsage { 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert idUsage(const spv_opcode_table opcodeTableArg, 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_operand_table operandTableArg, 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_ext_inst_table extInstTableArg, 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t* pInsts, const uint64_t instCountArg, 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const SpvMemoryModel memoryModelArg, 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const SpvAddressingModel addressingModelArg, 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const UseDefTracker& usedefs, 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const std::vector<uint32_t>& entry_points, spv_position positionArg, 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spv_diagnostic* pDiagnosticArg) 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : opcodeTable(opcodeTableArg), 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operandTable(operandTableArg), 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert extInstTable(extInstTableArg), 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert firstInst(pInsts), 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert instCount(instCountArg), 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert memoryModel(memoryModelArg), 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert addressingModel(addressingModelArg), 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert position(positionArg), 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert pDiagnostic(pDiagnosticArg), 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert usedefs_(usedefs), 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert entry_points_(entry_points) {} 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool isValid(const spv_instruction_t* inst); 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template <SpvOp> 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool isValid(const spv_instruction_t* inst, const spv_opcode_desc); 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert private: 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_table opcodeTable; 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_operand_table operandTable; 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_ext_inst_table extInstTable; 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t* const firstInst; 8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const uint64_t instCount; 8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const SpvMemoryModel memoryModel; 8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const SpvAddressingModel addressingModel; 8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spv_position position; 8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spv_diagnostic* pDiagnostic; 8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert UseDefTracker usedefs_; 8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::vector<uint32_t> entry_points_; 9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define DIAG(INDEX) \ 9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert position->index += INDEX; \ 9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAGNOSTIC 9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 9711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpUndef>(const spv_instruction_t *inst, 9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(0 && "Unimplemented!"); 10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif // 0 10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpMemberName>(const spv_instruction_t* inst, 10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto typeIndex = 1; 10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto type = usedefs_.FindDef(inst->words[typeIndex]); 11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!type.first || SpvOpTypeStruct != type.second.opcode) { 11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(typeIndex) << "OpMemberName Type <id> '" << inst->words[typeIndex] 11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a struct type."; 11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto memberIndex = 2; 11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto member = inst->words[memberIndex]; 11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto memberCount = (uint32_t)(type.second.words.size() - 2); 11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(memberCount <= member, DIAG(memberIndex) 11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "OpMemberName Member <id> '" 12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[memberIndex] 12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' index is larger than Type <id> '" 12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << type.second.id << "'s member count."; 12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpLine>(const spv_instruction_t* inst, 12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto fileIndex = 1; 13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto file = usedefs_.FindDef(inst->words[fileIndex]); 13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!file.first || SpvOpString != file.second.opcode) { 13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(fileIndex) << "OpLine Target <id> '" << inst->words[fileIndex] 13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not an OpString."; 13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpMemberDecorate>(const spv_instruction_t* inst, 14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto structTypeIndex = 1; 14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto structType = usedefs_.FindDef(inst->words[structTypeIndex]); 14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!structType.first || SpvOpTypeStruct != structType.second.opcode) { 14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(structTypeIndex) << "OpMemberDecorate Structure type <id> '" 14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[structTypeIndex] 14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a struct type."; 14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto memberIndex = 2; 15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto member = inst->words[memberIndex]; 15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto memberCount = static_cast<uint32_t>(structType.second.words.size() - 2); 15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(memberCount < member, DIAG(memberIndex) 15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "OpMemberDecorate Structure type <id> '" 15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[memberIndex] 15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' member count is less than Member"; 15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpGroupDecorate>(const spv_instruction_t* inst, 16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto decorationGroupIndex = 1; 16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto decorationGroup = usedefs_.FindDef(inst->words[decorationGroupIndex]); 16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!decorationGroup.first || 16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert SpvOpDecorationGroup != decorationGroup.second.opcode) { 16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(decorationGroupIndex) << "OpGroupDecorate Decoration group <id> '" 17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[decorationGroupIndex] 17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a decoration group."; 17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 17811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpGroupMemberDecorate>( 18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif // 0 18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 18411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpExtInst>(const spv_instruction_t *inst, 18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif // 0 18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 18911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpEntryPoint>(const spv_instruction_t* inst, 19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto entryPointIndex = 2; 19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto entryPoint = usedefs_.FindDef(inst->words[entryPointIndex]); 19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!entryPoint.first || SpvOpFunction != entryPoint.second.opcode) { 19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(entryPointIndex) << "OpEntryPoint Entry Point <id> '" 19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[entryPointIndex] 19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a function."; 19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // don't check kernel function signatures 20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto executionModel = inst->words[1]; 20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (executionModel != SpvExecutionModelKernel) { 20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // TODO: Check the entry point signature is void main(void), may be subject 20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // to change 20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto entryPointType = usedefs_.FindDef(entryPoint.second.words[4]); 20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!entryPointType.first || 3 != entryPointType.second.words.size()) { 20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(entryPointIndex) << "OpEntryPoint Entry Point <id> '" 20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[entryPointIndex] 20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "'s function parameter count is not zero."; 21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto returnType = usedefs_.FindDef(entryPoint.second.type_id); 21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!returnType.first || SpvOpTypeVoid != returnType.second.opcode) { 21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(entryPointIndex) << "OpEntryPoint Entry Point <id> '" 21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[entryPointIndex] 21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "'s function return type is not void."; 21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 22311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpExecutionMode>(const spv_instruction_t* inst, 22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto entryPointIndex = 1; 22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto entryPointID = inst->words[entryPointIndex]; 22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto found = 22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::find(entry_points_.cbegin(), entry_points_.cend(), entryPointID); 23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (found == entry_points_.cend()) { 23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(entryPointIndex) << "OpExecutionMode Entry Point <id> '" 23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[entryPointIndex] 23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not the Entry Point " 23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert "operand of an OpEntryPoint."; 23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 24011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpTypeVector>(const spv_instruction_t* inst, 24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto componentIndex = 2; 24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto componentType = usedefs_.FindDef(inst->words[componentIndex]); 24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!componentType.first || 24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert !spvOpcodeIsScalarType(componentType.second.opcode)) { 24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(componentIndex) << "OpTypeVector Component Type <id> '" 24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[componentIndex] 24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a scalar type."; 25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 25511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpTypeMatrix>(const spv_instruction_t* inst, 25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto columnTypeIndex = 2; 25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto columnType = usedefs_.FindDef(inst->words[columnTypeIndex]); 26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!columnType.first || SpvOpTypeVector != columnType.second.opcode) { 26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(columnTypeIndex) << "OpTypeMatrix Column Type <id> '" 26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[columnTypeIndex] 26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a vector."; 26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 26911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpTypeSampler>(const spv_instruction_t*, 27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // OpTypeSampler takes no arguments in Rev31 and beyond. 27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// True if the integer constant is > 0. constWords are words of the 27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// constant-defining instruction (either OpConstant or 27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// OpSpecConstant). typeWords are the words of the constant's-type-defining 27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// OpTypeInt. 28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool aboveZero(const std::vector<uint32_t>& constWords, 28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const std::vector<uint32_t>& typeWords) { 28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const uint32_t width = typeWords[2]; 28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const bool is_signed = typeWords[3] > 0; 28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const uint32_t loWord = constWords[3]; 28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (width > 32) { 28611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // The spec currently doesn't allow integers wider than 64 bits. 28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const uint32_t hiWord = constWords[4]; // Must exist, per spec. 28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (is_signed && (hiWord >> 31)) return false; 28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return (loWord | hiWord) > 0; 29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } else { 29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (is_signed && (loWord >> 31)) return false; 29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return loWord > 0; 29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 29611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpTypeArray>(const spv_instruction_t* inst, 29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto elementTypeIndex = 2; 30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto elementType = usedefs_.FindDef(inst->words[elementTypeIndex]); 30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!elementType.first || 30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert !spvOpcodeGeneratesType(elementType.second.opcode)) { 30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(elementTypeIndex) << "OpTypeArray Element Type <id> '" 30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[elementTypeIndex] 30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a type."; 30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto lengthIndex = 3; 30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto length = usedefs_.FindDef(inst->words[lengthIndex]); 31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!length.first || !spvOpcodeIsConstant(length.second.opcode)) { 31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(lengthIndex) << "OpTypeArray Length <id> '" << inst->words[lengthIndex] 31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a scalar constant type."; 31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // NOTE: Check the initialiser value of the constant 31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto constInst = length.second.words; 31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto constResultTypeIndex = 1; 31911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto constResultType = usedefs_.FindDef(constInst[constResultTypeIndex]); 32011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!constResultType.first || SpvOpTypeInt != constResultType.second.opcode) { 32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(lengthIndex) << "OpTypeArray Length <id> '" << inst->words[lengthIndex] 32211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a constant integer type."; 32311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 32411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 32611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert switch (length.second.opcode) { 32711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case SpvOpSpecConstant: 32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case SpvOpConstant: 32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (aboveZero(length.second.words, constResultType.second.words)) break; 33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Else fall through! 33111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case SpvOpConstantNull: { 33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(lengthIndex) << "OpTypeArray Length <id> '" 33311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[lengthIndex] 33411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' default value must be at least 1."; 33511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 33611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 33711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case SpvOpSpecConstantOp: 33811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Assume it's OK, rather than try to evaluate the operation. 33911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert break; 34011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert default: 34111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(0 && "bug in spvOpcodeIsConstant() or result type isn't int"); 34211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 34311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 34411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 34511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 34611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 34711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpTypeRuntimeArray>(const spv_instruction_t* inst, 34811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 34911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto elementTypeIndex = 2; 35011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto elementType = usedefs_.FindDef(inst->words[elementTypeIndex]); 35111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!elementType.first || 35211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert !spvOpcodeGeneratesType(elementType.second.opcode)) { 35311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(elementTypeIndex) << "OpTypeRuntimeArray Element Type <id> '" 35411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[elementTypeIndex] 35511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a type."; 35611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 35711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 35811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 35911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 36011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 36111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 36211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpTypeStruct>(const spv_instruction_t* inst, 36311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 36411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for (size_t memberTypeIndex = 2; memberTypeIndex < inst->words.size(); 36511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ++memberTypeIndex) { 36611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto memberType = usedefs_.FindDef(inst->words[memberTypeIndex]); 36711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!memberType.first || 36811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert !spvOpcodeGeneratesType(memberType.second.opcode)) { 36911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(memberTypeIndex) << "OpTypeStruct Member Type <id> '" 37011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[memberTypeIndex] 37111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a type."; 37211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 37311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 37411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 37511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 37611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 37711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 37811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 37911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpTypePointer>(const spv_instruction_t* inst, 38011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 38111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto typeIndex = 3; 38211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto type = usedefs_.FindDef(inst->words[typeIndex]); 38311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!type.first || !spvOpcodeGeneratesType(type.second.opcode)) { 38411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(typeIndex) << "OpTypePointer Type <id> '" << inst->words[typeIndex] 38511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a type."; 38611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 38711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 38811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 38911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 39011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 39111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 39211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpTypeFunction>(const spv_instruction_t* inst, 39311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 39411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto returnTypeIndex = 2; 39511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto returnType = usedefs_.FindDef(inst->words[returnTypeIndex]); 39611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!returnType.first || !spvOpcodeGeneratesType(returnType.second.opcode)) { 39711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(returnTypeIndex) << "OpTypeFunction Return Type <id> '" 39811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[returnTypeIndex] << "' is not a type."; 39911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 40011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 40111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for (size_t paramTypeIndex = 3; paramTypeIndex < inst->words.size(); 40211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ++paramTypeIndex) { 40311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto paramType = usedefs_.FindDef(inst->words[paramTypeIndex]); 40411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!paramType.first || !spvOpcodeGeneratesType(paramType.second.opcode)) { 40511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(paramTypeIndex) << "OpTypeFunction Parameter Type <id> '" 40611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[paramTypeIndex] << "' is not a type."; 40711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 40811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 40911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 41011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 41111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 41211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 41311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 41411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpTypePipe>(const spv_instruction_t*, 41511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 41611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // OpTypePipe has no ID arguments. 41711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 41811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 41911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 42011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 42111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpConstantTrue>(const spv_instruction_t* inst, 42211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 42311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultTypeIndex = 1; 42411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultType = usedefs_.FindDef(inst->words[resultTypeIndex]); 42511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!resultType.first || SpvOpTypeBool != resultType.second.opcode) { 42611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(resultTypeIndex) << "OpConstantTrue Result Type <id> '" 42711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[resultTypeIndex] 42811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a boolean type."; 42911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 43011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 43111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 43211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 43311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 43411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 43511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpConstantFalse>(const spv_instruction_t* inst, 43611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 43711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultTypeIndex = 1; 43811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultType = usedefs_.FindDef(inst->words[resultTypeIndex]); 43911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!resultType.first || SpvOpTypeBool != resultType.second.opcode) { 44011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(resultTypeIndex) << "OpConstantFalse Result Type <id> '" 44111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[resultTypeIndex] 44211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a boolean type."; 44311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 44411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 44511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 44611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 44711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 44811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 44911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpConstantComposite>(const spv_instruction_t* inst, 45011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 45111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultTypeIndex = 1; 45211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultType = usedefs_.FindDef(inst->words[resultTypeIndex]); 45311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!resultType.first || !spvOpcodeIsComposite(resultType.second.opcode)) { 45411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(resultTypeIndex) << "OpConstantComposite Result Type <id> '" 45511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[resultTypeIndex] 45611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a composite type."; 45711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 45811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 45911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 46011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto constituentCount = inst->words.size() - 3; 46111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert switch (resultType.second.opcode) { 46211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case SpvOpTypeVector: { 46311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto componentCount = resultType.second.words[3]; 46411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck( 46511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert componentCount != constituentCount, 46611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // TODO: Output ID's on diagnostic 46711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(inst->words.size() - 1) 46811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "OpConstantComposite Constituent <id> count does not match " 46911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert "Result Type <id> '" 47011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << resultType.second.id << "'s vector component count."; 47111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 47211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto componentType = usedefs_.FindDef(resultType.second.words[2]); 47311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(componentType.first); 47411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for (size_t constituentIndex = 3; constituentIndex < inst->words.size(); 47511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert constituentIndex++) { 47611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto constituent = usedefs_.FindDef(inst->words[constituentIndex]); 47711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!constituent.first || 47811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert !spvOpcodeIsConstant(constituent.second.opcode)) { 47911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(constituentIndex) << "OpConstantComposite Constituent <id> '" 48011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[constituentIndex] 48111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a constant."; 48211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 48311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 48411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto constituentResultType = 48511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert usedefs_.FindDef(constituent.second.type_id); 48611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!constituentResultType.first || 48711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert componentType.second.opcode != 48811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert constituentResultType.second.opcode) { 48911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(constituentIndex) << "OpConstantComposite Constituent <id> '" 49011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[constituentIndex] 49111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "'s type does not match Result Type <id> '" 49211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << resultType.second.id 49311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "'s vector element type."; 49411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 49511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 49611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 49711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } break; 49811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case SpvOpTypeMatrix: { 49911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto columnCount = resultType.second.words[3]; 50011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck( 50111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert columnCount != constituentCount, 50211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // TODO: Output ID's on diagnostic 50311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(inst->words.size() - 1) 50411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "OpConstantComposite Constituent <id> count does not match " 50511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert "Result Type <id> '" 50611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << resultType.second.id << "'s matrix column count."; 50711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 50811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 50911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto columnType = usedefs_.FindDef(resultType.second.words[2]); 51011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(columnType.first); 51111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto componentCount = columnType.second.words[3]; 51211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto componentType = usedefs_.FindDef(columnType.second.words[2]); 51311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(componentType.first); 51411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 51511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for (size_t constituentIndex = 3; constituentIndex < inst->words.size(); 51611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert constituentIndex++) { 51711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto constituent = usedefs_.FindDef(inst->words[constituentIndex]); 51811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!constituent.first || 51911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert SpvOpConstantComposite != constituent.second.opcode) { 52011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(constituentIndex) << "OpConstantComposite Constituent <id> '" 52111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[constituentIndex] 52211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a constant composite."; 52311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 52411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 52511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto vector = usedefs_.FindDef(constituent.second.type_id); 52611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(vector.first); 52711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(columnType.second.opcode != vector.second.opcode, 52811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(constituentIndex) 52911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "OpConstantComposite Constituent <id> '" 53011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[constituentIndex] 53111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' type does not match Result Type <id> '" 53211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << resultType.second.id << "'s matrix column type."; 53311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 53411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto vectorComponentType = usedefs_.FindDef(vector.second.words[2]); 53511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(vectorComponentType.first); 53611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(componentType.second.id != vectorComponentType.second.id, 53711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(constituentIndex) 53811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "OpConstantComposite Constituent <id> '" 53911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[constituentIndex] 54011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' component type does not match Result Type <id> '" 54111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << resultType.second.id 54211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "'s matrix column component type."; 54311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 54411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck( 54511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert componentCount != vector.second.words[3], 54611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(constituentIndex) 54711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "OpConstantComposite Constituent <id> '" 54811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[constituentIndex] 54911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' vector component count does not match Result Type <id> '" 55011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << resultType.second.id << "'s vector component count."; 55111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 55211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 55311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } break; 55411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case SpvOpTypeArray: { 55511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto elementType = usedefs_.FindDef(resultType.second.words[2]); 55611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(elementType.first); 55711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto length = usedefs_.FindDef(resultType.second.words[3]); 55811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(length.first); 55911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(length.second.words[3] != constituentCount, 56011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(inst->words.size() - 1) 56111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "OpConstantComposite Constituent count does not match " 56211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert "Result Type <id> '" 56311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << resultType.second.id << "'s array length."; 56411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 56511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for (size_t constituentIndex = 3; constituentIndex < inst->words.size(); 56611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert constituentIndex++) { 56711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto constituent = usedefs_.FindDef(inst->words[constituentIndex]); 56811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!constituent.first || 56911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert !spvOpcodeIsConstant(constituent.second.opcode)) { 57011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(constituentIndex) << "OpConstantComposite Constituent <id> '" 57111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[constituentIndex] 57211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a constant."; 57311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 57411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 57511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto constituentType = usedefs_.FindDef(constituent.second.type_id); 57611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(constituentType.first); 57711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(elementType.second.id != constituentType.second.id, 57811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(constituentIndex) 57911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "OpConstantComposite Constituent <id> '" 58011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[constituentIndex] 58111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "'s type does not match Result Type <id> '" 58211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << resultType.second.id << "'s array element type."; 58311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 58411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 58511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } break; 58611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case SpvOpTypeStruct: { 58711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto memberCount = resultType.second.words.size() - 2; 58811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(memberCount != constituentCount, 58911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(resultTypeIndex) 59011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "OpConstantComposite Constituent <id> '" 59111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[resultTypeIndex] 59211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' count does not match Result Type <id> '" 59311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << resultType.second.id << "'s struct member count."; 59411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 59511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for (uint32_t constituentIndex = 3, memberIndex = 2; 59611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert constituentIndex < inst->words.size(); 59711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert constituentIndex++, memberIndex++) { 59811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto constituent = usedefs_.FindDef(inst->words[constituentIndex]); 59911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!constituent.first || 60011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert !spvOpcodeIsConstant(constituent.second.opcode)) { 60111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(constituentIndex) << "OpConstantComposite Constituent <id> '" 60211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[constituentIndex] 60311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a constant."; 60411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 60511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 60611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto constituentType = usedefs_.FindDef(constituent.second.type_id); 60711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(constituentType.first); 60811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 60911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto memberType = 61011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert usedefs_.FindDef(resultType.second.words[memberIndex]); 61111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(memberType.first); 61211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(memberType.second.id != constituentType.second.id, 61311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(constituentIndex) 61411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "OpConstantComposite Constituent <id> '" 61511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[constituentIndex] 61611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' type does not match the Result Type <id> '" 61711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << resultType.second.id << "'s member type."; 61811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 61911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 62011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } break; 62111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert default: { assert(0 && "Unreachable!"); } break; 62211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 62311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 62411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 62511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 62611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 62711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpConstantSampler>(const spv_instruction_t* inst, 62811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 62911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultTypeIndex = 1; 63011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultType = usedefs_.FindDef(inst->words[resultTypeIndex]); 63111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!resultType.first || SpvOpTypeSampler != resultType.second.opcode) { 63211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(resultTypeIndex) << "OpConstantSampler Result Type <id> '" 63311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[resultTypeIndex] 63411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a sampler type."; 63511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 63611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 63711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 63811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 63911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 64011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// True if instruction defines a type that can have a null value, as defined by 64111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// the SPIR-V spec. Tracks composite-type components through usedefs to check 64211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// nullability transitively. 64311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool IsTypeNullable(const std::vector<uint32_t>& instruction, 64411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const UseDefTracker& usedefs) { 64511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint16_t opcode; 64611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint16_t word_count; 64711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvOpcodeSplit(instruction[0], &word_count, &opcode); 64811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert switch (static_cast<SpvOp>(opcode)) { 64911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case SpvOpTypeBool: 65011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case SpvOpTypeInt: 65111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case SpvOpTypeFloat: 65211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case SpvOpTypePointer: 65311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case SpvOpTypeEvent: 65411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case SpvOpTypeDeviceEvent: 65511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case SpvOpTypeReserveId: 65611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case SpvOpTypeQueue: 65711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 65811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case SpvOpTypeArray: 65911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case SpvOpTypeMatrix: 66011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case SpvOpTypeVector: { 66111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto base_type = usedefs.FindDef(instruction[2]); 66211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return base_type.first && IsTypeNullable(base_type.second.words, usedefs); 66311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 66411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case SpvOpTypeStruct: { 66511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for (size_t elementIndex = 2; elementIndex < instruction.size(); 66611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ++elementIndex) { 66711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto element = usedefs.FindDef(instruction[elementIndex]); 66811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!element.first || !IsTypeNullable(element.second.words, usedefs)) 66911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 67011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 67111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 67211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 67311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert default: 67411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 67511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 67611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 67711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 67811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 67911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpConstantNull>(const spv_instruction_t* inst, 68011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 68111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultTypeIndex = 1; 68211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultType = usedefs_.FindDef(inst->words[resultTypeIndex]); 68311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!resultType.first || !IsTypeNullable(resultType.second.words, usedefs_)) { 68411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(resultTypeIndex) << "OpConstantNull Result Type <id> '" 68511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[resultTypeIndex] 68611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' cannot have a null value."; 68711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 68811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 68911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 69011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 69111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 69211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 69311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpSpecConstantTrue>(const spv_instruction_t* inst, 69411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 69511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultTypeIndex = 1; 69611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultType = usedefs_.FindDef(inst->words[resultTypeIndex]); 69711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!resultType.first || SpvOpTypeBool != resultType.second.opcode) { 69811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(resultTypeIndex) << "OpSpecConstantTrue Result Type <id> '" 69911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[resultTypeIndex] 70011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a boolean type."; 70111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 70211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 70311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 70411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 70511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 70611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 70711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpSpecConstantFalse>(const spv_instruction_t* inst, 70811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 70911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultTypeIndex = 1; 71011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultType = usedefs_.FindDef(inst->words[resultTypeIndex]); 71111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!resultType.first || SpvOpTypeBool != resultType.second.opcode) { 71211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(resultTypeIndex) << "OpSpecConstantFalse Result Type <id> '" 71311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[resultTypeIndex] 71411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a boolean type."; 71511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 71611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 71711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 71811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 71911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 72011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 72111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 72211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpSpecConstantComposite>( 72311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 72411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 72511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 72611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 72711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 72811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpSpecConstantOp>(const spv_instruction_t *inst) {} 72911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 73011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 73111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 73211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpVariable>(const spv_instruction_t* inst, 73311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) { 73411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultTypeIndex = 1; 73511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultType = usedefs_.FindDef(inst->words[resultTypeIndex]); 73611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!resultType.first || SpvOpTypePointer != resultType.second.opcode) { 73711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(resultTypeIndex) << "OpVariable Result Type <id> '" 73811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[resultTypeIndex] 73911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a pointer type."; 74011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 74111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 74211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (opcodeEntry->numTypes < inst->words.size()) { 74311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto initialiserIndex = 4; 74411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto initialiser = usedefs_.FindDef(inst->words[initialiserIndex]); 74511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!initialiser.first || !spvOpcodeIsConstant(initialiser.second.opcode)) { 74611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(initialiserIndex) << "OpVariable Initializer <id> '" 74711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[initialiserIndex] 74811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a constant."; 74911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 75011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 75111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 75211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 75311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 75411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 75511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 75611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpLoad>(const spv_instruction_t* inst, 75711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 75811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultTypeIndex = 1; 75911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultType = usedefs_.FindDef(inst->words[resultTypeIndex]); 76011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(!resultType.first, DIAG(resultTypeIndex) 76111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "OpLoad Result Type <id> '" 76211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[resultTypeIndex] 76311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not defind."; 76411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 76511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto pointerIndex = 3; 76611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto pointer = usedefs_.FindDef(inst->words[pointerIndex]); 76711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!pointer.first || 76811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert (addressingModel == SpvAddressingModelLogical && 76911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert !spvOpcodeReturnsLogicalPointer(pointer.second.opcode))) { 77011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(pointerIndex) << "OpLoad Pointer <id> '" << inst->words[pointerIndex] 77111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a pointer."; 77211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 77311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 77411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto pointerType = usedefs_.FindDef(pointer.second.type_id); 77511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!pointerType.first || pointerType.second.opcode != SpvOpTypePointer) { 77611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(pointerIndex) << "OpLoad type for pointer <id> '" 77711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[pointerIndex] 77811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a pointer type."; 77911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 78011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 78111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto pointeeType = usedefs_.FindDef(pointerType.second.words[3]); 78211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!pointeeType.first || resultType.second.id != pointeeType.second.id) { 78311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(resultTypeIndex) << "OpLoad Result Type <id> '" 78411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[resultTypeIndex] 78511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' does not match Pointer <id> '" 78611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << pointer.second.id << "'s type."; 78711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 78811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 78911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 79011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 79111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 79211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 79311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpStore>(const spv_instruction_t* inst, 79411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 79511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto pointerIndex = 1; 79611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto pointer = usedefs_.FindDef(inst->words[pointerIndex]); 79711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!pointer.first || 79811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert (addressingModel == SpvAddressingModelLogical && 79911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert !spvOpcodeReturnsLogicalPointer(pointer.second.opcode))) { 80011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(pointerIndex) << "OpStore Pointer <id> '" << inst->words[pointerIndex] 80111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a pointer."; 80211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 80311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 80411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto pointerType = usedefs_.FindDef(pointer.second.type_id); 80511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!pointer.first || pointerType.second.opcode != SpvOpTypePointer) { 80611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(pointerIndex) << "OpStore type for pointer <id> '" 80711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[pointerIndex] 80811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a pointer type."; 80911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 81011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 81111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto type = usedefs_.FindDef(pointerType.second.words[3]); 81211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(type.first); 81311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(SpvOpTypeVoid == type.second.opcode, DIAG(pointerIndex) 81411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "OpStore Pointer <id> '" 81511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[pointerIndex] 81611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "'s type is void."; 81711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 81811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 81911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto objectIndex = 2; 82011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto object = usedefs_.FindDef(inst->words[objectIndex]); 82111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!object.first || !object.second.type_id) { 82211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(objectIndex) << "OpStore Object <id> '" << inst->words[objectIndex] 82311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not an object."; 82411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 82511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 82611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto objectType = usedefs_.FindDef(object.second.type_id); 82711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(objectType.first); 82811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(SpvOpTypeVoid == objectType.second.opcode, 82911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(objectIndex) << "OpStore Object <id> '" 83011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[objectIndex] << "'s type is void."; 83111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 83211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 83311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(type.second.id != objectType.second.id, 83411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(pointerIndex) 83511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "OpStore Pointer <id> '" << inst->words[pointerIndex] 83611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "'s type does not match Object <id> '" << objectType.second.id 83711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "'s type."; 83811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 83911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 84011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 84111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 84211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 84311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpCopyMemory>(const spv_instruction_t* inst, 84411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 84511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto targetIndex = 1; 84611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto target = usedefs_.FindDef(inst->words[targetIndex]); 84711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!target.first) return false; 84811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto sourceIndex = 2; 84911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto source = usedefs_.FindDef(inst->words[sourceIndex]); 85011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!source.first) return false; 85111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto targetPointerType = usedefs_.FindDef(target.second.type_id); 85211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(targetPointerType.first); 85311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto targetType = usedefs_.FindDef(targetPointerType.second.words[3]); 85411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(targetType.first); 85511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto sourcePointerType = usedefs_.FindDef(source.second.type_id); 85611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sourcePointerType.first); 85711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto sourceType = usedefs_.FindDef(sourcePointerType.second.words[3]); 85811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sourceType.first); 85911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(targetType.second.id != sourceType.second.id, 86011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(sourceIndex) 86111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "OpCopyMemory Target <id> '" << inst->words[sourceIndex] 86211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "'s type does not match Source <id> '" << sourceType.second.id 86311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "'s type."; 86411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 86511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 86611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 86711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 86811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 86911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpCopyMemorySized>(const spv_instruction_t* inst, 87011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 87111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto targetIndex = 1; 87211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto target = usedefs_.FindDef(inst->words[targetIndex]); 87311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!target.first) return false; 87411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto sourceIndex = 2; 87511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto source = usedefs_.FindDef(inst->words[sourceIndex]); 87611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!source.first) return false; 87711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto sizeIndex = 3; 87811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto size = usedefs_.FindDef(inst->words[sizeIndex]); 87911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!size.first) return false; 88011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto targetPointerType = usedefs_.FindDef(target.second.type_id); 88111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(!targetPointerType.first || 88211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert SpvOpTypePointer != targetPointerType.second.opcode, 88311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(targetIndex) << "OpCopyMemorySized Target <id> '" 88411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[targetIndex] 88511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a pointer."; 88611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 88711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto sourcePointerType = usedefs_.FindDef(source.second.type_id); 88811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(!sourcePointerType.first || 88911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert SpvOpTypePointer != sourcePointerType.second.opcode, 89011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(sourceIndex) << "OpCopyMemorySized Source <id> '" 89111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[sourceIndex] 89211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a pointer."; 89311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 89411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert switch (size.second.opcode) { 89511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // TODO: The following opcode's are assumed to be valid, refer to the 89611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // following bug https://cvs.khronos.org/bugzilla/show_bug.cgi?id=13871 for 89711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // clarification 89811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case SpvOpConstant: 89911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case SpvOpSpecConstant: { 90011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto sizeType = usedefs_.FindDef(size.second.type_id); 90111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sizeType.first); 90211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(SpvOpTypeInt != sizeType.second.opcode, 90311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(sizeIndex) << "OpCopyMemorySized Size <id> '" 90411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[sizeIndex] 90511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "'s type is not an integer type."; 90611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 90711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } break; 90811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case SpvOpVariable: { 90911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto pointerType = usedefs_.FindDef(size.second.type_id); 91011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(pointerType.first); 91111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto sizeType = usedefs_.FindDef(pointerType.second.type_id); 91211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(!sizeType.first || SpvOpTypeInt != sizeType.second.opcode, 91311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(sizeIndex) << "OpCopyMemorySized Size <id> '" 91411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[sizeIndex] 91511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "'s variable type is not an integer type."; 91611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 91711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } break; 91811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert default: 91911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(sizeIndex) << "OpCopyMemorySized Size <id> '" 92011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[sizeIndex] 92111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a constant or variable."; 92211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 92311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 92411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // TODO: Check that consant is a least size 1, see the same bug as above for 92511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // clarification? 92611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 92711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 92811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 92911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 93011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 93111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpAccessChain>(const spv_instruction_t *inst, 93211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 93311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 93411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 93511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 93611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 93711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpInBoundsAccessChain>( 93811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 93911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 94011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 94111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 94211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 94311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpArrayLength>(const spv_instruction_t *inst, 94411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 94511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 94611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 94711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 94811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 94911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpImagePointer>(const spv_instruction_t *inst, 95011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 95111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 95211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 95311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 95411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 95511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpGenericPtrMemSemantics>( 95611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 95711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 95811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 95911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 96011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpFunction>(const spv_instruction_t* inst, 96111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 96211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultTypeIndex = 1; 96311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultType = usedefs_.FindDef(inst->words[resultTypeIndex]); 96411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!resultType.first) return false; 96511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto functionTypeIndex = 4; 96611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto functionType = usedefs_.FindDef(inst->words[functionTypeIndex]); 96711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!functionType.first || SpvOpTypeFunction != functionType.second.opcode) { 96811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(functionTypeIndex) << "OpFunction Function Type <id> '" 96911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[functionTypeIndex] 97011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is not a function type."; 97111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 97211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 97311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto returnType = usedefs_.FindDef(functionType.second.words[2]); 97411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(returnType.first); 97511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(returnType.second.id != resultType.second.id, 97611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(resultTypeIndex) << "OpFunction Result Type <id> '" 97711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[resultTypeIndex] 97811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' does not match the Function Type <id> '" 97911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << resultType.second.id << "'s return type."; 98011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 98111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 98211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 98311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 98411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 98511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpFunctionParameter>(const spv_instruction_t* inst, 98611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 98711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultTypeIndex = 1; 98811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultType = usedefs_.FindDef(inst->words[resultTypeIndex]); 98911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!resultType.first) return false; 99011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // NOTE: Find OpFunction & ensure OpFunctionParameter is not out of place. 99111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert size_t paramIndex = 0; 99211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(firstInst < inst && "Invalid instruction pointer"); 99311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert while (firstInst != --inst) { 99411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (SpvOpFunction == inst->opcode) { 99511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert break; 99611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } else if (SpvOpFunctionParameter == inst->opcode) { 99711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert paramIndex++; 99811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 99911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 100011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto functionType = usedefs_.FindDef(inst->words[4]); 100111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(functionType.first); 100211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (paramIndex >= functionType.second.words.size() - 3) { 100311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(0) << "Too many OpFunctionParameters for " << inst->words[2] 100411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << ": expected " << functionType.second.words.size() - 3 100511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << " based on the function's type"; 100611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 100711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 100811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto paramType = usedefs_.FindDef(functionType.second.words[paramIndex + 3]); 100911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(paramType.first); 101011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(resultType.second.id != paramType.second.id, 101111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(resultTypeIndex) 101211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "OpFunctionParameter Result Type <id> '" 101311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[resultTypeIndex] 101411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' does not match the OpTypeFunction parameter " 101511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert "type of the same index."; 101611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 101711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 101811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 101911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 102011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 102111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpFunctionCall>(const spv_instruction_t* inst, 102211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 102311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultTypeIndex = 1; 102411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto resultType = usedefs_.FindDef(inst->words[resultTypeIndex]); 102511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!resultType.first) return false; 102611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto functionIndex = 3; 102711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto function = usedefs_.FindDef(inst->words[functionIndex]); 102811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!function.first || SpvOpFunction != function.second.opcode) { 102911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(functionIndex) << "OpFunctionCall Function <id> '" 103011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[functionIndex] << "' is not a function."; 103111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 103211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 103311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto returnType = usedefs_.FindDef(function.second.type_id); 103411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(returnType.first); 103511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(returnType.second.id != resultType.second.id, 103611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(resultTypeIndex) << "OpFunctionCall Result Type <id> '" 103711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[resultTypeIndex] 103811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "'s type does not match Function <id> '" 103911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << returnType.second.id << "'s return type."; 104011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 104111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto functionType = usedefs_.FindDef(function.second.words[4]); 104211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(functionType.first); 104311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto functionCallArgCount = inst->words.size() - 4; 104411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto functionParamCount = functionType.second.words.size() - 3; 104511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck( 104611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert functionParamCount != functionCallArgCount, 104711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(inst->words.size() - 1) 104811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "OpFunctionCall Function <id>'s parameter count does not match " 104911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert "the argument count."; 105011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 105111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for (size_t argumentIndex = 4, paramIndex = 3; 105211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert argumentIndex < inst->words.size(); argumentIndex++, paramIndex++) { 105311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto argument = usedefs_.FindDef(inst->words[argumentIndex]); 105411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!argument.first) return false; 105511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto argumentType = usedefs_.FindDef(argument.second.type_id); 105611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(argumentType.first); 105711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto parameterType = 105811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert usedefs_.FindDef(functionType.second.words[paramIndex]); 105911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(parameterType.first); 106011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(argumentType.second.id != parameterType.second.id, 106111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(argumentIndex) << "OpFunctionCall Argument <id> '" 106211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << inst->words[argumentIndex] 106311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "'s type does not match Function <id> '" 106411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << parameterType.second.id 106511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "'s parameter type."; 106611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 106711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 106811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 106911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 107011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 107111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 107211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 107311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpConvertUToF>(const spv_instruction_t *inst, 107411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 107511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 107611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 107711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 107811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 107911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpConvertFToS>(const spv_instruction_t *inst, 108011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 108111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 108211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 108311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 108411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 108511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpConvertSToF>(const spv_instruction_t *inst, 108611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 108711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 108811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 108911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 109011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 109111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpConvertUToF>(const spv_instruction_t *inst, 109211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 109311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 109411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 109511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 109611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 109711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpUConvert>(const spv_instruction_t *inst, 109811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 109911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 110011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 110111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 110211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 110311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpSConvert>(const spv_instruction_t *inst, 110411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 110511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 110611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 110711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 110811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 110911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpFConvert>(const spv_instruction_t *inst, 111011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 111111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 111211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 111311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 111411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 111511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpConvertPtrToU>(const spv_instruction_t *inst, 111611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) { 111711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 111811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 111911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 112011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 112111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 112211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpConvertUToPtr>(const spv_instruction_t *inst, 112311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) { 112411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 112511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 112611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 112711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 112811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 112911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpPtrCastToGeneric>( 113011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 113111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 113211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 113311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 113411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 113511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGenericCastToPtr>( 113611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 113711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 113811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 113911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 114011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 114111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpBitcast>(const spv_instruction_t *inst, 114211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 114311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 114411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 114511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 114611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 114711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGenericCastToPtrExplicit>( 114811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 114911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 115011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 115111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 115211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 115311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpSatConvertSToU>(const spv_instruction_t *inst) {} 115411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 115511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 115611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 115711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 115811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpSatConvertUToS>(const spv_instruction_t *inst) {} 115911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 116011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 116111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 116211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 116311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpVectorExtractDynamic>( 116411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 116511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 116611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 116711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 116811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 116911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpVectorInsertDynamic>( 117011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 117111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 117211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 117311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 117411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 117511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpVectorShuffle>(const spv_instruction_t *inst, 117611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) { 117711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 117811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 117911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 118011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 118111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 118211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpCompositeConstruct>( 118311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 118411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 118511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 118611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 118711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 118811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpCompositeExtract>( 118911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 119011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 119111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 119211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 119311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 119411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpCompositeInsert>( 119511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 119611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 119711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 119811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 119911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 120011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpCopyObject>(const spv_instruction_t *inst, 120111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 120211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 120311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 120411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 120511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 120611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpTranspose>(const spv_instruction_t *inst, 120711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 120811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 120911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 121011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 121111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 121211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpSNegate>(const spv_instruction_t *inst, 121311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 121411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 121511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 121611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 121711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 121811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpFNegate>(const spv_instruction_t *inst, 121911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 122011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 122111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 122211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 122311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 122411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpNot>(const spv_instruction_t *inst, 122511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 122611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 122711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 122811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 122911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 123011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpIAdd>(const spv_instruction_t *inst, 123111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 123211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 123311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 123411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 123511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 123611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpFAdd>(const spv_instruction_t *inst, 123711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 123811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 123911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 124011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 124111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 124211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpISub>(const spv_instruction_t *inst, 124311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 124411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 124511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 124611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 124711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 124811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpFSub>(const spv_instruction_t *inst, 124911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 125011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 125111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 125211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 125311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 125411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpIMul>(const spv_instruction_t *inst, 125511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 125611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 125711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 125811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 125911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 126011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpFMul>(const spv_instruction_t *inst, 126111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 126211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 126311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 126411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 126511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 126611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpUDiv>(const spv_instruction_t *inst, 126711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 126811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 126911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 127011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 127111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 127211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpSDiv>(const spv_instruction_t *inst, 127311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 127411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 127511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 127611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 127711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 127811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpFDiv>(const spv_instruction_t *inst, 127911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 128011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 128111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 128211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 128311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 128411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpUMod>(const spv_instruction_t *inst, 128511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 128611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 128711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 128811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 128911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 129011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpSRem>(const spv_instruction_t *inst, 129111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 129211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 129311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 129411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 129511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 129611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpSMod>(const spv_instruction_t *inst, 129711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 129811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 129911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 130011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 130111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 130211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpFRem>(const spv_instruction_t *inst, 130311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 130411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 130511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 130611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 130711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 130811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpFMod>(const spv_instruction_t *inst, 130911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 131011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 131111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 131211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 131311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 131411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpVectorTimesScalar>( 131511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 131611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 131711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 131811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 131911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 132011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpMatrixTimesScalar>( 132111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 132211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 132311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 132411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 132511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 132611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpVectorTimesMatrix>( 132711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 132811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 132911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 133011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 133111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 133211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpMatrixTimesVector>( 133311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 133411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 133511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 133611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 133711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 133811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpMatrixTimesMatrix>( 133911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 134011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 134111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 134211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 134311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 134411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpOuterProduct>(const spv_instruction_t *inst, 134511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 134611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 134711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 134811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 134911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 135011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpDot>(const spv_instruction_t *inst, 135111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 135211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 135311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 135411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 135511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 135611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpShiftRightLogical>( 135711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 135811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 135911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 136011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 136111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 136211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpShiftRightArithmetic>( 136311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 136411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 136511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 136611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 136711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 136811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpShiftLeftLogical>( 136911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 137011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 137111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 137211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 137311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 137411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpBitwiseOr>(const spv_instruction_t *inst, 137511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 137611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 137711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 137811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 137911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 138011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpBitwiseXor>(const spv_instruction_t *inst, 138111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 138211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 138311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 138411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 138511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 138611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpBitwiseAnd>(const spv_instruction_t *inst, 138711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 138811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 138911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 139011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 139111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 139211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpAny>(const spv_instruction_t *inst, 139311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 139411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 139511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 139611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 139711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 139811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpAll>(const spv_instruction_t *inst, 139911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 140011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 140111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 140211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 140311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 140411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpIsNan>(const spv_instruction_t *inst, 140511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 140611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 140711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 140811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 140911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 141011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpIsInf>(const spv_instruction_t *inst, 141111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 141211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 141311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 141411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 141511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 141611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpIsFinite>(const spv_instruction_t *inst, 141711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 141811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 141911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 142011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 142111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 142211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpIsNormal>(const spv_instruction_t *inst, 142311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 142411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 142511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 142611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 142711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 142811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpSignBitSet>(const spv_instruction_t *inst, 142911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 143011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 143111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 143211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 143311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 143411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpLessOrGreater>(const spv_instruction_t *inst, 143511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) { 143611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 143711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 143811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 143911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 144011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 144111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpOrdered>(const spv_instruction_t *inst, 144211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 144311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 144411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 144511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 144611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 144711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpUnordered>(const spv_instruction_t *inst, 144811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 144911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 145011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 145111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 145211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 145311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpLogicalOr>(const spv_instruction_t *inst, 145411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 145511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 145611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 145711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 145811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 145911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpLogicalXor>(const spv_instruction_t *inst, 146011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 146111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 146211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 146311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 146411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 146511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpLogicalAnd>(const spv_instruction_t *inst, 146611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 146711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 146811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 146911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 147011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 147111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpSelect>(const spv_instruction_t *inst, 147211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 147311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 147411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 147511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 147611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 147711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpIEqual>(const spv_instruction_t *inst, 147811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 147911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 148011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 148111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 148211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 148311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpFOrdEqual>(const spv_instruction_t *inst, 148411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 148511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 148611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 148711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 148811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 148911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpFUnordEqual>(const spv_instruction_t *inst, 149011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 149111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 149211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 149311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 149411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 149511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpINotEqual>(const spv_instruction_t *inst, 149611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 149711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 149811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 149911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 150011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 150111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpFOrdNotEqual>(const spv_instruction_t *inst, 150211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 150311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 150411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 150511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 150611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 150711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpFUnordNotEqual>( 150811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 150911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 151011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 151111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 151211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 151311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpULessThan>(const spv_instruction_t *inst, 151411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 151511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 151611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 151711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 151811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 151911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpSLessThan>(const spv_instruction_t *inst, 152011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 152111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 152211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 152311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 152411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 152511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpFOrdLessThan>(const spv_instruction_t *inst, 152611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 152711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 152811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 152911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 153011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 153111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpFUnordLessThan>( 153211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 153311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 153411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 153511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 153611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 153711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpUGreaterThan>(const spv_instruction_t *inst, 153811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 153911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 154011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 154111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 154211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 154311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpSGreaterThan>(const spv_instruction_t *inst, 154411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 154511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 154611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 154711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 154811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 154911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpFOrdGreaterThan>( 155011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 155111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 155211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 155311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 155411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 155511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpFUnordGreaterThan>( 155611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 155711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 155811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 155911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 156011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 156111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpULessThanEqual>( 156211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 156311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 156411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 156511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 156611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 156711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpSLessThanEqual>( 156811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 156911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 157011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 157111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 157211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 157311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpFOrdLessThanEqual>( 157411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 157511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 157611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 157711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 157811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 157911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpFUnordLessThanEqual>( 158011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 158111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 158211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 158311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 158411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 158511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpUGreaterThanEqual>( 158611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 158711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 158811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 158911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 159011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 159111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpSGreaterThanEqual>( 159211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 159311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 159411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 159511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 159611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 159711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpFOrdGreaterThanEqual>( 159811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 159911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 160011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 160111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 160211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 160311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpFUnordGreaterThanEqual>( 160411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 160511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 160611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 160711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 160811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 160911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpDPdx>(const spv_instruction_t *inst, 161011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 161111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 161211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 161311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 161411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 161511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpDPdy>(const spv_instruction_t *inst, 161611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 161711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 161811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 161911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 162011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 162111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpFWidth>(const spv_instruction_t *inst, 162211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 162311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 162411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 162511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 162611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 162711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpDPdxFine>(const spv_instruction_t *inst, 162811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 162911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 163011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 163111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 163211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 163311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpDPdyFine>(const spv_instruction_t *inst, 163411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 163511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 163611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 163711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 163811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 163911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpFwidthFine>(const spv_instruction_t *inst, 164011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 164111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 164211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 164311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 164411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 164511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpDPdxCoarse>(const spv_instruction_t *inst, 164611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 164711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 164811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 164911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 165011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 165111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpDPdyCoarse>(const spv_instruction_t *inst, 165211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 165311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 165411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 165511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 165611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 165711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpFwidthCoarse>(const spv_instruction_t *inst, 165811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 165911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 166011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 166111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 166211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 166311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpPhi>(const spv_instruction_t *inst, 166411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 166511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 166611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 166711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 166811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 166911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpLoopMerge>(const spv_instruction_t *inst, 167011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 167111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 167211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 167311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 167411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 167511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpSelectionMerge>( 167611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 167711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 167811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 167911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 168011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 168111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpBranch>(const spv_instruction_t *inst, 168211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 168311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 168411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 168511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 168611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 168711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpBranchConditional>( 168811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 168911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 169011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 169111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 169211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 169311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpSwitch>(const spv_instruction_t *inst, 169411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 169511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 169611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 169711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 169811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<SpvOpReturnValue>(const spv_instruction_t* inst, 169911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc) { 170011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto valueIndex = 1; 170111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto value = usedefs_.FindDef(inst->words[valueIndex]); 170211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!value.first || !value.second.type_id) { 170311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(valueIndex) << "OpReturnValue Value <id> '" << inst->words[valueIndex] 170411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' does not represent a value."; 170511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 170611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 170711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto valueType = usedefs_.FindDef(value.second.type_id); 170811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!valueType.first || SpvOpTypeVoid == valueType.second.opcode) { 170911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(valueIndex) << "OpReturnValue value's type <id> '" 171011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << value.second.type_id << "' is missing or void."; 171111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 171211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 171311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (addressingModel == SpvAddressingModelLogical && 171411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert SpvOpTypePointer == valueType.second.opcode) { 171511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(valueIndex) 171611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "OpReturnValue value's type <id> '" << value.second.type_id 171711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "' is a pointer, which is invalid in the Logical addressing model."; 171811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false; 171911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 172011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // NOTE: Find OpFunction 172111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t* function = inst - 1; 172211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert while (firstInst != function) { 172311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(SpvOpFunction == function->opcode, break); 172411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert function--; 172511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 172611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(SpvOpFunction != function->opcode, 172711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(valueIndex) << "OpReturnValue is not in a basic block."; 172811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 172911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert auto returnType = usedefs_.FindDef(function->words[1]); 173011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(!returnType.first || returnType.second.id != valueType.second.id, 173111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DIAG(valueIndex) 173211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "OpReturnValue Value <id> '" << inst->words[valueIndex] 173311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "'s type does not match OpFunction's return type."; 173411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 173511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 173611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 173711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 173811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 173911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 174011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpLifetimeStart>(const spv_instruction_t *inst, 174111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) { 174211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 174311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 174411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 174511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 174611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 174711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpLifetimeStop>(const spv_instruction_t *inst, 174811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 174911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 175011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 175111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 175211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 175311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpAtomicInit>(const spv_instruction_t *inst, 175411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 175511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 175611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 175711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 175811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 175911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpAtomicLoad>(const spv_instruction_t *inst, 176011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 176111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 176211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 176311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 176411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 176511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpAtomicStore>(const spv_instruction_t *inst, 176611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 176711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 176811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 176911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 177011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 177111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpAtomicExchange>( 177211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 177311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 177411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 177511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 177611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 177711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpAtomicCompareExchange>( 177811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 177911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 178011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 178111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 178211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 178311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpAtomicCompareExchangeWeak>( 178411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 178511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 178611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 178711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 178811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 178911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpAtomicIIncrement>( 179011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 179111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 179211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 179311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 179411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 179511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpAtomicIDecrement>( 179611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 179711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 179811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 179911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 180011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 180111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpAtomicIAdd>(const spv_instruction_t *inst, 180211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 180311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 180411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 180511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 180611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 180711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpAtomicISub>(const spv_instruction_t *inst, 180811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 180911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 181011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 181111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 181211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 181311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpAtomicUMin>(const spv_instruction_t *inst, 181411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 181511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 181611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 181711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 181811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 181911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpAtomicUMax>(const spv_instruction_t *inst, 182011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 182111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 182211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 182311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 182411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 182511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpAtomicAnd>(const spv_instruction_t *inst, 182611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 182711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 182811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 182911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 183011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 183111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpAtomicOr>(const spv_instruction_t *inst, 183211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 183311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 183411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 183511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 183611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 183711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpAtomicXor>(const spv_instruction_t *inst, 183811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 183911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 184011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 184111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 184211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 184311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpAtomicIMin>(const spv_instruction_t *inst, 184411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 184511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 184611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 184711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 184811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 184911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpAtomicIMax>(const spv_instruction_t *inst, 185011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 185111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 185211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 185311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 185411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 185511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpEmitStreamVertex>( 185611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 185711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 185811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 185911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 186011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 186111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpEndStreamPrimitive>( 186211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 186311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 186411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 186511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 186611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 186711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGroupAsyncCopy>( 186811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 186911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 187011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 187111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 187211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 187311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGroupWaitEvents>( 187411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 187511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 187611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 187711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 187811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 187911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGroupAll>(const spv_instruction_t *inst, 188011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 188111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 188211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 188311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 188411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 188511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGroupAny>(const spv_instruction_t *inst, 188611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 188711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 188811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 188911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 189011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 189111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGroupBroadcast>( 189211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 189311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 189411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 189511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 189611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 189711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGroupIAdd>(const spv_instruction_t *inst, 189811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 189911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 190011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 190111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 190211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 190311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGroupFAdd>(const spv_instruction_t *inst, 190411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 190511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 190611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 190711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 190811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 190911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGroupFMin>(const spv_instruction_t *inst, 191011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 191111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 191211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 191311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 191411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 191511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGroupUMin>(const spv_instruction_t *inst, 191611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 191711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 191811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 191911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 192011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 192111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGroupSMin>(const spv_instruction_t *inst, 192211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 192311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 192411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 192511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 192611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 192711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGroupFMax>(const spv_instruction_t *inst, 192811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 192911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 193011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 193111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 193211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 193311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGroupUMax>(const spv_instruction_t *inst, 193411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 193511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 193611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 193711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 193811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 193911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGroupSMax>(const spv_instruction_t *inst, 194011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 194111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 194211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 194311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 194411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 194511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpEnqueueMarker>(const spv_instruction_t *inst, 194611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) { 194711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 194811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 194911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 195011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 195111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 195211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpEnqueueKernel>(const spv_instruction_t *inst, 195311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) { 195411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 195511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 195611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 195711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 195811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 195911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGetKernelNDrangeSubGroupCount>( 196011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 196111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 196211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 196311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 196411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 196511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGetKernelNDrangeMaxSubGroupSize>( 196611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 196711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 196811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 196911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 197011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 197111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGetKernelWorkGroupSize>( 197211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 197311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 197411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 197511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 197611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 197711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGetKernelPreferredWorkGroupSizeMultiple>( 197811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 197911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 198011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 198111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 198211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 198311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpRetainEvent>(const spv_instruction_t *inst, 198411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 198511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 198611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 198711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 198811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 198911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpReleaseEvent>(const spv_instruction_t *inst, 199011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 199111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 199211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 199311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 199411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 199511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpCreateUserEvent>( 199611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 199711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 199811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 199911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 200011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 200111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpIsValidEvent>(const spv_instruction_t *inst, 200211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 200311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 200411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 200511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 200611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 200711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpSetUserEventStatus>( 200811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 200911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 201011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 201111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 201211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 201311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpCaptureEventProfilingInfo>( 201411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 201511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 201611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 201711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 201811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 201911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGetDefaultQueue>( 202011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 202111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 202211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 202311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 202411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 202511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpBuildNDRange>(const spv_instruction_t *inst, 202611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 202711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 202811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 202911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 203011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 203111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpReadPipe>(const spv_instruction_t *inst, 203211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 203311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 203411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 203511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 203611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 203711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpWritePipe>(const spv_instruction_t *inst, 203811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_desc opcodeEntry) {} 203911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 204011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 204111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 204211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 204311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpReservedReadPipe>( 204411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 204511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 204611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 204711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 204811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 204911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpReservedWritePipe>( 205011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 205111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 205211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 205311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 205411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 205511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpReserveReadPipePackets>( 205611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 205711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 205811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 205911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 206011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 206111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpReserveWritePipePackets>( 206211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 206311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 206411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 206511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 206611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 206711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpCommitReadPipe>( 206811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 206911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 207011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 207111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 207211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 207311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpCommitWritePipe>( 207411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 207511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 207611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 207711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 207811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 207911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpIsValidReserveId>( 208011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 208111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 208211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 208311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 208411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 208511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGetNumPipePackets>( 208611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 208711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 208811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 208911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 209011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 209111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGetMaxPipePackets>( 209211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 209311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 209411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 209511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 209611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 209711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGroupReserveReadPipePackets>( 209811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 209911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 210011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 210111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 210211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 210311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGroupReserveWritePipePackets>( 210411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 210511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 210611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 210711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 210811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 210911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGroupCommitReadPipe>( 211011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 211111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 211211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 211311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0 211411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <> 211511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid<OpGroupCommitWritePipe>( 211611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_instruction_t *inst, const spv_opcode_desc opcodeEntry) {} 211711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 211811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 211911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef DIAG 212011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 212111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool idUsage::isValid(const spv_instruction_t* inst) { 212211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spv_opcode_desc opcodeEntry = nullptr; 212311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(spvOpcodeTableValueLookup(opcodeTable, inst->opcode, &opcodeEntry), 212411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return false); 212511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CASE(OpCode) \ 212611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case Spv##OpCode: \ 212711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return isValid<Spv##OpCode>(inst, opcodeEntry); 212811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define TODO(OpCode) \ 212911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case Spv##OpCode: \ 213011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 213111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert switch (inst->opcode) { 213211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpUndef) 213311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpMemberName) 213411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpLine) 213511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpMemberDecorate) 213611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpGroupDecorate) 213711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGroupMemberDecorate) 213811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpExtInst) 213911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpEntryPoint) 214011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpExecutionMode) 214111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpTypeVector) 214211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpTypeMatrix) 214311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpTypeSampler) 214411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpTypeArray) 214511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpTypeRuntimeArray) 214611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpTypeStruct) 214711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpTypePointer) 214811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpTypeFunction) 214911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpTypePipe) 215011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpConstantTrue) 215111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpConstantFalse) 215211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpConstantComposite) 215311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpConstantSampler) 215411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpConstantNull) 215511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpSpecConstantTrue) 215611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpSpecConstantFalse) 215711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpSpecConstantComposite) 215811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpSpecConstantOp) 215911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpVariable) 216011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpLoad) 216111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpStore) 216211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpCopyMemory) 216311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpCopyMemorySized) 216411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpAccessChain) 216511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpInBoundsAccessChain) 216611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpArrayLength) 216711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGenericPtrMemSemantics) 216811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpFunction) 216911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpFunctionParameter) 217011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpFunctionCall) 217111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpConvertUToF) 217211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpConvertFToS) 217311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpConvertSToF) 217411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpUConvert) 217511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpSConvert) 217611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpFConvert) 217711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpConvertPtrToU) 217811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpConvertUToPtr) 217911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpPtrCastToGeneric) 218011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGenericCastToPtr) 218111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpBitcast) 218211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGenericCastToPtrExplicit) 218311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpSatConvertSToU) 218411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpSatConvertUToS) 218511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpVectorExtractDynamic) 218611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpVectorInsertDynamic) 218711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpVectorShuffle) 218811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpCompositeConstruct) 218911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpCompositeExtract) 219011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpCompositeInsert) 219111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpCopyObject) 219211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpTranspose) 219311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpSNegate) 219411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpFNegate) 219511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpNot) 219611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpIAdd) 219711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpFAdd) 219811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpISub) 219911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpFSub) 220011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpIMul) 220111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpFMul) 220211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpUDiv) 220311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpSDiv) 220411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpFDiv) 220511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpUMod) 220611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpSRem) 220711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpSMod) 220811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpFRem) 220911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpFMod) 221011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpVectorTimesScalar) 221111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpMatrixTimesScalar) 221211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpVectorTimesMatrix) 221311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpMatrixTimesVector) 221411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpMatrixTimesMatrix) 221511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpOuterProduct) 221611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpDot) 221711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpShiftRightLogical) 221811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpShiftRightArithmetic) 221911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpShiftLeftLogical) 222011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpBitwiseOr) 222111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpBitwiseXor) 222211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpBitwiseAnd) 222311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpAny) 222411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpAll) 222511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpIsNan) 222611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpIsInf) 222711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpIsFinite) 222811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpIsNormal) 222911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpSignBitSet) 223011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpLessOrGreater) 223111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpOrdered) 223211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpUnordered) 223311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpLogicalOr) 223411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpLogicalAnd) 223511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpSelect) 223611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpIEqual) 223711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpFOrdEqual) 223811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpFUnordEqual) 223911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpINotEqual) 224011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpFOrdNotEqual) 224111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpFUnordNotEqual) 224211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpULessThan) 224311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpSLessThan) 224411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpFOrdLessThan) 224511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpFUnordLessThan) 224611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpUGreaterThan) 224711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpSGreaterThan) 224811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpFOrdGreaterThan) 224911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpFUnordGreaterThan) 225011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpULessThanEqual) 225111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpSLessThanEqual) 225211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpFOrdLessThanEqual) 225311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpFUnordLessThanEqual) 225411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpUGreaterThanEqual) 225511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpSGreaterThanEqual) 225611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpFOrdGreaterThanEqual) 225711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpFUnordGreaterThanEqual) 225811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpDPdx) 225911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpDPdy) 226011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpFwidth) 226111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpDPdxFine) 226211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpDPdyFine) 226311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpFwidthFine) 226411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpDPdxCoarse) 226511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpDPdyCoarse) 226611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpFwidthCoarse) 226711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpPhi) 226811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpLoopMerge) 226911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpSelectionMerge) 227011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpBranch) 227111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpBranchConditional) 227211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpSwitch) 227311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CASE(OpReturnValue) 227411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpLifetimeStart) 227511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpLifetimeStop) 227611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpAtomicLoad) 227711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpAtomicStore) 227811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpAtomicExchange) 227911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpAtomicCompareExchange) 228011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpAtomicCompareExchangeWeak) 228111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpAtomicIIncrement) 228211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpAtomicIDecrement) 228311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpAtomicIAdd) 228411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpAtomicISub) 228511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpAtomicUMin) 228611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpAtomicUMax) 228711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpAtomicAnd) 228811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpAtomicOr) 228911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpAtomicSMin) 229011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpAtomicSMax) 229111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpEmitStreamVertex) 229211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpEndStreamPrimitive) 229311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGroupAsyncCopy) 229411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGroupWaitEvents) 229511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGroupAll) 229611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGroupAny) 229711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGroupBroadcast) 229811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGroupIAdd) 229911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGroupFAdd) 230011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGroupFMin) 230111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGroupUMin) 230211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGroupSMin) 230311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGroupFMax) 230411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGroupUMax) 230511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGroupSMax) 230611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpEnqueueMarker) 230711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpEnqueueKernel) 230811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGetKernelNDrangeSubGroupCount) 230911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGetKernelNDrangeMaxSubGroupSize) 231011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGetKernelWorkGroupSize) 231111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGetKernelPreferredWorkGroupSizeMultiple) 231211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpRetainEvent) 231311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpReleaseEvent) 231411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpCreateUserEvent) 231511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpIsValidEvent) 231611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpSetUserEventStatus) 231711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpCaptureEventProfilingInfo) 231811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGetDefaultQueue) 231911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpBuildNDRange) 232011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpReadPipe) 232111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpWritePipe) 232211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpReservedReadPipe) 232311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpReservedWritePipe) 232411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpReserveReadPipePackets) 232511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpReserveWritePipePackets) 232611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpCommitReadPipe) 232711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpCommitWritePipe) 232811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpIsValidReserveId) 232911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGetNumPipePackets) 233011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGetMaxPipePackets) 233111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGroupReserveReadPipePackets) 233211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGroupReserveWritePipePackets) 233311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGroupCommitReadPipe) 233411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TODO(OpGroupCommitWritePipe) 233511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert default: 233611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return true; 233711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 233811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef TODO 233911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef CASE 234011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 234111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // anonymous namespace 234211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 234311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertspv_result_t spvValidateInstructionIDs(const spv_instruction_t* pInsts, 234411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const uint64_t instCount, 234511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_opcode_table opcodeTable, 234611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_operand_table operandTable, 234711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const spv_ext_inst_table extInstTable, 234811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const libspirv::ValidationState_t& state, 234911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spv_position position, 235011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spv_diagnostic* pDiag) { 235111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert idUsage idUsage(opcodeTable, operandTable, extInstTable, pInsts, instCount, 235211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert state.memory_model(), state.addressing_model(), 235311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert state.usedefs(), state.entry_points(), position, pDiag); 235411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for (uint64_t instIndex = 0; instIndex < instCount; ++instIndex) { 235511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spvCheck(!idUsage.isValid(&pInsts[instIndex]), return SPV_ERROR_INVALID_ID); 235611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert position->index += pInsts[instIndex].words.size(); 235711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 235811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return SPV_SUCCESS; 235911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 2360