[ir][spirv-writer] Implement length builtin

Bug: tint:1906
Change-Id: I95c6a5f3fa876367eb3de6a2523bfefcf2d2accd
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/139902
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: James Price <jrprice@google.com>
Auto-Submit: 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 ef7cbf1..33f6bab 100644
--- a/src/tint/writer/spirv/ir/generator_impl_ir.cc
+++ b/src/tint/writer/spirv/ir/generator_impl_ir.cc
@@ -1099,6 +1099,9 @@
         case builtin::Function::kDistance:
             glsl_ext_inst(GLSLstd450Distance);
             break;
+        case builtin::Function::kLength:
+            glsl_ext_inst(GLSLstd450Length);
+            break;
         case builtin::Function::kMax:
             if (result_ty->is_float_scalar_or_vector()) {
                 glsl_ext_inst(GLSLstd450FMax);
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 f0abeb4..4ed9be0 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
@@ -99,6 +99,20 @@
 )");
 }
 
+TEST_F(SpvGeneratorImplTest, Builtin_Length_vec4f) {
+    auto* arg = b.FunctionParam("arg", ty.vec4<f32>());
+    auto* func = b.Function("foo", ty.f32());
+    func->SetParams({arg});
+    b.With(func->Block(), [&] {
+        auto* result = b.Call(ty.f32(), builtin::Function::kLength, arg);
+        b.Return(func, result);
+        mod.SetName(result, "result");
+    });
+
+    ASSERT_TRUE(Generate()) << Error() << output_;
+    EXPECT_INST("%result = OpExtInst %float %8 Length %arg");
+}
+
 TEST_F(SpvGeneratorImplTest, Builtin_Normalize_vec4f) {
     auto* arg = b.FunctionParam("arg", ty.vec4<f32>());
     auto* func = b.Function("foo", ty.vec4<f32>());