// Copyright 2023 The Tint Authors.
//
// 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.

////////////////////////////////////////////////////////////////////////////////
// File generated by 'tools/src/cmd/gen' using the template:
//   src/tint/lang/spirv/ir/function.cc.tmpl
//
// To regenerate run: './tools/run gen'
//
//                       Do not modify this file directly
////////////////////////////////////////////////////////////////////////////////

#include "src/tint/lang/spirv/ir/function.h"

namespace tint::spirv::ir {

const char* str(Function i) {
    switch (i) {
        case Function::kNone:
            return "<none>";
        case Function::kArrayLength:
            return "spirv.array_length";
        case Function::kAtomicAnd:
            return "spirv.atomic_and";
        case Function::kAtomicCompareExchange:
            return "spirv.atomic_compare_exchange";
        case Function::kAtomicExchange:
            return "spirv.atomic_exchange";
        case Function::kAtomicIadd:
            return "spirv.atomic_iadd";
        case Function::kAtomicIsub:
            return "spirv.atomic_isub";
        case Function::kAtomicLoad:
            return "spirv.atomic_load";
        case Function::kAtomicOr:
            return "spirv.atomic_or";
        case Function::kAtomicSmax:
            return "spirv.atomic_smax";
        case Function::kAtomicSmin:
            return "spirv.atomic_smin";
        case Function::kAtomicStore:
            return "spirv.atomic_store";
        case Function::kAtomicUmax:
            return "spirv.atomic_umax";
        case Function::kAtomicUmin:
            return "spirv.atomic_umin";
        case Function::kAtomicXor:
            return "spirv.atomic_xor";
        case Function::kDot:
            return "spirv.dot";
        case Function::kMatrixTimesMatrix:
            return "spirv.matrix_times_matrix";
        case Function::kMatrixTimesScalar:
            return "spirv.matrix_times_scalar";
        case Function::kMatrixTimesVector:
            return "spirv.matrix_times_vector";
        case Function::kVectorTimesMatrix:
            return "spirv.vector_times_matrix";
        case Function::kSelect:
            return "spirv.select";
        case Function::kVectorTimesScalar:
            return "spirv.vector_times_scalar";
    }
    return "<unknown>";
}

}  // namespace tint::spirv::ir
