Tint: Implement bitcast for f16

This CL implement the missing bitcast from/to f16 types, including
resolver validation and HLSL/GLSL backends. MSL and SPIRV backends have
native support. Related unittests and tint tests are also implemented.

Bug: tint:1977, dawn:1510, tint:1502
Change-Id: I04499864df4115eeb130aceb359151e8e1ffbfa9
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/140500
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Zhaoming Jiang <zhaoming.jiang@intel.com>
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4f32.wgsl b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4f32.wgsl
new file mode 100644
index 0000000..2da940d
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec4<f32> = vec4<f32>(2.003662109375f, -513.03125f, -1024.25f, 0.0016968456f);
+    let b : vec4<f32> = bitcast<vec4<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..4f39a01
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float4 b = float4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..4f39a01
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float4 b = float4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4f32.wgsl.expected.glsl
new file mode 100644
index 0000000..39422cd
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4f32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  vec4 b = vec4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4f32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4f32.wgsl.expected.msl
new file mode 100644
index 0000000..8554545
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4f32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float4 const b = float4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..dcb6f05
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4f32.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 12
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%float_2_00366211 = OpConstant %float 2.00366211
+%float_n513_03125 = OpConstant %float -513.03125
+%float_n1024_25 = OpConstant %float -1024.25
+%float_0_00169684563 = OpConstant %float 0.00169684563
+         %11 = OpConstantComposite %v4float %float_2_00366211 %float_n513_03125 %float_n1024_25 %float_0_00169684563
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..4482802
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec4<f32> = vec4<f32>(2.003662109375f, -(513.03125f), -(1024.25f), 0.00169684563297778368f);
+  let b : vec4<f32> = bitcast<vec4<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4i32.wgsl b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4i32.wgsl
new file mode 100644
index 0000000..8b6fbea7
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec4<f32> = vec4<f32>(2.003662109375f, -513.03125f, -1024.25f, 0.0016968456f);
+    let b : vec4<i32> = bitcast<vec4<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..815932a
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int4 b = int4(1073757184, -1006616064, -998242304, 987654321);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..815932a
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int4 b = int4(1073757184, -1006616064, -998242304, 987654321);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4i32.wgsl.expected.glsl
new file mode 100644
index 0000000..36d5181
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4i32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  ivec4 b = ivec4(1073757184, -1006616064, -998242304, 987654321);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4i32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4i32.wgsl.expected.msl
new file mode 100644
index 0000000..de2f946
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4i32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int4 const b = int4(1073757184, -1006616064, -998242304, 987654321);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..2327c64
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4i32.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 12
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v4int = OpTypeVector %int 4
+%int_1073757184 = OpConstant %int 1073757184
+%int_n1006616064 = OpConstant %int -1006616064
+%int_n998242304 = OpConstant %int -998242304
+%int_987654321 = OpConstant %int 987654321
+         %11 = OpConstantComposite %v4int %int_1073757184 %int_n1006616064 %int_n998242304 %int_987654321
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..fe3ac49
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec4<f32> = vec4<f32>(2.003662109375f, -(513.03125f), -(1024.25f), 0.00169684563297778368f);
+  let b : vec4<i32> = bitcast<vec4<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4u32.wgsl b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4u32.wgsl
new file mode 100644
index 0000000..1ef17f3
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec4<f32> = vec4<f32>(2.003662109375f, -513.03125f, -1024.25f, 0.0016968456f);
+    let b : vec4<u32> = bitcast<vec4<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..bddf4d8
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint4 b = uint4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..bddf4d8
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint4 b = uint4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4u32.wgsl.expected.glsl
new file mode 100644
index 0000000..ded9067
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4u32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  uvec4 b = uvec4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4u32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4u32.wgsl.expected.msl
new file mode 100644
index 0000000..7ab037b
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4u32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint4 const b = uint4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..c3b2d03
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4u32.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 12
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %v4uint = OpTypeVector %uint 4
+%uint_1073757184 = OpConstant %uint 1073757184
+%uint_3288351232 = OpConstant %uint 3288351232
+%uint_3296724992 = OpConstant %uint 3296724992
+%uint_987654321 = OpConstant %uint 987654321
+         %11 = OpConstantComposite %v4uint %uint_1073757184 %uint_3288351232 %uint_3296724992 %uint_987654321
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..c278f93
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4f32-vec4u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec4<f32> = vec4<f32>(2.003662109375f, -(513.03125f), -(1024.25f), 0.00169684563297778368f);
+  let b : vec4<u32> = bitcast<vec4<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4f32.wgsl b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4f32.wgsl
new file mode 100644
index 0000000..8d47b79
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec4<i32> = vec4<i32>(1073757184i, -1006616064i, -998242304i, 987654321i);
+    let b : vec4<f32> = bitcast<vec4<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..4f39a01
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float4 b = float4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..4f39a01
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float4 b = float4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4f32.wgsl.expected.glsl
new file mode 100644
index 0000000..39422cd
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4f32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  vec4 b = vec4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4f32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4f32.wgsl.expected.msl
new file mode 100644
index 0000000..8554545
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4f32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float4 const b = float4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..dcb6f05
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4f32.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 12
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%float_2_00366211 = OpConstant %float 2.00366211
+%float_n513_03125 = OpConstant %float -513.03125
+%float_n1024_25 = OpConstant %float -1024.25
+%float_0_00169684563 = OpConstant %float 0.00169684563
+         %11 = OpConstantComposite %v4float %float_2_00366211 %float_n513_03125 %float_n1024_25 %float_0_00169684563
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..01bd2fb
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec4<i32> = vec4<i32>(1073757184i, -(1006616064i), -(998242304i), 987654321i);
+  let b : vec4<f32> = bitcast<vec4<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4i32.wgsl b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4i32.wgsl
new file mode 100644
index 0000000..d49bbef
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec4<i32> = vec4<i32>(1073757184i, -1006616064i, -998242304i, 987654321i);
+    let b : vec4<i32> = bitcast<vec4<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..815932a
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int4 b = int4(1073757184, -1006616064, -998242304, 987654321);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..815932a
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int4 b = int4(1073757184, -1006616064, -998242304, 987654321);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4i32.wgsl.expected.glsl
new file mode 100644
index 0000000..36d5181
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4i32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  ivec4 b = ivec4(1073757184, -1006616064, -998242304, 987654321);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4i32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4i32.wgsl.expected.msl
new file mode 100644
index 0000000..de2f946
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4i32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int4 const b = int4(1073757184, -1006616064, -998242304, 987654321);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..2327c64
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4i32.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 12
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v4int = OpTypeVector %int 4
+%int_1073757184 = OpConstant %int 1073757184
+%int_n1006616064 = OpConstant %int -1006616064
+%int_n998242304 = OpConstant %int -998242304
+%int_987654321 = OpConstant %int 987654321
+         %11 = OpConstantComposite %v4int %int_1073757184 %int_n1006616064 %int_n998242304 %int_987654321
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..59c093b
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec4<i32> = vec4<i32>(1073757184i, -(1006616064i), -(998242304i), 987654321i);
+  let b : vec4<i32> = bitcast<vec4<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4u32.wgsl b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4u32.wgsl
new file mode 100644
index 0000000..60b0c00
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec4<i32> = vec4<i32>(1073757184i, -1006616064i, -998242304i, 987654321i);
+    let b : vec4<u32> = bitcast<vec4<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..bddf4d8
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint4 b = uint4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..bddf4d8
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint4 b = uint4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4u32.wgsl.expected.glsl
new file mode 100644
index 0000000..ded9067
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4u32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  uvec4 b = uvec4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4u32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4u32.wgsl.expected.msl
new file mode 100644
index 0000000..7ab037b
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4u32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint4 const b = uint4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..c3b2d03
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4u32.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 12
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %v4uint = OpTypeVector %uint 4
+%uint_1073757184 = OpConstant %uint 1073757184
+%uint_3288351232 = OpConstant %uint 3288351232
+%uint_3296724992 = OpConstant %uint 3296724992
+%uint_987654321 = OpConstant %uint 987654321
+         %11 = OpConstantComposite %v4uint %uint_1073757184 %uint_3288351232 %uint_3296724992 %uint_987654321
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..31439c9
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4i32-vec4u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec4<i32> = vec4<i32>(1073757184i, -(1006616064i), -(998242304i), 987654321i);
+  let b : vec4<u32> = bitcast<vec4<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4f32.wgsl b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4f32.wgsl
new file mode 100644
index 0000000..b3ed335
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec4<u32> = vec4<u32>(1073757184u, 3288351232u, 3296724992u, 987654321u);
+    let b : vec4<f32> = bitcast<vec4<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..4f39a01
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float4 b = float4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..4f39a01
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float4 b = float4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4f32.wgsl.expected.glsl
new file mode 100644
index 0000000..39422cd
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4f32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  vec4 b = vec4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4f32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4f32.wgsl.expected.msl
new file mode 100644
index 0000000..8554545
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4f32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float4 const b = float4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..dcb6f05
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4f32.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 12
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%float_2_00366211 = OpConstant %float 2.00366211
+%float_n513_03125 = OpConstant %float -513.03125
+%float_n1024_25 = OpConstant %float -1024.25
+%float_0_00169684563 = OpConstant %float 0.00169684563
+         %11 = OpConstantComposite %v4float %float_2_00366211 %float_n513_03125 %float_n1024_25 %float_0_00169684563
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..a878574
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec4<u32> = vec4<u32>(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  let b : vec4<f32> = bitcast<vec4<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4i32.wgsl b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4i32.wgsl
new file mode 100644
index 0000000..6c1176f
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec4<u32> = vec4<u32>(1073757184u, 3288351232u, 3296724992u, 987654321u);
+    let b : vec4<i32> = bitcast<vec4<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..815932a
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int4 b = int4(1073757184, -1006616064, -998242304, 987654321);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..815932a
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int4 b = int4(1073757184, -1006616064, -998242304, 987654321);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4i32.wgsl.expected.glsl
new file mode 100644
index 0000000..36d5181
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4i32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  ivec4 b = ivec4(1073757184, -1006616064, -998242304, 987654321);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4i32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4i32.wgsl.expected.msl
new file mode 100644
index 0000000..de2f946
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4i32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int4 const b = int4(1073757184, -1006616064, -998242304, 987654321);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..2327c64
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4i32.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 12
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v4int = OpTypeVector %int 4
+%int_1073757184 = OpConstant %int 1073757184
+%int_n1006616064 = OpConstant %int -1006616064
+%int_n998242304 = OpConstant %int -998242304
+%int_987654321 = OpConstant %int 987654321
+         %11 = OpConstantComposite %v4int %int_1073757184 %int_n1006616064 %int_n998242304 %int_987654321
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..0b05075
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec4<u32> = vec4<u32>(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  let b : vec4<i32> = bitcast<vec4<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4u32.wgsl b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4u32.wgsl
new file mode 100644
index 0000000..494d424
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec4<u32> = vec4<u32>(1073757184u, 3288351232u, 3296724992u, 987654321u);
+    let b : vec4<u32> = bitcast<vec4<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..bddf4d8
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint4 b = uint4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..bddf4d8
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint4 b = uint4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4u32.wgsl.expected.glsl
new file mode 100644
index 0000000..ded9067
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4u32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  uvec4 b = uvec4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4u32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4u32.wgsl.expected.msl
new file mode 100644
index 0000000..7ab037b
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4u32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint4 const b = uint4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..c3b2d03
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4u32.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 12
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %v4uint = OpTypeVector %uint 4
+%uint_1073757184 = OpConstant %uint 1073757184
+%uint_3288351232 = OpConstant %uint 3288351232
+%uint_3296724992 = OpConstant %uint 3296724992
+%uint_987654321 = OpConstant %uint 987654321
+         %11 = OpConstantComposite %v4uint %uint_1073757184 %uint_3288351232 %uint_3296724992 %uint_987654321
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..67398ff
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/128bit/vec4u32-vec4u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec4<u32> = vec4<u32>(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  let b : vec4<u32> = bitcast<vec4<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/16bit/f16-f16.wgsl b/test/tint/expressions/bitcast/const/16bit/f16-f16.wgsl
new file mode 100644
index 0000000..c088ae8
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/16bit/f16-f16.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    const a : f16 = f16(1.0h);
+    let b : f16 = bitcast<f16>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/16bit/f16-f16.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/16bit/f16-f16.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..957f3b1
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/16bit/f16-f16.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float16_t b = float16_t(1.0h);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/16bit/f16-f16.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/16bit/f16-f16.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..fcec2d0
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/16bit/f16-f16.wgsl.expected.fxc.hlsl
@@ -0,0 +1,10 @@
+SKIP: FAILED
+
+[numthreads(1, 1, 1)]
+void f() {
+  const float16_t b = float16_t(1.0h);
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x00000174D90470D0(3,9-17): error X3000: unrecognized identifier 'float16_t'
+
diff --git a/test/tint/expressions/bitcast/const/16bit/f16-f16.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/16bit/f16-f16.wgsl.expected.glsl
new file mode 100644
index 0000000..7ecf575
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/16bit/f16-f16.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+void f() {
+  float16_t b = 1.0hf;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/16bit/f16-f16.wgsl.expected.msl b/test/tint/expressions/bitcast/const/16bit/f16-f16.wgsl.expected.msl
new file mode 100644
index 0000000..3607b06
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/16bit/f16-f16.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  half const b = 1.0h;
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/16bit/f16-f16.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/16bit/f16-f16.wgsl.expected.spvasm
new file mode 100644
index 0000000..4ef59e1
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/16bit/f16-f16.wgsl.expected.spvasm
@@ -0,0 +1,22 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 7
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %half = OpTypeFloat 16
+%half_0x1p_0 = OpConstant %half 0x1p+0
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/16bit/f16-f16.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/16bit/f16-f16.wgsl.expected.wgsl
new file mode 100644
index 0000000..e7023c9
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/16bit/f16-f16.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  const a : f16 = f16(1.0h);
+  let b : f16 = bitcast<f16>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-f32.wgsl b/test/tint/expressions/bitcast/const/32bit/f32-f32.wgsl
new file mode 100644
index 0000000..9eb2fcd
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : f32 = f32(2.003662109375f);
+    let b : f32 = bitcast<f32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/32bit/f32-f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..74d690b
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float b = 2.003662109375f;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/32bit/f32-f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..74d690b
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float b = 2.003662109375f;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/32bit/f32-f32.wgsl.expected.glsl
new file mode 100644
index 0000000..51c77db
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-f32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  float b = 2.003662109375f;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-f32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/32bit/f32-f32.wgsl.expected.msl
new file mode 100644
index 0000000..144d094
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-f32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float const b = 2.003662109375f;
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/32bit/f32-f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..5a17613
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-f32.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 7
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%float_2_00366211 = OpConstant %float 2.00366211
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/32bit/f32-f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..19be722
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : f32 = f32(2.003662109375f);
+  let b : f32 = bitcast<f32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-i32.wgsl b/test/tint/expressions/bitcast/const/32bit/f32-i32.wgsl
new file mode 100644
index 0000000..9847b00
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : f32 = f32(2.003662109375f);
+    let b : i32 = bitcast<i32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/32bit/f32-i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..619dbfe
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int b = 1073757184;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/32bit/f32-i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..619dbfe
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int b = 1073757184;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/32bit/f32-i32.wgsl.expected.glsl
new file mode 100644
index 0000000..af2a39d
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-i32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  int b = 1073757184;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-i32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/32bit/f32-i32.wgsl.expected.msl
new file mode 100644
index 0000000..7c2e677
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-i32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int const b = 1073757184;
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/32bit/f32-i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..6c1cfb8
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-i32.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 7
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%int_1073757184 = OpConstant %int 1073757184
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/32bit/f32-i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..1797937
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : f32 = f32(2.003662109375f);
+  let b : i32 = bitcast<i32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-u32.wgsl b/test/tint/expressions/bitcast/const/32bit/f32-u32.wgsl
new file mode 100644
index 0000000..a7e82fae
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : f32 = f32(2.003662109375f);
+    let b : u32 = bitcast<u32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/32bit/f32-u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..e14dc06
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint b = 1073757184u;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/32bit/f32-u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..e14dc06
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint b = 1073757184u;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/32bit/f32-u32.wgsl.expected.glsl
new file mode 100644
index 0000000..28c28d9
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-u32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  uint b = 1073757184u;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-u32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/32bit/f32-u32.wgsl.expected.msl
new file mode 100644
index 0000000..71c1a43
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-u32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint const b = 1073757184u;
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/32bit/f32-u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..1907400
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-u32.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 7
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+%uint_1073757184 = OpConstant %uint 1073757184
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/32bit/f32-u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..378e4f8
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : f32 = f32(2.003662109375f);
+  let b : u32 = bitcast<u32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-vec2f16.wgsl b/test/tint/expressions/bitcast/const/32bit/f32-vec2f16.wgsl
new file mode 100644
index 0000000..c9aeb15
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-vec2f16.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    const a : f32 = f32(2.003662109375f);
+    let b : vec2<f16> = bitcast<vec2<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-vec2f16.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/32bit/f32-vec2f16.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..3c1e8f5
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-vec2f16.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 2> b = vector<float16_t, 2>(float16_t(1.0h), float16_t(2.0h));
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-vec2f16.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/32bit/f32-vec2f16.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..fae3a2b
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-vec2f16.wgsl.expected.fxc.hlsl
@@ -0,0 +1,10 @@
+SKIP: FAILED
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 2> b = vector<float16_t, 2>(float16_t(1.0h), float16_t(2.0h));
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x0000022D117788A0(3,16-24): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-vec2f16.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/32bit/f32-vec2f16.wgsl.expected.glsl
new file mode 100644
index 0000000..42774e1
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-vec2f16.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+void f() {
+  f16vec2 b = f16vec2(1.0hf, 2.0hf);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-vec2f16.wgsl.expected.msl b/test/tint/expressions/bitcast/const/32bit/f32-vec2f16.wgsl.expected.msl
new file mode 100644
index 0000000..7e90da5
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-vec2f16.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  half2 const b = half2(1.0h, 2.0h);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-vec2f16.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/32bit/f32-vec2f16.wgsl.expected.spvasm
new file mode 100644
index 0000000..a7e1c5f
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-vec2f16.wgsl.expected.spvasm
@@ -0,0 +1,25 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 10
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %half = OpTypeFloat 16
+     %v2half = OpTypeVector %half 2
+%half_0x1p_0 = OpConstant %half 0x1p+0
+%half_0x1p_1 = OpConstant %half 0x1p+1
+          %9 = OpConstantComposite %v2half %half_0x1p_0 %half_0x1p_1
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/32bit/f32-vec2f16.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/32bit/f32-vec2f16.wgsl.expected.wgsl
new file mode 100644
index 0000000..a905b56
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/f32-vec2f16.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  const a : f32 = f32(2.003662109375f);
+  let b : vec2<f16> = bitcast<vec2<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-f32.wgsl b/test/tint/expressions/bitcast/const/32bit/i32-f32.wgsl
new file mode 100644
index 0000000..d4f9ab0
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : i32 = i32(1073757184i);
+    let b : f32 = bitcast<f32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/32bit/i32-f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..74d690b
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float b = 2.003662109375f;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/32bit/i32-f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..74d690b
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float b = 2.003662109375f;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/32bit/i32-f32.wgsl.expected.glsl
new file mode 100644
index 0000000..51c77db
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-f32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  float b = 2.003662109375f;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-f32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/32bit/i32-f32.wgsl.expected.msl
new file mode 100644
index 0000000..144d094
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-f32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float const b = 2.003662109375f;
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/32bit/i32-f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..5a17613
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-f32.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 7
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%float_2_00366211 = OpConstant %float 2.00366211
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/32bit/i32-f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..359f8b0
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : i32 = i32(1073757184i);
+  let b : f32 = bitcast<f32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-i32.wgsl b/test/tint/expressions/bitcast/const/32bit/i32-i32.wgsl
new file mode 100644
index 0000000..33302a0
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : i32 = i32(1073757184i);
+    let b : i32 = bitcast<i32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/32bit/i32-i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..619dbfe
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int b = 1073757184;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/32bit/i32-i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..619dbfe
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int b = 1073757184;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/32bit/i32-i32.wgsl.expected.glsl
new file mode 100644
index 0000000..af2a39d
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-i32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  int b = 1073757184;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-i32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/32bit/i32-i32.wgsl.expected.msl
new file mode 100644
index 0000000..7c2e677
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-i32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int const b = 1073757184;
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/32bit/i32-i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..6c1cfb8
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-i32.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 7
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%int_1073757184 = OpConstant %int 1073757184
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/32bit/i32-i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..6beb0db
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : i32 = i32(1073757184i);
+  let b : i32 = bitcast<i32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-u32.wgsl b/test/tint/expressions/bitcast/const/32bit/i32-u32.wgsl
new file mode 100644
index 0000000..35ee562
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : i32 = i32(1073757184i);
+    let b : u32 = bitcast<u32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/32bit/i32-u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..e14dc06
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint b = 1073757184u;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/32bit/i32-u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..e14dc06
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint b = 1073757184u;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/32bit/i32-u32.wgsl.expected.glsl
new file mode 100644
index 0000000..28c28d9
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-u32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  uint b = 1073757184u;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-u32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/32bit/i32-u32.wgsl.expected.msl
new file mode 100644
index 0000000..71c1a43
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-u32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint const b = 1073757184u;
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/32bit/i32-u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..1907400
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-u32.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 7
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+%uint_1073757184 = OpConstant %uint 1073757184
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/32bit/i32-u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..02d70f9
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : i32 = i32(1073757184i);
+  let b : u32 = bitcast<u32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-vec2f16.wgsl b/test/tint/expressions/bitcast/const/32bit/i32-vec2f16.wgsl
new file mode 100644
index 0000000..76f7cb6
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-vec2f16.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    const a : i32 = i32(1073757184i);
+    let b : vec2<f16> = bitcast<vec2<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-vec2f16.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/32bit/i32-vec2f16.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..3c1e8f5
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-vec2f16.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 2> b = vector<float16_t, 2>(float16_t(1.0h), float16_t(2.0h));
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-vec2f16.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/32bit/i32-vec2f16.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..0b3661c
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-vec2f16.wgsl.expected.fxc.hlsl
@@ -0,0 +1,10 @@
+SKIP: FAILED
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 2> b = vector<float16_t, 2>(float16_t(1.0h), float16_t(2.0h));
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x000001ABDA989700(3,16-24): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-vec2f16.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/32bit/i32-vec2f16.wgsl.expected.glsl
new file mode 100644
index 0000000..42774e1
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-vec2f16.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+void f() {
+  f16vec2 b = f16vec2(1.0hf, 2.0hf);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-vec2f16.wgsl.expected.msl b/test/tint/expressions/bitcast/const/32bit/i32-vec2f16.wgsl.expected.msl
new file mode 100644
index 0000000..7e90da5
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-vec2f16.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  half2 const b = half2(1.0h, 2.0h);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-vec2f16.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/32bit/i32-vec2f16.wgsl.expected.spvasm
new file mode 100644
index 0000000..a7e1c5f
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-vec2f16.wgsl.expected.spvasm
@@ -0,0 +1,25 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 10
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %half = OpTypeFloat 16
+     %v2half = OpTypeVector %half 2
+%half_0x1p_0 = OpConstant %half 0x1p+0
+%half_0x1p_1 = OpConstant %half 0x1p+1
+          %9 = OpConstantComposite %v2half %half_0x1p_0 %half_0x1p_1
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/32bit/i32-vec2f16.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/32bit/i32-vec2f16.wgsl.expected.wgsl
new file mode 100644
index 0000000..5d31753
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/i32-vec2f16.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  const a : i32 = i32(1073757184i);
+  let b : vec2<f16> = bitcast<vec2<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/scalar/i32min-u32.wgsl b/test/tint/expressions/bitcast/const/32bit/i32min-u32.wgsl
similarity index 100%
rename from test/tint/expressions/bitcast/scalar/i32min-u32.wgsl
rename to test/tint/expressions/bitcast/const/32bit/i32min-u32.wgsl
diff --git a/test/tint/expressions/bitcast/scalar/i32min-u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/32bit/i32min-u32.wgsl.expected.dxc.hlsl
similarity index 100%
rename from test/tint/expressions/bitcast/scalar/i32min-u32.wgsl.expected.dxc.hlsl
rename to test/tint/expressions/bitcast/const/32bit/i32min-u32.wgsl.expected.dxc.hlsl
diff --git a/test/tint/expressions/bitcast/scalar/i32min-u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/32bit/i32min-u32.wgsl.expected.fxc.hlsl
similarity index 100%
rename from test/tint/expressions/bitcast/scalar/i32min-u32.wgsl.expected.fxc.hlsl
rename to test/tint/expressions/bitcast/const/32bit/i32min-u32.wgsl.expected.fxc.hlsl
diff --git a/test/tint/expressions/bitcast/scalar/i32min-u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/32bit/i32min-u32.wgsl.expected.glsl
similarity index 100%
rename from test/tint/expressions/bitcast/scalar/i32min-u32.wgsl.expected.glsl
rename to test/tint/expressions/bitcast/const/32bit/i32min-u32.wgsl.expected.glsl
diff --git a/test/tint/expressions/bitcast/scalar/i32min-u32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/32bit/i32min-u32.wgsl.expected.msl
similarity index 100%
rename from test/tint/expressions/bitcast/scalar/i32min-u32.wgsl.expected.msl
rename to test/tint/expressions/bitcast/const/32bit/i32min-u32.wgsl.expected.msl
diff --git a/test/tint/expressions/bitcast/scalar/i32min-u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/32bit/i32min-u32.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/expressions/bitcast/scalar/i32min-u32.wgsl.expected.spvasm
rename to test/tint/expressions/bitcast/const/32bit/i32min-u32.wgsl.expected.spvasm
diff --git a/test/tint/expressions/bitcast/scalar/i32min-u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/32bit/i32min-u32.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/expressions/bitcast/scalar/i32min-u32.wgsl.expected.wgsl
rename to test/tint/expressions/bitcast/const/32bit/i32min-u32.wgsl.expected.wgsl
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-f32.wgsl b/test/tint/expressions/bitcast/const/32bit/u32-f32.wgsl
new file mode 100644
index 0000000..03ff35e
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : u32 = u32(1073757184u);
+    let b : f32 = bitcast<f32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/32bit/u32-f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..74d690b
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float b = 2.003662109375f;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/32bit/u32-f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..74d690b
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float b = 2.003662109375f;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/32bit/u32-f32.wgsl.expected.glsl
new file mode 100644
index 0000000..51c77db
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-f32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  float b = 2.003662109375f;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-f32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/32bit/u32-f32.wgsl.expected.msl
new file mode 100644
index 0000000..144d094
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-f32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float const b = 2.003662109375f;
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/32bit/u32-f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..5a17613
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-f32.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 7
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%float_2_00366211 = OpConstant %float 2.00366211
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/32bit/u32-f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..d45e263
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : u32 = u32(1073757184u);
+  let b : f32 = bitcast<f32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-i32.wgsl b/test/tint/expressions/bitcast/const/32bit/u32-i32.wgsl
new file mode 100644
index 0000000..dfbc0c4
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : u32 = u32(1073757184u);
+    let b : i32 = bitcast<i32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/32bit/u32-i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..619dbfe
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int b = 1073757184;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/32bit/u32-i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..619dbfe
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int b = 1073757184;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/32bit/u32-i32.wgsl.expected.glsl
new file mode 100644
index 0000000..af2a39d
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-i32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  int b = 1073757184;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-i32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/32bit/u32-i32.wgsl.expected.msl
new file mode 100644
index 0000000..7c2e677
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-i32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int const b = 1073757184;
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/32bit/u32-i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..6c1cfb8
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-i32.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 7
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%int_1073757184 = OpConstant %int 1073757184
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/32bit/u32-i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..c8c6dd4
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : u32 = u32(1073757184u);
+  let b : i32 = bitcast<i32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-u32.wgsl b/test/tint/expressions/bitcast/const/32bit/u32-u32.wgsl
new file mode 100644
index 0000000..d1fbe23
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : u32 = u32(1073757184u);
+    let b : u32 = bitcast<u32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/32bit/u32-u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..e14dc06
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint b = 1073757184u;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/32bit/u32-u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..e14dc06
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint b = 1073757184u;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/32bit/u32-u32.wgsl.expected.glsl
new file mode 100644
index 0000000..28c28d9
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-u32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  uint b = 1073757184u;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-u32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/32bit/u32-u32.wgsl.expected.msl
new file mode 100644
index 0000000..71c1a43
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-u32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint const b = 1073757184u;
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/32bit/u32-u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..1907400
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-u32.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 7
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+%uint_1073757184 = OpConstant %uint 1073757184
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/32bit/u32-u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..3659e76
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : u32 = u32(1073757184u);
+  let b : u32 = bitcast<u32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-vec2f16.wgsl b/test/tint/expressions/bitcast/const/32bit/u32-vec2f16.wgsl
new file mode 100644
index 0000000..d65a0d7
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-vec2f16.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    const a : u32 = u32(1073757184u);
+    let b : vec2<f16> = bitcast<vec2<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-vec2f16.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/32bit/u32-vec2f16.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..3c1e8f5
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-vec2f16.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 2> b = vector<float16_t, 2>(float16_t(1.0h), float16_t(2.0h));
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-vec2f16.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/32bit/u32-vec2f16.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..0a1c20d
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-vec2f16.wgsl.expected.fxc.hlsl
@@ -0,0 +1,10 @@
+SKIP: FAILED
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 2> b = vector<float16_t, 2>(float16_t(1.0h), float16_t(2.0h));
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x0000019F1F909150(3,16-24): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-vec2f16.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/32bit/u32-vec2f16.wgsl.expected.glsl
new file mode 100644
index 0000000..42774e1
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-vec2f16.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+void f() {
+  f16vec2 b = f16vec2(1.0hf, 2.0hf);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-vec2f16.wgsl.expected.msl b/test/tint/expressions/bitcast/const/32bit/u32-vec2f16.wgsl.expected.msl
new file mode 100644
index 0000000..7e90da5
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-vec2f16.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  half2 const b = half2(1.0h, 2.0h);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-vec2f16.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/32bit/u32-vec2f16.wgsl.expected.spvasm
new file mode 100644
index 0000000..a7e1c5f
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-vec2f16.wgsl.expected.spvasm
@@ -0,0 +1,25 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 10
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %half = OpTypeFloat 16
+     %v2half = OpTypeVector %half 2
+%half_0x1p_0 = OpConstant %half 0x1p+0
+%half_0x1p_1 = OpConstant %half 0x1p+1
+          %9 = OpConstantComposite %v2half %half_0x1p_0 %half_0x1p_1
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/32bit/u32-vec2f16.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/32bit/u32-vec2f16.wgsl.expected.wgsl
new file mode 100644
index 0000000..913c5e4
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/u32-vec2f16.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  const a : u32 = u32(1073757184u);
+  let b : vec2<f16> = bitcast<vec2<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-f32.wgsl b/test/tint/expressions/bitcast/const/32bit/vec2f16-f32.wgsl
new file mode 100644
index 0000000..7f48ab0
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-f32.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec2<f16> = vec2<f16>(1.0h, 2.0h);
+    let b : f32 = bitcast<f32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/32bit/vec2f16-f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..74d690b
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float b = 2.003662109375f;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/32bit/vec2f16-f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..74d690b
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float b = 2.003662109375f;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/32bit/vec2f16-f32.wgsl.expected.glsl
new file mode 100644
index 0000000..934f0a2
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-f32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+void f() {
+  float b = 2.003662109375f;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-f32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/32bit/vec2f16-f32.wgsl.expected.msl
new file mode 100644
index 0000000..144d094
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-f32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float const b = 2.003662109375f;
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/32bit/vec2f16-f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..ee881f0
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-f32.wgsl.expected.spvasm
@@ -0,0 +1,22 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 7
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%float_2_00366211 = OpConstant %float 2.00366211
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/32bit/vec2f16-f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..92ff6d3
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-f32.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec2<f16> = vec2<f16>(1.0h, 2.0h);
+  let b : f32 = bitcast<f32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-i32.wgsl b/test/tint/expressions/bitcast/const/32bit/vec2f16-i32.wgsl
new file mode 100644
index 0000000..63a8e7f
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-i32.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec2<f16> = vec2<f16>(1.0h, 2.0h);
+    let b : i32 = bitcast<i32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/32bit/vec2f16-i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..619dbfe
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int b = 1073757184;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/32bit/vec2f16-i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..619dbfe
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int b = 1073757184;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/32bit/vec2f16-i32.wgsl.expected.glsl
new file mode 100644
index 0000000..ed1e5ed
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-i32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+void f() {
+  int b = 1073757184;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-i32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/32bit/vec2f16-i32.wgsl.expected.msl
new file mode 100644
index 0000000..7c2e677
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-i32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int const b = 1073757184;
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/32bit/vec2f16-i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..a9f67a8
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-i32.wgsl.expected.spvasm
@@ -0,0 +1,22 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 7
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%int_1073757184 = OpConstant %int 1073757184
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/32bit/vec2f16-i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..33eeed8
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-i32.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec2<f16> = vec2<f16>(1.0h, 2.0h);
+  let b : i32 = bitcast<i32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-u32.wgsl b/test/tint/expressions/bitcast/const/32bit/vec2f16-u32.wgsl
new file mode 100644
index 0000000..3d053e9
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-u32.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec2<f16> = vec2<f16>(1.0h, 2.0h);
+    let b : u32 = bitcast<u32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/32bit/vec2f16-u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..e14dc06
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint b = 1073757184u;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/32bit/vec2f16-u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..e14dc06
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint b = 1073757184u;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/32bit/vec2f16-u32.wgsl.expected.glsl
new file mode 100644
index 0000000..df15916
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-u32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+void f() {
+  uint b = 1073757184u;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-u32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/32bit/vec2f16-u32.wgsl.expected.msl
new file mode 100644
index 0000000..71c1a43
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-u32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint const b = 1073757184u;
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/32bit/vec2f16-u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..5f8fc37
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-u32.wgsl.expected.spvasm
@@ -0,0 +1,22 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 7
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+%uint_1073757184 = OpConstant %uint 1073757184
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/32bit/vec2f16-u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..9f19995
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-u32.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec2<f16> = vec2<f16>(1.0h, 2.0h);
+  let b : u32 = bitcast<u32>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-vec2f16.wgsl b/test/tint/expressions/bitcast/const/32bit/vec2f16-vec2f16.wgsl
new file mode 100644
index 0000000..eff03f1
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-vec2f16.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec2<f16> = vec2<f16>(1.0h, 2.0h);
+    let b : vec2<f16> = bitcast<vec2<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-vec2f16.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/32bit/vec2f16-vec2f16.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..3c1e8f5
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-vec2f16.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 2> b = vector<float16_t, 2>(float16_t(1.0h), float16_t(2.0h));
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-vec2f16.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/32bit/vec2f16-vec2f16.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..01f06ac
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-vec2f16.wgsl.expected.fxc.hlsl
@@ -0,0 +1,10 @@
+SKIP: FAILED
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 2> b = vector<float16_t, 2>(float16_t(1.0h), float16_t(2.0h));
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x000001479B346D10(3,16-24): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-vec2f16.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/32bit/vec2f16-vec2f16.wgsl.expected.glsl
new file mode 100644
index 0000000..42774e1
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-vec2f16.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+void f() {
+  f16vec2 b = f16vec2(1.0hf, 2.0hf);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-vec2f16.wgsl.expected.msl b/test/tint/expressions/bitcast/const/32bit/vec2f16-vec2f16.wgsl.expected.msl
new file mode 100644
index 0000000..7e90da5
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-vec2f16.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  half2 const b = half2(1.0h, 2.0h);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-vec2f16.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/32bit/vec2f16-vec2f16.wgsl.expected.spvasm
new file mode 100644
index 0000000..a7e1c5f
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-vec2f16.wgsl.expected.spvasm
@@ -0,0 +1,25 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 10
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %half = OpTypeFloat 16
+     %v2half = OpTypeVector %half 2
+%half_0x1p_0 = OpConstant %half 0x1p+0
+%half_0x1p_1 = OpConstant %half 0x1p+1
+          %9 = OpConstantComposite %v2half %half_0x1p_0 %half_0x1p_1
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/32bit/vec2f16-vec2f16.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/32bit/vec2f16-vec2f16.wgsl.expected.wgsl
new file mode 100644
index 0000000..7013b94
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/32bit/vec2f16-vec2f16.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec2<f16> = vec2<f16>(1.0h, 2.0h);
+  let b : vec2<f16> = bitcast<vec2<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/48bit/vec3f16-vec3f16.wgsl b/test/tint/expressions/bitcast/const/48bit/vec3f16-vec3f16.wgsl
new file mode 100644
index 0000000..3021b70
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/48bit/vec3f16-vec3f16.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec3<f16> = vec3<f16>(1.0h, 2.0h, 3.0h);
+    let b : vec3<f16> = bitcast<vec3<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/48bit/vec3f16-vec3f16.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/48bit/vec3f16-vec3f16.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..75f08e6
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/48bit/vec3f16-vec3f16.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 3> b = vector<float16_t, 3>(float16_t(1.0h), float16_t(2.0h), float16_t(3.0h));
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/48bit/vec3f16-vec3f16.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/48bit/vec3f16-vec3f16.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..a262b65
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/48bit/vec3f16-vec3f16.wgsl.expected.fxc.hlsl
@@ -0,0 +1,10 @@
+SKIP: FAILED
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 3> b = vector<float16_t, 3>(float16_t(1.0h), float16_t(2.0h), float16_t(3.0h));
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x000001DFC5A48C70(3,16-24): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/expressions/bitcast/const/48bit/vec3f16-vec3f16.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/48bit/vec3f16-vec3f16.wgsl.expected.glsl
new file mode 100644
index 0000000..ddfdfe0
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/48bit/vec3f16-vec3f16.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+void f() {
+  f16vec3 b = f16vec3(1.0hf, 2.0hf, 3.0hf);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/48bit/vec3f16-vec3f16.wgsl.expected.msl b/test/tint/expressions/bitcast/const/48bit/vec3f16-vec3f16.wgsl.expected.msl
new file mode 100644
index 0000000..76da41c
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/48bit/vec3f16-vec3f16.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  half3 const b = half3(1.0h, 2.0h, 3.0h);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/48bit/vec3f16-vec3f16.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/48bit/vec3f16-vec3f16.wgsl.expected.spvasm
new file mode 100644
index 0000000..9d86054
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/48bit/vec3f16-vec3f16.wgsl.expected.spvasm
@@ -0,0 +1,26 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 11
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %half = OpTypeFloat 16
+     %v3half = OpTypeVector %half 3
+%half_0x1p_0 = OpConstant %half 0x1p+0
+%half_0x1p_1 = OpConstant %half 0x1p+1
+%half_0x1_8p_1 = OpConstant %half 0x1.8p+1
+         %10 = OpConstantComposite %v3half %half_0x1p_0 %half_0x1p_1 %half_0x1_8p_1
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/48bit/vec3f16-vec3f16.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/48bit/vec3f16-vec3f16.wgsl.expected.wgsl
new file mode 100644
index 0000000..80438c5
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/48bit/vec3f16-vec3f16.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec3<f16> = vec3<f16>(1.0h, 2.0h, 3.0h);
+  let b : vec3<f16> = bitcast<vec3<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2f32.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2f32.wgsl
new file mode 100644
index 0000000..3e8ee3b
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec2<f32> = vec2<f32>(2.003662109375f, -513.03125f);
+    let b : vec2<f32> = bitcast<vec2<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..cda5ceb
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float2 b = float2(2.003662109375f, -513.03125f);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..cda5ceb
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float2 b = float2(2.003662109375f, -513.03125f);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2f32.wgsl.expected.glsl
new file mode 100644
index 0000000..f979549
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2f32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  vec2 b = vec2(2.003662109375f, -513.03125f);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2f32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2f32.wgsl.expected.msl
new file mode 100644
index 0000000..ed24fba
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2f32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float2 const b = float2(2.003662109375f, -513.03125f);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..9534471
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2f32.wgsl.expected.spvasm
@@ -0,0 +1,21 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 10
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%float_2_00366211 = OpConstant %float 2.00366211
+%float_n513_03125 = OpConstant %float -513.03125
+          %9 = OpConstantComposite %v2float %float_2_00366211 %float_n513_03125
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..c127f6d
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec2<f32> = vec2<f32>(2.003662109375f, -(513.03125f));
+  let b : vec2<f32> = bitcast<vec2<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2i32.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2i32.wgsl
new file mode 100644
index 0000000..793fc6e
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec2<f32> = vec2<f32>(2.003662109375f, -513.03125f);
+    let b : vec2<i32> = bitcast<vec2<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..60ca20a
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int2 b = int2(1073757184, -1006616064);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..60ca20a
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int2 b = int2(1073757184, -1006616064);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2i32.wgsl.expected.glsl
new file mode 100644
index 0000000..9703853
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2i32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  ivec2 b = ivec2(1073757184, -1006616064);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2i32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2i32.wgsl.expected.msl
new file mode 100644
index 0000000..e826aeb
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2i32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int2 const b = int2(1073757184, -1006616064);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..592cfc5
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2i32.wgsl.expected.spvasm
@@ -0,0 +1,21 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 10
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%int_1073757184 = OpConstant %int 1073757184
+%int_n1006616064 = OpConstant %int -1006616064
+          %9 = OpConstantComposite %v2int %int_1073757184 %int_n1006616064
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..1b1bf8c
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec2<f32> = vec2<f32>(2.003662109375f, -(513.03125f));
+  let b : vec2<i32> = bitcast<vec2<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2u32.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2u32.wgsl
new file mode 100644
index 0000000..e69d96b
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec2<f32> = vec2<f32>(2.003662109375f, -513.03125f);
+    let b : vec2<u32> = bitcast<vec2<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..88bf5cd
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint2 b = uint2(1073757184u, 3288351232u);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..88bf5cd
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint2 b = uint2(1073757184u, 3288351232u);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2u32.wgsl.expected.glsl
new file mode 100644
index 0000000..b8dd2cb
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2u32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  uvec2 b = uvec2(1073757184u, 3288351232u);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2u32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2u32.wgsl.expected.msl
new file mode 100644
index 0000000..6450fca
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2u32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint2 const b = uint2(1073757184u, 3288351232u);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..56d55cc
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2u32.wgsl.expected.spvasm
@@ -0,0 +1,21 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 10
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+%uint_1073757184 = OpConstant %uint 1073757184
+%uint_3288351232 = OpConstant %uint 3288351232
+          %9 = OpConstantComposite %v2uint %uint_1073757184 %uint_3288351232
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..9543acf
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec2u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec2<f32> = vec2<f32>(2.003662109375f, -(513.03125f));
+  let b : vec2<u32> = bitcast<vec2<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec4f16.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec4f16.wgsl
new file mode 100644
index 0000000..29e8ed7
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec4f16.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec2<f32> = vec2<f32>(2.003662109375f, -513.03125f);
+    let b : vec4<f16> = bitcast<vec4<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec4f16.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec4f16.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..ebb0eae
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec4f16.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 4> b = vector<float16_t, 4>(float16_t(1.0h), float16_t(2.0h), float16_t(3.0h), float16_t(-4.0h));
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec4f16.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec4f16.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..77d3087
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec4f16.wgsl.expected.fxc.hlsl
@@ -0,0 +1,10 @@
+SKIP: FAILED
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 4> b = vector<float16_t, 4>(float16_t(1.0h), float16_t(2.0h), float16_t(3.0h), float16_t(-4.0h));
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x000001FA6B336DC0(3,16-24): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec4f16.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec4f16.wgsl.expected.glsl
new file mode 100644
index 0000000..2050bef
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec4f16.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+void f() {
+  f16vec4 b = f16vec4(1.0hf, 2.0hf, 3.0hf, -4.0hf);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec4f16.wgsl.expected.msl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec4f16.wgsl.expected.msl
new file mode 100644
index 0000000..b867191
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec4f16.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  half4 const b = half4(1.0h, 2.0h, 3.0h, -4.0h);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec4f16.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec4f16.wgsl.expected.spvasm
new file mode 100644
index 0000000..11e4952
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec4f16.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 12
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %half = OpTypeFloat 16
+     %v4half = OpTypeVector %half 4
+%half_0x1p_0 = OpConstant %half 0x1p+0
+%half_0x1p_1 = OpConstant %half 0x1p+1
+%half_0x1_8p_1 = OpConstant %half 0x1.8p+1
+%half_n0x1p_2 = OpConstant %half -0x1p+2
+         %11 = OpConstantComposite %v4half %half_0x1p_0 %half_0x1p_1 %half_0x1_8p_1 %half_n0x1p_2
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2f32-vec4f16.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec4f16.wgsl.expected.wgsl
new file mode 100644
index 0000000..93a16c4
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2f32-vec4f16.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec2<f32> = vec2<f32>(2.003662109375f, -(513.03125f));
+  let b : vec4<f16> = bitcast<vec4<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2f32.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2f32.wgsl
new file mode 100644
index 0000000..925cda5
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec2<i32> = vec2<i32>(1073757184i, -1006616064i);
+    let b : vec2<f32> = bitcast<vec2<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..cda5ceb
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float2 b = float2(2.003662109375f, -513.03125f);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..cda5ceb
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float2 b = float2(2.003662109375f, -513.03125f);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2f32.wgsl.expected.glsl
new file mode 100644
index 0000000..f979549
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2f32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  vec2 b = vec2(2.003662109375f, -513.03125f);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2f32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2f32.wgsl.expected.msl
new file mode 100644
index 0000000..ed24fba
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2f32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float2 const b = float2(2.003662109375f, -513.03125f);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..9534471
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2f32.wgsl.expected.spvasm
@@ -0,0 +1,21 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 10
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%float_2_00366211 = OpConstant %float 2.00366211
+%float_n513_03125 = OpConstant %float -513.03125
+          %9 = OpConstantComposite %v2float %float_2_00366211 %float_n513_03125
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..d049343
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec2<i32> = vec2<i32>(1073757184i, -(1006616064i));
+  let b : vec2<f32> = bitcast<vec2<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2i32.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2i32.wgsl
new file mode 100644
index 0000000..b42d378
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec2<i32> = vec2<i32>(1073757184i, -1006616064i);
+    let b : vec2<i32> = bitcast<vec2<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..60ca20a
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int2 b = int2(1073757184, -1006616064);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..60ca20a
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int2 b = int2(1073757184, -1006616064);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2i32.wgsl.expected.glsl
new file mode 100644
index 0000000..9703853
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2i32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  ivec2 b = ivec2(1073757184, -1006616064);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2i32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2i32.wgsl.expected.msl
new file mode 100644
index 0000000..e826aeb
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2i32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int2 const b = int2(1073757184, -1006616064);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..592cfc5
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2i32.wgsl.expected.spvasm
@@ -0,0 +1,21 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 10
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%int_1073757184 = OpConstant %int 1073757184
+%int_n1006616064 = OpConstant %int -1006616064
+          %9 = OpConstantComposite %v2int %int_1073757184 %int_n1006616064
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..2201a0f
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec2<i32> = vec2<i32>(1073757184i, -(1006616064i));
+  let b : vec2<i32> = bitcast<vec2<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2u32.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2u32.wgsl
new file mode 100644
index 0000000..3e1d56e
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec2<i32> = vec2<i32>(1073757184i, -1006616064i);
+    let b : vec2<u32> = bitcast<vec2<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..88bf5cd
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint2 b = uint2(1073757184u, 3288351232u);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..88bf5cd
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint2 b = uint2(1073757184u, 3288351232u);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2u32.wgsl.expected.glsl
new file mode 100644
index 0000000..b8dd2cb
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2u32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  uvec2 b = uvec2(1073757184u, 3288351232u);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2u32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2u32.wgsl.expected.msl
new file mode 100644
index 0000000..6450fca
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2u32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint2 const b = uint2(1073757184u, 3288351232u);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..56d55cc
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2u32.wgsl.expected.spvasm
@@ -0,0 +1,21 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 10
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+%uint_1073757184 = OpConstant %uint 1073757184
+%uint_3288351232 = OpConstant %uint 3288351232
+          %9 = OpConstantComposite %v2uint %uint_1073757184 %uint_3288351232
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..631be75
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec2u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec2<i32> = vec2<i32>(1073757184i, -(1006616064i));
+  let b : vec2<u32> = bitcast<vec2<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec4f16.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec4f16.wgsl
new file mode 100644
index 0000000..f7359dc
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec4f16.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec2<i32> = vec2<i32>(1073757184i, -1006616064i);
+    let b : vec4<f16> = bitcast<vec4<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec4f16.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec4f16.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..ebb0eae
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec4f16.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 4> b = vector<float16_t, 4>(float16_t(1.0h), float16_t(2.0h), float16_t(3.0h), float16_t(-4.0h));
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec4f16.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec4f16.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..e75de80
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec4f16.wgsl.expected.fxc.hlsl
@@ -0,0 +1,10 @@
+SKIP: FAILED
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 4> b = vector<float16_t, 4>(float16_t(1.0h), float16_t(2.0h), float16_t(3.0h), float16_t(-4.0h));
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x0000020858736DC0(3,16-24): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec4f16.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec4f16.wgsl.expected.glsl
new file mode 100644
index 0000000..2050bef
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec4f16.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+void f() {
+  f16vec4 b = f16vec4(1.0hf, 2.0hf, 3.0hf, -4.0hf);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec4f16.wgsl.expected.msl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec4f16.wgsl.expected.msl
new file mode 100644
index 0000000..b867191
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec4f16.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  half4 const b = half4(1.0h, 2.0h, 3.0h, -4.0h);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec4f16.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec4f16.wgsl.expected.spvasm
new file mode 100644
index 0000000..11e4952
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec4f16.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 12
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %half = OpTypeFloat 16
+     %v4half = OpTypeVector %half 4
+%half_0x1p_0 = OpConstant %half 0x1p+0
+%half_0x1p_1 = OpConstant %half 0x1p+1
+%half_0x1_8p_1 = OpConstant %half 0x1.8p+1
+%half_n0x1p_2 = OpConstant %half -0x1p+2
+         %11 = OpConstantComposite %v4half %half_0x1p_0 %half_0x1p_1 %half_0x1_8p_1 %half_n0x1p_2
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2i32-vec4f16.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec4f16.wgsl.expected.wgsl
new file mode 100644
index 0000000..c918801
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2i32-vec4f16.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec2<i32> = vec2<i32>(1073757184i, -(1006616064i));
+  let b : vec4<f16> = bitcast<vec4<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2f32.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2f32.wgsl
new file mode 100644
index 0000000..18897e8
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec2<u32> = vec2<u32>(1073757184u, 3288351232u);
+    let b : vec2<f32> = bitcast<vec2<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..cda5ceb
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float2 b = float2(2.003662109375f, -513.03125f);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..cda5ceb
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float2 b = float2(2.003662109375f, -513.03125f);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2f32.wgsl.expected.glsl
new file mode 100644
index 0000000..f979549
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2f32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  vec2 b = vec2(2.003662109375f, -513.03125f);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2f32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2f32.wgsl.expected.msl
new file mode 100644
index 0000000..ed24fba
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2f32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float2 const b = float2(2.003662109375f, -513.03125f);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..9534471
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2f32.wgsl.expected.spvasm
@@ -0,0 +1,21 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 10
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%float_2_00366211 = OpConstant %float 2.00366211
+%float_n513_03125 = OpConstant %float -513.03125
+          %9 = OpConstantComposite %v2float %float_2_00366211 %float_n513_03125
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..5944fd4
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec2<u32> = vec2<u32>(1073757184u, 3288351232u);
+  let b : vec2<f32> = bitcast<vec2<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2i32.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2i32.wgsl
new file mode 100644
index 0000000..6bbf183
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec2<u32> = vec2<u32>(1073757184u, 3288351232u);
+    let b : vec2<i32> = bitcast<vec2<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..60ca20a
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int2 b = int2(1073757184, -1006616064);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..60ca20a
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int2 b = int2(1073757184, -1006616064);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2i32.wgsl.expected.glsl
new file mode 100644
index 0000000..9703853
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2i32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  ivec2 b = ivec2(1073757184, -1006616064);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2i32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2i32.wgsl.expected.msl
new file mode 100644
index 0000000..e826aeb
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2i32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int2 const b = int2(1073757184, -1006616064);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..592cfc5
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2i32.wgsl.expected.spvasm
@@ -0,0 +1,21 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 10
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%int_1073757184 = OpConstant %int 1073757184
+%int_n1006616064 = OpConstant %int -1006616064
+          %9 = OpConstantComposite %v2int %int_1073757184 %int_n1006616064
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..f5eb95b
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec2<u32> = vec2<u32>(1073757184u, 3288351232u);
+  let b : vec2<i32> = bitcast<vec2<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2u32.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2u32.wgsl
new file mode 100644
index 0000000..a4fd6aa
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec2<u32> = vec2<u32>(1073757184u, 3288351232u);
+    let b : vec2<u32> = bitcast<vec2<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..88bf5cd
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint2 b = uint2(1073757184u, 3288351232u);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..88bf5cd
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint2 b = uint2(1073757184u, 3288351232u);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2u32.wgsl.expected.glsl
new file mode 100644
index 0000000..b8dd2cb
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2u32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  uvec2 b = uvec2(1073757184u, 3288351232u);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2u32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2u32.wgsl.expected.msl
new file mode 100644
index 0000000..6450fca
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2u32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint2 const b = uint2(1073757184u, 3288351232u);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..56d55cc
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2u32.wgsl.expected.spvasm
@@ -0,0 +1,21 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 10
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+%uint_1073757184 = OpConstant %uint 1073757184
+%uint_3288351232 = OpConstant %uint 3288351232
+          %9 = OpConstantComposite %v2uint %uint_1073757184 %uint_3288351232
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..8566318
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec2u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec2<u32> = vec2<u32>(1073757184u, 3288351232u);
+  let b : vec2<u32> = bitcast<vec2<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec4f16.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec4f16.wgsl
new file mode 100644
index 0000000..0e2d0f8
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec4f16.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec2<u32> = vec2<u32>(1073757184u, 3288351232u);
+    let b : vec4<f16> = bitcast<vec4<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec4f16.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec4f16.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..ebb0eae
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec4f16.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 4> b = vector<float16_t, 4>(float16_t(1.0h), float16_t(2.0h), float16_t(3.0h), float16_t(-4.0h));
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec4f16.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec4f16.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..38ac64e
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec4f16.wgsl.expected.fxc.hlsl
@@ -0,0 +1,10 @@
+SKIP: FAILED
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 4> b = vector<float16_t, 4>(float16_t(1.0h), float16_t(2.0h), float16_t(3.0h), float16_t(-4.0h));
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x000001E2E40D90C0(3,16-24): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec4f16.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec4f16.wgsl.expected.glsl
new file mode 100644
index 0000000..2050bef
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec4f16.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+void f() {
+  f16vec4 b = f16vec4(1.0hf, 2.0hf, 3.0hf, -4.0hf);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec4f16.wgsl.expected.msl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec4f16.wgsl.expected.msl
new file mode 100644
index 0000000..b867191
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec4f16.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  half4 const b = half4(1.0h, 2.0h, 3.0h, -4.0h);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec4f16.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec4f16.wgsl.expected.spvasm
new file mode 100644
index 0000000..11e4952
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec4f16.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 12
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %half = OpTypeFloat 16
+     %v4half = OpTypeVector %half 4
+%half_0x1p_0 = OpConstant %half 0x1p+0
+%half_0x1p_1 = OpConstant %half 0x1p+1
+%half_0x1_8p_1 = OpConstant %half 0x1.8p+1
+%half_n0x1p_2 = OpConstant %half -0x1p+2
+         %11 = OpConstantComposite %v4half %half_0x1p_0 %half_0x1p_1 %half_0x1_8p_1 %half_n0x1p_2
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/64bit/vec2u32-vec4f16.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec4f16.wgsl.expected.wgsl
new file mode 100644
index 0000000..e493936
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec2u32-vec4f16.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec2<u32> = vec2<u32>(1073757184u, 3288351232u);
+  let b : vec4<f16> = bitcast<vec4<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2f32.wgsl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2f32.wgsl
new file mode 100644
index 0000000..8ec54d1
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2f32.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec4<f16> = vec4<f16>(1.0h, 2.0h, 3.0h, -4.0h);
+    let b : vec2<f32> = bitcast<vec2<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..cda5ceb
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float2 b = float2(2.003662109375f, -513.03125f);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..cda5ceb
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float2 b = float2(2.003662109375f, -513.03125f);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2f32.wgsl.expected.glsl
new file mode 100644
index 0000000..3d83aae
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2f32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+void f() {
+  vec2 b = vec2(2.003662109375f, -513.03125f);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2f32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2f32.wgsl.expected.msl
new file mode 100644
index 0000000..ed24fba
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2f32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float2 const b = float2(2.003662109375f, -513.03125f);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..7093b1e
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2f32.wgsl.expected.spvasm
@@ -0,0 +1,25 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 10
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%float_2_00366211 = OpConstant %float 2.00366211
+%float_n513_03125 = OpConstant %float -513.03125
+          %9 = OpConstantComposite %v2float %float_2_00366211 %float_n513_03125
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..d75f90d
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2f32.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec4<f16> = vec4<f16>(1.0h, 2.0h, 3.0h, -(4.0h));
+  let b : vec2<f32> = bitcast<vec2<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2i32.wgsl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2i32.wgsl
new file mode 100644
index 0000000..1ae6c59
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2i32.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec4<f16> = vec4<f16>(1.0h, 2.0h, 3.0h, -4.0h);
+    let b : vec2<i32> = bitcast<vec2<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..60ca20a
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int2 b = int2(1073757184, -1006616064);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..60ca20a
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int2 b = int2(1073757184, -1006616064);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2i32.wgsl.expected.glsl
new file mode 100644
index 0000000..5910cd2
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2i32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+void f() {
+  ivec2 b = ivec2(1073757184, -1006616064);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2i32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2i32.wgsl.expected.msl
new file mode 100644
index 0000000..e826aeb
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2i32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int2 const b = int2(1073757184, -1006616064);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..803f193
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2i32.wgsl.expected.spvasm
@@ -0,0 +1,25 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 10
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%int_1073757184 = OpConstant %int 1073757184
+%int_n1006616064 = OpConstant %int -1006616064
+          %9 = OpConstantComposite %v2int %int_1073757184 %int_n1006616064
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..4bf16a8
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2i32.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec4<f16> = vec4<f16>(1.0h, 2.0h, 3.0h, -(4.0h));
+  let b : vec2<i32> = bitcast<vec2<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2u32.wgsl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2u32.wgsl
new file mode 100644
index 0000000..934d097
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2u32.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec4<f16> = vec4<f16>(1.0h, 2.0h, 3.0h, -4.0h);
+    let b : vec2<u32> = bitcast<vec2<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..88bf5cd
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint2 b = uint2(1073757184u, 3288351232u);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..88bf5cd
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint2 b = uint2(1073757184u, 3288351232u);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2u32.wgsl.expected.glsl
new file mode 100644
index 0000000..4b9dafc
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2u32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+void f() {
+  uvec2 b = uvec2(1073757184u, 3288351232u);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2u32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2u32.wgsl.expected.msl
new file mode 100644
index 0000000..6450fca
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2u32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint2 const b = uint2(1073757184u, 3288351232u);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..2cf5037
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2u32.wgsl.expected.spvasm
@@ -0,0 +1,25 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 10
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+%uint_1073757184 = OpConstant %uint 1073757184
+%uint_3288351232 = OpConstant %uint 3288351232
+          %9 = OpConstantComposite %v2uint %uint_1073757184 %uint_3288351232
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..d6eab69
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec2u32.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec4<f16> = vec4<f16>(1.0h, 2.0h, 3.0h, -(4.0h));
+  let b : vec2<u32> = bitcast<vec2<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec4f16.wgsl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec4f16.wgsl
new file mode 100644
index 0000000..1e5be4d
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec4f16.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec4<f16> = vec4<f16>(1.0h, 2.0h, 3.0h, -4.0h);
+    let b : vec4<f16> = bitcast<vec4<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec4f16.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec4f16.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..ebb0eae
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec4f16.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 4> b = vector<float16_t, 4>(float16_t(1.0h), float16_t(2.0h), float16_t(3.0h), float16_t(-4.0h));
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec4f16.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec4f16.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..8d58535
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec4f16.wgsl.expected.fxc.hlsl
@@ -0,0 +1,10 @@
+SKIP: FAILED
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 4> b = vector<float16_t, 4>(float16_t(1.0h), float16_t(2.0h), float16_t(3.0h), float16_t(-4.0h));
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x000002A182AC9D70(3,16-24): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec4f16.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec4f16.wgsl.expected.glsl
new file mode 100644
index 0000000..2050bef
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec4f16.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+void f() {
+  f16vec4 b = f16vec4(1.0hf, 2.0hf, 3.0hf, -4.0hf);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec4f16.wgsl.expected.msl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec4f16.wgsl.expected.msl
new file mode 100644
index 0000000..b867191
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec4f16.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  half4 const b = half4(1.0h, 2.0h, 3.0h, -4.0h);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec4f16.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec4f16.wgsl.expected.spvasm
new file mode 100644
index 0000000..11e4952
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec4f16.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 12
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %half = OpTypeFloat 16
+     %v4half = OpTypeVector %half 4
+%half_0x1p_0 = OpConstant %half 0x1p+0
+%half_0x1p_1 = OpConstant %half 0x1p+1
+%half_0x1_8p_1 = OpConstant %half 0x1.8p+1
+%half_n0x1p_2 = OpConstant %half -0x1p+2
+         %11 = OpConstantComposite %v4half %half_0x1p_0 %half_0x1p_1 %half_0x1_8p_1 %half_n0x1p_2
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/64bit/vec4f16-vec4f16.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec4f16.wgsl.expected.wgsl
new file mode 100644
index 0000000..f8c7646
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/64bit/vec4f16-vec4f16.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec4<f16> = vec4<f16>(1.0h, 2.0h, 3.0h, -(4.0h));
+  let b : vec4<f16> = bitcast<vec4<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3f32.wgsl b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3f32.wgsl
new file mode 100644
index 0000000..a91372f
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec3<f32> = vec3<f32>(2.003662109375f, -513.03125f, -1024.25f);
+    let b : vec3<f32> = bitcast<vec3<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..d631018
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float3 b = float3(2.003662109375f, -513.03125f, -1024.25f);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..d631018
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float3 b = float3(2.003662109375f, -513.03125f, -1024.25f);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3f32.wgsl.expected.glsl
new file mode 100644
index 0000000..bd5fdc6
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3f32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  vec3 b = vec3(2.003662109375f, -513.03125f, -1024.25f);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3f32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3f32.wgsl.expected.msl
new file mode 100644
index 0000000..2d3af60
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3f32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float3 const b = float3(2.003662109375f, -513.03125f, -1024.25f);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..6b52a4e
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3f32.wgsl.expected.spvasm
@@ -0,0 +1,22 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 11
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%float_2_00366211 = OpConstant %float 2.00366211
+%float_n513_03125 = OpConstant %float -513.03125
+%float_n1024_25 = OpConstant %float -1024.25
+         %10 = OpConstantComposite %v3float %float_2_00366211 %float_n513_03125 %float_n1024_25
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..faa3f1f
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec3<f32> = vec3<f32>(2.003662109375f, -(513.03125f), -(1024.25f));
+  let b : vec3<f32> = bitcast<vec3<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3i32.wgsl b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3i32.wgsl
new file mode 100644
index 0000000..5d1abea
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec3<f32> = vec3<f32>(2.003662109375f, -513.03125f, -1024.25f);
+    let b : vec3<i32> = bitcast<vec3<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..3e835c7
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int3 b = int3(1073757184, -1006616064, -998242304);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..3e835c7
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int3 b = int3(1073757184, -1006616064, -998242304);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3i32.wgsl.expected.glsl
new file mode 100644
index 0000000..1a8e9d1
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3i32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  ivec3 b = ivec3(1073757184, -1006616064, -998242304);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3i32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3i32.wgsl.expected.msl
new file mode 100644
index 0000000..75ef1c1
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3i32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int3 const b = int3(1073757184, -1006616064, -998242304);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..bb86c5a
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3i32.wgsl.expected.spvasm
@@ -0,0 +1,22 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 11
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v3int = OpTypeVector %int 3
+%int_1073757184 = OpConstant %int 1073757184
+%int_n1006616064 = OpConstant %int -1006616064
+%int_n998242304 = OpConstant %int -998242304
+         %10 = OpConstantComposite %v3int %int_1073757184 %int_n1006616064 %int_n998242304
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..73156b3
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec3<f32> = vec3<f32>(2.003662109375f, -(513.03125f), -(1024.25f));
+  let b : vec3<i32> = bitcast<vec3<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3u32.wgsl b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3u32.wgsl
new file mode 100644
index 0000000..56b0874
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec3<f32> = vec3<f32>(2.003662109375f, -513.03125f, -1024.25f);
+    let b : vec3<u32> = bitcast<vec3<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..9b93c9c
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint3 b = uint3(1073757184u, 3288351232u, 3296724992u);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..9b93c9c
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint3 b = uint3(1073757184u, 3288351232u, 3296724992u);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3u32.wgsl.expected.glsl
new file mode 100644
index 0000000..543b5ef
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3u32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  uvec3 b = uvec3(1073757184u, 3288351232u, 3296724992u);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3u32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3u32.wgsl.expected.msl
new file mode 100644
index 0000000..35e1029
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3u32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint3 const b = uint3(1073757184u, 3288351232u, 3296724992u);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..7ddc81b
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3u32.wgsl.expected.spvasm
@@ -0,0 +1,22 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 11
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%uint_1073757184 = OpConstant %uint 1073757184
+%uint_3288351232 = OpConstant %uint 3288351232
+%uint_3296724992 = OpConstant %uint 3296724992
+         %10 = OpConstantComposite %v3uint %uint_1073757184 %uint_3288351232 %uint_3296724992
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..77ab83c
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3f32-vec3u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec3<f32> = vec3<f32>(2.003662109375f, -(513.03125f), -(1024.25f));
+  let b : vec3<u32> = bitcast<vec3<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3f32.wgsl b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3f32.wgsl
new file mode 100644
index 0000000..6127f74
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec3<i32> = vec3<i32>(1073757184i, -1006616064i, -998242304i);
+    let b : vec3<f32> = bitcast<vec3<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..d631018
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float3 b = float3(2.003662109375f, -513.03125f, -1024.25f);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..d631018
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float3 b = float3(2.003662109375f, -513.03125f, -1024.25f);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3f32.wgsl.expected.glsl
new file mode 100644
index 0000000..bd5fdc6
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3f32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  vec3 b = vec3(2.003662109375f, -513.03125f, -1024.25f);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3f32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3f32.wgsl.expected.msl
new file mode 100644
index 0000000..2d3af60
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3f32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float3 const b = float3(2.003662109375f, -513.03125f, -1024.25f);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..6b52a4e
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3f32.wgsl.expected.spvasm
@@ -0,0 +1,22 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 11
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%float_2_00366211 = OpConstant %float 2.00366211
+%float_n513_03125 = OpConstant %float -513.03125
+%float_n1024_25 = OpConstant %float -1024.25
+         %10 = OpConstantComposite %v3float %float_2_00366211 %float_n513_03125 %float_n1024_25
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..5bb3552
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec3<i32> = vec3<i32>(1073757184i, -(1006616064i), -(998242304i));
+  let b : vec3<f32> = bitcast<vec3<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3i32.wgsl b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3i32.wgsl
new file mode 100644
index 0000000..da32629
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec3<i32> = vec3<i32>(1073757184i, -1006616064i, -998242304i);
+    let b : vec3<i32> = bitcast<vec3<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..3e835c7
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int3 b = int3(1073757184, -1006616064, -998242304);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..3e835c7
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int3 b = int3(1073757184, -1006616064, -998242304);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3i32.wgsl.expected.glsl
new file mode 100644
index 0000000..1a8e9d1
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3i32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  ivec3 b = ivec3(1073757184, -1006616064, -998242304);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3i32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3i32.wgsl.expected.msl
new file mode 100644
index 0000000..75ef1c1
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3i32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int3 const b = int3(1073757184, -1006616064, -998242304);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..bb86c5a
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3i32.wgsl.expected.spvasm
@@ -0,0 +1,22 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 11
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v3int = OpTypeVector %int 3
+%int_1073757184 = OpConstant %int 1073757184
+%int_n1006616064 = OpConstant %int -1006616064
+%int_n998242304 = OpConstant %int -998242304
+         %10 = OpConstantComposite %v3int %int_1073757184 %int_n1006616064 %int_n998242304
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..85e2323
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec3<i32> = vec3<i32>(1073757184i, -(1006616064i), -(998242304i));
+  let b : vec3<i32> = bitcast<vec3<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3u32.wgsl b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3u32.wgsl
new file mode 100644
index 0000000..dc0be93
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec3<i32> = vec3<i32>(1073757184i, -1006616064i, -998242304i);
+    let b : vec3<u32> = bitcast<vec3<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..9b93c9c
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint3 b = uint3(1073757184u, 3288351232u, 3296724992u);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..9b93c9c
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint3 b = uint3(1073757184u, 3288351232u, 3296724992u);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3u32.wgsl.expected.glsl
new file mode 100644
index 0000000..543b5ef
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3u32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  uvec3 b = uvec3(1073757184u, 3288351232u, 3296724992u);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3u32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3u32.wgsl.expected.msl
new file mode 100644
index 0000000..35e1029
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3u32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint3 const b = uint3(1073757184u, 3288351232u, 3296724992u);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..7ddc81b
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3u32.wgsl.expected.spvasm
@@ -0,0 +1,22 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 11
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%uint_1073757184 = OpConstant %uint 1073757184
+%uint_3288351232 = OpConstant %uint 3288351232
+%uint_3296724992 = OpConstant %uint 3296724992
+         %10 = OpConstantComposite %v3uint %uint_1073757184 %uint_3288351232 %uint_3296724992
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..a323cd3
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3i32-vec3u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec3<i32> = vec3<i32>(1073757184i, -(1006616064i), -(998242304i));
+  let b : vec3<u32> = bitcast<vec3<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3f32.wgsl b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3f32.wgsl
new file mode 100644
index 0000000..93f22ad
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec3<u32> = vec3<u32>(1073757184u, 3288351232u, 3296724992u);
+    let b : vec3<f32> = bitcast<vec3<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..d631018
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float3 b = float3(2.003662109375f, -513.03125f, -1024.25f);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..d631018
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float3 b = float3(2.003662109375f, -513.03125f, -1024.25f);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3f32.wgsl.expected.glsl
new file mode 100644
index 0000000..bd5fdc6
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3f32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  vec3 b = vec3(2.003662109375f, -513.03125f, -1024.25f);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3f32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3f32.wgsl.expected.msl
new file mode 100644
index 0000000..2d3af60
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3f32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float3 const b = float3(2.003662109375f, -513.03125f, -1024.25f);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..6b52a4e
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3f32.wgsl.expected.spvasm
@@ -0,0 +1,22 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 11
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%float_2_00366211 = OpConstant %float 2.00366211
+%float_n513_03125 = OpConstant %float -513.03125
+%float_n1024_25 = OpConstant %float -1024.25
+         %10 = OpConstantComposite %v3float %float_2_00366211 %float_n513_03125 %float_n1024_25
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..aa410ec
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec3<u32> = vec3<u32>(1073757184u, 3288351232u, 3296724992u);
+  let b : vec3<f32> = bitcast<vec3<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3i32.wgsl b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3i32.wgsl
new file mode 100644
index 0000000..0e697ff
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec3<u32> = vec3<u32>(1073757184u, 3288351232u, 3296724992u);
+    let b : vec3<i32> = bitcast<vec3<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..3e835c7
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int3 b = int3(1073757184, -1006616064, -998242304);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..3e835c7
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int3 b = int3(1073757184, -1006616064, -998242304);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3i32.wgsl.expected.glsl
new file mode 100644
index 0000000..1a8e9d1
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3i32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  ivec3 b = ivec3(1073757184, -1006616064, -998242304);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3i32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3i32.wgsl.expected.msl
new file mode 100644
index 0000000..75ef1c1
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3i32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int3 const b = int3(1073757184, -1006616064, -998242304);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..bb86c5a
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3i32.wgsl.expected.spvasm
@@ -0,0 +1,22 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 11
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v3int = OpTypeVector %int 3
+%int_1073757184 = OpConstant %int 1073757184
+%int_n1006616064 = OpConstant %int -1006616064
+%int_n998242304 = OpConstant %int -998242304
+         %10 = OpConstantComposite %v3int %int_1073757184 %int_n1006616064 %int_n998242304
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..72b86ce
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec3<u32> = vec3<u32>(1073757184u, 3288351232u, 3296724992u);
+  let b : vec3<i32> = bitcast<vec3<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3u32.wgsl b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3u32.wgsl
new file mode 100644
index 0000000..eb19dcb
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    const a : vec3<u32> = vec3<u32>(1073757184u, 3288351232u, 3296724992u);
+    let b : vec3<u32> = bitcast<vec3<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..9b93c9c
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint3 b = uint3(1073757184u, 3288351232u, 3296724992u);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..9b93c9c
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint3 b = uint3(1073757184u, 3288351232u, 3296724992u);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3u32.wgsl.expected.glsl
new file mode 100644
index 0000000..543b5ef
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3u32.wgsl.expected.glsl
@@ -0,0 +1,11 @@
+#version 310 es
+
+void f() {
+  uvec3 b = uvec3(1073757184u, 3288351232u, 3296724992u);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3u32.wgsl.expected.msl b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3u32.wgsl.expected.msl
new file mode 100644
index 0000000..35e1029
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3u32.wgsl.expected.msl
@@ -0,0 +1,8 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint3 const b = uint3(1073757184u, 3288351232u, 3296724992u);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..7ddc81b
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3u32.wgsl.expected.spvasm
@@ -0,0 +1,22 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 11
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%uint_1073757184 = OpConstant %uint 1073757184
+%uint_3288351232 = OpConstant %uint 3288351232
+%uint_3296724992 = OpConstant %uint 3296724992
+         %10 = OpConstantComposite %v3uint %uint_1073757184 %uint_3288351232 %uint_3296724992
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..2e9538f
--- /dev/null
+++ b/test/tint/expressions/bitcast/const/96bit/vec3u32-vec3u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  const a : vec3<u32> = vec3<u32>(1073757184u, 3288351232u, 3296724992u);
+  let b : vec3<u32> = bitcast<vec3<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4f32.wgsl b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4f32.wgsl
new file mode 100644
index 0000000..94c5c6e
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec4<f32> = vec4<f32>(2.003662109375f, -513.03125f, -1024.25f, 0.0016968456f);
+    let b : vec4<f32> = bitcast<vec4<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..6c690ac
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float4 a = float4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+  const float4 b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..6c690ac
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float4 a = float4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+  const float4 b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4f32.wgsl.expected.glsl
new file mode 100644
index 0000000..7c96d3a
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4f32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  vec4 a = vec4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+  vec4 b = a;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4f32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4f32.wgsl.expected.msl
new file mode 100644
index 0000000..a2185e8
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4f32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float4 const a = float4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+  float4 const b = as_type<float4>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..eb2d6e4
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4f32.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 13
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%float_2_00366211 = OpConstant %float 2.00366211
+%float_n513_03125 = OpConstant %float -513.03125
+%float_n1024_25 = OpConstant %float -1024.25
+%float_0_00169684563 = OpConstant %float 0.00169684563
+         %11 = OpConstantComposite %v4float %float_2_00366211 %float_n513_03125 %float_n1024_25 %float_0_00169684563
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %12 = OpCopyObject %v4float %11
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..37dd376
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec4<f32> = vec4<f32>(2.003662109375f, -(513.03125f), -(1024.25f), 0.00169684563297778368f);
+  let b : vec4<f32> = bitcast<vec4<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4i32.wgsl b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4i32.wgsl
new file mode 100644
index 0000000..5e9683c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec4<f32> = vec4<f32>(2.003662109375f, -513.03125f, -1024.25f, 0.0016968456f);
+    let b : vec4<i32> = bitcast<vec4<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..3b1c1c7
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float4 a = float4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+  const int4 b = asint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..3b1c1c7
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float4 a = float4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+  const int4 b = asint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4i32.wgsl.expected.glsl
new file mode 100644
index 0000000..9737c3d
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4i32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  vec4 a = vec4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+  ivec4 b = floatBitsToInt(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4i32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4i32.wgsl.expected.msl
new file mode 100644
index 0000000..7843817
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4i32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float4 const a = float4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+  int4 const b = as_type<int4>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..f7dbf5a
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4i32.wgsl.expected.spvasm
@@ -0,0 +1,26 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 15
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%float_2_00366211 = OpConstant %float 2.00366211
+%float_n513_03125 = OpConstant %float -513.03125
+%float_n1024_25 = OpConstant %float -1024.25
+%float_0_00169684563 = OpConstant %float 0.00169684563
+         %11 = OpConstantComposite %v4float %float_2_00366211 %float_n513_03125 %float_n1024_25 %float_0_00169684563
+        %int = OpTypeInt 32 1
+      %v4int = OpTypeVector %int 4
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %12 = OpBitcast %v4int %11
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..185349f
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec4<f32> = vec4<f32>(2.003662109375f, -(513.03125f), -(1024.25f), 0.00169684563297778368f);
+  let b : vec4<i32> = bitcast<vec4<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4u32.wgsl b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4u32.wgsl
new file mode 100644
index 0000000..107f8a7
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec4<f32> = vec4<f32>(2.003662109375f, -513.03125f, -1024.25f, 0.0016968456f);
+    let b : vec4<u32> = bitcast<vec4<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..6b90b66
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float4 a = float4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+  const uint4 b = asuint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..6b90b66
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float4 a = float4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+  const uint4 b = asuint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4u32.wgsl.expected.glsl
new file mode 100644
index 0000000..5123b2b
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4u32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  vec4 a = vec4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+  uvec4 b = floatBitsToUint(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4u32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4u32.wgsl.expected.msl
new file mode 100644
index 0000000..12e63bf
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4u32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float4 const a = float4(2.003662109375f, -513.03125f, -1024.25f, 0.00169684563297778368f);
+  uint4 const b = as_type<uint4>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..67e841d
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4u32.wgsl.expected.spvasm
@@ -0,0 +1,26 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 15
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%float_2_00366211 = OpConstant %float 2.00366211
+%float_n513_03125 = OpConstant %float -513.03125
+%float_n1024_25 = OpConstant %float -1024.25
+%float_0_00169684563 = OpConstant %float 0.00169684563
+         %11 = OpConstantComposite %v4float %float_2_00366211 %float_n513_03125 %float_n1024_25 %float_0_00169684563
+       %uint = OpTypeInt 32 0
+     %v4uint = OpTypeVector %uint 4
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %12 = OpBitcast %v4uint %11
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..b541e1d
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4f32-vec4u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec4<f32> = vec4<f32>(2.003662109375f, -(513.03125f), -(1024.25f), 0.00169684563297778368f);
+  let b : vec4<u32> = bitcast<vec4<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4f32.wgsl b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4f32.wgsl
new file mode 100644
index 0000000..674eb6c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec4<i32> = vec4<i32>(1073757184i, -1006616064i, -998242304i, 987654321i);
+    let b : vec4<f32> = bitcast<vec4<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..1f18d8c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int4 a = int4(1073757184, -1006616064, -998242304, 987654321);
+  const float4 b = asfloat(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..1f18d8c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int4 a = int4(1073757184, -1006616064, -998242304, 987654321);
+  const float4 b = asfloat(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4f32.wgsl.expected.glsl
new file mode 100644
index 0000000..45547ef
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4f32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  ivec4 a = ivec4(1073757184, -1006616064, -998242304, 987654321);
+  vec4 b = intBitsToFloat(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4f32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4f32.wgsl.expected.msl
new file mode 100644
index 0000000..68dcd11
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4f32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int4 const a = int4(1073757184, -1006616064, -998242304, 987654321);
+  float4 const b = as_type<float4>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..b91fd23
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4f32.wgsl.expected.spvasm
@@ -0,0 +1,26 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 15
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v4int = OpTypeVector %int 4
+%int_1073757184 = OpConstant %int 1073757184
+%int_n1006616064 = OpConstant %int -1006616064
+%int_n998242304 = OpConstant %int -998242304
+%int_987654321 = OpConstant %int 987654321
+         %11 = OpConstantComposite %v4int %int_1073757184 %int_n1006616064 %int_n998242304 %int_987654321
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %12 = OpBitcast %v4float %11
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..92752c3
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec4<i32> = vec4<i32>(1073757184i, -(1006616064i), -(998242304i), 987654321i);
+  let b : vec4<f32> = bitcast<vec4<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4i32.wgsl b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4i32.wgsl
new file mode 100644
index 0000000..a7f88ab
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec4<i32> = vec4<i32>(1073757184i, -1006616064i, -998242304i, 987654321i);
+    let b : vec4<i32> = bitcast<vec4<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..4242dba
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int4 a = int4(1073757184, -1006616064, -998242304, 987654321);
+  const int4 b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..4242dba
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int4 a = int4(1073757184, -1006616064, -998242304, 987654321);
+  const int4 b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4i32.wgsl.expected.glsl
new file mode 100644
index 0000000..708b8f4
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4i32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  ivec4 a = ivec4(1073757184, -1006616064, -998242304, 987654321);
+  ivec4 b = a;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4i32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4i32.wgsl.expected.msl
new file mode 100644
index 0000000..ac2fee6
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4i32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int4 const a = int4(1073757184, -1006616064, -998242304, 987654321);
+  int4 const b = as_type<int4>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..d6e155c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4i32.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 13
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v4int = OpTypeVector %int 4
+%int_1073757184 = OpConstant %int 1073757184
+%int_n1006616064 = OpConstant %int -1006616064
+%int_n998242304 = OpConstant %int -998242304
+%int_987654321 = OpConstant %int 987654321
+         %11 = OpConstantComposite %v4int %int_1073757184 %int_n1006616064 %int_n998242304 %int_987654321
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %12 = OpCopyObject %v4int %11
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..e9b6ca2
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec4<i32> = vec4<i32>(1073757184i, -(1006616064i), -(998242304i), 987654321i);
+  let b : vec4<i32> = bitcast<vec4<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4u32.wgsl b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4u32.wgsl
new file mode 100644
index 0000000..1daec7d
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec4<i32> = vec4<i32>(1073757184i, -1006616064i, -998242304i, 987654321i);
+    let b : vec4<u32> = bitcast<vec4<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..78f7d7e
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int4 a = int4(1073757184, -1006616064, -998242304, 987654321);
+  const uint4 b = asuint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..78f7d7e
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int4 a = int4(1073757184, -1006616064, -998242304, 987654321);
+  const uint4 b = asuint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4u32.wgsl.expected.glsl
new file mode 100644
index 0000000..1d8ba41
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4u32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  ivec4 a = ivec4(1073757184, -1006616064, -998242304, 987654321);
+  uvec4 b = uvec4(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4u32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4u32.wgsl.expected.msl
new file mode 100644
index 0000000..b36d84e
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4u32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int4 const a = int4(1073757184, -1006616064, -998242304, 987654321);
+  uint4 const b = as_type<uint4>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..e02f272
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4u32.wgsl.expected.spvasm
@@ -0,0 +1,26 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 15
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v4int = OpTypeVector %int 4
+%int_1073757184 = OpConstant %int 1073757184
+%int_n1006616064 = OpConstant %int -1006616064
+%int_n998242304 = OpConstant %int -998242304
+%int_987654321 = OpConstant %int 987654321
+         %11 = OpConstantComposite %v4int %int_1073757184 %int_n1006616064 %int_n998242304 %int_987654321
+       %uint = OpTypeInt 32 0
+     %v4uint = OpTypeVector %uint 4
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %12 = OpBitcast %v4uint %11
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..c4908c0
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4i32-vec4u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec4<i32> = vec4<i32>(1073757184i, -(1006616064i), -(998242304i), 987654321i);
+  let b : vec4<u32> = bitcast<vec4<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4f32.wgsl b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4f32.wgsl
new file mode 100644
index 0000000..b17011b
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec4<u32> = vec4<u32>(1073757184u, 3288351232u, 3296724992u, 987654321u);
+    let b : vec4<f32> = bitcast<vec4<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..aba92aa
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint4 a = uint4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  const float4 b = asfloat(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..aba92aa
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint4 a = uint4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  const float4 b = asfloat(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4f32.wgsl.expected.glsl
new file mode 100644
index 0000000..1554a18f
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4f32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  uvec4 a = uvec4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  vec4 b = uintBitsToFloat(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4f32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4f32.wgsl.expected.msl
new file mode 100644
index 0000000..0f620f3
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4f32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint4 const a = uint4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  float4 const b = as_type<float4>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..cc47e7c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4f32.wgsl.expected.spvasm
@@ -0,0 +1,26 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 15
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %v4uint = OpTypeVector %uint 4
+%uint_1073757184 = OpConstant %uint 1073757184
+%uint_3288351232 = OpConstant %uint 3288351232
+%uint_3296724992 = OpConstant %uint 3296724992
+%uint_987654321 = OpConstant %uint 987654321
+         %11 = OpConstantComposite %v4uint %uint_1073757184 %uint_3288351232 %uint_3296724992 %uint_987654321
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %12 = OpBitcast %v4float %11
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..d9745a4
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec4<u32> = vec4<u32>(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  let b : vec4<f32> = bitcast<vec4<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4i32.wgsl b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4i32.wgsl
new file mode 100644
index 0000000..62072e6
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec4<u32> = vec4<u32>(1073757184u, 3288351232u, 3296724992u, 987654321u);
+    let b : vec4<i32> = bitcast<vec4<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..c5e9233
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint4 a = uint4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  const int4 b = asint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..c5e9233
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint4 a = uint4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  const int4 b = asint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4i32.wgsl.expected.glsl
new file mode 100644
index 0000000..bf4cb5c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4i32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  uvec4 a = uvec4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  ivec4 b = ivec4(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4i32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4i32.wgsl.expected.msl
new file mode 100644
index 0000000..af1d5de
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4i32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint4 const a = uint4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  int4 const b = as_type<int4>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..b55cca2
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4i32.wgsl.expected.spvasm
@@ -0,0 +1,26 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 15
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %v4uint = OpTypeVector %uint 4
+%uint_1073757184 = OpConstant %uint 1073757184
+%uint_3288351232 = OpConstant %uint 3288351232
+%uint_3296724992 = OpConstant %uint 3296724992
+%uint_987654321 = OpConstant %uint 987654321
+         %11 = OpConstantComposite %v4uint %uint_1073757184 %uint_3288351232 %uint_3296724992 %uint_987654321
+        %int = OpTypeInt 32 1
+      %v4int = OpTypeVector %int 4
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %12 = OpBitcast %v4int %11
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..bffa20d
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec4<u32> = vec4<u32>(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  let b : vec4<i32> = bitcast<vec4<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4u32.wgsl b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4u32.wgsl
new file mode 100644
index 0000000..d60feca
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec4<u32> = vec4<u32>(1073757184u, 3288351232u, 3296724992u, 987654321u);
+    let b : vec4<u32> = bitcast<vec4<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..cd67798
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint4 a = uint4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  const uint4 b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..cd67798
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint4 a = uint4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  const uint4 b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4u32.wgsl.expected.glsl
new file mode 100644
index 0000000..b828bc0
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4u32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  uvec4 a = uvec4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  uvec4 b = a;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4u32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4u32.wgsl.expected.msl
new file mode 100644
index 0000000..6c6d2d9
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4u32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint4 const a = uint4(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  uint4 const b = as_type<uint4>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..46f6113
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4u32.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 13
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %v4uint = OpTypeVector %uint 4
+%uint_1073757184 = OpConstant %uint 1073757184
+%uint_3288351232 = OpConstant %uint 3288351232
+%uint_3296724992 = OpConstant %uint 3296724992
+%uint_987654321 = OpConstant %uint 987654321
+         %11 = OpConstantComposite %v4uint %uint_1073757184 %uint_3288351232 %uint_3296724992 %uint_987654321
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %12 = OpCopyObject %v4uint %11
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..c45009a
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/128bit/vec4u32-vec4u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec4<u32> = vec4<u32>(1073757184u, 3288351232u, 3296724992u, 987654321u);
+  let b : vec4<u32> = bitcast<vec4<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/16bit/f16-f16.wgsl b/test/tint/expressions/bitcast/let/16bit/f16-f16.wgsl
new file mode 100644
index 0000000..bc9dd9e
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/16bit/f16-f16.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    let a : f16 = f16(1.0h);
+    let b : f16 = bitcast<f16>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/16bit/f16-f16.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/16bit/f16-f16.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..f627589
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/16bit/f16-f16.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float16_t a = float16_t(1.0h);
+  const float16_t b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/16bit/f16-f16.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/16bit/f16-f16.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..55657e2
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/16bit/f16-f16.wgsl.expected.fxc.hlsl
@@ -0,0 +1,11 @@
+SKIP: FAILED
+
+[numthreads(1, 1, 1)]
+void f() {
+  const float16_t a = float16_t(1.0h);
+  const float16_t b = a;
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x0000023BEF017690(3,9-17): error X3000: unrecognized identifier 'float16_t'
+
diff --git a/test/tint/expressions/bitcast/let/16bit/f16-f16.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/16bit/f16-f16.wgsl.expected.glsl
new file mode 100644
index 0000000..1e2262f
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/16bit/f16-f16.wgsl.expected.glsl
@@ -0,0 +1,13 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+void f() {
+  float16_t a = 1.0hf;
+  float16_t b = a;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/16bit/f16-f16.wgsl.expected.msl b/test/tint/expressions/bitcast/let/16bit/f16-f16.wgsl.expected.msl
new file mode 100644
index 0000000..a8b3e00
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/16bit/f16-f16.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  half const a = 1.0h;
+  half const b = as_type<half>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/16bit/f16-f16.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/16bit/f16-f16.wgsl.expected.spvasm
new file mode 100644
index 0000000..add47fe
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/16bit/f16-f16.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 8
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %half = OpTypeFloat 16
+%half_0x1p_0 = OpConstant %half 0x1p+0
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+          %7 = OpCopyObject %half %half_0x1p_0
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/16bit/f16-f16.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/16bit/f16-f16.wgsl.expected.wgsl
new file mode 100644
index 0000000..05499106
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/16bit/f16-f16.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  let a : f16 = f16(1.0h);
+  let b : f16 = bitcast<f16>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-f32.wgsl b/test/tint/expressions/bitcast/let/32bit/f32-f32.wgsl
new file mode 100644
index 0000000..b608ac2
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : f32 = f32(2.003662109375f);
+    let b : f32 = bitcast<f32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/32bit/f32-f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..29c8009
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float a = 2.003662109375f;
+  const float b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/32bit/f32-f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..29c8009
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float a = 2.003662109375f;
+  const float b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/32bit/f32-f32.wgsl.expected.glsl
new file mode 100644
index 0000000..926bc4a
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-f32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  float a = 2.003662109375f;
+  float b = a;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-f32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/32bit/f32-f32.wgsl.expected.msl
new file mode 100644
index 0000000..79da111
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-f32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float const a = 2.003662109375f;
+  float const b = as_type<float>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/32bit/f32-f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..bd59e7b
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-f32.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 8
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%float_2_00366211 = OpConstant %float 2.00366211
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+          %7 = OpCopyObject %float %float_2_00366211
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/32bit/f32-f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..fdbb7ea
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : f32 = f32(2.003662109375f);
+  let b : f32 = bitcast<f32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-i32.wgsl b/test/tint/expressions/bitcast/let/32bit/f32-i32.wgsl
new file mode 100644
index 0000000..d86e3c9
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : f32 = f32(2.003662109375f);
+    let b : i32 = bitcast<i32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/32bit/f32-i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..af3719c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float a = 2.003662109375f;
+  const int b = asint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/32bit/f32-i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..af3719c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float a = 2.003662109375f;
+  const int b = asint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/32bit/f32-i32.wgsl.expected.glsl
new file mode 100644
index 0000000..0351d1a
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-i32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  float a = 2.003662109375f;
+  int b = floatBitsToInt(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-i32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/32bit/f32-i32.wgsl.expected.msl
new file mode 100644
index 0000000..0ba9a1f
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-i32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float const a = 2.003662109375f;
+  int const b = as_type<int>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/32bit/f32-i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..3cf024e
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-i32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%float_2_00366211 = OpConstant %float 2.00366211
+        %int = OpTypeInt 32 1
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+          %7 = OpBitcast %int %float_2_00366211
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/32bit/f32-i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..5889390
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : f32 = f32(2.003662109375f);
+  let b : i32 = bitcast<i32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-u32.wgsl b/test/tint/expressions/bitcast/let/32bit/f32-u32.wgsl
new file mode 100644
index 0000000..8f9a7d2
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : f32 = f32(2.003662109375f);
+    let b : u32 = bitcast<u32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/32bit/f32-u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..98f802d
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float a = 2.003662109375f;
+  const uint b = asuint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/32bit/f32-u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..98f802d
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float a = 2.003662109375f;
+  const uint b = asuint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/32bit/f32-u32.wgsl.expected.glsl
new file mode 100644
index 0000000..e1fe92a
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-u32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  float a = 2.003662109375f;
+  uint b = floatBitsToUint(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-u32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/32bit/f32-u32.wgsl.expected.msl
new file mode 100644
index 0000000..b2ebfde
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-u32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float const a = 2.003662109375f;
+  uint const b = as_type<uint>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/32bit/f32-u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..6d4e8b0
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-u32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%float_2_00366211 = OpConstant %float 2.00366211
+       %uint = OpTypeInt 32 0
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+          %7 = OpBitcast %uint %float_2_00366211
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/32bit/f32-u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..bfd5887
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : f32 = f32(2.003662109375f);
+  let b : u32 = bitcast<u32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-vec2f16.wgsl b/test/tint/expressions/bitcast/let/32bit/f32-vec2f16.wgsl
new file mode 100644
index 0000000..ef1e578
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-vec2f16.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    let a : f32 = f32(2.003662109375f);
+    let b : vec2<f16> = bitcast<vec2<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-vec2f16.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/32bit/f32-vec2f16.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..d859d97
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-vec2f16.wgsl.expected.dxc.hlsl
@@ -0,0 +1,13 @@
+vector<float16_t, 2> tint_bitcast_to_f16(float src) {
+  uint v = asuint(src);
+  float t_low = f16tof32(v & 0xffff);
+  float t_high = f16tof32((v >> 16) & 0xffff);
+  return vector<float16_t, 2>(t_low.x, t_high.x);
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const float a = 2.003662109375f;
+  const vector<float16_t, 2> b = tint_bitcast_to_f16(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-vec2f16.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/32bit/f32-vec2f16.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..15a981f
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-vec2f16.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+vector<float16_t, 2> tint_bitcast_to_f16(float src) {
+  uint v = asuint(src);
+  float t_low = f16tof32(v & 0xffff);
+  float t_high = f16tof32((v >> 16) & 0xffff);
+  return vector<float16_t, 2>(t_low.x, t_high.x);
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const float a = 2.003662109375f;
+  const vector<float16_t, 2> b = tint_bitcast_to_f16(a);
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x000002C96174CDD0(1,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-vec2f16.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/32bit/f32-vec2f16.wgsl.expected.glsl
new file mode 100644
index 0000000..bb10cb4
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-vec2f16.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+f16vec2 tint_bitcast_to_f16(float src) {
+  uint r = floatBitsToUint(src);
+  return unpackFloat2x16(r);
+}
+
+void f() {
+  float a = 2.003662109375f;
+  f16vec2 b = tint_bitcast_to_f16(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-vec2f16.wgsl.expected.msl b/test/tint/expressions/bitcast/let/32bit/f32-vec2f16.wgsl.expected.msl
new file mode 100644
index 0000000..dee0136
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-vec2f16.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float const a = 2.003662109375f;
+  half2 const b = as_type<half2>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-vec2f16.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/32bit/f32-vec2f16.wgsl.expected.spvasm
new file mode 100644
index 0000000..0120613
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-vec2f16.wgsl.expected.spvasm
@@ -0,0 +1,25 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 10
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%float_2_00366211 = OpConstant %float 2.00366211
+       %half = OpTypeFloat 16
+     %v2half = OpTypeVector %half 2
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+          %7 = OpBitcast %v2half %float_2_00366211
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/32bit/f32-vec2f16.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/32bit/f32-vec2f16.wgsl.expected.wgsl
new file mode 100644
index 0000000..4a8265f
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/f32-vec2f16.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  let a : f32 = f32(2.003662109375f);
+  let b : vec2<f16> = bitcast<vec2<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-f32.wgsl b/test/tint/expressions/bitcast/let/32bit/i32-f32.wgsl
new file mode 100644
index 0000000..ccfd3e6
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : i32 = i32(1073757184i);
+    let b : f32 = bitcast<f32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/32bit/i32-f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..123510b
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int a = 1073757184;
+  const float b = asfloat(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/32bit/i32-f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..123510b
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int a = 1073757184;
+  const float b = asfloat(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/32bit/i32-f32.wgsl.expected.glsl
new file mode 100644
index 0000000..27d7c79
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-f32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  int a = 1073757184;
+  float b = intBitsToFloat(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-f32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/32bit/i32-f32.wgsl.expected.msl
new file mode 100644
index 0000000..93e6613
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-f32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int const a = 1073757184;
+  float const b = as_type<float>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/32bit/i32-f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..33772ce
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-f32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%int_1073757184 = OpConstant %int 1073757184
+      %float = OpTypeFloat 32
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+          %7 = OpBitcast %float %int_1073757184
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/32bit/i32-f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..429b08e3
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : i32 = i32(1073757184i);
+  let b : f32 = bitcast<f32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-i32.wgsl b/test/tint/expressions/bitcast/let/32bit/i32-i32.wgsl
new file mode 100644
index 0000000..96a6e7d
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : i32 = i32(1073757184i);
+    let b : i32 = bitcast<i32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/32bit/i32-i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..6cf8029
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int a = 1073757184;
+  const int b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/32bit/i32-i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..6cf8029
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int a = 1073757184;
+  const int b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/32bit/i32-i32.wgsl.expected.glsl
new file mode 100644
index 0000000..8569758
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-i32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  int a = 1073757184;
+  int b = a;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-i32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/32bit/i32-i32.wgsl.expected.msl
new file mode 100644
index 0000000..0ad16d6
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-i32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int const a = 1073757184;
+  int const b = as_type<int>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/32bit/i32-i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..c40927f
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-i32.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 8
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%int_1073757184 = OpConstant %int 1073757184
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+          %7 = OpCopyObject %int %int_1073757184
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/32bit/i32-i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..2181d6c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : i32 = i32(1073757184i);
+  let b : i32 = bitcast<i32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-u32.wgsl b/test/tint/expressions/bitcast/let/32bit/i32-u32.wgsl
new file mode 100644
index 0000000..cee6401
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : i32 = i32(1073757184i);
+    let b : u32 = bitcast<u32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/32bit/i32-u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..b1c1381
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int a = 1073757184;
+  const uint b = asuint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/32bit/i32-u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..b1c1381
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int a = 1073757184;
+  const uint b = asuint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/32bit/i32-u32.wgsl.expected.glsl
new file mode 100644
index 0000000..e7bfa52
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-u32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  int a = 1073757184;
+  uint b = uint(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-u32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/32bit/i32-u32.wgsl.expected.msl
new file mode 100644
index 0000000..58d38f1
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-u32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int const a = 1073757184;
+  uint const b = as_type<uint>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/32bit/i32-u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..7976301
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-u32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%int_1073757184 = OpConstant %int 1073757184
+       %uint = OpTypeInt 32 0
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+          %7 = OpBitcast %uint %int_1073757184
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/32bit/i32-u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..47781bf
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : i32 = i32(1073757184i);
+  let b : u32 = bitcast<u32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-vec2f16.wgsl b/test/tint/expressions/bitcast/let/32bit/i32-vec2f16.wgsl
new file mode 100644
index 0000000..0637d05
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-vec2f16.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    let a : i32 = i32(1073757184i);
+    let b : vec2<f16> = bitcast<vec2<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-vec2f16.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/32bit/i32-vec2f16.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..1b76cc5
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-vec2f16.wgsl.expected.dxc.hlsl
@@ -0,0 +1,13 @@
+vector<float16_t, 2> tint_bitcast_to_f16(int src) {
+  uint v = asuint(src);
+  float t_low = f16tof32(v & 0xffff);
+  float t_high = f16tof32((v >> 16) & 0xffff);
+  return vector<float16_t, 2>(t_low.x, t_high.x);
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const int a = 1073757184;
+  const vector<float16_t, 2> b = tint_bitcast_to_f16(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-vec2f16.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/32bit/i32-vec2f16.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..7a19f9d
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-vec2f16.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+vector<float16_t, 2> tint_bitcast_to_f16(int src) {
+  uint v = asuint(src);
+  float t_low = f16tof32(v & 0xffff);
+  float t_high = f16tof32((v >> 16) & 0xffff);
+  return vector<float16_t, 2>(t_low.x, t_high.x);
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const int a = 1073757184;
+  const vector<float16_t, 2> b = tint_bitcast_to_f16(a);
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x00000234EF107030(1,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-vec2f16.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/32bit/i32-vec2f16.wgsl.expected.glsl
new file mode 100644
index 0000000..138bdb8
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-vec2f16.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+f16vec2 tint_bitcast_to_f16(int src) {
+  uint r = uint(src);
+  return unpackFloat2x16(r);
+}
+
+void f() {
+  int a = 1073757184;
+  f16vec2 b = tint_bitcast_to_f16(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-vec2f16.wgsl.expected.msl b/test/tint/expressions/bitcast/let/32bit/i32-vec2f16.wgsl.expected.msl
new file mode 100644
index 0000000..193b2f9
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-vec2f16.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int const a = 1073757184;
+  half2 const b = as_type<half2>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-vec2f16.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/32bit/i32-vec2f16.wgsl.expected.spvasm
new file mode 100644
index 0000000..2d19adb
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-vec2f16.wgsl.expected.spvasm
@@ -0,0 +1,25 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 10
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%int_1073757184 = OpConstant %int 1073757184
+       %half = OpTypeFloat 16
+     %v2half = OpTypeVector %half 2
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+          %7 = OpBitcast %v2half %int_1073757184
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/32bit/i32-vec2f16.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/32bit/i32-vec2f16.wgsl.expected.wgsl
new file mode 100644
index 0000000..f2a8cdf
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/i32-vec2f16.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  let a : i32 = i32(1073757184i);
+  let b : vec2<f16> = bitcast<vec2<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-f32.wgsl b/test/tint/expressions/bitcast/let/32bit/u32-f32.wgsl
new file mode 100644
index 0000000..6a166e7
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : u32 = u32(1073757184u);
+    let b : f32 = bitcast<f32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/32bit/u32-f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..3054f48
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint a = 1073757184u;
+  const float b = asfloat(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/32bit/u32-f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..3054f48
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint a = 1073757184u;
+  const float b = asfloat(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/32bit/u32-f32.wgsl.expected.glsl
new file mode 100644
index 0000000..957fb56
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-f32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  uint a = 1073757184u;
+  float b = uintBitsToFloat(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-f32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/32bit/u32-f32.wgsl.expected.msl
new file mode 100644
index 0000000..139ad95
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-f32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint const a = 1073757184u;
+  float const b = as_type<float>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/32bit/u32-f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..88e7f95
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-f32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+%uint_1073757184 = OpConstant %uint 1073757184
+      %float = OpTypeFloat 32
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+          %7 = OpBitcast %float %uint_1073757184
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/32bit/u32-f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..3340b88
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : u32 = u32(1073757184u);
+  let b : f32 = bitcast<f32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-i32.wgsl b/test/tint/expressions/bitcast/let/32bit/u32-i32.wgsl
new file mode 100644
index 0000000..3571b0b
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : u32 = u32(1073757184u);
+    let b : i32 = bitcast<i32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/32bit/u32-i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..cf37bd5
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint a = 1073757184u;
+  const int b = asint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/32bit/u32-i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..cf37bd5
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint a = 1073757184u;
+  const int b = asint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/32bit/u32-i32.wgsl.expected.glsl
new file mode 100644
index 0000000..9846453
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-i32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  uint a = 1073757184u;
+  int b = int(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-i32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/32bit/u32-i32.wgsl.expected.msl
new file mode 100644
index 0000000..d91edb8
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-i32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint const a = 1073757184u;
+  int const b = as_type<int>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/32bit/u32-i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..9a1cf21
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-i32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+%uint_1073757184 = OpConstant %uint 1073757184
+        %int = OpTypeInt 32 1
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+          %7 = OpBitcast %int %uint_1073757184
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/32bit/u32-i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..1de1638
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : u32 = u32(1073757184u);
+  let b : i32 = bitcast<i32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-u32.wgsl b/test/tint/expressions/bitcast/let/32bit/u32-u32.wgsl
new file mode 100644
index 0000000..b5b8e8f
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : u32 = u32(1073757184u);
+    let b : u32 = bitcast<u32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/32bit/u32-u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..6309306
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint a = 1073757184u;
+  const uint b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/32bit/u32-u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..6309306
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint a = 1073757184u;
+  const uint b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/32bit/u32-u32.wgsl.expected.glsl
new file mode 100644
index 0000000..e189e0b
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-u32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  uint a = 1073757184u;
+  uint b = a;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-u32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/32bit/u32-u32.wgsl.expected.msl
new file mode 100644
index 0000000..99b84ac
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-u32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint const a = 1073757184u;
+  uint const b = as_type<uint>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/32bit/u32-u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..e705859
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-u32.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 8
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+%uint_1073757184 = OpConstant %uint 1073757184
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+          %7 = OpCopyObject %uint %uint_1073757184
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/32bit/u32-u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..dda8627
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : u32 = u32(1073757184u);
+  let b : u32 = bitcast<u32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-vec2f16.wgsl b/test/tint/expressions/bitcast/let/32bit/u32-vec2f16.wgsl
new file mode 100644
index 0000000..f0e0801
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-vec2f16.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    let a : u32 = u32(1073757184u);
+    let b : vec2<f16> = bitcast<vec2<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-vec2f16.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/32bit/u32-vec2f16.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..2e7bcd9
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-vec2f16.wgsl.expected.dxc.hlsl
@@ -0,0 +1,13 @@
+vector<float16_t, 2> tint_bitcast_to_f16(uint src) {
+  uint v = asuint(src);
+  float t_low = f16tof32(v & 0xffff);
+  float t_high = f16tof32((v >> 16) & 0xffff);
+  return vector<float16_t, 2>(t_low.x, t_high.x);
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const uint a = 1073757184u;
+  const vector<float16_t, 2> b = tint_bitcast_to_f16(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-vec2f16.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/32bit/u32-vec2f16.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..9099fe9
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-vec2f16.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+vector<float16_t, 2> tint_bitcast_to_f16(uint src) {
+  uint v = asuint(src);
+  float t_low = f16tof32(v & 0xffff);
+  float t_high = f16tof32((v >> 16) & 0xffff);
+  return vector<float16_t, 2>(t_low.x, t_high.x);
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const uint a = 1073757184u;
+  const vector<float16_t, 2> b = tint_bitcast_to_f16(a);
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x0000020E6D499E20(1,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-vec2f16.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/32bit/u32-vec2f16.wgsl.expected.glsl
new file mode 100644
index 0000000..e19bd66
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-vec2f16.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+f16vec2 tint_bitcast_to_f16(uint src) {
+  uint r = uint(src);
+  return unpackFloat2x16(r);
+}
+
+void f() {
+  uint a = 1073757184u;
+  f16vec2 b = tint_bitcast_to_f16(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-vec2f16.wgsl.expected.msl b/test/tint/expressions/bitcast/let/32bit/u32-vec2f16.wgsl.expected.msl
new file mode 100644
index 0000000..c8d0f0a
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-vec2f16.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint const a = 1073757184u;
+  half2 const b = as_type<half2>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-vec2f16.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/32bit/u32-vec2f16.wgsl.expected.spvasm
new file mode 100644
index 0000000..a741773
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-vec2f16.wgsl.expected.spvasm
@@ -0,0 +1,25 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 10
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+%uint_1073757184 = OpConstant %uint 1073757184
+       %half = OpTypeFloat 16
+     %v2half = OpTypeVector %half 2
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+          %7 = OpBitcast %v2half %uint_1073757184
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/32bit/u32-vec2f16.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/32bit/u32-vec2f16.wgsl.expected.wgsl
new file mode 100644
index 0000000..3daf0a8
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/u32-vec2f16.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  let a : u32 = u32(1073757184u);
+  let b : vec2<f16> = bitcast<vec2<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-f32.wgsl b/test/tint/expressions/bitcast/let/32bit/vec2f16-f32.wgsl
new file mode 100644
index 0000000..151c425
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-f32.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec2<f16> = vec2<f16>(1.0h, 2.0h);
+    let b : f32 = bitcast<f32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/32bit/vec2f16-f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..480ada0
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,11 @@
+float tint_bitcast_from_f16(vector<float16_t, 2> src) {
+  uint2 r = f32tof16(float2(src));
+  return asfloat(uint((r.x & 0xffff) | ((r.y & 0xffff) << 16)));
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 2> a = vector<float16_t, 2>(float16_t(1.0h), float16_t(2.0h));
+  const float b = tint_bitcast_from_f16(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/32bit/vec2f16-f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..71f7b7a
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+float tint_bitcast_from_f16(vector<float16_t, 2> src) {
+  uint2 r = f32tof16(float2(src));
+  return asfloat(uint((r.x & 0xffff) | ((r.y & 0xffff) << 16)));
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 2> a = vector<float16_t, 2>(float16_t(1.0h), float16_t(2.0h));
+  const float b = tint_bitcast_from_f16(a);
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x000001EDAADDFBA0(1,36-44): error X3000: syntax error: unexpected token 'float16_t'
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x000001EDAADDFBA0(2,29-31): error X3004: undeclared identifier 'src'
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x000001EDAADDFBA0(2,22-32): error X3014: incorrect number of arguments to numeric-type constructor
+
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/32bit/vec2f16-f32.wgsl.expected.glsl
new file mode 100644
index 0000000..d4dc611
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-f32.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+float tint_bitcast_from_f16(f16vec2 src) {
+  uint r = packFloat2x16(src);
+  return uintBitsToFloat(r);
+}
+
+void f() {
+  f16vec2 a = f16vec2(1.0hf, 2.0hf);
+  float b = tint_bitcast_from_f16(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-f32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/32bit/vec2f16-f32.wgsl.expected.msl
new file mode 100644
index 0000000..34c54d2
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-f32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  half2 const a = half2(1.0h, 2.0h);
+  float const b = as_type<float>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/32bit/vec2f16-f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..f196339
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-f32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 12
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %half = OpTypeFloat 16
+     %v2half = OpTypeVector %half 2
+%half_0x1p_0 = OpConstant %half 0x1p+0
+%half_0x1p_1 = OpConstant %half 0x1p+1
+          %9 = OpConstantComposite %v2half %half_0x1p_0 %half_0x1p_1
+      %float = OpTypeFloat 32
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %10 = OpBitcast %float %9
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/32bit/vec2f16-f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..01e9331
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-f32.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec2<f16> = vec2<f16>(1.0h, 2.0h);
+  let b : f32 = bitcast<f32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-i32.wgsl b/test/tint/expressions/bitcast/let/32bit/vec2f16-i32.wgsl
new file mode 100644
index 0000000..247d051
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-i32.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec2<f16> = vec2<f16>(1.0h, 2.0h);
+    let b : i32 = bitcast<i32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/32bit/vec2f16-i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..8ad784d
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,11 @@
+int tint_bitcast_from_f16(vector<float16_t, 2> src) {
+  uint2 r = f32tof16(float2(src));
+  return asint(uint((r.x & 0xffff) | ((r.y & 0xffff) << 16)));
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 2> a = vector<float16_t, 2>(float16_t(1.0h), float16_t(2.0h));
+  const int b = tint_bitcast_from_f16(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/32bit/vec2f16-i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..ef2dd6d
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+int tint_bitcast_from_f16(vector<float16_t, 2> src) {
+  uint2 r = f32tof16(float2(src));
+  return asint(uint((r.x & 0xffff) | ((r.y & 0xffff) << 16)));
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 2> a = vector<float16_t, 2>(float16_t(1.0h), float16_t(2.0h));
+  const int b = tint_bitcast_from_f16(a);
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x000001DC9BD890B0(1,34-42): error X3000: syntax error: unexpected token 'float16_t'
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x000001DC9BD890B0(2,29-31): error X3004: undeclared identifier 'src'
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x000001DC9BD890B0(2,22-32): error X3014: incorrect number of arguments to numeric-type constructor
+
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/32bit/vec2f16-i32.wgsl.expected.glsl
new file mode 100644
index 0000000..26dcde7
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-i32.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+int tint_bitcast_from_f16(f16vec2 src) {
+  uint r = packFloat2x16(src);
+  return int(r);
+}
+
+void f() {
+  f16vec2 a = f16vec2(1.0hf, 2.0hf);
+  int b = tint_bitcast_from_f16(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-i32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/32bit/vec2f16-i32.wgsl.expected.msl
new file mode 100644
index 0000000..a0b1f99
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-i32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  half2 const a = half2(1.0h, 2.0h);
+  int const b = as_type<int>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/32bit/vec2f16-i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..4f4902c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-i32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 12
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %half = OpTypeFloat 16
+     %v2half = OpTypeVector %half 2
+%half_0x1p_0 = OpConstant %half 0x1p+0
+%half_0x1p_1 = OpConstant %half 0x1p+1
+          %9 = OpConstantComposite %v2half %half_0x1p_0 %half_0x1p_1
+        %int = OpTypeInt 32 1
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %10 = OpBitcast %int %9
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/32bit/vec2f16-i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..364c99a
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-i32.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec2<f16> = vec2<f16>(1.0h, 2.0h);
+  let b : i32 = bitcast<i32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-u32.wgsl b/test/tint/expressions/bitcast/let/32bit/vec2f16-u32.wgsl
new file mode 100644
index 0000000..eb74f13
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-u32.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec2<f16> = vec2<f16>(1.0h, 2.0h);
+    let b : u32 = bitcast<u32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/32bit/vec2f16-u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..48e040e
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,11 @@
+uint tint_bitcast_from_f16(vector<float16_t, 2> src) {
+  uint2 r = f32tof16(float2(src));
+  return asuint(uint((r.x & 0xffff) | ((r.y & 0xffff) << 16)));
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 2> a = vector<float16_t, 2>(float16_t(1.0h), float16_t(2.0h));
+  const uint b = tint_bitcast_from_f16(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/32bit/vec2f16-u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..2332ca6
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+uint tint_bitcast_from_f16(vector<float16_t, 2> src) {
+  uint2 r = f32tof16(float2(src));
+  return asuint(uint((r.x & 0xffff) | ((r.y & 0xffff) << 16)));
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 2> a = vector<float16_t, 2>(float16_t(1.0h), float16_t(2.0h));
+  const uint b = tint_bitcast_from_f16(a);
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x0000011D0C566F70(1,35-43): error X3000: syntax error: unexpected token 'float16_t'
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x0000011D0C566F70(2,29-31): error X3004: undeclared identifier 'src'
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x0000011D0C566F70(2,22-32): error X3014: incorrect number of arguments to numeric-type constructor
+
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/32bit/vec2f16-u32.wgsl.expected.glsl
new file mode 100644
index 0000000..233cc25
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-u32.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+uint tint_bitcast_from_f16(f16vec2 src) {
+  uint r = packFloat2x16(src);
+  return uint(r);
+}
+
+void f() {
+  f16vec2 a = f16vec2(1.0hf, 2.0hf);
+  uint b = tint_bitcast_from_f16(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-u32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/32bit/vec2f16-u32.wgsl.expected.msl
new file mode 100644
index 0000000..36a2afe
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-u32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  half2 const a = half2(1.0h, 2.0h);
+  uint const b = as_type<uint>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/32bit/vec2f16-u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..bd1959a
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-u32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 12
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %half = OpTypeFloat 16
+     %v2half = OpTypeVector %half 2
+%half_0x1p_0 = OpConstant %half 0x1p+0
+%half_0x1p_1 = OpConstant %half 0x1p+1
+          %9 = OpConstantComposite %v2half %half_0x1p_0 %half_0x1p_1
+       %uint = OpTypeInt 32 0
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %10 = OpBitcast %uint %9
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/32bit/vec2f16-u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..04b2414
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-u32.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec2<f16> = vec2<f16>(1.0h, 2.0h);
+  let b : u32 = bitcast<u32>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-vec2f16.wgsl b/test/tint/expressions/bitcast/let/32bit/vec2f16-vec2f16.wgsl
new file mode 100644
index 0000000..48294a6
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-vec2f16.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec2<f16> = vec2<f16>(1.0h, 2.0h);
+    let b : vec2<f16> = bitcast<vec2<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-vec2f16.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/32bit/vec2f16-vec2f16.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..eef9d47
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-vec2f16.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 2> a = vector<float16_t, 2>(float16_t(1.0h), float16_t(2.0h));
+  const vector<float16_t, 2> b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-vec2f16.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/32bit/vec2f16-vec2f16.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..efecfa7
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-vec2f16.wgsl.expected.fxc.hlsl
@@ -0,0 +1,12 @@
+SKIP: FAILED
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 2> a = vector<float16_t, 2>(float16_t(1.0h), float16_t(2.0h));
+  const vector<float16_t, 2> b = a;
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x0000019B1F6BF7B0(3,16-24): error X3000: syntax error: unexpected token 'float16_t'
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x0000019B1F6BF7B0(4,16-24): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-vec2f16.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/32bit/vec2f16-vec2f16.wgsl.expected.glsl
new file mode 100644
index 0000000..b3f50d0
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-vec2f16.wgsl.expected.glsl
@@ -0,0 +1,13 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+void f() {
+  f16vec2 a = f16vec2(1.0hf, 2.0hf);
+  f16vec2 b = a;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-vec2f16.wgsl.expected.msl b/test/tint/expressions/bitcast/let/32bit/vec2f16-vec2f16.wgsl.expected.msl
new file mode 100644
index 0000000..8a9cbd9
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-vec2f16.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  half2 const a = half2(1.0h, 2.0h);
+  half2 const b = as_type<half2>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-vec2f16.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/32bit/vec2f16-vec2f16.wgsl.expected.spvasm
new file mode 100644
index 0000000..29f12c6
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-vec2f16.wgsl.expected.spvasm
@@ -0,0 +1,26 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 11
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %half = OpTypeFloat 16
+     %v2half = OpTypeVector %half 2
+%half_0x1p_0 = OpConstant %half 0x1p+0
+%half_0x1p_1 = OpConstant %half 0x1p+1
+          %9 = OpConstantComposite %v2half %half_0x1p_0 %half_0x1p_1
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %10 = OpCopyObject %v2half %9
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/32bit/vec2f16-vec2f16.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/32bit/vec2f16-vec2f16.wgsl.expected.wgsl
new file mode 100644
index 0000000..bebc4e7
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/32bit/vec2f16-vec2f16.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec2<f16> = vec2<f16>(1.0h, 2.0h);
+  let b : vec2<f16> = bitcast<vec2<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/48bit/vec3f16-vec3f16.wgsl b/test/tint/expressions/bitcast/let/48bit/vec3f16-vec3f16.wgsl
new file mode 100644
index 0000000..50a28e4
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/48bit/vec3f16-vec3f16.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec3<f16> = vec3<f16>(1.0h, 2.0h, 3.0h);
+    let b : vec3<f16> = bitcast<vec3<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/48bit/vec3f16-vec3f16.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/48bit/vec3f16-vec3f16.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..0dee574
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/48bit/vec3f16-vec3f16.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 3> a = vector<float16_t, 3>(float16_t(1.0h), float16_t(2.0h), float16_t(3.0h));
+  const vector<float16_t, 3> b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/48bit/vec3f16-vec3f16.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/48bit/vec3f16-vec3f16.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..9ff6da5
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/48bit/vec3f16-vec3f16.wgsl.expected.fxc.hlsl
@@ -0,0 +1,12 @@
+SKIP: FAILED
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 3> a = vector<float16_t, 3>(float16_t(1.0h), float16_t(2.0h), float16_t(3.0h));
+  const vector<float16_t, 3> b = a;
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x000001B8F32394E0(3,16-24): error X3000: syntax error: unexpected token 'float16_t'
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x000001B8F32394E0(4,16-24): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/expressions/bitcast/let/48bit/vec3f16-vec3f16.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/48bit/vec3f16-vec3f16.wgsl.expected.glsl
new file mode 100644
index 0000000..87d6082
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/48bit/vec3f16-vec3f16.wgsl.expected.glsl
@@ -0,0 +1,13 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+void f() {
+  f16vec3 a = f16vec3(1.0hf, 2.0hf, 3.0hf);
+  f16vec3 b = a;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/48bit/vec3f16-vec3f16.wgsl.expected.msl b/test/tint/expressions/bitcast/let/48bit/vec3f16-vec3f16.wgsl.expected.msl
new file mode 100644
index 0000000..4140fcc
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/48bit/vec3f16-vec3f16.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  half3 const a = half3(1.0h, 2.0h, 3.0h);
+  half3 const b = as_type<half3>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/48bit/vec3f16-vec3f16.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/48bit/vec3f16-vec3f16.wgsl.expected.spvasm
new file mode 100644
index 0000000..672bc91
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/48bit/vec3f16-vec3f16.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 12
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %half = OpTypeFloat 16
+     %v3half = OpTypeVector %half 3
+%half_0x1p_0 = OpConstant %half 0x1p+0
+%half_0x1p_1 = OpConstant %half 0x1p+1
+%half_0x1_8p_1 = OpConstant %half 0x1.8p+1
+         %10 = OpConstantComposite %v3half %half_0x1p_0 %half_0x1p_1 %half_0x1_8p_1
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %11 = OpCopyObject %v3half %10
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/48bit/vec3f16-vec3f16.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/48bit/vec3f16-vec3f16.wgsl.expected.wgsl
new file mode 100644
index 0000000..1978e44
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/48bit/vec3f16-vec3f16.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec3<f16> = vec3<f16>(1.0h, 2.0h, 3.0h);
+  let b : vec3<f16> = bitcast<vec3<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2f32.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2f32.wgsl
new file mode 100644
index 0000000..32368ca
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec2<f32> = vec2<f32>(2.003662109375f, -513.03125f);
+    let b : vec2<f32> = bitcast<vec2<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..65e80d4
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float2 a = float2(2.003662109375f, -513.03125f);
+  const float2 b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..65e80d4
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float2 a = float2(2.003662109375f, -513.03125f);
+  const float2 b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2f32.wgsl.expected.glsl
new file mode 100644
index 0000000..0872463
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2f32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  vec2 a = vec2(2.003662109375f, -513.03125f);
+  vec2 b = a;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2f32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2f32.wgsl.expected.msl
new file mode 100644
index 0000000..4cb1a4b
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2f32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float2 const a = float2(2.003662109375f, -513.03125f);
+  float2 const b = as_type<float2>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..c8dd7f4
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2f32.wgsl.expected.spvasm
@@ -0,0 +1,22 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 11
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%float_2_00366211 = OpConstant %float 2.00366211
+%float_n513_03125 = OpConstant %float -513.03125
+          %9 = OpConstantComposite %v2float %float_2_00366211 %float_n513_03125
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %10 = OpCopyObject %v2float %9
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..eab1d27
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec2<f32> = vec2<f32>(2.003662109375f, -(513.03125f));
+  let b : vec2<f32> = bitcast<vec2<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2i32.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2i32.wgsl
new file mode 100644
index 0000000..285f497
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec2<f32> = vec2<f32>(2.003662109375f, -513.03125f);
+    let b : vec2<i32> = bitcast<vec2<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..1897e4e
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float2 a = float2(2.003662109375f, -513.03125f);
+  const int2 b = asint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..1897e4e
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float2 a = float2(2.003662109375f, -513.03125f);
+  const int2 b = asint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2i32.wgsl.expected.glsl
new file mode 100644
index 0000000..068ddfe
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2i32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  vec2 a = vec2(2.003662109375f, -513.03125f);
+  ivec2 b = floatBitsToInt(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2i32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2i32.wgsl.expected.msl
new file mode 100644
index 0000000..8f30d64
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2i32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float2 const a = float2(2.003662109375f, -513.03125f);
+  int2 const b = as_type<int2>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..7d2ecc8
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2i32.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 13
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%float_2_00366211 = OpConstant %float 2.00366211
+%float_n513_03125 = OpConstant %float -513.03125
+          %9 = OpConstantComposite %v2float %float_2_00366211 %float_n513_03125
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %10 = OpBitcast %v2int %9
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..f582b89
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec2<f32> = vec2<f32>(2.003662109375f, -(513.03125f));
+  let b : vec2<i32> = bitcast<vec2<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2u32.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2u32.wgsl
new file mode 100644
index 0000000..e4f24a3
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec2<f32> = vec2<f32>(2.003662109375f, -513.03125f);
+    let b : vec2<u32> = bitcast<vec2<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..686d91c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float2 a = float2(2.003662109375f, -513.03125f);
+  const uint2 b = asuint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..686d91c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float2 a = float2(2.003662109375f, -513.03125f);
+  const uint2 b = asuint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2u32.wgsl.expected.glsl
new file mode 100644
index 0000000..6659b32
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2u32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  vec2 a = vec2(2.003662109375f, -513.03125f);
+  uvec2 b = floatBitsToUint(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2u32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2u32.wgsl.expected.msl
new file mode 100644
index 0000000..f0f9047
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2u32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float2 const a = float2(2.003662109375f, -513.03125f);
+  uint2 const b = as_type<uint2>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..b7e9c6a
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2u32.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 13
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%float_2_00366211 = OpConstant %float 2.00366211
+%float_n513_03125 = OpConstant %float -513.03125
+          %9 = OpConstantComposite %v2float %float_2_00366211 %float_n513_03125
+       %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %10 = OpBitcast %v2uint %9
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..19d887e
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec2u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec2<f32> = vec2<f32>(2.003662109375f, -(513.03125f));
+  let b : vec2<u32> = bitcast<vec2<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec4f16.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec4f16.wgsl
new file mode 100644
index 0000000..749e175
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec4f16.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec2<f32> = vec2<f32>(2.003662109375f, -513.03125f);
+    let b : vec4<f16> = bitcast<vec4<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec4f16.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec4f16.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..8066be5
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec4f16.wgsl.expected.dxc.hlsl
@@ -0,0 +1,13 @@
+vector<float16_t, 4> tint_bitcast_to_f16(float2 src) {
+  uint2 v = asuint(src);
+  float2 t_low = f16tof32(v & 0xffff);
+  float2 t_high = f16tof32((v >> 16) & 0xffff);
+  return vector<float16_t, 4>(t_low.x, t_high.x, t_low.y, t_high.y);
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const float2 a = float2(2.003662109375f, -513.03125f);
+  const vector<float16_t, 4> b = tint_bitcast_to_f16(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec4f16.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec4f16.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..72065cb
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec4f16.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+vector<float16_t, 4> tint_bitcast_to_f16(float2 src) {
+  uint2 v = asuint(src);
+  float2 t_low = f16tof32(v & 0xffff);
+  float2 t_high = f16tof32((v >> 16) & 0xffff);
+  return vector<float16_t, 4>(t_low.x, t_high.x, t_low.y, t_high.y);
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const float2 a = float2(2.003662109375f, -513.03125f);
+  const vector<float16_t, 4> b = tint_bitcast_to_f16(a);
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x000001B7D61710A0(1,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec4f16.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec4f16.wgsl.expected.glsl
new file mode 100644
index 0000000..5d7486c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec4f16.wgsl.expected.glsl
@@ -0,0 +1,20 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+f16vec4 tint_bitcast_to_f16(vec2 src) {
+  uvec2 r = floatBitsToUint(src);
+  f16vec2 v_xy = unpackFloat2x16(r.x);
+  f16vec2 v_zw = unpackFloat2x16(r.y);
+  return f16vec4(v_xy.x, v_xy.y, v_zw.x, v_zw.y);
+}
+
+void f() {
+  vec2 a = vec2(2.003662109375f, -513.03125f);
+  f16vec4 b = tint_bitcast_to_f16(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec4f16.wgsl.expected.msl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec4f16.wgsl.expected.msl
new file mode 100644
index 0000000..dba67de
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec4f16.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float2 const a = float2(2.003662109375f, -513.03125f);
+  half4 const b = as_type<half4>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec4f16.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec4f16.wgsl.expected.spvasm
new file mode 100644
index 0000000..b10191f
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec4f16.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 13
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%float_2_00366211 = OpConstant %float 2.00366211
+%float_n513_03125 = OpConstant %float -513.03125
+          %9 = OpConstantComposite %v2float %float_2_00366211 %float_n513_03125
+       %half = OpTypeFloat 16
+     %v4half = OpTypeVector %half 4
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %10 = OpBitcast %v4half %9
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2f32-vec4f16.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec4f16.wgsl.expected.wgsl
new file mode 100644
index 0000000..006866f
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2f32-vec4f16.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec2<f32> = vec2<f32>(2.003662109375f, -(513.03125f));
+  let b : vec4<f16> = bitcast<vec4<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2f32.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2f32.wgsl
new file mode 100644
index 0000000..1e25d19
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec2<i32> = vec2<i32>(1073757184i, -1006616064i);
+    let b : vec2<f32> = bitcast<vec2<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..87d52ff
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int2 a = int2(1073757184, -1006616064);
+  const float2 b = asfloat(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..87d52ff
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int2 a = int2(1073757184, -1006616064);
+  const float2 b = asfloat(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2f32.wgsl.expected.glsl
new file mode 100644
index 0000000..91a3fb9
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2f32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  ivec2 a = ivec2(1073757184, -1006616064);
+  vec2 b = intBitsToFloat(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2f32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2f32.wgsl.expected.msl
new file mode 100644
index 0000000..f8a2920
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2f32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int2 const a = int2(1073757184, -1006616064);
+  float2 const b = as_type<float2>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..c395100
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2f32.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 13
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%int_1073757184 = OpConstant %int 1073757184
+%int_n1006616064 = OpConstant %int -1006616064
+          %9 = OpConstantComposite %v2int %int_1073757184 %int_n1006616064
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %10 = OpBitcast %v2float %9
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..2bd8d1a
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec2<i32> = vec2<i32>(1073757184i, -(1006616064i));
+  let b : vec2<f32> = bitcast<vec2<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2i32.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2i32.wgsl
new file mode 100644
index 0000000..1dd0df9
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec2<i32> = vec2<i32>(1073757184i, -1006616064i);
+    let b : vec2<i32> = bitcast<vec2<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..4ffcee8
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int2 a = int2(1073757184, -1006616064);
+  const int2 b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..4ffcee8
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int2 a = int2(1073757184, -1006616064);
+  const int2 b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2i32.wgsl.expected.glsl
new file mode 100644
index 0000000..4372e5f
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2i32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  ivec2 a = ivec2(1073757184, -1006616064);
+  ivec2 b = a;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2i32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2i32.wgsl.expected.msl
new file mode 100644
index 0000000..1d3fef7
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2i32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int2 const a = int2(1073757184, -1006616064);
+  int2 const b = as_type<int2>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..ed618f9
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2i32.wgsl.expected.spvasm
@@ -0,0 +1,22 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 11
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%int_1073757184 = OpConstant %int 1073757184
+%int_n1006616064 = OpConstant %int -1006616064
+          %9 = OpConstantComposite %v2int %int_1073757184 %int_n1006616064
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %10 = OpCopyObject %v2int %9
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..e6019e9
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec2<i32> = vec2<i32>(1073757184i, -(1006616064i));
+  let b : vec2<i32> = bitcast<vec2<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2u32.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2u32.wgsl
new file mode 100644
index 0000000..bc2a0cc
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec2<i32> = vec2<i32>(1073757184i, -1006616064i);
+    let b : vec2<u32> = bitcast<vec2<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..b4d2cad
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int2 a = int2(1073757184, -1006616064);
+  const uint2 b = asuint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..b4d2cad
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int2 a = int2(1073757184, -1006616064);
+  const uint2 b = asuint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2u32.wgsl.expected.glsl
new file mode 100644
index 0000000..4ffe933
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2u32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  ivec2 a = ivec2(1073757184, -1006616064);
+  uvec2 b = uvec2(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2u32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2u32.wgsl.expected.msl
new file mode 100644
index 0000000..153c104
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2u32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int2 const a = int2(1073757184, -1006616064);
+  uint2 const b = as_type<uint2>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..df156eb
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2u32.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 13
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%int_1073757184 = OpConstant %int 1073757184
+%int_n1006616064 = OpConstant %int -1006616064
+          %9 = OpConstantComposite %v2int %int_1073757184 %int_n1006616064
+       %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %10 = OpBitcast %v2uint %9
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..ef6eac3
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec2u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec2<i32> = vec2<i32>(1073757184i, -(1006616064i));
+  let b : vec2<u32> = bitcast<vec2<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec4f16.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec4f16.wgsl
new file mode 100644
index 0000000..e86d914
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec4f16.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec2<i32> = vec2<i32>(1073757184i, -1006616064i);
+    let b : vec4<f16> = bitcast<vec4<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec4f16.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec4f16.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..08e5038
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec4f16.wgsl.expected.dxc.hlsl
@@ -0,0 +1,13 @@
+vector<float16_t, 4> tint_bitcast_to_f16(int2 src) {
+  uint2 v = asuint(src);
+  float2 t_low = f16tof32(v & 0xffff);
+  float2 t_high = f16tof32((v >> 16) & 0xffff);
+  return vector<float16_t, 4>(t_low.x, t_high.x, t_low.y, t_high.y);
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const int2 a = int2(1073757184, -1006616064);
+  const vector<float16_t, 4> b = tint_bitcast_to_f16(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec4f16.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec4f16.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..20d32a1
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec4f16.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+vector<float16_t, 4> tint_bitcast_to_f16(int2 src) {
+  uint2 v = asuint(src);
+  float2 t_low = f16tof32(v & 0xffff);
+  float2 t_high = f16tof32((v >> 16) & 0xffff);
+  return vector<float16_t, 4>(t_low.x, t_high.x, t_low.y, t_high.y);
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const int2 a = int2(1073757184, -1006616064);
+  const vector<float16_t, 4> b = tint_bitcast_to_f16(a);
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x000001D4589575D0(1,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec4f16.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec4f16.wgsl.expected.glsl
new file mode 100644
index 0000000..944404d
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec4f16.wgsl.expected.glsl
@@ -0,0 +1,20 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+f16vec4 tint_bitcast_to_f16(ivec2 src) {
+  uvec2 r = uvec2(src);
+  f16vec2 v_xy = unpackFloat2x16(r.x);
+  f16vec2 v_zw = unpackFloat2x16(r.y);
+  return f16vec4(v_xy.x, v_xy.y, v_zw.x, v_zw.y);
+}
+
+void f() {
+  ivec2 a = ivec2(1073757184, -1006616064);
+  f16vec4 b = tint_bitcast_to_f16(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec4f16.wgsl.expected.msl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec4f16.wgsl.expected.msl
new file mode 100644
index 0000000..91af62a
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec4f16.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int2 const a = int2(1073757184, -1006616064);
+  half4 const b = as_type<half4>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec4f16.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec4f16.wgsl.expected.spvasm
new file mode 100644
index 0000000..1a46b6d
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec4f16.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 13
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%int_1073757184 = OpConstant %int 1073757184
+%int_n1006616064 = OpConstant %int -1006616064
+          %9 = OpConstantComposite %v2int %int_1073757184 %int_n1006616064
+       %half = OpTypeFloat 16
+     %v4half = OpTypeVector %half 4
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %10 = OpBitcast %v4half %9
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2i32-vec4f16.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec4f16.wgsl.expected.wgsl
new file mode 100644
index 0000000..70da3ae
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2i32-vec4f16.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec2<i32> = vec2<i32>(1073757184i, -(1006616064i));
+  let b : vec4<f16> = bitcast<vec4<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2f32.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2f32.wgsl
new file mode 100644
index 0000000..e21a9d4
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec2<u32> = vec2<u32>(1073757184u, 3288351232u);
+    let b : vec2<f32> = bitcast<vec2<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..461d37f
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint2 a = uint2(1073757184u, 3288351232u);
+  const float2 b = asfloat(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..461d37f
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint2 a = uint2(1073757184u, 3288351232u);
+  const float2 b = asfloat(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2f32.wgsl.expected.glsl
new file mode 100644
index 0000000..ffe6d50
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2f32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  uvec2 a = uvec2(1073757184u, 3288351232u);
+  vec2 b = uintBitsToFloat(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2f32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2f32.wgsl.expected.msl
new file mode 100644
index 0000000..fe93e32
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2f32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint2 const a = uint2(1073757184u, 3288351232u);
+  float2 const b = as_type<float2>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..8f76d25
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2f32.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 13
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+%uint_1073757184 = OpConstant %uint 1073757184
+%uint_3288351232 = OpConstant %uint 3288351232
+          %9 = OpConstantComposite %v2uint %uint_1073757184 %uint_3288351232
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %10 = OpBitcast %v2float %9
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..ac7bcaf
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec2<u32> = vec2<u32>(1073757184u, 3288351232u);
+  let b : vec2<f32> = bitcast<vec2<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2i32.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2i32.wgsl
new file mode 100644
index 0000000..1c9a390
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec2<u32> = vec2<u32>(1073757184u, 3288351232u);
+    let b : vec2<i32> = bitcast<vec2<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..54f38c5
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint2 a = uint2(1073757184u, 3288351232u);
+  const int2 b = asint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..54f38c5
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint2 a = uint2(1073757184u, 3288351232u);
+  const int2 b = asint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2i32.wgsl.expected.glsl
new file mode 100644
index 0000000..b44a3a9
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2i32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  uvec2 a = uvec2(1073757184u, 3288351232u);
+  ivec2 b = ivec2(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2i32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2i32.wgsl.expected.msl
new file mode 100644
index 0000000..752e024
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2i32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint2 const a = uint2(1073757184u, 3288351232u);
+  int2 const b = as_type<int2>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..7359058
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2i32.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 13
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+%uint_1073757184 = OpConstant %uint 1073757184
+%uint_3288351232 = OpConstant %uint 3288351232
+          %9 = OpConstantComposite %v2uint %uint_1073757184 %uint_3288351232
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %10 = OpBitcast %v2int %9
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..a22a661
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec2<u32> = vec2<u32>(1073757184u, 3288351232u);
+  let b : vec2<i32> = bitcast<vec2<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2u32.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2u32.wgsl
new file mode 100644
index 0000000..8ec23d2
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec2<u32> = vec2<u32>(1073757184u, 3288351232u);
+    let b : vec2<u32> = bitcast<vec2<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..1c32887
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint2 a = uint2(1073757184u, 3288351232u);
+  const uint2 b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..1c32887
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint2 a = uint2(1073757184u, 3288351232u);
+  const uint2 b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2u32.wgsl.expected.glsl
new file mode 100644
index 0000000..2db386f
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2u32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  uvec2 a = uvec2(1073757184u, 3288351232u);
+  uvec2 b = a;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2u32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2u32.wgsl.expected.msl
new file mode 100644
index 0000000..fa0a35b
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2u32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint2 const a = uint2(1073757184u, 3288351232u);
+  uint2 const b = as_type<uint2>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..09aaab4
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2u32.wgsl.expected.spvasm
@@ -0,0 +1,22 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 11
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+%uint_1073757184 = OpConstant %uint 1073757184
+%uint_3288351232 = OpConstant %uint 3288351232
+          %9 = OpConstantComposite %v2uint %uint_1073757184 %uint_3288351232
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %10 = OpCopyObject %v2uint %9
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..d34282d
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec2u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec2<u32> = vec2<u32>(1073757184u, 3288351232u);
+  let b : vec2<u32> = bitcast<vec2<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec4f16.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec4f16.wgsl
new file mode 100644
index 0000000..7fa3884
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec4f16.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec2<u32> = vec2<u32>(1073757184u, 3288351232u);
+    let b : vec4<f16> = bitcast<vec4<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec4f16.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec4f16.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..feb63ec
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec4f16.wgsl.expected.dxc.hlsl
@@ -0,0 +1,13 @@
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = asuint(src);
+  float2 t_low = f16tof32(v & 0xffff);
+  float2 t_high = f16tof32((v >> 16) & 0xffff);
+  return vector<float16_t, 4>(t_low.x, t_high.x, t_low.y, t_high.y);
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const uint2 a = uint2(1073757184u, 3288351232u);
+  const vector<float16_t, 4> b = tint_bitcast_to_f16(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec4f16.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec4f16.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..99d0685
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec4f16.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = asuint(src);
+  float2 t_low = f16tof32(v & 0xffff);
+  float2 t_high = f16tof32((v >> 16) & 0xffff);
+  return vector<float16_t, 4>(t_low.x, t_high.x, t_low.y, t_high.y);
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const uint2 a = uint2(1073757184u, 3288351232u);
+  const vector<float16_t, 4> b = tint_bitcast_to_f16(a);
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x0000025566ACBF30(1,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec4f16.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec4f16.wgsl.expected.glsl
new file mode 100644
index 0000000..eb96e9c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec4f16.wgsl.expected.glsl
@@ -0,0 +1,20 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+f16vec4 tint_bitcast_to_f16(uvec2 src) {
+  uvec2 r = uvec2(src);
+  f16vec2 v_xy = unpackFloat2x16(r.x);
+  f16vec2 v_zw = unpackFloat2x16(r.y);
+  return f16vec4(v_xy.x, v_xy.y, v_zw.x, v_zw.y);
+}
+
+void f() {
+  uvec2 a = uvec2(1073757184u, 3288351232u);
+  f16vec4 b = tint_bitcast_to_f16(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec4f16.wgsl.expected.msl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec4f16.wgsl.expected.msl
new file mode 100644
index 0000000..653511e
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec4f16.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint2 const a = uint2(1073757184u, 3288351232u);
+  half4 const b = as_type<half4>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec4f16.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec4f16.wgsl.expected.spvasm
new file mode 100644
index 0000000..b987b28
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec4f16.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 13
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+%uint_1073757184 = OpConstant %uint 1073757184
+%uint_3288351232 = OpConstant %uint 3288351232
+          %9 = OpConstantComposite %v2uint %uint_1073757184 %uint_3288351232
+       %half = OpTypeFloat 16
+     %v4half = OpTypeVector %half 4
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %10 = OpBitcast %v4half %9
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/64bit/vec2u32-vec4f16.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec4f16.wgsl.expected.wgsl
new file mode 100644
index 0000000..04d36dc
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec2u32-vec4f16.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec2<u32> = vec2<u32>(1073757184u, 3288351232u);
+  let b : vec4<f16> = bitcast<vec4<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2f32.wgsl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2f32.wgsl
new file mode 100644
index 0000000..b1e60d8
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2f32.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec4<f16> = vec4<f16>(1.0h, 2.0h, 3.0h, -4.0h);
+    let b : vec2<f32> = bitcast<vec2<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..6766be1
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,11 @@
+float2 tint_bitcast_from_f16(vector<float16_t, 4> src) {
+  uint4 r = f32tof16(float4(src));
+  return asfloat(uint2((r.x & 0xffff) | ((r.y & 0xffff) << 16), (r.z & 0xffff) | ((r.w & 0xffff) << 16)));
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 4> a = vector<float16_t, 4>(float16_t(1.0h), float16_t(2.0h), float16_t(3.0h), float16_t(-4.0h));
+  const float2 b = tint_bitcast_from_f16(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..082c466
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+float2 tint_bitcast_from_f16(vector<float16_t, 4> src) {
+  uint4 r = f32tof16(float4(src));
+  return asfloat(uint2((r.x & 0xffff) | ((r.y & 0xffff) << 16), (r.z & 0xffff) | ((r.w & 0xffff) << 16)));
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 4> a = vector<float16_t, 4>(float16_t(1.0h), float16_t(2.0h), float16_t(3.0h), float16_t(-4.0h));
+  const float2 b = tint_bitcast_from_f16(a);
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x0000020C6564D210(1,37-45): error X3000: syntax error: unexpected token 'float16_t'
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x0000020C6564D210(2,29-31): error X3004: undeclared identifier 'src'
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x0000020C6564D210(2,22-32): error X3014: incorrect number of arguments to numeric-type constructor
+
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2f32.wgsl.expected.glsl
new file mode 100644
index 0000000..4427a4e
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2f32.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+vec2 tint_bitcast_from_f16(f16vec4 src) {
+  uvec2 r = uvec2(packFloat2x16(src.xy), packFloat2x16(src.zw));
+  return uintBitsToFloat(r);
+}
+
+void f() {
+  f16vec4 a = f16vec4(1.0hf, 2.0hf, 3.0hf, -4.0hf);
+  vec2 b = tint_bitcast_from_f16(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2f32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2f32.wgsl.expected.msl
new file mode 100644
index 0000000..153b504a
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2f32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  half4 const a = half4(1.0h, 2.0h, 3.0h, -4.0h);
+  float2 const b = as_type<float2>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..c29f96a
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2f32.wgsl.expected.spvasm
@@ -0,0 +1,30 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 15
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %half = OpTypeFloat 16
+     %v4half = OpTypeVector %half 4
+%half_0x1p_0 = OpConstant %half 0x1p+0
+%half_0x1p_1 = OpConstant %half 0x1p+1
+%half_0x1_8p_1 = OpConstant %half 0x1.8p+1
+%half_n0x1p_2 = OpConstant %half -0x1p+2
+         %11 = OpConstantComposite %v4half %half_0x1p_0 %half_0x1p_1 %half_0x1_8p_1 %half_n0x1p_2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %12 = OpBitcast %v2float %11
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..3f31135
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2f32.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec4<f16> = vec4<f16>(1.0h, 2.0h, 3.0h, -(4.0h));
+  let b : vec2<f32> = bitcast<vec2<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2i32.wgsl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2i32.wgsl
new file mode 100644
index 0000000..5aa0ac6
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2i32.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec4<f16> = vec4<f16>(1.0h, 2.0h, 3.0h, -4.0h);
+    let b : vec2<i32> = bitcast<vec2<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..375b455
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,11 @@
+int2 tint_bitcast_from_f16(vector<float16_t, 4> src) {
+  uint4 r = f32tof16(float4(src));
+  return asint(uint2((r.x & 0xffff) | ((r.y & 0xffff) << 16), (r.z & 0xffff) | ((r.w & 0xffff) << 16)));
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 4> a = vector<float16_t, 4>(float16_t(1.0h), float16_t(2.0h), float16_t(3.0h), float16_t(-4.0h));
+  const int2 b = tint_bitcast_from_f16(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..0c5ee40
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+int2 tint_bitcast_from_f16(vector<float16_t, 4> src) {
+  uint4 r = f32tof16(float4(src));
+  return asint(uint2((r.x & 0xffff) | ((r.y & 0xffff) << 16), (r.z & 0xffff) | ((r.w & 0xffff) << 16)));
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 4> a = vector<float16_t, 4>(float16_t(1.0h), float16_t(2.0h), float16_t(3.0h), float16_t(-4.0h));
+  const int2 b = tint_bitcast_from_f16(a);
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x00000239A5C0BF60(1,35-43): error X3000: syntax error: unexpected token 'float16_t'
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x00000239A5C0BF60(2,29-31): error X3004: undeclared identifier 'src'
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x00000239A5C0BF60(2,22-32): error X3014: incorrect number of arguments to numeric-type constructor
+
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2i32.wgsl.expected.glsl
new file mode 100644
index 0000000..85e513f
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2i32.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+ivec2 tint_bitcast_from_f16(f16vec4 src) {
+  uvec2 r = uvec2(packFloat2x16(src.xy), packFloat2x16(src.zw));
+  return ivec2(r);
+}
+
+void f() {
+  f16vec4 a = f16vec4(1.0hf, 2.0hf, 3.0hf, -4.0hf);
+  ivec2 b = tint_bitcast_from_f16(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2i32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2i32.wgsl.expected.msl
new file mode 100644
index 0000000..dd88cf9
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2i32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  half4 const a = half4(1.0h, 2.0h, 3.0h, -4.0h);
+  int2 const b = as_type<int2>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..9cbb955
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2i32.wgsl.expected.spvasm
@@ -0,0 +1,30 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 15
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %half = OpTypeFloat 16
+     %v4half = OpTypeVector %half 4
+%half_0x1p_0 = OpConstant %half 0x1p+0
+%half_0x1p_1 = OpConstant %half 0x1p+1
+%half_0x1_8p_1 = OpConstant %half 0x1.8p+1
+%half_n0x1p_2 = OpConstant %half -0x1p+2
+         %11 = OpConstantComposite %v4half %half_0x1p_0 %half_0x1p_1 %half_0x1_8p_1 %half_n0x1p_2
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %12 = OpBitcast %v2int %11
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..64ee2ff
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2i32.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec4<f16> = vec4<f16>(1.0h, 2.0h, 3.0h, -(4.0h));
+  let b : vec2<i32> = bitcast<vec2<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2u32.wgsl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2u32.wgsl
new file mode 100644
index 0000000..6621f8e
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2u32.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec4<f16> = vec4<f16>(1.0h, 2.0h, 3.0h, -4.0h);
+    let b : vec2<u32> = bitcast<vec2<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..714aefa
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,11 @@
+uint2 tint_bitcast_from_f16(vector<float16_t, 4> src) {
+  uint4 r = f32tof16(float4(src));
+  return asuint(uint2((r.x & 0xffff) | ((r.y & 0xffff) << 16), (r.z & 0xffff) | ((r.w & 0xffff) << 16)));
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 4> a = vector<float16_t, 4>(float16_t(1.0h), float16_t(2.0h), float16_t(3.0h), float16_t(-4.0h));
+  const uint2 b = tint_bitcast_from_f16(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..34216ad
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+uint2 tint_bitcast_from_f16(vector<float16_t, 4> src) {
+  uint4 r = f32tof16(float4(src));
+  return asuint(uint2((r.x & 0xffff) | ((r.y & 0xffff) << 16), (r.z & 0xffff) | ((r.w & 0xffff) << 16)));
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 4> a = vector<float16_t, 4>(float16_t(1.0h), float16_t(2.0h), float16_t(3.0h), float16_t(-4.0h));
+  const uint2 b = tint_bitcast_from_f16(a);
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x0000024F04F3BED0(1,36-44): error X3000: syntax error: unexpected token 'float16_t'
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x0000024F04F3BED0(2,29-31): error X3004: undeclared identifier 'src'
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x0000024F04F3BED0(2,22-32): error X3014: incorrect number of arguments to numeric-type constructor
+
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2u32.wgsl.expected.glsl
new file mode 100644
index 0000000..4a24f1e
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2u32.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+uvec2 tint_bitcast_from_f16(f16vec4 src) {
+  uvec2 r = uvec2(packFloat2x16(src.xy), packFloat2x16(src.zw));
+  return uvec2(r);
+}
+
+void f() {
+  f16vec4 a = f16vec4(1.0hf, 2.0hf, 3.0hf, -4.0hf);
+  uvec2 b = tint_bitcast_from_f16(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2u32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2u32.wgsl.expected.msl
new file mode 100644
index 0000000..e24fd95
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2u32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  half4 const a = half4(1.0h, 2.0h, 3.0h, -4.0h);
+  uint2 const b = as_type<uint2>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..5f03f8d
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2u32.wgsl.expected.spvasm
@@ -0,0 +1,30 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 15
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %half = OpTypeFloat 16
+     %v4half = OpTypeVector %half 4
+%half_0x1p_0 = OpConstant %half 0x1p+0
+%half_0x1p_1 = OpConstant %half 0x1p+1
+%half_0x1_8p_1 = OpConstant %half 0x1.8p+1
+%half_n0x1p_2 = OpConstant %half -0x1p+2
+         %11 = OpConstantComposite %v4half %half_0x1p_0 %half_0x1p_1 %half_0x1_8p_1 %half_n0x1p_2
+       %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %12 = OpBitcast %v2uint %11
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..ad16683
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec2u32.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec4<f16> = vec4<f16>(1.0h, 2.0h, 3.0h, -(4.0h));
+  let b : vec2<u32> = bitcast<vec2<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec4f16.wgsl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec4f16.wgsl
new file mode 100644
index 0000000..150dcb7
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec4f16.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec4<f16> = vec4<f16>(1.0h, 2.0h, 3.0h, -4.0h);
+    let b : vec4<f16> = bitcast<vec4<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec4f16.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec4f16.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..428e4b1
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec4f16.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 4> a = vector<float16_t, 4>(float16_t(1.0h), float16_t(2.0h), float16_t(3.0h), float16_t(-4.0h));
+  const vector<float16_t, 4> b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec4f16.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec4f16.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..9722feb
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec4f16.wgsl.expected.fxc.hlsl
@@ -0,0 +1,12 @@
+SKIP: FAILED
+
+[numthreads(1, 1, 1)]
+void f() {
+  const vector<float16_t, 4> a = vector<float16_t, 4>(float16_t(1.0h), float16_t(2.0h), float16_t(3.0h), float16_t(-4.0h));
+  const vector<float16_t, 4> b = a;
+  return;
+}
+FXC validation failure:
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x0000021AD80372B0(3,16-24): error X3000: syntax error: unexpected token 'float16_t'
+D:\Projects\RampUp\dawn\test\tint\expressions\bitcast\Shader@0x0000021AD80372B0(4,16-24): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec4f16.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec4f16.wgsl.expected.glsl
new file mode 100644
index 0000000..bc19264
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec4f16.wgsl.expected.glsl
@@ -0,0 +1,13 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float : require
+
+void f() {
+  f16vec4 a = f16vec4(1.0hf, 2.0hf, 3.0hf, -4.0hf);
+  f16vec4 b = a;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec4f16.wgsl.expected.msl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec4f16.wgsl.expected.msl
new file mode 100644
index 0000000..84ceb08
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec4f16.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  half4 const a = half4(1.0h, 2.0h, 3.0h, -4.0h);
+  half4 const b = as_type<half4>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec4f16.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec4f16.wgsl.expected.spvasm
new file mode 100644
index 0000000..07fc694
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec4f16.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 13
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability StorageInputOutput16
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %half = OpTypeFloat 16
+     %v4half = OpTypeVector %half 4
+%half_0x1p_0 = OpConstant %half 0x1p+0
+%half_0x1p_1 = OpConstant %half 0x1p+1
+%half_0x1_8p_1 = OpConstant %half 0x1.8p+1
+%half_n0x1p_2 = OpConstant %half -0x1p+2
+         %11 = OpConstantComposite %v4half %half_0x1p_0 %half_0x1p_1 %half_0x1_8p_1 %half_n0x1p_2
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %12 = OpCopyObject %v4half %11
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/64bit/vec4f16-vec4f16.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec4f16.wgsl.expected.wgsl
new file mode 100644
index 0000000..325493c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/64bit/vec4f16-vec4f16.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+enable f16;
+
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec4<f16> = vec4<f16>(1.0h, 2.0h, 3.0h, -(4.0h));
+  let b : vec4<f16> = bitcast<vec4<f16>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3f32.wgsl b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3f32.wgsl
new file mode 100644
index 0000000..7c66aaa
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec3<f32> = vec3<f32>(2.003662109375f, -513.03125f, -1024.25f);
+    let b : vec3<f32> = bitcast<vec3<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..0995b1c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float3 a = float3(2.003662109375f, -513.03125f, -1024.25f);
+  const float3 b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..0995b1c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float3 a = float3(2.003662109375f, -513.03125f, -1024.25f);
+  const float3 b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3f32.wgsl.expected.glsl
new file mode 100644
index 0000000..c180d38
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3f32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  vec3 a = vec3(2.003662109375f, -513.03125f, -1024.25f);
+  vec3 b = a;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3f32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3f32.wgsl.expected.msl
new file mode 100644
index 0000000..a44d0af
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3f32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float3 const a = float3(2.003662109375f, -513.03125f, -1024.25f);
+  float3 const b = as_type<float3>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..65d1a6d
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3f32.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 12
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%float_2_00366211 = OpConstant %float 2.00366211
+%float_n513_03125 = OpConstant %float -513.03125
+%float_n1024_25 = OpConstant %float -1024.25
+         %10 = OpConstantComposite %v3float %float_2_00366211 %float_n513_03125 %float_n1024_25
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %11 = OpCopyObject %v3float %10
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..3afe3f7
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec3<f32> = vec3<f32>(2.003662109375f, -(513.03125f), -(1024.25f));
+  let b : vec3<f32> = bitcast<vec3<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3i32.wgsl b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3i32.wgsl
new file mode 100644
index 0000000..9d30b34
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec3<f32> = vec3<f32>(2.003662109375f, -513.03125f, -1024.25f);
+    let b : vec3<i32> = bitcast<vec3<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..4ed014e
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float3 a = float3(2.003662109375f, -513.03125f, -1024.25f);
+  const int3 b = asint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..4ed014e
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float3 a = float3(2.003662109375f, -513.03125f, -1024.25f);
+  const int3 b = asint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3i32.wgsl.expected.glsl
new file mode 100644
index 0000000..ca78049
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3i32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  vec3 a = vec3(2.003662109375f, -513.03125f, -1024.25f);
+  ivec3 b = floatBitsToInt(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3i32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3i32.wgsl.expected.msl
new file mode 100644
index 0000000..75f0d7c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3i32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float3 const a = float3(2.003662109375f, -513.03125f, -1024.25f);
+  int3 const b = as_type<int3>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..7641923
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3i32.wgsl.expected.spvasm
@@ -0,0 +1,25 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 14
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%float_2_00366211 = OpConstant %float 2.00366211
+%float_n513_03125 = OpConstant %float -513.03125
+%float_n1024_25 = OpConstant %float -1024.25
+         %10 = OpConstantComposite %v3float %float_2_00366211 %float_n513_03125 %float_n1024_25
+        %int = OpTypeInt 32 1
+      %v3int = OpTypeVector %int 3
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %11 = OpBitcast %v3int %10
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..3e20737
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec3<f32> = vec3<f32>(2.003662109375f, -(513.03125f), -(1024.25f));
+  let b : vec3<i32> = bitcast<vec3<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3u32.wgsl b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3u32.wgsl
new file mode 100644
index 0000000..8e0ee45
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec3<f32> = vec3<f32>(2.003662109375f, -513.03125f, -1024.25f);
+    let b : vec3<u32> = bitcast<vec3<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..64593f0
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float3 a = float3(2.003662109375f, -513.03125f, -1024.25f);
+  const uint3 b = asuint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..64593f0
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const float3 a = float3(2.003662109375f, -513.03125f, -1024.25f);
+  const uint3 b = asuint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3u32.wgsl.expected.glsl
new file mode 100644
index 0000000..6d05d4a
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3u32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  vec3 a = vec3(2.003662109375f, -513.03125f, -1024.25f);
+  uvec3 b = floatBitsToUint(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3u32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3u32.wgsl.expected.msl
new file mode 100644
index 0000000..6309989
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3u32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  float3 const a = float3(2.003662109375f, -513.03125f, -1024.25f);
+  uint3 const b = as_type<uint3>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..bb9dfcb
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3u32.wgsl.expected.spvasm
@@ -0,0 +1,25 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 14
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%float_2_00366211 = OpConstant %float 2.00366211
+%float_n513_03125 = OpConstant %float -513.03125
+%float_n1024_25 = OpConstant %float -1024.25
+         %10 = OpConstantComposite %v3float %float_2_00366211 %float_n513_03125 %float_n1024_25
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %11 = OpBitcast %v3uint %10
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..e6ae6f1
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3f32-vec3u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec3<f32> = vec3<f32>(2.003662109375f, -(513.03125f), -(1024.25f));
+  let b : vec3<u32> = bitcast<vec3<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3f32.wgsl b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3f32.wgsl
new file mode 100644
index 0000000..c4e14a5
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec3<i32> = vec3<i32>(1073757184i, -1006616064i, -998242304i);
+    let b : vec3<f32> = bitcast<vec3<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..a720745
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int3 a = int3(1073757184, -1006616064, -998242304);
+  const float3 b = asfloat(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..a720745
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int3 a = int3(1073757184, -1006616064, -998242304);
+  const float3 b = asfloat(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3f32.wgsl.expected.glsl
new file mode 100644
index 0000000..a47279a
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3f32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  ivec3 a = ivec3(1073757184, -1006616064, -998242304);
+  vec3 b = intBitsToFloat(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3f32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3f32.wgsl.expected.msl
new file mode 100644
index 0000000..8108b04
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3f32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int3 const a = int3(1073757184, -1006616064, -998242304);
+  float3 const b = as_type<float3>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..63eac5a
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3f32.wgsl.expected.spvasm
@@ -0,0 +1,25 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 14
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v3int = OpTypeVector %int 3
+%int_1073757184 = OpConstant %int 1073757184
+%int_n1006616064 = OpConstant %int -1006616064
+%int_n998242304 = OpConstant %int -998242304
+         %10 = OpConstantComposite %v3int %int_1073757184 %int_n1006616064 %int_n998242304
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %11 = OpBitcast %v3float %10
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..1acde43
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec3<i32> = vec3<i32>(1073757184i, -(1006616064i), -(998242304i));
+  let b : vec3<f32> = bitcast<vec3<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3i32.wgsl b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3i32.wgsl
new file mode 100644
index 0000000..b030062
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec3<i32> = vec3<i32>(1073757184i, -1006616064i, -998242304i);
+    let b : vec3<i32> = bitcast<vec3<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..ac9d58a
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int3 a = int3(1073757184, -1006616064, -998242304);
+  const int3 b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..ac9d58a
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int3 a = int3(1073757184, -1006616064, -998242304);
+  const int3 b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3i32.wgsl.expected.glsl
new file mode 100644
index 0000000..cb3d62d
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3i32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  ivec3 a = ivec3(1073757184, -1006616064, -998242304);
+  ivec3 b = a;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3i32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3i32.wgsl.expected.msl
new file mode 100644
index 0000000..757d79c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3i32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int3 const a = int3(1073757184, -1006616064, -998242304);
+  int3 const b = as_type<int3>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..e062c57
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3i32.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 12
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v3int = OpTypeVector %int 3
+%int_1073757184 = OpConstant %int 1073757184
+%int_n1006616064 = OpConstant %int -1006616064
+%int_n998242304 = OpConstant %int -998242304
+         %10 = OpConstantComposite %v3int %int_1073757184 %int_n1006616064 %int_n998242304
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %11 = OpCopyObject %v3int %10
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..b4ed95c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec3<i32> = vec3<i32>(1073757184i, -(1006616064i), -(998242304i));
+  let b : vec3<i32> = bitcast<vec3<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3u32.wgsl b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3u32.wgsl
new file mode 100644
index 0000000..325df7e
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec3<i32> = vec3<i32>(1073757184i, -1006616064i, -998242304i);
+    let b : vec3<u32> = bitcast<vec3<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..d57db76
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int3 a = int3(1073757184, -1006616064, -998242304);
+  const uint3 b = asuint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..d57db76
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const int3 a = int3(1073757184, -1006616064, -998242304);
+  const uint3 b = asuint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3u32.wgsl.expected.glsl
new file mode 100644
index 0000000..ecba9eb
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3u32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  ivec3 a = ivec3(1073757184, -1006616064, -998242304);
+  uvec3 b = uvec3(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3u32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3u32.wgsl.expected.msl
new file mode 100644
index 0000000..0e9fda1
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3u32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  int3 const a = int3(1073757184, -1006616064, -998242304);
+  uint3 const b = as_type<uint3>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..b3bd45b
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3u32.wgsl.expected.spvasm
@@ -0,0 +1,25 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 14
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v3int = OpTypeVector %int 3
+%int_1073757184 = OpConstant %int 1073757184
+%int_n1006616064 = OpConstant %int -1006616064
+%int_n998242304 = OpConstant %int -998242304
+         %10 = OpConstantComposite %v3int %int_1073757184 %int_n1006616064 %int_n998242304
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %11 = OpBitcast %v3uint %10
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..6f851d0
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3i32-vec3u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec3<i32> = vec3<i32>(1073757184i, -(1006616064i), -(998242304i));
+  let b : vec3<u32> = bitcast<vec3<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3f32.wgsl b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3f32.wgsl
new file mode 100644
index 0000000..a8451f8
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3f32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec3<u32> = vec3<u32>(1073757184u, 3288351232u, 3296724992u);
+    let b : vec3<f32> = bitcast<vec3<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3f32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..af59233
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3f32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint3 a = uint3(1073757184u, 3288351232u, 3296724992u);
+  const float3 b = asfloat(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3f32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..af59233
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3f32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint3 a = uint3(1073757184u, 3288351232u, 3296724992u);
+  const float3 b = asfloat(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3f32.wgsl.expected.glsl
new file mode 100644
index 0000000..0c0f85a
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3f32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  uvec3 a = uvec3(1073757184u, 3288351232u, 3296724992u);
+  vec3 b = uintBitsToFloat(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3f32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3f32.wgsl.expected.msl
new file mode 100644
index 0000000..d6b2204
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3f32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint3 const a = uint3(1073757184u, 3288351232u, 3296724992u);
+  float3 const b = as_type<float3>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..37ac337
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3f32.wgsl.expected.spvasm
@@ -0,0 +1,25 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 14
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%uint_1073757184 = OpConstant %uint 1073757184
+%uint_3288351232 = OpConstant %uint 3288351232
+%uint_3296724992 = OpConstant %uint 3296724992
+         %10 = OpConstantComposite %v3uint %uint_1073757184 %uint_3288351232 %uint_3296724992
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %11 = OpBitcast %v3float %10
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..a41efb5
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3f32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec3<u32> = vec3<u32>(1073757184u, 3288351232u, 3296724992u);
+  let b : vec3<f32> = bitcast<vec3<f32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3i32.wgsl b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3i32.wgsl
new file mode 100644
index 0000000..e4eb98c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec3<u32> = vec3<u32>(1073757184u, 3288351232u, 3296724992u);
+    let b : vec3<i32> = bitcast<vec3<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3i32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..0447999
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3i32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint3 a = uint3(1073757184u, 3288351232u, 3296724992u);
+  const int3 b = asint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3i32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..0447999
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3i32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint3 a = uint3(1073757184u, 3288351232u, 3296724992u);
+  const int3 b = asint(a);
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3i32.wgsl.expected.glsl
new file mode 100644
index 0000000..1a2d8a0
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3i32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  uvec3 a = uvec3(1073757184u, 3288351232u, 3296724992u);
+  ivec3 b = ivec3(a);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3i32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3i32.wgsl.expected.msl
new file mode 100644
index 0000000..5cc822f
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3i32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint3 const a = uint3(1073757184u, 3288351232u, 3296724992u);
+  int3 const b = as_type<int3>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..d1fb823
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3i32.wgsl.expected.spvasm
@@ -0,0 +1,25 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 14
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%uint_1073757184 = OpConstant %uint 1073757184
+%uint_3288351232 = OpConstant %uint 3288351232
+%uint_3296724992 = OpConstant %uint 3296724992
+         %10 = OpConstantComposite %v3uint %uint_1073757184 %uint_3288351232 %uint_3296724992
+        %int = OpTypeInt 32 1
+      %v3int = OpTypeVector %int 3
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %11 = OpBitcast %v3int %10
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..de86c2d
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec3<u32> = vec3<u32>(1073757184u, 3288351232u, 3296724992u);
+  let b : vec3<i32> = bitcast<vec3<i32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3u32.wgsl b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3u32.wgsl
new file mode 100644
index 0000000..e56603f
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3u32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+    let a : vec3<u32> = vec3<u32>(1073757184u, 3288351232u, 3296724992u);
+    let b : vec3<u32> = bitcast<vec3<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3u32.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..899328c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3u32.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint3 a = uint3(1073757184u, 3288351232u, 3296724992u);
+  const uint3 b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3u32.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..899328c
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3u32.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+  const uint3 a = uint3(1073757184u, 3288351232u, 3296724992u);
+  const uint3 b = a;
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3u32.wgsl.expected.glsl
new file mode 100644
index 0000000..66a482a2
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3u32.wgsl.expected.glsl
@@ -0,0 +1,12 @@
+#version 310 es
+
+void f() {
+  uvec3 a = uvec3(1073757184u, 3288351232u, 3296724992u);
+  uvec3 b = a;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  f();
+  return;
+}
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3u32.wgsl.expected.msl b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3u32.wgsl.expected.msl
new file mode 100644
index 0000000..8816932
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3u32.wgsl.expected.msl
@@ -0,0 +1,9 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+  uint3 const a = uint3(1073757184u, 3288351232u, 3296724992u);
+  uint3 const b = as_type<uint3>(a);
+  return;
+}
+
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..9654c41
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3u32.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 12
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %f "f"
+               OpExecutionMode %f LocalSize 1 1 1
+               OpName %f "f"
+       %void = OpTypeVoid
+          %1 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%uint_1073757184 = OpConstant %uint 1073757184
+%uint_3288351232 = OpConstant %uint 3288351232
+%uint_3296724992 = OpConstant %uint 3296724992
+         %10 = OpConstantComposite %v3uint %uint_1073757184 %uint_3288351232 %uint_3296724992
+          %f = OpFunction %void None %1
+          %4 = OpLabel
+         %11 = OpCopyObject %v3uint %10
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..8817a0b
--- /dev/null
+++ b/test/tint/expressions/bitcast/let/96bit/vec3u32-vec3u32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn f() {
+  let a : vec3<u32> = vec3<u32>(1073757184u, 3288351232u, 3296724992u);
+  let b : vec3<u32> = bitcast<vec3<u32>>(a);
+}
diff --git a/test/tint/expressions/bitcast/scalar/f32-f32.wgsl b/test/tint/expressions/bitcast/scalar/f32-f32.wgsl
deleted file mode 100644
index 5243db2..0000000
--- a/test/tint/expressions/bitcast/scalar/f32-f32.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-    let a : f32 = 1.;
-    let b : f32 = bitcast<f32>(a);
-}
diff --git a/test/tint/expressions/bitcast/scalar/f32-f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/scalar/f32-f32.wgsl.expected.dxc.hlsl
deleted file mode 100644
index 3812633..0000000
--- a/test/tint/expressions/bitcast/scalar/f32-f32.wgsl.expected.dxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const float a = 1.0f;
-  const float b = asfloat(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/f32-f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/scalar/f32-f32.wgsl.expected.fxc.hlsl
deleted file mode 100644
index 3812633..0000000
--- a/test/tint/expressions/bitcast/scalar/f32-f32.wgsl.expected.fxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const float a = 1.0f;
-  const float b = asfloat(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/f32-f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/scalar/f32-f32.wgsl.expected.glsl
deleted file mode 100644
index 04cce1f..0000000
--- a/test/tint/expressions/bitcast/scalar/f32-f32.wgsl.expected.glsl
+++ /dev/null
@@ -1,12 +0,0 @@
-#version 310 es
-
-void f() {
-  float a = 1.0f;
-  float b = a;
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  f();
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/f32-f32.wgsl.expected.msl b/test/tint/expressions/bitcast/scalar/f32-f32.wgsl.expected.msl
deleted file mode 100644
index ea55957..0000000
--- a/test/tint/expressions/bitcast/scalar/f32-f32.wgsl.expected.msl
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <metal_stdlib>
-
-using namespace metal;
-kernel void f() {
-  float const a = 1.0f;
-  float const b = as_type<float>(a);
-  return;
-}
-
diff --git a/test/tint/expressions/bitcast/scalar/f32-f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/scalar/f32-f32.wgsl.expected.spvasm
deleted file mode 100644
index 9153635..0000000
--- a/test/tint/expressions/bitcast/scalar/f32-f32.wgsl.expected.spvasm
+++ /dev/null
@@ -1,19 +0,0 @@
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 8
-; Schema: 0
-               OpCapability Shader
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint GLCompute %f "f"
-               OpExecutionMode %f LocalSize 1 1 1
-               OpName %f "f"
-       %void = OpTypeVoid
-          %1 = OpTypeFunction %void
-      %float = OpTypeFloat 32
-    %float_1 = OpConstant %float 1
-          %f = OpFunction %void None %1
-          %4 = OpLabel
-          %7 = OpCopyObject %float %float_1
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/scalar/f32-f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/scalar/f32-f32.wgsl.expected.wgsl
deleted file mode 100644
index 2cd5405..0000000
--- a/test/tint/expressions/bitcast/scalar/f32-f32.wgsl.expected.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-  let a : f32 = 1.0;
-  let b : f32 = bitcast<f32>(a);
-}
diff --git a/test/tint/expressions/bitcast/scalar/f32-i32.wgsl b/test/tint/expressions/bitcast/scalar/f32-i32.wgsl
deleted file mode 100644
index 40d370f..0000000
--- a/test/tint/expressions/bitcast/scalar/f32-i32.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-    let a : f32 = 1.;
-    let b : i32 = bitcast<i32>(a);
-}
diff --git a/test/tint/expressions/bitcast/scalar/f32-i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/scalar/f32-i32.wgsl.expected.dxc.hlsl
deleted file mode 100644
index 17af44a..0000000
--- a/test/tint/expressions/bitcast/scalar/f32-i32.wgsl.expected.dxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const float a = 1.0f;
-  const int b = asint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/f32-i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/scalar/f32-i32.wgsl.expected.fxc.hlsl
deleted file mode 100644
index 17af44a..0000000
--- a/test/tint/expressions/bitcast/scalar/f32-i32.wgsl.expected.fxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const float a = 1.0f;
-  const int b = asint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/f32-i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/scalar/f32-i32.wgsl.expected.glsl
deleted file mode 100644
index af1d8fa..0000000
--- a/test/tint/expressions/bitcast/scalar/f32-i32.wgsl.expected.glsl
+++ /dev/null
@@ -1,12 +0,0 @@
-#version 310 es
-
-void f() {
-  float a = 1.0f;
-  int b = floatBitsToInt(a);
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  f();
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/f32-i32.wgsl.expected.msl b/test/tint/expressions/bitcast/scalar/f32-i32.wgsl.expected.msl
deleted file mode 100644
index a2bdd13..0000000
--- a/test/tint/expressions/bitcast/scalar/f32-i32.wgsl.expected.msl
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <metal_stdlib>
-
-using namespace metal;
-kernel void f() {
-  float const a = 1.0f;
-  int const b = as_type<int>(a);
-  return;
-}
-
diff --git a/test/tint/expressions/bitcast/scalar/f32-i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/scalar/f32-i32.wgsl.expected.spvasm
deleted file mode 100644
index bea1419..0000000
--- a/test/tint/expressions/bitcast/scalar/f32-i32.wgsl.expected.spvasm
+++ /dev/null
@@ -1,20 +0,0 @@
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 9
-; Schema: 0
-               OpCapability Shader
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint GLCompute %f "f"
-               OpExecutionMode %f LocalSize 1 1 1
-               OpName %f "f"
-       %void = OpTypeVoid
-          %1 = OpTypeFunction %void
-      %float = OpTypeFloat 32
-    %float_1 = OpConstant %float 1
-        %int = OpTypeInt 32 1
-          %f = OpFunction %void None %1
-          %4 = OpLabel
-          %7 = OpBitcast %int %float_1
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/scalar/f32-i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/scalar/f32-i32.wgsl.expected.wgsl
deleted file mode 100644
index 20807eb..0000000
--- a/test/tint/expressions/bitcast/scalar/f32-i32.wgsl.expected.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-  let a : f32 = 1.0;
-  let b : i32 = bitcast<i32>(a);
-}
diff --git a/test/tint/expressions/bitcast/scalar/f32-u32.wgsl b/test/tint/expressions/bitcast/scalar/f32-u32.wgsl
deleted file mode 100644
index 9cf72ec..0000000
--- a/test/tint/expressions/bitcast/scalar/f32-u32.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-    let a : f32 = 1.;
-    let b : u32 = bitcast<u32>(a);
-}
diff --git a/test/tint/expressions/bitcast/scalar/f32-u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/scalar/f32-u32.wgsl.expected.dxc.hlsl
deleted file mode 100644
index 2b80226..0000000
--- a/test/tint/expressions/bitcast/scalar/f32-u32.wgsl.expected.dxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const float a = 1.0f;
-  const uint b = asuint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/f32-u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/scalar/f32-u32.wgsl.expected.fxc.hlsl
deleted file mode 100644
index 2b80226..0000000
--- a/test/tint/expressions/bitcast/scalar/f32-u32.wgsl.expected.fxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const float a = 1.0f;
-  const uint b = asuint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/f32-u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/scalar/f32-u32.wgsl.expected.glsl
deleted file mode 100644
index 10cce94..0000000
--- a/test/tint/expressions/bitcast/scalar/f32-u32.wgsl.expected.glsl
+++ /dev/null
@@ -1,12 +0,0 @@
-#version 310 es
-
-void f() {
-  float a = 1.0f;
-  uint b = floatBitsToUint(a);
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  f();
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/f32-u32.wgsl.expected.msl b/test/tint/expressions/bitcast/scalar/f32-u32.wgsl.expected.msl
deleted file mode 100644
index f0e4685..0000000
--- a/test/tint/expressions/bitcast/scalar/f32-u32.wgsl.expected.msl
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <metal_stdlib>
-
-using namespace metal;
-kernel void f() {
-  float const a = 1.0f;
-  uint const b = as_type<uint>(a);
-  return;
-}
-
diff --git a/test/tint/expressions/bitcast/scalar/f32-u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/scalar/f32-u32.wgsl.expected.spvasm
deleted file mode 100644
index cc94dcd..0000000
--- a/test/tint/expressions/bitcast/scalar/f32-u32.wgsl.expected.spvasm
+++ /dev/null
@@ -1,20 +0,0 @@
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 9
-; Schema: 0
-               OpCapability Shader
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint GLCompute %f "f"
-               OpExecutionMode %f LocalSize 1 1 1
-               OpName %f "f"
-       %void = OpTypeVoid
-          %1 = OpTypeFunction %void
-      %float = OpTypeFloat 32
-    %float_1 = OpConstant %float 1
-       %uint = OpTypeInt 32 0
-          %f = OpFunction %void None %1
-          %4 = OpLabel
-          %7 = OpBitcast %uint %float_1
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/scalar/f32-u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/scalar/f32-u32.wgsl.expected.wgsl
deleted file mode 100644
index 3850451..0000000
--- a/test/tint/expressions/bitcast/scalar/f32-u32.wgsl.expected.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-  let a : f32 = 1.0;
-  let b : u32 = bitcast<u32>(a);
-}
diff --git a/test/tint/expressions/bitcast/scalar/i32-f32.wgsl b/test/tint/expressions/bitcast/scalar/i32-f32.wgsl
deleted file mode 100644
index 2720438..0000000
--- a/test/tint/expressions/bitcast/scalar/i32-f32.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-    let a : i32 = 1;
-    let b : f32 = bitcast<f32>(a);
-}
diff --git a/test/tint/expressions/bitcast/scalar/i32-f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/scalar/i32-f32.wgsl.expected.dxc.hlsl
deleted file mode 100644
index 4f38be2..0000000
--- a/test/tint/expressions/bitcast/scalar/i32-f32.wgsl.expected.dxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const int a = 1;
-  const float b = asfloat(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/i32-f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/scalar/i32-f32.wgsl.expected.fxc.hlsl
deleted file mode 100644
index 4f38be2..0000000
--- a/test/tint/expressions/bitcast/scalar/i32-f32.wgsl.expected.fxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const int a = 1;
-  const float b = asfloat(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/i32-f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/scalar/i32-f32.wgsl.expected.glsl
deleted file mode 100644
index 0ca0530..0000000
--- a/test/tint/expressions/bitcast/scalar/i32-f32.wgsl.expected.glsl
+++ /dev/null
@@ -1,12 +0,0 @@
-#version 310 es
-
-void f() {
-  int a = 1;
-  float b = intBitsToFloat(a);
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  f();
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/i32-f32.wgsl.expected.msl b/test/tint/expressions/bitcast/scalar/i32-f32.wgsl.expected.msl
deleted file mode 100644
index 4368427..0000000
--- a/test/tint/expressions/bitcast/scalar/i32-f32.wgsl.expected.msl
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <metal_stdlib>
-
-using namespace metal;
-kernel void f() {
-  int const a = 1;
-  float const b = as_type<float>(a);
-  return;
-}
-
diff --git a/test/tint/expressions/bitcast/scalar/i32-f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/scalar/i32-f32.wgsl.expected.spvasm
deleted file mode 100644
index 1804815..0000000
--- a/test/tint/expressions/bitcast/scalar/i32-f32.wgsl.expected.spvasm
+++ /dev/null
@@ -1,20 +0,0 @@
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 9
-; Schema: 0
-               OpCapability Shader
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint GLCompute %f "f"
-               OpExecutionMode %f LocalSize 1 1 1
-               OpName %f "f"
-       %void = OpTypeVoid
-          %1 = OpTypeFunction %void
-        %int = OpTypeInt 32 1
-      %int_1 = OpConstant %int 1
-      %float = OpTypeFloat 32
-          %f = OpFunction %void None %1
-          %4 = OpLabel
-          %7 = OpBitcast %float %int_1
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/scalar/i32-f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/scalar/i32-f32.wgsl.expected.wgsl
deleted file mode 100644
index 16f86b2..0000000
--- a/test/tint/expressions/bitcast/scalar/i32-f32.wgsl.expected.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-  let a : i32 = 1;
-  let b : f32 = bitcast<f32>(a);
-}
diff --git a/test/tint/expressions/bitcast/scalar/i32-i32.wgsl b/test/tint/expressions/bitcast/scalar/i32-i32.wgsl
deleted file mode 100644
index ca5e70f..0000000
--- a/test/tint/expressions/bitcast/scalar/i32-i32.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-    let a : i32 = 1;
-    let b : i32 = bitcast<i32>(a);
-}
diff --git a/test/tint/expressions/bitcast/scalar/i32-i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/scalar/i32-i32.wgsl.expected.dxc.hlsl
deleted file mode 100644
index 0b7fac2..0000000
--- a/test/tint/expressions/bitcast/scalar/i32-i32.wgsl.expected.dxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const int a = 1;
-  const int b = asint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/i32-i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/scalar/i32-i32.wgsl.expected.fxc.hlsl
deleted file mode 100644
index 0b7fac2..0000000
--- a/test/tint/expressions/bitcast/scalar/i32-i32.wgsl.expected.fxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const int a = 1;
-  const int b = asint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/i32-i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/scalar/i32-i32.wgsl.expected.glsl
deleted file mode 100644
index 941a76a..0000000
--- a/test/tint/expressions/bitcast/scalar/i32-i32.wgsl.expected.glsl
+++ /dev/null
@@ -1,12 +0,0 @@
-#version 310 es
-
-void f() {
-  int a = 1;
-  int b = a;
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  f();
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/i32-i32.wgsl.expected.msl b/test/tint/expressions/bitcast/scalar/i32-i32.wgsl.expected.msl
deleted file mode 100644
index 782176a..0000000
--- a/test/tint/expressions/bitcast/scalar/i32-i32.wgsl.expected.msl
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <metal_stdlib>
-
-using namespace metal;
-kernel void f() {
-  int const a = 1;
-  int const b = as_type<int>(a);
-  return;
-}
-
diff --git a/test/tint/expressions/bitcast/scalar/i32-i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/scalar/i32-i32.wgsl.expected.spvasm
deleted file mode 100644
index 35c7822..0000000
--- a/test/tint/expressions/bitcast/scalar/i32-i32.wgsl.expected.spvasm
+++ /dev/null
@@ -1,19 +0,0 @@
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 8
-; Schema: 0
-               OpCapability Shader
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint GLCompute %f "f"
-               OpExecutionMode %f LocalSize 1 1 1
-               OpName %f "f"
-       %void = OpTypeVoid
-          %1 = OpTypeFunction %void
-        %int = OpTypeInt 32 1
-      %int_1 = OpConstant %int 1
-          %f = OpFunction %void None %1
-          %4 = OpLabel
-          %7 = OpCopyObject %int %int_1
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/scalar/i32-i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/scalar/i32-i32.wgsl.expected.wgsl
deleted file mode 100644
index 94c44a9..0000000
--- a/test/tint/expressions/bitcast/scalar/i32-i32.wgsl.expected.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-  let a : i32 = 1;
-  let b : i32 = bitcast<i32>(a);
-}
diff --git a/test/tint/expressions/bitcast/scalar/i32-u32.wgsl b/test/tint/expressions/bitcast/scalar/i32-u32.wgsl
deleted file mode 100644
index 4a34de6..0000000
--- a/test/tint/expressions/bitcast/scalar/i32-u32.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-    let a : i32 = 1;
-    let b : u32 = bitcast<u32>(a);
-}
diff --git a/test/tint/expressions/bitcast/scalar/i32-u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/scalar/i32-u32.wgsl.expected.dxc.hlsl
deleted file mode 100644
index 757dc34..0000000
--- a/test/tint/expressions/bitcast/scalar/i32-u32.wgsl.expected.dxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const int a = 1;
-  const uint b = asuint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/i32-u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/scalar/i32-u32.wgsl.expected.fxc.hlsl
deleted file mode 100644
index 757dc34..0000000
--- a/test/tint/expressions/bitcast/scalar/i32-u32.wgsl.expected.fxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const int a = 1;
-  const uint b = asuint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/i32-u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/scalar/i32-u32.wgsl.expected.glsl
deleted file mode 100644
index 7b03936..0000000
--- a/test/tint/expressions/bitcast/scalar/i32-u32.wgsl.expected.glsl
+++ /dev/null
@@ -1,12 +0,0 @@
-#version 310 es
-
-void f() {
-  int a = 1;
-  uint b = uint(a);
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  f();
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/i32-u32.wgsl.expected.msl b/test/tint/expressions/bitcast/scalar/i32-u32.wgsl.expected.msl
deleted file mode 100644
index dd82cdd..0000000
--- a/test/tint/expressions/bitcast/scalar/i32-u32.wgsl.expected.msl
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <metal_stdlib>
-
-using namespace metal;
-kernel void f() {
-  int const a = 1;
-  uint const b = as_type<uint>(a);
-  return;
-}
-
diff --git a/test/tint/expressions/bitcast/scalar/i32-u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/scalar/i32-u32.wgsl.expected.spvasm
deleted file mode 100644
index c91c503..0000000
--- a/test/tint/expressions/bitcast/scalar/i32-u32.wgsl.expected.spvasm
+++ /dev/null
@@ -1,20 +0,0 @@
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 9
-; Schema: 0
-               OpCapability Shader
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint GLCompute %f "f"
-               OpExecutionMode %f LocalSize 1 1 1
-               OpName %f "f"
-       %void = OpTypeVoid
-          %1 = OpTypeFunction %void
-        %int = OpTypeInt 32 1
-      %int_1 = OpConstant %int 1
-       %uint = OpTypeInt 32 0
-          %f = OpFunction %void None %1
-          %4 = OpLabel
-          %7 = OpBitcast %uint %int_1
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/scalar/i32-u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/scalar/i32-u32.wgsl.expected.wgsl
deleted file mode 100644
index 28a65c9..0000000
--- a/test/tint/expressions/bitcast/scalar/i32-u32.wgsl.expected.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-  let a : i32 = 1;
-  let b : u32 = bitcast<u32>(a);
-}
diff --git a/test/tint/expressions/bitcast/scalar/u32-f32.wgsl b/test/tint/expressions/bitcast/scalar/u32-f32.wgsl
deleted file mode 100644
index 3905040..0000000
--- a/test/tint/expressions/bitcast/scalar/u32-f32.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-    let a : u32 = 1u;
-    let b : f32 = bitcast<f32>(a);
-}
diff --git a/test/tint/expressions/bitcast/scalar/u32-f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/scalar/u32-f32.wgsl.expected.dxc.hlsl
deleted file mode 100644
index ef47ffc..0000000
--- a/test/tint/expressions/bitcast/scalar/u32-f32.wgsl.expected.dxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const uint a = 1u;
-  const float b = asfloat(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/u32-f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/scalar/u32-f32.wgsl.expected.fxc.hlsl
deleted file mode 100644
index ef47ffc..0000000
--- a/test/tint/expressions/bitcast/scalar/u32-f32.wgsl.expected.fxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const uint a = 1u;
-  const float b = asfloat(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/u32-f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/scalar/u32-f32.wgsl.expected.glsl
deleted file mode 100644
index a55f5bf..0000000
--- a/test/tint/expressions/bitcast/scalar/u32-f32.wgsl.expected.glsl
+++ /dev/null
@@ -1,12 +0,0 @@
-#version 310 es
-
-void f() {
-  uint a = 1u;
-  float b = uintBitsToFloat(a);
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  f();
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/u32-f32.wgsl.expected.msl b/test/tint/expressions/bitcast/scalar/u32-f32.wgsl.expected.msl
deleted file mode 100644
index f019daf..0000000
--- a/test/tint/expressions/bitcast/scalar/u32-f32.wgsl.expected.msl
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <metal_stdlib>
-
-using namespace metal;
-kernel void f() {
-  uint const a = 1u;
-  float const b = as_type<float>(a);
-  return;
-}
-
diff --git a/test/tint/expressions/bitcast/scalar/u32-f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/scalar/u32-f32.wgsl.expected.spvasm
deleted file mode 100644
index daf433a..0000000
--- a/test/tint/expressions/bitcast/scalar/u32-f32.wgsl.expected.spvasm
+++ /dev/null
@@ -1,20 +0,0 @@
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 9
-; Schema: 0
-               OpCapability Shader
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint GLCompute %f "f"
-               OpExecutionMode %f LocalSize 1 1 1
-               OpName %f "f"
-       %void = OpTypeVoid
-          %1 = OpTypeFunction %void
-       %uint = OpTypeInt 32 0
-     %uint_1 = OpConstant %uint 1
-      %float = OpTypeFloat 32
-          %f = OpFunction %void None %1
-          %4 = OpLabel
-          %7 = OpBitcast %float %uint_1
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/scalar/u32-f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/scalar/u32-f32.wgsl.expected.wgsl
deleted file mode 100644
index 4873e26..0000000
--- a/test/tint/expressions/bitcast/scalar/u32-f32.wgsl.expected.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-  let a : u32 = 1u;
-  let b : f32 = bitcast<f32>(a);
-}
diff --git a/test/tint/expressions/bitcast/scalar/u32-i32.wgsl b/test/tint/expressions/bitcast/scalar/u32-i32.wgsl
deleted file mode 100644
index c502831..0000000
--- a/test/tint/expressions/bitcast/scalar/u32-i32.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-    let a : u32 = 1u;
-    let b : i32 = bitcast<i32>(a);
-}
diff --git a/test/tint/expressions/bitcast/scalar/u32-i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/scalar/u32-i32.wgsl.expected.dxc.hlsl
deleted file mode 100644
index e5d73a2..0000000
--- a/test/tint/expressions/bitcast/scalar/u32-i32.wgsl.expected.dxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const uint a = 1u;
-  const int b = asint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/u32-i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/scalar/u32-i32.wgsl.expected.fxc.hlsl
deleted file mode 100644
index e5d73a2..0000000
--- a/test/tint/expressions/bitcast/scalar/u32-i32.wgsl.expected.fxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const uint a = 1u;
-  const int b = asint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/u32-i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/scalar/u32-i32.wgsl.expected.glsl
deleted file mode 100644
index 4c83dbe..0000000
--- a/test/tint/expressions/bitcast/scalar/u32-i32.wgsl.expected.glsl
+++ /dev/null
@@ -1,12 +0,0 @@
-#version 310 es
-
-void f() {
-  uint a = 1u;
-  int b = int(a);
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  f();
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/u32-i32.wgsl.expected.msl b/test/tint/expressions/bitcast/scalar/u32-i32.wgsl.expected.msl
deleted file mode 100644
index c6bd3b9..0000000
--- a/test/tint/expressions/bitcast/scalar/u32-i32.wgsl.expected.msl
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <metal_stdlib>
-
-using namespace metal;
-kernel void f() {
-  uint const a = 1u;
-  int const b = as_type<int>(a);
-  return;
-}
-
diff --git a/test/tint/expressions/bitcast/scalar/u32-i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/scalar/u32-i32.wgsl.expected.spvasm
deleted file mode 100644
index 69997c4..0000000
--- a/test/tint/expressions/bitcast/scalar/u32-i32.wgsl.expected.spvasm
+++ /dev/null
@@ -1,20 +0,0 @@
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 9
-; Schema: 0
-               OpCapability Shader
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint GLCompute %f "f"
-               OpExecutionMode %f LocalSize 1 1 1
-               OpName %f "f"
-       %void = OpTypeVoid
-          %1 = OpTypeFunction %void
-       %uint = OpTypeInt 32 0
-     %uint_1 = OpConstant %uint 1
-        %int = OpTypeInt 32 1
-          %f = OpFunction %void None %1
-          %4 = OpLabel
-          %7 = OpBitcast %int %uint_1
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/scalar/u32-i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/scalar/u32-i32.wgsl.expected.wgsl
deleted file mode 100644
index e07225e..0000000
--- a/test/tint/expressions/bitcast/scalar/u32-i32.wgsl.expected.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-  let a : u32 = 1u;
-  let b : i32 = bitcast<i32>(a);
-}
diff --git a/test/tint/expressions/bitcast/scalar/u32-u32.wgsl b/test/tint/expressions/bitcast/scalar/u32-u32.wgsl
deleted file mode 100644
index c1a4aed..0000000
--- a/test/tint/expressions/bitcast/scalar/u32-u32.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-    let a : u32 = 1u;
-    let b : u32 = bitcast<u32>(a);
-}
diff --git a/test/tint/expressions/bitcast/scalar/u32-u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/scalar/u32-u32.wgsl.expected.dxc.hlsl
deleted file mode 100644
index 58cd23c..0000000
--- a/test/tint/expressions/bitcast/scalar/u32-u32.wgsl.expected.dxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const uint a = 1u;
-  const uint b = asuint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/u32-u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/scalar/u32-u32.wgsl.expected.fxc.hlsl
deleted file mode 100644
index 58cd23c..0000000
--- a/test/tint/expressions/bitcast/scalar/u32-u32.wgsl.expected.fxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const uint a = 1u;
-  const uint b = asuint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/u32-u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/scalar/u32-u32.wgsl.expected.glsl
deleted file mode 100644
index d971697..0000000
--- a/test/tint/expressions/bitcast/scalar/u32-u32.wgsl.expected.glsl
+++ /dev/null
@@ -1,12 +0,0 @@
-#version 310 es
-
-void f() {
-  uint a = 1u;
-  uint b = a;
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  f();
-  return;
-}
diff --git a/test/tint/expressions/bitcast/scalar/u32-u32.wgsl.expected.msl b/test/tint/expressions/bitcast/scalar/u32-u32.wgsl.expected.msl
deleted file mode 100644
index 01f3462..0000000
--- a/test/tint/expressions/bitcast/scalar/u32-u32.wgsl.expected.msl
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <metal_stdlib>
-
-using namespace metal;
-kernel void f() {
-  uint const a = 1u;
-  uint const b = as_type<uint>(a);
-  return;
-}
-
diff --git a/test/tint/expressions/bitcast/scalar/u32-u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/scalar/u32-u32.wgsl.expected.spvasm
deleted file mode 100644
index 0a402a5..0000000
--- a/test/tint/expressions/bitcast/scalar/u32-u32.wgsl.expected.spvasm
+++ /dev/null
@@ -1,19 +0,0 @@
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 8
-; Schema: 0
-               OpCapability Shader
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint GLCompute %f "f"
-               OpExecutionMode %f LocalSize 1 1 1
-               OpName %f "f"
-       %void = OpTypeVoid
-          %1 = OpTypeFunction %void
-       %uint = OpTypeInt 32 0
-     %uint_1 = OpConstant %uint 1
-          %f = OpFunction %void None %1
-          %4 = OpLabel
-          %7 = OpCopyObject %uint %uint_1
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/scalar/u32-u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/scalar/u32-u32.wgsl.expected.wgsl
deleted file mode 100644
index ad7e55b..0000000
--- a/test/tint/expressions/bitcast/scalar/u32-u32.wgsl.expected.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-  let a : u32 = 1u;
-  let b : u32 = bitcast<u32>(a);
-}
diff --git a/test/tint/expressions/bitcast/vector/f32-f32.wgsl b/test/tint/expressions/bitcast/vector/f32-f32.wgsl
deleted file mode 100644
index a8f1759..0000000
--- a/test/tint/expressions/bitcast/vector/f32-f32.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-    let a : vec3<f32> = vec3<f32>(1., 2., 3.);
-    let b : vec3<f32> = bitcast<vec3<f32>>(a);
-}
diff --git a/test/tint/expressions/bitcast/vector/f32-f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/vector/f32-f32.wgsl.expected.dxc.hlsl
deleted file mode 100644
index e6ce403..0000000
--- a/test/tint/expressions/bitcast/vector/f32-f32.wgsl.expected.dxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const float3 a = float3(1.0f, 2.0f, 3.0f);
-  const float3 b = asfloat(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/f32-f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/vector/f32-f32.wgsl.expected.fxc.hlsl
deleted file mode 100644
index e6ce403..0000000
--- a/test/tint/expressions/bitcast/vector/f32-f32.wgsl.expected.fxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const float3 a = float3(1.0f, 2.0f, 3.0f);
-  const float3 b = asfloat(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/f32-f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/vector/f32-f32.wgsl.expected.glsl
deleted file mode 100644
index ed3989d..0000000
--- a/test/tint/expressions/bitcast/vector/f32-f32.wgsl.expected.glsl
+++ /dev/null
@@ -1,12 +0,0 @@
-#version 310 es
-
-void f() {
-  vec3 a = vec3(1.0f, 2.0f, 3.0f);
-  vec3 b = a;
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  f();
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/f32-f32.wgsl.expected.msl b/test/tint/expressions/bitcast/vector/f32-f32.wgsl.expected.msl
deleted file mode 100644
index 66dbb55..0000000
--- a/test/tint/expressions/bitcast/vector/f32-f32.wgsl.expected.msl
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <metal_stdlib>
-
-using namespace metal;
-kernel void f() {
-  float3 const a = float3(1.0f, 2.0f, 3.0f);
-  float3 const b = as_type<float3>(a);
-  return;
-}
-
diff --git a/test/tint/expressions/bitcast/vector/f32-f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/vector/f32-f32.wgsl.expected.spvasm
deleted file mode 100644
index 2956553..0000000
--- a/test/tint/expressions/bitcast/vector/f32-f32.wgsl.expected.spvasm
+++ /dev/null
@@ -1,23 +0,0 @@
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 12
-; Schema: 0
-               OpCapability Shader
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint GLCompute %f "f"
-               OpExecutionMode %f LocalSize 1 1 1
-               OpName %f "f"
-       %void = OpTypeVoid
-          %1 = OpTypeFunction %void
-      %float = OpTypeFloat 32
-    %v3float = OpTypeVector %float 3
-    %float_1 = OpConstant %float 1
-    %float_2 = OpConstant %float 2
-    %float_3 = OpConstant %float 3
-         %10 = OpConstantComposite %v3float %float_1 %float_2 %float_3
-          %f = OpFunction %void None %1
-          %4 = OpLabel
-         %11 = OpCopyObject %v3float %10
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/vector/f32-f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/vector/f32-f32.wgsl.expected.wgsl
deleted file mode 100644
index 452705c..0000000
--- a/test/tint/expressions/bitcast/vector/f32-f32.wgsl.expected.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-  let a : vec3<f32> = vec3<f32>(1.0, 2.0, 3.0);
-  let b : vec3<f32> = bitcast<vec3<f32>>(a);
-}
diff --git a/test/tint/expressions/bitcast/vector/f32-i32.wgsl b/test/tint/expressions/bitcast/vector/f32-i32.wgsl
deleted file mode 100644
index 8a818f0..0000000
--- a/test/tint/expressions/bitcast/vector/f32-i32.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-    let a : vec3<f32> = vec3<f32>(1., 2., 3.);
-    let b : vec3<i32> = bitcast<vec3<i32>>(a);
-}
diff --git a/test/tint/expressions/bitcast/vector/f32-i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/vector/f32-i32.wgsl.expected.dxc.hlsl
deleted file mode 100644
index 3ebeb51..0000000
--- a/test/tint/expressions/bitcast/vector/f32-i32.wgsl.expected.dxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const float3 a = float3(1.0f, 2.0f, 3.0f);
-  const int3 b = asint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/f32-i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/vector/f32-i32.wgsl.expected.fxc.hlsl
deleted file mode 100644
index 3ebeb51..0000000
--- a/test/tint/expressions/bitcast/vector/f32-i32.wgsl.expected.fxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const float3 a = float3(1.0f, 2.0f, 3.0f);
-  const int3 b = asint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/f32-i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/vector/f32-i32.wgsl.expected.glsl
deleted file mode 100644
index 551b039..0000000
--- a/test/tint/expressions/bitcast/vector/f32-i32.wgsl.expected.glsl
+++ /dev/null
@@ -1,12 +0,0 @@
-#version 310 es
-
-void f() {
-  vec3 a = vec3(1.0f, 2.0f, 3.0f);
-  ivec3 b = floatBitsToInt(a);
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  f();
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/f32-i32.wgsl.expected.msl b/test/tint/expressions/bitcast/vector/f32-i32.wgsl.expected.msl
deleted file mode 100644
index 2d64209..0000000
--- a/test/tint/expressions/bitcast/vector/f32-i32.wgsl.expected.msl
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <metal_stdlib>
-
-using namespace metal;
-kernel void f() {
-  float3 const a = float3(1.0f, 2.0f, 3.0f);
-  int3 const b = as_type<int3>(a);
-  return;
-}
-
diff --git a/test/tint/expressions/bitcast/vector/f32-i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/vector/f32-i32.wgsl.expected.spvasm
deleted file mode 100644
index 9061d7a..0000000
--- a/test/tint/expressions/bitcast/vector/f32-i32.wgsl.expected.spvasm
+++ /dev/null
@@ -1,25 +0,0 @@
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 14
-; Schema: 0
-               OpCapability Shader
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint GLCompute %f "f"
-               OpExecutionMode %f LocalSize 1 1 1
-               OpName %f "f"
-       %void = OpTypeVoid
-          %1 = OpTypeFunction %void
-      %float = OpTypeFloat 32
-    %v3float = OpTypeVector %float 3
-    %float_1 = OpConstant %float 1
-    %float_2 = OpConstant %float 2
-    %float_3 = OpConstant %float 3
-         %10 = OpConstantComposite %v3float %float_1 %float_2 %float_3
-        %int = OpTypeInt 32 1
-      %v3int = OpTypeVector %int 3
-          %f = OpFunction %void None %1
-          %4 = OpLabel
-         %11 = OpBitcast %v3int %10
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/vector/f32-i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/vector/f32-i32.wgsl.expected.wgsl
deleted file mode 100644
index 3971ac8..0000000
--- a/test/tint/expressions/bitcast/vector/f32-i32.wgsl.expected.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-  let a : vec3<f32> = vec3<f32>(1.0, 2.0, 3.0);
-  let b : vec3<i32> = bitcast<vec3<i32>>(a);
-}
diff --git a/test/tint/expressions/bitcast/vector/f32-u32.wgsl b/test/tint/expressions/bitcast/vector/f32-u32.wgsl
deleted file mode 100644
index 962f4f9..0000000
--- a/test/tint/expressions/bitcast/vector/f32-u32.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-    let a : vec3<f32> = vec3<f32>(1., 2., 3.);
-    let b : vec3<u32> = bitcast<vec3<u32>>(a);
-}
diff --git a/test/tint/expressions/bitcast/vector/f32-u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/vector/f32-u32.wgsl.expected.dxc.hlsl
deleted file mode 100644
index 9490820..0000000
--- a/test/tint/expressions/bitcast/vector/f32-u32.wgsl.expected.dxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const float3 a = float3(1.0f, 2.0f, 3.0f);
-  const uint3 b = asuint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/f32-u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/vector/f32-u32.wgsl.expected.fxc.hlsl
deleted file mode 100644
index 9490820..0000000
--- a/test/tint/expressions/bitcast/vector/f32-u32.wgsl.expected.fxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const float3 a = float3(1.0f, 2.0f, 3.0f);
-  const uint3 b = asuint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/f32-u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/vector/f32-u32.wgsl.expected.glsl
deleted file mode 100644
index b1fe444..0000000
--- a/test/tint/expressions/bitcast/vector/f32-u32.wgsl.expected.glsl
+++ /dev/null
@@ -1,12 +0,0 @@
-#version 310 es
-
-void f() {
-  vec3 a = vec3(1.0f, 2.0f, 3.0f);
-  uvec3 b = floatBitsToUint(a);
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  f();
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/f32-u32.wgsl.expected.msl b/test/tint/expressions/bitcast/vector/f32-u32.wgsl.expected.msl
deleted file mode 100644
index b8a22f2..0000000
--- a/test/tint/expressions/bitcast/vector/f32-u32.wgsl.expected.msl
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <metal_stdlib>
-
-using namespace metal;
-kernel void f() {
-  float3 const a = float3(1.0f, 2.0f, 3.0f);
-  uint3 const b = as_type<uint3>(a);
-  return;
-}
-
diff --git a/test/tint/expressions/bitcast/vector/f32-u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/vector/f32-u32.wgsl.expected.spvasm
deleted file mode 100644
index 85ebe09..0000000
--- a/test/tint/expressions/bitcast/vector/f32-u32.wgsl.expected.spvasm
+++ /dev/null
@@ -1,25 +0,0 @@
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 14
-; Schema: 0
-               OpCapability Shader
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint GLCompute %f "f"
-               OpExecutionMode %f LocalSize 1 1 1
-               OpName %f "f"
-       %void = OpTypeVoid
-          %1 = OpTypeFunction %void
-      %float = OpTypeFloat 32
-    %v3float = OpTypeVector %float 3
-    %float_1 = OpConstant %float 1
-    %float_2 = OpConstant %float 2
-    %float_3 = OpConstant %float 3
-         %10 = OpConstantComposite %v3float %float_1 %float_2 %float_3
-       %uint = OpTypeInt 32 0
-     %v3uint = OpTypeVector %uint 3
-          %f = OpFunction %void None %1
-          %4 = OpLabel
-         %11 = OpBitcast %v3uint %10
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/vector/f32-u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/vector/f32-u32.wgsl.expected.wgsl
deleted file mode 100644
index a4acebc..0000000
--- a/test/tint/expressions/bitcast/vector/f32-u32.wgsl.expected.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-  let a : vec3<f32> = vec3<f32>(1.0, 2.0, 3.0);
-  let b : vec3<u32> = bitcast<vec3<u32>>(a);
-}
diff --git a/test/tint/expressions/bitcast/vector/i32-f32.wgsl b/test/tint/expressions/bitcast/vector/i32-f32.wgsl
deleted file mode 100644
index b71ae34..0000000
--- a/test/tint/expressions/bitcast/vector/i32-f32.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-    let a : vec3<i32> = vec3<i32>(1, 2, 3);
-    let b : vec3<f32> = bitcast<vec3<f32>>(a);
-}
diff --git a/test/tint/expressions/bitcast/vector/i32-f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/vector/i32-f32.wgsl.expected.dxc.hlsl
deleted file mode 100644
index 73bb118..0000000
--- a/test/tint/expressions/bitcast/vector/i32-f32.wgsl.expected.dxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const int3 a = int3(1, 2, 3);
-  const float3 b = asfloat(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/i32-f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/vector/i32-f32.wgsl.expected.fxc.hlsl
deleted file mode 100644
index 73bb118..0000000
--- a/test/tint/expressions/bitcast/vector/i32-f32.wgsl.expected.fxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const int3 a = int3(1, 2, 3);
-  const float3 b = asfloat(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/i32-f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/vector/i32-f32.wgsl.expected.glsl
deleted file mode 100644
index a4f8c04..0000000
--- a/test/tint/expressions/bitcast/vector/i32-f32.wgsl.expected.glsl
+++ /dev/null
@@ -1,12 +0,0 @@
-#version 310 es
-
-void f() {
-  ivec3 a = ivec3(1, 2, 3);
-  vec3 b = intBitsToFloat(a);
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  f();
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/i32-f32.wgsl.expected.msl b/test/tint/expressions/bitcast/vector/i32-f32.wgsl.expected.msl
deleted file mode 100644
index 14d44ea..0000000
--- a/test/tint/expressions/bitcast/vector/i32-f32.wgsl.expected.msl
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <metal_stdlib>
-
-using namespace metal;
-kernel void f() {
-  int3 const a = int3(1, 2, 3);
-  float3 const b = as_type<float3>(a);
-  return;
-}
-
diff --git a/test/tint/expressions/bitcast/vector/i32-f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/vector/i32-f32.wgsl.expected.spvasm
deleted file mode 100644
index 06884c2..0000000
--- a/test/tint/expressions/bitcast/vector/i32-f32.wgsl.expected.spvasm
+++ /dev/null
@@ -1,25 +0,0 @@
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 14
-; Schema: 0
-               OpCapability Shader
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint GLCompute %f "f"
-               OpExecutionMode %f LocalSize 1 1 1
-               OpName %f "f"
-       %void = OpTypeVoid
-          %1 = OpTypeFunction %void
-        %int = OpTypeInt 32 1
-      %v3int = OpTypeVector %int 3
-      %int_1 = OpConstant %int 1
-      %int_2 = OpConstant %int 2
-      %int_3 = OpConstant %int 3
-         %10 = OpConstantComposite %v3int %int_1 %int_2 %int_3
-      %float = OpTypeFloat 32
-    %v3float = OpTypeVector %float 3
-          %f = OpFunction %void None %1
-          %4 = OpLabel
-         %11 = OpBitcast %v3float %10
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/vector/i32-f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/vector/i32-f32.wgsl.expected.wgsl
deleted file mode 100644
index 0026268..0000000
--- a/test/tint/expressions/bitcast/vector/i32-f32.wgsl.expected.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-  let a : vec3<i32> = vec3<i32>(1, 2, 3);
-  let b : vec3<f32> = bitcast<vec3<f32>>(a);
-}
diff --git a/test/tint/expressions/bitcast/vector/i32-i32.wgsl b/test/tint/expressions/bitcast/vector/i32-i32.wgsl
deleted file mode 100644
index 2becdf5..0000000
--- a/test/tint/expressions/bitcast/vector/i32-i32.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-    let a : vec3<i32> = vec3<i32>(1, 2, 3);
-    let b : vec3<i32> = bitcast<vec3<i32>>(a);
-}
diff --git a/test/tint/expressions/bitcast/vector/i32-i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/vector/i32-i32.wgsl.expected.dxc.hlsl
deleted file mode 100644
index 2304f93..0000000
--- a/test/tint/expressions/bitcast/vector/i32-i32.wgsl.expected.dxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const int3 a = int3(1, 2, 3);
-  const int3 b = asint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/i32-i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/vector/i32-i32.wgsl.expected.fxc.hlsl
deleted file mode 100644
index 2304f93..0000000
--- a/test/tint/expressions/bitcast/vector/i32-i32.wgsl.expected.fxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const int3 a = int3(1, 2, 3);
-  const int3 b = asint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/i32-i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/vector/i32-i32.wgsl.expected.glsl
deleted file mode 100644
index 6214de8..0000000
--- a/test/tint/expressions/bitcast/vector/i32-i32.wgsl.expected.glsl
+++ /dev/null
@@ -1,12 +0,0 @@
-#version 310 es
-
-void f() {
-  ivec3 a = ivec3(1, 2, 3);
-  ivec3 b = a;
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  f();
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/i32-i32.wgsl.expected.msl b/test/tint/expressions/bitcast/vector/i32-i32.wgsl.expected.msl
deleted file mode 100644
index 3c58a22..0000000
--- a/test/tint/expressions/bitcast/vector/i32-i32.wgsl.expected.msl
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <metal_stdlib>
-
-using namespace metal;
-kernel void f() {
-  int3 const a = int3(1, 2, 3);
-  int3 const b = as_type<int3>(a);
-  return;
-}
-
diff --git a/test/tint/expressions/bitcast/vector/i32-i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/vector/i32-i32.wgsl.expected.spvasm
deleted file mode 100644
index a56c4b6..0000000
--- a/test/tint/expressions/bitcast/vector/i32-i32.wgsl.expected.spvasm
+++ /dev/null
@@ -1,23 +0,0 @@
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 12
-; Schema: 0
-               OpCapability Shader
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint GLCompute %f "f"
-               OpExecutionMode %f LocalSize 1 1 1
-               OpName %f "f"
-       %void = OpTypeVoid
-          %1 = OpTypeFunction %void
-        %int = OpTypeInt 32 1
-      %v3int = OpTypeVector %int 3
-      %int_1 = OpConstant %int 1
-      %int_2 = OpConstant %int 2
-      %int_3 = OpConstant %int 3
-         %10 = OpConstantComposite %v3int %int_1 %int_2 %int_3
-          %f = OpFunction %void None %1
-          %4 = OpLabel
-         %11 = OpCopyObject %v3int %10
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/vector/i32-i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/vector/i32-i32.wgsl.expected.wgsl
deleted file mode 100644
index 888cba4..0000000
--- a/test/tint/expressions/bitcast/vector/i32-i32.wgsl.expected.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-  let a : vec3<i32> = vec3<i32>(1, 2, 3);
-  let b : vec3<i32> = bitcast<vec3<i32>>(a);
-}
diff --git a/test/tint/expressions/bitcast/vector/i32-u32.wgsl b/test/tint/expressions/bitcast/vector/i32-u32.wgsl
deleted file mode 100644
index b0bbe46..0000000
--- a/test/tint/expressions/bitcast/vector/i32-u32.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-    let a : vec3<i32> = vec3<i32>(1, 2, 3);
-    let b : vec3<u32> = bitcast<vec3<u32>>(a);
-}
diff --git a/test/tint/expressions/bitcast/vector/i32-u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/vector/i32-u32.wgsl.expected.dxc.hlsl
deleted file mode 100644
index 80e6646..0000000
--- a/test/tint/expressions/bitcast/vector/i32-u32.wgsl.expected.dxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const int3 a = int3(1, 2, 3);
-  const uint3 b = asuint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/i32-u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/vector/i32-u32.wgsl.expected.fxc.hlsl
deleted file mode 100644
index 80e6646..0000000
--- a/test/tint/expressions/bitcast/vector/i32-u32.wgsl.expected.fxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const int3 a = int3(1, 2, 3);
-  const uint3 b = asuint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/i32-u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/vector/i32-u32.wgsl.expected.glsl
deleted file mode 100644
index eac0936..0000000
--- a/test/tint/expressions/bitcast/vector/i32-u32.wgsl.expected.glsl
+++ /dev/null
@@ -1,12 +0,0 @@
-#version 310 es
-
-void f() {
-  ivec3 a = ivec3(1, 2, 3);
-  uvec3 b = uvec3(a);
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  f();
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/i32-u32.wgsl.expected.msl b/test/tint/expressions/bitcast/vector/i32-u32.wgsl.expected.msl
deleted file mode 100644
index 34f7964..0000000
--- a/test/tint/expressions/bitcast/vector/i32-u32.wgsl.expected.msl
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <metal_stdlib>
-
-using namespace metal;
-kernel void f() {
-  int3 const a = int3(1, 2, 3);
-  uint3 const b = as_type<uint3>(a);
-  return;
-}
-
diff --git a/test/tint/expressions/bitcast/vector/i32-u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/vector/i32-u32.wgsl.expected.spvasm
deleted file mode 100644
index c4c7544..0000000
--- a/test/tint/expressions/bitcast/vector/i32-u32.wgsl.expected.spvasm
+++ /dev/null
@@ -1,25 +0,0 @@
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 14
-; Schema: 0
-               OpCapability Shader
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint GLCompute %f "f"
-               OpExecutionMode %f LocalSize 1 1 1
-               OpName %f "f"
-       %void = OpTypeVoid
-          %1 = OpTypeFunction %void
-        %int = OpTypeInt 32 1
-      %v3int = OpTypeVector %int 3
-      %int_1 = OpConstant %int 1
-      %int_2 = OpConstant %int 2
-      %int_3 = OpConstant %int 3
-         %10 = OpConstantComposite %v3int %int_1 %int_2 %int_3
-       %uint = OpTypeInt 32 0
-     %v3uint = OpTypeVector %uint 3
-          %f = OpFunction %void None %1
-          %4 = OpLabel
-         %11 = OpBitcast %v3uint %10
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/vector/i32-u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/vector/i32-u32.wgsl.expected.wgsl
deleted file mode 100644
index eed5e13..0000000
--- a/test/tint/expressions/bitcast/vector/i32-u32.wgsl.expected.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-  let a : vec3<i32> = vec3<i32>(1, 2, 3);
-  let b : vec3<u32> = bitcast<vec3<u32>>(a);
-}
diff --git a/test/tint/expressions/bitcast/vector/u32-f32.wgsl b/test/tint/expressions/bitcast/vector/u32-f32.wgsl
deleted file mode 100644
index 362773c..0000000
--- a/test/tint/expressions/bitcast/vector/u32-f32.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-    let a : vec3<u32> = vec3<u32>(1u, 2u, 3u);
-    let b : vec3<f32> = bitcast<vec3<f32>>(a);
-}
diff --git a/test/tint/expressions/bitcast/vector/u32-f32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/vector/u32-f32.wgsl.expected.dxc.hlsl
deleted file mode 100644
index 72084e9..0000000
--- a/test/tint/expressions/bitcast/vector/u32-f32.wgsl.expected.dxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const uint3 a = uint3(1u, 2u, 3u);
-  const float3 b = asfloat(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/u32-f32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/vector/u32-f32.wgsl.expected.fxc.hlsl
deleted file mode 100644
index 72084e9..0000000
--- a/test/tint/expressions/bitcast/vector/u32-f32.wgsl.expected.fxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const uint3 a = uint3(1u, 2u, 3u);
-  const float3 b = asfloat(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/u32-f32.wgsl.expected.glsl b/test/tint/expressions/bitcast/vector/u32-f32.wgsl.expected.glsl
deleted file mode 100644
index 63a77f9..0000000
--- a/test/tint/expressions/bitcast/vector/u32-f32.wgsl.expected.glsl
+++ /dev/null
@@ -1,12 +0,0 @@
-#version 310 es
-
-void f() {
-  uvec3 a = uvec3(1u, 2u, 3u);
-  vec3 b = uintBitsToFloat(a);
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  f();
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/u32-f32.wgsl.expected.msl b/test/tint/expressions/bitcast/vector/u32-f32.wgsl.expected.msl
deleted file mode 100644
index 2376290..0000000
--- a/test/tint/expressions/bitcast/vector/u32-f32.wgsl.expected.msl
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <metal_stdlib>
-
-using namespace metal;
-kernel void f() {
-  uint3 const a = uint3(1u, 2u, 3u);
-  float3 const b = as_type<float3>(a);
-  return;
-}
-
diff --git a/test/tint/expressions/bitcast/vector/u32-f32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/vector/u32-f32.wgsl.expected.spvasm
deleted file mode 100644
index 8545908..0000000
--- a/test/tint/expressions/bitcast/vector/u32-f32.wgsl.expected.spvasm
+++ /dev/null
@@ -1,25 +0,0 @@
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 14
-; Schema: 0
-               OpCapability Shader
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint GLCompute %f "f"
-               OpExecutionMode %f LocalSize 1 1 1
-               OpName %f "f"
-       %void = OpTypeVoid
-          %1 = OpTypeFunction %void
-       %uint = OpTypeInt 32 0
-     %v3uint = OpTypeVector %uint 3
-     %uint_1 = OpConstant %uint 1
-     %uint_2 = OpConstant %uint 2
-     %uint_3 = OpConstant %uint 3
-         %10 = OpConstantComposite %v3uint %uint_1 %uint_2 %uint_3
-      %float = OpTypeFloat 32
-    %v3float = OpTypeVector %float 3
-          %f = OpFunction %void None %1
-          %4 = OpLabel
-         %11 = OpBitcast %v3float %10
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/vector/u32-f32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/vector/u32-f32.wgsl.expected.wgsl
deleted file mode 100644
index c4954a8..0000000
--- a/test/tint/expressions/bitcast/vector/u32-f32.wgsl.expected.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-  let a : vec3<u32> = vec3<u32>(1u, 2u, 3u);
-  let b : vec3<f32> = bitcast<vec3<f32>>(a);
-}
diff --git a/test/tint/expressions/bitcast/vector/u32-i32.wgsl b/test/tint/expressions/bitcast/vector/u32-i32.wgsl
deleted file mode 100644
index a3f6d26..0000000
--- a/test/tint/expressions/bitcast/vector/u32-i32.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-    let a : vec3<u32> = vec3<u32>(1u, 2u, 3u);
-    let b : vec3<i32> = bitcast<vec3<i32>>(a);
-}
diff --git a/test/tint/expressions/bitcast/vector/u32-i32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/vector/u32-i32.wgsl.expected.dxc.hlsl
deleted file mode 100644
index 6622323..0000000
--- a/test/tint/expressions/bitcast/vector/u32-i32.wgsl.expected.dxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const uint3 a = uint3(1u, 2u, 3u);
-  const int3 b = asint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/u32-i32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/vector/u32-i32.wgsl.expected.fxc.hlsl
deleted file mode 100644
index 6622323..0000000
--- a/test/tint/expressions/bitcast/vector/u32-i32.wgsl.expected.fxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const uint3 a = uint3(1u, 2u, 3u);
-  const int3 b = asint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/u32-i32.wgsl.expected.glsl b/test/tint/expressions/bitcast/vector/u32-i32.wgsl.expected.glsl
deleted file mode 100644
index bb0ab18..0000000
--- a/test/tint/expressions/bitcast/vector/u32-i32.wgsl.expected.glsl
+++ /dev/null
@@ -1,12 +0,0 @@
-#version 310 es
-
-void f() {
-  uvec3 a = uvec3(1u, 2u, 3u);
-  ivec3 b = ivec3(a);
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  f();
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/u32-i32.wgsl.expected.msl b/test/tint/expressions/bitcast/vector/u32-i32.wgsl.expected.msl
deleted file mode 100644
index 51c8f92..0000000
--- a/test/tint/expressions/bitcast/vector/u32-i32.wgsl.expected.msl
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <metal_stdlib>
-
-using namespace metal;
-kernel void f() {
-  uint3 const a = uint3(1u, 2u, 3u);
-  int3 const b = as_type<int3>(a);
-  return;
-}
-
diff --git a/test/tint/expressions/bitcast/vector/u32-i32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/vector/u32-i32.wgsl.expected.spvasm
deleted file mode 100644
index d59bdc2..0000000
--- a/test/tint/expressions/bitcast/vector/u32-i32.wgsl.expected.spvasm
+++ /dev/null
@@ -1,25 +0,0 @@
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 14
-; Schema: 0
-               OpCapability Shader
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint GLCompute %f "f"
-               OpExecutionMode %f LocalSize 1 1 1
-               OpName %f "f"
-       %void = OpTypeVoid
-          %1 = OpTypeFunction %void
-       %uint = OpTypeInt 32 0
-     %v3uint = OpTypeVector %uint 3
-     %uint_1 = OpConstant %uint 1
-     %uint_2 = OpConstant %uint 2
-     %uint_3 = OpConstant %uint 3
-         %10 = OpConstantComposite %v3uint %uint_1 %uint_2 %uint_3
-        %int = OpTypeInt 32 1
-      %v3int = OpTypeVector %int 3
-          %f = OpFunction %void None %1
-          %4 = OpLabel
-         %11 = OpBitcast %v3int %10
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/vector/u32-i32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/vector/u32-i32.wgsl.expected.wgsl
deleted file mode 100644
index 7539435..0000000
--- a/test/tint/expressions/bitcast/vector/u32-i32.wgsl.expected.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-  let a : vec3<u32> = vec3<u32>(1u, 2u, 3u);
-  let b : vec3<i32> = bitcast<vec3<i32>>(a);
-}
diff --git a/test/tint/expressions/bitcast/vector/u32-u32.wgsl b/test/tint/expressions/bitcast/vector/u32-u32.wgsl
deleted file mode 100644
index 9ee4e82..0000000
--- a/test/tint/expressions/bitcast/vector/u32-u32.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-    let a : vec3<u32> = vec3<u32>(1u, 2u, 3u);
-    let b : vec3<u32> = bitcast<vec3<u32>>(a);
-}
diff --git a/test/tint/expressions/bitcast/vector/u32-u32.wgsl.expected.dxc.hlsl b/test/tint/expressions/bitcast/vector/u32-u32.wgsl.expected.dxc.hlsl
deleted file mode 100644
index 71f2935..0000000
--- a/test/tint/expressions/bitcast/vector/u32-u32.wgsl.expected.dxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const uint3 a = uint3(1u, 2u, 3u);
-  const uint3 b = asuint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/u32-u32.wgsl.expected.fxc.hlsl b/test/tint/expressions/bitcast/vector/u32-u32.wgsl.expected.fxc.hlsl
deleted file mode 100644
index 71f2935..0000000
--- a/test/tint/expressions/bitcast/vector/u32-u32.wgsl.expected.fxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-[numthreads(1, 1, 1)]
-void f() {
-  const uint3 a = uint3(1u, 2u, 3u);
-  const uint3 b = asuint(a);
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/u32-u32.wgsl.expected.glsl b/test/tint/expressions/bitcast/vector/u32-u32.wgsl.expected.glsl
deleted file mode 100644
index ee92fe8..0000000
--- a/test/tint/expressions/bitcast/vector/u32-u32.wgsl.expected.glsl
+++ /dev/null
@@ -1,12 +0,0 @@
-#version 310 es
-
-void f() {
-  uvec3 a = uvec3(1u, 2u, 3u);
-  uvec3 b = a;
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  f();
-  return;
-}
diff --git a/test/tint/expressions/bitcast/vector/u32-u32.wgsl.expected.msl b/test/tint/expressions/bitcast/vector/u32-u32.wgsl.expected.msl
deleted file mode 100644
index 43d1c6b..0000000
--- a/test/tint/expressions/bitcast/vector/u32-u32.wgsl.expected.msl
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <metal_stdlib>
-
-using namespace metal;
-kernel void f() {
-  uint3 const a = uint3(1u, 2u, 3u);
-  uint3 const b = as_type<uint3>(a);
-  return;
-}
-
diff --git a/test/tint/expressions/bitcast/vector/u32-u32.wgsl.expected.spvasm b/test/tint/expressions/bitcast/vector/u32-u32.wgsl.expected.spvasm
deleted file mode 100644
index 08458e5..0000000
--- a/test/tint/expressions/bitcast/vector/u32-u32.wgsl.expected.spvasm
+++ /dev/null
@@ -1,23 +0,0 @@
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 12
-; Schema: 0
-               OpCapability Shader
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint GLCompute %f "f"
-               OpExecutionMode %f LocalSize 1 1 1
-               OpName %f "f"
-       %void = OpTypeVoid
-          %1 = OpTypeFunction %void
-       %uint = OpTypeInt 32 0
-     %v3uint = OpTypeVector %uint 3
-     %uint_1 = OpConstant %uint 1
-     %uint_2 = OpConstant %uint 2
-     %uint_3 = OpConstant %uint 3
-         %10 = OpConstantComposite %v3uint %uint_1 %uint_2 %uint_3
-          %f = OpFunction %void None %1
-          %4 = OpLabel
-         %11 = OpCopyObject %v3uint %10
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/expressions/bitcast/vector/u32-u32.wgsl.expected.wgsl b/test/tint/expressions/bitcast/vector/u32-u32.wgsl.expected.wgsl
deleted file mode 100644
index 3296a7a..0000000
--- a/test/tint/expressions/bitcast/vector/u32-u32.wgsl.expected.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
-  let a : vec3<u32> = vec3<u32>(1u, 2u, 3u);
-  let b : vec3<u32> = bitcast<vec3<u32>>(a);
-}