add support for FConvert

Bug: 401002063
Change-Id: Ie81b54ba61b5a890817a2b1a7fa4d528a532f519
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/229534
Reviewed-by: James Price <jrprice@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/spirv/reader/parser/convert_test.cc b/src/tint/lang/spirv/reader/parser/convert_test.cc
index 68aae98..98aa2fa 100644
--- a/src/tint/lang/spirv/reader/parser/convert_test.cc
+++ b/src/tint/lang/spirv/reader/parser/convert_test.cc
@@ -443,5 +443,127 @@
 )");
 }
 
+TEST_F(SpirvParserTest, FConvert_ScalarF32ToF16) {
+    EXPECT_IR(R"(
+             OpCapability Shader
+             OpCapability Float16
+             OpMemoryModel Logical GLSL450
+             OpEntryPoint GLCompute %main "main"
+             OpExecutionMode %main LocalSize 1 1 1
+     %void    = OpTypeVoid
+     %float16 = OpTypeFloat 16
+     %float32 = OpTypeFloat 32
+     %two     = OpConstant %float32 2
+     %void_fn = OpTypeFunction %void
+
+     %main    = OpFunction %void None %void_fn
+     %main_start = OpLabel
+             %1 = OpFConvert %float16 %two
+             OpReturn
+     OpFunctionEnd
+)",
+              R"(
+%main = @compute @workgroup_size(1u, 1u, 1u) func():void {
+  $B1: {
+    %2:f16 = convert 2.0f
+    ret
+  }
+}
+)");
+}
+
+TEST_F(SpirvParserTest, FConvert_ScalarF16ToF32) {
+    EXPECT_IR(R"(
+             OpCapability Shader
+             OpCapability Float16
+             OpMemoryModel Logical GLSL450
+             OpEntryPoint GLCompute %main "main"
+             OpExecutionMode %main LocalSize 1 1 1
+     %void    = OpTypeVoid
+     %float16 = OpTypeFloat 16
+     %float32 = OpTypeFloat 32
+     %two     = OpConstant %float16 2
+     %void_fn = OpTypeFunction %void
+
+     %main    = OpFunction %void None %void_fn
+     %main_start = OpLabel
+             %1 = OpFConvert %float32 %two
+             OpReturn
+     OpFunctionEnd
+)",
+              R"(
+%main = @compute @workgroup_size(1u, 1u, 1u) func():void {
+  $B1: {
+    %2:f32 = convert 2.0h
+    ret
+  }
+}
+)");
+}
+
+TEST_F(SpirvParserTest, FConvert_VectorF32ToF16) {
+    EXPECT_IR(R"(
+             OpCapability Shader
+             OpCapability Float16
+             OpMemoryModel Logical GLSL450
+             OpEntryPoint GLCompute %main "main"
+             OpExecutionMode %main LocalSize 1 1 1
+     %void       = OpTypeVoid
+     %float16    = OpTypeFloat 16
+     %float32    = OpTypeFloat 32
+     %v2float16  = OpTypeVector %float16 2
+     %v2float32  = OpTypeVector %float32 2
+     %two        = OpConstant %float32 2
+     %v2_two     = OpConstantComposite %v2float32 %two %two
+     %void_fn    = OpTypeFunction %void
+
+     %main       = OpFunction %void None %void_fn
+     %main_start = OpLabel
+             %1 = OpFConvert %v2float16 %v2_two
+             OpReturn
+     OpFunctionEnd
+)",
+              R"(
+%main = @compute @workgroup_size(1u, 1u, 1u) func():void {
+  $B1: {
+    %2:vec2<f16> = convert vec2<f32>(2.0f)
+    ret
+  }
+}
+)");
+}
+
+TEST_F(SpirvParserTest, FConvert_VectorF16ToF32) {
+    EXPECT_IR(R"(
+             OpCapability Shader
+             OpCapability Float16
+             OpMemoryModel Logical GLSL450
+             OpEntryPoint GLCompute %main "main"
+             OpExecutionMode %main LocalSize 1 1 1
+     %void       = OpTypeVoid
+     %float16    = OpTypeFloat 16
+     %float32    = OpTypeFloat 32
+     %v2float16  = OpTypeVector %float16 2
+     %v2float32  = OpTypeVector %float32 2
+     %two       = OpConstant %float16 2
+     %v2_two    = OpConstantComposite %v2float16 %two %two
+     %void_fn    = OpTypeFunction %void
+
+     %main       = OpFunction %void None %void_fn
+     %main_start = OpLabel
+             %1 = OpFConvert %v2float32 %v2_two
+             OpReturn
+     OpFunctionEnd
+)",
+              R"(
+%main = @compute @workgroup_size(1u, 1u, 1u) func():void {
+  $B1: {
+    %2:vec2<f32> = convert vec2<f16>(2.0h)
+    ret
+  }
+}
+)");
+}
+
 }  // namespace
 }  // namespace tint::spirv::reader
diff --git a/src/tint/lang/spirv/reader/parser/parser.cc b/src/tint/lang/spirv/reader/parser/parser.cc
index da22740..bd7a8a9 100644
--- a/src/tint/lang/spirv/reader/parser/parser.cc
+++ b/src/tint/lang/spirv/reader/parser/parser.cc
@@ -752,6 +752,10 @@
                 case spv::Op::OpConvertUToF:
                     EmitSpirvExplicitBuiltinCall(inst, spirv::BuiltinFn::kConvertUToF);
                     break;
+                case spv::Op::OpFConvert:
+                    Emit(b_.Convert(Type(inst.type_id()), Value(inst.GetSingleWordOperand(2))),
+                         inst.result_id());
+                    break;
                 case spv::Op::OpBitwiseAnd:
                     EmitSpirvExplicitBuiltinCall(inst, spirv::BuiltinFn::kBitwiseAnd);
                     break;