[ir][spirv-writer] Handle reflect builtin

Bug: tint:1906
Change-Id: If5d2b10ef079ac5a436717080833ae26e331c2cb
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/142364
Reviewed-by: Dan Sinclair <dsinclair@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/tint/lang/spirv/writer/builtin_test.cc b/src/tint/lang/spirv/writer/builtin_test.cc
index 2d91f36..cc6a364 100644
--- a/src/tint/lang/spirv/writer/builtin_test.cc
+++ b/src/tint/lang/spirv/writer/builtin_test.cc
@@ -785,6 +785,36 @@
     EXPECT_INST("%result = OpExtInst %v3half %11 Ldexp %arg1 %arg2");
 }
 
+TEST_F(SpirvWriterTest, Builtin_Reflect_F32) {
+    auto* arg1 = b.FunctionParam("arg1", ty.vec3<f32>());
+    auto* arg2 = b.FunctionParam("arg2", ty.vec3<f32>());
+    auto* func = b.Function("foo", ty.vec3<f32>());
+    func->SetParams({arg1, arg2});
+    b.With(func->Block(), [&] {
+        auto* result = b.Call(ty.vec3<f32>(), builtin::Function::kReflect, arg1, arg2);
+        b.Return(func, result);
+        mod.SetName(result, "result");
+    });
+
+    ASSERT_TRUE(Generate()) << Error() << output_;
+    EXPECT_INST("%result = OpExtInst %v3float %9 Reflect %arg1 %arg2");
+}
+
+TEST_F(SpirvWriterTest, Builtin_Reflect_F16) {
+    auto* arg1 = b.FunctionParam("arg1", ty.vec4<f16>());
+    auto* arg2 = b.FunctionParam("arg2", ty.vec4<f16>());
+    auto* func = b.Function("foo", ty.vec4<f16>());
+    func->SetParams({arg1, arg2});
+    b.With(func->Block(), [&] {
+        auto* result = b.Call(ty.vec4<f16>(), builtin::Function::kReflect, arg1, arg2);
+        b.Return(func, result);
+        mod.SetName(result, "result");
+    });
+
+    ASSERT_TRUE(Generate()) << Error() << output_;
+    EXPECT_INST("%result = OpExtInst %v4half %9 Reflect %arg1 %arg2");
+}
+
 // Tests for builtins with the signature: T = func(T, T, T)
 using Builtin_3arg = SpirvWriterTestWithParam<BuiltinTestCase>;
 TEST_P(Builtin_3arg, Scalar) {
diff --git a/src/tint/lang/spirv/writer/writer.cc b/src/tint/lang/spirv/writer/writer.cc
index 35d4a8c..b6961f1 100644
--- a/src/tint/lang/spirv/writer/writer.cc
+++ b/src/tint/lang/spirv/writer/writer.cc
@@ -1330,6 +1330,9 @@
         case builtin::Function::kRadians:
             glsl_ext_inst(GLSLstd450Radians);
             break;
+        case builtin::Function::kReflect:
+            glsl_ext_inst(GLSLstd450Reflect);
+            break;
         case builtin::Function::kReverseBits:
             op = spv::Op::OpBitReverse;
             break;