[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);
+}