// Copyright (c) 2017 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.

// Performs validation of arithmetic instructions.

#include <vector>

#include "source/opcode.h"
#include "source/val/instruction.h"
#include "source/val/validate.h"
#include "source/val/validation_state.h"

namespace spvtools {
namespace val {

// Validates correctness of arithmetic instructions.
spv_result_t ArithmeticsPass(ValidationState_t& _, const Instruction* inst) {
  const spv::Op opcode = inst->opcode();
  const uint32_t result_type = inst->type_id();

  switch (opcode) {
    case spv::Op::OpFAdd:
    case spv::Op::OpFSub:
    case spv::Op::OpFMul:
    case spv::Op::OpFDiv:
    case spv::Op::OpFRem:
    case spv::Op::OpFMod:
    case spv::Op::OpFNegate: {
      bool supportsCoopMat =
          (opcode != spv::Op::OpFMul && opcode != spv::Op::OpFRem &&
           opcode != spv::Op::OpFMod);
      bool supportsCoopVec =
          (opcode != spv::Op::OpFRem && opcode != spv::Op::OpFMod);
      if (!_.IsFloatScalarType(result_type) &&
          !_.IsFloatVectorType(result_type) &&
          !(supportsCoopMat && _.IsFloatCooperativeMatrixType(result_type)) &&
          !(opcode == spv::Op::OpFMul &&
            _.IsCooperativeMatrixKHRType(result_type) &&
            _.IsFloatCooperativeMatrixType(result_type)) &&
          !(supportsCoopVec && _.IsFloatCooperativeVectorNVType(result_type)))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected floating scalar or vector type as Result Type: "
               << spvOpcodeString(opcode);

      for (size_t operand_index = 2; operand_index < inst->operands().size();
           ++operand_index) {
        if (supportsCoopVec && _.IsCooperativeVectorNVType(result_type)) {
          const uint32_t type_id = _.GetOperandTypeId(inst, operand_index);
          if (!_.IsCooperativeVectorNVType(type_id)) {
            return _.diag(SPV_ERROR_INVALID_DATA, inst)
                   << "Expected arithmetic operands to be of Result Type: "
                   << spvOpcodeString(opcode) << " operand index "
                   << operand_index;
          }
          spv_result_t ret =
              _.CooperativeVectorDimensionsMatch(inst, type_id, result_type);
          if (ret != SPV_SUCCESS) return ret;
        } else if (supportsCoopMat &&
                   _.IsCooperativeMatrixKHRType(result_type)) {
          const uint32_t type_id = _.GetOperandTypeId(inst, operand_index);
          if (!_.IsCooperativeMatrixKHRType(type_id) ||
              !_.IsFloatCooperativeMatrixType(type_id)) {
            return _.diag(SPV_ERROR_INVALID_DATA, inst)
                   << "Expected arithmetic operands to be of Result Type: "
                   << spvOpcodeString(opcode) << " operand index "
                   << operand_index;
          }
          spv_result_t ret =
              _.CooperativeMatrixShapesMatch(inst, result_type, type_id, false);
          if (ret != SPV_SUCCESS) return ret;
        } else if (_.GetOperandTypeId(inst, operand_index) != result_type)
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << "Expected arithmetic operands to be of Result Type: "
                 << spvOpcodeString(opcode) << " operand index "
                 << operand_index;
      }
      break;
    }

    case spv::Op::OpUDiv:
    case spv::Op::OpUMod: {
      bool supportsCoopMat = (opcode == spv::Op::OpUDiv);
      bool supportsCoopVec = (opcode == spv::Op::OpUDiv);
      if (!_.IsUnsignedIntScalarType(result_type) &&
          !_.IsUnsignedIntVectorType(result_type) &&
          !(supportsCoopMat &&
            _.IsUnsignedIntCooperativeMatrixType(result_type)) &&
          !(supportsCoopVec &&
            _.IsUnsignedIntCooperativeVectorNVType(result_type)))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected unsigned int scalar or vector type as Result Type: "
               << spvOpcodeString(opcode);

      for (size_t operand_index = 2; operand_index < inst->operands().size();
           ++operand_index) {
        if (supportsCoopVec && _.IsCooperativeVectorNVType(result_type)) {
          const uint32_t type_id = _.GetOperandTypeId(inst, operand_index);
          if (!_.IsCooperativeVectorNVType(type_id)) {
            return _.diag(SPV_ERROR_INVALID_DATA, inst)
                   << "Expected arithmetic operands to be of Result Type: "
                   << spvOpcodeString(opcode) << " operand index "
                   << operand_index;
          }
          spv_result_t ret =
              _.CooperativeVectorDimensionsMatch(inst, type_id, result_type);
          if (ret != SPV_SUCCESS) return ret;
        } else if (supportsCoopMat &&
                   _.IsCooperativeMatrixKHRType(result_type)) {
          const uint32_t type_id = _.GetOperandTypeId(inst, operand_index);
          if (!_.IsCooperativeMatrixKHRType(type_id) ||
              !_.IsUnsignedIntCooperativeMatrixType(type_id)) {
            return _.diag(SPV_ERROR_INVALID_DATA, inst)
                   << "Expected arithmetic operands to be of Result Type: "
                   << spvOpcodeString(opcode) << " operand index "
                   << operand_index;
          }
          spv_result_t ret =
              _.CooperativeMatrixShapesMatch(inst, result_type, type_id, false);
          if (ret != SPV_SUCCESS) return ret;
        } else if (_.GetOperandTypeId(inst, operand_index) != result_type)
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << "Expected arithmetic operands to be of Result Type: "
                 << spvOpcodeString(opcode) << " operand index "
                 << operand_index;
      }
      break;
    }

    case spv::Op::OpISub:
    case spv::Op::OpIAdd:
    case spv::Op::OpIMul:
    case spv::Op::OpSDiv:
    case spv::Op::OpSMod:
    case spv::Op::OpSRem:
    case spv::Op::OpSNegate: {
      bool supportsCoopMat =
          (opcode != spv::Op::OpIMul && opcode != spv::Op::OpSRem &&
           opcode != spv::Op::OpSMod);
      bool supportsCoopVec =
          (opcode != spv::Op::OpSRem && opcode != spv::Op::OpSMod);
      if (!_.IsIntScalarType(result_type) && !_.IsIntVectorType(result_type) &&
          !(supportsCoopMat && _.IsIntCooperativeMatrixType(result_type)) &&
          !(opcode == spv::Op::OpIMul &&
            _.IsCooperativeMatrixKHRType(result_type) &&
            _.IsIntCooperativeMatrixType(result_type)) &&
          !(supportsCoopVec && _.IsIntCooperativeVectorNVType(result_type)))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected int scalar or vector type as Result Type: "
               << spvOpcodeString(opcode);

      const uint32_t dimension = _.GetDimension(result_type);
      const uint32_t bit_width = _.GetBitWidth(result_type);

      for (size_t operand_index = 2; operand_index < inst->operands().size();
           ++operand_index) {
        const uint32_t type_id = _.GetOperandTypeId(inst, operand_index);

        if (supportsCoopVec && _.IsCooperativeVectorNVType(result_type)) {
          if (!_.IsCooperativeVectorNVType(type_id)) {
            return _.diag(SPV_ERROR_INVALID_DATA, inst)
                   << "Expected arithmetic operands to be of Result Type: "
                   << spvOpcodeString(opcode) << " operand index "
                   << operand_index;
          }
          spv_result_t ret =
              _.CooperativeVectorDimensionsMatch(inst, type_id, result_type);
          if (ret != SPV_SUCCESS) return ret;
        }

        if (supportsCoopMat && _.IsCooperativeMatrixKHRType(result_type)) {
          if (!_.IsCooperativeMatrixKHRType(type_id) ||
              !_.IsIntCooperativeMatrixType(type_id)) {
            return _.diag(SPV_ERROR_INVALID_DATA, inst)
                   << "Expected arithmetic operands to be of Result Type: "
                   << spvOpcodeString(opcode) << " operand index "
                   << operand_index;
          }
          spv_result_t ret =
              _.CooperativeMatrixShapesMatch(inst, result_type, type_id, false);
          if (ret != SPV_SUCCESS) return ret;
        }

        if (!type_id ||
            (!_.IsIntScalarType(type_id) && !_.IsIntVectorType(type_id) &&
             !(supportsCoopMat && _.IsIntCooperativeMatrixType(result_type)) &&
             !(opcode == spv::Op::OpIMul &&
               _.IsCooperativeMatrixKHRType(result_type) &&
               _.IsIntCooperativeMatrixType(result_type)) &&
             !(supportsCoopVec && _.IsIntCooperativeVectorNVType(result_type))))
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << "Expected int scalar or vector type as operand: "
                 << spvOpcodeString(opcode) << " operand index "
                 << operand_index;

        if (_.GetDimension(type_id) != dimension)
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << "Expected arithmetic operands to have the same dimension "
                 << "as Result Type: " << spvOpcodeString(opcode)
                 << " operand index " << operand_index;

        if (_.GetBitWidth(type_id) != bit_width)
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << "Expected arithmetic operands to have the same bit width "
                 << "as Result Type: " << spvOpcodeString(opcode)
                 << " operand index " << operand_index;
      }
      break;
    }

    case spv::Op::OpDot: {
      if (!_.IsFloatScalarType(result_type))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected float scalar type as Result Type: "
               << spvOpcodeString(opcode);

      if (_.IsBfloat16ScalarType(result_type)) {
        if (!_.HasCapability(spv::Capability::BFloat16DotProductKHR)) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << "OpDot Result Type <id> " << _.getIdName(result_type)
                 << "requires BFloat16DotProductKHR be declared.";
        }
      }

      uint32_t first_vector_num_components = 0;

      for (size_t operand_index = 2; operand_index < inst->operands().size();
           ++operand_index) {
        const uint32_t type_id = _.GetOperandTypeId(inst, operand_index);

        if (!type_id || !_.IsFloatVectorType(type_id))
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << "Expected float vector as operand: "
                 << spvOpcodeString(opcode) << " operand index "
                 << operand_index;

        const uint32_t component_type = _.GetComponentType(type_id);
        if (component_type != result_type)
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << "Expected component type to be equal to Result Type: "
                 << spvOpcodeString(opcode) << " operand index "
                 << operand_index;

        const uint32_t num_components = _.GetDimension(type_id);
        if (operand_index == 2) {
          first_vector_num_components = num_components;
        } else if (num_components != first_vector_num_components) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << "Expected operands to have the same number of components: "
                 << spvOpcodeString(opcode);
        }
      }
      break;
    }

    case spv::Op::OpVectorTimesScalar: {
      if (!_.IsFloatVectorType(result_type) &&
          !_.IsFloatCooperativeVectorNVType(result_type))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected float vector type as Result Type: "
               << spvOpcodeString(opcode);

      const uint32_t vector_type_id = _.GetOperandTypeId(inst, 2);
      if (result_type != vector_type_id)
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected vector operand type to be equal to Result Type: "
               << spvOpcodeString(opcode);

      const uint32_t component_type = _.GetComponentType(vector_type_id);

      const uint32_t scalar_type_id = _.GetOperandTypeId(inst, 3);
      if (component_type != scalar_type_id)
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected scalar operand type to be equal to the component "
               << "type of the vector operand: " << spvOpcodeString(opcode);

      break;
    }

    case spv::Op::OpMatrixTimesScalar: {
      if (!_.IsFloatMatrixType(result_type) &&
          !(_.IsCooperativeMatrixType(result_type)))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected float matrix type as Result Type: "
               << spvOpcodeString(opcode);

      const uint32_t matrix_type_id = _.GetOperandTypeId(inst, 2);
      if (result_type != matrix_type_id)
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected matrix operand type to be equal to Result Type: "
               << spvOpcodeString(opcode);

      const uint32_t component_type = _.GetComponentType(matrix_type_id);

      const uint32_t scalar_type_id = _.GetOperandTypeId(inst, 3);
      if (component_type != scalar_type_id)
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected scalar operand type to be equal to the component "
               << "type of the matrix operand: " << spvOpcodeString(opcode);

      break;
    }

    case spv::Op::OpVectorTimesMatrix: {
      const uint32_t vector_type_id = _.GetOperandTypeId(inst, 2);
      const uint32_t matrix_type_id = _.GetOperandTypeId(inst, 3);

      if (!_.IsFloatVectorType(result_type))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected float vector type as Result Type: "
               << spvOpcodeString(opcode);

      const uint32_t res_component_type = _.GetComponentType(result_type);

      if (!vector_type_id || !_.IsFloatVectorType(vector_type_id))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected float vector type as left operand: "
               << spvOpcodeString(opcode);

      if (res_component_type != _.GetComponentType(vector_type_id))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected component types of Result Type and vector to be "
               << "equal: " << spvOpcodeString(opcode);

      uint32_t matrix_num_rows = 0;
      uint32_t matrix_num_cols = 0;
      uint32_t matrix_col_type = 0;
      uint32_t matrix_component_type = 0;
      if (!_.GetMatrixTypeInfo(matrix_type_id, &matrix_num_rows,
                               &matrix_num_cols, &matrix_col_type,
                               &matrix_component_type))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected float matrix type as right operand: "
               << spvOpcodeString(opcode);

      if (res_component_type != matrix_component_type)
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected component types of Result Type and matrix to be "
               << "equal: " << spvOpcodeString(opcode);

      if (matrix_num_cols != _.GetDimension(result_type))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected number of columns of the matrix to be equal to "
               << "Result Type vector size: " << spvOpcodeString(opcode);

      if (matrix_num_rows != _.GetDimension(vector_type_id))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected number of rows of the matrix to be equal to the "
               << "vector operand size: " << spvOpcodeString(opcode);

      break;
    }

    case spv::Op::OpMatrixTimesVector: {
      const uint32_t matrix_type_id = _.GetOperandTypeId(inst, 2);
      const uint32_t vector_type_id = _.GetOperandTypeId(inst, 3);

      if (!_.IsFloatVectorType(result_type))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected float vector type as Result Type: "
               << spvOpcodeString(opcode);

      uint32_t matrix_num_rows = 0;
      uint32_t matrix_num_cols = 0;
      uint32_t matrix_col_type = 0;
      uint32_t matrix_component_type = 0;
      if (!_.GetMatrixTypeInfo(matrix_type_id, &matrix_num_rows,
                               &matrix_num_cols, &matrix_col_type,
                               &matrix_component_type))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected float matrix type as left operand: "
               << spvOpcodeString(opcode);

      if (result_type != matrix_col_type)
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected column type of the matrix to be equal to Result "
                  "Type: "
               << spvOpcodeString(opcode);

      if (!vector_type_id || !_.IsFloatVectorType(vector_type_id))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected float vector type as right operand: "
               << spvOpcodeString(opcode);

      if (matrix_component_type != _.GetComponentType(vector_type_id))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected component types of the operands to be equal: "
               << spvOpcodeString(opcode);

      if (matrix_num_cols != _.GetDimension(vector_type_id))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected number of columns of the matrix to be equal to the "
               << "vector size: " << spvOpcodeString(opcode);

      break;
    }

    case spv::Op::OpMatrixTimesMatrix: {
      const uint32_t left_type_id = _.GetOperandTypeId(inst, 2);
      const uint32_t right_type_id = _.GetOperandTypeId(inst, 3);

      uint32_t res_num_rows = 0;
      uint32_t res_num_cols = 0;
      uint32_t res_col_type = 0;
      uint32_t res_component_type = 0;
      if (!_.GetMatrixTypeInfo(result_type, &res_num_rows, &res_num_cols,
                               &res_col_type, &res_component_type))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected float matrix type as Result Type: "
               << spvOpcodeString(opcode);

      uint32_t left_num_rows = 0;
      uint32_t left_num_cols = 0;
      uint32_t left_col_type = 0;
      uint32_t left_component_type = 0;
      if (!_.GetMatrixTypeInfo(left_type_id, &left_num_rows, &left_num_cols,
                               &left_col_type, &left_component_type))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected float matrix type as left operand: "
               << spvOpcodeString(opcode);

      uint32_t right_num_rows = 0;
      uint32_t right_num_cols = 0;
      uint32_t right_col_type = 0;
      uint32_t right_component_type = 0;
      if (!_.GetMatrixTypeInfo(right_type_id, &right_num_rows, &right_num_cols,
                               &right_col_type, &right_component_type))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected float matrix type as right operand: "
               << spvOpcodeString(opcode);

      if (!_.IsFloatScalarType(res_component_type))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected float matrix type as Result Type: "
               << spvOpcodeString(opcode);

      if (res_col_type != left_col_type)
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected column types of Result Type and left matrix to be "
               << "equal: " << spvOpcodeString(opcode);

      if (res_component_type != right_component_type)
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected component types of Result Type and right matrix to "
                  "be "
               << "equal: " << spvOpcodeString(opcode);

      if (res_num_cols != right_num_cols)
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected number of columns of Result Type and right matrix "
                  "to "
               << "be equal: " << spvOpcodeString(opcode);

      if (left_num_cols != right_num_rows)
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected number of columns of left matrix and number of "
                  "rows "
               << "of right matrix to be equal: " << spvOpcodeString(opcode);

      assert(left_num_rows == res_num_rows);
      break;
    }

    case spv::Op::OpOuterProduct: {
      const uint32_t left_type_id = _.GetOperandTypeId(inst, 2);
      const uint32_t right_type_id = _.GetOperandTypeId(inst, 3);

      uint32_t res_num_rows = 0;
      uint32_t res_num_cols = 0;
      uint32_t res_col_type = 0;
      uint32_t res_component_type = 0;
      if (!_.GetMatrixTypeInfo(result_type, &res_num_rows, &res_num_cols,
                               &res_col_type, &res_component_type))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected float matrix type as Result Type: "
               << spvOpcodeString(opcode);

      if (left_type_id != res_col_type)
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected column type of Result Type to be equal to the type "
               << "of the left operand: " << spvOpcodeString(opcode);

      if (!right_type_id || !_.IsFloatVectorType(right_type_id))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected float vector type as right operand: "
               << spvOpcodeString(opcode);

      if (res_component_type != _.GetComponentType(right_type_id))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected component types of the operands to be equal: "
               << spvOpcodeString(opcode);

      if (res_num_cols != _.GetDimension(right_type_id))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected number of columns of the matrix to be equal to the "
               << "vector size of the right operand: "
               << spvOpcodeString(opcode);

      break;
    }

    case spv::Op::OpIAddCarry:
    case spv::Op::OpISubBorrow:
    case spv::Op::OpUMulExtended:
    case spv::Op::OpSMulExtended: {
      std::vector<uint32_t> result_types;
      if (!_.GetStructMemberTypes(result_type, &result_types))
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected a struct as Result Type: "
               << spvOpcodeString(opcode);

      if (result_types.size() != 2)
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected Result Type struct to have two members: "
               << spvOpcodeString(opcode);

      if (opcode == spv::Op::OpSMulExtended) {
        if (!_.IsIntScalarType(result_types[0]) &&
            !_.IsIntVectorType(result_types[0]))
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << "Expected Result Type struct member types to be integer "
                    "scalar "
                 << "or vector: " << spvOpcodeString(opcode);
      } else {
        if (!_.IsUnsignedIntScalarType(result_types[0]) &&
            !_.IsUnsignedIntVectorType(result_types[0]))
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << "Expected Result Type struct member types to be unsigned "
                 << "integer scalar or vector: " << spvOpcodeString(opcode);
      }

      if (result_types[0] != result_types[1])
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected Result Type struct member types to be identical: "
               << spvOpcodeString(opcode);

      const uint32_t left_type_id = _.GetOperandTypeId(inst, 2);
      const uint32_t right_type_id = _.GetOperandTypeId(inst, 3);

      if (left_type_id != result_types[0] || right_type_id != result_types[0])
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected both operands to be of Result Type member type: "
               << spvOpcodeString(opcode);

      break;
    }

    case spv::Op::OpCooperativeMatrixMulAddNV: {
      const uint32_t D_type_id = _.GetOperandTypeId(inst, 1);
      const uint32_t A_type_id = _.GetOperandTypeId(inst, 2);
      const uint32_t B_type_id = _.GetOperandTypeId(inst, 3);
      const uint32_t C_type_id = _.GetOperandTypeId(inst, 4);

      if (!_.IsCooperativeMatrixNVType(A_type_id)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected cooperative matrix type as A Type: "
               << spvOpcodeString(opcode);
      }
      if (!_.IsCooperativeMatrixNVType(B_type_id)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected cooperative matrix type as B Type: "
               << spvOpcodeString(opcode);
      }
      if (!_.IsCooperativeMatrixNVType(C_type_id)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected cooperative matrix type as C Type: "
               << spvOpcodeString(opcode);
      }
      if (!_.IsCooperativeMatrixNVType(D_type_id)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected cooperative matrix type as Result Type: "
               << spvOpcodeString(opcode);
      }

      const auto A = _.FindDef(A_type_id);
      const auto B = _.FindDef(B_type_id);
      const auto C = _.FindDef(C_type_id);
      const auto D = _.FindDef(D_type_id);

      std::tuple<bool, bool, uint32_t> A_scope, B_scope, C_scope, D_scope,
          A_rows, B_rows, C_rows, D_rows, A_cols, B_cols, C_cols, D_cols;

      A_scope = _.EvalInt32IfConst(A->GetOperandAs<uint32_t>(2));
      B_scope = _.EvalInt32IfConst(B->GetOperandAs<uint32_t>(2));
      C_scope = _.EvalInt32IfConst(C->GetOperandAs<uint32_t>(2));
      D_scope = _.EvalInt32IfConst(D->GetOperandAs<uint32_t>(2));

      A_rows = _.EvalInt32IfConst(A->GetOperandAs<uint32_t>(3));
      B_rows = _.EvalInt32IfConst(B->GetOperandAs<uint32_t>(3));
      C_rows = _.EvalInt32IfConst(C->GetOperandAs<uint32_t>(3));
      D_rows = _.EvalInt32IfConst(D->GetOperandAs<uint32_t>(3));

      A_cols = _.EvalInt32IfConst(A->GetOperandAs<uint32_t>(4));
      B_cols = _.EvalInt32IfConst(B->GetOperandAs<uint32_t>(4));
      C_cols = _.EvalInt32IfConst(C->GetOperandAs<uint32_t>(4));
      D_cols = _.EvalInt32IfConst(D->GetOperandAs<uint32_t>(4));

      const auto notEqual = [](std::tuple<bool, bool, uint32_t> X,
                               std::tuple<bool, bool, uint32_t> Y) {
        return (std::get<1>(X) && std::get<1>(Y) &&
                std::get<2>(X) != std::get<2>(Y));
      };

      if (notEqual(A_scope, B_scope) || notEqual(A_scope, C_scope) ||
          notEqual(A_scope, D_scope) || notEqual(B_scope, C_scope) ||
          notEqual(B_scope, D_scope) || notEqual(C_scope, D_scope)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Cooperative matrix scopes must match: "
               << spvOpcodeString(opcode);
      }

      if (notEqual(A_rows, C_rows) || notEqual(A_rows, D_rows) ||
          notEqual(C_rows, D_rows)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Cooperative matrix 'M' mismatch: "
               << spvOpcodeString(opcode);
      }

      if (notEqual(B_cols, C_cols) || notEqual(B_cols, D_cols) ||
          notEqual(C_cols, D_cols)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Cooperative matrix 'N' mismatch: "
               << spvOpcodeString(opcode);
      }

      if (notEqual(A_cols, B_rows)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Cooperative matrix 'K' mismatch: "
               << spvOpcodeString(opcode);
      }
      break;
    }

    case spv::Op::OpCooperativeMatrixMulAddKHR: {
      const uint32_t D_type_id = _.GetOperandTypeId(inst, 1);
      const uint32_t A_type_id = _.GetOperandTypeId(inst, 2);
      const uint32_t B_type_id = _.GetOperandTypeId(inst, 3);
      const uint32_t C_type_id = _.GetOperandTypeId(inst, 4);

      if (!_.IsCooperativeMatrixAType(A_type_id)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Cooperative matrix type must be A Type: "
               << spvOpcodeString(opcode);
      }
      if (!_.IsCooperativeMatrixBType(B_type_id)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Cooperative matrix type must be B Type: "
               << spvOpcodeString(opcode);
      }
      if (!_.IsCooperativeMatrixAccType(C_type_id)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Cooperative matrix type must be Accumulator Type: "
               << spvOpcodeString(opcode);
      }
      if (!_.IsCooperativeMatrixKHRType(D_type_id)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Expected cooperative matrix type as Result Type: "
               << spvOpcodeString(opcode);
      }

      const auto A = _.FindDef(A_type_id);
      const auto B = _.FindDef(B_type_id);
      const auto C = _.FindDef(C_type_id);
      const auto D = _.FindDef(D_type_id);

      std::tuple<bool, bool, uint32_t> A_scope, B_scope, C_scope, D_scope,
          A_rows, B_rows, C_rows, D_rows, A_cols, B_cols, C_cols, D_cols;

      A_scope = _.EvalInt32IfConst(A->GetOperandAs<uint32_t>(2));
      B_scope = _.EvalInt32IfConst(B->GetOperandAs<uint32_t>(2));
      C_scope = _.EvalInt32IfConst(C->GetOperandAs<uint32_t>(2));
      D_scope = _.EvalInt32IfConst(D->GetOperandAs<uint32_t>(2));

      A_rows = _.EvalInt32IfConst(A->GetOperandAs<uint32_t>(3));
      B_rows = _.EvalInt32IfConst(B->GetOperandAs<uint32_t>(3));
      C_rows = _.EvalInt32IfConst(C->GetOperandAs<uint32_t>(3));
      D_rows = _.EvalInt32IfConst(D->GetOperandAs<uint32_t>(3));

      A_cols = _.EvalInt32IfConst(A->GetOperandAs<uint32_t>(4));
      B_cols = _.EvalInt32IfConst(B->GetOperandAs<uint32_t>(4));
      C_cols = _.EvalInt32IfConst(C->GetOperandAs<uint32_t>(4));
      D_cols = _.EvalInt32IfConst(D->GetOperandAs<uint32_t>(4));

      const auto notEqual = [](std::tuple<bool, bool, uint32_t> X,
                               std::tuple<bool, bool, uint32_t> Y) {
        return (std::get<1>(X) && std::get<1>(Y) &&
                std::get<2>(X) != std::get<2>(Y));
      };

      if (notEqual(A_scope, B_scope) || notEqual(A_scope, C_scope) ||
          notEqual(A_scope, D_scope) || notEqual(B_scope, C_scope) ||
          notEqual(B_scope, D_scope) || notEqual(C_scope, D_scope)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Cooperative matrix scopes must match: "
               << spvOpcodeString(opcode);
      }

      if (notEqual(A_rows, C_rows) || notEqual(A_rows, D_rows) ||
          notEqual(C_rows, D_rows)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Cooperative matrix 'M' mismatch: "
               << spvOpcodeString(opcode);
      }

      if (notEqual(B_cols, C_cols) || notEqual(B_cols, D_cols) ||
          notEqual(C_cols, D_cols)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Cooperative matrix 'N' mismatch: "
               << spvOpcodeString(opcode);
      }

      if (notEqual(A_cols, B_rows)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Cooperative matrix 'K' mismatch: "
               << spvOpcodeString(opcode);
      }
      break;
    }

    case spv::Op::OpCooperativeMatrixReduceNV: {
      if (!_.IsCooperativeMatrixKHRType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Result Type must be a cooperative matrix type: "
               << spvOpcodeString(opcode);
      }

      const auto result_comp_type_id =
          _.FindDef(result_type)->GetOperandAs<uint32_t>(1);

      const auto matrix_id = inst->GetOperandAs<uint32_t>(2);
      const auto matrix = _.FindDef(matrix_id);
      const auto matrix_type_id = matrix->type_id();
      if (!_.IsCooperativeMatrixKHRType(matrix_type_id)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Matrix must have a cooperative matrix type: "
               << spvOpcodeString(opcode);
      }
      const auto matrix_type = _.FindDef(matrix_type_id);
      const auto matrix_comp_type_id = matrix_type->GetOperandAs<uint32_t>(1);
      if (matrix_comp_type_id != result_comp_type_id) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Result Type and Matrix type must have the same component "
                  "type: "
               << spvOpcodeString(opcode);
      }
      if (_.FindDef(result_type)->GetOperandAs<uint32_t>(2) !=
          matrix_type->GetOperandAs<uint32_t>(2)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Result Type and Matrix type must have the same scope: "
               << spvOpcodeString(opcode);
      }

      if (!_.IsCooperativeMatrixAccType(result_type)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Result Type must have UseAccumulator: "
               << spvOpcodeString(opcode);
      }
      if (!_.IsCooperativeMatrixAccType(matrix_type_id)) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Matrix type must have UseAccumulator: "
               << spvOpcodeString(opcode);
      }

      const auto reduce_value = inst->GetOperandAs<uint32_t>(3);

      if ((reduce_value &
           uint32_t(
               spv::CooperativeMatrixReduceMask::CooperativeMatrixReduce2x2)) &&
          (reduce_value & uint32_t(spv::CooperativeMatrixReduceMask::Row |
                                   spv::CooperativeMatrixReduceMask::Column))) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "Reduce 2x2 must not be used with Row/Column: "
               << spvOpcodeString(opcode);
      }

      std::tuple<bool, bool, uint32_t> result_rows, result_cols, matrix_rows,
          matrix_cols;
      result_rows =
          _.EvalInt32IfConst(_.FindDef(result_type)->GetOperandAs<uint32_t>(3));
      result_cols =
          _.EvalInt32IfConst(_.FindDef(result_type)->GetOperandAs<uint32_t>(4));
      matrix_rows = _.EvalInt32IfConst(matrix_type->GetOperandAs<uint32_t>(3));
      matrix_cols = _.EvalInt32IfConst(matrix_type->GetOperandAs<uint32_t>(4));

      if (reduce_value &
          uint32_t(
              spv::CooperativeMatrixReduceMask::CooperativeMatrixReduce2x2)) {
        if (std::get<1>(result_rows) && std::get<1>(result_cols) &&
            std::get<1>(matrix_rows) && std::get<1>(matrix_cols) &&
            (std::get<2>(result_rows) != std::get<2>(matrix_rows) / 2 ||
             std::get<2>(result_cols) != std::get<2>(matrix_cols) / 2)) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << "For Reduce2x2, result rows/cols must be half of matrix "
                    "rows/cols: "
                 << spvOpcodeString(opcode);
        }
      }
      if (reduce_value == uint32_t(spv::CooperativeMatrixReduceMask::Row)) {
        if (std::get<1>(result_rows) && std::get<1>(matrix_rows) &&
            std::get<2>(result_rows) != std::get<2>(matrix_rows)) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << "For ReduceRow, result rows must match matrix rows: "
                 << spvOpcodeString(opcode);
        }
      }
      if (reduce_value == uint32_t(spv::CooperativeMatrixReduceMask::Column)) {
        if (std::get<1>(result_cols) && std::get<1>(matrix_cols) &&
            std::get<2>(result_cols) != std::get<2>(matrix_cols)) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << "For ReduceColumn, result cols must match matrix cols: "
                 << spvOpcodeString(opcode);
        }
      }

      const auto combine_func_id = inst->GetOperandAs<uint32_t>(4);
      const auto combine_func = _.FindDef(combine_func_id);
      if (!combine_func || combine_func->opcode() != spv::Op::OpFunction) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "CombineFunc must be a function: " << spvOpcodeString(opcode);
      }
      const auto function_type_id = combine_func->GetOperandAs<uint32_t>(3);
      const auto function_type = _.FindDef(function_type_id);
      if (function_type->operands().size() != 4) {
        return _.diag(SPV_ERROR_INVALID_DATA, inst)
               << "CombineFunc must have two parameters: "
               << spvOpcodeString(opcode);
      }
      for (uint32_t i = 0; i < 3; ++i) {
        // checks return type and two params
        const auto param_type_id = function_type->GetOperandAs<uint32_t>(i + 1);
        if (param_type_id != matrix_comp_type_id) {
          return _.diag(SPV_ERROR_INVALID_DATA, inst)
                 << "CombineFunc return type and parameters must match matrix "
                    "component type: "
                 << spvOpcodeString(opcode);
        }
      }

      break;
    }

    default:
      break;
  }

  return SPV_SUCCESS;
}

}  // namespace val
}  // namespace spvtools
