Flush denorm half floats to zero.

I think we convinced ourselves that denorms, while a good chunk of half floats,
cover a rather small fraction of the representable range, which is always
close enough to zero to flush.

This makes both paths of the conversion to or from float considerably simpler.

These functions now work for zero-or-normal half floats (excluding infinite, NaN).
I'm not aware of a term for this class so I've called them "ordinary".

A handful of GMs and SKPs draw differently in --config f16, but all imperceptibly.

BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2256023002

Review-Url: https://codereview.chromium.org/2256023002
diff --git a/src/core/SkXfermodeF16.cpp b/src/core/SkXfermodeF16.cpp
index 219e911..9cf7254 100644
--- a/src/core/SkXfermodeF16.cpp
+++ b/src/core/SkXfermodeF16.cpp
@@ -22,16 +22,16 @@
     SkPM4f d;
     if (aa) {
         for (int i = 0; i < count; ++i) {
-            Sk4f d4 = SkHalfToFloat_finite(dst[i]);
+            Sk4f d4 = SkHalfToFloat_finite_ftz(dst[i]);
             d4.store(d.fVec);
             Sk4f r4 = Sk4f::Load(proc(*src, d).fVec);
-            SkFloatToHalf_finite(lerp_by_coverage(r4, d4, aa[i])).store(&dst[i]);
+            SkFloatToHalf_finite_ftz(lerp_by_coverage(r4, d4, aa[i])).store(&dst[i]);
         }
     } else {
         for (int i = 0; i < count; ++i) {
-            SkHalfToFloat_finite(dst[i]).store(d.fVec);
+            SkHalfToFloat_finite_ftz(dst[i]).store(d.fVec);
             Sk4f r4 = Sk4f::Load(proc(*src, d).fVec);
-            SkFloatToHalf_finite(r4).store(&dst[i]);
+            SkFloatToHalf_finite_ftz(r4).store(&dst[i]);
         }
     }
 }
@@ -42,16 +42,16 @@
     SkPM4f d;
     if (aa) {
         for (int i = 0; i < count; ++i) {
-            Sk4f d4 = SkHalfToFloat_finite(dst[i]);
+            Sk4f d4 = SkHalfToFloat_finite_ftz(dst[i]);
             d4.store(d.fVec);
             Sk4f r4 = Sk4f::Load(proc(src[i], d).fVec);
-            SkFloatToHalf_finite(lerp_by_coverage(r4, d4, aa[i])).store(&dst[i]);
+            SkFloatToHalf_finite_ftz(lerp_by_coverage(r4, d4, aa[i])).store(&dst[i]);
         }
     } else {
         for (int i = 0; i < count; ++i) {
-            SkHalfToFloat_finite(dst[i]).store(d.fVec);
+            SkHalfToFloat_finite_ftz(dst[i]).store(d.fVec);
             Sk4f r4 = Sk4f::Load(proc(src[i], d).fVec);
-            SkFloatToHalf_finite(r4).store(&dst[i]);
+            SkFloatToHalf_finite_ftz(r4).store(&dst[i]);
         }
     }
 }
@@ -64,8 +64,8 @@
     if (aa) {
         for (int i = 0; i < count; ++i) {
             if (aa[i]) {
-                const Sk4f d4 = SkHalfToFloat_finite(dst[i]);
-                SkFloatToHalf_finite(d4 * Sk4f((255 - aa[i]) * 1.0f/255)).store(&dst[i]);
+                const Sk4f d4 = SkHalfToFloat_finite_ftz(dst[i]);
+                SkFloatToHalf_finite_ftz(d4 * Sk4f((255 - aa[i]) * 1.0f/255)).store(&dst[i]);
             }
         }
     } else {
@@ -82,12 +82,12 @@
     const Sk4f s4 = Sk4f::Load(src->fVec);
     if (aa) {
         for (int i = 0; i < count; ++i) {
-            const Sk4f d4 = SkHalfToFloat_finite(dst[i]);
-            SkFloatToHalf_finite(lerp_by_coverage(s4, d4, aa[i])).store(&dst[i]);
+            const Sk4f d4 = SkHalfToFloat_finite_ftz(dst[i]);
+            SkFloatToHalf_finite_ftz(lerp_by_coverage(s4, d4, aa[i])).store(&dst[i]);
         }
     } else {
         uint64_t s4h;
-        SkFloatToHalf_finite(s4).store(&s4h);
+        SkFloatToHalf_finite_ftz(s4).store(&s4h);
         sk_memset64(dst, s4h, count);
     }
 }
@@ -97,13 +97,13 @@
     if (aa) {
         for (int i = 0; i < count; ++i) {
             const Sk4f s4 = Sk4f::Load(src[i].fVec);
-            const Sk4f d4 = SkHalfToFloat_finite(dst[i]);
-            SkFloatToHalf_finite(lerp_by_coverage(s4, d4, aa[i])).store(&dst[i]);
+            const Sk4f d4 = SkHalfToFloat_finite_ftz(dst[i]);
+            SkFloatToHalf_finite_ftz(lerp_by_coverage(s4, d4, aa[i])).store(&dst[i]);
         }
     } else {
         for (int i = 0; i < count; ++i) {
             const Sk4f s4 = Sk4f::Load(src[i].fVec);
-            SkFloatToHalf_finite(s4).store(&dst[i]);
+            SkFloatToHalf_finite_ftz(s4).store(&dst[i]);
         }
     }
 }
@@ -123,12 +123,12 @@
     const Sk4f s4 = Sk4f::Load(src->fVec);
     const Sk4f dst_scale = Sk4f(1 - get_alpha(s4));
     for (int i = 0; i < count; ++i) {
-        const Sk4f d4 = SkHalfToFloat_finite(dst[i]);
+        const Sk4f d4 = SkHalfToFloat_finite_ftz(dst[i]);
         const Sk4f r4 = s4 + d4 * dst_scale;
         if (aa) {
-            SkFloatToHalf_finite(lerp_by_coverage(r4, d4, aa[i])).store(&dst[i]);
+            SkFloatToHalf_finite_ftz(lerp_by_coverage(r4, d4, aa[i])).store(&dst[i]);
         } else {
-            SkFloatToHalf_finite(r4).store(&dst[i]);
+            SkFloatToHalf_finite_ftz(r4).store(&dst[i]);
         }
     }
 }
@@ -137,12 +137,12 @@
                       const SkAlpha aa[]) {
     for (int i = 0; i < count; ++i) {
         Sk4f s = Sk4f::Load(src+i),
-             d = SkHalfToFloat_finite(dst[i]),
+             d = SkHalfToFloat_finite_ftz(dst[i]),
              r = s + d*(1.0f - SkNx_shuffle<3,3,3,3>(s));
         if (aa) {
             r = lerp_by_coverage(r, d, aa[i]);
         }
-        SkFloatToHalf_finite(r).store(&dst[i]);
+        SkFloatToHalf_finite_ftz(r).store(&dst[i]);
     }
 }