[ir][msl] Emit basic constants types

Add emission of `bool`, `f16`, `f32`, `i32`, and `i32` constants to the
MSL IR generator.

Bug: tint:1967
Change-Id: I3b3218ad7aff962063893d608a2b74d7ea9c43b8
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/138920
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/writer/msl/ir/generator_impl_ir.cc b/src/tint/writer/msl/ir/generator_impl_ir.cc
index d5e9ac9..3209562 100644
--- a/src/tint/writer/msl/ir/generator_impl_ir.cc
+++ b/src/tint/writer/msl/ir/generator_impl_ir.cc
@@ -14,6 +14,7 @@
 
 #include "src/tint/writer/msl/ir/generator_impl_ir.h"
 
+#include "src/tint/ir/constant.h"
 #include "src/tint/ir/validate.h"
 #include "src/tint/switch.h"
 #include "src/tint/transform/manager.h"
@@ -429,4 +430,15 @@
     preamble_buffer_.Append(str_buf);
 }
 
+void GeneratorImplIr::EmitConstant(utils::StringStream& out, ir::Constant* c) {
+    return tint::Switch(
+        c->Type(),  //
+        [&](const type::Bool*) { out << (c->Value()->ValueAs<bool>() ? "true" : "false"); },
+        [&](const type::I32*) { PrintI32(out, c->Value()->ValueAs<i32>()); },
+        [&](const type::U32*) { out << c->Value()->ValueAs<u32>() << "u"; },
+        [&](const type::F32*) { PrintF32(out, c->Value()->ValueAs<f32>()); },
+        [&](const type::F16*) { PrintF16(out, c->Value()->ValueAs<f16>()); },
+        [&](Default) { UNHANDLED_CASE(c); });
+}
+
 }  // namespace tint::writer::msl