[ir][spirv-writer] Fix binary and|or for bools
These need to use OpLogical{And,Or} instead of OpBitwise{And,Or}.
Bug: tint:1906
Change-Id: Ia45e4386205aa6e231f50e6b24ef31d9db4e7fb5
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/141242
Reviewed-by: Dan Sinclair <dsinclair@chromium.org>
Commit-Queue: James Price <jrprice@google.com>
Auto-Submit: James Price <jrprice@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/tint/writer/spirv/ir/generator_impl_ir.cc b/src/tint/writer/spirv/ir/generator_impl_ir.cc
index e906cc7..bae2f8e 100644
--- a/src/tint/writer/spirv/ir/generator_impl_ir.cc
+++ b/src/tint/writer/spirv/ir/generator_impl_ir.cc
@@ -1020,11 +1020,19 @@
}
case ir::Binary::Kind::kAnd: {
- op = spv::Op::OpBitwiseAnd;
+ if (ty->is_integer_scalar_or_vector()) {
+ op = spv::Op::OpBitwiseAnd;
+ } else if (ty->is_bool_scalar_or_vector()) {
+ op = spv::Op::OpLogicalAnd;
+ }
break;
}
case ir::Binary::Kind::kOr: {
- op = spv::Op::OpBitwiseOr;
+ if (ty->is_integer_scalar_or_vector()) {
+ op = spv::Op::OpBitwiseOr;
+ } else if (ty->is_bool_scalar_or_vector()) {
+ op = spv::Op::OpLogicalOr;
+ }
break;
}
case ir::Binary::Kind::kXor: {
diff --git a/src/tint/writer/spirv/ir/generator_impl_ir_binary_test.cc b/src/tint/writer/spirv/ir/generator_impl_ir_binary_test.cc
index bdd542c..3a7047d 100644
--- a/src/tint/writer/spirv/ir/generator_impl_ir_binary_test.cc
+++ b/src/tint/writer/spirv/ir/generator_impl_ir_binary_test.cc
@@ -108,6 +108,11 @@
BinaryTestCase{kF16, ir::Binary::Kind::kMultiply, "OpFMul", "half"},
BinaryTestCase{kF16, ir::Binary::Kind::kDivide, "OpFDiv", "half"},
BinaryTestCase{kF16, ir::Binary::Kind::kModulo, "OpFRem", "half"}));
+INSTANTIATE_TEST_SUITE_P(
+ SpvGeneratorImplTest_Binary_Bool,
+ Arithmetic_Bitwise,
+ testing::Values(BinaryTestCase{kBool, ir::Binary::Kind::kAnd, "OpLogicalAnd", "bool"},
+ BinaryTestCase{kBool, ir::Binary::Kind::kOr, "OpLogicalOr", "bool"}));
TEST_F(SpvGeneratorImplTest, Binary_ScalarTimesVector_F32) {
auto* scalar = b.FunctionParam("scalar", ty.f32());