tint: HLSL and GLSL backends now emit 0 for inf and nan

Bug: tint:1581
Change-Id: I62dcde177c3b82408cd8d737526d10d481b48a17
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/101240
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: Antonio Maiorano <amaiorano@google.com>
diff --git a/src/tint/writer/glsl/generator_impl.cc b/src/tint/writer/glsl/generator_impl.cc
index d1261f1..8b2d898 100644
--- a/src/tint/writer/glsl/generator_impl.cc
+++ b/src/tint/writer/glsl/generator_impl.cc
@@ -150,25 +150,22 @@
 }
 
 void PrintF32(std::ostream& out, float value) {
-    // Note: Currently inf and nan should not be constructable, but this is implemented for the day
-    // we support them.
     if (std::isinf(value)) {
-        out << (value >= 0 ? "uintBitsToFloat(0x7f800000u)" : "uintBitsToFloat(0xff800000u)");
+        out << "0.0f " << (value >= 0 ? "/* inf */" : "/* -inf */");
     } else if (std::isnan(value)) {
-        out << "uintBitsToFloat(0x7fc00000u)";
+        out << "0.0f /* nan */";
     } else {
         out << FloatToString(value) << "f";
     }
 }
 
-bool PrintF16(std::ostream& out, float value) {
-    // Note: Currently inf and nan should not be constructable, and there is no solid way to
-    // generate constant/literal f16 Inf or NaN.
-    if (std::isinf(value) || std::isnan(value)) {
-        return false;
+void PrintF16(std::ostream& out, float value) {
+    if (std::isinf(value)) {
+        out << "0.0hf " << (value >= 0 ? "/* inf */" : "/* -inf */");
+    } else if (std::isnan(value)) {
+        out << "0.0hf /* nan */";
     } else {
         out << FloatToString(value) << "hf";
-        return true;
     }
 }
 
@@ -2185,7 +2182,10 @@
             PrintF32(out, constant->As<float>());
             return true;
         },
-        [&](const sem::F16*) { return PrintF16(out, constant->As<float>()); },
+        [&](const sem::F16*) {
+            PrintF16(out, constant->As<float>());
+            return true;
+        },
         [&](const sem::I32*) {
             out << constant->As<AInt>();
             return true;
@@ -2285,9 +2285,10 @@
         },
         [&](const ast::FloatLiteralExpression* l) {
             if (l->suffix == ast::FloatLiteralExpression::Suffix::kH) {
-                return PrintF16(out, static_cast<float>(l->value));
+                PrintF16(out, static_cast<float>(l->value));
+            } else {
+                PrintF32(out, static_cast<float>(l->value));
             }
-            PrintF32(out, static_cast<float>(l->value));
             return true;
         },
         [&](const ast::IntLiteralExpression* l) {
diff --git a/src/tint/writer/hlsl/generator_impl.cc b/src/tint/writer/hlsl/generator_impl.cc
index fca1515..3625db6 100644
--- a/src/tint/writer/hlsl/generator_impl.cc
+++ b/src/tint/writer/hlsl/generator_impl.cc
@@ -112,24 +112,22 @@
 }
 
 void PrintF32(std::ostream& out, float value) {
-    // Note: Currently inf and nan should not be constructable, but this is implemented for the day
-    // we support them.
     if (std::isinf(value)) {
-        out << (value >= 0 ? "asfloat(0x7f800000u)" : "asfloat(0xff800000u)");
+        out << "0.0f " << (value >= 0 ? "/* inf */" : "/* -inf */");
     } else if (std::isnan(value)) {
-        out << "asfloat(0x7fc00000u)";
+        out << "0.0f /* nan */";
     } else {
         out << FloatToString(value) << "f";
     }
 }
 
-bool PrintF16(std::ostream& out, float value) {
-    // Note: Currently inf and nan should not be constructable, don't emit them.
-    if (std::isinf(value) || std::isnan(value)) {
-        return false;
+void PrintF16(std::ostream& out, float value) {
+    if (std::isinf(value)) {
+        out << "0.0h " << (value >= 0 ? "/* inf */" : "/* -inf */");
+    } else if (std::isnan(value)) {
+        out << "0.0h /* nan */";
     } else {
         out << FloatToString(value) << "h";
-        return true;
     }
 }
 
@@ -3127,9 +3125,9 @@
         [&](const sem::F16*) {
             // emit a f16 scalar with explicit float16_t type declaration.
             out << "float16_t(";
-            bool valid = PrintF16(out, constant->As<float>());
+            PrintF16(out, constant->As<float>());
             out << ")";
-            return valid;
+            return true;
         },
         [&](const sem::I32*) {
             out << constant->As<AInt>();
@@ -3254,9 +3252,8 @@
             if (l->suffix == ast::FloatLiteralExpression::Suffix::kH) {
                 // Emit f16 literal with explicit float16_t type declaration.
                 out << "float16_t(";
-                bool valid = PrintF16(out, static_cast<float>(l->value));
+                PrintF16(out, static_cast<float>(l->value));
                 out << ")";
-                return valid;
             }
             PrintF32(out, static_cast<float>(l->value));
             return true;
diff --git a/test/tint/bug/tint/951.spvasm.expected.dxc.hlsl b/test/tint/bug/tint/951.spvasm.expected.dxc.hlsl
index 7f73b88..dfb1c66 100644
--- a/test/tint/bug/tint/951.spvasm.expected.dxc.hlsl
+++ b/test/tint/bug/tint/951.spvasm.expected.dxc.hlsl
@@ -14,7 +14,7 @@
 float unaryOperation_f1_(inout float a) {
   const float x_47 = a;
   if ((x_47 < 0.0f)) {
-    return asfloat(0x7f800000u);
+    return 0.0f /* inf */;
   }
   const float x_55 = a;
   return log(x_55);
diff --git a/test/tint/bug/tint/951.spvasm.expected.fxc.hlsl b/test/tint/bug/tint/951.spvasm.expected.fxc.hlsl
index 7f73b88..dfb1c66 100644
--- a/test/tint/bug/tint/951.spvasm.expected.fxc.hlsl
+++ b/test/tint/bug/tint/951.spvasm.expected.fxc.hlsl
@@ -14,7 +14,7 @@
 float unaryOperation_f1_(inout float a) {
   const float x_47 = a;
   if ((x_47 < 0.0f)) {
-    return asfloat(0x7f800000u);
+    return 0.0f /* inf */;
   }
   const float x_55 = a;
   return log(x_55);
diff --git a/test/tint/bug/tint/951.spvasm.expected.glsl b/test/tint/bug/tint/951.spvasm.expected.glsl
index 4711f56..618b684 100644
--- a/test/tint/bug/tint/951.spvasm.expected.glsl
+++ b/test/tint/bug/tint/951.spvasm.expected.glsl
@@ -26,7 +26,7 @@
 float unaryOperation_f1_(inout float a) {
   float x_47 = a;
   if ((x_47 < 0.0f)) {
-    return uintBitsToFloat(0x7f800000u);
+    return 0.0f /* inf */;
   }
   float x_55 = a;
   return log(x_55);
diff --git a/test/tint/expressions/literals/-inf.spvasm.expected.dxc.hlsl b/test/tint/expressions/literals/-inf.spvasm.expected.dxc.hlsl
index e4f9b25..42f8b29 100644
--- a/test/tint/expressions/literals/-inf.spvasm.expected.dxc.hlsl
+++ b/test/tint/expressions/literals/-inf.spvasm.expected.dxc.hlsl
@@ -1,7 +1,7 @@
 static float4 out_var_SV_TARGET = float4(0.0f, 0.0f, 0.0f, 0.0f);
 
 void main_1() {
-  out_var_SV_TARGET = (asfloat(0xff800000u)).xxxx;
+  out_var_SV_TARGET = (0.0f /* -inf */).xxxx;
   return;
 }
 
diff --git a/test/tint/expressions/literals/-inf.spvasm.expected.fxc.hlsl b/test/tint/expressions/literals/-inf.spvasm.expected.fxc.hlsl
index e4f9b25..42f8b29 100644
--- a/test/tint/expressions/literals/-inf.spvasm.expected.fxc.hlsl
+++ b/test/tint/expressions/literals/-inf.spvasm.expected.fxc.hlsl
@@ -1,7 +1,7 @@
 static float4 out_var_SV_TARGET = float4(0.0f, 0.0f, 0.0f, 0.0f);
 
 void main_1() {
-  out_var_SV_TARGET = (asfloat(0xff800000u)).xxxx;
+  out_var_SV_TARGET = (0.0f /* -inf */).xxxx;
   return;
 }
 
diff --git a/test/tint/expressions/literals/-inf.spvasm.expected.glsl b/test/tint/expressions/literals/-inf.spvasm.expected.glsl
index ea4fcf5..7673a43 100644
--- a/test/tint/expressions/literals/-inf.spvasm.expected.glsl
+++ b/test/tint/expressions/literals/-inf.spvasm.expected.glsl
@@ -4,7 +4,7 @@
 layout(location = 0) out vec4 out_var_SV_TARGET_1_1;
 vec4 out_var_SV_TARGET = vec4(0.0f, 0.0f, 0.0f, 0.0f);
 void main_1() {
-  out_var_SV_TARGET = vec4(uintBitsToFloat(0xff800000u));
+  out_var_SV_TARGET = vec4(0.0f /* -inf */);
   return;
 }
 
diff --git a/test/tint/expressions/literals/inf.spvasm.expected.dxc.hlsl b/test/tint/expressions/literals/inf.spvasm.expected.dxc.hlsl
index 1ce8ff8..e435870 100644
--- a/test/tint/expressions/literals/inf.spvasm.expected.dxc.hlsl
+++ b/test/tint/expressions/literals/inf.spvasm.expected.dxc.hlsl
@@ -1,7 +1,7 @@
 static float4 out_var_SV_TARGET = float4(0.0f, 0.0f, 0.0f, 0.0f);
 
 void main_1() {
-  out_var_SV_TARGET = (asfloat(0x7f800000u)).xxxx;
+  out_var_SV_TARGET = (0.0f /* inf */).xxxx;
   return;
 }
 
diff --git a/test/tint/expressions/literals/inf.spvasm.expected.fxc.hlsl b/test/tint/expressions/literals/inf.spvasm.expected.fxc.hlsl
index 1ce8ff8..e435870 100644
--- a/test/tint/expressions/literals/inf.spvasm.expected.fxc.hlsl
+++ b/test/tint/expressions/literals/inf.spvasm.expected.fxc.hlsl
@@ -1,7 +1,7 @@
 static float4 out_var_SV_TARGET = float4(0.0f, 0.0f, 0.0f, 0.0f);
 
 void main_1() {
-  out_var_SV_TARGET = (asfloat(0x7f800000u)).xxxx;
+  out_var_SV_TARGET = (0.0f /* inf */).xxxx;
   return;
 }
 
diff --git a/test/tint/expressions/literals/inf.spvasm.expected.glsl b/test/tint/expressions/literals/inf.spvasm.expected.glsl
index 229678d..55ce7dc 100644
--- a/test/tint/expressions/literals/inf.spvasm.expected.glsl
+++ b/test/tint/expressions/literals/inf.spvasm.expected.glsl
@@ -4,7 +4,7 @@
 layout(location = 0) out vec4 out_var_SV_TARGET_1_1;
 vec4 out_var_SV_TARGET = vec4(0.0f, 0.0f, 0.0f, 0.0f);
 void main_1() {
-  out_var_SV_TARGET = vec4(uintBitsToFloat(0x7f800000u));
+  out_var_SV_TARGET = vec4(0.0f /* inf */);
   return;
 }
 
diff --git a/test/tint/expressions/literals/nan.spvasm.expected.dxc.hlsl b/test/tint/expressions/literals/nan.spvasm.expected.dxc.hlsl
index 110eb40..a51d765 100644
--- a/test/tint/expressions/literals/nan.spvasm.expected.dxc.hlsl
+++ b/test/tint/expressions/literals/nan.spvasm.expected.dxc.hlsl
@@ -1,7 +1,7 @@
 static float4 out_var_SV_TARGET = float4(0.0f, 0.0f, 0.0f, 0.0f);
 
 void main_1() {
-  out_var_SV_TARGET = float4(asfloat(0x7fc00000u), asfloat(0x7fc00000u), asfloat(0x7fc00000u), asfloat(0x7fc00000u));
+  out_var_SV_TARGET = float4(0.0f /* nan */, 0.0f /* nan */, 0.0f /* nan */, 0.0f /* nan */);
   return;
 }
 
diff --git a/test/tint/expressions/literals/nan.spvasm.expected.fxc.hlsl b/test/tint/expressions/literals/nan.spvasm.expected.fxc.hlsl
index 110eb40..a51d765 100644
--- a/test/tint/expressions/literals/nan.spvasm.expected.fxc.hlsl
+++ b/test/tint/expressions/literals/nan.spvasm.expected.fxc.hlsl
@@ -1,7 +1,7 @@
 static float4 out_var_SV_TARGET = float4(0.0f, 0.0f, 0.0f, 0.0f);
 
 void main_1() {
-  out_var_SV_TARGET = float4(asfloat(0x7fc00000u), asfloat(0x7fc00000u), asfloat(0x7fc00000u), asfloat(0x7fc00000u));
+  out_var_SV_TARGET = float4(0.0f /* nan */, 0.0f /* nan */, 0.0f /* nan */, 0.0f /* nan */);
   return;
 }
 
diff --git a/test/tint/expressions/literals/nan.spvasm.expected.glsl b/test/tint/expressions/literals/nan.spvasm.expected.glsl
index c78cc6f..0a04b39 100644
--- a/test/tint/expressions/literals/nan.spvasm.expected.glsl
+++ b/test/tint/expressions/literals/nan.spvasm.expected.glsl
@@ -4,7 +4,7 @@
 layout(location = 0) out vec4 out_var_SV_TARGET_1_1;
 vec4 out_var_SV_TARGET = vec4(0.0f, 0.0f, 0.0f, 0.0f);
 void main_1() {
-  out_var_SV_TARGET = vec4(uintBitsToFloat(0x7fc00000u), uintBitsToFloat(0x7fc00000u), uintBitsToFloat(0x7fc00000u), uintBitsToFloat(0x7fc00000u));
+  out_var_SV_TARGET = vec4(0.0f /* nan */, 0.0f /* nan */, 0.0f /* nan */, 0.0f /* nan */);
   return;
 }