// Copyright 2020 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.

#include "src/writer/spirv/spv_dump.h"
#include "src/writer/spirv/test_helper.h"

namespace tint {
namespace writer {
namespace spirv {
namespace {

using BuilderTest = TestHelper;

struct BinaryData {
  ast::BinaryOp op;
  std::string name;
};
inline std::ostream& operator<<(std::ostream& out, BinaryData data) {
  out << data.op;
  return out;
}

using BinaryArithSignedIntegerTest = TestParamHelper<BinaryData>;
TEST_P(BinaryArithSignedIntegerTest, Scalar) {
  auto param = GetParam();

  auto* lhs = Expr(3);
  auto* rhs = Expr(4);

  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 4u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeInt 32 1
%2 = OpConstant %1 3
%3 = OpConstant %1 4
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            "%4 = " + param.name + " %1 %2 %3\n");
}

TEST_P(BinaryArithSignedIntegerTest, Vector) {
  auto param = GetParam();

  // Skip ops that are illegal for this type
  if (param.op == ast::BinaryOp::kAnd || param.op == ast::BinaryOp::kOr ||
      param.op == ast::BinaryOp::kXor) {
    return;
  }

  auto* lhs = vec3<i32>(1, 1, 1);
  auto* rhs = vec3<i32>(1, 1, 1);

  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 5u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeInt 32 1
%1 = OpTypeVector %2 3
%3 = OpConstant %2 1
%4 = OpConstantComposite %1 %3 %3 %3
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            "%5 = " + param.name + " %1 %4 %4\n");
}
TEST_P(BinaryArithSignedIntegerTest, Scalar_Loads) {
  auto param = GetParam();

  auto* var = Var("param", ty.i32());
  auto* expr =
      create<ast::BinaryExpression>(param.op, Expr("param"), Expr("param"));

  WrapInFunction(var, expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});
  EXPECT_TRUE(b.GenerateFunctionVariable(var)) << b.error();
  EXPECT_EQ(b.GenerateBinaryExpression(expr), 7u) << b.error();
  ASSERT_FALSE(b.has_error()) << b.error();

  EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeInt 32 1
%2 = OpTypePointer Function %3
%4 = OpConstantNull %3
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].variables()),
            R"(%1 = OpVariable %2 Function %4
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            R"(%5 = OpLoad %3 %1
%6 = OpLoad %3 %1
%7 = )" + param.name +
                R"( %3 %5 %6
)");
}
INSTANTIATE_TEST_SUITE_P(
    BuilderTest,
    BinaryArithSignedIntegerTest,
    // NOTE: No left and right shift as they require u32 for rhs operand
    testing::Values(BinaryData{ast::BinaryOp::kAdd, "OpIAdd"},
                    BinaryData{ast::BinaryOp::kAnd, "OpBitwiseAnd"},
                    BinaryData{ast::BinaryOp::kDivide, "OpSDiv"},
                    BinaryData{ast::BinaryOp::kModulo, "OpSMod"},
                    BinaryData{ast::BinaryOp::kMultiply, "OpIMul"},
                    BinaryData{ast::BinaryOp::kOr, "OpBitwiseOr"},
                    BinaryData{ast::BinaryOp::kSubtract, "OpISub"},
                    BinaryData{ast::BinaryOp::kXor, "OpBitwiseXor"}));

using BinaryArithUnsignedIntegerTest = TestParamHelper<BinaryData>;
TEST_P(BinaryArithUnsignedIntegerTest, Scalar) {
  auto param = GetParam();

  auto* lhs = Expr(3u);
  auto* rhs = Expr(4u);

  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 4u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeInt 32 0
%2 = OpConstant %1 3
%3 = OpConstant %1 4
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            "%4 = " + param.name + " %1 %2 %3\n");
}
TEST_P(BinaryArithUnsignedIntegerTest, Vector) {
  auto param = GetParam();

  // Skip ops that are illegal for this type
  if (param.op == ast::BinaryOp::kAnd || param.op == ast::BinaryOp::kOr ||
      param.op == ast::BinaryOp::kXor) {
    return;
  }

  auto* lhs = vec3<u32>(1u, 1u, 1u);
  auto* rhs = vec3<u32>(1u, 1u, 1u);

  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 5u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeInt 32 0
%1 = OpTypeVector %2 3
%3 = OpConstant %2 1
%4 = OpConstantComposite %1 %3 %3 %3
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            "%5 = " + param.name + " %1 %4 %4\n");
}
INSTANTIATE_TEST_SUITE_P(
    BuilderTest,
    BinaryArithUnsignedIntegerTest,
    testing::Values(BinaryData{ast::BinaryOp::kAdd, "OpIAdd"},
                    BinaryData{ast::BinaryOp::kAnd, "OpBitwiseAnd"},
                    BinaryData{ast::BinaryOp::kDivide, "OpUDiv"},
                    BinaryData{ast::BinaryOp::kModulo, "OpUMod"},
                    BinaryData{ast::BinaryOp::kMultiply, "OpIMul"},
                    BinaryData{ast::BinaryOp::kOr, "OpBitwiseOr"},
                    BinaryData{ast::BinaryOp::kShiftLeft, "OpShiftLeftLogical"},
                    BinaryData{ast::BinaryOp::kShiftRight,
                               "OpShiftRightLogical"},
                    BinaryData{ast::BinaryOp::kSubtract, "OpISub"},
                    BinaryData{ast::BinaryOp::kXor, "OpBitwiseXor"}));

using BinaryArithFloatTest = TestParamHelper<BinaryData>;
TEST_P(BinaryArithFloatTest, Scalar) {
  auto param = GetParam();

  auto* lhs = Expr(3.2f);
  auto* rhs = Expr(4.5f);

  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 4u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeFloat 32
%2 = OpConstant %1 3.20000005
%3 = OpConstant %1 4.5
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            "%4 = " + param.name + " %1 %2 %3\n");
}

TEST_P(BinaryArithFloatTest, Vector) {
  auto param = GetParam();

  auto* lhs = vec3<f32>(1.f, 1.f, 1.f);
  auto* rhs = vec3<f32>(1.f, 1.f, 1.f);

  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 5u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
%1 = OpTypeVector %2 3
%3 = OpConstant %2 1
%4 = OpConstantComposite %1 %3 %3 %3
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            "%5 = " + param.name + " %1 %4 %4\n");
}
INSTANTIATE_TEST_SUITE_P(
    BuilderTest,
    BinaryArithFloatTest,
    testing::Values(BinaryData{ast::BinaryOp::kAdd, "OpFAdd"},
                    BinaryData{ast::BinaryOp::kDivide, "OpFDiv"},
                    BinaryData{ast::BinaryOp::kModulo, "OpFMod"},
                    BinaryData{ast::BinaryOp::kMultiply, "OpFMul"},
                    BinaryData{ast::BinaryOp::kSubtract, "OpFSub"}));

using BinaryCompareBoolTest = TestParamHelper<BinaryData>;
TEST_P(BinaryCompareBoolTest, Scalar) {
  auto param = GetParam();

  auto* lhs = Expr(true);
  auto* rhs = Expr(false);

  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 4u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeBool
%2 = OpConstantTrue %1
%3 = OpConstantFalse %1
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            "%4 = " + param.name + " %1 %2 %3\n");
}

TEST_P(BinaryCompareBoolTest, Vector) {
  auto param = GetParam();

  auto* lhs = vec3<bool>(false, true, false);
  auto* rhs = vec3<bool>(true, false, true);

  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 7u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeBool
%1 = OpTypeVector %2 3
%3 = OpConstantFalse %2
%4 = OpConstantTrue %2
%5 = OpConstantComposite %1 %3 %4 %3
%6 = OpConstantComposite %1 %4 %3 %4
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            "%7 = " + param.name + " %1 %5 %6\n");
}
INSTANTIATE_TEST_SUITE_P(
    BuilderTest,
    BinaryCompareBoolTest,
    testing::Values(BinaryData{ast::BinaryOp::kEqual, "OpLogicalEqual"},
                    BinaryData{ast::BinaryOp::kNotEqual, "OpLogicalNotEqual"}));

using BinaryCompareUnsignedIntegerTest = TestParamHelper<BinaryData>;
TEST_P(BinaryCompareUnsignedIntegerTest, Scalar) {
  auto param = GetParam();

  auto* lhs = Expr(3u);
  auto* rhs = Expr(4u);

  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 4u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeInt 32 0
%2 = OpConstant %1 3
%3 = OpConstant %1 4
%5 = OpTypeBool
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            "%4 = " + param.name + " %5 %2 %3\n");
}

TEST_P(BinaryCompareUnsignedIntegerTest, Vector) {
  auto param = GetParam();

  auto* lhs = vec3<u32>(1u, 1u, 1u);
  auto* rhs = vec3<u32>(1u, 1u, 1u);

  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 5u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeInt 32 0
%1 = OpTypeVector %2 3
%3 = OpConstant %2 1
%4 = OpConstantComposite %1 %3 %3 %3
%7 = OpTypeBool
%6 = OpTypeVector %7 3
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            "%5 = " + param.name + " %6 %4 %4\n");
}
INSTANTIATE_TEST_SUITE_P(
    BuilderTest,
    BinaryCompareUnsignedIntegerTest,
    testing::Values(
        BinaryData{ast::BinaryOp::kEqual, "OpIEqual"},
        BinaryData{ast::BinaryOp::kGreaterThan, "OpUGreaterThan"},
        BinaryData{ast::BinaryOp::kGreaterThanEqual, "OpUGreaterThanEqual"},
        BinaryData{ast::BinaryOp::kLessThan, "OpULessThan"},
        BinaryData{ast::BinaryOp::kLessThanEqual, "OpULessThanEqual"},
        BinaryData{ast::BinaryOp::kNotEqual, "OpINotEqual"}));

using BinaryCompareSignedIntegerTest = TestParamHelper<BinaryData>;
TEST_P(BinaryCompareSignedIntegerTest, Scalar) {
  auto param = GetParam();

  auto* lhs = Expr(3);
  auto* rhs = Expr(4);

  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 4u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeInt 32 1
%2 = OpConstant %1 3
%3 = OpConstant %1 4
%5 = OpTypeBool
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            "%4 = " + param.name + " %5 %2 %3\n");
}

TEST_P(BinaryCompareSignedIntegerTest, Vector) {
  auto param = GetParam();

  auto* lhs = vec3<i32>(1, 1, 1);
  auto* rhs = vec3<i32>(1, 1, 1);

  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 5u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeInt 32 1
%1 = OpTypeVector %2 3
%3 = OpConstant %2 1
%4 = OpConstantComposite %1 %3 %3 %3
%7 = OpTypeBool
%6 = OpTypeVector %7 3
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            "%5 = " + param.name + " %6 %4 %4\n");
}
INSTANTIATE_TEST_SUITE_P(
    BuilderTest,
    BinaryCompareSignedIntegerTest,
    testing::Values(
        BinaryData{ast::BinaryOp::kEqual, "OpIEqual"},
        BinaryData{ast::BinaryOp::kGreaterThan, "OpSGreaterThan"},
        BinaryData{ast::BinaryOp::kGreaterThanEqual, "OpSGreaterThanEqual"},
        BinaryData{ast::BinaryOp::kLessThan, "OpSLessThan"},
        BinaryData{ast::BinaryOp::kLessThanEqual, "OpSLessThanEqual"},
        BinaryData{ast::BinaryOp::kNotEqual, "OpINotEqual"}));

using BinaryCompareFloatTest = TestParamHelper<BinaryData>;
TEST_P(BinaryCompareFloatTest, Scalar) {
  auto param = GetParam();

  auto* lhs = Expr(3.2f);
  auto* rhs = Expr(4.5f);

  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 4u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeFloat 32
%2 = OpConstant %1 3.20000005
%3 = OpConstant %1 4.5
%5 = OpTypeBool
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            "%4 = " + param.name + " %5 %2 %3\n");
}

TEST_P(BinaryCompareFloatTest, Vector) {
  auto param = GetParam();

  auto* lhs = vec3<f32>(1.f, 1.f, 1.f);
  auto* rhs = vec3<f32>(1.f, 1.f, 1.f);

  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 5u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
%1 = OpTypeVector %2 3
%3 = OpConstant %2 1
%4 = OpConstantComposite %1 %3 %3 %3
%7 = OpTypeBool
%6 = OpTypeVector %7 3
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            "%5 = " + param.name + " %6 %4 %4\n");
}
INSTANTIATE_TEST_SUITE_P(
    BuilderTest,
    BinaryCompareFloatTest,
    testing::Values(
        BinaryData{ast::BinaryOp::kEqual, "OpFOrdEqual"},
        BinaryData{ast::BinaryOp::kGreaterThan, "OpFOrdGreaterThan"},
        BinaryData{ast::BinaryOp::kGreaterThanEqual, "OpFOrdGreaterThanEqual"},
        BinaryData{ast::BinaryOp::kLessThan, "OpFOrdLessThan"},
        BinaryData{ast::BinaryOp::kLessThanEqual, "OpFOrdLessThanEqual"},
        BinaryData{ast::BinaryOp::kNotEqual, "OpFOrdNotEqual"}));

TEST_F(BuilderTest, Binary_Multiply_VectorScalar) {
  auto* lhs = vec3<f32>(1.f, 1.f, 1.f);
  auto* rhs = Expr(1.f);

  auto* expr =
      create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 5u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()),
            R"(%2 = OpTypeFloat 32
%1 = OpTypeVector %2 3
%3 = OpConstant %2 1
%4 = OpConstantComposite %1 %3 %3 %3
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            "%5 = OpVectorTimesScalar %1 %4 %3\n");
}

TEST_F(BuilderTest, Binary_Multiply_ScalarVector) {
  auto* lhs = Expr(1.f);
  auto* rhs = vec3<f32>(1.f, 1.f, 1.f);

  auto* expr =
      create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 5u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()),
            R"(%1 = OpTypeFloat 32
%2 = OpConstant %1 1
%3 = OpTypeVector %1 3
%4 = OpConstantComposite %3 %2 %2 %2
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            "%5 = OpVectorTimesScalar %3 %4 %2\n");
}

TEST_F(BuilderTest, Binary_Multiply_MatrixScalar) {
  auto* var = Var("mat", ty.mat3x3<f32>());

  auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply,
                                             Expr("mat"), Expr(1.f));

  WrapInFunction(var, expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});
  ASSERT_TRUE(b.GenerateGlobalVariable(var)) << b.error();

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 8u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()),
            R"(%5 = OpTypeFloat 32
%4 = OpTypeVector %5 3
%3 = OpTypeMatrix %4 3
%2 = OpTypePointer Function %3
%1 = OpVariable %2 Function
%7 = OpConstant %5 1
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            R"(%6 = OpLoad %3 %1
%8 = OpMatrixTimesScalar %3 %6 %7
)");
}

TEST_F(BuilderTest, Binary_Multiply_ScalarMatrix) {
  auto* var = Var("mat", ty.mat3x3<f32>());

  auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply,
                                             Expr(1.f), Expr("mat"));

  WrapInFunction(var, expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});
  ASSERT_TRUE(b.GenerateGlobalVariable(var)) << b.error();

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 8u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()),
            R"(%5 = OpTypeFloat 32
%4 = OpTypeVector %5 3
%3 = OpTypeMatrix %4 3
%2 = OpTypePointer Function %3
%1 = OpVariable %2 Function
%6 = OpConstant %5 1
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            R"(%7 = OpLoad %3 %1
%8 = OpMatrixTimesScalar %3 %7 %6
)");
}

TEST_F(BuilderTest, Binary_Multiply_MatrixVector) {
  auto* var = Var("mat", ty.mat3x3<f32>());
  auto* rhs = vec3<f32>(1.f, 1.f, 1.f);

  auto* expr =
      create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, Expr("mat"), rhs);

  WrapInFunction(var, expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});
  ASSERT_TRUE(b.GenerateGlobalVariable(var)) << b.error();

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 9u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()),
            R"(%5 = OpTypeFloat 32
%4 = OpTypeVector %5 3
%3 = OpTypeMatrix %4 3
%2 = OpTypePointer Function %3
%1 = OpVariable %2 Function
%7 = OpConstant %5 1
%8 = OpConstantComposite %4 %7 %7 %7
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            R"(%6 = OpLoad %3 %1
%9 = OpMatrixTimesVector %4 %6 %8
)");
}

TEST_F(BuilderTest, Binary_Multiply_VectorMatrix) {
  auto* var = Var("mat", ty.mat3x3<f32>());
  auto* lhs = vec3<f32>(1.f, 1.f, 1.f);

  auto* expr =
      create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, Expr("mat"));

  WrapInFunction(var, expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});
  ASSERT_TRUE(b.GenerateGlobalVariable(var)) << b.error();

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 9u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()),
            R"(%5 = OpTypeFloat 32
%4 = OpTypeVector %5 3
%3 = OpTypeMatrix %4 3
%2 = OpTypePointer Function %3
%1 = OpVariable %2 Function
%6 = OpConstant %5 1
%7 = OpConstantComposite %4 %6 %6 %6
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            R"(%8 = OpLoad %3 %1
%9 = OpVectorTimesMatrix %4 %7 %8
)");
}

TEST_F(BuilderTest, Binary_Multiply_MatrixMatrix) {
  auto* var = Var("mat", ty.mat3x3<f32>());

  auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply,
                                             Expr("mat"), Expr("mat"));

  WrapInFunction(var, expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});
  ASSERT_TRUE(b.GenerateGlobalVariable(var)) << b.error();

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 8u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()),
            R"(%5 = OpTypeFloat 32
%4 = OpTypeVector %5 3
%3 = OpTypeMatrix %4 3
%2 = OpTypePointer Function %3
%1 = OpVariable %2 Function
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            R"(%6 = OpLoad %3 %1
%7 = OpLoad %3 %1
%8 = OpMatrixTimesMatrix %3 %6 %7
)");
}

TEST_F(BuilderTest, Binary_LogicalAnd) {
  auto* lhs =
      create<ast::BinaryExpression>(ast::BinaryOp::kEqual, Expr(1), Expr(2));

  auto* rhs =
      create<ast::BinaryExpression>(ast::BinaryOp::kEqual, Expr(3), Expr(4));

  auto* expr =
      create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});
  b.GenerateLabel(b.next_id());

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 12u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()),
            R"(%2 = OpTypeInt 32 1
%3 = OpConstant %2 1
%4 = OpConstant %2 2
%6 = OpTypeBool
%9 = OpConstant %2 3
%10 = OpConstant %2 4
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            R"(%1 = OpLabel
%5 = OpIEqual %6 %3 %4
OpSelectionMerge %7 None
OpBranchConditional %5 %8 %7
%8 = OpLabel
%11 = OpIEqual %6 %9 %10
OpBranch %7
%7 = OpLabel
%12 = OpPhi %6 %5 %1 %11 %8
)");
}

TEST_F(BuilderTest, Binary_LogicalAnd_WithLoads) {
  auto* a_var =
      Global("a", ty.bool_(), ast::StorageClass::kPrivate, Expr(true));
  auto* b_var =
      Global("b", ty.bool_(), ast::StorageClass::kPrivate, Expr(false));

  auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd,
                                             Expr("a"), Expr("b"));

  WrapInFunction(expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});
  b.GenerateLabel(b.next_id());

  ASSERT_TRUE(b.GenerateGlobalVariable(a_var)) << b.error();
  ASSERT_TRUE(b.GenerateGlobalVariable(b_var)) << b.error();

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 12u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeBool
%3 = OpConstantTrue %2
%5 = OpTypePointer Private %2
%4 = OpVariable %5 Private %3
%6 = OpConstantFalse %2
%7 = OpVariable %5 Private %6
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            R"(%1 = OpLabel
%8 = OpLoad %2 %4
OpSelectionMerge %9 None
OpBranchConditional %8 %10 %9
%10 = OpLabel
%11 = OpLoad %2 %7
OpBranch %9
%9 = OpLabel
%12 = OpPhi %2 %8 %1 %11 %10
)");
}

TEST_F(BuilderTest, Binary_logicalOr_Nested_LogicalAnd) {
  // Test an expression like
  //    a || (b && c)
  // From: crbug.com/tint/355

  auto* logical_and_expr = create<ast::BinaryExpression>(
      ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));

  auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kLogicalOr,
                                             Expr(true), logical_and_expr);

  WrapInFunction(expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});
  b.GenerateLabel(b.next_id());

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 10u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeBool
%3 = OpConstantTrue %2
%8 = OpConstantFalse %2
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            R"(%1 = OpLabel
OpSelectionMerge %4 None
OpBranchConditional %3 %4 %5
%5 = OpLabel
OpSelectionMerge %6 None
OpBranchConditional %3 %7 %6
%7 = OpLabel
OpBranch %6
%6 = OpLabel
%9 = OpPhi %2 %3 %5 %8 %7
OpBranch %4
%4 = OpLabel
%10 = OpPhi %2 %3 %1 %9 %6
)");
}

TEST_F(BuilderTest, Binary_logicalAnd_Nested_LogicalOr) {
  // Test an expression like
  //    a && (b || c)
  // From: crbug.com/tint/355

  auto* logical_or_expr = create<ast::BinaryExpression>(
      ast::BinaryOp::kLogicalOr, Expr(true), Expr(false));

  auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd,
                                             Expr(true), logical_or_expr);

  WrapInFunction(expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});
  b.GenerateLabel(b.next_id());

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 10u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeBool
%3 = OpConstantTrue %2
%8 = OpConstantFalse %2
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            R"(%1 = OpLabel
OpSelectionMerge %4 None
OpBranchConditional %3 %5 %4
%5 = OpLabel
OpSelectionMerge %6 None
OpBranchConditional %3 %6 %7
%7 = OpLabel
OpBranch %6
%6 = OpLabel
%9 = OpPhi %2 %3 %5 %8 %7
OpBranch %4
%4 = OpLabel
%10 = OpPhi %2 %3 %1 %9 %6
)");
}

TEST_F(BuilderTest, Binary_LogicalOr) {
  auto* lhs =
      create<ast::BinaryExpression>(ast::BinaryOp::kEqual, Expr(1), Expr(2));

  auto* rhs =
      create<ast::BinaryExpression>(ast::BinaryOp::kEqual, Expr(3), Expr(4));

  auto* expr =
      create<ast::BinaryExpression>(ast::BinaryOp::kLogicalOr, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});
  b.GenerateLabel(b.next_id());

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 12u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()),
            R"(%2 = OpTypeInt 32 1
%3 = OpConstant %2 1
%4 = OpConstant %2 2
%6 = OpTypeBool
%9 = OpConstant %2 3
%10 = OpConstant %2 4
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            R"(%1 = OpLabel
%5 = OpIEqual %6 %3 %4
OpSelectionMerge %7 None
OpBranchConditional %5 %7 %8
%8 = OpLabel
%11 = OpIEqual %6 %9 %10
OpBranch %7
%7 = OpLabel
%12 = OpPhi %6 %5 %1 %11 %8
)");
}

TEST_F(BuilderTest, Binary_LogicalOr_WithLoads) {
  auto* a_var =
      Global("a", ty.bool_(), ast::StorageClass::kPrivate, Expr(true));
  auto* b_var =
      Global("b", ty.bool_(), ast::StorageClass::kPrivate, Expr(false));

  auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kLogicalOr,
                                             Expr("a"), Expr("b"));

  WrapInFunction(expr);

  spirv::Builder& b = Build();

  b.push_function(Function{});
  b.GenerateLabel(b.next_id());

  ASSERT_TRUE(b.GenerateGlobalVariable(a_var)) << b.error();
  ASSERT_TRUE(b.GenerateGlobalVariable(b_var)) << b.error();

  EXPECT_EQ(b.GenerateBinaryExpression(expr), 12u) << b.error();
  EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeBool
%3 = OpConstantTrue %2
%5 = OpTypePointer Private %2
%4 = OpVariable %5 Private %3
%6 = OpConstantFalse %2
%7 = OpVariable %5 Private %6
)");
  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
            R"(%1 = OpLabel
%8 = OpLoad %2 %4
OpSelectionMerge %9 None
OpBranchConditional %8 %9 %10
%10 = OpLabel
%11 = OpLoad %2 %7
OpBranch %9
%9 = OpLabel
%12 = OpPhi %2 %8 %1 %11 %10
)");
}

namespace BinaryArithVectorScalar {

enum class Type { f32, i32, u32 };
static ast::Expression* MakeVectorExpr(ProgramBuilder* builder, Type type) {
  switch (type) {
    case Type::f32:
      return builder->vec3<ProgramBuilder::f32>(1.f, 1.f, 1.f);
    case Type::i32:
      return builder->vec3<ProgramBuilder::i32>(1, 1, 1);
    case Type::u32:
      return builder->vec3<ProgramBuilder::u32>(1u, 1u, 1u);
  }
  return nullptr;
}
static ast::Expression* MakeScalarExpr(ProgramBuilder* builder, Type type) {
  switch (type) {
    case Type::f32:
      return builder->Expr(1.f);
    case Type::i32:
      return builder->Expr(1);
    case Type::u32:
      return builder->Expr(1u);
  }
  return nullptr;
}
static std::string OpTypeDecl(Type type) {
  switch (type) {
    case Type::f32:
      return "OpTypeFloat 32";
    case Type::i32:
      return "OpTypeInt 32 1";
    case Type::u32:
      return "OpTypeInt 32 0";
  }
  return {};
}

struct Param {
  Type type;
  ast::BinaryOp op;
  std::string name;
};

using BinaryArithVectorScalarTest = TestParamHelper<Param>;
TEST_P(BinaryArithVectorScalarTest, VectorScalar) {
  auto& param = GetParam();

  ast::Expression* lhs = MakeVectorExpr(this, param.type);
  ast::Expression* rhs = MakeScalarExpr(this, param.type);
  std::string op_type_decl = OpTypeDecl(param.type);

  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();
  ASSERT_TRUE(b.Build()) << b.error();

  EXPECT_EQ(DumpBuilder(b), R"(OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %3 "test_function"
OpExecutionMode %3 LocalSize 1 1 1
OpName %3 "test_function"
%2 = OpTypeVoid
%1 = OpTypeFunction %2
%6 = )" + op_type_decl + R"(
%5 = OpTypeVector %6 3
%7 = OpConstant %6 1
%8 = OpConstantComposite %5 %7 %7 %7
%11 = OpTypePointer Function %5
%12 = OpConstantNull %5
%3 = OpFunction %2 None %1
%4 = OpLabel
%10 = OpVariable %11 Function %12
%13 = OpCompositeConstruct %5 %7 %7 %7
%9 = )" + param.name + R"( %5 %8 %13
OpReturn
OpFunctionEnd
)");

  Validate(b);
}
TEST_P(BinaryArithVectorScalarTest, ScalarVector) {
  auto& param = GetParam();

  ast::Expression* lhs = MakeScalarExpr(this, param.type);
  ast::Expression* rhs = MakeVectorExpr(this, param.type);
  std::string op_type_decl = OpTypeDecl(param.type);

  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();
  ASSERT_TRUE(b.Build()) << b.error();

  EXPECT_EQ(DumpBuilder(b), R"(OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %3 "test_function"
OpExecutionMode %3 LocalSize 1 1 1
OpName %3 "test_function"
%2 = OpTypeVoid
%1 = OpTypeFunction %2
%5 = )" + op_type_decl + R"(
%6 = OpConstant %5 1
%7 = OpTypeVector %5 3
%8 = OpConstantComposite %7 %6 %6 %6
%11 = OpTypePointer Function %7
%12 = OpConstantNull %7
%3 = OpFunction %2 None %1
%4 = OpLabel
%10 = OpVariable %11 Function %12
%13 = OpCompositeConstruct %7 %6 %6 %6
%9 = )" + param.name + R"( %7 %13 %8
OpReturn
OpFunctionEnd
)");

  Validate(b);
}
INSTANTIATE_TEST_SUITE_P(
    BuilderTest,
    BinaryArithVectorScalarTest,
    testing::Values(Param{Type::f32, ast::BinaryOp::kAdd, "OpFAdd"},
                    Param{Type::f32, ast::BinaryOp::kDivide, "OpFDiv"},
                    // NOTE: Modulo not allowed on mixed float scalar-vector
                    // Param{Type::f32, ast::BinaryOp::kModulo, "OpFMod"},
                    // NOTE: We test f32 multiplies separately as we emit
                    // OpVectorTimesScalar for this case
                    // Param{Type::i32, ast::BinaryOp::kMultiply, "OpIMul"},
                    Param{Type::f32, ast::BinaryOp::kSubtract, "OpFSub"},

                    Param{Type::i32, ast::BinaryOp::kAdd, "OpIAdd"},
                    Param{Type::i32, ast::BinaryOp::kDivide, "OpSDiv"},
                    Param{Type::i32, ast::BinaryOp::kModulo, "OpSMod"},
                    Param{Type::i32, ast::BinaryOp::kMultiply, "OpIMul"},
                    Param{Type::i32, ast::BinaryOp::kSubtract, "OpISub"},

                    Param{Type::u32, ast::BinaryOp::kAdd, "OpIAdd"},
                    Param{Type::u32, ast::BinaryOp::kDivide, "OpUDiv"},
                    Param{Type::u32, ast::BinaryOp::kModulo, "OpUMod"},
                    Param{Type::u32, ast::BinaryOp::kMultiply, "OpIMul"},
                    Param{Type::u32, ast::BinaryOp::kSubtract, "OpISub"}));

using BinaryArithVectorScalarMultiplyTest = TestParamHelper<Param>;
TEST_P(BinaryArithVectorScalarMultiplyTest, VectorScalar) {
  auto& param = GetParam();

  ast::Expression* lhs = MakeVectorExpr(this, param.type);
  ast::Expression* rhs = MakeScalarExpr(this, param.type);
  std::string op_type_decl = OpTypeDecl(param.type);

  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();
  ASSERT_TRUE(b.Build()) << b.error();

  EXPECT_EQ(DumpBuilder(b), R"(OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %3 "test_function"
OpExecutionMode %3 LocalSize 1 1 1
OpName %3 "test_function"
%2 = OpTypeVoid
%1 = OpTypeFunction %2
%6 = )" + op_type_decl + R"(
%5 = OpTypeVector %6 3
%7 = OpConstant %6 1
%8 = OpConstantComposite %5 %7 %7 %7
%3 = OpFunction %2 None %1
%4 = OpLabel
%9 = OpVectorTimesScalar %5 %8 %7
OpReturn
OpFunctionEnd
)");

  Validate(b);
}
TEST_P(BinaryArithVectorScalarMultiplyTest, ScalarVector) {
  auto& param = GetParam();

  ast::Expression* lhs = MakeScalarExpr(this, param.type);
  ast::Expression* rhs = MakeVectorExpr(this, param.type);
  std::string op_type_decl = OpTypeDecl(param.type);

  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();
  ASSERT_TRUE(b.Build()) << b.error();

  EXPECT_EQ(DumpBuilder(b), R"(OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %3 "test_function"
OpExecutionMode %3 LocalSize 1 1 1
OpName %3 "test_function"
%2 = OpTypeVoid
%1 = OpTypeFunction %2
%5 = )" + op_type_decl + R"(
%6 = OpConstant %5 1
%7 = OpTypeVector %5 3
%8 = OpConstantComposite %7 %6 %6 %6
%3 = OpFunction %2 None %1
%4 = OpLabel
%9 = OpVectorTimesScalar %7 %8 %6
OpReturn
OpFunctionEnd
)");

  Validate(b);
}
INSTANTIATE_TEST_SUITE_P(BuilderTest,
                         BinaryArithVectorScalarMultiplyTest,
                         testing::Values(Param{
                             Type::f32, ast::BinaryOp::kMultiply, "OpFMul"}));

}  // namespace BinaryArithVectorScalar

namespace BinaryArithMatrixMatrix {

struct Param {
  ast::BinaryOp op;
  std::string name;
};

using BinaryArithMatrixMatrix = TestParamHelper<Param>;
TEST_P(BinaryArithMatrixMatrix, AddOrSubtract) {
  auto& param = GetParam();

  ast::Expression* lhs = mat3x4<f32>();
  ast::Expression* rhs = mat3x4<f32>();

  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();
  ASSERT_TRUE(b.Build()) << b.error();

  EXPECT_EQ(DumpBuilder(b), R"(OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %3 "test_function"
OpExecutionMode %3 LocalSize 1 1 1
OpName %3 "test_function"
%2 = OpTypeVoid
%1 = OpTypeFunction %2
%7 = OpTypeFloat 32
%6 = OpTypeVector %7 4
%5 = OpTypeMatrix %6 3
%8 = OpConstantNull %5
%3 = OpFunction %2 None %1
%4 = OpLabel
%10 = OpCompositeExtract %6 %8 0
%11 = OpCompositeExtract %6 %8 0
%12 = )" + param.name + R"( %6 %10 %11
%13 = OpCompositeExtract %6 %8 1
%14 = OpCompositeExtract %6 %8 1
%15 = )" + param.name + R"( %6 %13 %14
%16 = OpCompositeExtract %6 %8 2
%17 = OpCompositeExtract %6 %8 2
%18 = )" + param.name + R"( %6 %16 %17
%19 = OpCompositeConstruct %5 %12 %15 %18
OpReturn
OpFunctionEnd
)");

  Validate(b);
}
INSTANTIATE_TEST_SUITE_P(  //
    BuilderTest,
    BinaryArithMatrixMatrix,
    testing::Values(Param{ast::BinaryOp::kAdd, "OpFAdd"},
                    Param{ast::BinaryOp::kSubtract, "OpFSub"}));

using BinaryArithMatrixMatrixMultiply = TestParamHelper<Param>;
TEST_P(BinaryArithMatrixMatrixMultiply, Multiply) {
  auto& param = GetParam();

  ast::Expression* lhs = mat3x4<f32>();
  ast::Expression* rhs = mat4x3<f32>();

  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);

  WrapInFunction(expr);

  spirv::Builder& b = Build();
  ASSERT_TRUE(b.Build()) << b.error();

  EXPECT_EQ(DumpBuilder(b), R"(OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %3 "test_function"
OpExecutionMode %3 LocalSize 1 1 1
OpName %3 "test_function"
%2 = OpTypeVoid
%1 = OpTypeFunction %2
%7 = OpTypeFloat 32
%6 = OpTypeVector %7 4
%5 = OpTypeMatrix %6 3
%8 = OpConstantNull %5
%10 = OpTypeVector %7 3
%9 = OpTypeMatrix %10 4
%11 = OpConstantNull %9
%13 = OpTypeMatrix %6 4
%3 = OpFunction %2 None %1
%4 = OpLabel
%12 = OpMatrixTimesMatrix %13 %8 %11
OpReturn
OpFunctionEnd
)");

  Validate(b);
}
INSTANTIATE_TEST_SUITE_P(  //
    BuilderTest,
    BinaryArithMatrixMatrixMultiply,
    testing::Values(Param{ast::BinaryOp::kMultiply, "OpFMul"}));

}  // namespace BinaryArithMatrixMatrix

}  // namespace
}  // namespace spirv
}  // namespace writer
}  // namespace tint
