// Copyright (c) 2018 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Validates correctness of extension SPIR-V instructions.
#include <algorithm>
#include <cstdlib>
#include <sstream>
#include <string>
#include <vector>

#include "NonSemanticShaderDebugInfo100.h"
#include "OpenCLDebugInfo100.h"
#include "source/common_debug_info.h"
#include "source/extensions.h"
#include "source/latest_version_glsl_std_450_header.h"
#include "source/latest_version_opencl_std_header.h"
#include "source/spirv_constant.h"
#include "source/table2.h"
#include "source/val/instruction.h"
#include "source/val/validate.h"
#include "source/val/validation_state.h"
#include "spirv/unified1/NonSemanticClspvReflection.h"

namespace spvtools {
namespace val {
namespace {

std::string ReflectionInstructionName(const Instruction* inst) {
  const ExtInstDesc* desc = nullptr;
  if (LookupExtInst(SPV_EXT_INST_TYPE_NONSEMANTIC_CLSPVREFLECTION,
                    inst->word(4), &desc) != SPV_SUCCESS ||
      !desc) {
    return std::string("Unknown ExtInst");
  }
  std::ostringstream ss;
  ss << desc->name().data();

  return ss.str();
}

uint32_t GetSizeTBitWidth(const ValidationState_t& _) {
  if (_.addressing_model() == spv::AddressingModel::Physical32) return 32;

  if (_.addressing_model() == spv::AddressingModel::Physical64) return 64;

  return 0;
}

bool IsIntScalar(ValidationState_t& _, uint32_t id, bool must_len32,
                 bool must_unsigned) {
  auto type = _.FindDef(id);
  if (!type || type->opcode() != spv::Op::OpTypeInt) {
    return false;
  }

  if (must_len32 && type->GetOperandAs<uint32_t>(1) != 32) {
    return false;
  }

  return !must_unsigned || type->GetOperandAs<uint32_t>(2) == 0;
}

bool IsUint32Constant(ValidationState_t& _, uint32_t id) {
  auto inst = _.FindDef(id);
  if (!inst || inst->opcode() != spv::Op::OpConstant) {
    return false;
  }

  return IsIntScalar(_, inst->type_id(), true, true);
}

uint32_t GetUint32Constant(ValidationState_t& _, uint32_t id) {
  auto inst = _.FindDef(id);
  return inst->word(3);
}

std::string GetExtInstName(const ValidationState_t& _,
                           const Instruction* inst) {
  const uint32_t ext_inst_set = inst->word(3);
  const uint32_t ext_inst_index = inst->word(4);
  const spv_ext_inst_type_t ext_inst_type =
      spv_ext_inst_type_t(inst->ext_inst_type());

  const ExtInstDesc* desc = nullptr;
  if (LookupExtInst(ext_inst_type, ext_inst_index, &desc) != SPV_SUCCESS ||
      !desc) {
    return std::string("Unknown ExtInst");
  }

  auto* import_inst = _.FindDef(ext_inst_set);
  assert(import_inst);

  std::ostringstream ss;
  ss << import_inst->GetOperandAs<std::string>(1);
  ss << " ";
  ss << desc->name().data();

  return ss.str();
}

// Check that the operand of a debug info instruction |inst| at |word_index|
// is a result id of an instruction with |expected_opcode|.
spv_result_t ValidateOperandForDebugInfo(ValidationState_t& _,
                                         const std::string& operand_name,
                                         spv::Op expected_opcode,
                                         const Instruction* inst,
                                         uint32_t word_index) {
  auto* operand = _.FindDef(inst->word(word_index));
  if (operand->opcode() != expected_opcode) {
    const spvtools::InstructionDesc* desc = nullptr;
    if (spvtools::LookupOpcodeForEnv(_.context()->target_env, expected_opcode,
                                     &desc) != SPV_SUCCESS ||
        !desc) {
      return _.diag(SPV_ERROR_INVALID_DATA, inst)
             << GetExtInstName(_, inst) << ": " << "expected operand "
             << operand_name << " is invalid";
    }
    return _.diag(SPV_ERROR_INVALID_DATA, inst)
           << GetExtInstName(_, inst) << ": " << "expected operand "
           << operand_name << " must be a result id of " << "Op"
           << desc->name().data();
  }
  return SPV_SUCCESS;
}

// For NonSemantic.Shader.DebugInfo.100 check that the operand of a debug info
// instruction |inst| at |word_index| is a result id of a 32-bit integer
// OpConstant instruction. For OpenCL.DebugInfo.100 the parameter is a literal
// word so cannot be validated.
spv_result_t ValidateUint32ConstantOperandForDebugInfo(
    ValidationState_t& _, const std::string& operand_name,
    const Instruction* inst, uint32_t word_index) {
  if (!IsUint32Constant(_, inst->word(word_index))) {
    return _.diag(SPV_ERROR_INVALID_DATA, inst)
           << GetExtInstName(_, inst) << ": expected operand " << operand_name
           << " must be a result id of 32-bit unsigned OpConstant";
  }
  return SPV_SUCCESS;
}

#define CHECK_OPERAND(NAME, opcode, index)                                   \
  do {                                                                       \
    auto result = ValidateOperandForDebugInfo(_, NAME, opcode, inst, index); \
    if (result != SPV_SUCCESS) return result;                                \
  } while (0)

#define CHECK_CONST_UINT_OPERAND(NAME, index)                            \
  if (vulkanDebugInfo) {                                                 \
    auto result =                                                        \
        ValidateUint32ConstantOperandForDebugInfo(_, NAME, inst, index); \
    if (result != SPV_SUCCESS) return result;                            \
  }

// True if the operand of a debug info instruction |inst| at |word_index|
// satisfies |expectation| that is given as a function. Otherwise,
// returns false.
bool DoesDebugInfoOperandMatchExpectation(
    const ValidationState_t& _,
    const std::function<bool(CommonDebugInfoInstructions)>& expectation,
    const Instruction* inst, uint32_t word_index) {
  if (inst->words().size() <= word_index) return false;
  auto* debug_inst = _.FindDef(inst->word(word_index));
  if (!spvIsExtendedInstruction(debug_inst->opcode()) ||
      (debug_inst->ext_inst_type() != SPV_EXT_INST_TYPE_OPENCL_DEBUGINFO_100 &&
       debug_inst->ext_inst_type() !=
           SPV_EXT_INST_TYPE_NONSEMANTIC_SHADER_DEBUGINFO_100) ||
      !expectation(CommonDebugInfoInstructions(debug_inst->word(4)))) {
    return false;
  }
  return true;
}

// Overload for NonSemanticShaderDebugInfo100Instructions.
bool DoesDebugInfoOperandMatchExpectation(
    const ValidationState_t& _,
    const std::function<bool(NonSemanticShaderDebugInfo100Instructions)>&
        expectation,
    const Instruction* inst, uint32_t word_index) {
  if (inst->words().size() <= word_index) return false;
  auto* debug_inst = _.FindDef(inst->word(word_index));
  if (!spvIsExtendedInstruction(debug_inst->opcode()) ||
      (debug_inst->ext_inst_type() !=
       SPV_EXT_INST_TYPE_NONSEMANTIC_SHADER_DEBUGINFO_100) ||
      !expectation(
          NonSemanticShaderDebugInfo100Instructions(debug_inst->word(4)))) {
    return false;
  }
  return true;
}

// Check that the operand of a debug info instruction |inst| at |word_index|
// is a result id of an debug info instruction whose debug instruction type
// is |expected_debug_inst|.
spv_result_t ValidateDebugInfoOperand(
    ValidationState_t& _, const std::string& debug_inst_name,
    CommonDebugInfoInstructions expected_debug_inst, const Instruction* inst,
    uint32_t word_index) {
  std::function<bool(CommonDebugInfoInstructions)> expectation =
      [expected_debug_inst](CommonDebugInfoInstructions dbg_inst) {
        return dbg_inst == expected_debug_inst;
      };
  if (DoesDebugInfoOperandMatchExpectation(_, expectation, inst, word_index))
    return SPV_SUCCESS;

  const ExtInstDesc* desc = nullptr;
  if (LookupExtInst(inst->ext_inst_type(), expected_debug_inst, &desc) !=
          SPV_SUCCESS ||
      !desc) {
    return _.diag(SPV_ERROR_INVALID_DATA, inst)
           << GetExtInstName(_, inst) << ": " << "expected operand "
           << debug_inst_name << " is invalid";
  }
  return _.diag(SPV_ERROR_INVALID_DATA, inst)
         << GetExtInstName(_, inst) << ": " << "expected operand "
         << debug_inst_name << " must be a result id of "
         << desc->name().data();
}

#define CHECK_DEBUG_OPERAND(NAME, debug_opcode, index)                \
  do {                                                                \
    auto result =                                                     \
        ValidateDebugInfoOperand(_, NAME, debug_opcode, inst, index); \
    if (result != SPV_SUCCESS) return result;                         \
  } while (0)

// Check that the operand of a debug info instruction |inst| at |word_index|
// is a result id of an debug info instruction with DebugTypeBasic.
spv_result_t ValidateOperandBaseType(ValidationState_t& _,
                                     const Instruction* inst,
                                     uint32_t word_index) {
  return ValidateDebugInfoOperand(_, "Base Type", CommonDebugInfoDebugTypeBasic,
                                  inst, word_index);
}

// Check that the operand of a debug info instruction |inst| at |word_index|
// is a result id of a debug lexical scope instruction which is one of
// DebugCompilationUnit, DebugFunction, DebugLexicalBlock, or
// DebugTypeComposite.
spv_result_t ValidateOperandLexicalScope(ValidationState_t& _,
                                         const std::string& debug_inst_name,
                                         const Instruction* inst,
                                         uint32_t word_index) {
  std::function<bool(CommonDebugInfoInstructions)> expectation =
      [](CommonDebugInfoInstructions dbg_inst) {
        return dbg_inst == CommonDebugInfoDebugCompilationUnit ||
               dbg_inst == CommonDebugInfoDebugFunction ||
               dbg_inst == CommonDebugInfoDebugLexicalBlock ||
               dbg_inst == CommonDebugInfoDebugTypeComposite;
      };
  if (DoesDebugInfoOperandMatchExpectation(_, expectation, inst, word_index))
    return SPV_SUCCESS;

  return _.diag(SPV_ERROR_INVALID_DATA, inst)
         << GetExtInstName(_, inst) << ": " << "expected operand "
         << debug_inst_name << " must be a result id of a lexical scope";
}

// Check that the operand of a debug info instruction |inst| at |word_index|
// is a result id of a debug type instruction (See DebugTypeXXX in
// "4.3. Type instructions" section of OpenCL.DebugInfo.100 spec.
spv_result_t ValidateOperandDebugType(ValidationState_t& _,
                                      const std::string& debug_inst_name,
                                      const Instruction* inst,
                                      uint32_t word_index,
                                      bool allow_template_param) {
  // Check for NonSemanticShaderDebugInfo100 specific types.
  if (inst->ext_inst_type() ==
      SPV_EXT_INST_TYPE_NONSEMANTIC_SHADER_DEBUGINFO_100) {
    std::function<bool(NonSemanticShaderDebugInfo100Instructions)> expectation =
        [](NonSemanticShaderDebugInfo100Instructions dbg_inst) {
          return dbg_inst == NonSemanticShaderDebugInfo100DebugTypeMatrix;
        };
    if (DoesDebugInfoOperandMatchExpectation(_, expectation, inst, word_index))
      return SPV_SUCCESS;
  }

  // Check for common types.
  std::function<bool(CommonDebugInfoInstructions)> expectation =
      [&allow_template_param](CommonDebugInfoInstructions dbg_inst) {
        if (allow_template_param &&
            (dbg_inst == CommonDebugInfoDebugTypeTemplateParameter ||
             dbg_inst == CommonDebugInfoDebugTypeTemplateTemplateParameter)) {
          return true;
        }
        return CommonDebugInfoDebugTypeBasic <= dbg_inst &&
               dbg_inst <= CommonDebugInfoDebugTypeTemplate;
      };
  if (DoesDebugInfoOperandMatchExpectation(_, expectation, inst, word_index))
    return SPV_SUCCESS;

  return _.diag(SPV_ERROR_INVALID_DATA, inst)
         << GetExtInstName(_, inst) << ": " << "expected operand "
         << debug_inst_name << " is not a valid debug type";
}

spv_result_t ValidateClspvReflectionKernel(ValidationState_t& _,
                                           const Instruction* inst,
                                           uint32_t version) {
  const auto inst_name = ReflectionInstructionName(inst);
  const auto kernel_id = inst->GetOperandAs<uint32_t>(4);
  const auto kernel = _.FindDef(kernel_id);
  if (kernel->opcode() != spv::Op::OpFunction) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << inst_name << " does not reference a function";
  }

  bool found_kernel = false;
  for (auto entry_point : _.entry_points()) {
    if (entry_point == kernel_id) {
      found_kernel = true;
      break;
    }
  }
  if (!found_kernel) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << inst_name << " does not reference an entry-point";
  }

  const auto* exec_models = _.GetExecutionModels(kernel_id);
  if (!exec_models || exec_models->empty()) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << inst_name << " does not reference an entry-point";
  }
  for (auto exec_model : *exec_models) {
    if (exec_model != spv::ExecutionModel::GLCompute) {
      return _.diag(SPV_ERROR_INVALID_ID, inst)
             << inst_name << " must refer only to GLCompute entry-points";
    }
  }

  auto name = _.FindDef(inst->GetOperandAs<uint32_t>(5));
  if (!name || name->opcode() != spv::Op::OpString) {
    return _.diag(SPV_ERROR_INVALID_ID, inst) << "Name must be an OpString";
  }

  const std::string name_str = name->GetOperandAs<std::string>(1);
  bool found = false;
  for (auto& desc : _.entry_point_descriptions(kernel_id)) {
    if (name_str == desc.name) {
      found = true;
      break;
    }
  }
  if (!found) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Name must match an entry-point for Kernel";
  }

  const auto num_operands = inst->operands().size();
  if (version < 5 && num_operands > 6) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Version " << version << " of the " << inst_name
           << " instruction can only have 2 additional operands";
  }

  if (num_operands > 6) {
    const auto num_args_id = inst->GetOperandAs<uint32_t>(6);
    if (!IsUint32Constant(_, num_args_id)) {
      return _.diag(SPV_ERROR_INVALID_ID, inst)
             << "NumArguments must be a 32-bit unsigned integer OpConstant";
    }
  }

  if (num_operands > 7) {
    const auto flags_id = inst->GetOperandAs<uint32_t>(7);
    if (!IsUint32Constant(_, flags_id)) {
      return _.diag(SPV_ERROR_INVALID_ID, inst)
             << "Flags must be a 32-bit unsigned integer OpConstant";
    }
  }

  if (num_operands > 8) {
    const auto atts_id = inst->GetOperandAs<uint32_t>(8);
    if (_.GetIdOpcode(atts_id) != spv::Op::OpString) {
      return _.diag(SPV_ERROR_INVALID_ID, inst)
             << "Attributes must be an OpString";
    }
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateClspvReflectionArgumentInfo(ValidationState_t& _,
                                                 const Instruction* inst) {
  const auto num_operands = inst->operands().size();
  if (_.GetIdOpcode(inst->GetOperandAs<uint32_t>(4)) != spv::Op::OpString) {
    return _.diag(SPV_ERROR_INVALID_ID, inst) << "Name must be an OpString";
  }
  if (num_operands > 5) {
    if (_.GetIdOpcode(inst->GetOperandAs<uint32_t>(5)) != spv::Op::OpString) {
      return _.diag(SPV_ERROR_INVALID_ID, inst)
             << "TypeName must be an OpString";
    }
  }
  if (num_operands > 6) {
    if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(6))) {
      return _.diag(SPV_ERROR_INVALID_ID, inst)
             << "AddressQualifier must be a 32-bit unsigned integer "
                "OpConstant";
    }
  }
  if (num_operands > 7) {
    if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(7))) {
      return _.diag(SPV_ERROR_INVALID_ID, inst)
             << "AccessQualifier must be a 32-bit unsigned integer "
                "OpConstant";
    }
  }
  if (num_operands > 8) {
    if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(8))) {
      return _.diag(SPV_ERROR_INVALID_ID, inst)
             << "TypeQualifier must be a 32-bit unsigned integer "
                "OpConstant";
    }
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateKernelDecl(ValidationState_t& _, const Instruction* inst) {
  const auto decl_id = inst->GetOperandAs<uint32_t>(4);
  const auto decl = _.FindDef(decl_id);
  if (!decl || !spvIsExtendedInstruction(decl->opcode())) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Kernel must be a Kernel extended instruction";
  }

  if (decl->GetOperandAs<uint32_t>(2) != inst->GetOperandAs<uint32_t>(2)) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Kernel must be from the same extended instruction import";
  }

  const auto ext_inst =
      decl->GetOperandAs<NonSemanticClspvReflectionInstructions>(3);
  if (ext_inst != NonSemanticClspvReflectionKernel) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Kernel must be a Kernel extended instruction";
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateArgInfo(ValidationState_t& _, const Instruction* inst,
                             uint32_t info_index) {
  auto info = _.FindDef(inst->GetOperandAs<uint32_t>(info_index));
  if (!info || !spvIsExtendedInstruction(info->opcode())) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "ArgInfo must be an ArgumentInfo extended instruction";
  }

  if (info->GetOperandAs<uint32_t>(2) != inst->GetOperandAs<uint32_t>(2)) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "ArgInfo must be from the same extended instruction import";
  }

  auto ext_inst = info->GetOperandAs<NonSemanticClspvReflectionInstructions>(3);
  if (ext_inst != NonSemanticClspvReflectionArgumentInfo) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "ArgInfo must be an ArgumentInfo extended instruction";
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateClspvReflectionArgumentBuffer(ValidationState_t& _,
                                                   const Instruction* inst) {
  const auto num_operands = inst->operands().size();
  if (auto error = ValidateKernelDecl(_, inst)) {
    return error;
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(5))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Ordinal must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(6))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "DescriptorSet must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(7))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Binding must be a 32-bit unsigned integer OpConstant";
  }

  if (num_operands == 9) {
    if (auto error = ValidateArgInfo(_, inst, 8)) {
      return error;
    }
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateClspvReflectionArgumentOffsetBuffer(
    ValidationState_t& _, const Instruction* inst) {
  const auto num_operands = inst->operands().size();
  if (auto error = ValidateKernelDecl(_, inst)) {
    return error;
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(5))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Ordinal must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(6))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "DescriptorSet must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(7))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Binding must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(8))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Offset must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(9))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Size must be a 32-bit unsigned integer OpConstant";
  }

  if (num_operands == 11) {
    if (auto error = ValidateArgInfo(_, inst, 10)) {
      return error;
    }
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateClspvReflectionArgumentPushConstant(
    ValidationState_t& _, const Instruction* inst) {
  const auto num_operands = inst->operands().size();
  if (auto error = ValidateKernelDecl(_, inst)) {
    return error;
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(5))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Ordinal must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(6))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Offset must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(7))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Size must be a 32-bit unsigned integer OpConstant";
  }

  if (num_operands == 9) {
    if (auto error = ValidateArgInfo(_, inst, 8)) {
      return error;
    }
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateClspvReflectionArgumentWorkgroup(ValidationState_t& _,
                                                      const Instruction* inst) {
  const auto num_operands = inst->operands().size();
  if (auto error = ValidateKernelDecl(_, inst)) {
    return error;
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(5))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Ordinal must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(6))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "SpecId must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(7))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "ElemSize must be a 32-bit unsigned integer OpConstant";
  }

  if (num_operands == 9) {
    if (auto error = ValidateArgInfo(_, inst, 8)) {
      return error;
    }
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateClspvReflectionSpecConstantTriple(
    ValidationState_t& _, const Instruction* inst) {
  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(4))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "X must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(5))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Y must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(6))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Z must be a 32-bit unsigned integer OpConstant";
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateClspvReflectionSpecConstantWorkDim(
    ValidationState_t& _, const Instruction* inst) {
  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(4))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Dim must be a 32-bit unsigned integer OpConstant";
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateClspvReflectionPushConstant(ValidationState_t& _,
                                                 const Instruction* inst) {
  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(4))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Offset must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(5))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Size must be a 32-bit unsigned integer OpConstant";
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateClspvReflectionInitializedData(ValidationState_t& _,
                                                    const Instruction* inst) {
  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(4))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "DescriptorSet must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(5))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Binding must be a 32-bit unsigned integer OpConstant";
  }

  if (_.GetIdOpcode(inst->GetOperandAs<uint32_t>(6)) != spv::Op::OpString) {
    return _.diag(SPV_ERROR_INVALID_ID, inst) << "Data must be an OpString";
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateClspvReflectionSampler(ValidationState_t& _,
                                            const Instruction* inst) {
  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(4))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "DescriptorSet must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(5))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Binding must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(6))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Mask must be a 32-bit unsigned integer OpConstant";
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateClspvReflectionPropertyRequiredWorkgroupSize(
    ValidationState_t& _, const Instruction* inst) {
  if (auto error = ValidateKernelDecl(_, inst)) {
    return error;
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(5))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "X must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(6))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Y must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(7))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Z must be a 32-bit unsigned integer OpConstant";
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateClspvReflectionSubgroupMaxSize(ValidationState_t& _,
                                                    const Instruction* inst) {
  const auto size_id = inst->GetOperandAs<uint32_t>(4);
  if (!IsUint32Constant(_, size_id)) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Size must be a 32-bit unsigned integer OpConstant";
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateClspvReflectionPointerRelocation(ValidationState_t& _,
                                                      const Instruction* inst) {
  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(4))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "ObjectOffset must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(5))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "PointerOffset must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(6))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "PointerSize must be a 32-bit unsigned integer OpConstant";
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateClspvReflectionImageMetadataPushConstant(
    ValidationState_t& _, const Instruction* inst) {
  if (auto error = ValidateKernelDecl(_, inst)) {
    return error;
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(5))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Ordinal must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(6))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Offset must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(7))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Size must be a 32-bit unsigned integer OpConstant";
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateClspvReflectionImageMetadataUniform(
    ValidationState_t& _, const Instruction* inst) {
  if (auto error = ValidateKernelDecl(_, inst)) {
    return error;
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(5))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Ordinal must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(6))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "DescriptorSet must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(7))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Binding must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(8))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Offset must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(9))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Size must be a 32-bit unsigned integer OpConstant";
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateClspvReflectionPushConstantData(ValidationState_t& _,
                                                     const Instruction* inst) {
  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(4))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Offset must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(5))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Size must be a 32-bit unsigned integer OpConstant";
  }

  if (_.GetIdOpcode(inst->GetOperandAs<uint32_t>(6)) != spv::Op::OpString) {
    return _.diag(SPV_ERROR_INVALID_ID, inst) << "Data must be an OpString";
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateClspvReflectionPrintfInfo(ValidationState_t& _,
                                               const Instruction* inst) {
  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(4))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "PrintfID must be a 32-bit unsigned integer OpConstant";
  }

  if (_.GetIdOpcode(inst->GetOperandAs<uint32_t>(5)) != spv::Op::OpString) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "FormatString must be an OpString";
  }

  for (size_t i = 6; i < inst->operands().size(); ++i) {
    if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(i))) {
      return _.diag(SPV_ERROR_INVALID_ID, inst)
             << "ArgumentSizes must be a 32-bit unsigned integer OpConstant";
    }
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateClspvReflectionPrintfStorageBuffer(
    ValidationState_t& _, const Instruction* inst) {
  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(4))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "DescriptorSet must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(5))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Binding must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(6))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Size must be a 32-bit unsigned integer OpConstant";
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateClspvReflectionPrintfPushConstant(
    ValidationState_t& _, const Instruction* inst) {
  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(4))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Offset must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(5))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Size must be a 32-bit unsigned integer OpConstant";
  }

  if (!IsUint32Constant(_, inst->GetOperandAs<uint32_t>(6))) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "BufferSize must be a 32-bit unsigned integer OpConstant";
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateClspvReflectionInstruction(ValidationState_t& _,
                                                const Instruction* inst,
                                                uint32_t version) {
  if (!_.IsVoidType(inst->type_id())) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << "Return Type must be OpTypeVoid";
  }

  uint32_t required_version = 0;
  const auto ext_inst =
      inst->GetOperandAs<NonSemanticClspvReflectionInstructions>(3);
  switch (ext_inst) {
    case NonSemanticClspvReflectionKernel:
    case NonSemanticClspvReflectionArgumentInfo:
    case NonSemanticClspvReflectionArgumentStorageBuffer:
    case NonSemanticClspvReflectionArgumentUniform:
    case NonSemanticClspvReflectionArgumentPodStorageBuffer:
    case NonSemanticClspvReflectionArgumentPodUniform:
    case NonSemanticClspvReflectionArgumentPodPushConstant:
    case NonSemanticClspvReflectionArgumentSampledImage:
    case NonSemanticClspvReflectionArgumentStorageImage:
    case NonSemanticClspvReflectionArgumentSampler:
    case NonSemanticClspvReflectionArgumentWorkgroup:
    case NonSemanticClspvReflectionSpecConstantWorkgroupSize:
    case NonSemanticClspvReflectionSpecConstantGlobalOffset:
    case NonSemanticClspvReflectionSpecConstantWorkDim:
    case NonSemanticClspvReflectionPushConstantGlobalOffset:
    case NonSemanticClspvReflectionPushConstantEnqueuedLocalSize:
    case NonSemanticClspvReflectionPushConstantGlobalSize:
    case NonSemanticClspvReflectionPushConstantRegionOffset:
    case NonSemanticClspvReflectionPushConstantNumWorkgroups:
    case NonSemanticClspvReflectionPushConstantRegionGroupOffset:
    case NonSemanticClspvReflectionConstantDataStorageBuffer:
    case NonSemanticClspvReflectionConstantDataUniform:
    case NonSemanticClspvReflectionLiteralSampler:
    case NonSemanticClspvReflectionPropertyRequiredWorkgroupSize:
      required_version = 1;
      break;
    case NonSemanticClspvReflectionSpecConstantSubgroupMaxSize:
      required_version = 2;
      break;
    case NonSemanticClspvReflectionArgumentPointerPushConstant:
    case NonSemanticClspvReflectionArgumentPointerUniform:
    case NonSemanticClspvReflectionProgramScopeVariablesStorageBuffer:
    case NonSemanticClspvReflectionProgramScopeVariablePointerRelocation:
    case NonSemanticClspvReflectionImageArgumentInfoChannelOrderPushConstant:
    case NonSemanticClspvReflectionImageArgumentInfoChannelDataTypePushConstant:
    case NonSemanticClspvReflectionImageArgumentInfoChannelOrderUniform:
    case NonSemanticClspvReflectionImageArgumentInfoChannelDataTypeUniform:
      required_version = 3;
      break;
    case NonSemanticClspvReflectionArgumentStorageTexelBuffer:
    case NonSemanticClspvReflectionArgumentUniformTexelBuffer:
      required_version = 4;
      break;
    case NonSemanticClspvReflectionConstantDataPointerPushConstant:
    case NonSemanticClspvReflectionProgramScopeVariablePointerPushConstant:
    case NonSemanticClspvReflectionPrintfInfo:
    case NonSemanticClspvReflectionPrintfBufferStorageBuffer:
    case NonSemanticClspvReflectionPrintfBufferPointerPushConstant:
      required_version = 5;
      break;
    default:
      break;
  }
  if (version < required_version) {
    return _.diag(SPV_ERROR_INVALID_ID, inst)
           << ReflectionInstructionName(inst) << " requires version "
           << required_version << ", but parsed version is " << version;
  }

  switch (ext_inst) {
    case NonSemanticClspvReflectionKernel:
      return ValidateClspvReflectionKernel(_, inst, version);
    case NonSemanticClspvReflectionArgumentInfo:
      return ValidateClspvReflectionArgumentInfo(_, inst);
    case NonSemanticClspvReflectionArgumentStorageBuffer:
    case NonSemanticClspvReflectionArgumentUniform:
    case NonSemanticClspvReflectionArgumentSampledImage:
    case NonSemanticClspvReflectionArgumentStorageImage:
    case NonSemanticClspvReflectionArgumentSampler:
    case NonSemanticClspvReflectionArgumentStorageTexelBuffer:
    case NonSemanticClspvReflectionArgumentUniformTexelBuffer:
      return ValidateClspvReflectionArgumentBuffer(_, inst);
    case NonSemanticClspvReflectionArgumentPodStorageBuffer:
    case NonSemanticClspvReflectionArgumentPodUniform:
    case NonSemanticClspvReflectionArgumentPointerUniform:
      return ValidateClspvReflectionArgumentOffsetBuffer(_, inst);
    case NonSemanticClspvReflectionArgumentPodPushConstant:
    case NonSemanticClspvReflectionArgumentPointerPushConstant:
      return ValidateClspvReflectionArgumentPushConstant(_, inst);
    case NonSemanticClspvReflectionArgumentWorkgroup:
      return ValidateClspvReflectionArgumentWorkgroup(_, inst);
    case NonSemanticClspvReflectionSpecConstantWorkgroupSize:
    case NonSemanticClspvReflectionSpecConstantGlobalOffset:
      return ValidateClspvReflectionSpecConstantTriple(_, inst);
    case NonSemanticClspvReflectionSpecConstantWorkDim:
      return ValidateClspvReflectionSpecConstantWorkDim(_, inst);
    case NonSemanticClspvReflectionPushConstantGlobalOffset:
    case NonSemanticClspvReflectionPushConstantEnqueuedLocalSize:
    case NonSemanticClspvReflectionPushConstantGlobalSize:
    case NonSemanticClspvReflectionPushConstantRegionOffset:
    case NonSemanticClspvReflectionPushConstantNumWorkgroups:
    case NonSemanticClspvReflectionPushConstantRegionGroupOffset:
      return ValidateClspvReflectionPushConstant(_, inst);
    case NonSemanticClspvReflectionConstantDataStorageBuffer:
    case NonSemanticClspvReflectionConstantDataUniform:
    case NonSemanticClspvReflectionProgramScopeVariablesStorageBuffer:
      return ValidateClspvReflectionInitializedData(_, inst);
    case NonSemanticClspvReflectionLiteralSampler:
      return ValidateClspvReflectionSampler(_, inst);
    case NonSemanticClspvReflectionPropertyRequiredWorkgroupSize:
      return ValidateClspvReflectionPropertyRequiredWorkgroupSize(_, inst);
    case NonSemanticClspvReflectionSpecConstantSubgroupMaxSize:
      return ValidateClspvReflectionSubgroupMaxSize(_, inst);
    case NonSemanticClspvReflectionProgramScopeVariablePointerRelocation:
      return ValidateClspvReflectionPointerRelocation(_, inst);
    case NonSemanticClspvReflectionImageArgumentInfoChannelOrderPushConstant:
    case NonSemanticClspvReflectionImageArgumentInfoChannelDataTypePushConstant:
      return ValidateClspvReflectionImageMetadataPushConstant(_, inst);
    case NonSemanticClspvReflectionImageArgumentInfoChannelOrderUniform:
    case NonSemanticClspvReflectionImageArgumentInfoChannelDataTypeUniform:
      return ValidateClspvReflectionImageMetadataUniform(_, inst);
    case NonSemanticClspvReflectionConstantDataPointerPushConstant:
    case NonSemanticClspvReflectionProgramScopeVariablePointerPushConstant:
      return ValidateClspvReflectionPushConstantData(_, inst);
    case NonSemanticClspvReflectionPrintfInfo:
      return ValidateClspvReflectionPrintfInfo(_, inst);
    case NonSemanticClspvReflectionPrintfBufferStorageBuffer:
      return ValidateClspvReflectionPrintfStorageBuffer(_, inst);
    case NonSemanticClspvReflectionPrintfBufferPointerPushConstant:
      return ValidateClspvReflectionPrintfPushConstant(_, inst);
    default:
      break;
  }

  return SPV_SUCCESS;
}

bool IsConstIntScalarTypeWith32Or64Bits(ValidationState_t& _,
                                        Instruction* instr) {
  if (instr->opcode() != spv::Op::OpConstant) return false;
  if (!_.IsIntScalarType(instr->type_id())) return false;
  uint32_t size_in_bits = _.GetBitWidth(instr->type_id());
  return size_in_bits == 32 || size_in_bits == 64;
}

bool IsConstWithIntScalarType(ValidationState_t& _, const Instruction* inst,
                              uint32_t word_index) {
  auto* int_scalar_const = _.FindDef(inst->word(word_index));
  if (int_scalar_const->opcode() == spv::Op::OpConstant &&
      _.IsIntScalarType(int_scalar_const->type_id())) {
    return true;
  }
  return false;
}

bool IsDebugVariableWithIntScalarType(ValidationState_t& _,
                                      const Instruction* inst,
                                      uint32_t word_index) {
  auto* dbg_int_scalar_var = _.FindDef(inst->word(word_index));
  if (CommonDebugInfoInstructions(dbg_int_scalar_var->word(4)) ==
          CommonDebugInfoDebugLocalVariable ||
      CommonDebugInfoInstructions(dbg_int_scalar_var->word(4)) ==
          CommonDebugInfoDebugGlobalVariable) {
    auto* dbg_type = _.FindDef(dbg_int_scalar_var->word(6));
    if (CommonDebugInfoInstructions(dbg_type->word(4)) ==
        CommonDebugInfoDebugTypeBasic) {
      const spv_ext_inst_type_t ext_inst_type =
          spv_ext_inst_type_t(inst->ext_inst_type());
      const bool vulkanDebugInfo =
          ext_inst_type == SPV_EXT_INST_TYPE_NONSEMANTIC_SHADER_DEBUGINFO_100;
      uint32_t encoding = dbg_type->word(7);
      if (!vulkanDebugInfo || IsUint32Constant(_, encoding)) {
        auto ocl_encoding = OpenCLDebugInfo100DebugBaseTypeAttributeEncoding(
            vulkanDebugInfo ? GetUint32Constant(_, encoding) : encoding);
        if (ocl_encoding == OpenCLDebugInfo100Signed ||
            ocl_encoding == OpenCLDebugInfo100Unsigned) {
          return true;
        }
      }
    }
  }
  return false;
}

}  // anonymous namespace

spv_result_t ValidateExtension(ValidationState_t& _, const Instruction* inst) {
  std::string extension = GetExtensionString(&(inst->c_inst()));
  if (_.version() < SPV_SPIRV_VERSION_WORD(1, 3)) {
    if (extension == ExtensionToString(kSPV_KHR_vulkan_memory_model) ||
        extension ==
            ExtensionToString(kSPV_QCOM_cooperative_matrix_conversion)) {
      return _.diag(SPV_ERROR_WRONG_VERSION, inst)
             << extension << " extension requires SPIR-V version 1.3 or later.";
    }
  }
  if (_.version() < SPV_SPIRV_VERSION_WORD(1, 4)) {
    if (extension ==
            ExtensionToString(kSPV_KHR_workgroup_memory_explicit_layout) ||
        extension == ExtensionToString(kSPV_EXT_mesh_shader) ||
        extension == ExtensionToString(kSPV_NV_shader_invocation_reorder) ||
        extension == ExtensionToString(kSPV_EXT_shader_invocation_reorder) ||
        extension ==
            ExtensionToString(kSPV_NV_cluster_acceleration_structure) ||
        extension == ExtensionToString(kSPV_NV_linear_swept_spheres) ||
        extension == ExtensionToString(kSPV_QCOM_image_processing) ||
        extension == ExtensionToString(kSPV_QCOM_image_processing2)) {
      return _.diag(SPV_ERROR_WRONG_VERSION, inst)
             << extension << " extension requires SPIR-V version 1.4 or later.";
    }
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateExtInstImport(ValidationState_t& _,
                                   const Instruction* inst) {
  const auto name_id = 1;
  if (_.version() <= SPV_SPIRV_VERSION_WORD(1, 5) &&
      !_.HasExtension(kSPV_KHR_non_semantic_info)) {
    const std::string name = inst->GetOperandAs<std::string>(name_id);
    if (name.find("NonSemantic.") == 0) {
      return _.diag(SPV_ERROR_INVALID_DATA, inst)
             << "NonSemantic extended instruction "
                "sets cannot be declared "
                "without SPV_KHR_non_semantic_info. (This can also be fixed "
                "having SPIR-V 1.6 or later)";
    }
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateExtInstGlslStd450(ValidationState_t& _,
                                       const Instruction* inst) {
  const uint32_t result_type = inst->type_id();
  const uint32_t num_operands = static_cast<uint32_t>(inst->operands().size());

  const uint32_t ext_inst_index = inst->word(4);
  const GLSLstd450 ext_inst_key = GLSLstd450(ext_inst_index);
  switch (ext_inst_key) {
    case GLSLstd450Round:
    case GLSLstd450RoundEven:
    case GLSLstd450FAbs:
    case GLSLstd450Trunc:
    case GLSLstd450FSign:
    case GLSLstd450Floor:
    case GLSLstd450Ceil:
    case GLSLstd450Fract:
    case GLSLstd450Sqrt:
    case GLSLstd450InverseSqrt:
    case GLSLstd450FMin:
    case GLSLstd450FMax:
    case GLSLstd450FClamp:
    case GLSLstd450FMix:
    case GLSLstd450Step:
    case GLSLstd450SmoothStep:
    case GLSLstd450Fma:
    case GLSLstd450Normalize:
    case GLSLstd450FaceForward:
    case GLSLstd450Reflect:
    case GLSLstd450NMin:
    case GLSLstd450NMax:
    case GLSLstd450NClamp: {
      bool supportsCoopVec =
          (ext_inst_key == GLSLstd450FMin || ext_inst_key == GLSLstd450FMax ||
           ext_inst_key == GLSLstd450FClamp || ext_inst_key == GLSLstd450NMin ||
           ext_inst_key == GLSLstd450NMax || ext_inst_key == GLSLstd450NClamp ||
           ext_inst_key == GLSLstd450Step || ext_inst_key == GLSLstd450Fma);

      if (!_.IsFloatScalarOrVectorType(result_type) &&
          !(supportsCoopVec && _.IsFloatCooperativeVectorNVType(result_type))) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a float scalar or vector type";
      }

      for (uint32_t operand_index = 4; operand_index < num_operands;
           ++operand_index) {
        const uint32_t operand_type = _.GetOperandTypeId(inst, operand_index);
        if (result_type != operand_type) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": "
                 << "expected types of all operands to be equal to Result "
                    "Type";
        }
      }
      break;
    }

    case GLSLstd450SAbs:
    case GLSLstd450SSign:
    case GLSLstd450UMin:
    case GLSLstd450SMin:
    case GLSLstd450UMax:
    case GLSLstd450SMax:
    case GLSLstd450UClamp:
    case GLSLstd450SClamp:
    case GLSLstd450FindILsb:
    case GLSLstd450FindUMsb:
    case GLSLstd450FindSMsb: {
      bool supportsCoopVec =
          (ext_inst_key == GLSLstd450UMin || ext_inst_key == GLSLstd450UMax ||
           ext_inst_key == GLSLstd450UClamp || ext_inst_key == GLSLstd450SMin ||
           ext_inst_key == GLSLstd450SMax || ext_inst_key == GLSLstd450SClamp);

      if (!_.IsIntScalarOrVectorType(result_type) &&
          !(supportsCoopVec && _.IsIntCooperativeVectorNVType(result_type))) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be an int scalar or vector type";
      }

      const uint32_t result_type_bit_width = _.GetBitWidth(result_type);
      const uint32_t result_type_dimension = _.GetDimension(result_type);

      for (uint32_t operand_index = 4; operand_index < num_operands;
           ++operand_index) {
        const uint32_t operand_type = _.GetOperandTypeId(inst, operand_index);
        if (!operand_type ||
            (!_.IsIntScalarOrVectorType(operand_type) &&
             !(supportsCoopVec &&
               _.IsIntCooperativeVectorNVType(operand_type)))) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": "
                 << "expected all operands to be int scalars or vectors";
        }

        if (result_type_dimension != _.GetDimension(operand_type)) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": "
                 << "expected all operands to have the same dimension as "
                 << "Result Type";
        }

        if (result_type_bit_width != _.GetBitWidth(operand_type)) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": "
                 << "expected all operands to have the same bit width as "
                 << "Result Type";
        }

        if (ext_inst_key == GLSLstd450FindUMsb ||
            ext_inst_key == GLSLstd450FindSMsb) {
          if (result_type_bit_width != 32) {
            return _.diag(SPV_ERROR_INVALID_DATA, inst)
                   << GetExtInstName(_, inst) << ": "
                   << "this instruction is currently limited to 32-bit width "
                   << "components";
          }
        }
      }
      break;
    }

    case GLSLstd450Radians:
    case GLSLstd450Degrees:
    case GLSLstd450Sin:
    case GLSLstd450Cos:
    case GLSLstd450Tan:
    case GLSLstd450Asin:
    case GLSLstd450Acos:
    case GLSLstd450Atan:
    case GLSLstd450Sinh:
    case GLSLstd450Cosh:
    case GLSLstd450Tanh:
    case GLSLstd450Asinh:
    case GLSLstd450Acosh:
    case GLSLstd450Atanh:
    case GLSLstd450Exp:
    case GLSLstd450Exp2:
    case GLSLstd450Log:
    case GLSLstd450Log2:
    case GLSLstd450Atan2:
    case GLSLstd450Pow: {
      bool supportsCoopVec =
          (ext_inst_key == GLSLstd450Atan || ext_inst_key == GLSLstd450Tanh ||
           ext_inst_key == GLSLstd450Exp || ext_inst_key == GLSLstd450Log);

      if (!_.IsFloatScalarOrVectorType(result_type) &&
          !(supportsCoopVec && _.IsFloatCooperativeVectorNVType(result_type))) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a 16 or 32-bit scalar or "
                  "vector float type";
      }

      const uint32_t result_type_bit_width = _.GetBitWidth(result_type);
      if (result_type_bit_width != 16 && result_type_bit_width != 32) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a 16 or 32-bit scalar or "
                  "vector float type";
      }

      for (uint32_t operand_index = 4; operand_index < num_operands;
           ++operand_index) {
        const uint32_t operand_type = _.GetOperandTypeId(inst, operand_index);
        if (result_type != operand_type) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": "
                 << "expected types of all operands to be equal to Result "
                    "Type";
        }
      }
      break;
    }

    case GLSLstd450Determinant: {
      const uint32_t x_type = _.GetOperandTypeId(inst, 4);
      uint32_t num_rows = 0;
      uint32_t num_cols = 0;
      uint32_t col_type = 0;
      uint32_t component_type = 0;
      if (!_.GetMatrixTypeInfo(x_type, &num_rows, &num_cols, &col_type,
                               &component_type) ||
          num_rows != num_cols) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand X to be a square matrix";
      }

      if (result_type != component_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand X component type to be equal to "
               << "Result Type";
      }
      break;
    }

    case GLSLstd450MatrixInverse: {
      uint32_t num_rows = 0;
      uint32_t num_cols = 0;
      uint32_t col_type = 0;
      uint32_t component_type = 0;
      if (!_.GetMatrixTypeInfo(result_type, &num_rows, &num_cols, &col_type,
                               &component_type) ||
          num_rows != num_cols) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a square matrix";
      }

      const uint32_t x_type = _.GetOperandTypeId(inst, 4);
      if (result_type != x_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand X type to be equal to Result Type";
      }
      break;
    }

    case GLSLstd450Modf: {
      if (!_.IsFloatScalarOrVectorType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a scalar or vector float type";
      }

      const uint32_t x_type = _.GetOperandTypeId(inst, 4);
      const uint32_t i_type = _.GetOperandTypeId(inst, 5);

      if (x_type != result_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand X type to be equal to Result Type";
      }

      spv::StorageClass i_storage_class;
      uint32_t i_data_type = 0;
      if (!_.GetPointerTypeInfo(i_type, &i_data_type, &i_storage_class)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand I to be a pointer";
      }

      if (i_data_type != result_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand I data type to be equal to Result Type";
      }

      break;
    }

    case GLSLstd450ModfStruct: {
      std::vector<uint32_t> result_types;
      if (!_.GetStructMemberTypes(result_type, &result_types) ||
          result_types.size() != 2 ||
          !_.IsFloatScalarOrVectorType(result_types[0]) ||
          result_types[1] != result_types[0]) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a struct with two identical "
               << "scalar or vector float type members";
      }

      const uint32_t x_type = _.GetOperandTypeId(inst, 4);
      if (x_type != result_types[0]) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand X type to be equal to members of "
               << "Result Type struct";
      }
      break;
    }

    case GLSLstd450Frexp: {
      if (!_.IsFloatScalarOrVectorType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a scalar or vector float type";
      }

      const uint32_t x_type = _.GetOperandTypeId(inst, 4);
      const uint32_t exp_type = _.GetOperandTypeId(inst, 5);

      if (x_type != result_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand X type to be equal to Result Type";
      }

      spv::StorageClass exp_storage_class;
      uint32_t exp_data_type = 0;
      if (!_.GetPointerTypeInfo(exp_type, &exp_data_type, &exp_storage_class)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand Exp to be a pointer";
      }

      if (!_.IsIntScalarOrVectorType(exp_data_type) ||
          (!_.HasExtension(kSPV_AMD_gpu_shader_int16) &&
           _.GetBitWidth(exp_data_type) != 32) ||
          (_.HasExtension(kSPV_AMD_gpu_shader_int16) &&
           _.GetBitWidth(exp_data_type) != 16 &&
           _.GetBitWidth(exp_data_type) != 32)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand Exp data type to be a "
               << (_.HasExtension(kSPV_AMD_gpu_shader_int16)
                       ? "16-bit or 32-bit "
                       : "32-bit ")
               << "int scalar or vector type";
      }

      if (_.GetDimension(result_type) != _.GetDimension(exp_data_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand Exp data type to have the same component "
               << "number as Result Type";
      }

      break;
    }

    case GLSLstd450Ldexp: {
      if (!_.IsFloatScalarOrVectorType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a scalar or vector float type";
      }

      const uint32_t x_type = _.GetOperandTypeId(inst, 4);
      const uint32_t exp_type = _.GetOperandTypeId(inst, 5);

      if (x_type != result_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand X type to be equal to Result Type";
      }

      if (!_.IsIntScalarOrVectorType(exp_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand Exp to be a 32-bit int scalar "
               << "or vector type";
      }

      if (_.GetDimension(result_type) != _.GetDimension(exp_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand Exp to have the same component "
               << "number as Result Type";
      }

      break;
    }

    case GLSLstd450FrexpStruct: {
      std::vector<uint32_t> result_types;
      if (!_.GetStructMemberTypes(result_type, &result_types) ||
          result_types.size() != 2 ||
          !_.IsFloatScalarOrVectorType(result_types[0]) ||
          !_.IsIntScalarOrVectorType(result_types[1]) ||
          (!_.HasExtension(kSPV_AMD_gpu_shader_int16) &&
           _.GetBitWidth(result_types[1]) != 32) ||
          (_.HasExtension(kSPV_AMD_gpu_shader_int16) &&
           _.GetBitWidth(result_types[1]) != 16 &&
           _.GetBitWidth(result_types[1]) != 32) ||
          _.GetDimension(result_types[0]) != _.GetDimension(result_types[1])) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a struct with two members, "
               << "first member a float scalar or vector, second member a "
               << (_.HasExtension(kSPV_AMD_gpu_shader_int16)
                       ? "16-bit or 32-bit "
                       : "32-bit ")
               << "int scalar or vector with the same number of "
               << "components as the first member";
      }

      const uint32_t x_type = _.GetOperandTypeId(inst, 4);
      if (x_type != result_types[0]) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand X type to be equal to the first member "
               << "of Result Type struct";
      }
      break;
    }

    case GLSLstd450PackSnorm4x8:
    case GLSLstd450PackUnorm4x8: {
      if (!_.IsIntScalarType(result_type, 32)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be 32-bit int scalar type";
      }

      const uint32_t v_type = _.GetOperandTypeId(inst, 4);
      if (!_.IsFloatVectorType(v_type) || _.GetDimension(v_type) != 4 ||
          _.GetBitWidth(v_type) != 32) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand V to be a 32-bit float vector of size 4";
      }
      break;
    }

    case GLSLstd450PackSnorm2x16:
    case GLSLstd450PackUnorm2x16:
    case GLSLstd450PackHalf2x16: {
      if (!_.IsIntScalarType(result_type, 32)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be 32-bit int scalar type";
      }

      const uint32_t v_type = _.GetOperandTypeId(inst, 4);
      if (!_.IsFloatVectorType(v_type) || _.GetDimension(v_type) != 2 ||
          _.GetBitWidth(v_type) != 32) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand V to be a 32-bit float vector of size 2";
      }
      break;
    }

    case GLSLstd450PackDouble2x32: {
      if (!_.IsFloatScalarType(result_type, 64)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be 64-bit float scalar type";
      }

      const uint32_t v_type = _.GetOperandTypeId(inst, 4);
      if (!_.IsIntVectorType(v_type) || _.GetDimension(v_type) != 2 ||
          _.GetBitWidth(v_type) != 32) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand V to be a 32-bit int vector of size 2";
      }
      break;
    }

    case GLSLstd450UnpackSnorm4x8:
    case GLSLstd450UnpackUnorm4x8: {
      if (!_.IsFloatVectorType(result_type) ||
          _.GetDimension(result_type) != 4 ||
          _.GetBitWidth(result_type) != 32) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a 32-bit float vector of size "
                  "4";
      }

      const uint32_t v_type = _.GetOperandTypeId(inst, 4);
      if (!_.IsIntScalarType(v_type, 32)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P to be a 32-bit int scalar";
      }
      break;
    }

    case GLSLstd450UnpackSnorm2x16:
    case GLSLstd450UnpackUnorm2x16:
    case GLSLstd450UnpackHalf2x16: {
      if (!_.IsFloatVectorType(result_type) ||
          _.GetDimension(result_type) != 2 ||
          _.GetBitWidth(result_type) != 32) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a 32-bit float vector of size "
                  "2";
      }

      const uint32_t v_type = _.GetOperandTypeId(inst, 4);
      if (!_.IsIntScalarType(v_type, 32)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P to be a 32-bit int scalar";
      }
      break;
    }

    case GLSLstd450UnpackDouble2x32: {
      if (!_.IsIntVectorType(result_type) || _.GetDimension(result_type) != 2 ||
          _.GetBitWidth(result_type) != 32) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a 32-bit int vector of size "
                  "2";
      }

      const uint32_t v_type = _.GetOperandTypeId(inst, 4);
      if (!_.IsFloatScalarType(v_type, 64)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand V to be a 64-bit float scalar";
      }
      break;
    }

    case GLSLstd450Length: {
      if (!_.IsFloatScalarType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a float scalar type";
      }

      const uint32_t x_type = _.GetOperandTypeId(inst, 4);
      if (!_.IsFloatScalarOrVectorType(x_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand X to be of float scalar or vector type";
      }

      if (result_type != _.GetComponentType(x_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand X component type to be equal to Result "
                  "Type";
      }
      break;
    }

    case GLSLstd450Distance: {
      if (!_.IsFloatScalarType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a float scalar type";
      }

      const uint32_t p0_type = _.GetOperandTypeId(inst, 4);
      if (!_.IsFloatScalarOrVectorType(p0_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P0 to be of float scalar or vector type";
      }

      if (result_type != _.GetComponentType(p0_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P0 component type to be equal to "
               << "Result Type";
      }

      const uint32_t p1_type = _.GetOperandTypeId(inst, 5);
      if (!_.IsFloatScalarOrVectorType(p1_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P1 to be of float scalar or vector type";
      }

      if (result_type != _.GetComponentType(p1_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P1 component type to be equal to "
               << "Result Type";
      }

      if (_.GetDimension(p0_type) != _.GetDimension(p1_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operands P0 and P1 to have the same number of "
               << "components";
      }
      break;
    }

    case GLSLstd450Cross: {
      if (!_.IsFloatVectorType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a float vector type";
      }

      if (_.GetDimension(result_type) != 3) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to have 3 components";
      }

      const uint32_t x_type = _.GetOperandTypeId(inst, 4);
      const uint32_t y_type = _.GetOperandTypeId(inst, 5);

      if (x_type != result_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand X type to be equal to Result Type";
      }

      if (y_type != result_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand Y type to be equal to Result Type";
      }
      break;
    }

    case GLSLstd450Refract: {
      if (!_.IsFloatScalarOrVectorType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a float scalar or vector type";
      }

      const uint32_t i_type = _.GetOperandTypeId(inst, 4);
      const uint32_t n_type = _.GetOperandTypeId(inst, 5);
      const uint32_t eta_type = _.GetOperandTypeId(inst, 6);

      if (result_type != i_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand I to be of type equal to Result Type";
      }

      if (result_type != n_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand N to be of type equal to Result Type";
      }

      if (!_.IsFloatScalarType(eta_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand Eta to be a float scalar";
      }
      break;
    }

    case GLSLstd450InterpolateAtCentroid:
    case GLSLstd450InterpolateAtSample:
    case GLSLstd450InterpolateAtOffset: {
      if (!_.HasCapability(spv::Capability::InterpolationFunction)) {
        return _.diag(SPV_ERROR_INVALID_CAPABILITY, inst)
               << GetExtInstName(_, inst)
               << " requires capability InterpolationFunction";
      }

      if (!_.IsFloatScalarOrVectorType(result_type) ||
          _.GetBitWidth(result_type) != 32) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a 32-bit float scalar "
               << "or vector type";
      }

      // If HLSL legalization and first operand is an OpLoad, use load
      // pointer as the interpolant lvalue. Else use interpolate first
      // operand.
      uint32_t interp_id = inst->GetOperandAs<uint32_t>(4);
      auto* interp_inst = _.FindDef(interp_id);
      uint32_t interpolant_type = (_.options()->before_hlsl_legalization &&
                                   interp_inst->opcode() == spv::Op::OpLoad)
                                      ? _.GetOperandTypeId(interp_inst, 2)
                                      : _.GetOperandTypeId(inst, 4);

      spv::StorageClass interpolant_storage_class;
      uint32_t interpolant_data_type = 0;
      if (!_.GetPointerTypeInfo(interpolant_type, &interpolant_data_type,
                                &interpolant_storage_class)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Interpolant to be a pointer";
      }

      if (result_type != interpolant_data_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Interpolant data type to be equal to Result Type";
      }

      if (interpolant_storage_class != spv::StorageClass::Input) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Interpolant storage class to be Input";
      }

      if (ext_inst_key == GLSLstd450InterpolateAtSample) {
        const uint32_t sample_type = _.GetOperandTypeId(inst, 5);
        if (!_.IsIntScalarType(sample_type, 32)) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": "
                 << "expected Sample to be 32-bit integer";
        }
      }

      if (ext_inst_key == GLSLstd450InterpolateAtOffset) {
        const uint32_t offset_type = _.GetOperandTypeId(inst, 5);
        if (!_.IsFloatVectorType(offset_type) ||
            _.GetDimension(offset_type) != 2 ||
            _.GetBitWidth(offset_type) != 32) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": "
                 << "expected Offset to be a vector of 2 32-bit floats";
        }
      }

      _.function(inst->function()->id())
          ->RegisterExecutionModelLimitation(
              spv::ExecutionModel::Fragment,
              GetExtInstName(_, inst) +
                  std::string(" requires Fragment execution model"));
      break;
    }

    case GLSLstd450IMix: {
      return _.diag(SPV_ERROR_INVALID_DATA, inst)
             << "Extended instruction GLSLstd450IMix is not supported";
    }

    case GLSLstd450Bad: {
      return _.diag(SPV_ERROR_INVALID_DATA, inst)
             << "Encountered extended instruction GLSLstd450Bad";
    }

    case GLSLstd450Count: {
      assert(0);
      break;
    }
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateExtInstOpenClStd(ValidationState_t& _,
                                      const Instruction* inst) {
  const uint32_t result_type = inst->type_id();
  const uint32_t num_operands = static_cast<uint32_t>(inst->operands().size());
  const uint32_t ext_inst_index = inst->word(4);
  const OpenCLLIB::Entrypoints ext_inst_key =
      OpenCLLIB::Entrypoints(ext_inst_index);
  switch (ext_inst_key) {
    case OpenCLLIB::Acos:
    case OpenCLLIB::Acosh:
    case OpenCLLIB::Acospi:
    case OpenCLLIB::Asin:
    case OpenCLLIB::Asinh:
    case OpenCLLIB::Asinpi:
    case OpenCLLIB::Atan:
    case OpenCLLIB::Atan2:
    case OpenCLLIB::Atanh:
    case OpenCLLIB::Atanpi:
    case OpenCLLIB::Atan2pi:
    case OpenCLLIB::Cbrt:
    case OpenCLLIB::Ceil:
    case OpenCLLIB::Copysign:
    case OpenCLLIB::Cos:
    case OpenCLLIB::Cosh:
    case OpenCLLIB::Cospi:
    case OpenCLLIB::Erfc:
    case OpenCLLIB::Erf:
    case OpenCLLIB::Exp:
    case OpenCLLIB::Exp2:
    case OpenCLLIB::Exp10:
    case OpenCLLIB::Expm1:
    case OpenCLLIB::Fabs:
    case OpenCLLIB::Fdim:
    case OpenCLLIB::Floor:
    case OpenCLLIB::Fma:
    case OpenCLLIB::Fmax:
    case OpenCLLIB::Fmin:
    case OpenCLLIB::Fmod:
    case OpenCLLIB::Hypot:
    case OpenCLLIB::Lgamma:
    case OpenCLLIB::Log:
    case OpenCLLIB::Log2:
    case OpenCLLIB::Log10:
    case OpenCLLIB::Log1p:
    case OpenCLLIB::Logb:
    case OpenCLLIB::Mad:
    case OpenCLLIB::Maxmag:
    case OpenCLLIB::Minmag:
    case OpenCLLIB::Nextafter:
    case OpenCLLIB::Pow:
    case OpenCLLIB::Powr:
    case OpenCLLIB::Remainder:
    case OpenCLLIB::Rint:
    case OpenCLLIB::Round:
    case OpenCLLIB::Rsqrt:
    case OpenCLLIB::Sin:
    case OpenCLLIB::Sinh:
    case OpenCLLIB::Sinpi:
    case OpenCLLIB::Sqrt:
    case OpenCLLIB::Tan:
    case OpenCLLIB::Tanh:
    case OpenCLLIB::Tanpi:
    case OpenCLLIB::Tgamma:
    case OpenCLLIB::Trunc:
    case OpenCLLIB::Half_cos:
    case OpenCLLIB::Half_divide:
    case OpenCLLIB::Half_exp:
    case OpenCLLIB::Half_exp2:
    case OpenCLLIB::Half_exp10:
    case OpenCLLIB::Half_log:
    case OpenCLLIB::Half_log2:
    case OpenCLLIB::Half_log10:
    case OpenCLLIB::Half_powr:
    case OpenCLLIB::Half_recip:
    case OpenCLLIB::Half_rsqrt:
    case OpenCLLIB::Half_sin:
    case OpenCLLIB::Half_sqrt:
    case OpenCLLIB::Half_tan:
    case OpenCLLIB::Native_cos:
    case OpenCLLIB::Native_divide:
    case OpenCLLIB::Native_exp:
    case OpenCLLIB::Native_exp2:
    case OpenCLLIB::Native_exp10:
    case OpenCLLIB::Native_log:
    case OpenCLLIB::Native_log2:
    case OpenCLLIB::Native_log10:
    case OpenCLLIB::Native_powr:
    case OpenCLLIB::Native_recip:
    case OpenCLLIB::Native_rsqrt:
    case OpenCLLIB::Native_sin:
    case OpenCLLIB::Native_sqrt:
    case OpenCLLIB::Native_tan:
    case OpenCLLIB::FClamp:
    case OpenCLLIB::Degrees:
    case OpenCLLIB::FMax_common:
    case OpenCLLIB::FMin_common:
    case OpenCLLIB::Mix:
    case OpenCLLIB::Radians:
    case OpenCLLIB::Step:
    case OpenCLLIB::Smoothstep:
    case OpenCLLIB::Sign: {
      if (!_.IsFloatScalarOrVectorType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a float scalar or vector type";
      }

      const uint32_t num_components = _.GetDimension(result_type);
      if (num_components > 4 && num_components != 8 && num_components != 16) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a scalar or a vector with 2, "
                  "3, 4, 8 or 16 components";
      }

      for (uint32_t operand_index = 4; operand_index < num_operands;
           ++operand_index) {
        const uint32_t operand_type = _.GetOperandTypeId(inst, operand_index);
        if (result_type != operand_type) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": "
                 << "expected types of all operands to be equal to Result "
                    "Type";
        }
      }
      break;
    }

    case OpenCLLIB::Fract:
    case OpenCLLIB::Modf:
    case OpenCLLIB::Sincos: {
      if (!_.IsFloatScalarOrVectorType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a float scalar or vector type";
      }

      const uint32_t num_components = _.GetDimension(result_type);
      if (num_components > 4 && num_components != 8 && num_components != 16) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a scalar or a vector with 2, "
                  "3, 4, 8 or 16 components";
      }

      const uint32_t x_type = _.GetOperandTypeId(inst, 4);
      if (result_type != x_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected type of operand X to be equal to Result Type";
      }

      const uint32_t p_type = _.GetOperandTypeId(inst, 5);
      spv::StorageClass p_storage_class;
      uint32_t p_data_type = 0;
      if (!_.GetPointerTypeInfo(p_type, &p_data_type, &p_storage_class)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected the last operand to be a pointer";
      }

      if (p_storage_class != spv::StorageClass::Generic &&
          p_storage_class != spv::StorageClass::CrossWorkgroup &&
          p_storage_class != spv::StorageClass::Workgroup &&
          p_storage_class != spv::StorageClass::Function) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected storage class of the pointer to be Generic, "
                  "CrossWorkgroup, Workgroup or Function";
      }

      if (!_.ContainsUntypedPointer(p_type) && result_type != p_data_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected data type of the pointer to be equal to Result "
                  "Type";
      }
      break;
    }

    case OpenCLLIB::Frexp:
    case OpenCLLIB::Lgamma_r:
    case OpenCLLIB::Remquo: {
      if (!_.IsFloatScalarOrVectorType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a float scalar or vector type";
      }

      const uint32_t num_components = _.GetDimension(result_type);
      if (num_components > 4 && num_components != 8 && num_components != 16) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a scalar or a vector with 2, "
                  "3, 4, 8 or 16 components";
      }

      uint32_t operand_index = 4;
      const uint32_t x_type = _.GetOperandTypeId(inst, operand_index++);
      if (result_type != x_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected type of operand X to be equal to Result Type";
      }

      if (ext_inst_key == OpenCLLIB::Remquo) {
        const uint32_t y_type = _.GetOperandTypeId(inst, operand_index++);
        if (result_type != y_type) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": "
                 << "expected type of operand Y to be equal to Result Type";
        }
      }

      const uint32_t p_type = _.GetOperandTypeId(inst, operand_index++);
      spv::StorageClass p_storage_class;
      uint32_t p_data_type = 0;
      if (!_.GetPointerTypeInfo(p_type, &p_data_type, &p_storage_class)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected the last operand to be a pointer";
      }

      if (p_storage_class != spv::StorageClass::Generic &&
          p_storage_class != spv::StorageClass::CrossWorkgroup &&
          p_storage_class != spv::StorageClass::Workgroup &&
          p_storage_class != spv::StorageClass::Function) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected storage class of the pointer to be Generic, "
                  "CrossWorkgroup, Workgroup or Function";
      }

      if ((!_.IsIntScalarOrVectorType(p_data_type) ||
           _.GetBitWidth(p_data_type) != 32) &&
          !_.ContainsUntypedPointer(p_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected data type of the pointer to be a 32-bit int "
                  "scalar or vector type";
      }

      if (!_.ContainsUntypedPointer(p_type) &&
          _.GetDimension(p_data_type) != num_components) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected data type of the pointer to have the same number "
                  "of components as Result Type";
      }
      break;
    }

    case OpenCLLIB::Ilogb: {
      if (!_.IsIntScalarOrVectorType(result_type) ||
          _.GetBitWidth(result_type) != 32) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a 32-bit int scalar or vector "
                  "type";
      }

      const uint32_t num_components = _.GetDimension(result_type);
      if (num_components > 4 && num_components != 8 && num_components != 16) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a scalar or a vector with 2, "
                  "3, 4, 8 or 16 components";
      }

      const uint32_t x_type = _.GetOperandTypeId(inst, 4);
      if (!_.IsFloatScalarOrVectorType(x_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand X to be a float scalar or vector";
      }

      if (_.GetDimension(x_type) != num_components) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand X to have the same number of components "
                  "as Result Type";
      }
      break;
    }

    case OpenCLLIB::Ldexp:
    case OpenCLLIB::Pown:
    case OpenCLLIB::Rootn: {
      if (!_.IsFloatScalarOrVectorType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a float scalar or vector type";
      }

      const uint32_t num_components = _.GetDimension(result_type);
      if (num_components > 4 && num_components != 8 && num_components != 16) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a scalar or a vector with 2, "
                  "3, 4, 8 or 16 components";
      }

      const uint32_t x_type = _.GetOperandTypeId(inst, 4);
      if (result_type != x_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected type of operand X to be equal to Result Type";
      }

      const uint32_t exp_type = _.GetOperandTypeId(inst, 5);
      if (!_.IsIntScalarOrVectorType(exp_type) ||
          _.GetBitWidth(exp_type) != 32) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected the exponent to be a 32-bit int scalar or vector";
      }

      if (_.GetDimension(exp_type) != num_components) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected the exponent to have the same number of "
                  "components as Result Type";
      }
      break;
    }

    case OpenCLLIB::Nan: {
      if (!_.IsFloatScalarOrVectorType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a float scalar or vector type";
      }

      const uint32_t num_components = _.GetDimension(result_type);
      if (num_components > 4 && num_components != 8 && num_components != 16) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a scalar or a vector with 2, "
                  "3, 4, 8 or 16 components";
      }

      const uint32_t nancode_type = _.GetOperandTypeId(inst, 4);
      if (!_.IsIntScalarOrVectorType(nancode_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Nancode to be an int scalar or vector type";
      }

      if (_.GetDimension(nancode_type) != num_components) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Nancode to have the same number of components as "
                  "Result Type";
      }

      if (_.GetBitWidth(result_type) != _.GetBitWidth(nancode_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Nancode to have the same bit width as Result "
                  "Type";
      }
      break;
    }

    case OpenCLLIB::SAbs:
    case OpenCLLIB::SAbs_diff:
    case OpenCLLIB::SAdd_sat:
    case OpenCLLIB::UAdd_sat:
    case OpenCLLIB::SHadd:
    case OpenCLLIB::UHadd:
    case OpenCLLIB::SRhadd:
    case OpenCLLIB::URhadd:
    case OpenCLLIB::SClamp:
    case OpenCLLIB::UClamp:
    case OpenCLLIB::Clz:
    case OpenCLLIB::Ctz:
    case OpenCLLIB::SMad_hi:
    case OpenCLLIB::UMad_sat:
    case OpenCLLIB::SMad_sat:
    case OpenCLLIB::SMax:
    case OpenCLLIB::UMax:
    case OpenCLLIB::SMin:
    case OpenCLLIB::UMin:
    case OpenCLLIB::SMul_hi:
    case OpenCLLIB::Rotate:
    case OpenCLLIB::SSub_sat:
    case OpenCLLIB::USub_sat:
    case OpenCLLIB::Popcount:
    case OpenCLLIB::UAbs:
    case OpenCLLIB::UAbs_diff:
    case OpenCLLIB::UMul_hi:
    case OpenCLLIB::UMad_hi: {
      if (!_.IsIntScalarOrVectorType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be an int scalar or vector type";
      }

      const uint32_t num_components = _.GetDimension(result_type);
      if (num_components > 4 && num_components != 8 && num_components != 16) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a scalar or a vector with 2, "
                  "3, 4, 8 or 16 components";
      }

      for (uint32_t operand_index = 4; operand_index < num_operands;
           ++operand_index) {
        const uint32_t operand_type = _.GetOperandTypeId(inst, operand_index);
        if (result_type != operand_type) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": "
                 << "expected types of all operands to be equal to Result "
                    "Type";
        }
      }
      break;
    }

    case OpenCLLIB::U_Upsample:
    case OpenCLLIB::S_Upsample: {
      if (!_.IsIntScalarOrVectorType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be an int scalar or vector "
                  "type";
      }

      const uint32_t result_num_components = _.GetDimension(result_type);
      if (result_num_components > 4 && result_num_components != 8 &&
          result_num_components != 16) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a scalar or a vector with 2, "
                  "3, 4, 8 or 16 components";
      }

      const uint32_t result_bit_width = _.GetBitWidth(result_type);
      if (result_bit_width != 16 && result_bit_width != 32 &&
          result_bit_width != 64) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected bit width of Result Type components to be 16, 32 "
                  "or 64";
      }

      const uint32_t hi_type = _.GetOperandTypeId(inst, 4);
      const uint32_t lo_type = _.GetOperandTypeId(inst, 5);

      if (hi_type != lo_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Hi and Lo operands to have the same type";
      }

      if (result_num_components != _.GetDimension(hi_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Hi and Lo operands to have the same number of "
                  "components as Result Type";
      }

      if (result_bit_width != 2 * _.GetBitWidth(hi_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected bit width of components of Hi and Lo operands to "
                  "be half of the bit width of components of Result Type";
      }
      break;
    }

    case OpenCLLIB::SMad24:
    case OpenCLLIB::UMad24:
    case OpenCLLIB::SMul24:
    case OpenCLLIB::UMul24: {
      if (!_.IsIntScalarOrVectorType(result_type) ||
          _.GetBitWidth(result_type) != 32) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a 32-bit int scalar or vector "
                  "type";
      }

      const uint32_t num_components = _.GetDimension(result_type);
      if (num_components > 4 && num_components != 8 && num_components != 16) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a scalar or a vector with 2, "
                  "3, 4, 8 or 16 components";
      }

      for (uint32_t operand_index = 4; operand_index < num_operands;
           ++operand_index) {
        const uint32_t operand_type = _.GetOperandTypeId(inst, operand_index);
        if (result_type != operand_type) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": "
                 << "expected types of all operands to be equal to Result "
                    "Type";
        }
      }
      break;
    }

    case OpenCLLIB::Cross: {
      if (!_.IsFloatVectorType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a float vector type";
      }

      const uint32_t num_components = _.GetDimension(result_type);
      if (num_components != 3 && num_components != 4) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to have 3 or 4 components";
      }

      const uint32_t x_type = _.GetOperandTypeId(inst, 4);
      const uint32_t y_type = _.GetOperandTypeId(inst, 5);

      if (x_type != result_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand X type to be equal to Result Type";
      }

      if (y_type != result_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand Y type to be equal to Result Type";
      }
      break;
    }

    case OpenCLLIB::Distance:
    case OpenCLLIB::Fast_distance: {
      if (!_.IsFloatScalarType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a float scalar type";
      }

      const uint32_t p0_type = _.GetOperandTypeId(inst, 4);
      if (!_.IsFloatScalarOrVectorType(p0_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P0 to be of float scalar or vector type";
      }

      const uint32_t num_components = _.GetDimension(p0_type);
      if (num_components > 4) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P0 to have no more than 4 components";
      }

      if (result_type != _.GetComponentType(p0_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P0 component type to be equal to "
               << "Result Type";
      }

      const uint32_t p1_type = _.GetOperandTypeId(inst, 5);
      if (p0_type != p1_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operands P0 and P1 to be of the same type";
      }
      break;
    }

    case OpenCLLIB::Length:
    case OpenCLLIB::Fast_length: {
      if (!_.IsFloatScalarType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a float scalar type";
      }

      const uint32_t p_type = _.GetOperandTypeId(inst, 4);
      if (!_.IsFloatScalarOrVectorType(p_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P to be a float scalar or vector";
      }

      const uint32_t num_components = _.GetDimension(p_type);
      if (num_components > 4) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P to have no more than 4 components";
      }

      if (result_type != _.GetComponentType(p_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P component type to be equal to Result "
                  "Type";
      }
      break;
    }

    case OpenCLLIB::Normalize:
    case OpenCLLIB::Fast_normalize: {
      if (!_.IsFloatScalarOrVectorType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a float scalar or vector type";
      }

      const uint32_t num_components = _.GetDimension(result_type);
      if (num_components > 4) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to have no more than 4 components";
      }

      const uint32_t p_type = _.GetOperandTypeId(inst, 4);
      if (p_type != result_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P type to be equal to Result Type";
      }
      break;
    }

    case OpenCLLIB::Bitselect: {
      if (!_.IsFloatScalarOrVectorType(result_type) &&
          !_.IsIntScalarOrVectorType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be an int or float scalar or "
                  "vector type";
      }

      const uint32_t num_components = _.GetDimension(result_type);
      if (num_components > 4 && num_components != 8 && num_components != 16) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a scalar or a vector with 2, "
                  "3, 4, 8 or 16 components";
      }

      for (uint32_t operand_index = 4; operand_index < num_operands;
           ++operand_index) {
        const uint32_t operand_type = _.GetOperandTypeId(inst, operand_index);
        if (result_type != operand_type) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": "
                 << "expected types of all operands to be equal to Result "
                    "Type";
        }
      }
      break;
    }

    case OpenCLLIB::Select: {
      if (!_.IsFloatScalarOrVectorType(result_type) &&
          !_.IsIntScalarOrVectorType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be an int or float scalar or "
                  "vector type";
      }

      const uint32_t num_components = _.GetDimension(result_type);
      if (num_components > 4 && num_components != 8 && num_components != 16) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a scalar or a vector with 2, "
                  "3, 4, 8 or 16 components";
      }

      const uint32_t a_type = _.GetOperandTypeId(inst, 4);
      const uint32_t b_type = _.GetOperandTypeId(inst, 5);
      const uint32_t c_type = _.GetOperandTypeId(inst, 6);

      if (result_type != a_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand A type to be equal to Result Type";
      }

      if (result_type != b_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand B type to be equal to Result Type";
      }

      if (!_.IsIntScalarOrVectorType(c_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand C to be an int scalar or vector";
      }

      if (num_components != _.GetDimension(c_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand C to have the same number of components "
                  "as Result Type";
      }

      if (_.GetBitWidth(result_type) != _.GetBitWidth(c_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand C to have the same bit width as Result "
                  "Type";
      }
      break;
    }

    case OpenCLLIB::Vloadn: {
      if (!_.IsFloatVectorType(result_type) &&
          !_.IsIntVectorType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be an int or float vector type";
      }

      const uint32_t num_components = _.GetDimension(result_type);
      if (num_components > 4 && num_components != 8 && num_components != 16) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to have 2, 3, 4, 8 or 16 components";
      }

      const uint32_t offset_type = _.GetOperandTypeId(inst, 4);
      const uint32_t p_type = _.GetOperandTypeId(inst, 5);

      const uint32_t size_t_bit_width = GetSizeTBitWidth(_);
      if (!size_t_bit_width) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst)
               << " can only be used with physical addressing models";
      }

      if (!_.IsIntScalarType(offset_type, size_t_bit_width)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand Offset to be of type size_t ("
               << size_t_bit_width
               << "-bit integer for the addressing model used in the module)";
      }

      spv::StorageClass p_storage_class;
      uint32_t p_data_type = 0;
      if (!_.GetPointerTypeInfo(p_type, &p_data_type, &p_storage_class)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P to be a pointer";
      }

      if (p_storage_class != spv::StorageClass::UniformConstant &&
          p_storage_class != spv::StorageClass::Generic &&
          p_storage_class != spv::StorageClass::CrossWorkgroup &&
          p_storage_class != spv::StorageClass::Workgroup &&
          p_storage_class != spv::StorageClass::Function) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P storage class to be UniformConstant, "
                  "Generic, CrossWorkgroup, Workgroup or Function";
      }

      if (_.GetComponentType(result_type) != p_data_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P data type to be equal to component "
                  "type of Result Type";
      }

      const uint32_t n_value = inst->word(7);
      if (num_components != n_value) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected literal N to be equal to the number of "
                  "components of Result Type";
      }
      break;
    }

    case OpenCLLIB::Vstoren: {
      if (_.GetIdOpcode(result_type) != spv::Op::OpTypeVoid) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst)
               << ": expected Result Type to be void";
      }

      const uint32_t data_type = _.GetOperandTypeId(inst, 4);
      const uint32_t offset_type = _.GetOperandTypeId(inst, 5);
      const uint32_t p_type = _.GetOperandTypeId(inst, 6);

      if (!_.IsFloatVectorType(data_type) && !_.IsIntVectorType(data_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Data to be an int or float vector";
      }

      const uint32_t num_components = _.GetDimension(data_type);
      if (num_components > 4 && num_components != 8 && num_components != 16) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Data to have 2, 3, 4, 8 or 16 components";
      }

      const uint32_t size_t_bit_width = GetSizeTBitWidth(_);
      if (!size_t_bit_width) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst)
               << " can only be used with physical addressing models";
      }

      if (!_.IsIntScalarType(offset_type, size_t_bit_width)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand Offset to be of type size_t ("
               << size_t_bit_width
               << "-bit integer for the addressing model used in the module)";
      }

      spv::StorageClass p_storage_class;
      uint32_t p_data_type = 0;
      if (!_.GetPointerTypeInfo(p_type, &p_data_type, &p_storage_class)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P to be a pointer";
      }

      if (p_storage_class != spv::StorageClass::Generic &&
          p_storage_class != spv::StorageClass::CrossWorkgroup &&
          p_storage_class != spv::StorageClass::Workgroup &&
          p_storage_class != spv::StorageClass::Function) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P storage class to be Generic, "
                  "CrossWorkgroup, Workgroup or Function";
      }

      if (_.GetComponentType(data_type) != p_data_type) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P data type to be equal to the type of "
                  "operand Data components";
      }
      break;
    }

    case OpenCLLIB::Vload_half: {
      if (!_.IsFloatScalarType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a float scalar type";
      }

      const uint32_t offset_type = _.GetOperandTypeId(inst, 4);
      const uint32_t p_type = _.GetOperandTypeId(inst, 5);

      const uint32_t size_t_bit_width = GetSizeTBitWidth(_);
      if (!size_t_bit_width) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst)
               << " can only be used with physical addressing models";
      }

      if (!_.IsIntScalarType(offset_type, size_t_bit_width)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand Offset to be of type size_t ("
               << size_t_bit_width
               << "-bit integer for the addressing model used in the module)";
      }

      spv::StorageClass p_storage_class;
      uint32_t p_data_type = 0;
      if (!_.GetPointerTypeInfo(p_type, &p_data_type, &p_storage_class)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P to be a pointer";
      }

      if (p_storage_class != spv::StorageClass::UniformConstant &&
          p_storage_class != spv::StorageClass::Generic &&
          p_storage_class != spv::StorageClass::CrossWorkgroup &&
          p_storage_class != spv::StorageClass::Workgroup &&
          p_storage_class != spv::StorageClass::Function) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P storage class to be UniformConstant, "
                  "Generic, CrossWorkgroup, Workgroup or Function";
      }

      if ((!_.IsFloatScalarType(p_data_type, 16)) &&
          !_.ContainsUntypedPointer(p_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P data type to be 16-bit float scalar";
      }
      break;
    }

    case OpenCLLIB::Vload_halfn:
    case OpenCLLIB::Vloada_halfn: {
      if (!_.IsFloatVectorType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a float vector type";
      }

      const uint32_t num_components = _.GetDimension(result_type);
      if (num_components > 4 && num_components != 8 && num_components != 16) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to have 2, 3, 4, 8 or 16 components";
      }

      const uint32_t offset_type = _.GetOperandTypeId(inst, 4);
      const uint32_t p_type = _.GetOperandTypeId(inst, 5);

      const uint32_t size_t_bit_width = GetSizeTBitWidth(_);
      if (!size_t_bit_width) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst)
               << " can only be used with physical addressing models";
      }

      if (!_.IsIntScalarType(offset_type, size_t_bit_width)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand Offset to be of type size_t ("
               << size_t_bit_width
               << "-bit integer for the addressing model used in the module)";
      }

      spv::StorageClass p_storage_class;
      uint32_t p_data_type = 0;
      if (!_.GetPointerTypeInfo(p_type, &p_data_type, &p_storage_class)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P to be a pointer";
      }

      if (p_storage_class != spv::StorageClass::UniformConstant &&
          p_storage_class != spv::StorageClass::Generic &&
          p_storage_class != spv::StorageClass::CrossWorkgroup &&
          p_storage_class != spv::StorageClass::Workgroup &&
          p_storage_class != spv::StorageClass::Function) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P storage class to be UniformConstant, "
                  "Generic, CrossWorkgroup, Workgroup or Function";
      }

      if ((!_.IsFloatScalarType(p_data_type, 16)) &&
          !_.ContainsUntypedPointer(p_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P data type to be 16-bit float scalar";
      }

      const uint32_t n_value = inst->word(7);
      if (num_components != n_value) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected literal N to be equal to the number of "
                  "components of Result Type";
      }
      break;
    }

    case OpenCLLIB::Vstore_half:
    case OpenCLLIB::Vstore_half_r:
    case OpenCLLIB::Vstore_halfn:
    case OpenCLLIB::Vstore_halfn_r:
    case OpenCLLIB::Vstorea_halfn:
    case OpenCLLIB::Vstorea_halfn_r: {
      if (_.GetIdOpcode(result_type) != spv::Op::OpTypeVoid) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst)
               << ": expected Result Type to be void";
      }

      const uint32_t data_type = _.GetOperandTypeId(inst, 4);
      const uint32_t offset_type = _.GetOperandTypeId(inst, 5);
      const uint32_t p_type = _.GetOperandTypeId(inst, 6);
      const uint32_t data_type_bit_width = _.GetBitWidth(data_type);

      if (ext_inst_key == OpenCLLIB::Vstore_half ||
          ext_inst_key == OpenCLLIB::Vstore_half_r) {
        if (!_.IsFloatScalarType(data_type) ||
            (data_type_bit_width != 32 && data_type_bit_width != 64)) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": "
                 << "expected Data to be a 32 or 64-bit float scalar";
        }
      } else {
        if (!_.IsFloatVectorType(data_type) ||
            (data_type_bit_width != 32 && data_type_bit_width != 64)) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": "
                 << "expected Data to be a 32 or 64-bit float vector";
        }

        const uint32_t num_components = _.GetDimension(data_type);
        if (num_components > 4 && num_components != 8 && num_components != 16) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": "
                 << "expected Data to have 2, 3, 4, 8 or 16 components";
        }
      }

      const uint32_t size_t_bit_width = GetSizeTBitWidth(_);
      if (!size_t_bit_width) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst)
               << " can only be used with physical addressing models";
      }

      if (!_.IsIntScalarType(offset_type, size_t_bit_width)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand Offset to be of type size_t ("
               << size_t_bit_width
               << "-bit integer for the addressing model used in the module)";
      }

      spv::StorageClass p_storage_class;
      uint32_t p_data_type = 0;
      if (!_.GetPointerTypeInfo(p_type, &p_data_type, &p_storage_class)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P to be a pointer";
      }

      if (p_storage_class != spv::StorageClass::Generic &&
          p_storage_class != spv::StorageClass::CrossWorkgroup &&
          p_storage_class != spv::StorageClass::Workgroup &&
          p_storage_class != spv::StorageClass::Function) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P storage class to be Generic, "
                  "CrossWorkgroup, Workgroup or Function";
      }

      if ((!_.IsFloatScalarType(p_data_type, 16)) &&
          !_.ContainsUntypedPointer(p_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand P data type to be 16-bit float scalar";
      }

      // Rounding mode enum is checked by assembler.
      break;
    }

    case OpenCLLIB::Shuffle:
    case OpenCLLIB::Shuffle2: {
      if (!_.IsFloatVectorType(result_type) &&
          !_.IsIntVectorType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be an int or float vector type";
      }

      const uint32_t result_num_components = _.GetDimension(result_type);
      if (result_num_components != 2 && result_num_components != 4 &&
          result_num_components != 8 && result_num_components != 16) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to have 2, 4, 8 or 16 components";
      }

      uint32_t operand_index = 4;
      const uint32_t x_type = _.GetOperandTypeId(inst, operand_index++);

      if (ext_inst_key == OpenCLLIB::Shuffle2) {
        const uint32_t y_type = _.GetOperandTypeId(inst, operand_index++);
        if (x_type != y_type) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": "
                 << "expected operands X and Y to be of the same type";
        }
      }

      const uint32_t shuffle_mask_type =
          _.GetOperandTypeId(inst, operand_index++);

      if (!_.IsFloatVectorType(x_type) && !_.IsIntVectorType(x_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand X to be an int or float vector";
      }

      const uint32_t x_num_components = _.GetDimension(x_type);
      if (x_num_components != 2 && x_num_components != 4 &&
          x_num_components != 8 && x_num_components != 16) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand X to have 2, 4, 8 or 16 components";
      }

      const uint32_t result_component_type = _.GetComponentType(result_type);

      if (result_component_type != _.GetComponentType(x_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand X and Result Type to have equal "
                  "component types";
      }

      if (!_.IsIntVectorType(shuffle_mask_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand Shuffle Mask to be an int vector";
      }

      if (result_num_components != _.GetDimension(shuffle_mask_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand Shuffle Mask to have the same number of "
                  "components as Result Type";
      }

      if (_.GetBitWidth(result_component_type) !=
          _.GetBitWidth(shuffle_mask_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand Shuffle Mask components to have the same "
                  "bit width as Result Type components";
      }
      break;
    }

    case OpenCLLIB::Printf: {
      if (!_.IsIntScalarType(result_type, 32)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a 32-bit int type";
      }

      const uint32_t format_type = _.GetOperandTypeId(inst, 4);
      spv::StorageClass format_storage_class;
      uint32_t format_data_type = 0;
      if (!_.GetPointerTypeInfo(format_type, &format_data_type,
                                &format_storage_class)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand Format to be a pointer";
      }

      if (_.HasExtension(
              Extension::kSPV_EXT_relaxed_printf_string_address_space)) {
        if (format_storage_class != spv::StorageClass::UniformConstant &&
            // Extension SPV_EXT_relaxed_printf_string_address_space allows
            // format strings in Global, Local, Private and Generic address
            // spaces

            // Global
            format_storage_class != spv::StorageClass::CrossWorkgroup &&
            // Local
            format_storage_class != spv::StorageClass::Workgroup &&
            // Private
            format_storage_class != spv::StorageClass::Function &&
            // Generic
            format_storage_class != spv::StorageClass::Generic) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": "
                 << "expected Format storage class to be UniformConstant, "
                    "Crossworkgroup, Workgroup, Function, or Generic";
        }
      } else {
        if (format_storage_class != spv::StorageClass::UniformConstant) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": "
                 << "expected Format storage class to be UniformConstant";
        }
      }

      // If pointer points to an array, get the type of an element
      if (_.IsIntArrayType(format_data_type))
        format_data_type = _.GetComponentType(format_data_type);

      if (!_.IsIntScalarType(format_data_type, 8) &&
          !_.ContainsUntypedPointer(format_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Format data type to be 8-bit int";
      }
      break;
    }

    case OpenCLLIB::Prefetch: {
      if (_.GetIdOpcode(result_type) != spv::Op::OpTypeVoid) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst)
               << ": expected Result Type to be void";
      }

      const uint32_t p_type = _.GetOperandTypeId(inst, 4);
      const uint32_t num_elements_type = _.GetOperandTypeId(inst, 5);

      spv::StorageClass p_storage_class;
      uint32_t p_data_type = 0;
      if (!_.GetPointerTypeInfo(p_type, &p_data_type, &p_storage_class)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand Ptr to be a pointer";
      }

      if (p_storage_class != spv::StorageClass::CrossWorkgroup) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand Ptr storage class to be CrossWorkgroup";
      }

      if (!_.IsFloatScalarOrVectorType(p_data_type) &&
          !_.IsIntScalarOrVectorType(p_data_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Ptr data type to be int or float scalar or "
                  "vector";
      }

      const uint32_t num_components = _.GetDimension(p_data_type);
      if (num_components > 4 && num_components != 8 && num_components != 16) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected Result Type to be a scalar or a vector with 2, "
                  "3, 4, 8 or 16 components";
      }

      const uint32_t size_t_bit_width = GetSizeTBitWidth(_);
      if (!size_t_bit_width) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst)
               << " can only be used with physical addressing models";
      }

      if (!_.IsIntScalarType(num_elements_type) ||
          _.GetBitWidth(num_elements_type) != size_t_bit_width) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << GetExtInstName(_, inst) << ": "
               << "expected operand Num Elements to be of type size_t ("
               << size_t_bit_width
               << "-bit integer for the addressing model used in the module)";
      }
      break;
    }
  }
  return SPV_SUCCESS;
}

spv_result_t ValidateExtInstDebugInfo100(ValidationState_t& _,
                                         const Instruction* inst) {
  const uint32_t result_type = inst->type_id();
  const uint32_t ext_inst_index = inst->word(4);
  if (!_.IsVoidType(result_type)) {
    return _.diag(SPV_ERROR_INVALID_DATA, inst)
           << GetExtInstName(_, inst) << ": "
           << "expected result type must be a result id of " << "OpTypeVoid";
  }

  const spv_ext_inst_type_t ext_inst_type =
      spv_ext_inst_type_t(inst->ext_inst_type());
  const bool vulkanDebugInfo =
      ext_inst_type == SPV_EXT_INST_TYPE_NONSEMANTIC_SHADER_DEBUGINFO_100;

  auto num_words = inst->words().size();

  // Handle any non-common NonSemanticShaderDebugInfo instructions.
  if (vulkanDebugInfo) {
    const NonSemanticShaderDebugInfo100Instructions ext_inst_key =
        NonSemanticShaderDebugInfo100Instructions(ext_inst_index);
    switch (ext_inst_key) {
      // The following block of instructions will be handled by the common
      // validation.
      case NonSemanticShaderDebugInfo100DebugInfoNone:
      case NonSemanticShaderDebugInfo100DebugCompilationUnit:
      case NonSemanticShaderDebugInfo100DebugTypePointer:
      case NonSemanticShaderDebugInfo100DebugTypeQualifier:
      case NonSemanticShaderDebugInfo100DebugTypeArray:
      case NonSemanticShaderDebugInfo100DebugTypeVector:
      case NonSemanticShaderDebugInfo100DebugTypedef:
      case NonSemanticShaderDebugInfo100DebugTypeFunction:
      case NonSemanticShaderDebugInfo100DebugTypeEnum:
      case NonSemanticShaderDebugInfo100DebugTypeComposite:
      case NonSemanticShaderDebugInfo100DebugTypeMember:
      case NonSemanticShaderDebugInfo100DebugTypeInheritance:
      case NonSemanticShaderDebugInfo100DebugTypePtrToMember:
      case NonSemanticShaderDebugInfo100DebugTypeTemplate:
      case NonSemanticShaderDebugInfo100DebugTypeTemplateParameter:
      case NonSemanticShaderDebugInfo100DebugTypeTemplateTemplateParameter:
      case NonSemanticShaderDebugInfo100DebugTypeTemplateParameterPack:
      case NonSemanticShaderDebugInfo100DebugGlobalVariable:
      case NonSemanticShaderDebugInfo100DebugFunctionDeclaration:
      case NonSemanticShaderDebugInfo100DebugFunction:
      case NonSemanticShaderDebugInfo100DebugLexicalBlock:
      case NonSemanticShaderDebugInfo100DebugLexicalBlockDiscriminator:
      case NonSemanticShaderDebugInfo100DebugScope:
      case NonSemanticShaderDebugInfo100DebugNoScope:
      case NonSemanticShaderDebugInfo100DebugInlinedAt:
      case NonSemanticShaderDebugInfo100DebugLocalVariable:
      case NonSemanticShaderDebugInfo100DebugInlinedVariable:
      case NonSemanticShaderDebugInfo100DebugValue:
      case NonSemanticShaderDebugInfo100DebugOperation:
      case NonSemanticShaderDebugInfo100DebugExpression:
      case NonSemanticShaderDebugInfo100DebugMacroDef:
      case NonSemanticShaderDebugInfo100DebugMacroUndef:
      case NonSemanticShaderDebugInfo100DebugImportedEntity:
      case NonSemanticShaderDebugInfo100DebugSource:
        break;

      // These checks are for operands that are differnet in
      // ShaderDebugInfo100
      case NonSemanticShaderDebugInfo100DebugTypeBasic: {
        CHECK_CONST_UINT_OPERAND("Flags", 8);
        break;
      }
      case NonSemanticShaderDebugInfo100DebugDeclare: {
        for (uint32_t word_index = 8; word_index < num_words; ++word_index) {
          auto index_inst = _.FindDef(inst->word(word_index));
          auto type_id = index_inst != nullptr ? index_inst->type_id() : 0;
          if (type_id == 0 || !IsIntScalar(_, type_id, false, false))
            return _.diag(SPV_ERROR_INVALID_DATA, inst)
                   << GetExtInstName(_, inst) << ": "
                   << "expected index must be scalar integer";
        }
        break;
      }
      case NonSemanticShaderDebugInfo100DebugTypeMatrix: {
        CHECK_DEBUG_OPERAND("Vector Type", CommonDebugInfoDebugTypeVector, 5);

        CHECK_CONST_UINT_OPERAND("Vector Count", 6);

        uint32_t vector_count = inst->word(6);
        uint64_t const_val;
        if (!_.EvalConstantValUint64(vector_count, &const_val)) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst)
                 << ": Vector Count must be 32-bit integer OpConstant";
        }

        vector_count = const_val & 0xffffffff;
        if (!vector_count || vector_count > 4) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst)
                 << ": Vector Count must be positive "
                 << "integer less than or equal to 4";
        }
        break;
      }
      case NonSemanticShaderDebugInfo100DebugFunctionDefinition: {
        CHECK_DEBUG_OPERAND("Function", CommonDebugInfoDebugFunction, 5);
        CHECK_OPERAND("Definition", spv::Op::OpFunction, 6);
        const auto* current_function = inst->function();
        if (current_function->first_block()->id() != inst->block()->id()) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst)
                 << ": must be in the entry basic block of the function";
        }

        const uint32_t definition_id = inst->word(6);
        if (definition_id != current_function->id()) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst)
                 << ": operand Definition must point to the OpFunction it is "
                    "inside";
        }
        break;
      }
      case NonSemanticShaderDebugInfo100DebugLine: {
        CHECK_DEBUG_OPERAND("Source", CommonDebugInfoDebugSource, 5);
        CHECK_CONST_UINT_OPERAND("Line Start", 6);
        CHECK_CONST_UINT_OPERAND("Line End", 7);
        CHECK_CONST_UINT_OPERAND("Column Start", 8);
        CHECK_CONST_UINT_OPERAND("Column End", 9);

        // above already validates if 32-bit and non-spec constant
        // but want to use EvalInt32IfConst to be consistent with other Eval
        // locations
        bool is_int32 = false, is_const_int32 = false;
        uint32_t line_start = 0;
        uint32_t line_end = 0;
        uint32_t column_start = 0;
        uint32_t column_end = 0;
        std::tie(is_int32, is_const_int32, line_start) =
            _.EvalInt32IfConst(inst->word(6));
        std::tie(is_int32, is_const_int32, line_end) =
            _.EvalInt32IfConst(inst->word(7));
        std::tie(is_int32, is_const_int32, column_start) =
            _.EvalInt32IfConst(inst->word(8));
        std::tie(is_int32, is_const_int32, column_end) =
            _.EvalInt32IfConst(inst->word(9));
        if (line_end < line_start) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": operand Line End ("
                 << line_end << ") is less than Line Start (" << line_start
                 << ")";
        } else if (line_start == line_end && column_end < column_start) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": operand Column End ("
                 << column_end << ") is less than Column Start ("
                 << column_start << ") when Line Start equals Line End";
        }
        break;
      }
      case NonSemanticShaderDebugInfo100DebugSourceContinued: {
        CHECK_OPERAND("Text", spv::Op::OpString, 5);
        break;
      }
      case NonSemanticShaderDebugInfo100DebugBuildIdentifier: {
        CHECK_OPERAND("Identifier", spv::Op::OpString, 5);
        CHECK_CONST_UINT_OPERAND("Flags", 6);
        break;
      }
      case NonSemanticShaderDebugInfo100DebugStoragePath: {
        CHECK_OPERAND("Path", spv::Op::OpString, 5);
        break;
      }
      case NonSemanticShaderDebugInfo100DebugEntryPoint: {
        CHECK_DEBUG_OPERAND("Entry Point", CommonDebugInfoDebugFunction, 5);
        CHECK_DEBUG_OPERAND("Compilation Unit",
                            CommonDebugInfoDebugCompilationUnit, 6);
        CHECK_OPERAND("Compiler Signature", spv::Op::OpString, 7);
        CHECK_OPERAND("Command-line Arguments", spv::Op::OpString, 8);
        break;
      }

        // Has no additional checks
      case NonSemanticShaderDebugInfo100DebugNoLine:
        break;
      case NonSemanticShaderDebugInfo100InstructionsMax:
        assert(0);
        break;
    }
  }

  // Handle any non-common OpenCL insts, then common
  if (ext_inst_type != SPV_EXT_INST_TYPE_OPENCL_DEBUGINFO_100 ||
      OpenCLDebugInfo100Instructions(ext_inst_index) !=
          OpenCLDebugInfo100DebugModuleINTEL) {
    const CommonDebugInfoInstructions ext_inst_key =
        CommonDebugInfoInstructions(ext_inst_index);
    switch (ext_inst_key) {
      case CommonDebugInfoDebugInfoNone:
      case CommonDebugInfoDebugNoScope:
        break;
        // The binary parser validates the opcode for DebugInfoNone,
        // DebugNoScope, DebugOperation. We just check the parameters to
        // DebugOperation are properly constants for vulkan debug info.
      case CommonDebugInfoDebugOperation: {
        CHECK_CONST_UINT_OPERAND("Operation", 5);
        for (uint32_t i = 6; i < num_words; ++i) {
          CHECK_CONST_UINT_OPERAND("Operand", i);
        }
        break;
      }
      case CommonDebugInfoDebugCompilationUnit: {
        CHECK_CONST_UINT_OPERAND("Version", 5);
        CHECK_CONST_UINT_OPERAND("DWARF Version", 6);
        CHECK_DEBUG_OPERAND("Source", CommonDebugInfoDebugSource, 7);
        CHECK_CONST_UINT_OPERAND("Language", 8);
        break;
      }
      case CommonDebugInfoDebugSource: {
        CHECK_OPERAND("File", spv::Op::OpString, 5);
        if (num_words == 7) CHECK_OPERAND("Text", spv::Op::OpString, 6);
        break;
      }
      case CommonDebugInfoDebugTypeBasic: {
        CHECK_OPERAND("Name", spv::Op::OpString, 5);
        CHECK_OPERAND("Size", spv::Op::OpConstant, 6);
        CHECK_CONST_UINT_OPERAND("Encoding", 7);
        break;
      }
      case CommonDebugInfoDebugTypePointer: {
        auto validate_base_type =
            ValidateOperandDebugType(_, "Base Type", inst, 5, false);
        if (validate_base_type != SPV_SUCCESS) return validate_base_type;
        CHECK_CONST_UINT_OPERAND("Storage Class", 6);
        CHECK_CONST_UINT_OPERAND("Flags", 7);
        break;
      }
      case CommonDebugInfoDebugTypeQualifier: {
        auto validate_base_type =
            ValidateOperandDebugType(_, "Base Type", inst, 5, false);
        if (validate_base_type != SPV_SUCCESS) return validate_base_type;
        CHECK_CONST_UINT_OPERAND("Type Qualifier", 6);
        break;
      }
      case CommonDebugInfoDebugTypeVector: {
        auto validate_base_type = ValidateOperandBaseType(_, inst, 5);
        if (validate_base_type != SPV_SUCCESS) return validate_base_type;

        CHECK_CONST_UINT_OPERAND("Component Count", 6);
        uint32_t component_count = inst->word(6);
        if (vulkanDebugInfo) {
          uint64_t const_val;
          if (!_.EvalConstantValUint64(component_count, &const_val)) {
            return _.diag(SPV_ERROR_INVALID_DATA, inst)
                   << GetExtInstName(_, inst)
                   << ": Component Count must be 32-bit integer OpConstant";
          }
          component_count = const_val & 0xffffffff;
        }

        if (!component_count || component_count > 4) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst)
                 << ": Component Count must be positive "
                 << "integer less than or equal to 4";
        }
        break;
      }
      case CommonDebugInfoDebugTypeArray: {
        auto validate_base_type =
            ValidateOperandDebugType(_, "Base Type", inst, 5, false);
        if (validate_base_type != SPV_SUCCESS) return validate_base_type;
        for (uint32_t i = 6; i < num_words; ++i) {
          bool invalid = false;
          auto* component_count = _.FindDef(inst->word(i));
          if (IsConstIntScalarTypeWith32Or64Bits(_, component_count)) {
            // TODO: We need a spec discussion for the runtime array for
            // OpenCL.
            if (!vulkanDebugInfo && !component_count->word(3)) {
              invalid = true;
            }
          } else if (component_count->words().size() > 6 &&
                     (CommonDebugInfoInstructions(component_count->word(4)) ==
                          CommonDebugInfoDebugLocalVariable ||
                      CommonDebugInfoInstructions(component_count->word(4)) ==
                          CommonDebugInfoDebugGlobalVariable)) {
            auto* component_count_type = _.FindDef(component_count->word(6));
            if (component_count_type->words().size() > 7) {
              uint32_t encoding = component_count_type->word(7);
              if (CommonDebugInfoInstructions(component_count_type->word(4)) !=
                      CommonDebugInfoDebugTypeBasic ||
                  (vulkanDebugInfo && !IsUint32Constant(_, encoding)) ||
                  OpenCLDebugInfo100DebugBaseTypeAttributeEncoding(
                      vulkanDebugInfo
                          ? GetUint32Constant(_, encoding)
                          : encoding) != OpenCLDebugInfo100Unsigned) {
                invalid = true;
              } else {
                // DebugTypeBasic for DebugLocalVariable/DebugGlobalVariable
                // must have Unsigned encoding and 32 or 64 as its size in
                // bits.
                Instruction* size_in_bits =
                    _.FindDef(component_count_type->word(6));
                if (!_.IsIntScalarType(size_in_bits->type_id()) ||
                    (size_in_bits->word(3) != 32 &&
                     size_in_bits->word(3) != 64)) {
                  invalid = true;
                }
              }
            } else {
              invalid = true;
            }
          } else {
            invalid = true;
          }
          if (invalid) {
            return _.diag(SPV_ERROR_INVALID_DATA, inst)
                   << GetExtInstName(_, inst) << ": Component Count must be "
                   << "OpConstant with a 32- or 64-bits integer scalar type "
                      "or "
                   << "DebugGlobalVariable or DebugLocalVariable with a 32- "
                      "or "
                   << "64-bits unsigned integer scalar type";
          }
        }
        break;
      }
      case CommonDebugInfoDebugTypedef: {
        CHECK_OPERAND("Name", spv::Op::OpString, 5);
        auto validate_base_type = ValidateOperandBaseType(_, inst, 6);
        if (validate_base_type != SPV_SUCCESS) return validate_base_type;
        CHECK_DEBUG_OPERAND("Source", CommonDebugInfoDebugSource, 7);
        CHECK_CONST_UINT_OPERAND("Line", 8);
        CHECK_CONST_UINT_OPERAND("Column", 9);
        auto validate_parent =
            ValidateOperandLexicalScope(_, "Parent", inst, 10);
        if (validate_parent != SPV_SUCCESS) return validate_parent;
        break;
      }
      case CommonDebugInfoDebugTypeFunction: {
        CHECK_CONST_UINT_OPERAND("Flags", 5);
        auto* return_type = _.FindDef(inst->word(6));
        // TODO: We need a spec discussion that we have to allow return and
        // parameter types of a DebugTypeFunction to have template parameter.
        if (return_type->opcode() != spv::Op::OpTypeVoid) {
          auto validate_return =
              ValidateOperandDebugType(_, "Return Type", inst, 6, true);
          if (validate_return != SPV_SUCCESS) return validate_return;
        }
        for (uint32_t word_index = 7; word_index < num_words; ++word_index) {
          auto validate_param = ValidateOperandDebugType(
              _, "Parameter Types", inst, word_index, true);
          if (validate_param != SPV_SUCCESS) return validate_param;
        }
        break;
      }
      case CommonDebugInfoDebugTypeEnum: {
        CHECK_OPERAND("Name", spv::Op::OpString, 5);
        if (!DoesDebugInfoOperandMatchExpectation(
                _,
                [](CommonDebugInfoInstructions dbg_inst) {
                  return dbg_inst == CommonDebugInfoDebugInfoNone;
                },
                inst, 6)) {
          auto validate_underlying_type =
              ValidateOperandDebugType(_, "Underlying Types", inst, 6, false);
          if (validate_underlying_type != SPV_SUCCESS)
            return validate_underlying_type;
        }
        CHECK_DEBUG_OPERAND("Source", CommonDebugInfoDebugSource, 7);
        CHECK_CONST_UINT_OPERAND("Line", 8);
        CHECK_CONST_UINT_OPERAND("Column", 9);
        auto validate_parent =
            ValidateOperandLexicalScope(_, "Parent", inst, 10);
        if (validate_parent != SPV_SUCCESS) return validate_parent;
        CHECK_OPERAND("Size", spv::Op::OpConstant, 11);
        auto* size = _.FindDef(inst->word(11));
        if (!_.IsIntScalarType(size->type_id()) || !size->word(3)) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": expected operand Size is a "
                 << "positive integer";
        }
        CHECK_CONST_UINT_OPERAND("Flags", 12);
        for (uint32_t word_index = 13; word_index + 1 < num_words;
             word_index += 2) {
          CHECK_OPERAND("Value", spv::Op::OpConstant, word_index);
          CHECK_OPERAND("Name", spv::Op::OpString, word_index + 1);
        }
        break;
      }
      case CommonDebugInfoDebugTypeComposite: {
        CHECK_OPERAND("Name", spv::Op::OpString, 5);
        CHECK_DEBUG_OPERAND("Source", CommonDebugInfoDebugSource, 7);
        CHECK_CONST_UINT_OPERAND("Line", 8);
        CHECK_CONST_UINT_OPERAND("Column", 9);
        auto validate_parent =
            ValidateOperandLexicalScope(_, "Parent", inst, 10);
        if (validate_parent != SPV_SUCCESS) return validate_parent;
        CHECK_OPERAND("Linkage Name", spv::Op::OpString, 11);
        if (!DoesDebugInfoOperandMatchExpectation(
                _,
                [](CommonDebugInfoInstructions dbg_inst) {
                  return dbg_inst == CommonDebugInfoDebugInfoNone;
                },
                inst, 12)) {
          CHECK_OPERAND("Size", spv::Op::OpConstant, 12);
        }
        CHECK_CONST_UINT_OPERAND("Flags", 13);
        for (uint32_t word_index = 14; word_index < num_words; ++word_index) {
          if (!DoesDebugInfoOperandMatchExpectation(
                  _,
                  [](CommonDebugInfoInstructions dbg_inst) {
                    return dbg_inst == CommonDebugInfoDebugTypeMember ||
                           dbg_inst == CommonDebugInfoDebugFunction ||
                           dbg_inst == CommonDebugInfoDebugTypeInheritance;
                  },
                  inst, word_index)) {
            return _.diag(SPV_ERROR_INVALID_DATA, inst)
                   << GetExtInstName(_, inst) << ": "
                   << "expected operand Members "
                   << "must be DebugTypeMember, DebugFunction, or "
                      "DebugTypeInheritance";
          }
        }
        break;
      }
      case CommonDebugInfoDebugTypeMember: {
        CHECK_OPERAND("Name", spv::Op::OpString, 5);
        // TODO: We need a spec discussion that we have to allow member types
        // to have template parameter.
        auto validate_type = ValidateOperandDebugType(_, "Type", inst, 6, true);
        if (validate_type != SPV_SUCCESS) return validate_type;
        CHECK_DEBUG_OPERAND("Source", CommonDebugInfoDebugSource, 7);
        CHECK_CONST_UINT_OPERAND("Line", 8);
        CHECK_CONST_UINT_OPERAND("Column", 9);
        // NonSemantic.Shader.DebugInfo doesn't have the Parent operand
        if (vulkanDebugInfo) {
          CHECK_OPERAND("Offset", spv::Op::OpConstant, 10);
          CHECK_OPERAND("Size", spv::Op::OpConstant, 11);
          CHECK_CONST_UINT_OPERAND("Flags", 12);
          if (num_words == 14) CHECK_OPERAND("Value", spv::Op::OpConstant, 13);
        } else {
          CHECK_DEBUG_OPERAND("Parent", CommonDebugInfoDebugTypeComposite, 10);
          CHECK_OPERAND("Offset", spv::Op::OpConstant, 11);
          CHECK_OPERAND("Size", spv::Op::OpConstant, 12);
          CHECK_CONST_UINT_OPERAND("Flags", 13);
          if (num_words == 15) CHECK_OPERAND("Value", spv::Op::OpConstant, 14);
        }
        break;
      }
      case CommonDebugInfoDebugTypeInheritance: {
        CHECK_DEBUG_OPERAND("Child", CommonDebugInfoDebugTypeComposite, 5);
        auto* debug_inst = _.FindDef(inst->word(5));
        auto composite_type =
            OpenCLDebugInfo100DebugCompositeType(debug_inst->word(6));
        if (composite_type != OpenCLDebugInfo100Class &&
            composite_type != OpenCLDebugInfo100Structure) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": "
                 << "expected operand Child must be class or struct debug "
                    "type";
        }
        CHECK_DEBUG_OPERAND("Parent", CommonDebugInfoDebugTypeComposite, 6);
        debug_inst = _.FindDef(inst->word(6));
        composite_type =
            OpenCLDebugInfo100DebugCompositeType(debug_inst->word(6));
        if (composite_type != OpenCLDebugInfo100Class &&
            composite_type != OpenCLDebugInfo100Structure) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": "
                 << "expected operand Parent must be class or struct debug "
                    "type";
        }
        CHECK_OPERAND("Offset", spv::Op::OpConstant, 7);
        CHECK_OPERAND("Size", spv::Op::OpConstant, 8);
        CHECK_CONST_UINT_OPERAND("Flags", 9);
        break;
      }
      case CommonDebugInfoDebugFunction: {
        CHECK_OPERAND("Name", spv::Op::OpString, 5);
        CHECK_DEBUG_OPERAND("Type", CommonDebugInfoDebugTypeFunction, 6);
        CHECK_DEBUG_OPERAND("Source", CommonDebugInfoDebugSource, 7);
        CHECK_CONST_UINT_OPERAND("Line", 8);
        CHECK_CONST_UINT_OPERAND("Column", 9);
        auto validate_parent =
            ValidateOperandLexicalScope(_, "Parent", inst, 10);
        if (validate_parent != SPV_SUCCESS) return validate_parent;
        CHECK_OPERAND("Linkage Name", spv::Op::OpString, 11);
        CHECK_CONST_UINT_OPERAND("Flags", 12);
        CHECK_CONST_UINT_OPERAND("Scope Line", 13);
        // NonSemantic.Shader.DebugInfo.100 doesn't include a reference to the
        // OpFunction
        if (vulkanDebugInfo) {
          if (num_words == 15) {
            CHECK_DEBUG_OPERAND("Declaration",
                                CommonDebugInfoDebugFunctionDeclaration, 14);
          }
        } else {
          if (!DoesDebugInfoOperandMatchExpectation(
                  _,
                  [](CommonDebugInfoInstructions dbg_inst) {
                    return dbg_inst == CommonDebugInfoDebugInfoNone;
                  },
                  inst, 14)) {
            CHECK_OPERAND("Function", spv::Op::OpFunction, 14);
          }
          if (num_words == 16) {
            CHECK_DEBUG_OPERAND("Declaration",
                                CommonDebugInfoDebugFunctionDeclaration, 15);
          }
        }
        break;
      }
      case CommonDebugInfoDebugFunctionDeclaration: {
        CHECK_OPERAND("Name", spv::Op::OpString, 5);
        CHECK_DEBUG_OPERAND("Type", CommonDebugInfoDebugTypeFunction, 6);
        CHECK_DEBUG_OPERAND("Source", CommonDebugInfoDebugSource, 7);
        CHECK_CONST_UINT_OPERAND("Line", 8);
        CHECK_CONST_UINT_OPERAND("Column", 9);
        auto validate_parent =
            ValidateOperandLexicalScope(_, "Parent", inst, 10);
        if (validate_parent != SPV_SUCCESS) return validate_parent;
        CHECK_OPERAND("Linkage Name", spv::Op::OpString, 11);
        CHECK_CONST_UINT_OPERAND("Flags", 12);
        break;
      }
      case CommonDebugInfoDebugLexicalBlock: {
        CHECK_DEBUG_OPERAND("Source", CommonDebugInfoDebugSource, 5);
        CHECK_CONST_UINT_OPERAND("Line", 6);
        CHECK_CONST_UINT_OPERAND("Column", 7);
        auto validate_parent =
            ValidateOperandLexicalScope(_, "Parent", inst, 8);
        if (validate_parent != SPV_SUCCESS) return validate_parent;
        if (num_words == 10) CHECK_OPERAND("Name", spv::Op::OpString, 9);
        break;
      }
      case CommonDebugInfoDebugScope: {
        auto validate_scope = ValidateOperandLexicalScope(_, "Scope", inst, 5);
        if (validate_scope != SPV_SUCCESS) return validate_scope;
        if (num_words == 7) {
          CHECK_DEBUG_OPERAND("Inlined At", CommonDebugInfoDebugInlinedAt, 6);
        }
        break;
      }
      case CommonDebugInfoDebugLocalVariable: {
        CHECK_OPERAND("Name", spv::Op::OpString, 5);
        // TODO: We need a spec discussion that we have to allow local
        // variable types to have template parameter.
        auto validate_type = ValidateOperandDebugType(_, "Type", inst, 6, true);
        if (validate_type != SPV_SUCCESS) return validate_type;
        CHECK_DEBUG_OPERAND("Source", CommonDebugInfoDebugSource, 7);
        CHECK_CONST_UINT_OPERAND("Line", 8);
        CHECK_CONST_UINT_OPERAND("Column", 9);
        auto validate_parent =
            ValidateOperandLexicalScope(_, "Parent", inst, 10);
        if (validate_parent != SPV_SUCCESS) return validate_parent;
        CHECK_CONST_UINT_OPERAND("Flags", 11);
        if (num_words == 13) {
          CHECK_CONST_UINT_OPERAND("ArgNumber", 12);
        }
        break;
      }
      case CommonDebugInfoDebugDeclare: {
        CHECK_DEBUG_OPERAND("Local Variable", CommonDebugInfoDebugLocalVariable,
                            5);
        auto* operand = _.FindDef(inst->word(6));
        if (operand->opcode() != spv::Op::OpVariable &&
            operand->opcode() != spv::Op::OpFunctionParameter) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": "
                 << "expected operand Variable must be a result id of "
                    "OpVariable or OpFunctionParameter";
        }

        CHECK_DEBUG_OPERAND("Expression", CommonDebugInfoDebugExpression, 7);
        break;
      }
      case CommonDebugInfoDebugExpression: {
        for (uint32_t word_index = 5; word_index < num_words; ++word_index) {
          CHECK_DEBUG_OPERAND("Operation", CommonDebugInfoDebugOperation,
                              word_index);
        }
        break;
      }
      case CommonDebugInfoDebugTypeTemplate: {
        if (!DoesDebugInfoOperandMatchExpectation(
                _,
                [](CommonDebugInfoInstructions dbg_inst) {
                  return dbg_inst == CommonDebugInfoDebugTypeComposite ||
                         dbg_inst == CommonDebugInfoDebugFunction;
                },
                inst, 5)) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << GetExtInstName(_, inst) << ": "
                 << "expected operand Target must be DebugTypeComposite "
                 << "or DebugFunction";
        }
        for (uint32_t word_index = 6; word_index < num_words; ++word_index) {
          if (!DoesDebugInfoOperandMatchExpectation(
                  _,
                  [](CommonDebugInfoInstructions dbg_inst) {
                    return dbg_inst ==
                               CommonDebugInfoDebugTypeTemplateParameter ||
                           dbg_inst ==
                               CommonDebugInfoDebugTypeTemplateTemplateParameter;
                  },
                  inst, word_index)) {
            return _.diag(SPV_ERROR_INVALID_DATA, inst)
                   << GetExtInstName(_, inst) << ": "
                   << "expected operand Parameters must be "
                   << "DebugTypeTemplateParameter or "
                   << "DebugTypeTemplateTemplateParameter";
          }
        }
        break;
      }
      case CommonDebugInfoDebugTypeTemplateParameter: {
        CHECK_OPERAND("Name", spv::Op::OpString, 5);
        auto validate_actual_type =
            ValidateOperandDebugType(_, "Actual Type", inst, 6, false);
        if (validate_actual_type != SPV_SUCCESS) return validate_actual_type;
        if (!DoesDebugInfoOperandMatchExpectation(
                _,
                [](CommonDebugInfoInstructions dbg_inst) {
                  return dbg_inst == CommonDebugInfoDebugInfoNone;
                },
                inst, 7)) {
          CHECK_OPERAND("Value", spv::Op::OpConstant, 7);
        }
        CHECK_DEBUG_OPERAND("Source", CommonDebugInfoDebugSource, 8);
        CHECK_CONST_UINT_OPERAND("Line", 9);
        CHECK_CONST_UINT_OPERAND("Column", 10);
        break;
      }
      case CommonDebugInfoDebugGlobalVariable: {
        CHECK_OPERAND("Name", spv::Op::OpString, 5);
        auto validate_type =
            ValidateOperandDebugType(_, "Type", inst, 6, false);
        if (validate_type != SPV_SUCCESS) return validate_type;
        CHECK_DEBUG_OPERAND("Source", CommonDebugInfoDebugSource, 7);
        CHECK_CONST_UINT_OPERAND("Line", 8);
        CHECK_CONST_UINT_OPERAND("Column", 9);
        auto validate_scope = ValidateOperandLexicalScope(_, "Scope", inst, 10);
        if (validate_scope != SPV_SUCCESS) return validate_scope;
        CHECK_OPERAND("Linkage Name", spv::Op::OpString, 11);
        if (!DoesDebugInfoOperandMatchExpectation(
                _,
                [](CommonDebugInfoInstructions dbg_inst) {
                  return dbg_inst == CommonDebugInfoDebugInfoNone;
                },
                inst, 12)) {
          auto* operand = _.FindDef(inst->word(12));
          std::initializer_list<spv::Op> allowed_opcodes = {
              spv::Op::OpVariable,
              spv::Op::OpConstantTrue,
              spv::Op::OpConstantFalse,
              spv::Op::OpConstant,
              spv::Op::OpConstantComposite,
              spv::Op::OpConstantSampler,
              spv::Op::OpConstantNull,
              spv::Op::OpSpecConstantTrue,
              spv::Op::OpSpecConstantFalse,
              spv::Op::OpSpecConstant,
              spv::Op::OpSpecConstantComposite,
              spv::Op::OpSpecConstantOp};
          if (std::find(allowed_opcodes.begin(), allowed_opcodes.end(),
                        operand->opcode()) == allowed_opcodes.end()) {
            return _.diag(SPV_ERROR_INVALID_DATA, inst)
                   << GetExtInstName(_, inst) << ": "
                   << "expected operand Variable must be a result id of "
                      "OpVariable, OpConstant variant, OpSpecConstant variant "
                      "or DebugInfoNone";
          }
        }
        if (num_words == 15) {
          CHECK_DEBUG_OPERAND("Static Member Declaration",
                              CommonDebugInfoDebugTypeMember, 14);
        }
        break;
      }
      case CommonDebugInfoDebugInlinedAt: {
        CHECK_CONST_UINT_OPERAND("Line", 5);
        auto validate_scope = ValidateOperandLexicalScope(_, "Scope", inst, 6);
        if (validate_scope != SPV_SUCCESS) return validate_scope;
        if (num_words == 8) {
          CHECK_DEBUG_OPERAND("Inlined", CommonDebugInfoDebugInlinedAt, 7);
        }
        break;
      }
      case CommonDebugInfoDebugValue: {
        CHECK_DEBUG_OPERAND("Local Variable", CommonDebugInfoDebugLocalVariable,
                            5);
        CHECK_DEBUG_OPERAND("Expression", CommonDebugInfoDebugExpression, 7);

        for (uint32_t word_index = 8; word_index < num_words; ++word_index) {
          // TODO: The following code simply checks if it is a const int
          // scalar or a DebugLocalVariable or DebugGlobalVariable, but we
          // have to check it using the same validation for Indexes of
          // OpAccessChain.
          if (!IsConstWithIntScalarType(_, inst, word_index) &&
              !IsDebugVariableWithIntScalarType(_, inst, word_index)) {
            return _.diag(SPV_ERROR_INVALID_DATA, inst)
                   << GetExtInstName(_, inst)
                   << ": expected operand Indexes is "
                   << "OpConstant, DebugGlobalVariable, or "
                   << "type is OpConstant with an integer scalar type";
          }
        }
        break;
      }

      // TODO: Add validation rules for remaining cases as well.
      case CommonDebugInfoDebugTypePtrToMember:
      case CommonDebugInfoDebugTypeTemplateTemplateParameter:
      case CommonDebugInfoDebugTypeTemplateParameterPack:
      case CommonDebugInfoDebugLexicalBlockDiscriminator:
      case CommonDebugInfoDebugInlinedVariable:
      case CommonDebugInfoDebugMacroDef:
      case CommonDebugInfoDebugMacroUndef:
      case CommonDebugInfoDebugImportedEntity:
        break;
      case CommonDebugInfoInstructionsMax:
        assert(0);
        break;
    }
  }

  return SPV_SUCCESS;
}

spv_result_t ValidateExtInstNonsemanticClspvReflection(
    ValidationState_t& _, const Instruction* inst) {
  auto import_inst = _.FindDef(inst->GetOperandAs<uint32_t>(2));
  const std::string name = import_inst->GetOperandAs<std::string>(1);
  const std::string reflection = "NonSemantic.ClspvReflection.";
  char* end_ptr;
  auto version_string = name.substr(reflection.size());
  if (version_string.empty()) {
    return _.diag(SPV_ERROR_INVALID_DATA, import_inst)
           << "Missing NonSemantic.ClspvReflection import version";
  }
  uint32_t version =
      static_cast<uint32_t>(std::strtoul(version_string.c_str(), &end_ptr, 10));
  if (end_ptr && *end_ptr != '\0') {
    return _.diag(SPV_ERROR_INVALID_DATA, import_inst)
           << "NonSemantic.ClspvReflection import does not encode the "
              "version correctly";
  }
  if (version == 0 || version > NonSemanticClspvReflectionRevision) {
    return _.diag(SPV_ERROR_INVALID_DATA, import_inst)
           << "Unknown NonSemantic.ClspvReflection import version";
  }

  return ValidateClspvReflectionInstruction(_, inst, version);
}

spv_result_t ValidateExtInst(ValidationState_t& _, const Instruction* inst) {
  const spv_ext_inst_type_t ext_inst_type =
      spv_ext_inst_type_t(inst->ext_inst_type());

  if (ext_inst_type == SPV_EXT_INST_TYPE_GLSL_STD_450) {
    return ValidateExtInstGlslStd450(_, inst);
  } else if (ext_inst_type == SPV_EXT_INST_TYPE_OPENCL_STD) {
    return ValidateExtInstOpenClStd(_, inst);
  } else if (ext_inst_type == SPV_EXT_INST_TYPE_OPENCL_DEBUGINFO_100 ||
             ext_inst_type ==
                 SPV_EXT_INST_TYPE_NONSEMANTIC_SHADER_DEBUGINFO_100) {
    return ValidateExtInstDebugInfo100(_, inst);
  } else if (ext_inst_type == SPV_EXT_INST_TYPE_NONSEMANTIC_CLSPVREFLECTION) {
    return ValidateExtInstNonsemanticClspvReflection(_, inst);
  }

  return SPV_SUCCESS;
}

spv_result_t ExtensionPass(ValidationState_t& _, const Instruction* inst) {
  const spv::Op opcode = inst->opcode();
  if (opcode == spv::Op::OpExtension) return ValidateExtension(_, inst);
  if (opcode == spv::Op::OpExtInstImport) return ValidateExtInstImport(_, inst);
  if (spvIsExtendedInstruction(opcode)) return ValidateExtInst(_, inst);

  return SPV_SUCCESS;
}

}  // namespace val
}  // namespace spvtools
