[spirv-reader] Add bitwise operators
Bug: tint:3
Change-Id: I4ebaafcf2a234dd6c217241f0fb0dd6ee5684a7a
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/19561
Reviewed-by: dan sinclair <dsinclair@google.com>
diff --git a/src/reader/spirv/function.cc b/src/reader/spirv/function.cc
index 8b749e9..0412c67 100644
--- a/src/reader/spirv/function.cc
+++ b/src/reader/spirv/function.cc
@@ -58,6 +58,12 @@
return ast::BinaryOp::kEqual;
case SpvOpINotEqual:
return ast::BinaryOp::kNotEqual;
+ case SpvOpBitwiseAnd:
+ return ast::BinaryOp::kAnd;
+ case SpvOpBitwiseOr:
+ return ast::BinaryOp::kOr;
+ case SpvOpBitwiseXor:
+ return ast::BinaryOp::kXor;
default:
break;
}
diff --git a/src/reader/spirv/function_arithmetic_test.cc b/src/reader/spirv/function_arithmetic_test.cc
index 6741916..665274b 100644
--- a/src/reader/spirv/function_arithmetic_test.cc
+++ b/src/reader/spirv/function_arithmetic_test.cc
@@ -350,6 +350,104 @@
"v2uint_20_10", "__vec_2__i32", AstFor("v2int_40_30"),
"shift_right_arith", AstFor("v2uint_20_10")}));
+INSTANTIATE_TEST_SUITE_P(
+ SpvParserTest_BitwiseAnd,
+ SpvBinaryTest,
+ ::testing::Values(
+ // Both uint
+ BinaryData{"uint", "uint_10", "OpBitwiseAnd", "uint_20", "__u32",
+ "ScalarConstructor{10}", "and", "ScalarConstructor{20}"},
+ // Both int
+ BinaryData{"int", "int_30", "OpBitwiseAnd", "int_40", "__i32",
+ "ScalarConstructor{30}", "and", "ScalarConstructor{40}"},
+ // Mixed, returning uint
+ BinaryData{"uint", "int_30", "OpBitwiseAnd", "uint_10", "__u32",
+ "ScalarConstructor{30}", "and", "ScalarConstructor{10}"},
+ // Mixed, returning int
+ BinaryData{"int", "int_30", "OpBitwiseAnd", "uint_10", "__i32",
+ "ScalarConstructor{30}", "and", "ScalarConstructor{10}"},
+ // Both v2uint
+ BinaryData{"v2uint", "v2uint_10_20", "OpBitwiseAnd", "v2uint_20_10",
+ "__vec_2__u32", AstFor("v2uint_10_20"), "and",
+ AstFor("v2uint_20_10")},
+ // Both v2int
+ BinaryData{"v2int", "v2int_30_40", "OpBitwiseAnd", "v2int_40_30",
+ "__vec_2__i32", AstFor("v2int_30_40"), "and",
+ AstFor("v2int_40_30")},
+ // Mixed, returning v2uint
+ BinaryData{"v2uint", "v2int_30_40", "OpBitwiseAnd", "v2uint_10_20",
+ "__vec_2__u32", AstFor("v2int_30_40"), "and",
+ AstFor("v2uint_10_20")},
+ // Mixed, returning v2int
+ BinaryData{"v2int", "v2int_40_30", "OpBitwiseAnd", "v2uint_20_10",
+ "__vec_2__i32", AstFor("v2int_40_30"), "and",
+ AstFor("v2uint_20_10")}));
+
+INSTANTIATE_TEST_SUITE_P(
+ SpvParserTest_BitwiseOr,
+ SpvBinaryTest,
+ ::testing::Values(
+ // Both uint
+ BinaryData{"uint", "uint_10", "OpBitwiseOr", "uint_20", "__u32",
+ "ScalarConstructor{10}", "or", "ScalarConstructor{20}"},
+ // Both int
+ BinaryData{"int", "int_30", "OpBitwiseOr", "int_40", "__i32",
+ "ScalarConstructor{30}", "or", "ScalarConstructor{40}"},
+ // Mixed, returning uint
+ BinaryData{"uint", "int_30", "OpBitwiseOr", "uint_10", "__u32",
+ "ScalarConstructor{30}", "or", "ScalarConstructor{10}"},
+ // Mixed, returning int
+ BinaryData{"int", "int_30", "OpBitwiseOr", "uint_10", "__i32",
+ "ScalarConstructor{30}", "or", "ScalarConstructor{10}"},
+ // Both v2uint
+ BinaryData{"v2uint", "v2uint_10_20", "OpBitwiseOr", "v2uint_20_10",
+ "__vec_2__u32", AstFor("v2uint_10_20"), "or",
+ AstFor("v2uint_20_10")},
+ // Both v2int
+ BinaryData{"v2int", "v2int_30_40", "OpBitwiseOr", "v2int_40_30",
+ "__vec_2__i32", AstFor("v2int_30_40"), "or",
+ AstFor("v2int_40_30")},
+ // Mixed, returning v2uint
+ BinaryData{"v2uint", "v2int_30_40", "OpBitwiseOr", "v2uint_10_20",
+ "__vec_2__u32", AstFor("v2int_30_40"), "or",
+ AstFor("v2uint_10_20")},
+ // Mixed, returning v2int
+ BinaryData{"v2int", "v2int_40_30", "OpBitwiseOr", "v2uint_20_10",
+ "__vec_2__i32", AstFor("v2int_40_30"), "or",
+ AstFor("v2uint_20_10")}));
+
+INSTANTIATE_TEST_SUITE_P(
+ SpvParserTest_BitwiseXor,
+ SpvBinaryTest,
+ ::testing::Values(
+ // Both uint
+ BinaryData{"uint", "uint_10", "OpBitwiseXor", "uint_20", "__u32",
+ "ScalarConstructor{10}", "xor", "ScalarConstructor{20}"},
+ // Both int
+ BinaryData{"int", "int_30", "OpBitwiseXor", "int_40", "__i32",
+ "ScalarConstructor{30}", "xor", "ScalarConstructor{40}"},
+ // Mixed, returning uint
+ BinaryData{"uint", "int_30", "OpBitwiseXor", "uint_10", "__u32",
+ "ScalarConstructor{30}", "xor", "ScalarConstructor{10}"},
+ // Mixed, returning int
+ BinaryData{"int", "int_30", "OpBitwiseXor", "uint_10", "__i32",
+ "ScalarConstructor{30}", "xor", "ScalarConstructor{10}"},
+ // Both v2uint
+ BinaryData{"v2uint", "v2uint_10_20", "OpBitwiseXor", "v2uint_20_10",
+ "__vec_2__u32", AstFor("v2uint_10_20"), "xor",
+ AstFor("v2uint_20_10")},
+ // Both v2int
+ BinaryData{"v2int", "v2int_30_40", "OpBitwiseXor", "v2int_40_30",
+ "__vec_2__i32", AstFor("v2int_30_40"), "xor",
+ AstFor("v2int_40_30")},
+ // Mixed, returning v2uint
+ BinaryData{"v2uint", "v2int_30_40", "OpBitwiseXor", "v2uint_10_20",
+ "__vec_2__u32", AstFor("v2int_30_40"), "xor",
+ AstFor("v2uint_10_20")},
+ // Mixed, returning v2int
+ BinaryData{"v2int", "v2int_40_30", "OpBitwiseXor", "v2uint_20_10",
+ "__vec_2__i32", AstFor("v2int_40_30"), "xor",
+ AstFor("v2uint_20_10")}));
} // namespace
} // namespace spirv
} // namespace reader