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