// Copyright 2024 The Dawn & Tint Authors
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this
//    list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
//    this list of conditions and the following disclaimer in the documentation
//    and/or other materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its
//    contributors may be used to endorse or promote products derived from
//    this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#include "src/tint/lang/glsl/writer/raise/binary_polyfill.h"

#include "src/tint/lang/core/fluent_types.h"  // IWYU pragma: export
#include "src/tint/lang/core/ir/builder.h"
#include "src/tint/lang/core/ir/module.h"
#include "src/tint/lang/core/ir/validator.h"
#include "src/tint/lang/core/type/manager.h"
#include "src/tint/lang/glsl/ir/builtin_call.h"

namespace tint::glsl::writer::raise {
namespace {

using namespace tint::core::fluent_types;     // NOLINT
using namespace tint::core::number_suffixes;  // NOLINT

/// PIMPL state for the transform.
struct State {
    /// The IR module.
    core::ir::Module& ir;

    /// The IR builder.
    core::ir::Builder b{ir};

    /// The type manager.
    core::type::Manager& ty{ir.Types()};

    /// Float modulo polyfills
    Hashmap<const core::type::Type*, core::ir::Function*, 4> float_modulo_funcs_{};

    /// Process the module.
    void Process() {
        // Find the binary instructions that need replacing.
        Vector<core::ir::Binary*, 4> binary_worklist;
        for (auto* inst : ir.Instructions()) {
            if (auto* binary = inst->As<core::ir::Binary>()) {
                switch (binary->Op()) {
                    case core::BinaryOp::kAnd:
                    case core::BinaryOp::kOr: {
                        if (binary->LHS()->Type()->IsBoolScalarOrVector()) {
                            binary_worklist.Push(binary);
                        }
                        break;
                    }
                    case core::BinaryOp::kModulo: {
                        if (binary->LHS()->Type()->IsFloatScalarOrVector()) {
                            binary_worklist.Push(binary);
                        }
                        break;
                    }
                    case core::BinaryOp::kEqual:
                    case core::BinaryOp::kNotEqual:
                    case core::BinaryOp::kLessThan:
                    case core::BinaryOp::kGreaterThan:
                    case core::BinaryOp::kLessThanEqual:
                    case core::BinaryOp::kGreaterThanEqual:
                        if (!binary->LHS()->Type()->Is<core::type::Scalar>()) {
                            binary_worklist.Push(binary);
                        }
                        break;
                    default:
                        break;
                }
                continue;
            }
        }

        // Replace the binary calls
        for (auto* binary : binary_worklist) {
            switch (binary->Op()) {
                case core::BinaryOp::kAnd:
                case core::BinaryOp::kOr:
                    BitwiseBoolean(binary);
                    break;
                case core::BinaryOp::kModulo:
                    FloatModulo(binary);
                    break;
                case core::BinaryOp::kEqual:
                case core::BinaryOp::kNotEqual:
                case core::BinaryOp::kLessThan:
                case core::BinaryOp::kGreaterThan:
                case core::BinaryOp::kLessThanEqual:
                case core::BinaryOp::kGreaterThanEqual:
                    ConvertRelational(binary);
                    break;
                default:
                    TINT_IR_UNIMPLEMENTED(ir);
            }
        }
    }

    void ConvertRelational(core::ir::Binary* binary) {
        glsl::BuiltinFn func = glsl::BuiltinFn::kNone;
        switch (binary->Op()) {
            case core::BinaryOp::kEqual:
                func = glsl::BuiltinFn::kEqual;
                break;
            case core::BinaryOp::kNotEqual:
                func = glsl::BuiltinFn::kNotEqual;
                break;
            case core::BinaryOp::kLessThan:
                func = glsl::BuiltinFn::kLessThan;
                break;
            case core::BinaryOp::kGreaterThan:
                func = glsl::BuiltinFn::kGreaterThan;
                break;
            case core::BinaryOp::kLessThanEqual:
                func = glsl::BuiltinFn::kLessThanEqual;
                break;
            case core::BinaryOp::kGreaterThanEqual:
                func = glsl::BuiltinFn::kGreaterThanEqual;
                break;
            default:
                TINT_IR_UNREACHABLE(ir);
        }
        b.InsertBefore(binary, [&] {
            b.CallWithResult<glsl::ir::BuiltinCall>(binary->DetachResult(), func, binary->LHS(),
                                                    binary->RHS());
        });
        binary->Destroy();
    }

    void BitwiseBoolean(core::ir::Binary* binary) {
        b.InsertBefore(binary, [&] {
            auto* res_ty = ty.MatchWidth(ty.u32(), binary->Result()->Type());
            auto* lhs = b.Convert(res_ty, binary->LHS());
            auto* rhs = b.Convert(res_ty, binary->RHS());

            core::ir::Value* result = nullptr;
            switch (binary->Op()) {
                case core::BinaryOp::kAnd:
                    result = b.And(lhs, rhs)->Result();
                    break;
                case core::BinaryOp::kOr:
                    result = b.Or(lhs, rhs)->Result();
                    break;
                default:
                    TINT_IR_UNREACHABLE(ir);
            }
            b.ConvertWithResult(binary->DetachResult(), result);
        });
        binary->Destroy();
    }

    core::ir::Function* CreateFloatModuloPolyfill(const core::type::Type* type) {
        return float_modulo_funcs_.GetOrAdd(type, [&]() -> core::ir::Function* {
            auto* f = b.Function("tint_float_modulo", type);
            auto* x = b.FunctionParam("x", type);
            auto* y = b.FunctionParam("y", type);
            f->SetParams({x, y});

            b.Append(f->Block(), [&] {
                core::ir::Value* ret = nullptr;

                ret = b.Divide(x, y)->Result();
                ret = b.Call(type, core::BuiltinFn::kTrunc, ret)->Result();
                ret = b.Multiply(y, ret)->Result();
                ret = b.Subtract(x, ret)->Result();
                b.Return(f, ret);
            });
            return f;
        });
    }

    void FloatModulo(core::ir::Binary* binary) {
        b.InsertBefore(binary, [&] {
            auto* lhs = binary->LHS();
            auto* rhs = binary->RHS();

            auto* res_ty = binary->Result()->Type();

            // The WGSL modulo either takes two of the same types, which would then match the
            // result type, or a mixed scalar/vector combination. The vector type would then match
            // the result type. If we have a mixed scalar/vector, construct a vector of the scalar
            // type which makes the polyfill simpler.
            if (lhs->Type() != res_ty) {
                lhs = b.Construct(res_ty, lhs)->Result();
            }
            if (rhs->Type() != res_ty) {
                rhs = b.Construct(res_ty, rhs)->Result();
            }

            auto* func = CreateFloatModuloPolyfill(res_ty);
            b.CallWithResult(binary->DetachResult(), func, lhs, rhs);
        });
        binary->Destroy();
    }
};

}  // namespace

Result<SuccessType> BinaryPolyfill(core::ir::Module& ir) {
    core::ir::AssertValid(ir, core::ir::Capabilities{core::ir::Capability::kAllowDuplicateBindings},
                          "before glsl.BinaryPolyfill");

    State{ir}.Process();

    return Success;
}

}  // namespace tint::glsl::writer::raise
