[ir][spirv-writer] Implement cross builtin

Bug: tint:1906
Change-Id: Ic96b584eec97b981975f9eec6c8b921e0c9c41f2
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/139980
Auto-Submit: James Price <jrprice@google.com>
Kokoro: James Price <jrprice@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: James Price <jrprice@google.com>
diff --git a/src/tint/writer/spirv/ir/generator_impl_ir.cc b/src/tint/writer/spirv/ir/generator_impl_ir.cc
index d878ad8..c9ef217 100644
--- a/src/tint/writer/spirv/ir/generator_impl_ir.cc
+++ b/src/tint/writer/spirv/ir/generator_impl_ir.cc
@@ -1124,6 +1124,9 @@
         case builtin::Function::kCosh:
             glsl_ext_inst(GLSLstd450Cosh);
             break;
+        case builtin::Function::kCross:
+            glsl_ext_inst(GLSLstd450Cross);
+            break;
         case builtin::Function::kDistance:
             glsl_ext_inst(GLSLstd450Distance);
             break;
diff --git a/src/tint/writer/spirv/ir/generator_impl_ir_builtin_test.cc b/src/tint/writer/spirv/ir/generator_impl_ir_builtin_test.cc
index 1bbd315..cc72c6e 100644
--- a/src/tint/writer/spirv/ir/generator_impl_ir_builtin_test.cc
+++ b/src/tint/writer/spirv/ir/generator_impl_ir_builtin_test.cc
@@ -190,6 +190,21 @@
                                          BuiltinTestCase{kI32, builtin::Function::kMin, "SMin"},
                                          BuiltinTestCase{kU32, builtin::Function::kMin, "UMin"}));
 
+TEST_F(SpvGeneratorImplTest, Builtin_Cross_vec3f) {
+    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::kCross, arg1, arg2);
+        b.Return(func, result);
+        mod.SetName(result, "result");
+    });
+
+    ASSERT_TRUE(Generate()) << Error() << output_;
+    EXPECT_INST("%result = OpExtInst %v3float %9 Cross %arg1 %arg2");
+}
+
 TEST_F(SpvGeneratorImplTest, Builtin_Distance_vec2f) {
     auto* arg1 = b.FunctionParam("arg1", MakeVectorType(kF32));
     auto* arg2 = b.FunctionParam("arg2", MakeVectorType(kF32));