[spirv-reader] Add ISub, IMul, UDiv, SDiv
Bug: tint:3
Change-Id: Id2c9d91742f8bdc712d2dfbda5f4883379a29470
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/19564
Reviewed-by: dan sinclair <dsinclair@google.com>
diff --git a/src/reader/spirv/function.cc b/src/reader/spirv/function.cc
index d691c21..6860e15 100644
--- a/src/reader/spirv/function.cc
+++ b/src/reader/spirv/function.cc
@@ -42,10 +42,14 @@
case SpvOpIAdd:
case SpvOpFAdd:
return ast::BinaryOp::kAdd;
+ case SpvOpISub:
case SpvOpFSub:
return ast::BinaryOp::kSubtract;
+ case SpvOpIMul:
case SpvOpFMul:
return ast::BinaryOp::kMultiply;
+ case SpvOpUDiv:
+ case SpvOpSDiv:
case SpvOpFDiv:
return ast::BinaryOp::kDivide;
case SpvOpShiftLeftLogical:
diff --git a/src/reader/spirv/function_arithmetic_test.cc b/src/reader/spirv/function_arithmetic_test.cc
index 665274b..7f1e62c 100644
--- a/src/reader/spirv/function_arithmetic_test.cc
+++ b/src/reader/spirv/function_arithmetic_test.cc
@@ -201,6 +201,43 @@
AstFor("v2float_60_50")}));
INSTANTIATE_TEST_SUITE_P(
+ SpvParserTest_ISub,
+ SpvBinaryTest,
+ ::testing::Values(
+ // Both uint
+ BinaryData{"uint", "uint_10", "OpISub", "uint_20", "__u32",
+ "ScalarConstructor{10}", "subtract",
+ "ScalarConstructor{20}"},
+ // Both int
+ BinaryData{"int", "int_30", "OpISub", "int_40", "__i32",
+ "ScalarConstructor{30}", "subtract",
+ "ScalarConstructor{40}"},
+ // Mixed, returning uint
+ BinaryData{"uint", "int_30", "OpISub", "uint_10", "__u32",
+ "ScalarConstructor{30}", "subtract",
+ "ScalarConstructor{10}"},
+ // Mixed, returning int
+ BinaryData{"int", "int_30", "OpISub", "uint_10", "__i32",
+ "ScalarConstructor{30}", "subtract",
+ "ScalarConstructor{10}"},
+ // Both v2uint
+ BinaryData{"v2uint", "v2uint_10_20", "OpISub", "v2uint_20_10",
+ "__vec_2__u32", AstFor("v2uint_10_20"), "subtract",
+ AstFor("v2uint_20_10")},
+ // Both v2int
+ BinaryData{"v2int", "v2int_30_40", "OpISub", "v2int_40_30",
+ "__vec_2__i32", AstFor("v2int_30_40"), "subtract",
+ AstFor("v2int_40_30")},
+ // Mixed, returning v2uint
+ BinaryData{"v2uint", "v2int_30_40", "OpISub", "v2uint_10_20",
+ "__vec_2__u32", AstFor("v2int_30_40"), "subtract",
+ AstFor("v2uint_10_20")},
+ // Mixed, returning v2int
+ BinaryData{"v2int", "v2int_40_30", "OpISub", "v2uint_20_10",
+ "__vec_2__i32", AstFor("v2int_40_30"), "subtract",
+ AstFor("v2uint_20_10")}));
+
+INSTANTIATE_TEST_SUITE_P(
SpvParserTest_FSub,
SpvBinaryTest,
::testing::Values(
@@ -214,6 +251,43 @@
AstFor("v2float_60_50")}));
INSTANTIATE_TEST_SUITE_P(
+ SpvParserTest_IMul,
+ SpvBinaryTest,
+ ::testing::Values(
+ // Both uint
+ BinaryData{"uint", "uint_10", "OpIMul", "uint_20", "__u32",
+ "ScalarConstructor{10}", "multiply",
+ "ScalarConstructor{20}"},
+ // Both int
+ BinaryData{"int", "int_30", "OpIMul", "int_40", "__i32",
+ "ScalarConstructor{30}", "multiply",
+ "ScalarConstructor{40}"},
+ // Mixed, returning uint
+ BinaryData{"uint", "int_30", "OpIMul", "uint_10", "__u32",
+ "ScalarConstructor{30}", "multiply",
+ "ScalarConstructor{10}"},
+ // Mixed, returning int
+ BinaryData{"int", "int_30", "OpIMul", "uint_10", "__i32",
+ "ScalarConstructor{30}", "multiply",
+ "ScalarConstructor{10}"},
+ // Both v2uint
+ BinaryData{"v2uint", "v2uint_10_20", "OpIMul", "v2uint_20_10",
+ "__vec_2__u32", AstFor("v2uint_10_20"), "multiply",
+ AstFor("v2uint_20_10")},
+ // Both v2int
+ BinaryData{"v2int", "v2int_30_40", "OpIMul", "v2int_40_30",
+ "__vec_2__i32", AstFor("v2int_30_40"), "multiply",
+ AstFor("v2int_40_30")},
+ // Mixed, returning v2uint
+ BinaryData{"v2uint", "v2int_30_40", "OpIMul", "v2uint_10_20",
+ "__vec_2__u32", AstFor("v2int_30_40"), "multiply",
+ AstFor("v2uint_10_20")},
+ // Mixed, returning v2int
+ BinaryData{"v2int", "v2int_40_30", "OpIMul", "v2uint_20_10",
+ "__vec_2__i32", AstFor("v2int_40_30"), "multiply",
+ AstFor("v2uint_20_10")}));
+
+INSTANTIATE_TEST_SUITE_P(
SpvParserTest_FMul,
SpvBinaryTest,
::testing::Values(
@@ -227,6 +301,30 @@
AstFor("v2float_60_50")}));
INSTANTIATE_TEST_SUITE_P(
+ SpvParserTest_UDiv,
+ SpvBinaryTest,
+ ::testing::Values(
+ // Both uint
+ BinaryData{"uint", "uint_10", "OpUDiv", "uint_20", "__u32",
+ "ScalarConstructor{10}", "divide", "ScalarConstructor{20}"},
+ // Both v2uint
+ BinaryData{"v2uint", "v2uint_10_20", "OpUDiv", "v2uint_20_10",
+ "__vec_2__u32", AstFor("v2uint_10_20"), "divide",
+ AstFor("v2uint_20_10")}));
+
+INSTANTIATE_TEST_SUITE_P(
+ SpvParserTest_SDiv,
+ SpvBinaryTest,
+ ::testing::Values(
+ // Both int
+ BinaryData{"int", "int_30", "OpSDiv", "int_40", "__i32",
+ "ScalarConstructor{30}", "divide", "ScalarConstructor{40}"},
+ // Both v2int
+ BinaryData{"v2int", "v2int_30_40", "OpSDiv", "v2int_40_30",
+ "__vec_2__i32", AstFor("v2int_30_40"), "divide",
+ AstFor("v2int_40_30")}));
+
+INSTANTIATE_TEST_SUITE_P(
SpvParserTest_FDiv,
SpvBinaryTest,
::testing::Values(