[spirv-reader][ir] Convert OpBitwiseXor
Add conversion for OpBitwiseXor, converting the arguments such that they
match the type of the first parameter.
Bug: 391487367
Change-Id: Iefdd134b54afdb2baf9481514abad5df8ae1eee7
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/226914
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Reviewed-by: James Price <jrprice@google.com>
diff --git a/src/tint/lang/spirv/builtin_fn.cc b/src/tint/lang/spirv/builtin_fn.cc
index 6bb3d17..d17d1e6 100644
--- a/src/tint/lang/spirv/builtin_fn.cc
+++ b/src/tint/lang/spirv/builtin_fn.cc
@@ -174,6 +174,8 @@
return "bitwiseAnd";
case BuiltinFn::kBitwiseOr:
return "bitwiseOr";
+ case BuiltinFn::kBitwiseXor:
+ return "bitwiseXor";
case BuiltinFn::kSdot:
return "sdot";
case BuiltinFn::kUdot:
@@ -269,6 +271,7 @@
case BuiltinFn::kConvertUToF:
case BuiltinFn::kBitwiseAnd:
case BuiltinFn::kBitwiseOr:
+ case BuiltinFn::kBitwiseXor:
break;
}
return core::ir::Instruction::Accesses{};
diff --git a/src/tint/lang/spirv/builtin_fn.cc.tmpl b/src/tint/lang/spirv/builtin_fn.cc.tmpl
index 0862f38..31c0df8 100644
--- a/src/tint/lang/spirv/builtin_fn.cc.tmpl
+++ b/src/tint/lang/spirv/builtin_fn.cc.tmpl
@@ -108,6 +108,7 @@
case BuiltinFn::kConvertUToF:
case BuiltinFn::kBitwiseAnd:
case BuiltinFn::kBitwiseOr:
+ case BuiltinFn::kBitwiseXor:
break;
}
return core::ir::Instruction::Accesses{};
diff --git a/src/tint/lang/spirv/builtin_fn.h b/src/tint/lang/spirv/builtin_fn.h
index fccebad..37faee0 100644
--- a/src/tint/lang/spirv/builtin_fn.h
+++ b/src/tint/lang/spirv/builtin_fn.h
@@ -114,6 +114,7 @@
kConvertUToF,
kBitwiseAnd,
kBitwiseOr,
+ kBitwiseXor,
kSdot,
kUdot,
kCooperativeMatrixLoad,
diff --git a/src/tint/lang/spirv/intrinsic/data.cc b/src/tint/lang/spirv/intrinsic/data.cc
index efb10fb..f59498e 100644
--- a/src/tint/lang/spirv/intrinsic/data.cc
+++ b/src/tint/lang/spirv/intrinsic/data.cc
@@ -6732,30 +6732,37 @@
},
{
/* [66] */
+ /* fn bitwiseXor<R : iu32>[A : iu32, B : iu32](A, B) -> R */
+ /* fn bitwiseXor<R : iu32>[A : iu32, B : iu32, N : num](vec<N, A>, vec<N, B>) -> vec<N, R> */
+ /* num overloads */ 2,
+ /* overloads */ OverloadIndex(176),
+ },
+ {
+ /* [67] */
/* fn sdot(u32, u32, u32) -> i32 */
/* num overloads */ 1,
/* overloads */ OverloadIndex(193),
},
{
- /* [67] */
+ /* [68] */
/* fn udot(u32, u32, u32) -> u32 */
/* num overloads */ 1,
/* overloads */ OverloadIndex(194),
},
{
- /* [68] */
+ /* [69] */
/* fn cooperative_matrix_load<T : subgroup_matrix<K, S, C, R>>[K : subgroup_matrix_kind, S : fiu32_f16, C : num, R : num](ptr<workgroup_or_storage, S, readable>, u32, u32, u32) -> T */
/* num overloads */ 1,
/* overloads */ OverloadIndex(195),
},
{
- /* [69] */
+ /* [70] */
/* fn cooperative_matrix_store[K : subgroup_matrix_kind, S : fiu32_f16, C : num, R : num](ptr<workgroup_or_storage, S, writable>, subgroup_matrix<K, S, C, R>, u32, u32, u32) */
/* num overloads */ 1,
/* overloads */ OverloadIndex(196),
},
{
- /* [70] */
+ /* [71] */
/* fn cooperative_matrix_mul_add[T : subgroup_matrix_elements, TR : subgroup_matrix_elements, C : num, R : num, K : num](subgroup_matrix<subgroup_matrix_kind_left, T, K, R>, subgroup_matrix<subgroup_matrix_kind_right, T, C, K>, subgroup_matrix<subgroup_matrix_kind_result, TR, C, R>, u32) -> subgroup_matrix<subgroup_matrix_kind_result, TR, C, R> */
/* num overloads */ 1,
/* overloads */ OverloadIndex(197),
diff --git a/src/tint/lang/spirv/reader/lower/builtins.cc b/src/tint/lang/spirv/reader/lower/builtins.cc
index 40095c3..372dd0e 100644
--- a/src/tint/lang/spirv/reader/lower/builtins.cc
+++ b/src/tint/lang/spirv/reader/lower/builtins.cc
@@ -161,6 +161,9 @@
case spirv::BuiltinFn::kBitwiseOr:
BitwiseOr(builtin);
break;
+ case spirv::BuiltinFn::kBitwiseXor:
+ BitwiseXor(builtin);
+ break;
default:
TINT_UNREACHABLE() << "unknown spirv builtin: " << builtin->Func();
}
@@ -237,6 +240,9 @@
void BitwiseOr(spirv::ir::BuiltinCall* call) {
EmitBinaryWrappedAsFirstArg(call, core::BinaryOp::kOr);
}
+ void BitwiseXor(spirv::ir::BuiltinCall* call) {
+ EmitBinaryWrappedAsFirstArg(call, core::BinaryOp::kXor);
+ }
void Add(spirv::ir::BuiltinCall* call) {
EmitBinaryWrappedAsFirstArg(call, core::BinaryOp::kAdd);
diff --git a/src/tint/lang/spirv/reader/lower/builtins_test.cc b/src/tint/lang/spirv/reader/lower/builtins_test.cc
index b0da81d..fb67be9 100644
--- a/src/tint/lang/spirv/reader/lower/builtins_test.cc
+++ b/src/tint/lang/spirv/reader/lower/builtins_test.cc
@@ -6024,7 +6024,8 @@
SpirvReader,
SpirvReader_BitwiseTest,
::testing::Values(SpirvReaderParams{spirv::BuiltinFn::kBitwiseAnd, "bitwiseAnd", "and"},
- SpirvReaderParams{spirv::BuiltinFn::kBitwiseOr, "bitwiseOr", "or"}));
+ SpirvReaderParams{spirv::BuiltinFn::kBitwiseOr, "bitwiseOr", "or"},
+ SpirvReaderParams{spirv::BuiltinFn::kBitwiseXor, "bitwiseXor", "xor"}));
} // namespace
} // namespace tint::spirv::reader::lower
diff --git a/src/tint/lang/spirv/reader/parser/bit_test.cc b/src/tint/lang/spirv/reader/parser/bit_test.cc
index 9ff1b5e..6477693 100644
--- a/src/tint/lang/spirv/reader/parser/bit_test.cc
+++ b/src/tint/lang/spirv/reader/parser/bit_test.cc
@@ -632,7 +632,8 @@
INSTANTIATE_TEST_SUITE_P(SpirvParser,
SpirvParser_BitwiseTest,
testing::Values(SpirvBitwiseParam{"And"}, //
- SpirvBitwiseParam{"Or"}));
+ SpirvBitwiseParam{"Or"}, //
+ SpirvBitwiseParam{"Xor"}));
} // namespace
} // namespace tint::spirv::reader
diff --git a/src/tint/lang/spirv/reader/parser/parser.cc b/src/tint/lang/spirv/reader/parser/parser.cc
index 836a058..3c75327 100644
--- a/src/tint/lang/spirv/reader/parser/parser.cc
+++ b/src/tint/lang/spirv/reader/parser/parser.cc
@@ -674,6 +674,9 @@
case spv::Op::OpBitwiseOr:
EmitSpirvExplicitBuiltinCall(inst, spirv::BuiltinFn::kBitwiseOr);
break;
+ case spv::Op::OpBitwiseXor:
+ EmitSpirvExplicitBuiltinCall(inst, spirv::BuiltinFn::kBitwiseXor);
+ break;
case spv::Op::OpAccessChain:
case spv::Op::OpInBoundsAccessChain:
EmitAccess(inst);
diff --git a/src/tint/lang/spirv/spirv.def b/src/tint/lang/spirv/spirv.def
index 6950e70..c8d2281 100644
--- a/src/tint/lang/spirv/spirv.def
+++ b/src/tint/lang/spirv/spirv.def
@@ -425,6 +425,8 @@
implicit(A: iu32, B: iu32, N: num) fn bitwiseAnd<R: iu32>(vec<N, A>, vec<N, B>) -> vec<N, R>
implicit(A: iu32, B: iu32) fn bitwiseOr<R: iu32>(A, B) -> R
implicit(A: iu32, B: iu32, N: num) fn bitwiseOr<R: iu32>(vec<N, A>, vec<N, B>) -> vec<N, R>
+implicit(A: iu32, B: iu32) fn bitwiseXor<R: iu32>(A, B) -> R
+implicit(A: iu32, B: iu32, N: num) fn bitwiseXor<R: iu32>(vec<N, A>, vec<N, B>) -> vec<N, R>
////////////////////////////////////////////////////////////////////////////////
// SPV_KHR_integer_dot_product instructions
diff --git a/src/tint/lang/spirv/writer/printer/printer.cc b/src/tint/lang/spirv/writer/printer/printer.cc
index a1c31f4..e3523de 100644
--- a/src/tint/lang/spirv/writer/printer/printer.cc
+++ b/src/tint/lang/spirv/writer/printer/printer.cc
@@ -1539,6 +1539,9 @@
case BuiltinFn::kBitwiseOr:
op = spv::Op::OpBitwiseOr;
break;
+ case BuiltinFn::kBitwiseXor:
+ op = spv::Op::OpBitwiseXor;
+ break;
case spirv::BuiltinFn::kNone:
TINT_ICE() << "undefined spirv ir function";
}