[ir][msl] Emit unary instructions
Add support for the ir unary instructions.
Bug: tint:1967
Change-Id: Ia674e7483b4b6146cdefebf4c4a05b1eb7774453
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/162262
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/tint/lang/msl/writer/printer/printer.cc b/src/tint/lang/msl/writer/printer/printer.cc
index 936ca99..d5b3908 100644
--- a/src/tint/lang/msl/writer/printer/printer.cc
+++ b/src/tint/lang/msl/writer/printer/printer.cc
@@ -272,6 +272,7 @@
[&](core::ir::Store* s) { EmitStore(s); }, //
[&](core::ir::Bitcast*) { MaybeEmitInstruction(inst); }, //
+ [&](core::ir::Unary*) { MaybeEmitInstruction(inst); }, //
[&](core::ir::Binary*) { MaybeEmitInstruction(inst); }, //
[&](core::ir::Let* l) { EmitLet(l); }, //
[&](core::ir::Load*) { MaybeEmitInstruction(inst); }, //
@@ -313,6 +314,7 @@
[&](const core::ir::InstructionResult* r) {
Switch(
r->Source(), //
+ [&](const core::ir::Unary* u) { EmitUnary(out, u); }, //
[&](const core::ir::Binary* b) { EmitBinary(out, b); }, //
[&](const core::ir::Let* l) {
auto name = ir_.NameOf(l->Result());
@@ -331,6 +333,20 @@
TINT_ICE_ON_NO_MATCH);
}
+ void EmitUnary(StringStream& out, const core::ir::Unary* u) {
+ switch (u->Op()) {
+ case core::ir::UnaryOp::kNegation:
+ out << "-";
+ break;
+ case core::ir::UnaryOp::kComplement:
+ out << "~";
+ break;
+ }
+ out << "(";
+ EmitValue(out, u->Val());
+ out << ")";
+ }
+
/// Emit a binary instruction
/// @param b the binary instruction
void EmitBinary(StringStream& out, const core::ir::Binary* b) {
diff --git a/test/tint/expressions/unary/complement/complement.wgsl.expected.ir.msl b/test/tint/expressions/unary/complement/complement.wgsl.expected.ir.msl
index 931741e..371e050 100644
--- a/test/tint/expressions/unary/complement/complement.wgsl.expected.ir.msl
+++ b/test/tint/expressions/unary/complement/complement.wgsl.expected.ir.msl
@@ -1,9 +1,15 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::Unary
-********************************************************************
-* The tint shader compiler has encountered an unexpected error. *
-* *
-* Please help us fix this issue by submitting a bug report at *
-* crbug.com/tint with the source program that triggered the bug. *
-********************************************************************
+int i(int x) {
+ return ~(x);
+}
+uint u(uint x) {
+ return ~(x);
+}
+int4 vi(int4 x) {
+ return ~(x);
+}
+uint4 vu(uint4 x) {
+ return ~(x);
+}
diff --git a/test/tint/expressions/unary/negate/negate.wgsl.expected.ir.msl b/test/tint/expressions/unary/negate/negate.wgsl.expected.ir.msl
index 931741e..790f908 100644
--- a/test/tint/expressions/unary/negate/negate.wgsl.expected.ir.msl
+++ b/test/tint/expressions/unary/negate/negate.wgsl.expected.ir.msl
@@ -1,9 +1,9 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::Unary
-********************************************************************
-* The tint shader compiler has encountered an unexpected error. *
-* *
-* Please help us fix this issue by submitting a bug report at *
-* crbug.com/tint with the source program that triggered the bug. *
-********************************************************************
+int i(int x) {
+ return -(x);
+}
+int4 vi(int4 x) {
+ return -(x);
+}