[ir][spirv-writer] Handle sign builtin

This maps to FSign or SSign, depending on the type.

Bug: tint:1906
Change-Id: Ibc9d659142f66879a033739782d0bb4560e712c8
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/142280
Reviewed-by: Dan Sinclair <dsinclair@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: James Price <jrprice@google.com>
diff --git a/src/tint/lang/spirv/writer/generator_impl_ir.cc b/src/tint/lang/spirv/writer/generator_impl_ir.cc
index 2d7942b..60b4939 100644
--- a/src/tint/lang/spirv/writer/generator_impl_ir.cc
+++ b/src/tint/lang/spirv/writer/generator_impl_ir.cc
@@ -1316,6 +1316,13 @@
         case builtin::Function::kRound:
             glsl_ext_inst(GLSLstd450RoundEven);
             break;
+        case builtin::Function::kSign:
+            if (result_ty->is_float_scalar_or_vector()) {
+                glsl_ext_inst(GLSLstd450FSign);
+            } else if (result_ty->is_signed_integer_scalar_or_vector()) {
+                glsl_ext_inst(GLSLstd450SSign);
+            }
+            break;
         case builtin::Function::kSin:
             glsl_ext_inst(GLSLstd450Sin);
             break;
diff --git a/src/tint/lang/spirv/writer/generator_impl_ir_builtin_test.cc b/src/tint/lang/spirv/writer/generator_impl_ir_builtin_test.cc
index 561dd2a..a94331f 100644
--- a/src/tint/lang/spirv/writer/generator_impl_ir_builtin_test.cc
+++ b/src/tint/lang/spirv/writer/generator_impl_ir_builtin_test.cc
@@ -113,6 +113,9 @@
                     BuiltinTestCase{kU32, builtin::Function::kReverseBits, "OpBitReverse"},
                     BuiltinTestCase{kF32, builtin::Function::kRound, "RoundEven"},
                     BuiltinTestCase{kF16, builtin::Function::kRound, "RoundEven"},
+                    BuiltinTestCase{kF32, builtin::Function::kSign, "FSign"},
+                    BuiltinTestCase{kF16, builtin::Function::kSign, "FSign"},
+                    BuiltinTestCase{kI32, builtin::Function::kSign, "SSign"},
                     BuiltinTestCase{kF32, builtin::Function::kSin, "Sin"},
                     BuiltinTestCase{kF16, builtin::Function::kSin, "Sin"},
                     BuiltinTestCase{kF32, builtin::Function::kSqrt, "Sqrt"},