From dc48af981aa382d49c17cfb23292ae49af7667a1 Mon Sep 17 00:00:00 2001 From: dan sinclair Date: Tue, 14 Apr 2020 20:48:42 +0000 Subject: [PATCH] [spirv-writer] Add shift operators. This CL adds generation for the OpShiftLeftLogical, OpShiftRightLogical and OpShiftRightArithmetic expressions. Bug: tint:5 Change-Id: I3436453350fc9afd3528b1ae238682b7abc6d636 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/19508 Reviewed-by: David Neto --- src/writer/spirv/builder.cc | 6 ++++ .../spirv/builder_binary_expression_test.cc | 36 +++++++++++-------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc index 400415f680..540de5c885 100644 --- a/src/writer/spirv/builder.cc +++ b/src/writer/spirv/builder.cc @@ -635,6 +635,12 @@ uint32_t Builder::GenerateBinaryExpression(ast::BinaryExpression* expr) { op = lhs_is_float_or_vec ? spv::Op::OpFOrdNotEqual : spv::Op::OpINotEqual; } else if (expr->IsOr()) { op = spv::Op::OpBitwiseOr; + } else if (expr->IsShiftLeft()) { + op = spv::Op::OpShiftLeftLogical; + } else if (expr->IsShiftRight()) { + op = spv::Op::OpShiftRightLogical; + } else if (expr->IsShiftRightArith()) { + op = spv::Op::OpShiftRightArithmetic; } else if (expr->IsSubtract()) { op = lhs_is_float_or_vec ? spv::Op::OpFSub : spv::Op::OpISub; } else if (expr->IsXor()) { diff --git a/src/writer/spirv/builder_binary_expression_test.cc b/src/writer/spirv/builder_binary_expression_test.cc index b2c0d38160..97b3569772 100644 --- a/src/writer/spirv/builder_binary_expression_test.cc +++ b/src/writer/spirv/builder_binary_expression_test.cc @@ -120,13 +120,17 @@ TEST_P(BinaryArithSignedIntegerTest, Vector) { INSTANTIATE_TEST_SUITE_P( BuilderTest, BinaryArithSignedIntegerTest, - 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::kOr, "OpBitwiseOr"}, - BinaryData{ast::BinaryOp::kSubtract, "OpISub"}, - BinaryData{ast::BinaryOp::kXor, "OpBitwiseXor"})); + 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::kOr, "OpBitwiseOr"}, + BinaryData{ast::BinaryOp::kShiftLeft, "OpShiftLeftLogical"}, + BinaryData{ast::BinaryOp::kShiftRight, "OpShiftRightLogical"}, + BinaryData{ast::BinaryOp::kShiftRightArith, "OpShiftRightArithmetic"}, + BinaryData{ast::BinaryOp::kSubtract, "OpISub"}, + BinaryData{ast::BinaryOp::kXor, "OpBitwiseXor"})); using BinaryArithUnsignedIntegerTest = testing::TestWithParam; TEST_P(BinaryArithUnsignedIntegerTest, Scalar) { @@ -203,13 +207,17 @@ TEST_P(BinaryArithUnsignedIntegerTest, Vector) { 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::kOr, "OpBitwiseOr"}, - BinaryData{ast::BinaryOp::kSubtract, "OpISub"}, - BinaryData{ast::BinaryOp::kXor, "OpBitwiseXor"})); + 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::kOr, "OpBitwiseOr"}, + BinaryData{ast::BinaryOp::kShiftLeft, "OpShiftLeftLogical"}, + BinaryData{ast::BinaryOp::kShiftRight, "OpShiftRightLogical"}, + BinaryData{ast::BinaryOp::kShiftRightArith, "OpShiftRightArithmetic"}, + BinaryData{ast::BinaryOp::kSubtract, "OpISub"}, + BinaryData{ast::BinaryOp::kXor, "OpBitwiseXor"})); using BinaryArithFloatTest = testing::TestWithParam; TEST_P(BinaryArithFloatTest, Scalar) {