tint/hlsl: don't use min16float to implement quantizeToF16

min16float is not required to convert its input to an 16-bit float.
Instead, use f32tof16, and f16tof32.

This is also required to be able to enable the IEEE strictness option on
FXC, otherwise FXC emits an error X4028: expression has a minimum
precision type and cannot be marked precise

Bug: tint:1887
Change-Id: I2268c9336b8e873b36e6532984838054fe4dedbd
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/125920
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/tint/writer/hlsl/generator_impl.cc b/src/tint/writer/hlsl/generator_impl.cc
index 2c4279c..9ea120c 100644
--- a/src/tint/writer/hlsl/generator_impl.cc
+++ b/src/tint/writer/hlsl/generator_impl.cc
@@ -2106,12 +2106,13 @@
 bool GeneratorImpl::EmitQuantizeToF16Call(utils::StringStream& out,
                                           const ast::CallExpression* expr,
                                           const sem::Builtin* builtin) {
-    // Emulate by casting to min16float and back again.
+    // Cast to f16 and back
     std::string width;
     if (auto* vec = builtin->ReturnType()->As<type::Vector>()) {
         width = std::to_string(vec->Width());
     }
-    out << "float" << width << "(min16float" << width << "(";
+    out << "f16tof32(f32tof16"
+        << "(";
     if (!EmitExpression(out, expr->args[0])) {
         return false;
     }
diff --git a/src/tint/writer/hlsl/generator_impl_import_test.cc b/src/tint/writer/hlsl/generator_impl_import_test.cc
index 3fbad50..ed41b32 100644
--- a/src/tint/writer/hlsl/generator_impl_import_test.cc
+++ b/src/tint/writer/hlsl/generator_impl_import_test.cc
@@ -275,7 +275,7 @@
 
     utils::StringStream out;
     ASSERT_TRUE(gen.EmitCall(out, expr)) << gen.error();
-    EXPECT_EQ(out.str(), std::string("float(min16float(v))"));
+    EXPECT_EQ(out.str(), std::string("f16tof32(f32tof16(v))"));
 }
 
 TEST_F(HlslGeneratorImplTest_Import, HlslImportData_QuantizeToF16_Vector) {
@@ -288,7 +288,7 @@
 
     utils::StringStream out;
     ASSERT_TRUE(gen.EmitCall(out, expr)) << gen.error();
-    EXPECT_EQ(out.str(), std::string("float3(min16float3(v))"));
+    EXPECT_EQ(out.str(), std::string("f16tof32(f32tof16(v))"));
 }
 
 }  // namespace
diff --git a/test/tint/builtins/gen/var/quantizeToF16/12e50e.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/quantizeToF16/12e50e.wgsl.expected.dxc.hlsl
index 6fef161..8a4f04e 100644
--- a/test/tint/builtins/gen/var/quantizeToF16/12e50e.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/quantizeToF16/12e50e.wgsl.expected.dxc.hlsl
@@ -2,7 +2,7 @@
 
 void quantizeToF16_12e50e() {
   float arg_0 = 1.0f;
-  float res = float(min16float(arg_0));
+  float res = f16tof32(f32tof16(arg_0));
   prevent_dce.Store(0u, asuint(res));
 }
 
diff --git a/test/tint/builtins/gen/var/quantizeToF16/12e50e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/quantizeToF16/12e50e.wgsl.expected.fxc.hlsl
index 6fef161..8a4f04e 100644
--- a/test/tint/builtins/gen/var/quantizeToF16/12e50e.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/quantizeToF16/12e50e.wgsl.expected.fxc.hlsl
@@ -2,7 +2,7 @@
 
 void quantizeToF16_12e50e() {
   float arg_0 = 1.0f;
-  float res = float(min16float(arg_0));
+  float res = f16tof32(f32tof16(arg_0));
   prevent_dce.Store(0u, asuint(res));
 }
 
diff --git a/test/tint/builtins/gen/var/quantizeToF16/2cddf3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/quantizeToF16/2cddf3.wgsl.expected.dxc.hlsl
index f417dc6..64920ae 100644
--- a/test/tint/builtins/gen/var/quantizeToF16/2cddf3.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/quantizeToF16/2cddf3.wgsl.expected.dxc.hlsl
@@ -2,7 +2,7 @@
 
 void quantizeToF16_2cddf3() {
   float2 arg_0 = (1.0f).xx;
-  float2 res = float2(min16float2(arg_0));
+  float2 res = f16tof32(f32tof16(arg_0));
   prevent_dce.Store2(0u, asuint(res));
 }
 
diff --git a/test/tint/builtins/gen/var/quantizeToF16/2cddf3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/quantizeToF16/2cddf3.wgsl.expected.fxc.hlsl
index f417dc6..64920ae 100644
--- a/test/tint/builtins/gen/var/quantizeToF16/2cddf3.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/quantizeToF16/2cddf3.wgsl.expected.fxc.hlsl
@@ -2,7 +2,7 @@
 
 void quantizeToF16_2cddf3() {
   float2 arg_0 = (1.0f).xx;
-  float2 res = float2(min16float2(arg_0));
+  float2 res = f16tof32(f32tof16(arg_0));
   prevent_dce.Store2(0u, asuint(res));
 }
 
diff --git a/test/tint/builtins/gen/var/quantizeToF16/cba294.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/quantizeToF16/cba294.wgsl.expected.dxc.hlsl
index b1e0299..f9eab74 100644
--- a/test/tint/builtins/gen/var/quantizeToF16/cba294.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/quantizeToF16/cba294.wgsl.expected.dxc.hlsl
@@ -2,7 +2,7 @@
 
 void quantizeToF16_cba294() {
   float4 arg_0 = (1.0f).xxxx;
-  float4 res = float4(min16float4(arg_0));
+  float4 res = f16tof32(f32tof16(arg_0));
   prevent_dce.Store4(0u, asuint(res));
 }
 
diff --git a/test/tint/builtins/gen/var/quantizeToF16/cba294.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/quantizeToF16/cba294.wgsl.expected.fxc.hlsl
index b1e0299..f9eab74 100644
--- a/test/tint/builtins/gen/var/quantizeToF16/cba294.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/quantizeToF16/cba294.wgsl.expected.fxc.hlsl
@@ -2,7 +2,7 @@
 
 void quantizeToF16_cba294() {
   float4 arg_0 = (1.0f).xxxx;
-  float4 res = float4(min16float4(arg_0));
+  float4 res = f16tof32(f32tof16(arg_0));
   prevent_dce.Store4(0u, asuint(res));
 }
 
diff --git a/test/tint/builtins/gen/var/quantizeToF16/e8fd14.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/quantizeToF16/e8fd14.wgsl.expected.dxc.hlsl
index cc97bf3..1805a24 100644
--- a/test/tint/builtins/gen/var/quantizeToF16/e8fd14.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/quantizeToF16/e8fd14.wgsl.expected.dxc.hlsl
@@ -2,7 +2,7 @@
 
 void quantizeToF16_e8fd14() {
   float3 arg_0 = (1.0f).xxx;
-  float3 res = float3(min16float3(arg_0));
+  float3 res = f16tof32(f32tof16(arg_0));
   prevent_dce.Store3(0u, asuint(res));
 }
 
diff --git a/test/tint/builtins/gen/var/quantizeToF16/e8fd14.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/quantizeToF16/e8fd14.wgsl.expected.fxc.hlsl
index cc97bf3..1805a24 100644
--- a/test/tint/builtins/gen/var/quantizeToF16/e8fd14.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/quantizeToF16/e8fd14.wgsl.expected.fxc.hlsl
@@ -2,7 +2,7 @@
 
 void quantizeToF16_e8fd14() {
   float3 arg_0 = (1.0f).xxx;
-  float3 res = float3(min16float3(arg_0));
+  float3 res = f16tof32(f32tof16(arg_0));
   prevent_dce.Store3(0u, asuint(res));
 }