HLSL-IR: fix DecomposeUniformAccess for vecN<f16>

The old f16 code was not taking into account the size of f16 is 4
instead of 8 bytes. So, the indices and swizzling were all working
on the wrong compoennts. The fix is to handle the f16's as 4 bytes
and use the correct swizzling.

Bug: 359272864
Change-Id: I311a45c187f9de4181d234474fda72a2bc616f23
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/214134
Reviewed-by: David Neto <dneto@google.com>
Commit-Queue: Antonio Maiorano <amaiorano@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/hlsl/writer/access_test.cc b/src/tint/lang/hlsl/writer/access_test.cc
index c7de2e3..694b862 100644
--- a/src/tint/lang/hlsl/writer/access_test.cc
+++ b/src/tint/lang/hlsl/writer/access_test.cc
@@ -956,12 +956,12 @@
 cbuffer cbuffer_v : register(b0) {
   uint4 v[1];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v_1 = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v_1 & mask));
-  float4 t_high = f16tof32(((v_1 >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v_1 = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v_1 & mask));
+  float2 t_high = f16tof32(((v_1 >> shift) & mask));
   float16_t v_2 = float16_t(t_low.x);
   float16_t v_3 = float16_t(t_high.x);
   float16_t v_4 = float16_t(t_low.y);
@@ -970,7 +970,7 @@
 
 void foo() {
   uint x = 1u;
-  vector<float16_t, 4> a = tint_bitcast_to_f16(v[0u]);
+  vector<float16_t, 4> a = tint_bitcast_to_f16(v[0u].xy);
   float16_t b = float16_t(f16tof32(v[0u].x));
   uint v_5 = (uint(min(x, 3u)) * 2u);
   uint v_6 = v[(v_5 / 16u)][((v_5 % 16u) / 4u)];
@@ -1068,12 +1068,12 @@
 cbuffer cbuffer_v : register(b0) {
   uint4 v[1];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v_1 = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v_1 & mask));
-  float4 t_high = f16tof32(((v_1 >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v_1 = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v_1 & mask));
+  float2 t_high = f16tof32(((v_1 >> shift) & mask));
   float16_t v_2 = float16_t(t_low.x);
   float16_t v_3 = float16_t(t_high.x);
   float16_t v_4 = float16_t(t_low.y);
@@ -1081,13 +1081,15 @@
 }
 
 matrix<float16_t, 2, 3> v_5(uint start_byte_offset) {
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(v[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_6, tint_bitcast_to_f16(v[((8u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_6 = v[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.zw) : (v_6.xy))).xyz;
+  uint4 v_8 = v[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_7, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy))).xyz);
 }
 
 void foo() {
   matrix<float16_t, 2, 3> a = v_5(0u);
-  vector<float16_t, 3> b = tint_bitcast_to_f16(v[0u]).xyz;
+  vector<float16_t, 3> b = tint_bitcast_to_f16(v[0u].zw).xyz;
   float16_t c = float16_t(f16tof32(v[0u].w));
 }
 
@@ -1193,15 +1195,13 @@
 }
 
 matrix<float16_t, 2, 2> v_3(uint start_byte_offset) {
-  uint4 v_4 = v[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_5 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_4.z) : (v_4.x)));
-  uint4 v_6 = v[((4u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 2, 2>(v_5, tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_6.z) : (v_6.x))));
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(v[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  return matrix<float16_t, 2, 2>(v_4, tint_bitcast_to_f16(v[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]));
 }
 
 void foo() {
   matrix<float16_t, 2, 2> a = v_3(0u);
-  vector<float16_t, 2> b = tint_bitcast_to_f16(v[0u].x);
+  vector<float16_t, 2> b = tint_bitcast_to_f16(v[0u].y);
   float16_t c = float16_t(f16tof32((v[0u].y >> 16u)));
 }
 
@@ -1272,12 +1272,12 @@
 cbuffer cbuffer_v : register(b0) {
   uint4 v[3];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v_1 = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v_1 & mask));
-  float4 t_high = f16tof32(((v_1 >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v_1 = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v_1 & mask));
+  float2 t_high = f16tof32(((v_1 >> shift) & mask));
   float16_t v_2 = float16_t(t_low.x);
   float16_t v_3 = float16_t(t_high.x);
   float16_t v_4 = float16_t(t_low.y);
@@ -1295,20 +1295,21 @@
       if ((v_7 >= 5u)) {
         break;
       }
-      a[v_7] = tint_bitcast_to_f16(v[((start_byte_offset + (v_7 * 8u)) / 16u)]).xyz;
+      uint4 v_8 = v[((start_byte_offset + (v_7 * 8u)) / 16u)];
+      a[v_7] = tint_bitcast_to_f16(((((((start_byte_offset + (v_7 * 8u)) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy))).xyz;
       {
         v_6 = (v_7 + 1u);
       }
       continue;
     }
   }
-  vector<float16_t, 3> v_8[5] = a;
-  return v_8;
+  vector<float16_t, 3> v_9[5] = a;
+  return v_9;
 }
 
 void foo() {
   vector<float16_t, 3> a[5] = v_5(0u);
-  vector<float16_t, 3> b = tint_bitcast_to_f16(v[1u]).xyz;
+  vector<float16_t, 3> b = tint_bitcast_to_f16(v[1u].zw).xyz;
 }
 
 )");
diff --git a/src/tint/lang/hlsl/writer/raise/decompose_uniform_access.cc b/src/tint/lang/hlsl/writer/raise/decompose_uniform_access.cc
index 20f0340..5b7ed8c 100644
--- a/src/tint/lang/hlsl/writer/raise/decompose_uniform_access.cc
+++ b/src/tint/lang/hlsl/writer/raise/decompose_uniform_access.cc
@@ -433,48 +433,61 @@
     }
 
     // Returns the instruction for getting a vector-of-f16 value of type `result_ty`
-    // out of the pointer-to-vec4u value `access`.  Get the components starting
+    // out of the pointer-to-vec4u value `access`. Get the components starting
     // at byte offset (byte_idx % 16).
+    // A `vec4` or `vec3` of `f16` has 8-byte alignment, while a `vec2` of `f16` has 4-byte
+    // alignment. So, this means we'll have memory like:
+    //
+    // Byte:     |  0 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |  9 | 10 | 11 | 12 | 13 | 14 | 15 |
+    // Scalar Index:       0         |         1         |         2         |         3         |
+    // vec4<u32>:|         x         |         y         |         z         |         w         |
+    // vec4<f16>:|   x     |    y    |    z    |    w    |   x     |    y    |    z    |    w    |
+    // vec3<f16>:|   x     |    y    |    z    |         |   x     |    y    |    z    |         |
+    // vec2<f16>:|   x     |    y    |    x    |    y    |   x     |    y    |    x    |    y    |
     core::ir::Instruction* MakeVectorLoadF16(core::ir::Access* access,
                                              const core::type::Vector* result_ty,
                                              core::ir::Value* byte_idx) {
-        core::ir::Instruction* load = nullptr;
-        // Vec4 ends up being the same as a bitcast of vec2<u32> to a vec4<f16>
-        if (result_ty->Width() == 4) {
-            return b.Bitcast(result_ty, b.Load(access));
-        }
-
-        // A vec3 will be stored as a vec4, so we can bitcast as if we're a vec4 and swizzle out the
-        // last element
-        if (result_ty->Width() == 3) {
-            auto* bc = b.Bitcast(ty.vec4(result_ty->Type()), b.Load(access));
-            return b.Swizzle(result_ty, bc, {0, 1, 2});
-        }
-
-        // Vec2 ends up being the same as a bitcast u32 to vec2<f16>
-        if (result_ty->Width() == 2) {
-            auto* vec_idx = CalculateVectorOffset(byte_idx);
+        // Vec4 ends up being the same as a bitcast of vec2<u32> to a vec4<f16>.
+        // A vec3 will be stored as a vec4, so we can bitcast as if we're a vec4
+        // and swizzle out the last element.
+        if (result_ty->Width() == 3 || result_ty->Width() == 4) {
+            core::ir::Instruction* load = nullptr;
+            auto* vec_idx = CalculateVectorOffset(byte_idx);  // 0 or 2
             if (auto* cnst = vec_idx->As<core::ir::Constant>()) {
                 if (cnst->Value()->ValueAs<uint32_t>() == 2u) {
-                    load = b.Swizzle(ty.u32(), b.Load(access), {2});
+                    load = b.Swizzle(ty.vec2<u32>(), b.Load(access), {2, 3});
                 } else {
-                    load = b.Swizzle(ty.u32(), b.Load(access), {0});
+                    load = b.Swizzle(ty.vec2<u32>(), b.Load(access), {0, 1});
                 }
             } else {
                 auto* ubo = b.Load(access);
                 // if vec_idx == 2 -> zw
-                auto* sw_lhs = b.Swizzle(ty.u32(), ubo, {2});
+                auto* sw_lhs = b.Swizzle(ty.vec2<u32>(), ubo, {2, 3});
                 // else -> xy
-                auto* sw_rhs = b.Swizzle(ty.u32(), ubo, {0});
+                auto* sw_rhs = b.Swizzle(ty.vec2<u32>(), ubo, {0, 1});
                 auto* cond = b.Equal(ty.bool_(), vec_idx, 2_u);
-
-                Vector<core::ir::Value*, 3> args{sw_rhs->Result(0), sw_lhs->Result(0),
-                                                 cond->Result(0)};
-
-                load =
-                    b.ir.CreateInstruction<hlsl::ir::Ternary>(b.InstructionResult(ty.u32()), args);
+                auto args = Vector{sw_rhs->Result(0), sw_lhs->Result(0), cond->Result(0)};
+                load = b.ir.CreateInstruction<hlsl::ir::Ternary>(
+                    b.InstructionResult(ty.vec2<u32>()), std::move(args));
                 b.Append(load);
             }
+            if (result_ty->Width() == 3) {
+                auto* bc = b.Bitcast(ty.vec4(result_ty->Type()), load);
+                return b.Swizzle(result_ty, bc, {0, 1, 2});
+            }
+            return b.Bitcast(result_ty, load);
+        }
+
+        // Vec2 ends up being the same as a bitcast u32 to vec2<f16>
+        if (result_ty->Width() == 2) {
+            core::ir::Instruction* load = nullptr;
+            auto* vec_idx = CalculateVectorOffset(byte_idx);  // 0, 1, 2, or 3
+            if (auto* cnst = vec_idx->As<core::ir::Constant>()) {
+                const auto vec_idx_val = cnst->Value()->ValueAs<uint32_t>();
+                load = b.Swizzle(ty.u32(), b.Load(access), {vec_idx_val});
+            } else {
+                load = b.Access(ty.u32(), b.Load(access), vec_idx);
+            }
             return b.Bitcast(result_ty, load);
         }
 
diff --git a/src/tint/lang/hlsl/writer/raise/decompose_uniform_access_test.cc b/src/tint/lang/hlsl/writer/raise/decompose_uniform_access_test.cc
index 9b19798..c7c4ff9 100644
--- a/src/tint/lang/hlsl/writer/raise/decompose_uniform_access_test.cc
+++ b/src/tint/lang/hlsl/writer/raise/decompose_uniform_access_test.cc
@@ -399,38 +399,39 @@
     %x:u32 = let 1u
     %4:ptr<uniform, vec4<u32>, read> = access %v, 0u
     %5:vec4<u32> = load %4
-    %6:vec4<f16> = bitcast %5
-    %a:vec4<f16> = let %6
-    %8:ptr<uniform, vec4<u32>, read> = access %v, 0u
-    %9:u32 = load_vector_element %8, 0u
-    %10:f32 = hlsl.f16tof32 %9
-    %11:f16 = convert %10
-    %b:f16 = let %11
-    %13:u32 = convert %x
-    %14:u32 = mul %13, 2u
-    %15:u32 = div %14, 16u
-    %16:ptr<uniform, vec4<u32>, read> = access %v, %15
-    %17:u32 = mod %14, 16u
-    %18:u32 = div %17, 4u
-    %19:u32 = load_vector_element %16, %18
-    %20:u32 = mod %14, 4u
-    %21:bool = eq %20, 0u
-    %22:u32 = hlsl.ternary 16u, 0u, %21
-    %23:u32 = shr %19, %22
-    %24:f32 = hlsl.f16tof32 %23
-    %25:f16 = convert %24
-    %c:f16 = let %25
-    %27:ptr<uniform, vec4<u32>, read> = access %v, 0u
-    %28:u32 = load_vector_element %27, 1u
-    %29:f32 = hlsl.f16tof32 %28
-    %30:f16 = convert %29
-    %d:f16 = let %30
-    %32:ptr<uniform, vec4<u32>, read> = access %v, 0u
-    %33:u32 = load_vector_element %32, 1u
-    %34:u32 = shr %33, 16u
-    %35:f32 = hlsl.f16tof32 %34
-    %36:f16 = convert %35
-    %e:f16 = let %36
+    %6:vec2<u32> = swizzle %5, xy
+    %7:vec4<f16> = bitcast %6
+    %a:vec4<f16> = let %7
+    %9:ptr<uniform, vec4<u32>, read> = access %v, 0u
+    %10:u32 = load_vector_element %9, 0u
+    %11:f32 = hlsl.f16tof32 %10
+    %12:f16 = convert %11
+    %b:f16 = let %12
+    %14:u32 = convert %x
+    %15:u32 = mul %14, 2u
+    %16:u32 = div %15, 16u
+    %17:ptr<uniform, vec4<u32>, read> = access %v, %16
+    %18:u32 = mod %15, 16u
+    %19:u32 = div %18, 4u
+    %20:u32 = load_vector_element %17, %19
+    %21:u32 = mod %15, 4u
+    %22:bool = eq %21, 0u
+    %23:u32 = hlsl.ternary 16u, 0u, %22
+    %24:u32 = shr %20, %23
+    %25:f32 = hlsl.f16tof32 %24
+    %26:f16 = convert %25
+    %c:f16 = let %26
+    %28:ptr<uniform, vec4<u32>, read> = access %v, 0u
+    %29:u32 = load_vector_element %28, 1u
+    %30:f32 = hlsl.f16tof32 %29
+    %31:f16 = convert %30
+    %d:f16 = let %31
+    %33:ptr<uniform, vec4<u32>, read> = access %v, 0u
+    %34:u32 = load_vector_element %33, 1u
+    %35:u32 = shr %34, 16u
+    %36:f32 = hlsl.f16tof32 %35
+    %37:f16 = convert %36
+    %e:f16 = let %37
     ret
   }
 }
@@ -484,32 +485,45 @@
     %a:mat2x3<f16> = let %3
     %6:ptr<uniform, vec4<u32>, read> = access %v, 0u
     %7:vec4<u32> = load %6
-    %8:vec4<f16> = bitcast %7
-    %9:vec3<f16> = swizzle %8, xyz
-    %b:vec3<f16> = let %9
-    %11:ptr<uniform, vec4<u32>, read> = access %v, 0u
-    %12:u32 = load_vector_element %11, 3u
-    %13:f32 = hlsl.f16tof32 %12
-    %14:f16 = convert %13
-    %c:f16 = let %14
+    %8:vec2<u32> = swizzle %7, zw
+    %9:vec4<f16> = bitcast %8
+    %10:vec3<f16> = swizzle %9, xyz
+    %b:vec3<f16> = let %10
+    %12:ptr<uniform, vec4<u32>, read> = access %v, 0u
+    %13:u32 = load_vector_element %12, 3u
+    %14:f32 = hlsl.f16tof32 %13
+    %15:f16 = convert %14
+    %c:f16 = let %15
     ret
   }
 }
 %4 = func(%start_byte_offset:u32):mat2x3<f16> {
   $B3: {
-    %17:u32 = div %start_byte_offset, 16u
-    %18:ptr<uniform, vec4<u32>, read> = access %v, %17
-    %19:vec4<u32> = load %18
-    %20:vec4<f16> = bitcast %19
-    %21:vec3<f16> = swizzle %20, xyz
-    %22:u32 = add 8u, %start_byte_offset
-    %23:u32 = div %22, 16u
-    %24:ptr<uniform, vec4<u32>, read> = access %v, %23
-    %25:vec4<u32> = load %24
-    %26:vec4<f16> = bitcast %25
-    %27:vec3<f16> = swizzle %26, xyz
-    %28:mat2x3<f16> = construct %21, %27
-    ret %28
+    %18:u32 = div %start_byte_offset, 16u
+    %19:ptr<uniform, vec4<u32>, read> = access %v, %18
+    %20:u32 = mod %start_byte_offset, 16u
+    %21:u32 = div %20, 4u
+    %22:vec4<u32> = load %19
+    %23:vec2<u32> = swizzle %22, zw
+    %24:vec2<u32> = swizzle %22, xy
+    %25:bool = eq %21, 2u
+    %26:vec2<u32> = hlsl.ternary %24, %23, %25
+    %27:vec4<f16> = bitcast %26
+    %28:vec3<f16> = swizzle %27, xyz
+    %29:u32 = add 8u, %start_byte_offset
+    %30:u32 = div %29, 16u
+    %31:ptr<uniform, vec4<u32>, read> = access %v, %30
+    %32:u32 = mod %29, 16u
+    %33:u32 = div %32, 4u
+    %34:vec4<u32> = load %31
+    %35:vec2<u32> = swizzle %34, zw
+    %36:vec2<u32> = swizzle %34, xy
+    %37:bool = eq %33, 2u
+    %38:vec2<u32> = hlsl.ternary %36, %35, %37
+    %39:vec4<f16> = bitcast %38
+    %40:vec3<f16> = swizzle %39, xyz
+    %41:mat2x3<f16> = construct %28, %40
+    ret %41
   }
 }
 )";
diff --git a/test/tint/buffer/uniform/dynamic_index/read_f16.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/dynamic_index/read_f16.wgsl.expected.ir.dxc.hlsl
index 3be3f5f..3c937a8 100644
--- a/test/tint/buffer/uniform/dynamic_index/read_f16.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/dynamic_index/read_f16.wgsl.expected.ir.dxc.hlsl
@@ -24,20 +24,38 @@
 }
 
 matrix<float16_t, 4, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = ub[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = ub[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = ub[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x)));
-  uint4 v_9 = ub[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_4, v_6, v_8, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.z) : (v_9.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(ub[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(ub[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(ub[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_3, v_4, v_5, tint_bitcast_to_f16(ub[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
 typedef matrix<float16_t, 4, 2> ary_ret[2];
-ary_ret v_10(uint start_byte_offset) {
+ary_ret v_6(uint start_byte_offset) {
   matrix<float16_t, 4, 2> a[2] = (matrix<float16_t, 4, 2>[2])0;
   {
+    uint v_7 = 0u;
+    v_7 = 0u;
+    while(true) {
+      uint v_8 = v_7;
+      if ((v_8 >= 2u)) {
+        break;
+      }
+      a[v_8] = v_2((start_byte_offset + (v_8 * 16u)));
+      {
+        v_7 = (v_8 + 1u);
+      }
+      continue;
+    }
+  }
+  matrix<float16_t, 4, 2> v_9[2] = a;
+  return v_9;
+}
+
+typedef float3 ary_ret_1[2];
+ary_ret_1 v_10(uint start_byte_offset) {
+  float3 a[2] = (float3[2])0;
+  {
     uint v_11 = 0u;
     v_11 = 0u;
     while(true) {
@@ -45,256 +63,248 @@
       if ((v_12 >= 2u)) {
         break;
       }
-      a[v_12] = v_2((start_byte_offset + (v_12 * 16u)));
+      a[v_12] = asfloat(ub[((start_byte_offset + (v_12 * 16u)) / 16u)].xyz);
       {
         v_11 = (v_12 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 4, 2> v_13[2] = a;
+  float3 v_13[2] = a;
   return v_13;
 }
 
-typedef float3 ary_ret_1[2];
-ary_ret_1 v_14(uint start_byte_offset) {
-  float3 a[2] = (float3[2])0;
-  {
-    uint v_15 = 0u;
-    v_15 = 0u;
-    while(true) {
-      uint v_16 = v_15;
-      if ((v_16 >= 2u)) {
-        break;
-      }
-      a[v_16] = asfloat(ub[((start_byte_offset + (v_16 * 16u)) / 16u)].xyz);
-      {
-        v_15 = (v_16 + 1u);
-      }
-      continue;
-    }
-  }
-  float3 v_17[2] = a;
-  return v_17;
+vector<float16_t, 4> tint_bitcast_to_f16_1(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
+  float16_t v_14 = float16_t(t_low.x);
+  float16_t v_15 = float16_t(t_high.x);
+  float16_t v_16 = float16_t(t_low.y);
+  return vector<float16_t, 4>(v_14, v_15, v_16, float16_t(t_high.y));
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16_1(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
-  float16_t v_18 = float16_t(t_low.x);
-  float16_t v_19 = float16_t(t_high.x);
-  float16_t v_20 = float16_t(t_low.y);
-  return vector<float16_t, 4>(v_18, v_19, v_20, float16_t(t_high.y));
-}
-
-matrix<float16_t, 4, 4> v_21(uint start_byte_offset) {
-  vector<float16_t, 4> v_22 = tint_bitcast_to_f16_1(ub[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_23 = tint_bitcast_to_f16_1(ub[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_24 = tint_bitcast_to_f16_1(ub[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_22, v_23, v_24, tint_bitcast_to_f16_1(ub[((24u + start_byte_offset) / 16u)]));
+matrix<float16_t, 4, 4> v_17(uint start_byte_offset) {
+  uint4 v_18 = ub[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_19 = tint_bitcast_to_f16_1((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_18.zw) : (v_18.xy)));
+  uint4 v_20 = ub[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_21 = tint_bitcast_to_f16_1(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_20.zw) : (v_20.xy)));
+  uint4 v_22 = ub[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_23 = tint_bitcast_to_f16_1(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_22.zw) : (v_22.xy)));
+  uint4 v_24 = ub[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_19, v_21, v_23, tint_bitcast_to_f16_1(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_24.zw) : (v_24.xy))));
 }
 
 matrix<float16_t, 4, 3> v_25(uint start_byte_offset) {
-  vector<float16_t, 3> v_26 = tint_bitcast_to_f16_1(ub[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_27 = tint_bitcast_to_f16_1(ub[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_28 = tint_bitcast_to_f16_1(ub[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_26, v_27, v_28, tint_bitcast_to_f16_1(ub[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_26 = ub[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_27 = tint_bitcast_to_f16_1((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_26.zw) : (v_26.xy))).xyz;
+  uint4 v_28 = ub[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_29 = tint_bitcast_to_f16_1(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_28.zw) : (v_28.xy))).xyz;
+  uint4 v_30 = ub[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_31 = tint_bitcast_to_f16_1(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_30.zw) : (v_30.xy))).xyz;
+  uint4 v_32 = ub[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_27, v_29, v_31, tint_bitcast_to_f16_1(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_32.zw) : (v_32.xy))).xyz);
 }
 
-matrix<float16_t, 3, 4> v_29(uint start_byte_offset) {
-  vector<float16_t, 4> v_30 = tint_bitcast_to_f16_1(ub[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_31 = tint_bitcast_to_f16_1(ub[((8u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 3, 4>(v_30, v_31, tint_bitcast_to_f16_1(ub[((16u + start_byte_offset) / 16u)]));
+matrix<float16_t, 3, 4> v_33(uint start_byte_offset) {
+  uint4 v_34 = ub[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_35 = tint_bitcast_to_f16_1((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_34.zw) : (v_34.xy)));
+  uint4 v_36 = ub[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_37 = tint_bitcast_to_f16_1(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_36.zw) : (v_36.xy)));
+  uint4 v_38 = ub[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 4>(v_35, v_37, tint_bitcast_to_f16_1(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_38.zw) : (v_38.xy))));
 }
 
-matrix<float16_t, 3, 3> v_32(uint start_byte_offset) {
-  vector<float16_t, 3> v_33 = tint_bitcast_to_f16_1(ub[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_34 = tint_bitcast_to_f16_1(ub[((8u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 3, 3>(v_33, v_34, tint_bitcast_to_f16_1(ub[((16u + start_byte_offset) / 16u)]).xyz);
+matrix<float16_t, 3, 3> v_39(uint start_byte_offset) {
+  uint4 v_40 = ub[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_41 = tint_bitcast_to_f16_1((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_40.zw) : (v_40.xy))).xyz;
+  uint4 v_42 = ub[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_43 = tint_bitcast_to_f16_1(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_42.zw) : (v_42.xy))).xyz;
+  uint4 v_44 = ub[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 3>(v_41, v_43, tint_bitcast_to_f16_1(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_44.zw) : (v_44.xy))).xyz);
 }
 
-matrix<float16_t, 3, 2> v_35(uint start_byte_offset) {
-  uint4 v_36 = ub[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_37 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_36.z) : (v_36.x)));
-  uint4 v_38 = ub[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_39 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_38.z) : (v_38.x)));
-  uint4 v_40 = ub[((8u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 3, 2>(v_37, v_39, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_40.z) : (v_40.x))));
+matrix<float16_t, 3, 2> v_45(uint start_byte_offset) {
+  vector<float16_t, 2> v_46 = tint_bitcast_to_f16(ub[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_47 = tint_bitcast_to_f16(ub[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 3, 2>(v_46, v_47, tint_bitcast_to_f16(ub[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]));
 }
 
-matrix<float16_t, 2, 4> v_41(uint start_byte_offset) {
-  vector<float16_t, 4> v_42 = tint_bitcast_to_f16_1(ub[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_42, tint_bitcast_to_f16_1(ub[((8u + start_byte_offset) / 16u)]));
+matrix<float16_t, 2, 4> v_48(uint start_byte_offset) {
+  uint4 v_49 = ub[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_50 = tint_bitcast_to_f16_1((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_49.zw) : (v_49.xy)));
+  uint4 v_51 = ub[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_50, tint_bitcast_to_f16_1(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_51.zw) : (v_51.xy))));
 }
 
-matrix<float16_t, 2, 3> v_43(uint start_byte_offset) {
-  vector<float16_t, 3> v_44 = tint_bitcast_to_f16_1(ub[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_44, tint_bitcast_to_f16_1(ub[((8u + start_byte_offset) / 16u)]).xyz);
+matrix<float16_t, 2, 3> v_52(uint start_byte_offset) {
+  uint4 v_53 = ub[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_54 = tint_bitcast_to_f16_1((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_53.zw) : (v_53.xy))).xyz;
+  uint4 v_55 = ub[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_54, tint_bitcast_to_f16_1(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_55.zw) : (v_55.xy))).xyz);
 }
 
-matrix<float16_t, 2, 2> v_45(uint start_byte_offset) {
-  uint4 v_46 = ub[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_47 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_46.z) : (v_46.x)));
-  uint4 v_48 = ub[((4u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 2, 2>(v_47, tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_48.z) : (v_48.x))));
+matrix<float16_t, 2, 2> v_56(uint start_byte_offset) {
+  vector<float16_t, 2> v_57 = tint_bitcast_to_f16(ub[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  return matrix<float16_t, 2, 2>(v_57, tint_bitcast_to_f16(ub[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]));
 }
 
-float4x4 v_49(uint start_byte_offset) {
-  float4 v_50 = asfloat(ub[(start_byte_offset / 16u)]);
-  float4 v_51 = asfloat(ub[((16u + start_byte_offset) / 16u)]);
-  float4 v_52 = asfloat(ub[((32u + start_byte_offset) / 16u)]);
-  return float4x4(v_50, v_51, v_52, asfloat(ub[((48u + start_byte_offset) / 16u)]));
+float4x4 v_58(uint start_byte_offset) {
+  float4 v_59 = asfloat(ub[(start_byte_offset / 16u)]);
+  float4 v_60 = asfloat(ub[((16u + start_byte_offset) / 16u)]);
+  float4 v_61 = asfloat(ub[((32u + start_byte_offset) / 16u)]);
+  return float4x4(v_59, v_60, v_61, asfloat(ub[((48u + start_byte_offset) / 16u)]));
 }
 
-float4x3 v_53(uint start_byte_offset) {
-  float3 v_54 = asfloat(ub[(start_byte_offset / 16u)].xyz);
-  float3 v_55 = asfloat(ub[((16u + start_byte_offset) / 16u)].xyz);
-  float3 v_56 = asfloat(ub[((32u + start_byte_offset) / 16u)].xyz);
-  return float4x3(v_54, v_55, v_56, asfloat(ub[((48u + start_byte_offset) / 16u)].xyz));
+float4x3 v_62(uint start_byte_offset) {
+  float3 v_63 = asfloat(ub[(start_byte_offset / 16u)].xyz);
+  float3 v_64 = asfloat(ub[((16u + start_byte_offset) / 16u)].xyz);
+  float3 v_65 = asfloat(ub[((32u + start_byte_offset) / 16u)].xyz);
+  return float4x3(v_63, v_64, v_65, asfloat(ub[((48u + start_byte_offset) / 16u)].xyz));
 }
 
-float4x2 v_57(uint start_byte_offset) {
-  uint4 v_58 = ub[(start_byte_offset / 16u)];
-  float2 v_59 = asfloat((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_58.zw) : (v_58.xy)));
-  uint4 v_60 = ub[((8u + start_byte_offset) / 16u)];
-  float2 v_61 = asfloat(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_60.zw) : (v_60.xy)));
-  uint4 v_62 = ub[((16u + start_byte_offset) / 16u)];
-  float2 v_63 = asfloat(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_62.zw) : (v_62.xy)));
-  uint4 v_64 = ub[((24u + start_byte_offset) / 16u)];
-  return float4x2(v_59, v_61, v_63, asfloat(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_64.zw) : (v_64.xy))));
+float4x2 v_66(uint start_byte_offset) {
+  uint4 v_67 = ub[(start_byte_offset / 16u)];
+  float2 v_68 = asfloat((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_67.zw) : (v_67.xy)));
+  uint4 v_69 = ub[((8u + start_byte_offset) / 16u)];
+  float2 v_70 = asfloat(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_69.zw) : (v_69.xy)));
+  uint4 v_71 = ub[((16u + start_byte_offset) / 16u)];
+  float2 v_72 = asfloat(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_71.zw) : (v_71.xy)));
+  uint4 v_73 = ub[((24u + start_byte_offset) / 16u)];
+  return float4x2(v_68, v_70, v_72, asfloat(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_73.zw) : (v_73.xy))));
 }
 
-float3x4 v_65(uint start_byte_offset) {
-  float4 v_66 = asfloat(ub[(start_byte_offset / 16u)]);
-  float4 v_67 = asfloat(ub[((16u + start_byte_offset) / 16u)]);
-  return float3x4(v_66, v_67, asfloat(ub[((32u + start_byte_offset) / 16u)]));
+float3x4 v_74(uint start_byte_offset) {
+  float4 v_75 = asfloat(ub[(start_byte_offset / 16u)]);
+  float4 v_76 = asfloat(ub[((16u + start_byte_offset) / 16u)]);
+  return float3x4(v_75, v_76, asfloat(ub[((32u + start_byte_offset) / 16u)]));
 }
 
-float3x3 v_68(uint start_byte_offset) {
-  float3 v_69 = asfloat(ub[(start_byte_offset / 16u)].xyz);
-  float3 v_70 = asfloat(ub[((16u + start_byte_offset) / 16u)].xyz);
-  return float3x3(v_69, v_70, asfloat(ub[((32u + start_byte_offset) / 16u)].xyz));
+float3x3 v_77(uint start_byte_offset) {
+  float3 v_78 = asfloat(ub[(start_byte_offset / 16u)].xyz);
+  float3 v_79 = asfloat(ub[((16u + start_byte_offset) / 16u)].xyz);
+  return float3x3(v_78, v_79, asfloat(ub[((32u + start_byte_offset) / 16u)].xyz));
 }
 
-float3x2 v_71(uint start_byte_offset) {
-  uint4 v_72 = ub[(start_byte_offset / 16u)];
-  float2 v_73 = asfloat((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_72.zw) : (v_72.xy)));
-  uint4 v_74 = ub[((8u + start_byte_offset) / 16u)];
-  float2 v_75 = asfloat(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_74.zw) : (v_74.xy)));
-  uint4 v_76 = ub[((16u + start_byte_offset) / 16u)];
-  return float3x2(v_73, v_75, asfloat(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_76.zw) : (v_76.xy))));
+float3x2 v_80(uint start_byte_offset) {
+  uint4 v_81 = ub[(start_byte_offset / 16u)];
+  float2 v_82 = asfloat((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_81.zw) : (v_81.xy)));
+  uint4 v_83 = ub[((8u + start_byte_offset) / 16u)];
+  float2 v_84 = asfloat(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_83.zw) : (v_83.xy)));
+  uint4 v_85 = ub[((16u + start_byte_offset) / 16u)];
+  return float3x2(v_82, v_84, asfloat(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_85.zw) : (v_85.xy))));
 }
 
-float2x4 v_77(uint start_byte_offset) {
-  float4 v_78 = asfloat(ub[(start_byte_offset / 16u)]);
-  return float2x4(v_78, asfloat(ub[((16u + start_byte_offset) / 16u)]));
+float2x4 v_86(uint start_byte_offset) {
+  float4 v_87 = asfloat(ub[(start_byte_offset / 16u)]);
+  return float2x4(v_87, asfloat(ub[((16u + start_byte_offset) / 16u)]));
 }
 
-float2x3 v_79(uint start_byte_offset) {
-  float3 v_80 = asfloat(ub[(start_byte_offset / 16u)].xyz);
-  return float2x3(v_80, asfloat(ub[((16u + start_byte_offset) / 16u)].xyz));
+float2x3 v_88(uint start_byte_offset) {
+  float3 v_89 = asfloat(ub[(start_byte_offset / 16u)].xyz);
+  return float2x3(v_89, asfloat(ub[((16u + start_byte_offset) / 16u)].xyz));
 }
 
-float2x2 v_81(uint start_byte_offset) {
-  uint4 v_82 = ub[(start_byte_offset / 16u)];
-  float2 v_83 = asfloat((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_82.zw) : (v_82.xy)));
-  uint4 v_84 = ub[((8u + start_byte_offset) / 16u)];
-  return float2x2(v_83, asfloat(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_84.zw) : (v_84.xy))));
+float2x2 v_90(uint start_byte_offset) {
+  uint4 v_91 = ub[(start_byte_offset / 16u)];
+  float2 v_92 = asfloat((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_91.zw) : (v_91.xy)));
+  uint4 v_93 = ub[((8u + start_byte_offset) / 16u)];
+  return float2x2(v_92, asfloat(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_93.zw) : (v_93.xy))));
 }
 
 void main_inner(uint idx) {
-  uint v_85 = (800u * uint(idx));
-  float scalar_f32 = asfloat(ub[(v_85 / 16u)][((v_85 % 16u) / 4u)]);
-  uint v_86 = (4u + (800u * uint(idx)));
-  int scalar_i32 = asint(ub[(v_86 / 16u)][((v_86 % 16u) / 4u)]);
-  uint v_87 = (8u + (800u * uint(idx)));
-  uint scalar_u32 = ub[(v_87 / 16u)][((v_87 % 16u) / 4u)];
-  uint v_88 = (12u + (800u * uint(idx)));
-  uint v_89 = ub[(v_88 / 16u)][((v_88 % 16u) / 4u)];
-  float16_t scalar_f16 = float16_t(f16tof32((v_89 >> ((((v_88 % 4u) == 0u)) ? (0u) : (16u)))));
-  uint v_90 = (16u + (800u * uint(idx)));
-  uint4 v_91 = ub[(v_90 / 16u)];
-  float2 vec2_f32 = asfloat((((((v_90 % 16u) / 4u) == 2u)) ? (v_91.zw) : (v_91.xy)));
-  uint v_92 = (24u + (800u * uint(idx)));
-  uint4 v_93 = ub[(v_92 / 16u)];
-  int2 vec2_i32 = asint((((((v_92 % 16u) / 4u) == 2u)) ? (v_93.zw) : (v_93.xy)));
-  uint v_94 = (32u + (800u * uint(idx)));
-  uint4 v_95 = ub[(v_94 / 16u)];
-  uint2 vec2_u32 = (((((v_94 % 16u) / 4u) == 2u)) ? (v_95.zw) : (v_95.xy));
-  uint v_96 = (40u + (800u * uint(idx)));
-  uint4 v_97 = ub[(v_96 / 16u)];
-  vector<float16_t, 2> vec2_f16 = tint_bitcast_to_f16((((((v_96 % 16u) / 4u) == 2u)) ? (v_97.z) : (v_97.x)));
-  uint v_98 = ((48u + (800u * uint(idx))) / 16u);
-  float3 vec3_f32 = asfloat(ub[v_98].xyz);
-  uint v_99 = ((64u + (800u * uint(idx))) / 16u);
-  int3 vec3_i32 = asint(ub[v_99].xyz);
-  uint v_100 = ((80u + (800u * uint(idx))) / 16u);
-  uint3 vec3_u32 = ub[v_100].xyz;
-  uint v_101 = ((96u + (800u * uint(idx))) / 16u);
-  vector<float16_t, 3> vec3_f16 = tint_bitcast_to_f16_1(ub[v_101]).xyz;
-  uint v_102 = ((112u + (800u * uint(idx))) / 16u);
-  float4 vec4_f32 = asfloat(ub[v_102]);
-  uint v_103 = ((128u + (800u * uint(idx))) / 16u);
-  int4 vec4_i32 = asint(ub[v_103]);
-  uint v_104 = ((144u + (800u * uint(idx))) / 16u);
-  uint4 vec4_u32 = ub[v_104];
-  uint v_105 = ((160u + (800u * uint(idx))) / 16u);
-  vector<float16_t, 4> vec4_f16 = tint_bitcast_to_f16_1(ub[v_105]);
-  float2x2 mat2x2_f32 = v_81((168u + (800u * uint(idx))));
-  float2x3 mat2x3_f32 = v_79((192u + (800u * uint(idx))));
-  float2x4 mat2x4_f32 = v_77((224u + (800u * uint(idx))));
-  float3x2 mat3x2_f32 = v_71((256u + (800u * uint(idx))));
-  float3x3 mat3x3_f32 = v_68((288u + (800u * uint(idx))));
-  float3x4 mat3x4_f32 = v_65((336u + (800u * uint(idx))));
-  float4x2 mat4x2_f32 = v_57((384u + (800u * uint(idx))));
-  float4x3 mat4x3_f32 = v_53((416u + (800u * uint(idx))));
-  float4x4 mat4x4_f32 = v_49((480u + (800u * uint(idx))));
-  matrix<float16_t, 2, 2> mat2x2_f16 = v_45((544u + (800u * uint(idx))));
-  matrix<float16_t, 2, 3> mat2x3_f16 = v_43((552u + (800u * uint(idx))));
-  matrix<float16_t, 2, 4> mat2x4_f16 = v_41((568u + (800u * uint(idx))));
-  matrix<float16_t, 3, 2> mat3x2_f16 = v_35((584u + (800u * uint(idx))));
-  matrix<float16_t, 3, 3> mat3x3_f16 = v_32((600u + (800u * uint(idx))));
-  matrix<float16_t, 3, 4> mat3x4_f16 = v_29((624u + (800u * uint(idx))));
+  uint v_94 = (800u * uint(idx));
+  float scalar_f32 = asfloat(ub[(v_94 / 16u)][((v_94 % 16u) / 4u)]);
+  uint v_95 = (4u + (800u * uint(idx)));
+  int scalar_i32 = asint(ub[(v_95 / 16u)][((v_95 % 16u) / 4u)]);
+  uint v_96 = (8u + (800u * uint(idx)));
+  uint scalar_u32 = ub[(v_96 / 16u)][((v_96 % 16u) / 4u)];
+  uint v_97 = (12u + (800u * uint(idx)));
+  uint v_98 = ub[(v_97 / 16u)][((v_97 % 16u) / 4u)];
+  float16_t scalar_f16 = float16_t(f16tof32((v_98 >> ((((v_97 % 4u) == 0u)) ? (0u) : (16u)))));
+  uint v_99 = (16u + (800u * uint(idx)));
+  uint4 v_100 = ub[(v_99 / 16u)];
+  float2 vec2_f32 = asfloat((((((v_99 % 16u) / 4u) == 2u)) ? (v_100.zw) : (v_100.xy)));
+  uint v_101 = (24u + (800u * uint(idx)));
+  uint4 v_102 = ub[(v_101 / 16u)];
+  int2 vec2_i32 = asint((((((v_101 % 16u) / 4u) == 2u)) ? (v_102.zw) : (v_102.xy)));
+  uint v_103 = (32u + (800u * uint(idx)));
+  uint4 v_104 = ub[(v_103 / 16u)];
+  uint2 vec2_u32 = (((((v_103 % 16u) / 4u) == 2u)) ? (v_104.zw) : (v_104.xy));
+  uint v_105 = (40u + (800u * uint(idx)));
+  vector<float16_t, 2> vec2_f16 = tint_bitcast_to_f16(ub[(v_105 / 16u)][((v_105 % 16u) / 4u)]);
+  uint v_106 = ((48u + (800u * uint(idx))) / 16u);
+  float3 vec3_f32 = asfloat(ub[v_106].xyz);
+  uint v_107 = ((64u + (800u * uint(idx))) / 16u);
+  int3 vec3_i32 = asint(ub[v_107].xyz);
+  uint v_108 = ((80u + (800u * uint(idx))) / 16u);
+  uint3 vec3_u32 = ub[v_108].xyz;
+  uint v_109 = (96u + (800u * uint(idx)));
+  uint4 v_110 = ub[(v_109 / 16u)];
+  vector<float16_t, 3> vec3_f16 = tint_bitcast_to_f16_1((((((v_109 % 16u) / 4u) == 2u)) ? (v_110.zw) : (v_110.xy))).xyz;
+  uint v_111 = ((112u + (800u * uint(idx))) / 16u);
+  float4 vec4_f32 = asfloat(ub[v_111]);
+  uint v_112 = ((128u + (800u * uint(idx))) / 16u);
+  int4 vec4_i32 = asint(ub[v_112]);
+  uint v_113 = ((144u + (800u * uint(idx))) / 16u);
+  uint4 vec4_u32 = ub[v_113];
+  uint v_114 = (160u + (800u * uint(idx)));
+  uint4 v_115 = ub[(v_114 / 16u)];
+  vector<float16_t, 4> vec4_f16 = tint_bitcast_to_f16_1((((((v_114 % 16u) / 4u) == 2u)) ? (v_115.zw) : (v_115.xy)));
+  float2x2 mat2x2_f32 = v_90((168u + (800u * uint(idx))));
+  float2x3 mat2x3_f32 = v_88((192u + (800u * uint(idx))));
+  float2x4 mat2x4_f32 = v_86((224u + (800u * uint(idx))));
+  float3x2 mat3x2_f32 = v_80((256u + (800u * uint(idx))));
+  float3x3 mat3x3_f32 = v_77((288u + (800u * uint(idx))));
+  float3x4 mat3x4_f32 = v_74((336u + (800u * uint(idx))));
+  float4x2 mat4x2_f32 = v_66((384u + (800u * uint(idx))));
+  float4x3 mat4x3_f32 = v_62((416u + (800u * uint(idx))));
+  float4x4 mat4x4_f32 = v_58((480u + (800u * uint(idx))));
+  matrix<float16_t, 2, 2> mat2x2_f16 = v_56((544u + (800u * uint(idx))));
+  matrix<float16_t, 2, 3> mat2x3_f16 = v_52((552u + (800u * uint(idx))));
+  matrix<float16_t, 2, 4> mat2x4_f16 = v_48((568u + (800u * uint(idx))));
+  matrix<float16_t, 3, 2> mat3x2_f16 = v_45((584u + (800u * uint(idx))));
+  matrix<float16_t, 3, 3> mat3x3_f16 = v_39((600u + (800u * uint(idx))));
+  matrix<float16_t, 3, 4> mat3x4_f16 = v_33((624u + (800u * uint(idx))));
   matrix<float16_t, 4, 2> mat4x2_f16 = v_2((648u + (800u * uint(idx))));
   matrix<float16_t, 4, 3> mat4x3_f16 = v_25((664u + (800u * uint(idx))));
-  matrix<float16_t, 4, 4> mat4x4_f16 = v_21((696u + (800u * uint(idx))));
-  float3 arr2_vec3_f32[2] = v_14((736u + (800u * uint(idx))));
-  matrix<float16_t, 4, 2> arr2_mat4x2_f16[2] = v_10((768u + (800u * uint(idx))));
-  int v_106 = (tint_f32_to_i32(scalar_f32) + scalar_i32);
-  int v_107 = (v_106 + int(scalar_u32));
-  int v_108 = (v_107 + tint_f16_to_i32(scalar_f16));
-  int v_109 = ((v_108 + tint_f32_to_i32(vec2_f32[0u])) + vec2_i32[0u]);
-  int v_110 = (v_109 + int(vec2_u32[0u]));
-  int v_111 = (v_110 + tint_f16_to_i32(vec2_f16[0u]));
-  int v_112 = ((v_111 + tint_f32_to_i32(vec3_f32[1u])) + vec3_i32[1u]);
-  int v_113 = (v_112 + int(vec3_u32[1u]));
-  int v_114 = (v_113 + tint_f16_to_i32(vec3_f16[1u]));
-  int v_115 = ((v_114 + tint_f32_to_i32(vec4_f32[2u])) + vec4_i32[2u]);
-  int v_116 = (v_115 + int(vec4_u32[2u]));
-  int v_117 = (v_116 + tint_f16_to_i32(vec4_f16[2u]));
-  int v_118 = (v_117 + tint_f32_to_i32(mat2x2_f32[int(0)][0u]));
-  int v_119 = (v_118 + tint_f32_to_i32(mat2x3_f32[int(0)][0u]));
-  int v_120 = (v_119 + tint_f32_to_i32(mat2x4_f32[int(0)][0u]));
-  int v_121 = (v_120 + tint_f32_to_i32(mat3x2_f32[int(0)][0u]));
-  int v_122 = (v_121 + tint_f32_to_i32(mat3x3_f32[int(0)][0u]));
-  int v_123 = (v_122 + tint_f32_to_i32(mat3x4_f32[int(0)][0u]));
-  int v_124 = (v_123 + tint_f32_to_i32(mat4x2_f32[int(0)][0u]));
-  int v_125 = (v_124 + tint_f32_to_i32(mat4x3_f32[int(0)][0u]));
-  int v_126 = (v_125 + tint_f32_to_i32(mat4x4_f32[int(0)][0u]));
-  int v_127 = (v_126 + tint_f16_to_i32(mat2x2_f16[int(0)][0u]));
-  int v_128 = (v_127 + tint_f16_to_i32(mat2x3_f16[int(0)][0u]));
-  int v_129 = (v_128 + tint_f16_to_i32(mat2x4_f16[int(0)][0u]));
-  int v_130 = (v_129 + tint_f16_to_i32(mat3x2_f16[int(0)][0u]));
-  int v_131 = (v_130 + tint_f16_to_i32(mat3x3_f16[int(0)][0u]));
-  int v_132 = (v_131 + tint_f16_to_i32(mat3x4_f16[int(0)][0u]));
-  int v_133 = (v_132 + tint_f16_to_i32(mat4x2_f16[int(0)][0u]));
-  int v_134 = (v_133 + tint_f16_to_i32(mat4x3_f16[int(0)][0u]));
-  int v_135 = (v_134 + tint_f16_to_i32(mat4x4_f16[int(0)][0u]));
-  int v_136 = (v_135 + tint_f32_to_i32(arr2_vec3_f32[int(0)][0u]));
-  s.Store(0u, asuint((v_136 + tint_f16_to_i32(arr2_mat4x2_f16[int(0)][int(0)][0u]))));
+  matrix<float16_t, 4, 4> mat4x4_f16 = v_17((696u + (800u * uint(idx))));
+  float3 arr2_vec3_f32[2] = v_10((736u + (800u * uint(idx))));
+  matrix<float16_t, 4, 2> arr2_mat4x2_f16[2] = v_6((768u + (800u * uint(idx))));
+  int v_116 = (tint_f32_to_i32(scalar_f32) + scalar_i32);
+  int v_117 = (v_116 + int(scalar_u32));
+  int v_118 = (v_117 + tint_f16_to_i32(scalar_f16));
+  int v_119 = ((v_118 + tint_f32_to_i32(vec2_f32[0u])) + vec2_i32[0u]);
+  int v_120 = (v_119 + int(vec2_u32[0u]));
+  int v_121 = (v_120 + tint_f16_to_i32(vec2_f16[0u]));
+  int v_122 = ((v_121 + tint_f32_to_i32(vec3_f32[1u])) + vec3_i32[1u]);
+  int v_123 = (v_122 + int(vec3_u32[1u]));
+  int v_124 = (v_123 + tint_f16_to_i32(vec3_f16[1u]));
+  int v_125 = ((v_124 + tint_f32_to_i32(vec4_f32[2u])) + vec4_i32[2u]);
+  int v_126 = (v_125 + int(vec4_u32[2u]));
+  int v_127 = (v_126 + tint_f16_to_i32(vec4_f16[2u]));
+  int v_128 = (v_127 + tint_f32_to_i32(mat2x2_f32[int(0)][0u]));
+  int v_129 = (v_128 + tint_f32_to_i32(mat2x3_f32[int(0)][0u]));
+  int v_130 = (v_129 + tint_f32_to_i32(mat2x4_f32[int(0)][0u]));
+  int v_131 = (v_130 + tint_f32_to_i32(mat3x2_f32[int(0)][0u]));
+  int v_132 = (v_131 + tint_f32_to_i32(mat3x3_f32[int(0)][0u]));
+  int v_133 = (v_132 + tint_f32_to_i32(mat3x4_f32[int(0)][0u]));
+  int v_134 = (v_133 + tint_f32_to_i32(mat4x2_f32[int(0)][0u]));
+  int v_135 = (v_134 + tint_f32_to_i32(mat4x3_f32[int(0)][0u]));
+  int v_136 = (v_135 + tint_f32_to_i32(mat4x4_f32[int(0)][0u]));
+  int v_137 = (v_136 + tint_f16_to_i32(mat2x2_f16[int(0)][0u]));
+  int v_138 = (v_137 + tint_f16_to_i32(mat2x3_f16[int(0)][0u]));
+  int v_139 = (v_138 + tint_f16_to_i32(mat2x4_f16[int(0)][0u]));
+  int v_140 = (v_139 + tint_f16_to_i32(mat3x2_f16[int(0)][0u]));
+  int v_141 = (v_140 + tint_f16_to_i32(mat3x3_f16[int(0)][0u]));
+  int v_142 = (v_141 + tint_f16_to_i32(mat3x4_f16[int(0)][0u]));
+  int v_143 = (v_142 + tint_f16_to_i32(mat4x2_f16[int(0)][0u]));
+  int v_144 = (v_143 + tint_f16_to_i32(mat4x3_f16[int(0)][0u]));
+  int v_145 = (v_144 + tint_f16_to_i32(mat4x4_f16[int(0)][0u]));
+  int v_146 = (v_145 + tint_f32_to_i32(arr2_vec3_f32[int(0)][0u]));
+  s.Store(0u, asuint((v_146 + tint_f16_to_i32(arr2_mat4x2_f16[int(0)][int(0)][0u]))));
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/static_index/read_f16.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/static_index/read_f16.wgsl.expected.ir.dxc.hlsl
index 62bfecd..31da945 100644
--- a/test/tint/buffer/uniform/static_index/read_f16.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/static_index/read_f16.wgsl.expected.ir.dxc.hlsl
@@ -57,20 +57,38 @@
 }
 
 matrix<float16_t, 4, 2> v_12(uint start_byte_offset) {
-  uint4 v_13 = ub[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_14 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_13.z) : (v_13.x)));
-  uint4 v_15 = ub[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_16 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_15.z) : (v_15.x)));
-  uint4 v_17 = ub[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_18 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_17.z) : (v_17.x)));
-  uint4 v_19 = ub[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_14, v_16, v_18, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_19.z) : (v_19.x))));
+  vector<float16_t, 2> v_13 = tint_bitcast_to_f16(ub[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_14 = tint_bitcast_to_f16(ub[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_15 = tint_bitcast_to_f16(ub[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_13, v_14, v_15, tint_bitcast_to_f16(ub[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
 typedef matrix<float16_t, 4, 2> ary_ret_1[2];
-ary_ret_1 v_20(uint start_byte_offset) {
+ary_ret_1 v_16(uint start_byte_offset) {
   matrix<float16_t, 4, 2> a[2] = (matrix<float16_t, 4, 2>[2])0;
   {
+    uint v_17 = 0u;
+    v_17 = 0u;
+    while(true) {
+      uint v_18 = v_17;
+      if ((v_18 >= 2u)) {
+        break;
+      }
+      a[v_18] = v_12((start_byte_offset + (v_18 * 16u)));
+      {
+        v_17 = (v_18 + 1u);
+      }
+      continue;
+    }
+  }
+  matrix<float16_t, 4, 2> v_19[2] = a;
+  return v_19;
+}
+
+typedef float3 ary_ret_2[2];
+ary_ret_2 v_20(uint start_byte_offset) {
+  float3 a[2] = (float3[2])0;
+  {
     uint v_21 = 0u;
     v_21 = 0u;
     while(true) {
@@ -78,164 +96,155 @@
       if ((v_22 >= 2u)) {
         break;
       }
-      a[v_22] = v_12((start_byte_offset + (v_22 * 16u)));
+      a[v_22] = asfloat(ub[((start_byte_offset + (v_22 * 16u)) / 16u)].xyz);
       {
         v_21 = (v_22 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 4, 2> v_23[2] = a;
+  float3 v_23[2] = a;
   return v_23;
 }
 
-typedef float3 ary_ret_2[2];
-ary_ret_2 v_24(uint start_byte_offset) {
-  float3 a[2] = (float3[2])0;
-  {
-    uint v_25 = 0u;
-    v_25 = 0u;
-    while(true) {
-      uint v_26 = v_25;
-      if ((v_26 >= 2u)) {
-        break;
-      }
-      a[v_26] = asfloat(ub[((start_byte_offset + (v_26 * 16u)) / 16u)].xyz);
-      {
-        v_25 = (v_26 + 1u);
-      }
-      continue;
-    }
-  }
-  float3 v_27[2] = a;
-  return v_27;
+vector<float16_t, 4> tint_bitcast_to_f16_1(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
+  float16_t v_24 = float16_t(t_low.x);
+  float16_t v_25 = float16_t(t_high.x);
+  float16_t v_26 = float16_t(t_low.y);
+  return vector<float16_t, 4>(v_24, v_25, v_26, float16_t(t_high.y));
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16_1(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
-  float16_t v_28 = float16_t(t_low.x);
-  float16_t v_29 = float16_t(t_high.x);
-  float16_t v_30 = float16_t(t_low.y);
-  return vector<float16_t, 4>(v_28, v_29, v_30, float16_t(t_high.y));
-}
-
-matrix<float16_t, 4, 4> v_31(uint start_byte_offset) {
-  vector<float16_t, 4> v_32 = tint_bitcast_to_f16_1(ub[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_33 = tint_bitcast_to_f16_1(ub[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_34 = tint_bitcast_to_f16_1(ub[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_32, v_33, v_34, tint_bitcast_to_f16_1(ub[((24u + start_byte_offset) / 16u)]));
+matrix<float16_t, 4, 4> v_27(uint start_byte_offset) {
+  uint4 v_28 = ub[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_29 = tint_bitcast_to_f16_1((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_28.zw) : (v_28.xy)));
+  uint4 v_30 = ub[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_31 = tint_bitcast_to_f16_1(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_30.zw) : (v_30.xy)));
+  uint4 v_32 = ub[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_33 = tint_bitcast_to_f16_1(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_32.zw) : (v_32.xy)));
+  uint4 v_34 = ub[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_29, v_31, v_33, tint_bitcast_to_f16_1(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_34.zw) : (v_34.xy))));
 }
 
 matrix<float16_t, 4, 3> v_35(uint start_byte_offset) {
-  vector<float16_t, 3> v_36 = tint_bitcast_to_f16_1(ub[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_37 = tint_bitcast_to_f16_1(ub[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_38 = tint_bitcast_to_f16_1(ub[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_36, v_37, v_38, tint_bitcast_to_f16_1(ub[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_36 = ub[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_37 = tint_bitcast_to_f16_1((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_36.zw) : (v_36.xy))).xyz;
+  uint4 v_38 = ub[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_39 = tint_bitcast_to_f16_1(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_38.zw) : (v_38.xy))).xyz;
+  uint4 v_40 = ub[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_41 = tint_bitcast_to_f16_1(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_40.zw) : (v_40.xy))).xyz;
+  uint4 v_42 = ub[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_37, v_39, v_41, tint_bitcast_to_f16_1(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_42.zw) : (v_42.xy))).xyz);
 }
 
-matrix<float16_t, 3, 4> v_39(uint start_byte_offset) {
-  vector<float16_t, 4> v_40 = tint_bitcast_to_f16_1(ub[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_41 = tint_bitcast_to_f16_1(ub[((8u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 3, 4>(v_40, v_41, tint_bitcast_to_f16_1(ub[((16u + start_byte_offset) / 16u)]));
+matrix<float16_t, 3, 4> v_43(uint start_byte_offset) {
+  uint4 v_44 = ub[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_45 = tint_bitcast_to_f16_1((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_44.zw) : (v_44.xy)));
+  uint4 v_46 = ub[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_47 = tint_bitcast_to_f16_1(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_46.zw) : (v_46.xy)));
+  uint4 v_48 = ub[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 4>(v_45, v_47, tint_bitcast_to_f16_1(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_48.zw) : (v_48.xy))));
 }
 
-matrix<float16_t, 3, 3> v_42(uint start_byte_offset) {
-  vector<float16_t, 3> v_43 = tint_bitcast_to_f16_1(ub[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_44 = tint_bitcast_to_f16_1(ub[((8u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 3, 3>(v_43, v_44, tint_bitcast_to_f16_1(ub[((16u + start_byte_offset) / 16u)]).xyz);
+matrix<float16_t, 3, 3> v_49(uint start_byte_offset) {
+  uint4 v_50 = ub[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_51 = tint_bitcast_to_f16_1((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_50.zw) : (v_50.xy))).xyz;
+  uint4 v_52 = ub[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_53 = tint_bitcast_to_f16_1(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_52.zw) : (v_52.xy))).xyz;
+  uint4 v_54 = ub[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 3>(v_51, v_53, tint_bitcast_to_f16_1(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_54.zw) : (v_54.xy))).xyz);
 }
 
-matrix<float16_t, 3, 2> v_45(uint start_byte_offset) {
-  uint4 v_46 = ub[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_47 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_46.z) : (v_46.x)));
-  uint4 v_48 = ub[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_49 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_48.z) : (v_48.x)));
-  uint4 v_50 = ub[((8u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 3, 2>(v_47, v_49, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_50.z) : (v_50.x))));
+matrix<float16_t, 3, 2> v_55(uint start_byte_offset) {
+  vector<float16_t, 2> v_56 = tint_bitcast_to_f16(ub[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_57 = tint_bitcast_to_f16(ub[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 3, 2>(v_56, v_57, tint_bitcast_to_f16(ub[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]));
 }
 
-matrix<float16_t, 2, 4> v_51(uint start_byte_offset) {
-  vector<float16_t, 4> v_52 = tint_bitcast_to_f16_1(ub[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_52, tint_bitcast_to_f16_1(ub[((8u + start_byte_offset) / 16u)]));
+matrix<float16_t, 2, 4> v_58(uint start_byte_offset) {
+  uint4 v_59 = ub[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_60 = tint_bitcast_to_f16_1((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_59.zw) : (v_59.xy)));
+  uint4 v_61 = ub[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_60, tint_bitcast_to_f16_1(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_61.zw) : (v_61.xy))));
 }
 
-matrix<float16_t, 2, 3> v_53(uint start_byte_offset) {
-  vector<float16_t, 3> v_54 = tint_bitcast_to_f16_1(ub[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_54, tint_bitcast_to_f16_1(ub[((8u + start_byte_offset) / 16u)]).xyz);
+matrix<float16_t, 2, 3> v_62(uint start_byte_offset) {
+  uint4 v_63 = ub[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_64 = tint_bitcast_to_f16_1((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_63.zw) : (v_63.xy))).xyz;
+  uint4 v_65 = ub[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_64, tint_bitcast_to_f16_1(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_65.zw) : (v_65.xy))).xyz);
 }
 
-matrix<float16_t, 2, 2> v_55(uint start_byte_offset) {
-  uint4 v_56 = ub[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_57 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_56.z) : (v_56.x)));
-  uint4 v_58 = ub[((4u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 2, 2>(v_57, tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_58.z) : (v_58.x))));
+matrix<float16_t, 2, 2> v_66(uint start_byte_offset) {
+  vector<float16_t, 2> v_67 = tint_bitcast_to_f16(ub[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  return matrix<float16_t, 2, 2>(v_67, tint_bitcast_to_f16(ub[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]));
 }
 
-float4x4 v_59(uint start_byte_offset) {
-  float4 v_60 = asfloat(ub[(start_byte_offset / 16u)]);
-  float4 v_61 = asfloat(ub[((16u + start_byte_offset) / 16u)]);
-  float4 v_62 = asfloat(ub[((32u + start_byte_offset) / 16u)]);
-  return float4x4(v_60, v_61, v_62, asfloat(ub[((48u + start_byte_offset) / 16u)]));
+float4x4 v_68(uint start_byte_offset) {
+  float4 v_69 = asfloat(ub[(start_byte_offset / 16u)]);
+  float4 v_70 = asfloat(ub[((16u + start_byte_offset) / 16u)]);
+  float4 v_71 = asfloat(ub[((32u + start_byte_offset) / 16u)]);
+  return float4x4(v_69, v_70, v_71, asfloat(ub[((48u + start_byte_offset) / 16u)]));
 }
 
-float4x3 v_63(uint start_byte_offset) {
-  float3 v_64 = asfloat(ub[(start_byte_offset / 16u)].xyz);
-  float3 v_65 = asfloat(ub[((16u + start_byte_offset) / 16u)].xyz);
-  float3 v_66 = asfloat(ub[((32u + start_byte_offset) / 16u)].xyz);
-  return float4x3(v_64, v_65, v_66, asfloat(ub[((48u + start_byte_offset) / 16u)].xyz));
+float4x3 v_72(uint start_byte_offset) {
+  float3 v_73 = asfloat(ub[(start_byte_offset / 16u)].xyz);
+  float3 v_74 = asfloat(ub[((16u + start_byte_offset) / 16u)].xyz);
+  float3 v_75 = asfloat(ub[((32u + start_byte_offset) / 16u)].xyz);
+  return float4x3(v_73, v_74, v_75, asfloat(ub[((48u + start_byte_offset) / 16u)].xyz));
 }
 
-float4x2 v_67(uint start_byte_offset) {
-  uint4 v_68 = ub[(start_byte_offset / 16u)];
-  float2 v_69 = asfloat((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_68.zw) : (v_68.xy)));
-  uint4 v_70 = ub[((8u + start_byte_offset) / 16u)];
-  float2 v_71 = asfloat(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_70.zw) : (v_70.xy)));
-  uint4 v_72 = ub[((16u + start_byte_offset) / 16u)];
-  float2 v_73 = asfloat(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_72.zw) : (v_72.xy)));
-  uint4 v_74 = ub[((24u + start_byte_offset) / 16u)];
-  return float4x2(v_69, v_71, v_73, asfloat(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_74.zw) : (v_74.xy))));
+float4x2 v_76(uint start_byte_offset) {
+  uint4 v_77 = ub[(start_byte_offset / 16u)];
+  float2 v_78 = asfloat((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_77.zw) : (v_77.xy)));
+  uint4 v_79 = ub[((8u + start_byte_offset) / 16u)];
+  float2 v_80 = asfloat(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_79.zw) : (v_79.xy)));
+  uint4 v_81 = ub[((16u + start_byte_offset) / 16u)];
+  float2 v_82 = asfloat(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_81.zw) : (v_81.xy)));
+  uint4 v_83 = ub[((24u + start_byte_offset) / 16u)];
+  return float4x2(v_78, v_80, v_82, asfloat(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_83.zw) : (v_83.xy))));
 }
 
-float3x4 v_75(uint start_byte_offset) {
-  float4 v_76 = asfloat(ub[(start_byte_offset / 16u)]);
-  float4 v_77 = asfloat(ub[((16u + start_byte_offset) / 16u)]);
-  return float3x4(v_76, v_77, asfloat(ub[((32u + start_byte_offset) / 16u)]));
+float3x4 v_84(uint start_byte_offset) {
+  float4 v_85 = asfloat(ub[(start_byte_offset / 16u)]);
+  float4 v_86 = asfloat(ub[((16u + start_byte_offset) / 16u)]);
+  return float3x4(v_85, v_86, asfloat(ub[((32u + start_byte_offset) / 16u)]));
 }
 
-float3x3 v_78(uint start_byte_offset) {
-  float3 v_79 = asfloat(ub[(start_byte_offset / 16u)].xyz);
-  float3 v_80 = asfloat(ub[((16u + start_byte_offset) / 16u)].xyz);
-  return float3x3(v_79, v_80, asfloat(ub[((32u + start_byte_offset) / 16u)].xyz));
+float3x3 v_87(uint start_byte_offset) {
+  float3 v_88 = asfloat(ub[(start_byte_offset / 16u)].xyz);
+  float3 v_89 = asfloat(ub[((16u + start_byte_offset) / 16u)].xyz);
+  return float3x3(v_88, v_89, asfloat(ub[((32u + start_byte_offset) / 16u)].xyz));
 }
 
-float3x2 v_81(uint start_byte_offset) {
-  uint4 v_82 = ub[(start_byte_offset / 16u)];
-  float2 v_83 = asfloat((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_82.zw) : (v_82.xy)));
-  uint4 v_84 = ub[((8u + start_byte_offset) / 16u)];
-  float2 v_85 = asfloat(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_84.zw) : (v_84.xy)));
-  uint4 v_86 = ub[((16u + start_byte_offset) / 16u)];
-  return float3x2(v_83, v_85, asfloat(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_86.zw) : (v_86.xy))));
+float3x2 v_90(uint start_byte_offset) {
+  uint4 v_91 = ub[(start_byte_offset / 16u)];
+  float2 v_92 = asfloat((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_91.zw) : (v_91.xy)));
+  uint4 v_93 = ub[((8u + start_byte_offset) / 16u)];
+  float2 v_94 = asfloat(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_93.zw) : (v_93.xy)));
+  uint4 v_95 = ub[((16u + start_byte_offset) / 16u)];
+  return float3x2(v_92, v_94, asfloat(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_95.zw) : (v_95.xy))));
 }
 
-float2x4 v_87(uint start_byte_offset) {
-  float4 v_88 = asfloat(ub[(start_byte_offset / 16u)]);
-  return float2x4(v_88, asfloat(ub[((16u + start_byte_offset) / 16u)]));
+float2x4 v_96(uint start_byte_offset) {
+  float4 v_97 = asfloat(ub[(start_byte_offset / 16u)]);
+  return float2x4(v_97, asfloat(ub[((16u + start_byte_offset) / 16u)]));
 }
 
-float2x3 v_89(uint start_byte_offset) {
-  float3 v_90 = asfloat(ub[(start_byte_offset / 16u)].xyz);
-  return float2x3(v_90, asfloat(ub[((16u + start_byte_offset) / 16u)].xyz));
+float2x3 v_98(uint start_byte_offset) {
+  float3 v_99 = asfloat(ub[(start_byte_offset / 16u)].xyz);
+  return float2x3(v_99, asfloat(ub[((16u + start_byte_offset) / 16u)].xyz));
 }
 
-float2x2 v_91(uint start_byte_offset) {
-  uint4 v_92 = ub[(start_byte_offset / 16u)];
-  float2 v_93 = asfloat((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_92.zw) : (v_92.xy)));
-  uint4 v_94 = ub[((8u + start_byte_offset) / 16u)];
-  return float2x2(v_93, asfloat(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_94.zw) : (v_94.xy))));
+float2x2 v_100(uint start_byte_offset) {
+  uint4 v_101 = ub[(start_byte_offset / 16u)];
+  float2 v_102 = asfloat((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_101.zw) : (v_101.xy)));
+  uint4 v_103 = ub[((8u + start_byte_offset) / 16u)];
+  return float2x2(v_102, asfloat(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_103.zw) : (v_103.xy))));
 }
 
 [numthreads(1, 1, 1)]
@@ -251,64 +260,64 @@
   float3 vec3_f32 = asfloat(ub[3u].xyz);
   int3 vec3_i32 = asint(ub[4u].xyz);
   uint3 vec3_u32 = ub[5u].xyz;
-  vector<float16_t, 3> vec3_f16 = tint_bitcast_to_f16_1(ub[6u]).xyz;
+  vector<float16_t, 3> vec3_f16 = tint_bitcast_to_f16_1(ub[6u].xy).xyz;
   float4 vec4_f32 = asfloat(ub[7u]);
   int4 vec4_i32 = asint(ub[8u]);
   uint4 vec4_u32 = ub[9u];
-  vector<float16_t, 4> vec4_f16 = tint_bitcast_to_f16_1(ub[10u]);
-  float2x2 mat2x2_f32 = v_91(168u);
-  float2x3 mat2x3_f32 = v_89(192u);
-  float2x4 mat2x4_f32 = v_87(224u);
-  float3x2 mat3x2_f32 = v_81(256u);
-  float3x3 mat3x3_f32 = v_78(288u);
-  float3x4 mat3x4_f32 = v_75(336u);
-  float4x2 mat4x2_f32 = v_67(384u);
-  float4x3 mat4x3_f32 = v_63(416u);
-  float4x4 mat4x4_f32 = v_59(480u);
-  matrix<float16_t, 2, 2> mat2x2_f16 = v_55(544u);
-  matrix<float16_t, 2, 3> mat2x3_f16 = v_53(552u);
-  matrix<float16_t, 2, 4> mat2x4_f16 = v_51(568u);
-  matrix<float16_t, 3, 2> mat3x2_f16 = v_45(584u);
-  matrix<float16_t, 3, 3> mat3x3_f16 = v_42(600u);
-  matrix<float16_t, 3, 4> mat3x4_f16 = v_39(624u);
+  vector<float16_t, 4> vec4_f16 = tint_bitcast_to_f16_1(ub[10u].xy);
+  float2x2 mat2x2_f32 = v_100(168u);
+  float2x3 mat2x3_f32 = v_98(192u);
+  float2x4 mat2x4_f32 = v_96(224u);
+  float3x2 mat3x2_f32 = v_90(256u);
+  float3x3 mat3x3_f32 = v_87(288u);
+  float3x4 mat3x4_f32 = v_84(336u);
+  float4x2 mat4x2_f32 = v_76(384u);
+  float4x3 mat4x3_f32 = v_72(416u);
+  float4x4 mat4x4_f32 = v_68(480u);
+  matrix<float16_t, 2, 2> mat2x2_f16 = v_66(544u);
+  matrix<float16_t, 2, 3> mat2x3_f16 = v_62(552u);
+  matrix<float16_t, 2, 4> mat2x4_f16 = v_58(568u);
+  matrix<float16_t, 3, 2> mat3x2_f16 = v_55(584u);
+  matrix<float16_t, 3, 3> mat3x3_f16 = v_49(600u);
+  matrix<float16_t, 3, 4> mat3x4_f16 = v_43(624u);
   matrix<float16_t, 4, 2> mat4x2_f16 = v_12(648u);
   matrix<float16_t, 4, 3> mat4x3_f16 = v_35(664u);
-  matrix<float16_t, 4, 4> mat4x4_f16 = v_31(696u);
-  float3 arr2_vec3_f32[2] = v_24(736u);
-  matrix<float16_t, 4, 2> arr2_mat4x2_f16[2] = v_20(768u);
+  matrix<float16_t, 4, 4> mat4x4_f16 = v_27(696u);
+  float3 arr2_vec3_f32[2] = v_20(736u);
+  matrix<float16_t, 4, 2> arr2_mat4x2_f16[2] = v_16(768u);
   Inner struct_inner = v_1(800u);
   Inner array_struct_inner[4] = v_6(816u);
-  int v_95 = (tint_f32_to_i32(scalar_f32) + scalar_i32);
-  int v_96 = (v_95 + int(scalar_u32));
-  int v_97 = (v_96 + tint_f16_to_i32(scalar_f16));
-  int v_98 = ((v_97 + tint_f32_to_i32(vec2_f32[0u])) + vec2_i32[0u]);
-  int v_99 = (v_98 + int(vec2_u32[0u]));
-  int v_100 = (v_99 + tint_f16_to_i32(vec2_f16[0u]));
-  int v_101 = ((v_100 + tint_f32_to_i32(vec3_f32[1u])) + vec3_i32[1u]);
-  int v_102 = (v_101 + int(vec3_u32[1u]));
-  int v_103 = (v_102 + tint_f16_to_i32(vec3_f16[1u]));
-  int v_104 = ((v_103 + tint_f32_to_i32(vec4_f32[2u])) + vec4_i32[2u]);
-  int v_105 = (v_104 + int(vec4_u32[2u]));
-  int v_106 = (v_105 + tint_f16_to_i32(vec4_f16[2u]));
-  int v_107 = (v_106 + tint_f32_to_i32(mat2x2_f32[int(0)][0u]));
-  int v_108 = (v_107 + tint_f32_to_i32(mat2x3_f32[int(0)][0u]));
-  int v_109 = (v_108 + tint_f32_to_i32(mat2x4_f32[int(0)][0u]));
-  int v_110 = (v_109 + tint_f32_to_i32(mat3x2_f32[int(0)][0u]));
-  int v_111 = (v_110 + tint_f32_to_i32(mat3x3_f32[int(0)][0u]));
-  int v_112 = (v_111 + tint_f32_to_i32(mat3x4_f32[int(0)][0u]));
-  int v_113 = (v_112 + tint_f32_to_i32(mat4x2_f32[int(0)][0u]));
-  int v_114 = (v_113 + tint_f32_to_i32(mat4x3_f32[int(0)][0u]));
-  int v_115 = (v_114 + tint_f32_to_i32(mat4x4_f32[int(0)][0u]));
-  int v_116 = (v_115 + tint_f16_to_i32(mat2x2_f16[int(0)][0u]));
-  int v_117 = (v_116 + tint_f16_to_i32(mat2x3_f16[int(0)][0u]));
-  int v_118 = (v_117 + tint_f16_to_i32(mat2x4_f16[int(0)][0u]));
-  int v_119 = (v_118 + tint_f16_to_i32(mat3x2_f16[int(0)][0u]));
-  int v_120 = (v_119 + tint_f16_to_i32(mat3x3_f16[int(0)][0u]));
-  int v_121 = (v_120 + tint_f16_to_i32(mat3x4_f16[int(0)][0u]));
-  int v_122 = (v_121 + tint_f16_to_i32(mat4x2_f16[int(0)][0u]));
-  int v_123 = (v_122 + tint_f16_to_i32(mat4x3_f16[int(0)][0u]));
-  int v_124 = (v_123 + tint_f16_to_i32(mat4x4_f16[int(0)][0u]));
-  int v_125 = (v_124 + tint_f32_to_i32(arr2_vec3_f32[int(0)][0u]));
-  s.Store(0u, asuint((((v_125 + tint_f16_to_i32(arr2_mat4x2_f16[int(0)][int(0)][0u])) + struct_inner.scalar_i32) + array_struct_inner[int(0)].scalar_i32)));
+  int v_104 = (tint_f32_to_i32(scalar_f32) + scalar_i32);
+  int v_105 = (v_104 + int(scalar_u32));
+  int v_106 = (v_105 + tint_f16_to_i32(scalar_f16));
+  int v_107 = ((v_106 + tint_f32_to_i32(vec2_f32[0u])) + vec2_i32[0u]);
+  int v_108 = (v_107 + int(vec2_u32[0u]));
+  int v_109 = (v_108 + tint_f16_to_i32(vec2_f16[0u]));
+  int v_110 = ((v_109 + tint_f32_to_i32(vec3_f32[1u])) + vec3_i32[1u]);
+  int v_111 = (v_110 + int(vec3_u32[1u]));
+  int v_112 = (v_111 + tint_f16_to_i32(vec3_f16[1u]));
+  int v_113 = ((v_112 + tint_f32_to_i32(vec4_f32[2u])) + vec4_i32[2u]);
+  int v_114 = (v_113 + int(vec4_u32[2u]));
+  int v_115 = (v_114 + tint_f16_to_i32(vec4_f16[2u]));
+  int v_116 = (v_115 + tint_f32_to_i32(mat2x2_f32[int(0)][0u]));
+  int v_117 = (v_116 + tint_f32_to_i32(mat2x3_f32[int(0)][0u]));
+  int v_118 = (v_117 + tint_f32_to_i32(mat2x4_f32[int(0)][0u]));
+  int v_119 = (v_118 + tint_f32_to_i32(mat3x2_f32[int(0)][0u]));
+  int v_120 = (v_119 + tint_f32_to_i32(mat3x3_f32[int(0)][0u]));
+  int v_121 = (v_120 + tint_f32_to_i32(mat3x4_f32[int(0)][0u]));
+  int v_122 = (v_121 + tint_f32_to_i32(mat4x2_f32[int(0)][0u]));
+  int v_123 = (v_122 + tint_f32_to_i32(mat4x3_f32[int(0)][0u]));
+  int v_124 = (v_123 + tint_f32_to_i32(mat4x4_f32[int(0)][0u]));
+  int v_125 = (v_124 + tint_f16_to_i32(mat2x2_f16[int(0)][0u]));
+  int v_126 = (v_125 + tint_f16_to_i32(mat2x3_f16[int(0)][0u]));
+  int v_127 = (v_126 + tint_f16_to_i32(mat2x4_f16[int(0)][0u]));
+  int v_128 = (v_127 + tint_f16_to_i32(mat3x2_f16[int(0)][0u]));
+  int v_129 = (v_128 + tint_f16_to_i32(mat3x3_f16[int(0)][0u]));
+  int v_130 = (v_129 + tint_f16_to_i32(mat3x4_f16[int(0)][0u]));
+  int v_131 = (v_130 + tint_f16_to_i32(mat4x2_f16[int(0)][0u]));
+  int v_132 = (v_131 + tint_f16_to_i32(mat4x3_f16[int(0)][0u]));
+  int v_133 = (v_132 + tint_f16_to_i32(mat4x4_f16[int(0)][0u]));
+  int v_134 = (v_133 + tint_f32_to_i32(arr2_vec3_f32[int(0)][0u]));
+  s.Store(0u, asuint((((v_134 + tint_f16_to_i32(arr2_mat4x2_f16[int(0)][int(0)][0u])) + struct_inner.scalar_i32) + array_struct_inner[int(0)].scalar_i32)));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index c1f2bf0..c6df656 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -9,12 +9,12 @@
   return counter;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -22,40 +22,43 @@
 }
 
 matrix<float16_t, 2, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_5, tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = a[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz);
 }
 
 typedef matrix<float16_t, 2, 3> ary_ret[4];
-ary_ret v_6(uint start_byte_offset) {
+ary_ret v_8(uint start_byte_offset) {
   matrix<float16_t, 2, 3> a_1[4] = (matrix<float16_t, 2, 3>[4])0;
   {
-    uint v_7 = 0u;
-    v_7 = 0u;
+    uint v_9 = 0u;
+    v_9 = 0u;
     while(true) {
-      uint v_8 = v_7;
-      if ((v_8 >= 4u)) {
+      uint v_10 = v_9;
+      if ((v_10 >= 4u)) {
         break;
       }
-      a_1[v_8] = v_4((start_byte_offset + (v_8 * 16u)));
+      a_1[v_10] = v_4((start_byte_offset + (v_10 * 16u)));
       {
-        v_7 = (v_8 + 1u);
+        v_9 = (v_10 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 2, 3> v_9[4] = a_1;
-  return v_9;
+  matrix<float16_t, 2, 3> v_11[4] = a_1;
+  return v_11;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  uint v_10 = (16u * uint(i()));
-  uint v_11 = (8u * uint(i()));
-  matrix<float16_t, 2, 3> l_a[4] = v_6(0u);
-  matrix<float16_t, 2, 3> l_a_i = v_4(v_10);
-  vector<float16_t, 3> l_a_i_i = tint_bitcast_to_f16(a[((v_10 + v_11) / 16u)]).xyz;
-  uint v_12 = a[((v_10 + v_11) / 16u)][(((v_10 + v_11) % 16u) / 4u)];
-  s.Store<float16_t>(0u, (((float16_t(f16tof32((v_12 >> (((((v_10 + v_11) % 4u) == 0u)) ? (0u) : (16u))))) + l_a[int(0)][int(0)][0u]) + l_a_i[int(0)][0u]) + l_a_i_i[0u]));
+  uint v_12 = (16u * uint(i()));
+  uint v_13 = (8u * uint(i()));
+  matrix<float16_t, 2, 3> l_a[4] = v_8(0u);
+  matrix<float16_t, 2, 3> l_a_i = v_4(v_12);
+  uint4 v_14 = a[((v_12 + v_13) / 16u)];
+  vector<float16_t, 3> l_a_i_i = tint_bitcast_to_f16(((((((v_12 + v_13) % 16u) / 4u) == 2u)) ? (v_14.zw) : (v_14.xy))).xyz;
+  uint v_15 = a[((v_12 + v_13) / 16u)][(((v_12 + v_13) % 16u) / 4u)];
+  s.Store<float16_t>(0u, (((float16_t(f16tof32((v_15 >> (((((v_12 + v_13) % 4u) == 0u)) ? (0u) : (16u))))) + l_a[int(0)][int(0)][0u]) + l_a_i[int(0)][0u]) + l_a_i_i[0u]));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat2x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 96545a1..49b65ce 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat2x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 a[4];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -16,37 +16,39 @@
 }
 
 matrix<float16_t, 2, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_5, tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = a[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz);
 }
 
 typedef matrix<float16_t, 2, 3> ary_ret[4];
-ary_ret v_6(uint start_byte_offset) {
+ary_ret v_8(uint start_byte_offset) {
   matrix<float16_t, 2, 3> a_1[4] = (matrix<float16_t, 2, 3>[4])0;
   {
-    uint v_7 = 0u;
-    v_7 = 0u;
+    uint v_9 = 0u;
+    v_9 = 0u;
     while(true) {
-      uint v_8 = v_7;
-      if ((v_8 >= 4u)) {
+      uint v_10 = v_9;
+      if ((v_10 >= 4u)) {
         break;
       }
-      a_1[v_8] = v_4((start_byte_offset + (v_8 * 16u)));
+      a_1[v_10] = v_4((start_byte_offset + (v_10 * 16u)));
       {
-        v_7 = (v_8 + 1u);
+        v_9 = (v_10 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 2, 3> v_9[4] = a_1;
-  return v_9;
+  matrix<float16_t, 2, 3> v_11[4] = a_1;
+  return v_11;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  matrix<float16_t, 2, 3> l_a[4] = v_6(0u);
+  matrix<float16_t, 2, 3> l_a[4] = v_8(0u);
   matrix<float16_t, 2, 3> l_a_i = v_4(32u);
-  vector<float16_t, 3> l_a_i_i = tint_bitcast_to_f16(a[2u]).xyz;
+  vector<float16_t, 3> l_a_i_i = tint_bitcast_to_f16(a[2u].zw).xyz;
   s.Store<float16_t>(0u, (((float16_t(f16tof32(a[2u].z)) + l_a[int(0)][int(0)][0u]) + l_a_i[int(0)][0u]) + l_a_i_i[0u]));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
index 5617edf..2c32583 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 u[4];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -16,16 +16,18 @@
 }
 
 matrix<float16_t, 2, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 3, 2> t = transpose(v_4(32u));
-  float16_t l = length(tint_bitcast_to_f16(u[0u]).xyz.zxy);
-  float16_t a = abs(tint_bitcast_to_f16(u[0u]).xyz.zxy[0u]);
-  float16_t v_6 = float16_t(a);
-  s.Store<float16_t>(0u, ((v_6 + float16_t(l)) + t[int(0)][0u]));
+  float16_t l = length(tint_bitcast_to_f16(u[0u].zw).xyz.zxy);
+  float16_t a = abs(tint_bitcast_to_f16(u[0u].zw).xyz.zxy[0u]);
+  float16_t v_8 = float16_t(a);
+  s.Store<float16_t>(0u, ((v_8 + float16_t(l)) + t[int(0)][0u]));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
index d854d7a..ba03a5b 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
@@ -19,12 +19,12 @@
   return f_1;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -32,38 +32,40 @@
 }
 
 matrix<float16_t, 2, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz);
 }
 
 typedef matrix<float16_t, 2, 3> ary_ret[4];
-ary_ret v_6(uint start_byte_offset) {
+ary_ret v_8(uint start_byte_offset) {
   matrix<float16_t, 2, 3> a_2[4] = (matrix<float16_t, 2, 3>[4])0;
   {
-    uint v_7 = 0u;
-    v_7 = 0u;
+    uint v_9 = 0u;
+    v_9 = 0u;
     while(true) {
-      uint v_8 = v_7;
-      if ((v_8 >= 4u)) {
+      uint v_10 = v_9;
+      if ((v_10 >= 4u)) {
         break;
       }
-      a_2[v_8] = v_4((start_byte_offset + (v_8 * 16u)));
+      a_2[v_10] = v_4((start_byte_offset + (v_10 * 16u)));
       {
-        v_7 = (v_8 + 1u);
+        v_9 = (v_10 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 2, 3> v_9[4] = a_2;
-  return v_9;
+  matrix<float16_t, 2, 3> v_11[4] = a_2;
+  return v_11;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  matrix<float16_t, 2, 3> v_10[4] = v_6(0u);
-  float16_t v_11 = a(v_10);
-  float16_t v_12 = (v_11 + b(v_4(16u)));
-  float16_t v_13 = (v_12 + c(tint_bitcast_to_f16(u[1u]).xyz.zxy));
-  s.Store<float16_t>(0u, (v_13 + d(tint_bitcast_to_f16(u[1u]).xyz.zxy[0u])));
+  matrix<float16_t, 2, 3> v_12[4] = v_8(0u);
+  float16_t v_13 = a(v_12);
+  float16_t v_14 = (v_13 + b(v_4(16u)));
+  float16_t v_15 = (v_14 + c(tint_bitcast_to_f16(u[1u].xy).xyz.zxy));
+  s.Store<float16_t>(0u, (v_15 + d(tint_bitcast_to_f16(u[1u].xy).xyz.zxy[0u])));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_private.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
index 6888d07..4de6025 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
@@ -4,12 +4,12 @@
 };
 RWByteAddressBuffer s : register(u1);
 static matrix<float16_t, 2, 3> p[4] = (matrix<float16_t, 2, 3>[4])0;
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -17,38 +17,40 @@
 }
 
 matrix<float16_t, 2, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz);
 }
 
 typedef matrix<float16_t, 2, 3> ary_ret[4];
-ary_ret v_6(uint start_byte_offset) {
+ary_ret v_8(uint start_byte_offset) {
   matrix<float16_t, 2, 3> a[4] = (matrix<float16_t, 2, 3>[4])0;
   {
-    uint v_7 = 0u;
-    v_7 = 0u;
+    uint v_9 = 0u;
+    v_9 = 0u;
     while(true) {
-      uint v_8 = v_7;
-      if ((v_8 >= 4u)) {
+      uint v_10 = v_9;
+      if ((v_10 >= 4u)) {
         break;
       }
-      a[v_8] = v_4((start_byte_offset + (v_8 * 16u)));
+      a[v_10] = v_4((start_byte_offset + (v_10 * 16u)));
       {
-        v_7 = (v_8 + 1u);
+        v_9 = (v_10 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 2, 3> v_9[4] = a;
-  return v_9;
+  matrix<float16_t, 2, 3> v_11[4] = a;
+  return v_11;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  matrix<float16_t, 2, 3> v_10[4] = v_6(0u);
-  p = v_10;
+  matrix<float16_t, 2, 3> v_12[4] = v_8(0u);
+  p = v_12;
   p[int(1)] = v_4(32u);
-  p[int(1)][int(0)] = tint_bitcast_to_f16(u[0u]).xyz.zxy;
+  p[int(1)][int(0)] = tint_bitcast_to_f16(u[0u].zw).xyz.zxy;
   p[int(1)][int(0)][0u] = float16_t(f16tof32(u[0u].z));
   s.Store<float16_t>(0u, p[int(1)][int(0)].x);
 }
diff --git a/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
index 0f1465f..cd9cede 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 u[4];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -21,22 +21,24 @@
 }
 
 matrix<float16_t, 2, 3> v_5(uint start_byte_offset) {
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_6, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_6 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.zw) : (v_6.xy))).xyz;
+  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_7, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy))).xyz);
 }
 
-void v_7(uint offset, matrix<float16_t, 2, 3> obj[4]) {
+void v_9(uint offset, matrix<float16_t, 2, 3> obj[4]) {
   {
-    uint v_8 = 0u;
-    v_8 = 0u;
+    uint v_10 = 0u;
+    v_10 = 0u;
     while(true) {
-      uint v_9 = v_8;
-      if ((v_9 >= 4u)) {
+      uint v_11 = v_10;
+      if ((v_11 >= 4u)) {
         break;
       }
-      v_4((offset + (v_9 * 16u)), obj[v_9]);
+      v_4((offset + (v_11 * 16u)), obj[v_11]);
       {
-        v_8 = (v_9 + 1u);
+        v_10 = (v_11 + 1u);
       }
       continue;
     }
@@ -44,33 +46,33 @@
 }
 
 typedef matrix<float16_t, 2, 3> ary_ret[4];
-ary_ret v_10(uint start_byte_offset) {
+ary_ret v_12(uint start_byte_offset) {
   matrix<float16_t, 2, 3> a[4] = (matrix<float16_t, 2, 3>[4])0;
   {
-    uint v_11 = 0u;
-    v_11 = 0u;
+    uint v_13 = 0u;
+    v_13 = 0u;
     while(true) {
-      uint v_12 = v_11;
-      if ((v_12 >= 4u)) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
         break;
       }
-      a[v_12] = v_5((start_byte_offset + (v_12 * 16u)));
+      a[v_14] = v_5((start_byte_offset + (v_14 * 16u)));
       {
-        v_11 = (v_12 + 1u);
+        v_13 = (v_14 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 2, 3> v_13[4] = a;
-  return v_13;
+  matrix<float16_t, 2, 3> v_15[4] = a;
+  return v_15;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  matrix<float16_t, 2, 3> v_14[4] = v_10(0u);
-  v_7(0u, v_14);
+  matrix<float16_t, 2, 3> v_16[4] = v_12(0u);
+  v_9(0u, v_16);
   v_4(16u, v_5(32u));
-  s.Store<vector<float16_t, 3> >(16u, tint_bitcast_to_f16(u[0u]).xyz.zxy);
+  s.Store<vector<float16_t, 3> >(16u, tint_bitcast_to_f16(u[0u].zw).xyz.zxy);
   s.Store<float16_t>(16u, float16_t(f16tof32(u[0u].z)));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
index ad77241..18f8ea6 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
@@ -8,12 +8,12 @@
 };
 RWByteAddressBuffer s : register(u1);
 groupshared matrix<float16_t, 2, 3> w[4];
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -21,53 +21,55 @@
 }
 
 matrix<float16_t, 2, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz);
 }
 
 typedef matrix<float16_t, 2, 3> ary_ret[4];
-ary_ret v_6(uint start_byte_offset) {
+ary_ret v_8(uint start_byte_offset) {
   matrix<float16_t, 2, 3> a[4] = (matrix<float16_t, 2, 3>[4])0;
   {
-    uint v_7 = 0u;
-    v_7 = 0u;
+    uint v_9 = 0u;
+    v_9 = 0u;
     while(true) {
-      uint v_8 = v_7;
-      if ((v_8 >= 4u)) {
+      uint v_10 = v_9;
+      if ((v_10 >= 4u)) {
         break;
       }
-      a[v_8] = v_4((start_byte_offset + (v_8 * 16u)));
+      a[v_10] = v_4((start_byte_offset + (v_10 * 16u)));
       {
-        v_7 = (v_8 + 1u);
+        v_9 = (v_10 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 2, 3> v_9[4] = a;
-  return v_9;
+  matrix<float16_t, 2, 3> v_11[4] = a;
+  return v_11;
 }
 
 void f_inner(uint tint_local_index) {
   {
-    uint v_10 = 0u;
-    v_10 = tint_local_index;
+    uint v_12 = 0u;
+    v_12 = tint_local_index;
     while(true) {
-      uint v_11 = v_10;
-      if ((v_11 >= 4u)) {
+      uint v_13 = v_12;
+      if ((v_13 >= 4u)) {
         break;
       }
-      w[v_11] = matrix<float16_t, 2, 3>((float16_t(0.0h)).xxx, (float16_t(0.0h)).xxx);
+      w[v_13] = matrix<float16_t, 2, 3>((float16_t(0.0h)).xxx, (float16_t(0.0h)).xxx);
       {
-        v_10 = (v_11 + 1u);
+        v_12 = (v_13 + 1u);
       }
       continue;
     }
   }
   GroupMemoryBarrierWithGroupSync();
-  matrix<float16_t, 2, 3> v_12[4] = v_6(0u);
-  w = v_12;
+  matrix<float16_t, 2, 3> v_14[4] = v_8(0u);
+  w = v_14;
   w[int(1)] = v_4(32u);
-  w[int(1)][int(0)] = tint_bitcast_to_f16(u[0u]).xyz.zxy;
+  w[int(1)][int(0)] = tint_bitcast_to_f16(u[0u].zw).xyz.zxy;
   w[int(1)][int(0)][0u] = float16_t(f16tof32(u[0u].z));
   s.Store<float16_t>(0u, w[int(1)][int(0)].x);
 }
diff --git a/test/tint/buffer/uniform/std140/array/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index c129194..e1c99b5 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -9,12 +9,12 @@
   return counter;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -22,40 +22,43 @@
 }
 
 matrix<float16_t, 2, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_5, tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)]));
+  uint4 v_5 = a[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))));
 }
 
 typedef matrix<float16_t, 2, 4> ary_ret[4];
-ary_ret v_6(uint start_byte_offset) {
+ary_ret v_8(uint start_byte_offset) {
   matrix<float16_t, 2, 4> a_1[4] = (matrix<float16_t, 2, 4>[4])0;
   {
-    uint v_7 = 0u;
-    v_7 = 0u;
+    uint v_9 = 0u;
+    v_9 = 0u;
     while(true) {
-      uint v_8 = v_7;
-      if ((v_8 >= 4u)) {
+      uint v_10 = v_9;
+      if ((v_10 >= 4u)) {
         break;
       }
-      a_1[v_8] = v_4((start_byte_offset + (v_8 * 16u)));
+      a_1[v_10] = v_4((start_byte_offset + (v_10 * 16u)));
       {
-        v_7 = (v_8 + 1u);
+        v_9 = (v_10 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 2, 4> v_9[4] = a_1;
-  return v_9;
+  matrix<float16_t, 2, 4> v_11[4] = a_1;
+  return v_11;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  uint v_10 = (16u * uint(i()));
-  uint v_11 = (8u * uint(i()));
-  matrix<float16_t, 2, 4> l_a[4] = v_6(0u);
-  matrix<float16_t, 2, 4> l_a_i = v_4(v_10);
-  vector<float16_t, 4> l_a_i_i = tint_bitcast_to_f16(a[((v_10 + v_11) / 16u)]);
-  uint v_12 = a[((v_10 + v_11) / 16u)][(((v_10 + v_11) % 16u) / 4u)];
-  s.Store<float16_t>(0u, (((float16_t(f16tof32((v_12 >> (((((v_10 + v_11) % 4u) == 0u)) ? (0u) : (16u))))) + l_a[int(0)][int(0)][0u]) + l_a_i[int(0)][0u]) + l_a_i_i[0u]));
+  uint v_12 = (16u * uint(i()));
+  uint v_13 = (8u * uint(i()));
+  matrix<float16_t, 2, 4> l_a[4] = v_8(0u);
+  matrix<float16_t, 2, 4> l_a_i = v_4(v_12);
+  uint4 v_14 = a[((v_12 + v_13) / 16u)];
+  vector<float16_t, 4> l_a_i_i = tint_bitcast_to_f16(((((((v_12 + v_13) % 16u) / 4u) == 2u)) ? (v_14.zw) : (v_14.xy)));
+  uint v_15 = a[((v_12 + v_13) / 16u)][(((v_12 + v_13) % 16u) / 4u)];
+  s.Store<float16_t>(0u, (((float16_t(f16tof32((v_15 >> (((((v_12 + v_13) % 4u) == 0u)) ? (0u) : (16u))))) + l_a[int(0)][int(0)][0u]) + l_a_i[int(0)][0u]) + l_a_i_i[0u]));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat2x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 09521f3..b2cc45d 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat2x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 a[4];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -16,37 +16,39 @@
 }
 
 matrix<float16_t, 2, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_5, tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)]));
+  uint4 v_5 = a[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))));
 }
 
 typedef matrix<float16_t, 2, 4> ary_ret[4];
-ary_ret v_6(uint start_byte_offset) {
+ary_ret v_8(uint start_byte_offset) {
   matrix<float16_t, 2, 4> a_1[4] = (matrix<float16_t, 2, 4>[4])0;
   {
-    uint v_7 = 0u;
-    v_7 = 0u;
+    uint v_9 = 0u;
+    v_9 = 0u;
     while(true) {
-      uint v_8 = v_7;
-      if ((v_8 >= 4u)) {
+      uint v_10 = v_9;
+      if ((v_10 >= 4u)) {
         break;
       }
-      a_1[v_8] = v_4((start_byte_offset + (v_8 * 16u)));
+      a_1[v_10] = v_4((start_byte_offset + (v_10 * 16u)));
       {
-        v_7 = (v_8 + 1u);
+        v_9 = (v_10 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 2, 4> v_9[4] = a_1;
-  return v_9;
+  matrix<float16_t, 2, 4> v_11[4] = a_1;
+  return v_11;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  matrix<float16_t, 2, 4> l_a[4] = v_6(0u);
+  matrix<float16_t, 2, 4> l_a[4] = v_8(0u);
   matrix<float16_t, 2, 4> l_a_i = v_4(32u);
-  vector<float16_t, 4> l_a_i_i = tint_bitcast_to_f16(a[2u]);
+  vector<float16_t, 4> l_a_i_i = tint_bitcast_to_f16(a[2u].zw);
   s.Store<float16_t>(0u, (((float16_t(f16tof32(a[2u].z)) + l_a[int(0)][int(0)][0u]) + l_a_i[int(0)][0u]) + l_a_i_i[0u]));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
index 5693914..acd0104 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 u[4];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -16,16 +16,18 @@
 }
 
 matrix<float16_t, 2, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 4, 2> t = transpose(v_4(32u));
-  float16_t l = length(tint_bitcast_to_f16(u[0u]).ywxz);
-  float16_t a = abs(tint_bitcast_to_f16(u[0u]).ywxz[0u]);
-  float16_t v_6 = (t[int(0)][0u] + float16_t(l));
-  s.Store<float16_t>(0u, (v_6 + float16_t(a)));
+  float16_t l = length(tint_bitcast_to_f16(u[0u].zw).ywxz);
+  float16_t a = abs(tint_bitcast_to_f16(u[0u].zw).ywxz[0u]);
+  float16_t v_8 = (t[int(0)][0u] + float16_t(l));
+  s.Store<float16_t>(0u, (v_8 + float16_t(a)));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
index ad6a896..814f568 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
@@ -19,12 +19,12 @@
   return f_1;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -32,38 +32,40 @@
 }
 
 matrix<float16_t, 2, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))));
 }
 
 typedef matrix<float16_t, 2, 4> ary_ret[4];
-ary_ret v_6(uint start_byte_offset) {
+ary_ret v_8(uint start_byte_offset) {
   matrix<float16_t, 2, 4> a_2[4] = (matrix<float16_t, 2, 4>[4])0;
   {
-    uint v_7 = 0u;
-    v_7 = 0u;
+    uint v_9 = 0u;
+    v_9 = 0u;
     while(true) {
-      uint v_8 = v_7;
-      if ((v_8 >= 4u)) {
+      uint v_10 = v_9;
+      if ((v_10 >= 4u)) {
         break;
       }
-      a_2[v_8] = v_4((start_byte_offset + (v_8 * 16u)));
+      a_2[v_10] = v_4((start_byte_offset + (v_10 * 16u)));
       {
-        v_7 = (v_8 + 1u);
+        v_9 = (v_10 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 2, 4> v_9[4] = a_2;
-  return v_9;
+  matrix<float16_t, 2, 4> v_11[4] = a_2;
+  return v_11;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  matrix<float16_t, 2, 4> v_10[4] = v_6(0u);
-  float16_t v_11 = a(v_10);
-  float16_t v_12 = (v_11 + b(v_4(16u)));
-  float16_t v_13 = (v_12 + c(tint_bitcast_to_f16(u[1u]).ywxz));
-  s.Store<float16_t>(0u, (v_13 + d(tint_bitcast_to_f16(u[1u]).ywxz[0u])));
+  matrix<float16_t, 2, 4> v_12[4] = v_8(0u);
+  float16_t v_13 = a(v_12);
+  float16_t v_14 = (v_13 + b(v_4(16u)));
+  float16_t v_15 = (v_14 + c(tint_bitcast_to_f16(u[1u].xy).ywxz));
+  s.Store<float16_t>(0u, (v_15 + d(tint_bitcast_to_f16(u[1u].xy).ywxz[0u])));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_private.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
index c03b8f7..b8087f2 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
@@ -4,12 +4,12 @@
 };
 RWByteAddressBuffer s : register(u1);
 static matrix<float16_t, 2, 4> p[4] = (matrix<float16_t, 2, 4>[4])0;
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -17,38 +17,40 @@
 }
 
 matrix<float16_t, 2, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))));
 }
 
 typedef matrix<float16_t, 2, 4> ary_ret[4];
-ary_ret v_6(uint start_byte_offset) {
+ary_ret v_8(uint start_byte_offset) {
   matrix<float16_t, 2, 4> a[4] = (matrix<float16_t, 2, 4>[4])0;
   {
-    uint v_7 = 0u;
-    v_7 = 0u;
+    uint v_9 = 0u;
+    v_9 = 0u;
     while(true) {
-      uint v_8 = v_7;
-      if ((v_8 >= 4u)) {
+      uint v_10 = v_9;
+      if ((v_10 >= 4u)) {
         break;
       }
-      a[v_8] = v_4((start_byte_offset + (v_8 * 16u)));
+      a[v_10] = v_4((start_byte_offset + (v_10 * 16u)));
       {
-        v_7 = (v_8 + 1u);
+        v_9 = (v_10 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 2, 4> v_9[4] = a;
-  return v_9;
+  matrix<float16_t, 2, 4> v_11[4] = a;
+  return v_11;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  matrix<float16_t, 2, 4> v_10[4] = v_6(0u);
-  p = v_10;
+  matrix<float16_t, 2, 4> v_12[4] = v_8(0u);
+  p = v_12;
   p[int(1)] = v_4(32u);
-  p[int(1)][int(0)] = tint_bitcast_to_f16(u[0u]).ywxz;
+  p[int(1)][int(0)] = tint_bitcast_to_f16(u[0u].zw).ywxz;
   p[int(1)][int(0)][0u] = float16_t(f16tof32(u[0u].z));
   s.Store<float16_t>(0u, p[int(1)][int(0)].x);
 }
diff --git a/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
index 746095c..040b624 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 u[4];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -21,22 +21,24 @@
 }
 
 matrix<float16_t, 2, 4> v_5(uint start_byte_offset) {
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_6, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]));
+  uint4 v_6 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.zw) : (v_6.xy)));
+  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_7, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy))));
 }
 
-void v_7(uint offset, matrix<float16_t, 2, 4> obj[4]) {
+void v_9(uint offset, matrix<float16_t, 2, 4> obj[4]) {
   {
-    uint v_8 = 0u;
-    v_8 = 0u;
+    uint v_10 = 0u;
+    v_10 = 0u;
     while(true) {
-      uint v_9 = v_8;
-      if ((v_9 >= 4u)) {
+      uint v_11 = v_10;
+      if ((v_11 >= 4u)) {
         break;
       }
-      v_4((offset + (v_9 * 16u)), obj[v_9]);
+      v_4((offset + (v_11 * 16u)), obj[v_11]);
       {
-        v_8 = (v_9 + 1u);
+        v_10 = (v_11 + 1u);
       }
       continue;
     }
@@ -44,33 +46,33 @@
 }
 
 typedef matrix<float16_t, 2, 4> ary_ret[4];
-ary_ret v_10(uint start_byte_offset) {
+ary_ret v_12(uint start_byte_offset) {
   matrix<float16_t, 2, 4> a[4] = (matrix<float16_t, 2, 4>[4])0;
   {
-    uint v_11 = 0u;
-    v_11 = 0u;
+    uint v_13 = 0u;
+    v_13 = 0u;
     while(true) {
-      uint v_12 = v_11;
-      if ((v_12 >= 4u)) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
         break;
       }
-      a[v_12] = v_5((start_byte_offset + (v_12 * 16u)));
+      a[v_14] = v_5((start_byte_offset + (v_14 * 16u)));
       {
-        v_11 = (v_12 + 1u);
+        v_13 = (v_14 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 2, 4> v_13[4] = a;
-  return v_13;
+  matrix<float16_t, 2, 4> v_15[4] = a;
+  return v_15;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  matrix<float16_t, 2, 4> v_14[4] = v_10(0u);
-  v_7(0u, v_14);
+  matrix<float16_t, 2, 4> v_16[4] = v_12(0u);
+  v_9(0u, v_16);
   v_4(16u, v_5(32u));
-  s.Store<vector<float16_t, 4> >(16u, tint_bitcast_to_f16(u[0u]).ywxz);
+  s.Store<vector<float16_t, 4> >(16u, tint_bitcast_to_f16(u[0u].zw).ywxz);
   s.Store<float16_t>(16u, float16_t(f16tof32(u[0u].z)));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
index 716715e..80634e2 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
@@ -7,12 +7,12 @@
   uint4 u[4];
 };
 groupshared matrix<float16_t, 2, 4> w[4];
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -20,53 +20,55 @@
 }
 
 matrix<float16_t, 2, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))));
 }
 
 typedef matrix<float16_t, 2, 4> ary_ret[4];
-ary_ret v_6(uint start_byte_offset) {
+ary_ret v_8(uint start_byte_offset) {
   matrix<float16_t, 2, 4> a[4] = (matrix<float16_t, 2, 4>[4])0;
   {
-    uint v_7 = 0u;
-    v_7 = 0u;
+    uint v_9 = 0u;
+    v_9 = 0u;
     while(true) {
-      uint v_8 = v_7;
-      if ((v_8 >= 4u)) {
+      uint v_10 = v_9;
+      if ((v_10 >= 4u)) {
         break;
       }
-      a[v_8] = v_4((start_byte_offset + (v_8 * 16u)));
+      a[v_10] = v_4((start_byte_offset + (v_10 * 16u)));
       {
-        v_7 = (v_8 + 1u);
+        v_9 = (v_10 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 2, 4> v_9[4] = a;
-  return v_9;
+  matrix<float16_t, 2, 4> v_11[4] = a;
+  return v_11;
 }
 
 void f_inner(uint tint_local_index) {
   {
-    uint v_10 = 0u;
-    v_10 = tint_local_index;
+    uint v_12 = 0u;
+    v_12 = tint_local_index;
     while(true) {
-      uint v_11 = v_10;
-      if ((v_11 >= 4u)) {
+      uint v_13 = v_12;
+      if ((v_13 >= 4u)) {
         break;
       }
-      w[v_11] = matrix<float16_t, 2, 4>((float16_t(0.0h)).xxxx, (float16_t(0.0h)).xxxx);
+      w[v_13] = matrix<float16_t, 2, 4>((float16_t(0.0h)).xxxx, (float16_t(0.0h)).xxxx);
       {
-        v_10 = (v_11 + 1u);
+        v_12 = (v_13 + 1u);
       }
       continue;
     }
   }
   GroupMemoryBarrierWithGroupSync();
-  matrix<float16_t, 2, 4> v_12[4] = v_6(0u);
-  w = v_12;
+  matrix<float16_t, 2, 4> v_14[4] = v_8(0u);
+  w = v_14;
   w[int(1)] = v_4(32u);
-  w[int(1)][int(0)] = tint_bitcast_to_f16(u[0u]).ywxz;
+  w[int(1)][int(0)] = tint_bitcast_to_f16(u[0u].zw).ywxz;
   w[int(1)][int(0)][0u] = float16_t(f16tof32(u[0u].z));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index d2e0f23..2e587dd 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -18,47 +18,42 @@
 }
 
 matrix<float16_t, 4, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = a[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = a[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x)));
-  uint4 v_9 = a[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_4, v_6, v_8, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.z) : (v_9.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(a[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_3, v_4, v_5, tint_bitcast_to_f16(a[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
 typedef matrix<float16_t, 4, 2> ary_ret[4];
-ary_ret v_10(uint start_byte_offset) {
+ary_ret v_6(uint start_byte_offset) {
   matrix<float16_t, 4, 2> a_1[4] = (matrix<float16_t, 4, 2>[4])0;
   {
-    uint v_11 = 0u;
-    v_11 = 0u;
+    uint v_7 = 0u;
+    v_7 = 0u;
     while(true) {
-      uint v_12 = v_11;
-      if ((v_12 >= 4u)) {
+      uint v_8 = v_7;
+      if ((v_8 >= 4u)) {
         break;
       }
-      a_1[v_12] = v_2((start_byte_offset + (v_12 * 16u)));
+      a_1[v_8] = v_2((start_byte_offset + (v_8 * 16u)));
       {
-        v_11 = (v_12 + 1u);
+        v_7 = (v_8 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 4, 2> v_13[4] = a_1;
-  return v_13;
+  matrix<float16_t, 4, 2> v_9[4] = a_1;
+  return v_9;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  uint v_14 = (16u * uint(i()));
-  uint v_15 = (4u * uint(i()));
-  matrix<float16_t, 4, 2> l_a[4] = v_10(0u);
-  matrix<float16_t, 4, 2> l_a_i = v_2(v_14);
-  uint4 v_16 = a[((v_14 + v_15) / 16u)];
-  vector<float16_t, 2> l_a_i_i = tint_bitcast_to_f16(((((((v_14 + v_15) % 16u) / 4u) == 2u)) ? (v_16.z) : (v_16.x)));
-  uint v_17 = a[((v_14 + v_15) / 16u)][(((v_14 + v_15) % 16u) / 4u)];
-  s.Store<float16_t>(0u, (((float16_t(f16tof32((v_17 >> (((((v_14 + v_15) % 4u) == 0u)) ? (0u) : (16u))))) + l_a[int(0)][int(0)][0u]) + l_a_i[int(0)][0u]) + l_a_i_i[0u]));
+  uint v_10 = (16u * uint(i()));
+  uint v_11 = (4u * uint(i()));
+  matrix<float16_t, 4, 2> l_a[4] = v_6(0u);
+  matrix<float16_t, 4, 2> l_a_i = v_2(v_10);
+  vector<float16_t, 2> l_a_i_i = tint_bitcast_to_f16(a[((v_10 + v_11) / 16u)][(((v_10 + v_11) % 16u) / 4u)]);
+  uint v_12 = a[((v_10 + v_11) / 16u)][(((v_10 + v_11) % 16u) / 4u)];
+  s.Store<float16_t>(0u, (((float16_t(f16tof32((v_12 >> (((((v_10 + v_11) % 4u) == 0u)) ? (0u) : (16u))))) + l_a[int(0)][int(0)][0u]) + l_a_i[int(0)][0u]) + l_a_i_i[0u]));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 0ddb81d..4f68c21 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -12,43 +12,39 @@
 }
 
 matrix<float16_t, 4, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = a[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = a[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x)));
-  uint4 v_9 = a[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_4, v_6, v_8, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.z) : (v_9.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(a[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_3, v_4, v_5, tint_bitcast_to_f16(a[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
 typedef matrix<float16_t, 4, 2> ary_ret[4];
-ary_ret v_10(uint start_byte_offset) {
+ary_ret v_6(uint start_byte_offset) {
   matrix<float16_t, 4, 2> a_1[4] = (matrix<float16_t, 4, 2>[4])0;
   {
-    uint v_11 = 0u;
-    v_11 = 0u;
+    uint v_7 = 0u;
+    v_7 = 0u;
     while(true) {
-      uint v_12 = v_11;
-      if ((v_12 >= 4u)) {
+      uint v_8 = v_7;
+      if ((v_8 >= 4u)) {
         break;
       }
-      a_1[v_12] = v_2((start_byte_offset + (v_12 * 16u)));
+      a_1[v_8] = v_2((start_byte_offset + (v_8 * 16u)));
       {
-        v_11 = (v_12 + 1u);
+        v_7 = (v_8 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 4, 2> v_13[4] = a_1;
-  return v_13;
+  matrix<float16_t, 4, 2> v_9[4] = a_1;
+  return v_9;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  matrix<float16_t, 4, 2> l_a[4] = v_10(0u);
+  matrix<float16_t, 4, 2> l_a[4] = v_6(0u);
   matrix<float16_t, 4, 2> l_a_i = v_2(32u);
-  vector<float16_t, 2> l_a_i_i = tint_bitcast_to_f16(a[2u].x);
+  vector<float16_t, 2> l_a_i_i = tint_bitcast_to_f16(a[2u].y);
   s.Store<float16_t>(0u, (((float16_t(f16tof32(a[2u].y)) + l_a[int(0)][int(0)][0u]) + l_a_i[int(0)][0u]) + l_a_i_i[0u]));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
index 1b11f8f..e2b11ba 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
@@ -12,22 +12,18 @@
 }
 
 matrix<float16_t, 4, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x)));
-  uint4 v_9 = u[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_4, v_6, v_8, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.z) : (v_9.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_3, v_4, v_5, tint_bitcast_to_f16(u[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 2, 4> t = transpose(v_2(32u));
-  float16_t l = length(tint_bitcast_to_f16(u[0u].x).yx);
-  float16_t a = abs(tint_bitcast_to_f16(u[0u].x).yx[0u]);
-  float16_t v_10 = (t[int(0)][0u] + float16_t(l));
-  s.Store<float16_t>(0u, (v_10 + float16_t(a)));
+  float16_t l = length(tint_bitcast_to_f16(u[0u].y).yx);
+  float16_t a = abs(tint_bitcast_to_f16(u[0u].y).yx[0u]);
+  float16_t v_6 = (t[int(0)][0u] + float16_t(l));
+  s.Store<float16_t>(0u, (v_6 + float16_t(a)));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl
index b40b91c..79d6e89 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl
@@ -28,44 +28,40 @@
 }
 
 matrix<float16_t, 4, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x)));
-  uint4 v_9 = u[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_4, v_6, v_8, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.z) : (v_9.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_3, v_4, v_5, tint_bitcast_to_f16(u[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
 typedef matrix<float16_t, 4, 2> ary_ret[4];
-ary_ret v_10(uint start_byte_offset) {
+ary_ret v_6(uint start_byte_offset) {
   matrix<float16_t, 4, 2> a_2[4] = (matrix<float16_t, 4, 2>[4])0;
   {
-    uint v_11 = 0u;
-    v_11 = 0u;
+    uint v_7 = 0u;
+    v_7 = 0u;
     while(true) {
-      uint v_12 = v_11;
-      if ((v_12 >= 4u)) {
+      uint v_8 = v_7;
+      if ((v_8 >= 4u)) {
         break;
       }
-      a_2[v_12] = v_2((start_byte_offset + (v_12 * 16u)));
+      a_2[v_8] = v_2((start_byte_offset + (v_8 * 16u)));
       {
-        v_11 = (v_12 + 1u);
+        v_7 = (v_8 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 4, 2> v_13[4] = a_2;
-  return v_13;
+  matrix<float16_t, 4, 2> v_9[4] = a_2;
+  return v_9;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  matrix<float16_t, 4, 2> v_14[4] = v_10(0u);
-  float16_t v_15 = a(v_14);
-  float16_t v_16 = (v_15 + b(v_2(16u)));
-  float16_t v_17 = (v_16 + c(tint_bitcast_to_f16(u[1u].x).yx));
-  s.Store<float16_t>(0u, (v_17 + d(tint_bitcast_to_f16(u[1u].x).yx[0u])));
+  matrix<float16_t, 4, 2> v_10[4] = v_6(0u);
+  float16_t v_11 = a(v_10);
+  float16_t v_12 = (v_11 + b(v_2(16u)));
+  float16_t v_13 = (v_12 + c(tint_bitcast_to_f16(u[1u].x).yx));
+  s.Store<float16_t>(0u, (v_13 + d(tint_bitcast_to_f16(u[1u].x).yx[0u])));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_private.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_private.wgsl.expected.ir.dxc.hlsl
index b26101f..33b85ad 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_private.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_private.wgsl.expected.ir.dxc.hlsl
@@ -13,44 +13,40 @@
 }
 
 matrix<float16_t, 4, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x)));
-  uint4 v_9 = u[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_4, v_6, v_8, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.z) : (v_9.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_3, v_4, v_5, tint_bitcast_to_f16(u[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
 typedef matrix<float16_t, 4, 2> ary_ret[4];
-ary_ret v_10(uint start_byte_offset) {
+ary_ret v_6(uint start_byte_offset) {
   matrix<float16_t, 4, 2> a[4] = (matrix<float16_t, 4, 2>[4])0;
   {
-    uint v_11 = 0u;
-    v_11 = 0u;
+    uint v_7 = 0u;
+    v_7 = 0u;
     while(true) {
-      uint v_12 = v_11;
-      if ((v_12 >= 4u)) {
+      uint v_8 = v_7;
+      if ((v_8 >= 4u)) {
         break;
       }
-      a[v_12] = v_2((start_byte_offset + (v_12 * 16u)));
+      a[v_8] = v_2((start_byte_offset + (v_8 * 16u)));
       {
-        v_11 = (v_12 + 1u);
+        v_7 = (v_8 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 4, 2> v_13[4] = a;
-  return v_13;
+  matrix<float16_t, 4, 2> v_9[4] = a;
+  return v_9;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  matrix<float16_t, 4, 2> v_14[4] = v_10(0u);
-  p = v_14;
+  matrix<float16_t, 4, 2> v_10[4] = v_6(0u);
+  p = v_10;
   p[int(1)] = v_2(32u);
-  p[int(1)][int(0)] = tint_bitcast_to_f16(u[0u].x).yx;
+  p[int(1)][int(0)] = tint_bitcast_to_f16(u[0u].y).yx;
   p[int(1)][int(0)][0u] = float16_t(f16tof32(u[0u].y));
   s.Store<float16_t>(0u, p[int(1)][int(0)].x);
 }
diff --git a/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl
index 6c8f5fd..4ae6a06 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl
@@ -19,28 +19,24 @@
 }
 
 matrix<float16_t, 4, 2> v_3(uint start_byte_offset) {
-  uint4 v_4 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_5 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_4.z) : (v_4.x)));
-  uint4 v_6 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_7 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_6.z) : (v_6.x)));
-  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_9 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.z) : (v_8.x)));
-  uint4 v_10 = u[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_5, v_7, v_9, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_10.z) : (v_10.x))));
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_4, v_5, v_6, tint_bitcast_to_f16(u[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
-void v_11(uint offset, matrix<float16_t, 4, 2> obj[4]) {
+void v_7(uint offset, matrix<float16_t, 4, 2> obj[4]) {
   {
-    uint v_12 = 0u;
-    v_12 = 0u;
+    uint v_8 = 0u;
+    v_8 = 0u;
     while(true) {
-      uint v_13 = v_12;
-      if ((v_13 >= 4u)) {
+      uint v_9 = v_8;
+      if ((v_9 >= 4u)) {
         break;
       }
-      v_2((offset + (v_13 * 16u)), obj[v_13]);
+      v_2((offset + (v_9 * 16u)), obj[v_9]);
       {
-        v_12 = (v_13 + 1u);
+        v_8 = (v_9 + 1u);
       }
       continue;
     }
@@ -48,33 +44,33 @@
 }
 
 typedef matrix<float16_t, 4, 2> ary_ret[4];
-ary_ret v_14(uint start_byte_offset) {
+ary_ret v_10(uint start_byte_offset) {
   matrix<float16_t, 4, 2> a[4] = (matrix<float16_t, 4, 2>[4])0;
   {
-    uint v_15 = 0u;
-    v_15 = 0u;
+    uint v_11 = 0u;
+    v_11 = 0u;
     while(true) {
-      uint v_16 = v_15;
-      if ((v_16 >= 4u)) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
         break;
       }
-      a[v_16] = v_3((start_byte_offset + (v_16 * 16u)));
+      a[v_12] = v_3((start_byte_offset + (v_12 * 16u)));
       {
-        v_15 = (v_16 + 1u);
+        v_11 = (v_12 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 4, 2> v_17[4] = a;
-  return v_17;
+  matrix<float16_t, 4, 2> v_13[4] = a;
+  return v_13;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  matrix<float16_t, 4, 2> v_18[4] = v_14(0u);
-  v_11(0u, v_18);
+  matrix<float16_t, 4, 2> v_14[4] = v_10(0u);
+  v_7(0u, v_14);
   v_2(16u, v_3(32u));
-  s.Store<vector<float16_t, 2> >(16u, tint_bitcast_to_f16(u[0u].x).yx);
+  s.Store<vector<float16_t, 2> >(16u, tint_bitcast_to_f16(u[0u].y).yx);
   s.Store<float16_t>(16u, float16_t(f16tof32(u[0u].y)));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
index 5993268..244df5e 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
@@ -16,59 +16,55 @@
 }
 
 matrix<float16_t, 4, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x)));
-  uint4 v_9 = u[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_4, v_6, v_8, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.z) : (v_9.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_3, v_4, v_5, tint_bitcast_to_f16(u[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
 typedef matrix<float16_t, 4, 2> ary_ret[4];
-ary_ret v_10(uint start_byte_offset) {
+ary_ret v_6(uint start_byte_offset) {
   matrix<float16_t, 4, 2> a[4] = (matrix<float16_t, 4, 2>[4])0;
   {
-    uint v_11 = 0u;
-    v_11 = 0u;
+    uint v_7 = 0u;
+    v_7 = 0u;
     while(true) {
-      uint v_12 = v_11;
-      if ((v_12 >= 4u)) {
+      uint v_8 = v_7;
+      if ((v_8 >= 4u)) {
         break;
       }
-      a[v_12] = v_2((start_byte_offset + (v_12 * 16u)));
+      a[v_8] = v_2((start_byte_offset + (v_8 * 16u)));
       {
-        v_11 = (v_12 + 1u);
+        v_7 = (v_8 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 4, 2> v_13[4] = a;
-  return v_13;
+  matrix<float16_t, 4, 2> v_9[4] = a;
+  return v_9;
 }
 
 void f_inner(uint tint_local_index) {
   {
-    uint v_14 = 0u;
-    v_14 = tint_local_index;
+    uint v_10 = 0u;
+    v_10 = tint_local_index;
     while(true) {
-      uint v_15 = v_14;
-      if ((v_15 >= 4u)) {
+      uint v_11 = v_10;
+      if ((v_11 >= 4u)) {
         break;
       }
-      w[v_15] = matrix<float16_t, 4, 2>((float16_t(0.0h)).xx, (float16_t(0.0h)).xx, (float16_t(0.0h)).xx, (float16_t(0.0h)).xx);
+      w[v_11] = matrix<float16_t, 4, 2>((float16_t(0.0h)).xx, (float16_t(0.0h)).xx, (float16_t(0.0h)).xx, (float16_t(0.0h)).xx);
       {
-        v_14 = (v_15 + 1u);
+        v_10 = (v_11 + 1u);
       }
       continue;
     }
   }
   GroupMemoryBarrierWithGroupSync();
-  matrix<float16_t, 4, 2> v_16[4] = v_10(0u);
-  w = v_16;
+  matrix<float16_t, 4, 2> v_12[4] = v_6(0u);
+  w = v_12;
   w[int(1)] = v_2(32u);
-  w[int(1)][int(0)] = tint_bitcast_to_f16(u[0u].x).yx;
+  w[int(1)][int(0)] = tint_bitcast_to_f16(u[0u].y).yx;
   w[int(1)][int(0)][0u] = float16_t(f16tof32(u[0u].y));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index ffb57c6..a400a1c 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -9,12 +9,12 @@
   return counter;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -22,42 +22,47 @@
 }
 
 matrix<float16_t, 4, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(a[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_5, v_6, v_7, tint_bitcast_to_f16(a[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = a[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = a[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz;
+  uint4 v_11 = a[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))).xyz);
 }
 
 typedef matrix<float16_t, 4, 3> ary_ret[4];
-ary_ret v_8(uint start_byte_offset) {
+ary_ret v_12(uint start_byte_offset) {
   matrix<float16_t, 4, 3> a_1[4] = (matrix<float16_t, 4, 3>[4])0;
   {
-    uint v_9 = 0u;
-    v_9 = 0u;
+    uint v_13 = 0u;
+    v_13 = 0u;
     while(true) {
-      uint v_10 = v_9;
-      if ((v_10 >= 4u)) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
         break;
       }
-      a_1[v_10] = v_4((start_byte_offset + (v_10 * 32u)));
+      a_1[v_14] = v_4((start_byte_offset + (v_14 * 32u)));
       {
-        v_9 = (v_10 + 1u);
+        v_13 = (v_14 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 4, 3> v_11[4] = a_1;
-  return v_11;
+  matrix<float16_t, 4, 3> v_15[4] = a_1;
+  return v_15;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  uint v_12 = (32u * uint(i()));
-  uint v_13 = (8u * uint(i()));
-  matrix<float16_t, 4, 3> l_a[4] = v_8(0u);
-  matrix<float16_t, 4, 3> l_a_i = v_4(v_12);
-  vector<float16_t, 3> l_a_i_i = tint_bitcast_to_f16(a[((v_12 + v_13) / 16u)]).xyz;
-  uint v_14 = a[((v_12 + v_13) / 16u)][(((v_12 + v_13) % 16u) / 4u)];
-  s.Store<float16_t>(0u, (((float16_t(f16tof32((v_14 >> (((((v_12 + v_13) % 4u) == 0u)) ? (0u) : (16u))))) + l_a[int(0)][int(0)][0u]) + l_a_i[int(0)][0u]) + l_a_i_i[0u]));
+  uint v_16 = (32u * uint(i()));
+  uint v_17 = (8u * uint(i()));
+  matrix<float16_t, 4, 3> l_a[4] = v_12(0u);
+  matrix<float16_t, 4, 3> l_a_i = v_4(v_16);
+  uint4 v_18 = a[((v_16 + v_17) / 16u)];
+  vector<float16_t, 3> l_a_i_i = tint_bitcast_to_f16(((((((v_16 + v_17) % 16u) / 4u) == 2u)) ? (v_18.zw) : (v_18.xy))).xyz;
+  uint v_19 = a[((v_16 + v_17) / 16u)][(((v_16 + v_17) % 16u) / 4u)];
+  s.Store<float16_t>(0u, (((float16_t(f16tof32((v_19 >> (((((v_16 + v_17) % 4u) == 0u)) ? (0u) : (16u))))) + l_a[int(0)][int(0)][0u]) + l_a_i[int(0)][0u]) + l_a_i_i[0u]));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index e8ca229..7a1be2d 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 a[8];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -16,39 +16,43 @@
 }
 
 matrix<float16_t, 4, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(a[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_5, v_6, v_7, tint_bitcast_to_f16(a[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = a[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = a[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz;
+  uint4 v_11 = a[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))).xyz);
 }
 
 typedef matrix<float16_t, 4, 3> ary_ret[4];
-ary_ret v_8(uint start_byte_offset) {
+ary_ret v_12(uint start_byte_offset) {
   matrix<float16_t, 4, 3> a_1[4] = (matrix<float16_t, 4, 3>[4])0;
   {
-    uint v_9 = 0u;
-    v_9 = 0u;
+    uint v_13 = 0u;
+    v_13 = 0u;
     while(true) {
-      uint v_10 = v_9;
-      if ((v_10 >= 4u)) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
         break;
       }
-      a_1[v_10] = v_4((start_byte_offset + (v_10 * 32u)));
+      a_1[v_14] = v_4((start_byte_offset + (v_14 * 32u)));
       {
-        v_9 = (v_10 + 1u);
+        v_13 = (v_14 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 4, 3> v_11[4] = a_1;
-  return v_11;
+  matrix<float16_t, 4, 3> v_15[4] = a_1;
+  return v_15;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  matrix<float16_t, 4, 3> l_a[4] = v_8(0u);
+  matrix<float16_t, 4, 3> l_a[4] = v_12(0u);
   matrix<float16_t, 4, 3> l_a_i = v_4(64u);
-  vector<float16_t, 3> l_a_i_i = tint_bitcast_to_f16(a[4u]).xyz;
+  vector<float16_t, 3> l_a_i_i = tint_bitcast_to_f16(a[4u].zw).xyz;
   s.Store<float16_t>(0u, (((float16_t(f16tof32(a[4u].z)) + l_a[int(0)][int(0)][0u]) + l_a_i[int(0)][0u]) + l_a_i_i[0u]));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
index cea3086..71c16e3 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 u[8];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -16,18 +16,22 @@
 }
 
 matrix<float16_t, 4, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz;
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 3, 4> t = transpose(v_4(64u));
-  float16_t l = length(tint_bitcast_to_f16(u[0u]).xyz.zxy);
-  float16_t a = abs(tint_bitcast_to_f16(u[0u]).xyz.zxy[0u]);
-  float16_t v_8 = (t[int(0)][0u] + float16_t(l));
-  s.Store<float16_t>(0u, (v_8 + float16_t(a)));
+  float16_t l = length(tint_bitcast_to_f16(u[0u].zw).xyz.zxy);
+  float16_t a = abs(tint_bitcast_to_f16(u[0u].zw).xyz.zxy[0u]);
+  float16_t v_12 = (t[int(0)][0u] + float16_t(l));
+  s.Store<float16_t>(0u, (v_12 + float16_t(a)));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
index 5b8f8e2..116b09a 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
@@ -19,12 +19,12 @@
   return f_1;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -32,40 +32,44 @@
 }
 
 matrix<float16_t, 4, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz;
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))).xyz);
 }
 
 typedef matrix<float16_t, 4, 3> ary_ret[4];
-ary_ret v_8(uint start_byte_offset) {
+ary_ret v_12(uint start_byte_offset) {
   matrix<float16_t, 4, 3> a_2[4] = (matrix<float16_t, 4, 3>[4])0;
   {
-    uint v_9 = 0u;
-    v_9 = 0u;
+    uint v_13 = 0u;
+    v_13 = 0u;
     while(true) {
-      uint v_10 = v_9;
-      if ((v_10 >= 4u)) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
         break;
       }
-      a_2[v_10] = v_4((start_byte_offset + (v_10 * 32u)));
+      a_2[v_14] = v_4((start_byte_offset + (v_14 * 32u)));
       {
-        v_9 = (v_10 + 1u);
+        v_13 = (v_14 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 4, 3> v_11[4] = a_2;
-  return v_11;
+  matrix<float16_t, 4, 3> v_15[4] = a_2;
+  return v_15;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  matrix<float16_t, 4, 3> v_12[4] = v_8(0u);
-  float16_t v_13 = a(v_12);
-  float16_t v_14 = (v_13 + b(v_4(32u)));
-  float16_t v_15 = (v_14 + c(tint_bitcast_to_f16(u[2u]).xyz.zxy));
-  s.Store<float16_t>(0u, (v_15 + d(tint_bitcast_to_f16(u[2u]).xyz.zxy[0u])));
+  matrix<float16_t, 4, 3> v_16[4] = v_12(0u);
+  float16_t v_17 = a(v_16);
+  float16_t v_18 = (v_17 + b(v_4(32u)));
+  float16_t v_19 = (v_18 + c(tint_bitcast_to_f16(u[2u].xy).xyz.zxy));
+  s.Store<float16_t>(0u, (v_19 + d(tint_bitcast_to_f16(u[2u].xy).xyz.zxy[0u])));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_private.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
index c0e0beb..870ad8e 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
@@ -4,12 +4,12 @@
 };
 RWByteAddressBuffer s : register(u1);
 static matrix<float16_t, 4, 3> p[4] = (matrix<float16_t, 4, 3>[4])0;
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -17,40 +17,44 @@
 }
 
 matrix<float16_t, 4, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz;
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))).xyz);
 }
 
 typedef matrix<float16_t, 4, 3> ary_ret[4];
-ary_ret v_8(uint start_byte_offset) {
+ary_ret v_12(uint start_byte_offset) {
   matrix<float16_t, 4, 3> a[4] = (matrix<float16_t, 4, 3>[4])0;
   {
-    uint v_9 = 0u;
-    v_9 = 0u;
+    uint v_13 = 0u;
+    v_13 = 0u;
     while(true) {
-      uint v_10 = v_9;
-      if ((v_10 >= 4u)) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
         break;
       }
-      a[v_10] = v_4((start_byte_offset + (v_10 * 32u)));
+      a[v_14] = v_4((start_byte_offset + (v_14 * 32u)));
       {
-        v_9 = (v_10 + 1u);
+        v_13 = (v_14 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 4, 3> v_11[4] = a;
-  return v_11;
+  matrix<float16_t, 4, 3> v_15[4] = a;
+  return v_15;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  matrix<float16_t, 4, 3> v_12[4] = v_8(0u);
-  p = v_12;
+  matrix<float16_t, 4, 3> v_16[4] = v_12(0u);
+  p = v_16;
   p[int(1)] = v_4(64u);
-  p[int(1)][int(0)] = tint_bitcast_to_f16(u[0u]).xyz.zxy;
+  p[int(1)][int(0)] = tint_bitcast_to_f16(u[0u].zw).xyz.zxy;
   p[int(1)][int(0)][0u] = float16_t(f16tof32(u[0u].z));
   s.Store<float16_t>(0u, p[int(1)][int(0)].x);
 }
diff --git a/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
index e67e1ef..10de248 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 u[8];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -23,24 +23,28 @@
 }
 
 matrix<float16_t, 4, 3> v_5(uint start_byte_offset) {
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_6, v_7, v_8, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_6 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.zw) : (v_6.xy))).xyz;
+  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_9 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy))).xyz;
+  uint4 v_10 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_11 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_10.zw) : (v_10.xy))).xyz;
+  uint4 v_12 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_7, v_9, v_11, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_12.zw) : (v_12.xy))).xyz);
 }
 
-void v_9(uint offset, matrix<float16_t, 4, 3> obj[4]) {
+void v_13(uint offset, matrix<float16_t, 4, 3> obj[4]) {
   {
-    uint v_10 = 0u;
-    v_10 = 0u;
+    uint v_14 = 0u;
+    v_14 = 0u;
     while(true) {
-      uint v_11 = v_10;
-      if ((v_11 >= 4u)) {
+      uint v_15 = v_14;
+      if ((v_15 >= 4u)) {
         break;
       }
-      v_4((offset + (v_11 * 32u)), obj[v_11]);
+      v_4((offset + (v_15 * 32u)), obj[v_15]);
       {
-        v_10 = (v_11 + 1u);
+        v_14 = (v_15 + 1u);
       }
       continue;
     }
@@ -48,33 +52,33 @@
 }
 
 typedef matrix<float16_t, 4, 3> ary_ret[4];
-ary_ret v_12(uint start_byte_offset) {
+ary_ret v_16(uint start_byte_offset) {
   matrix<float16_t, 4, 3> a[4] = (matrix<float16_t, 4, 3>[4])0;
   {
-    uint v_13 = 0u;
-    v_13 = 0u;
+    uint v_17 = 0u;
+    v_17 = 0u;
     while(true) {
-      uint v_14 = v_13;
-      if ((v_14 >= 4u)) {
+      uint v_18 = v_17;
+      if ((v_18 >= 4u)) {
         break;
       }
-      a[v_14] = v_5((start_byte_offset + (v_14 * 32u)));
+      a[v_18] = v_5((start_byte_offset + (v_18 * 32u)));
       {
-        v_13 = (v_14 + 1u);
+        v_17 = (v_18 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 4, 3> v_15[4] = a;
-  return v_15;
+  matrix<float16_t, 4, 3> v_19[4] = a;
+  return v_19;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  matrix<float16_t, 4, 3> v_16[4] = v_12(0u);
-  v_9(0u, v_16);
+  matrix<float16_t, 4, 3> v_20[4] = v_16(0u);
+  v_13(0u, v_20);
   v_4(32u, v_5(64u));
-  s.Store<vector<float16_t, 3> >(32u, tint_bitcast_to_f16(u[0u]).xyz.zxy);
+  s.Store<vector<float16_t, 3> >(32u, tint_bitcast_to_f16(u[0u].zw).xyz.zxy);
   s.Store<float16_t>(32u, float16_t(f16tof32(u[0u].z)));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
index 35a3663..b5e7ca9 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
@@ -7,12 +7,12 @@
   uint4 u[8];
 };
 groupshared matrix<float16_t, 4, 3> w[4];
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -20,55 +20,59 @@
 }
 
 matrix<float16_t, 4, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz;
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))).xyz);
 }
 
 typedef matrix<float16_t, 4, 3> ary_ret[4];
-ary_ret v_8(uint start_byte_offset) {
+ary_ret v_12(uint start_byte_offset) {
   matrix<float16_t, 4, 3> a[4] = (matrix<float16_t, 4, 3>[4])0;
   {
-    uint v_9 = 0u;
-    v_9 = 0u;
+    uint v_13 = 0u;
+    v_13 = 0u;
     while(true) {
-      uint v_10 = v_9;
-      if ((v_10 >= 4u)) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
         break;
       }
-      a[v_10] = v_4((start_byte_offset + (v_10 * 32u)));
+      a[v_14] = v_4((start_byte_offset + (v_14 * 32u)));
       {
-        v_9 = (v_10 + 1u);
+        v_13 = (v_14 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 4, 3> v_11[4] = a;
-  return v_11;
+  matrix<float16_t, 4, 3> v_15[4] = a;
+  return v_15;
 }
 
 void f_inner(uint tint_local_index) {
   {
-    uint v_12 = 0u;
-    v_12 = tint_local_index;
+    uint v_16 = 0u;
+    v_16 = tint_local_index;
     while(true) {
-      uint v_13 = v_12;
-      if ((v_13 >= 4u)) {
+      uint v_17 = v_16;
+      if ((v_17 >= 4u)) {
         break;
       }
-      w[v_13] = matrix<float16_t, 4, 3>((float16_t(0.0h)).xxx, (float16_t(0.0h)).xxx, (float16_t(0.0h)).xxx, (float16_t(0.0h)).xxx);
+      w[v_17] = matrix<float16_t, 4, 3>((float16_t(0.0h)).xxx, (float16_t(0.0h)).xxx, (float16_t(0.0h)).xxx, (float16_t(0.0h)).xxx);
       {
-        v_12 = (v_13 + 1u);
+        v_16 = (v_17 + 1u);
       }
       continue;
     }
   }
   GroupMemoryBarrierWithGroupSync();
-  matrix<float16_t, 4, 3> v_14[4] = v_8(0u);
-  w = v_14;
+  matrix<float16_t, 4, 3> v_18[4] = v_12(0u);
+  w = v_18;
   w[int(1)] = v_4(64u);
-  w[int(1)][int(0)] = tint_bitcast_to_f16(u[0u]).xyz.zxy;
+  w[int(1)][int(0)] = tint_bitcast_to_f16(u[0u].zw).xyz.zxy;
   w[int(1)][int(0)][0u] = float16_t(f16tof32(u[0u].z));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 6dd8244..807fc6b 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -9,12 +9,12 @@
   return counter;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -22,42 +22,47 @@
 }
 
 matrix<float16_t, 4, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(a[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_5, v_6, v_7, tint_bitcast_to_f16(a[((24u + start_byte_offset) / 16u)]));
+  uint4 v_5 = a[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = a[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy)));
+  uint4 v_11 = a[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))));
 }
 
 typedef matrix<float16_t, 4, 4> ary_ret[4];
-ary_ret v_8(uint start_byte_offset) {
+ary_ret v_12(uint start_byte_offset) {
   matrix<float16_t, 4, 4> a_1[4] = (matrix<float16_t, 4, 4>[4])0;
   {
-    uint v_9 = 0u;
-    v_9 = 0u;
+    uint v_13 = 0u;
+    v_13 = 0u;
     while(true) {
-      uint v_10 = v_9;
-      if ((v_10 >= 4u)) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
         break;
       }
-      a_1[v_10] = v_4((start_byte_offset + (v_10 * 32u)));
+      a_1[v_14] = v_4((start_byte_offset + (v_14 * 32u)));
       {
-        v_9 = (v_10 + 1u);
+        v_13 = (v_14 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 4, 4> v_11[4] = a_1;
-  return v_11;
+  matrix<float16_t, 4, 4> v_15[4] = a_1;
+  return v_15;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  uint v_12 = (32u * uint(i()));
-  uint v_13 = (8u * uint(i()));
-  matrix<float16_t, 4, 4> l_a[4] = v_8(0u);
-  matrix<float16_t, 4, 4> l_a_i = v_4(v_12);
-  vector<float16_t, 4> l_a_i_i = tint_bitcast_to_f16(a[((v_12 + v_13) / 16u)]);
-  uint v_14 = a[((v_12 + v_13) / 16u)][(((v_12 + v_13) % 16u) / 4u)];
-  s.Store<float16_t>(0u, (((float16_t(f16tof32((v_14 >> (((((v_12 + v_13) % 4u) == 0u)) ? (0u) : (16u))))) + l_a[int(0)][int(0)][0u]) + l_a_i[int(0)][0u]) + l_a_i_i[0u]));
+  uint v_16 = (32u * uint(i()));
+  uint v_17 = (8u * uint(i()));
+  matrix<float16_t, 4, 4> l_a[4] = v_12(0u);
+  matrix<float16_t, 4, 4> l_a_i = v_4(v_16);
+  uint4 v_18 = a[((v_16 + v_17) / 16u)];
+  vector<float16_t, 4> l_a_i_i = tint_bitcast_to_f16(((((((v_16 + v_17) % 16u) / 4u) == 2u)) ? (v_18.zw) : (v_18.xy)));
+  uint v_19 = a[((v_16 + v_17) / 16u)][(((v_16 + v_17) % 16u) / 4u)];
+  s.Store<float16_t>(0u, (((float16_t(f16tof32((v_19 >> (((((v_16 + v_17) % 4u) == 0u)) ? (0u) : (16u))))) + l_a[int(0)][int(0)][0u]) + l_a_i[int(0)][0u]) + l_a_i_i[0u]));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 5c9a77c..ad9de89 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 a[8];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -16,39 +16,43 @@
 }
 
 matrix<float16_t, 4, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(a[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_5, v_6, v_7, tint_bitcast_to_f16(a[((24u + start_byte_offset) / 16u)]));
+  uint4 v_5 = a[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = a[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy)));
+  uint4 v_11 = a[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))));
 }
 
 typedef matrix<float16_t, 4, 4> ary_ret[4];
-ary_ret v_8(uint start_byte_offset) {
+ary_ret v_12(uint start_byte_offset) {
   matrix<float16_t, 4, 4> a_1[4] = (matrix<float16_t, 4, 4>[4])0;
   {
-    uint v_9 = 0u;
-    v_9 = 0u;
+    uint v_13 = 0u;
+    v_13 = 0u;
     while(true) {
-      uint v_10 = v_9;
-      if ((v_10 >= 4u)) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
         break;
       }
-      a_1[v_10] = v_4((start_byte_offset + (v_10 * 32u)));
+      a_1[v_14] = v_4((start_byte_offset + (v_14 * 32u)));
       {
-        v_9 = (v_10 + 1u);
+        v_13 = (v_14 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 4, 4> v_11[4] = a_1;
-  return v_11;
+  matrix<float16_t, 4, 4> v_15[4] = a_1;
+  return v_15;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  matrix<float16_t, 4, 4> l_a[4] = v_8(0u);
+  matrix<float16_t, 4, 4> l_a[4] = v_12(0u);
   matrix<float16_t, 4, 4> l_a_i = v_4(64u);
-  vector<float16_t, 4> l_a_i_i = tint_bitcast_to_f16(a[4u]);
+  vector<float16_t, 4> l_a_i_i = tint_bitcast_to_f16(a[4u].zw);
   s.Store<float16_t>(0u, (((float16_t(f16tof32(a[4u].z)) + l_a[int(0)][int(0)][0u]) + l_a_i[int(0)][0u]) + l_a_i_i[0u]));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
index dcd50c2..e56fc8f 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 u[8];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -16,18 +16,22 @@
 }
 
 matrix<float16_t, 4, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy)));
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 4, 4> t = transpose(v_4(64u));
-  float16_t l = length(tint_bitcast_to_f16(u[0u]).ywxz);
-  float16_t a = abs(tint_bitcast_to_f16(u[0u]).ywxz[0u]);
-  float16_t v_8 = (t[int(0)][0u] + float16_t(l));
-  s.Store<float16_t>(0u, (v_8 + float16_t(a)));
+  float16_t l = length(tint_bitcast_to_f16(u[0u].zw).ywxz);
+  float16_t a = abs(tint_bitcast_to_f16(u[0u].zw).ywxz[0u]);
+  float16_t v_12 = (t[int(0)][0u] + float16_t(l));
+  s.Store<float16_t>(0u, (v_12 + float16_t(a)));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
index b077f05..dd082ae 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
@@ -19,12 +19,12 @@
   return f_1;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -32,40 +32,44 @@
 }
 
 matrix<float16_t, 4, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy)));
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))));
 }
 
 typedef matrix<float16_t, 4, 4> ary_ret[4];
-ary_ret v_8(uint start_byte_offset) {
+ary_ret v_12(uint start_byte_offset) {
   matrix<float16_t, 4, 4> a_2[4] = (matrix<float16_t, 4, 4>[4])0;
   {
-    uint v_9 = 0u;
-    v_9 = 0u;
+    uint v_13 = 0u;
+    v_13 = 0u;
     while(true) {
-      uint v_10 = v_9;
-      if ((v_10 >= 4u)) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
         break;
       }
-      a_2[v_10] = v_4((start_byte_offset + (v_10 * 32u)));
+      a_2[v_14] = v_4((start_byte_offset + (v_14 * 32u)));
       {
-        v_9 = (v_10 + 1u);
+        v_13 = (v_14 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 4, 4> v_11[4] = a_2;
-  return v_11;
+  matrix<float16_t, 4, 4> v_15[4] = a_2;
+  return v_15;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  matrix<float16_t, 4, 4> v_12[4] = v_8(0u);
-  float16_t v_13 = a(v_12);
-  float16_t v_14 = (v_13 + b(v_4(32u)));
-  float16_t v_15 = (v_14 + c(tint_bitcast_to_f16(u[2u]).ywxz));
-  s.Store<float16_t>(0u, (v_15 + d(tint_bitcast_to_f16(u[2u]).ywxz[0u])));
+  matrix<float16_t, 4, 4> v_16[4] = v_12(0u);
+  float16_t v_17 = a(v_16);
+  float16_t v_18 = (v_17 + b(v_4(32u)));
+  float16_t v_19 = (v_18 + c(tint_bitcast_to_f16(u[2u].xy).ywxz));
+  s.Store<float16_t>(0u, (v_19 + d(tint_bitcast_to_f16(u[2u].xy).ywxz[0u])));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_private.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
index c6a0a02..a14d494 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
@@ -4,12 +4,12 @@
 };
 RWByteAddressBuffer s : register(u1);
 static matrix<float16_t, 4, 4> p[4] = (matrix<float16_t, 4, 4>[4])0;
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -17,40 +17,44 @@
 }
 
 matrix<float16_t, 4, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy)));
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))));
 }
 
 typedef matrix<float16_t, 4, 4> ary_ret[4];
-ary_ret v_8(uint start_byte_offset) {
+ary_ret v_12(uint start_byte_offset) {
   matrix<float16_t, 4, 4> a[4] = (matrix<float16_t, 4, 4>[4])0;
   {
-    uint v_9 = 0u;
-    v_9 = 0u;
+    uint v_13 = 0u;
+    v_13 = 0u;
     while(true) {
-      uint v_10 = v_9;
-      if ((v_10 >= 4u)) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
         break;
       }
-      a[v_10] = v_4((start_byte_offset + (v_10 * 32u)));
+      a[v_14] = v_4((start_byte_offset + (v_14 * 32u)));
       {
-        v_9 = (v_10 + 1u);
+        v_13 = (v_14 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 4, 4> v_11[4] = a;
-  return v_11;
+  matrix<float16_t, 4, 4> v_15[4] = a;
+  return v_15;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  matrix<float16_t, 4, 4> v_12[4] = v_8(0u);
-  p = v_12;
+  matrix<float16_t, 4, 4> v_16[4] = v_12(0u);
+  p = v_16;
   p[int(1)] = v_4(64u);
-  p[int(1)][int(0)] = tint_bitcast_to_f16(u[0u]).ywxz;
+  p[int(1)][int(0)] = tint_bitcast_to_f16(u[0u].zw).ywxz;
   p[int(1)][int(0)][0u] = float16_t(f16tof32(u[0u].z));
   s.Store<float16_t>(0u, p[int(1)][int(0)].x);
 }
diff --git a/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
index e4a4bc5..755c9b5 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 u[8];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -23,24 +23,28 @@
 }
 
 matrix<float16_t, 4, 4> v_5(uint start_byte_offset) {
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_6, v_7, v_8, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]));
+  uint4 v_6 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.zw) : (v_6.xy)));
+  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_9 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy)));
+  uint4 v_10 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_11 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_10.zw) : (v_10.xy)));
+  uint4 v_12 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_7, v_9, v_11, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_12.zw) : (v_12.xy))));
 }
 
-void v_9(uint offset, matrix<float16_t, 4, 4> obj[4]) {
+void v_13(uint offset, matrix<float16_t, 4, 4> obj[4]) {
   {
-    uint v_10 = 0u;
-    v_10 = 0u;
+    uint v_14 = 0u;
+    v_14 = 0u;
     while(true) {
-      uint v_11 = v_10;
-      if ((v_11 >= 4u)) {
+      uint v_15 = v_14;
+      if ((v_15 >= 4u)) {
         break;
       }
-      v_4((offset + (v_11 * 32u)), obj[v_11]);
+      v_4((offset + (v_15 * 32u)), obj[v_15]);
       {
-        v_10 = (v_11 + 1u);
+        v_14 = (v_15 + 1u);
       }
       continue;
     }
@@ -48,33 +52,33 @@
 }
 
 typedef matrix<float16_t, 4, 4> ary_ret[4];
-ary_ret v_12(uint start_byte_offset) {
+ary_ret v_16(uint start_byte_offset) {
   matrix<float16_t, 4, 4> a[4] = (matrix<float16_t, 4, 4>[4])0;
   {
-    uint v_13 = 0u;
-    v_13 = 0u;
+    uint v_17 = 0u;
+    v_17 = 0u;
     while(true) {
-      uint v_14 = v_13;
-      if ((v_14 >= 4u)) {
+      uint v_18 = v_17;
+      if ((v_18 >= 4u)) {
         break;
       }
-      a[v_14] = v_5((start_byte_offset + (v_14 * 32u)));
+      a[v_18] = v_5((start_byte_offset + (v_18 * 32u)));
       {
-        v_13 = (v_14 + 1u);
+        v_17 = (v_18 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 4, 4> v_15[4] = a;
-  return v_15;
+  matrix<float16_t, 4, 4> v_19[4] = a;
+  return v_19;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  matrix<float16_t, 4, 4> v_16[4] = v_12(0u);
-  v_9(0u, v_16);
+  matrix<float16_t, 4, 4> v_20[4] = v_16(0u);
+  v_13(0u, v_20);
   v_4(32u, v_5(64u));
-  s.Store<vector<float16_t, 4> >(32u, tint_bitcast_to_f16(u[0u]).ywxz);
+  s.Store<vector<float16_t, 4> >(32u, tint_bitcast_to_f16(u[0u].zw).ywxz);
   s.Store<float16_t>(32u, float16_t(f16tof32(u[0u].z)));
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
index a3f1ffc..1ffe2af 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
@@ -7,12 +7,12 @@
   uint4 u[8];
 };
 groupshared matrix<float16_t, 4, 4> w[4];
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -20,55 +20,59 @@
 }
 
 matrix<float16_t, 4, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy)));
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))));
 }
 
 typedef matrix<float16_t, 4, 4> ary_ret[4];
-ary_ret v_8(uint start_byte_offset) {
+ary_ret v_12(uint start_byte_offset) {
   matrix<float16_t, 4, 4> a[4] = (matrix<float16_t, 4, 4>[4])0;
   {
-    uint v_9 = 0u;
-    v_9 = 0u;
+    uint v_13 = 0u;
+    v_13 = 0u;
     while(true) {
-      uint v_10 = v_9;
-      if ((v_10 >= 4u)) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
         break;
       }
-      a[v_10] = v_4((start_byte_offset + (v_10 * 32u)));
+      a[v_14] = v_4((start_byte_offset + (v_14 * 32u)));
       {
-        v_9 = (v_10 + 1u);
+        v_13 = (v_14 + 1u);
       }
       continue;
     }
   }
-  matrix<float16_t, 4, 4> v_11[4] = a;
-  return v_11;
+  matrix<float16_t, 4, 4> v_15[4] = a;
+  return v_15;
 }
 
 void f_inner(uint tint_local_index) {
   {
-    uint v_12 = 0u;
-    v_12 = tint_local_index;
+    uint v_16 = 0u;
+    v_16 = tint_local_index;
     while(true) {
-      uint v_13 = v_12;
-      if ((v_13 >= 4u)) {
+      uint v_17 = v_16;
+      if ((v_17 >= 4u)) {
         break;
       }
-      w[v_13] = matrix<float16_t, 4, 4>((float16_t(0.0h)).xxxx, (float16_t(0.0h)).xxxx, (float16_t(0.0h)).xxxx, (float16_t(0.0h)).xxxx);
+      w[v_17] = matrix<float16_t, 4, 4>((float16_t(0.0h)).xxxx, (float16_t(0.0h)).xxxx, (float16_t(0.0h)).xxxx, (float16_t(0.0h)).xxxx);
       {
-        v_12 = (v_13 + 1u);
+        v_16 = (v_17 + 1u);
       }
       continue;
     }
   }
   GroupMemoryBarrierWithGroupSync();
-  matrix<float16_t, 4, 4> v_14[4] = v_8(0u);
-  w = v_14;
+  matrix<float16_t, 4, 4> v_18[4] = v_12(0u);
+  w = v_18;
   w[int(1)] = v_4(64u);
-  w[int(1)][int(0)] = tint_bitcast_to_f16(u[0u]).ywxz;
+  w[int(1)][int(0)] = tint_bitcast_to_f16(u[0u].zw).ywxz;
   w[int(1)][int(0)][0u] = float16_t(f16tof32(u[0u].z));
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 4dbfb64..1bb394d 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -25,83 +25,80 @@
 }
 
 matrix<float16_t, 2, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = a[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = a[((4u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 2, 2>(v_4, tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  return matrix<float16_t, 2, 2>(v_3, tint_bitcast_to_f16(a[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]));
 }
 
-Inner v_6(uint start_byte_offset) {
-  Inner v_7 = {v_2(start_byte_offset)};
-  return v_7;
+Inner v_4(uint start_byte_offset) {
+  Inner v_5 = {v_2(start_byte_offset)};
+  return v_5;
 }
 
 typedef Inner ary_ret[4];
-ary_ret v_8(uint start_byte_offset) {
+ary_ret v_6(uint start_byte_offset) {
   Inner a_2[4] = (Inner[4])0;
   {
-    uint v_9 = 0u;
-    v_9 = 0u;
+    uint v_7 = 0u;
+    v_7 = 0u;
     while(true) {
-      uint v_10 = v_9;
-      if ((v_10 >= 4u)) {
+      uint v_8 = v_7;
+      if ((v_8 >= 4u)) {
         break;
       }
-      Inner v_11 = v_6((start_byte_offset + (v_10 * 64u)));
-      a_2[v_10] = v_11;
+      Inner v_9 = v_4((start_byte_offset + (v_8 * 64u)));
+      a_2[v_8] = v_9;
       {
-        v_9 = (v_10 + 1u);
+        v_7 = (v_8 + 1u);
       }
       continue;
     }
   }
-  Inner v_12[4] = a_2;
-  return v_12;
+  Inner v_10[4] = a_2;
+  return v_10;
 }
 
-Outer v_13(uint start_byte_offset) {
-  Inner v_14[4] = v_8(start_byte_offset);
-  Outer v_15 = {v_14};
-  return v_15;
+Outer v_11(uint start_byte_offset) {
+  Inner v_12[4] = v_6(start_byte_offset);
+  Outer v_13 = {v_12};
+  return v_13;
 }
 
 typedef Outer ary_ret_1[4];
-ary_ret_1 v_16(uint start_byte_offset) {
+ary_ret_1 v_14(uint start_byte_offset) {
   Outer a_1[4] = (Outer[4])0;
   {
-    uint v_17 = 0u;
-    v_17 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_18 = v_17;
-      if ((v_18 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      Outer v_19 = v_13((start_byte_offset + (v_18 * 256u)));
-      a_1[v_18] = v_19;
+      Outer v_17 = v_11((start_byte_offset + (v_16 * 256u)));
+      a_1[v_16] = v_17;
       {
-        v_17 = (v_18 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  Outer v_20[4] = a_1;
-  return v_20;
+  Outer v_18[4] = a_1;
+  return v_18;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  uint v_21 = (256u * uint(i()));
-  uint v_22 = (64u * uint(i()));
-  uint v_23 = (4u * uint(i()));
-  Outer l_a[4] = v_16(0u);
-  Outer l_a_i = v_13(v_21);
-  Inner l_a_i_a[4] = v_8(v_21);
-  Inner l_a_i_a_i = v_6((v_21 + v_22));
-  matrix<float16_t, 2, 2> l_a_i_a_i_m = v_2((v_21 + v_22));
-  uint4 v_24 = a[(((v_21 + v_22) + v_23) / 16u)];
-  vector<float16_t, 2> l_a_i_a_i_m_i = tint_bitcast_to_f16((((((((v_21 + v_22) + v_23) % 16u) / 4u) == 2u)) ? (v_24.z) : (v_24.x)));
-  uint v_25 = (((v_21 + v_22) + v_23) + (uint(i()) * 2u));
-  uint v_26 = a[(v_25 / 16u)][((v_25 % 16u) / 4u)];
-  float16_t l_a_i_a_i_m_i_i = float16_t(f16tof32((v_26 >> ((((v_25 % 4u) == 0u)) ? (0u) : (16u)))));
+  uint v_19 = (256u * uint(i()));
+  uint v_20 = (64u * uint(i()));
+  uint v_21 = (4u * uint(i()));
+  Outer l_a[4] = v_14(0u);
+  Outer l_a_i = v_11(v_19);
+  Inner l_a_i_a[4] = v_6(v_19);
+  Inner l_a_i_a_i = v_4((v_19 + v_20));
+  matrix<float16_t, 2, 2> l_a_i_a_i_m = v_2((v_19 + v_20));
+  vector<float16_t, 2> l_a_i_a_i_m_i = tint_bitcast_to_f16(a[(((v_19 + v_20) + v_21) / 16u)][((((v_19 + v_20) + v_21) % 16u) / 4u)]);
+  uint v_22 = (((v_19 + v_20) + v_21) + (uint(i()) * 2u));
+  uint v_23 = a[(v_22 / 16u)][((v_22 % 16u) / 4u)];
+  float16_t l_a_i_a_i_m_i_i = float16_t(f16tof32((v_23 >> ((((v_22 % 4u) == 0u)) ? (0u) : (16u)))));
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 6fc158e..ce0cb64 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -19,77 +19,75 @@
 }
 
 matrix<float16_t, 2, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = a[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = a[((4u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 2, 2>(v_4, tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  return matrix<float16_t, 2, 2>(v_3, tint_bitcast_to_f16(a[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]));
 }
 
-Inner v_6(uint start_byte_offset) {
-  Inner v_7 = {v_2(start_byte_offset)};
-  return v_7;
+Inner v_4(uint start_byte_offset) {
+  Inner v_5 = {v_2(start_byte_offset)};
+  return v_5;
 }
 
 typedef Inner ary_ret[4];
-ary_ret v_8(uint start_byte_offset) {
+ary_ret v_6(uint start_byte_offset) {
   Inner a_2[4] = (Inner[4])0;
   {
-    uint v_9 = 0u;
-    v_9 = 0u;
+    uint v_7 = 0u;
+    v_7 = 0u;
     while(true) {
-      uint v_10 = v_9;
-      if ((v_10 >= 4u)) {
+      uint v_8 = v_7;
+      if ((v_8 >= 4u)) {
         break;
       }
-      Inner v_11 = v_6((start_byte_offset + (v_10 * 64u)));
-      a_2[v_10] = v_11;
+      Inner v_9 = v_4((start_byte_offset + (v_8 * 64u)));
+      a_2[v_8] = v_9;
       {
-        v_9 = (v_10 + 1u);
+        v_7 = (v_8 + 1u);
       }
       continue;
     }
   }
-  Inner v_12[4] = a_2;
-  return v_12;
+  Inner v_10[4] = a_2;
+  return v_10;
 }
 
-Outer v_13(uint start_byte_offset) {
-  Inner v_14[4] = v_8(start_byte_offset);
-  Outer v_15 = {v_14};
-  return v_15;
+Outer v_11(uint start_byte_offset) {
+  Inner v_12[4] = v_6(start_byte_offset);
+  Outer v_13 = {v_12};
+  return v_13;
 }
 
 typedef Outer ary_ret_1[4];
-ary_ret_1 v_16(uint start_byte_offset) {
+ary_ret_1 v_14(uint start_byte_offset) {
   Outer a_1[4] = (Outer[4])0;
   {
-    uint v_17 = 0u;
-    v_17 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_18 = v_17;
-      if ((v_18 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      Outer v_19 = v_13((start_byte_offset + (v_18 * 256u)));
-      a_1[v_18] = v_19;
+      Outer v_17 = v_11((start_byte_offset + (v_16 * 256u)));
+      a_1[v_16] = v_17;
       {
-        v_17 = (v_18 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  Outer v_20[4] = a_1;
-  return v_20;
+  Outer v_18[4] = a_1;
+  return v_18;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  Outer l_a[4] = v_16(0u);
-  Outer l_a_3 = v_13(768u);
-  Inner l_a_3_a[4] = v_8(768u);
-  Inner l_a_3_a_2 = v_6(896u);
+  Outer l_a[4] = v_14(0u);
+  Outer l_a_3 = v_11(768u);
+  Inner l_a_3_a[4] = v_6(768u);
+  Inner l_a_3_a_2 = v_4(896u);
   matrix<float16_t, 2, 2> l_a_3_a_2_m = v_2(896u);
-  vector<float16_t, 2> l_a_3_a_2_m_1 = tint_bitcast_to_f16(a[56u].x);
+  vector<float16_t, 2> l_a_3_a_2_m_1 = tint_bitcast_to_f16(a[56u].y);
   float16_t l_a_3_a_2_m_1_0 = float16_t(f16tof32(a[56u].y));
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
index 934a47a..07d74a6 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
@@ -11,10 +11,8 @@
 }
 
 matrix<float16_t, 2, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 2, 2>(v_4, tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  return matrix<float16_t, 2, 2>(v_3, tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl
index 37dceb9..f671a4a 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl
@@ -32,48 +32,46 @@
 }
 
 matrix<float16_t, 2, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 2, 2>(v_4, tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  return matrix<float16_t, 2, 2>(v_3, tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]));
 }
 
-S v_6(uint start_byte_offset) {
-  int v_7 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 2, 2> v_8 = v_2((4u + start_byte_offset));
-  S v_9 = {v_7, v_8, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_9;
+S v_4(uint start_byte_offset) {
+  int v_5 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 2, 2> v_6 = v_2((4u + start_byte_offset));
+  S v_7 = {v_5, v_6, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_7;
 }
 
 typedef S ary_ret[4];
-ary_ret v_10(uint start_byte_offset) {
+ary_ret v_8(uint start_byte_offset) {
   S a_2[4] = (S[4])0;
   {
-    uint v_11 = 0u;
-    v_11 = 0u;
+    uint v_9 = 0u;
+    v_9 = 0u;
     while(true) {
-      uint v_12 = v_11;
-      if ((v_12 >= 4u)) {
+      uint v_10 = v_9;
+      if ((v_10 >= 4u)) {
         break;
       }
-      S v_13 = v_6((start_byte_offset + (v_12 * 128u)));
-      a_2[v_12] = v_13;
+      S v_11 = v_4((start_byte_offset + (v_10 * 128u)));
+      a_2[v_10] = v_11;
       {
-        v_11 = (v_12 + 1u);
+        v_9 = (v_10 + 1u);
       }
       continue;
     }
   }
-  S v_14[4] = a_2;
-  return v_14;
+  S v_12[4] = a_2;
+  return v_12;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_15[4] = v_10(0u);
-  a(v_15);
-  S v_16 = v_6(256u);
-  b(v_16);
+  S v_13[4] = v_8(0u);
+  a(v_13);
+  S v_14 = v_4(256u);
+  b(v_14);
   c(v_2(260u));
   d(tint_bitcast_to_f16(u[0u].z).yx);
   e(tint_bitcast_to_f16(u[0u].z).yx[0u]);
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_private.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_private.wgsl.expected.ir.dxc.hlsl
index 0699372..42a8628 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_private.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_private.wgsl.expected.ir.dxc.hlsl
@@ -18,48 +18,46 @@
 }
 
 matrix<float16_t, 2, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 2, 2>(v_4, tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  return matrix<float16_t, 2, 2>(v_3, tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]));
 }
 
-S v_6(uint start_byte_offset) {
-  int v_7 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 2, 2> v_8 = v_2((4u + start_byte_offset));
-  S v_9 = {v_7, v_8, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_9;
+S v_4(uint start_byte_offset) {
+  int v_5 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 2, 2> v_6 = v_2((4u + start_byte_offset));
+  S v_7 = {v_5, v_6, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_7;
 }
 
 typedef S ary_ret[4];
-ary_ret v_10(uint start_byte_offset) {
+ary_ret v_8(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
-    uint v_11 = 0u;
-    v_11 = 0u;
+    uint v_9 = 0u;
+    v_9 = 0u;
     while(true) {
-      uint v_12 = v_11;
-      if ((v_12 >= 4u)) {
+      uint v_10 = v_9;
+      if ((v_10 >= 4u)) {
         break;
       }
-      S v_13 = v_6((start_byte_offset + (v_12 * 128u)));
-      a[v_12] = v_13;
+      S v_11 = v_4((start_byte_offset + (v_10 * 128u)));
+      a[v_10] = v_11;
       {
-        v_11 = (v_12 + 1u);
+        v_9 = (v_10 + 1u);
       }
       continue;
     }
   }
-  S v_14[4] = a;
-  return v_14;
+  S v_12[4] = a;
+  return v_12;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_15[4] = v_10(0u);
-  p = v_15;
-  S v_16 = v_6(256u);
-  p[int(1)] = v_16;
+  S v_13[4] = v_8(0u);
+  p = v_13;
+  S v_14 = v_4(256u);
+  p[int(1)] = v_14;
   p[int(3)].m = v_2(260u);
   p[int(1)].m[int(0)] = tint_bitcast_to_f16(u[0u].z).yx;
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl
index 4996138..ca1d177 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl
@@ -23,38 +23,36 @@
 }
 
 matrix<float16_t, 2, 2> v_3(uint start_byte_offset) {
-  uint4 v_4 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_5 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_4.z) : (v_4.x)));
-  uint4 v_6 = u[((4u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 2, 2>(v_5, tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_6.z) : (v_6.x))));
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  return matrix<float16_t, 2, 2>(v_4, tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]));
 }
 
-void v_7(uint offset, S obj) {
+void v_5(uint offset, S obj) {
   s.Store((offset + 0u), asuint(obj.before));
   v_2((offset + 4u), obj.m);
   s.Store((offset + 64u), asuint(obj.after));
 }
 
-S v_8(uint start_byte_offset) {
-  int v_9 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 2, 2> v_10 = v_3((4u + start_byte_offset));
-  S v_11 = {v_9, v_10, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_11;
+S v_6(uint start_byte_offset) {
+  int v_7 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 2, 2> v_8 = v_3((4u + start_byte_offset));
+  S v_9 = {v_7, v_8, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_9;
 }
 
-void v_12(uint offset, S obj[4]) {
+void v_10(uint offset, S obj[4]) {
   {
-    uint v_13 = 0u;
-    v_13 = 0u;
+    uint v_11 = 0u;
+    v_11 = 0u;
     while(true) {
-      uint v_14 = v_13;
-      if ((v_14 >= 4u)) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
         break;
       }
-      S v_15 = obj[v_14];
-      v_7((offset + (v_14 * 128u)), v_15);
+      S v_13 = obj[v_12];
+      v_5((offset + (v_12 * 128u)), v_13);
       {
-        v_13 = (v_14 + 1u);
+        v_11 = (v_12 + 1u);
       }
       continue;
     }
@@ -62,34 +60,34 @@
 }
 
 typedef S ary_ret[4];
-ary_ret v_16(uint start_byte_offset) {
+ary_ret v_14(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
-    uint v_17 = 0u;
-    v_17 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_18 = v_17;
-      if ((v_18 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      S v_19 = v_8((start_byte_offset + (v_18 * 128u)));
-      a[v_18] = v_19;
+      S v_17 = v_6((start_byte_offset + (v_16 * 128u)));
+      a[v_16] = v_17;
       {
-        v_17 = (v_18 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  S v_20[4] = a;
-  return v_20;
+  S v_18[4] = a;
+  return v_18;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_21[4] = v_16(0u);
-  v_12(0u, v_21);
-  S v_22 = v_8(256u);
-  v_7(128u, v_22);
+  S v_19[4] = v_14(0u);
+  v_10(0u, v_19);
+  S v_20 = v_6(256u);
+  v_5(128u, v_20);
   v_2(388u, v_3(260u));
   s.Store<vector<float16_t, 2> >(132u, tint_bitcast_to_f16(u[0u].z).yx);
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
index a65ddf1..c08096b 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
@@ -22,64 +22,62 @@
 }
 
 matrix<float16_t, 2, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 2, 2>(v_4, tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  return matrix<float16_t, 2, 2>(v_3, tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]));
 }
 
-S v_6(uint start_byte_offset) {
-  int v_7 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 2, 2> v_8 = v_2((4u + start_byte_offset));
-  S v_9 = {v_7, v_8, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_9;
+S v_4(uint start_byte_offset) {
+  int v_5 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 2, 2> v_6 = v_2((4u + start_byte_offset));
+  S v_7 = {v_5, v_6, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_7;
 }
 
 typedef S ary_ret[4];
-ary_ret v_10(uint start_byte_offset) {
+ary_ret v_8(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
-    uint v_11 = 0u;
-    v_11 = 0u;
+    uint v_9 = 0u;
+    v_9 = 0u;
     while(true) {
-      uint v_12 = v_11;
-      if ((v_12 >= 4u)) {
+      uint v_10 = v_9;
+      if ((v_10 >= 4u)) {
         break;
       }
-      S v_13 = v_6((start_byte_offset + (v_12 * 128u)));
-      a[v_12] = v_13;
+      S v_11 = v_4((start_byte_offset + (v_10 * 128u)));
+      a[v_10] = v_11;
       {
-        v_11 = (v_12 + 1u);
+        v_9 = (v_10 + 1u);
       }
       continue;
     }
   }
-  S v_14[4] = a;
-  return v_14;
+  S v_12[4] = a;
+  return v_12;
 }
 
 void f_inner(uint tint_local_index) {
   {
-    uint v_15 = 0u;
-    v_15 = tint_local_index;
+    uint v_13 = 0u;
+    v_13 = tint_local_index;
     while(true) {
-      uint v_16 = v_15;
-      if ((v_16 >= 4u)) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
         break;
       }
-      S v_17 = (S)0;
-      w[v_16] = v_17;
+      S v_15 = (S)0;
+      w[v_14] = v_15;
       {
-        v_15 = (v_16 + 1u);
+        v_13 = (v_14 + 1u);
       }
       continue;
     }
   }
   GroupMemoryBarrierWithGroupSync();
-  S v_18[4] = v_10(0u);
-  w = v_18;
-  S v_19 = v_6(256u);
-  w[int(1)] = v_19;
+  S v_16[4] = v_8(0u);
+  w = v_16;
+  S v_17 = v_4(256u);
+  w[int(1)] = v_17;
   w[int(3)].m = v_2(260u);
   w[int(1)].m[int(0)] = tint_bitcast_to_f16(u[0u].z).yx;
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 9632b91..61e9f7e 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -16,12 +16,12 @@
   return counter;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -29,80 +29,83 @@
 }
 
 matrix<float16_t, 2, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_5, tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = a[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz);
 }
 
-Inner v_6(uint start_byte_offset) {
-  Inner v_7 = {v_4(start_byte_offset)};
-  return v_7;
+Inner v_8(uint start_byte_offset) {
+  Inner v_9 = {v_4(start_byte_offset)};
+  return v_9;
 }
 
 typedef Inner ary_ret[4];
-ary_ret v_8(uint start_byte_offset) {
+ary_ret v_10(uint start_byte_offset) {
   Inner a_2[4] = (Inner[4])0;
   {
-    uint v_9 = 0u;
-    v_9 = 0u;
+    uint v_11 = 0u;
+    v_11 = 0u;
     while(true) {
-      uint v_10 = v_9;
-      if ((v_10 >= 4u)) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
         break;
       }
-      Inner v_11 = v_6((start_byte_offset + (v_10 * 64u)));
-      a_2[v_10] = v_11;
+      Inner v_13 = v_8((start_byte_offset + (v_12 * 64u)));
+      a_2[v_12] = v_13;
       {
-        v_9 = (v_10 + 1u);
+        v_11 = (v_12 + 1u);
       }
       continue;
     }
   }
-  Inner v_12[4] = a_2;
-  return v_12;
+  Inner v_14[4] = a_2;
+  return v_14;
 }
 
-Outer v_13(uint start_byte_offset) {
-  Inner v_14[4] = v_8(start_byte_offset);
-  Outer v_15 = {v_14};
-  return v_15;
+Outer v_15(uint start_byte_offset) {
+  Inner v_16[4] = v_10(start_byte_offset);
+  Outer v_17 = {v_16};
+  return v_17;
 }
 
 typedef Outer ary_ret_1[4];
-ary_ret_1 v_16(uint start_byte_offset) {
+ary_ret_1 v_18(uint start_byte_offset) {
   Outer a_1[4] = (Outer[4])0;
   {
-    uint v_17 = 0u;
-    v_17 = 0u;
+    uint v_19 = 0u;
+    v_19 = 0u;
     while(true) {
-      uint v_18 = v_17;
-      if ((v_18 >= 4u)) {
+      uint v_20 = v_19;
+      if ((v_20 >= 4u)) {
         break;
       }
-      Outer v_19 = v_13((start_byte_offset + (v_18 * 256u)));
-      a_1[v_18] = v_19;
+      Outer v_21 = v_15((start_byte_offset + (v_20 * 256u)));
+      a_1[v_20] = v_21;
       {
-        v_17 = (v_18 + 1u);
+        v_19 = (v_20 + 1u);
       }
       continue;
     }
   }
-  Outer v_20[4] = a_1;
-  return v_20;
+  Outer v_22[4] = a_1;
+  return v_22;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  uint v_21 = (256u * uint(i()));
-  uint v_22 = (64u * uint(i()));
-  uint v_23 = (8u * uint(i()));
-  Outer l_a[4] = v_16(0u);
-  Outer l_a_i = v_13(v_21);
-  Inner l_a_i_a[4] = v_8(v_21);
-  Inner l_a_i_a_i = v_6((v_21 + v_22));
-  matrix<float16_t, 2, 3> l_a_i_a_i_m = v_4((v_21 + v_22));
-  vector<float16_t, 3> l_a_i_a_i_m_i = tint_bitcast_to_f16(a[(((v_21 + v_22) + v_23) / 16u)]).xyz;
-  uint v_24 = (((v_21 + v_22) + v_23) + (uint(i()) * 2u));
-  uint v_25 = a[(v_24 / 16u)][((v_24 % 16u) / 4u)];
-  float16_t l_a_i_a_i_m_i_i = float16_t(f16tof32((v_25 >> ((((v_24 % 4u) == 0u)) ? (0u) : (16u)))));
+  uint v_23 = (256u * uint(i()));
+  uint v_24 = (64u * uint(i()));
+  uint v_25 = (8u * uint(i()));
+  Outer l_a[4] = v_18(0u);
+  Outer l_a_i = v_15(v_23);
+  Inner l_a_i_a[4] = v_10(v_23);
+  Inner l_a_i_a_i = v_8((v_23 + v_24));
+  matrix<float16_t, 2, 3> l_a_i_a_i_m = v_4((v_23 + v_24));
+  uint4 v_26 = a[(((v_23 + v_24) + v_25) / 16u)];
+  vector<float16_t, 3> l_a_i_a_i_m_i = tint_bitcast_to_f16((((((((v_23 + v_24) + v_25) % 16u) / 4u) == 2u)) ? (v_26.zw) : (v_26.xy))).xyz;
+  uint v_27 = (((v_23 + v_24) + v_25) + (uint(i()) * 2u));
+  uint v_28 = a[(v_27 / 16u)][((v_27 % 16u) / 4u)];
+  float16_t l_a_i_a_i_m_i_i = float16_t(f16tof32((v_28 >> ((((v_27 % 4u) == 0u)) ? (0u) : (16u)))));
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index bb7ed5b..7c78d88 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -10,12 +10,12 @@
 cbuffer cbuffer_a : register(b0) {
   uint4 a[64];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -23,75 +23,77 @@
 }
 
 matrix<float16_t, 2, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_5, tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = a[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz);
 }
 
-Inner v_6(uint start_byte_offset) {
-  Inner v_7 = {v_4(start_byte_offset)};
-  return v_7;
+Inner v_8(uint start_byte_offset) {
+  Inner v_9 = {v_4(start_byte_offset)};
+  return v_9;
 }
 
 typedef Inner ary_ret[4];
-ary_ret v_8(uint start_byte_offset) {
+ary_ret v_10(uint start_byte_offset) {
   Inner a_2[4] = (Inner[4])0;
   {
-    uint v_9 = 0u;
-    v_9 = 0u;
+    uint v_11 = 0u;
+    v_11 = 0u;
     while(true) {
-      uint v_10 = v_9;
-      if ((v_10 >= 4u)) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
         break;
       }
-      Inner v_11 = v_6((start_byte_offset + (v_10 * 64u)));
-      a_2[v_10] = v_11;
+      Inner v_13 = v_8((start_byte_offset + (v_12 * 64u)));
+      a_2[v_12] = v_13;
       {
-        v_9 = (v_10 + 1u);
+        v_11 = (v_12 + 1u);
       }
       continue;
     }
   }
-  Inner v_12[4] = a_2;
-  return v_12;
+  Inner v_14[4] = a_2;
+  return v_14;
 }
 
-Outer v_13(uint start_byte_offset) {
-  Inner v_14[4] = v_8(start_byte_offset);
-  Outer v_15 = {v_14};
-  return v_15;
+Outer v_15(uint start_byte_offset) {
+  Inner v_16[4] = v_10(start_byte_offset);
+  Outer v_17 = {v_16};
+  return v_17;
 }
 
 typedef Outer ary_ret_1[4];
-ary_ret_1 v_16(uint start_byte_offset) {
+ary_ret_1 v_18(uint start_byte_offset) {
   Outer a_1[4] = (Outer[4])0;
   {
-    uint v_17 = 0u;
-    v_17 = 0u;
+    uint v_19 = 0u;
+    v_19 = 0u;
     while(true) {
-      uint v_18 = v_17;
-      if ((v_18 >= 4u)) {
+      uint v_20 = v_19;
+      if ((v_20 >= 4u)) {
         break;
       }
-      Outer v_19 = v_13((start_byte_offset + (v_18 * 256u)));
-      a_1[v_18] = v_19;
+      Outer v_21 = v_15((start_byte_offset + (v_20 * 256u)));
+      a_1[v_20] = v_21;
       {
-        v_17 = (v_18 + 1u);
+        v_19 = (v_20 + 1u);
       }
       continue;
     }
   }
-  Outer v_20[4] = a_1;
-  return v_20;
+  Outer v_22[4] = a_1;
+  return v_22;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  Outer l_a[4] = v_16(0u);
-  Outer l_a_3 = v_13(768u);
-  Inner l_a_3_a[4] = v_8(768u);
-  Inner l_a_3_a_2 = v_6(896u);
+  Outer l_a[4] = v_18(0u);
+  Outer l_a_3 = v_15(768u);
+  Inner l_a_3_a[4] = v_10(768u);
+  Inner l_a_3_a_2 = v_8(896u);
   matrix<float16_t, 2, 3> l_a_3_a_2_m = v_4(896u);
-  vector<float16_t, 3> l_a_3_a_2_m_1 = tint_bitcast_to_f16(a[56u]).xyz;
+  vector<float16_t, 3> l_a_3_a_2_m_1 = tint_bitcast_to_f16(a[56u].zw).xyz;
   float16_t l_a_3_a_2_m_1_0 = float16_t(f16tof32(a[56u].z));
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
index 3e54141..6c99e09 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
@@ -2,12 +2,12 @@
 cbuffer cbuffer_u : register(b0) {
   uint4 u[32];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -15,14 +15,16 @@
 }
 
 matrix<float16_t, 2, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 3, 2> t = transpose(v_4(264u));
-  float16_t l = length(tint_bitcast_to_f16(u[1u]).xyz.zxy);
-  float16_t a = abs(tint_bitcast_to_f16(u[1u]).xyz.zxy[0u]);
+  float16_t l = length(tint_bitcast_to_f16(u[1u].xy).xyz.zxy);
+  float16_t a = abs(tint_bitcast_to_f16(u[1u].xy).xyz.zxy[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
index bb4115e..9997f0b 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
@@ -23,12 +23,12 @@
 void e(float16_t f_1) {
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -36,48 +36,50 @@
 }
 
 matrix<float16_t, 2, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz);
 }
 
-S v_6(uint start_byte_offset) {
-  int v_7 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 2, 3> v_8 = v_4((8u + start_byte_offset));
-  S v_9 = {v_7, v_8, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_9;
+S v_8(uint start_byte_offset) {
+  int v_9 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 2, 3> v_10 = v_4((8u + start_byte_offset));
+  S v_11 = {v_9, v_10, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_11;
 }
 
 typedef S ary_ret[4];
-ary_ret v_10(uint start_byte_offset) {
+ary_ret v_12(uint start_byte_offset) {
   S a_2[4] = (S[4])0;
   {
-    uint v_11 = 0u;
-    v_11 = 0u;
+    uint v_13 = 0u;
+    v_13 = 0u;
     while(true) {
-      uint v_12 = v_11;
-      if ((v_12 >= 4u)) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
         break;
       }
-      S v_13 = v_6((start_byte_offset + (v_12 * 128u)));
-      a_2[v_12] = v_13;
+      S v_15 = v_8((start_byte_offset + (v_14 * 128u)));
+      a_2[v_14] = v_15;
       {
-        v_11 = (v_12 + 1u);
+        v_13 = (v_14 + 1u);
       }
       continue;
     }
   }
-  S v_14[4] = a_2;
-  return v_14;
+  S v_16[4] = a_2;
+  return v_16;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_15[4] = v_10(0u);
-  a(v_15);
-  S v_16 = v_6(256u);
-  b(v_16);
+  S v_17[4] = v_12(0u);
+  a(v_17);
+  S v_18 = v_8(256u);
+  b(v_18);
   c(v_4(264u));
-  d(tint_bitcast_to_f16(u[1u]).xyz.zxy);
-  e(tint_bitcast_to_f16(u[1u]).xyz.zxy[0u]);
+  d(tint_bitcast_to_f16(u[1u].xy).xyz.zxy);
+  e(tint_bitcast_to_f16(u[1u].xy).xyz.zxy[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_private.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
index b1ae6d1..7550160 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
@@ -9,12 +9,12 @@
   uint4 u[32];
 };
 static S p[4] = (S[4])0;
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -22,47 +22,49 @@
 }
 
 matrix<float16_t, 2, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz);
 }
 
-S v_6(uint start_byte_offset) {
-  int v_7 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 2, 3> v_8 = v_4((8u + start_byte_offset));
-  S v_9 = {v_7, v_8, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_9;
+S v_8(uint start_byte_offset) {
+  int v_9 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 2, 3> v_10 = v_4((8u + start_byte_offset));
+  S v_11 = {v_9, v_10, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_11;
 }
 
 typedef S ary_ret[4];
-ary_ret v_10(uint start_byte_offset) {
+ary_ret v_12(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
-    uint v_11 = 0u;
-    v_11 = 0u;
+    uint v_13 = 0u;
+    v_13 = 0u;
     while(true) {
-      uint v_12 = v_11;
-      if ((v_12 >= 4u)) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
         break;
       }
-      S v_13 = v_6((start_byte_offset + (v_12 * 128u)));
-      a[v_12] = v_13;
+      S v_15 = v_8((start_byte_offset + (v_14 * 128u)));
+      a[v_14] = v_15;
       {
-        v_11 = (v_12 + 1u);
+        v_13 = (v_14 + 1u);
       }
       continue;
     }
   }
-  S v_14[4] = a;
-  return v_14;
+  S v_16[4] = a;
+  return v_16;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_15[4] = v_10(0u);
-  p = v_15;
-  S v_16 = v_6(256u);
-  p[int(1)] = v_16;
+  S v_17[4] = v_12(0u);
+  p = v_17;
+  S v_18 = v_8(256u);
+  p[int(1)] = v_18;
   p[int(3)].m = v_4(264u);
-  p[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u]).xyz.zxy;
+  p[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u].xy).xyz.zxy;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
index 42f1cc0..dea8596 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
@@ -9,12 +9,12 @@
   uint4 u[32];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -27,36 +27,38 @@
 }
 
 matrix<float16_t, 2, 3> v_5(uint start_byte_offset) {
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_6, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_6 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.zw) : (v_6.xy))).xyz;
+  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_7, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy))).xyz);
 }
 
-void v_7(uint offset, S obj) {
+void v_9(uint offset, S obj) {
   s.Store((offset + 0u), asuint(obj.before));
   v_4((offset + 8u), obj.m);
   s.Store((offset + 64u), asuint(obj.after));
 }
 
-S v_8(uint start_byte_offset) {
-  int v_9 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 2, 3> v_10 = v_5((8u + start_byte_offset));
-  S v_11 = {v_9, v_10, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_11;
+S v_10(uint start_byte_offset) {
+  int v_11 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 2, 3> v_12 = v_5((8u + start_byte_offset));
+  S v_13 = {v_11, v_12, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_13;
 }
 
-void v_12(uint offset, S obj[4]) {
+void v_14(uint offset, S obj[4]) {
   {
-    uint v_13 = 0u;
-    v_13 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_14 = v_13;
-      if ((v_14 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      S v_15 = obj[v_14];
-      v_7((offset + (v_14 * 128u)), v_15);
+      S v_17 = obj[v_16];
+      v_9((offset + (v_16 * 128u)), v_17);
       {
-        v_13 = (v_14 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
@@ -64,35 +66,35 @@
 }
 
 typedef S ary_ret[4];
-ary_ret v_16(uint start_byte_offset) {
+ary_ret v_18(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
-    uint v_17 = 0u;
-    v_17 = 0u;
+    uint v_19 = 0u;
+    v_19 = 0u;
     while(true) {
-      uint v_18 = v_17;
-      if ((v_18 >= 4u)) {
+      uint v_20 = v_19;
+      if ((v_20 >= 4u)) {
         break;
       }
-      S v_19 = v_8((start_byte_offset + (v_18 * 128u)));
-      a[v_18] = v_19;
+      S v_21 = v_10((start_byte_offset + (v_20 * 128u)));
+      a[v_20] = v_21;
       {
-        v_17 = (v_18 + 1u);
+        v_19 = (v_20 + 1u);
       }
       continue;
     }
   }
-  S v_20[4] = a;
-  return v_20;
+  S v_22[4] = a;
+  return v_22;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_21[4] = v_16(0u);
-  v_12(0u, v_21);
-  S v_22 = v_8(256u);
-  v_7(128u, v_22);
+  S v_23[4] = v_18(0u);
+  v_14(0u, v_23);
+  S v_24 = v_10(256u);
+  v_9(128u, v_24);
   v_4(392u, v_5(264u));
-  s.Store<vector<float16_t, 3> >(136u, tint_bitcast_to_f16(u[1u]).xyz.zxy);
+  s.Store<vector<float16_t, 3> >(136u, tint_bitcast_to_f16(u[1u].xy).xyz.zxy);
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
index cfa3240..f3c94e9 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
@@ -13,12 +13,12 @@
   uint4 u[32];
 };
 groupshared S w[4];
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -26,64 +26,66 @@
 }
 
 matrix<float16_t, 2, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz);
 }
 
-S v_6(uint start_byte_offset) {
-  int v_7 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 2, 3> v_8 = v_4((8u + start_byte_offset));
-  S v_9 = {v_7, v_8, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_9;
+S v_8(uint start_byte_offset) {
+  int v_9 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 2, 3> v_10 = v_4((8u + start_byte_offset));
+  S v_11 = {v_9, v_10, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_11;
 }
 
 typedef S ary_ret[4];
-ary_ret v_10(uint start_byte_offset) {
+ary_ret v_12(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
-    uint v_11 = 0u;
-    v_11 = 0u;
+    uint v_13 = 0u;
+    v_13 = 0u;
     while(true) {
-      uint v_12 = v_11;
-      if ((v_12 >= 4u)) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
         break;
       }
-      S v_13 = v_6((start_byte_offset + (v_12 * 128u)));
-      a[v_12] = v_13;
+      S v_15 = v_8((start_byte_offset + (v_14 * 128u)));
+      a[v_14] = v_15;
       {
-        v_11 = (v_12 + 1u);
+        v_13 = (v_14 + 1u);
       }
       continue;
     }
   }
-  S v_14[4] = a;
-  return v_14;
+  S v_16[4] = a;
+  return v_16;
 }
 
 void f_inner(uint tint_local_index) {
   {
-    uint v_15 = 0u;
-    v_15 = tint_local_index;
+    uint v_17 = 0u;
+    v_17 = tint_local_index;
     while(true) {
-      uint v_16 = v_15;
-      if ((v_16 >= 4u)) {
+      uint v_18 = v_17;
+      if ((v_18 >= 4u)) {
         break;
       }
-      S v_17 = (S)0;
-      w[v_16] = v_17;
+      S v_19 = (S)0;
+      w[v_18] = v_19;
       {
-        v_15 = (v_16 + 1u);
+        v_17 = (v_18 + 1u);
       }
       continue;
     }
   }
   GroupMemoryBarrierWithGroupSync();
-  S v_18[4] = v_10(0u);
-  w = v_18;
-  S v_19 = v_6(256u);
-  w[int(1)] = v_19;
+  S v_20[4] = v_12(0u);
+  w = v_20;
+  S v_21 = v_8(256u);
+  w[int(1)] = v_21;
   w[int(3)].m = v_4(264u);
-  w[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u]).xyz.zxy;
+  w[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u].xy).xyz.zxy;
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 7c4ea56..f4b8ea3 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -16,12 +16,12 @@
   return counter;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -29,80 +29,83 @@
 }
 
 matrix<float16_t, 2, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_5, tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)]));
+  uint4 v_5 = a[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))));
 }
 
-Inner v_6(uint start_byte_offset) {
-  Inner v_7 = {v_4(start_byte_offset)};
-  return v_7;
+Inner v_8(uint start_byte_offset) {
+  Inner v_9 = {v_4(start_byte_offset)};
+  return v_9;
 }
 
 typedef Inner ary_ret[4];
-ary_ret v_8(uint start_byte_offset) {
+ary_ret v_10(uint start_byte_offset) {
   Inner a_2[4] = (Inner[4])0;
   {
-    uint v_9 = 0u;
-    v_9 = 0u;
+    uint v_11 = 0u;
+    v_11 = 0u;
     while(true) {
-      uint v_10 = v_9;
-      if ((v_10 >= 4u)) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
         break;
       }
-      Inner v_11 = v_6((start_byte_offset + (v_10 * 64u)));
-      a_2[v_10] = v_11;
+      Inner v_13 = v_8((start_byte_offset + (v_12 * 64u)));
+      a_2[v_12] = v_13;
       {
-        v_9 = (v_10 + 1u);
+        v_11 = (v_12 + 1u);
       }
       continue;
     }
   }
-  Inner v_12[4] = a_2;
-  return v_12;
+  Inner v_14[4] = a_2;
+  return v_14;
 }
 
-Outer v_13(uint start_byte_offset) {
-  Inner v_14[4] = v_8(start_byte_offset);
-  Outer v_15 = {v_14};
-  return v_15;
+Outer v_15(uint start_byte_offset) {
+  Inner v_16[4] = v_10(start_byte_offset);
+  Outer v_17 = {v_16};
+  return v_17;
 }
 
 typedef Outer ary_ret_1[4];
-ary_ret_1 v_16(uint start_byte_offset) {
+ary_ret_1 v_18(uint start_byte_offset) {
   Outer a_1[4] = (Outer[4])0;
   {
-    uint v_17 = 0u;
-    v_17 = 0u;
+    uint v_19 = 0u;
+    v_19 = 0u;
     while(true) {
-      uint v_18 = v_17;
-      if ((v_18 >= 4u)) {
+      uint v_20 = v_19;
+      if ((v_20 >= 4u)) {
         break;
       }
-      Outer v_19 = v_13((start_byte_offset + (v_18 * 256u)));
-      a_1[v_18] = v_19;
+      Outer v_21 = v_15((start_byte_offset + (v_20 * 256u)));
+      a_1[v_20] = v_21;
       {
-        v_17 = (v_18 + 1u);
+        v_19 = (v_20 + 1u);
       }
       continue;
     }
   }
-  Outer v_20[4] = a_1;
-  return v_20;
+  Outer v_22[4] = a_1;
+  return v_22;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  uint v_21 = (256u * uint(i()));
-  uint v_22 = (64u * uint(i()));
-  uint v_23 = (8u * uint(i()));
-  Outer l_a[4] = v_16(0u);
-  Outer l_a_i = v_13(v_21);
-  Inner l_a_i_a[4] = v_8(v_21);
-  Inner l_a_i_a_i = v_6((v_21 + v_22));
-  matrix<float16_t, 2, 4> l_a_i_a_i_m = v_4((v_21 + v_22));
-  vector<float16_t, 4> l_a_i_a_i_m_i = tint_bitcast_to_f16(a[(((v_21 + v_22) + v_23) / 16u)]);
-  uint v_24 = (((v_21 + v_22) + v_23) + (uint(i()) * 2u));
-  uint v_25 = a[(v_24 / 16u)][((v_24 % 16u) / 4u)];
-  float16_t l_a_i_a_i_m_i_i = float16_t(f16tof32((v_25 >> ((((v_24 % 4u) == 0u)) ? (0u) : (16u)))));
+  uint v_23 = (256u * uint(i()));
+  uint v_24 = (64u * uint(i()));
+  uint v_25 = (8u * uint(i()));
+  Outer l_a[4] = v_18(0u);
+  Outer l_a_i = v_15(v_23);
+  Inner l_a_i_a[4] = v_10(v_23);
+  Inner l_a_i_a_i = v_8((v_23 + v_24));
+  matrix<float16_t, 2, 4> l_a_i_a_i_m = v_4((v_23 + v_24));
+  uint4 v_26 = a[(((v_23 + v_24) + v_25) / 16u)];
+  vector<float16_t, 4> l_a_i_a_i_m_i = tint_bitcast_to_f16((((((((v_23 + v_24) + v_25) % 16u) / 4u) == 2u)) ? (v_26.zw) : (v_26.xy)));
+  uint v_27 = (((v_23 + v_24) + v_25) + (uint(i()) * 2u));
+  uint v_28 = a[(v_27 / 16u)][((v_27 % 16u) / 4u)];
+  float16_t l_a_i_a_i_m_i_i = float16_t(f16tof32((v_28 >> ((((v_27 % 4u) == 0u)) ? (0u) : (16u)))));
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 91a8bda..5749d57 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -10,12 +10,12 @@
 cbuffer cbuffer_a : register(b0) {
   uint4 a[64];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -23,75 +23,77 @@
 }
 
 matrix<float16_t, 2, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_5, tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)]));
+  uint4 v_5 = a[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))));
 }
 
-Inner v_6(uint start_byte_offset) {
-  Inner v_7 = {v_4(start_byte_offset)};
-  return v_7;
+Inner v_8(uint start_byte_offset) {
+  Inner v_9 = {v_4(start_byte_offset)};
+  return v_9;
 }
 
 typedef Inner ary_ret[4];
-ary_ret v_8(uint start_byte_offset) {
+ary_ret v_10(uint start_byte_offset) {
   Inner a_2[4] = (Inner[4])0;
   {
-    uint v_9 = 0u;
-    v_9 = 0u;
+    uint v_11 = 0u;
+    v_11 = 0u;
     while(true) {
-      uint v_10 = v_9;
-      if ((v_10 >= 4u)) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
         break;
       }
-      Inner v_11 = v_6((start_byte_offset + (v_10 * 64u)));
-      a_2[v_10] = v_11;
+      Inner v_13 = v_8((start_byte_offset + (v_12 * 64u)));
+      a_2[v_12] = v_13;
       {
-        v_9 = (v_10 + 1u);
+        v_11 = (v_12 + 1u);
       }
       continue;
     }
   }
-  Inner v_12[4] = a_2;
-  return v_12;
+  Inner v_14[4] = a_2;
+  return v_14;
 }
 
-Outer v_13(uint start_byte_offset) {
-  Inner v_14[4] = v_8(start_byte_offset);
-  Outer v_15 = {v_14};
-  return v_15;
+Outer v_15(uint start_byte_offset) {
+  Inner v_16[4] = v_10(start_byte_offset);
+  Outer v_17 = {v_16};
+  return v_17;
 }
 
 typedef Outer ary_ret_1[4];
-ary_ret_1 v_16(uint start_byte_offset) {
+ary_ret_1 v_18(uint start_byte_offset) {
   Outer a_1[4] = (Outer[4])0;
   {
-    uint v_17 = 0u;
-    v_17 = 0u;
+    uint v_19 = 0u;
+    v_19 = 0u;
     while(true) {
-      uint v_18 = v_17;
-      if ((v_18 >= 4u)) {
+      uint v_20 = v_19;
+      if ((v_20 >= 4u)) {
         break;
       }
-      Outer v_19 = v_13((start_byte_offset + (v_18 * 256u)));
-      a_1[v_18] = v_19;
+      Outer v_21 = v_15((start_byte_offset + (v_20 * 256u)));
+      a_1[v_20] = v_21;
       {
-        v_17 = (v_18 + 1u);
+        v_19 = (v_20 + 1u);
       }
       continue;
     }
   }
-  Outer v_20[4] = a_1;
-  return v_20;
+  Outer v_22[4] = a_1;
+  return v_22;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  Outer l_a[4] = v_16(0u);
-  Outer l_a_3 = v_13(768u);
-  Inner l_a_3_a[4] = v_8(768u);
-  Inner l_a_3_a_2 = v_6(896u);
+  Outer l_a[4] = v_18(0u);
+  Outer l_a_3 = v_15(768u);
+  Inner l_a_3_a[4] = v_10(768u);
+  Inner l_a_3_a_2 = v_8(896u);
   matrix<float16_t, 2, 4> l_a_3_a_2_m = v_4(896u);
-  vector<float16_t, 4> l_a_3_a_2_m_1 = tint_bitcast_to_f16(a[56u]);
+  vector<float16_t, 4> l_a_3_a_2_m_1 = tint_bitcast_to_f16(a[56u].zw);
   float16_t l_a_3_a_2_m_1_0 = float16_t(f16tof32(a[56u].z));
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
index 99698a6..049910f 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
@@ -2,12 +2,12 @@
 cbuffer cbuffer_u : register(b0) {
   uint4 u[32];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -15,14 +15,16 @@
 }
 
 matrix<float16_t, 2, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 4, 2> t = transpose(v_4(264u));
-  float16_t l = length(tint_bitcast_to_f16(u[1u]).ywxz);
-  float16_t a = abs(tint_bitcast_to_f16(u[1u]).ywxz[0u]);
+  float16_t l = length(tint_bitcast_to_f16(u[1u].xy).ywxz);
+  float16_t a = abs(tint_bitcast_to_f16(u[1u].xy).ywxz[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
index f6e38be..4e8560b 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
@@ -23,12 +23,12 @@
 void e(float16_t f_1) {
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -36,48 +36,50 @@
 }
 
 matrix<float16_t, 2, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))));
 }
 
-S v_6(uint start_byte_offset) {
-  int v_7 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 2, 4> v_8 = v_4((8u + start_byte_offset));
-  S v_9 = {v_7, v_8, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_9;
+S v_8(uint start_byte_offset) {
+  int v_9 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 2, 4> v_10 = v_4((8u + start_byte_offset));
+  S v_11 = {v_9, v_10, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_11;
 }
 
 typedef S ary_ret[4];
-ary_ret v_10(uint start_byte_offset) {
+ary_ret v_12(uint start_byte_offset) {
   S a_2[4] = (S[4])0;
   {
-    uint v_11 = 0u;
-    v_11 = 0u;
+    uint v_13 = 0u;
+    v_13 = 0u;
     while(true) {
-      uint v_12 = v_11;
-      if ((v_12 >= 4u)) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
         break;
       }
-      S v_13 = v_6((start_byte_offset + (v_12 * 128u)));
-      a_2[v_12] = v_13;
+      S v_15 = v_8((start_byte_offset + (v_14 * 128u)));
+      a_2[v_14] = v_15;
       {
-        v_11 = (v_12 + 1u);
+        v_13 = (v_14 + 1u);
       }
       continue;
     }
   }
-  S v_14[4] = a_2;
-  return v_14;
+  S v_16[4] = a_2;
+  return v_16;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_15[4] = v_10(0u);
-  a(v_15);
-  S v_16 = v_6(256u);
-  b(v_16);
+  S v_17[4] = v_12(0u);
+  a(v_17);
+  S v_18 = v_8(256u);
+  b(v_18);
   c(v_4(264u));
-  d(tint_bitcast_to_f16(u[1u]).ywxz);
-  e(tint_bitcast_to_f16(u[1u]).ywxz[0u]);
+  d(tint_bitcast_to_f16(u[1u].xy).ywxz);
+  e(tint_bitcast_to_f16(u[1u].xy).ywxz[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_private.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
index a8e8f1b..b022f37 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
@@ -9,12 +9,12 @@
   uint4 u[32];
 };
 static S p[4] = (S[4])0;
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -22,47 +22,49 @@
 }
 
 matrix<float16_t, 2, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))));
 }
 
-S v_6(uint start_byte_offset) {
-  int v_7 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 2, 4> v_8 = v_4((8u + start_byte_offset));
-  S v_9 = {v_7, v_8, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_9;
+S v_8(uint start_byte_offset) {
+  int v_9 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 2, 4> v_10 = v_4((8u + start_byte_offset));
+  S v_11 = {v_9, v_10, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_11;
 }
 
 typedef S ary_ret[4];
-ary_ret v_10(uint start_byte_offset) {
+ary_ret v_12(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
-    uint v_11 = 0u;
-    v_11 = 0u;
+    uint v_13 = 0u;
+    v_13 = 0u;
     while(true) {
-      uint v_12 = v_11;
-      if ((v_12 >= 4u)) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
         break;
       }
-      S v_13 = v_6((start_byte_offset + (v_12 * 128u)));
-      a[v_12] = v_13;
+      S v_15 = v_8((start_byte_offset + (v_14 * 128u)));
+      a[v_14] = v_15;
       {
-        v_11 = (v_12 + 1u);
+        v_13 = (v_14 + 1u);
       }
       continue;
     }
   }
-  S v_14[4] = a;
-  return v_14;
+  S v_16[4] = a;
+  return v_16;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_15[4] = v_10(0u);
-  p = v_15;
-  S v_16 = v_6(256u);
-  p[int(1)] = v_16;
+  S v_17[4] = v_12(0u);
+  p = v_17;
+  S v_18 = v_8(256u);
+  p[int(1)] = v_18;
   p[int(3)].m = v_4(264u);
-  p[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u]).ywxz;
+  p[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u].xy).ywxz;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
index 5e6bcde..6a11878 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
@@ -9,12 +9,12 @@
   uint4 u[32];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -27,36 +27,38 @@
 }
 
 matrix<float16_t, 2, 4> v_5(uint start_byte_offset) {
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_6, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]));
+  uint4 v_6 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.zw) : (v_6.xy)));
+  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_7, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy))));
 }
 
-void v_7(uint offset, S obj) {
+void v_9(uint offset, S obj) {
   s.Store((offset + 0u), asuint(obj.before));
   v_4((offset + 8u), obj.m);
   s.Store((offset + 64u), asuint(obj.after));
 }
 
-S v_8(uint start_byte_offset) {
-  int v_9 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 2, 4> v_10 = v_5((8u + start_byte_offset));
-  S v_11 = {v_9, v_10, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_11;
+S v_10(uint start_byte_offset) {
+  int v_11 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 2, 4> v_12 = v_5((8u + start_byte_offset));
+  S v_13 = {v_11, v_12, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_13;
 }
 
-void v_12(uint offset, S obj[4]) {
+void v_14(uint offset, S obj[4]) {
   {
-    uint v_13 = 0u;
-    v_13 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_14 = v_13;
-      if ((v_14 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      S v_15 = obj[v_14];
-      v_7((offset + (v_14 * 128u)), v_15);
+      S v_17 = obj[v_16];
+      v_9((offset + (v_16 * 128u)), v_17);
       {
-        v_13 = (v_14 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
@@ -64,35 +66,35 @@
 }
 
 typedef S ary_ret[4];
-ary_ret v_16(uint start_byte_offset) {
+ary_ret v_18(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
-    uint v_17 = 0u;
-    v_17 = 0u;
+    uint v_19 = 0u;
+    v_19 = 0u;
     while(true) {
-      uint v_18 = v_17;
-      if ((v_18 >= 4u)) {
+      uint v_20 = v_19;
+      if ((v_20 >= 4u)) {
         break;
       }
-      S v_19 = v_8((start_byte_offset + (v_18 * 128u)));
-      a[v_18] = v_19;
+      S v_21 = v_10((start_byte_offset + (v_20 * 128u)));
+      a[v_20] = v_21;
       {
-        v_17 = (v_18 + 1u);
+        v_19 = (v_20 + 1u);
       }
       continue;
     }
   }
-  S v_20[4] = a;
-  return v_20;
+  S v_22[4] = a;
+  return v_22;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_21[4] = v_16(0u);
-  v_12(0u, v_21);
-  S v_22 = v_8(256u);
-  v_7(128u, v_22);
+  S v_23[4] = v_18(0u);
+  v_14(0u, v_23);
+  S v_24 = v_10(256u);
+  v_9(128u, v_24);
   v_4(392u, v_5(264u));
-  s.Store<vector<float16_t, 4> >(136u, tint_bitcast_to_f16(u[1u]).ywxz);
+  s.Store<vector<float16_t, 4> >(136u, tint_bitcast_to_f16(u[1u].xy).ywxz);
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
index c547700..5fc23dd 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
@@ -13,12 +13,12 @@
   uint4 u[32];
 };
 groupshared S w[4];
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -26,64 +26,66 @@
 }
 
 matrix<float16_t, 2, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))));
 }
 
-S v_6(uint start_byte_offset) {
-  int v_7 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 2, 4> v_8 = v_4((8u + start_byte_offset));
-  S v_9 = {v_7, v_8, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_9;
+S v_8(uint start_byte_offset) {
+  int v_9 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 2, 4> v_10 = v_4((8u + start_byte_offset));
+  S v_11 = {v_9, v_10, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_11;
 }
 
 typedef S ary_ret[4];
-ary_ret v_10(uint start_byte_offset) {
+ary_ret v_12(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
-    uint v_11 = 0u;
-    v_11 = 0u;
+    uint v_13 = 0u;
+    v_13 = 0u;
     while(true) {
-      uint v_12 = v_11;
-      if ((v_12 >= 4u)) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
         break;
       }
-      S v_13 = v_6((start_byte_offset + (v_12 * 128u)));
-      a[v_12] = v_13;
+      S v_15 = v_8((start_byte_offset + (v_14 * 128u)));
+      a[v_14] = v_15;
       {
-        v_11 = (v_12 + 1u);
+        v_13 = (v_14 + 1u);
       }
       continue;
     }
   }
-  S v_14[4] = a;
-  return v_14;
+  S v_16[4] = a;
+  return v_16;
 }
 
 void f_inner(uint tint_local_index) {
   {
-    uint v_15 = 0u;
-    v_15 = tint_local_index;
+    uint v_17 = 0u;
+    v_17 = tint_local_index;
     while(true) {
-      uint v_16 = v_15;
-      if ((v_16 >= 4u)) {
+      uint v_18 = v_17;
+      if ((v_18 >= 4u)) {
         break;
       }
-      S v_17 = (S)0;
-      w[v_16] = v_17;
+      S v_19 = (S)0;
+      w[v_18] = v_19;
       {
-        v_15 = (v_16 + 1u);
+        v_17 = (v_18 + 1u);
       }
       continue;
     }
   }
   GroupMemoryBarrierWithGroupSync();
-  S v_18[4] = v_10(0u);
-  w = v_18;
-  S v_19 = v_6(256u);
-  w[int(1)] = v_19;
+  S v_20[4] = v_12(0u);
+  w = v_20;
+  S v_21 = v_8(256u);
+  w[int(1)] = v_21;
   w[int(3)].m = v_4(264u);
-  w[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u]).ywxz;
+  w[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u].xy).ywxz;
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 7c48cc8..e71db93 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -25,85 +25,81 @@
 }
 
 matrix<float16_t, 3, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = a[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = a[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 3, 2>(v_4, v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(a[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 3, 2>(v_3, v_4, tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]));
 }
 
-Inner v_8(uint start_byte_offset) {
-  Inner v_9 = {v_2(start_byte_offset)};
-  return v_9;
+Inner v_5(uint start_byte_offset) {
+  Inner v_6 = {v_2(start_byte_offset)};
+  return v_6;
 }
 
 typedef Inner ary_ret[4];
-ary_ret v_10(uint start_byte_offset) {
+ary_ret v_7(uint start_byte_offset) {
   Inner a_2[4] = (Inner[4])0;
   {
-    uint v_11 = 0u;
-    v_11 = 0u;
+    uint v_8 = 0u;
+    v_8 = 0u;
     while(true) {
-      uint v_12 = v_11;
-      if ((v_12 >= 4u)) {
+      uint v_9 = v_8;
+      if ((v_9 >= 4u)) {
         break;
       }
-      Inner v_13 = v_8((start_byte_offset + (v_12 * 64u)));
-      a_2[v_12] = v_13;
+      Inner v_10 = v_5((start_byte_offset + (v_9 * 64u)));
+      a_2[v_9] = v_10;
       {
-        v_11 = (v_12 + 1u);
+        v_8 = (v_9 + 1u);
       }
       continue;
     }
   }
-  Inner v_14[4] = a_2;
+  Inner v_11[4] = a_2;
+  return v_11;
+}
+
+Outer v_12(uint start_byte_offset) {
+  Inner v_13[4] = v_7(start_byte_offset);
+  Outer v_14 = {v_13};
   return v_14;
 }
 
-Outer v_15(uint start_byte_offset) {
-  Inner v_16[4] = v_10(start_byte_offset);
-  Outer v_17 = {v_16};
-  return v_17;
-}
-
 typedef Outer ary_ret_1[4];
-ary_ret_1 v_18(uint start_byte_offset) {
+ary_ret_1 v_15(uint start_byte_offset) {
   Outer a_1[4] = (Outer[4])0;
   {
-    uint v_19 = 0u;
-    v_19 = 0u;
+    uint v_16 = 0u;
+    v_16 = 0u;
     while(true) {
-      uint v_20 = v_19;
-      if ((v_20 >= 4u)) {
+      uint v_17 = v_16;
+      if ((v_17 >= 4u)) {
         break;
       }
-      Outer v_21 = v_15((start_byte_offset + (v_20 * 256u)));
-      a_1[v_20] = v_21;
+      Outer v_18 = v_12((start_byte_offset + (v_17 * 256u)));
+      a_1[v_17] = v_18;
       {
-        v_19 = (v_20 + 1u);
+        v_16 = (v_17 + 1u);
       }
       continue;
     }
   }
-  Outer v_22[4] = a_1;
-  return v_22;
+  Outer v_19[4] = a_1;
+  return v_19;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  uint v_23 = (256u * uint(i()));
-  uint v_24 = (64u * uint(i()));
-  uint v_25 = (4u * uint(i()));
-  Outer l_a[4] = v_18(0u);
-  Outer l_a_i = v_15(v_23);
-  Inner l_a_i_a[4] = v_10(v_23);
-  Inner l_a_i_a_i = v_8((v_23 + v_24));
-  matrix<float16_t, 3, 2> l_a_i_a_i_m = v_2((v_23 + v_24));
-  uint4 v_26 = a[(((v_23 + v_24) + v_25) / 16u)];
-  vector<float16_t, 2> l_a_i_a_i_m_i = tint_bitcast_to_f16((((((((v_23 + v_24) + v_25) % 16u) / 4u) == 2u)) ? (v_26.z) : (v_26.x)));
-  uint v_27 = (((v_23 + v_24) + v_25) + (uint(i()) * 2u));
-  uint v_28 = a[(v_27 / 16u)][((v_27 % 16u) / 4u)];
-  float16_t l_a_i_a_i_m_i_i = float16_t(f16tof32((v_28 >> ((((v_27 % 4u) == 0u)) ? (0u) : (16u)))));
+  uint v_20 = (256u * uint(i()));
+  uint v_21 = (64u * uint(i()));
+  uint v_22 = (4u * uint(i()));
+  Outer l_a[4] = v_15(0u);
+  Outer l_a_i = v_12(v_20);
+  Inner l_a_i_a[4] = v_7(v_20);
+  Inner l_a_i_a_i = v_5((v_20 + v_21));
+  matrix<float16_t, 3, 2> l_a_i_a_i_m = v_2((v_20 + v_21));
+  vector<float16_t, 2> l_a_i_a_i_m_i = tint_bitcast_to_f16(a[(((v_20 + v_21) + v_22) / 16u)][((((v_20 + v_21) + v_22) % 16u) / 4u)]);
+  uint v_23 = (((v_20 + v_21) + v_22) + (uint(i()) * 2u));
+  uint v_24 = a[(v_23 / 16u)][((v_23 % 16u) / 4u)];
+  float16_t l_a_i_a_i_m_i_i = float16_t(f16tof32((v_24 >> ((((v_23 % 4u) == 0u)) ? (0u) : (16u)))));
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 469cbb8..30d26b4 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -19,79 +19,76 @@
 }
 
 matrix<float16_t, 3, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = a[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = a[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 3, 2>(v_4, v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(a[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 3, 2>(v_3, v_4, tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]));
 }
 
-Inner v_8(uint start_byte_offset) {
-  Inner v_9 = {v_2(start_byte_offset)};
-  return v_9;
+Inner v_5(uint start_byte_offset) {
+  Inner v_6 = {v_2(start_byte_offset)};
+  return v_6;
 }
 
 typedef Inner ary_ret[4];
-ary_ret v_10(uint start_byte_offset) {
+ary_ret v_7(uint start_byte_offset) {
   Inner a_2[4] = (Inner[4])0;
   {
-    uint v_11 = 0u;
-    v_11 = 0u;
+    uint v_8 = 0u;
+    v_8 = 0u;
     while(true) {
-      uint v_12 = v_11;
-      if ((v_12 >= 4u)) {
+      uint v_9 = v_8;
+      if ((v_9 >= 4u)) {
         break;
       }
-      Inner v_13 = v_8((start_byte_offset + (v_12 * 64u)));
-      a_2[v_12] = v_13;
+      Inner v_10 = v_5((start_byte_offset + (v_9 * 64u)));
+      a_2[v_9] = v_10;
       {
-        v_11 = (v_12 + 1u);
+        v_8 = (v_9 + 1u);
       }
       continue;
     }
   }
-  Inner v_14[4] = a_2;
+  Inner v_11[4] = a_2;
+  return v_11;
+}
+
+Outer v_12(uint start_byte_offset) {
+  Inner v_13[4] = v_7(start_byte_offset);
+  Outer v_14 = {v_13};
   return v_14;
 }
 
-Outer v_15(uint start_byte_offset) {
-  Inner v_16[4] = v_10(start_byte_offset);
-  Outer v_17 = {v_16};
-  return v_17;
-}
-
 typedef Outer ary_ret_1[4];
-ary_ret_1 v_18(uint start_byte_offset) {
+ary_ret_1 v_15(uint start_byte_offset) {
   Outer a_1[4] = (Outer[4])0;
   {
-    uint v_19 = 0u;
-    v_19 = 0u;
+    uint v_16 = 0u;
+    v_16 = 0u;
     while(true) {
-      uint v_20 = v_19;
-      if ((v_20 >= 4u)) {
+      uint v_17 = v_16;
+      if ((v_17 >= 4u)) {
         break;
       }
-      Outer v_21 = v_15((start_byte_offset + (v_20 * 256u)));
-      a_1[v_20] = v_21;
+      Outer v_18 = v_12((start_byte_offset + (v_17 * 256u)));
+      a_1[v_17] = v_18;
       {
-        v_19 = (v_20 + 1u);
+        v_16 = (v_17 + 1u);
       }
       continue;
     }
   }
-  Outer v_22[4] = a_1;
-  return v_22;
+  Outer v_19[4] = a_1;
+  return v_19;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  Outer l_a[4] = v_18(0u);
-  Outer l_a_3 = v_15(768u);
-  Inner l_a_3_a[4] = v_10(768u);
-  Inner l_a_3_a_2 = v_8(896u);
+  Outer l_a[4] = v_15(0u);
+  Outer l_a_3 = v_12(768u);
+  Inner l_a_3_a[4] = v_7(768u);
+  Inner l_a_3_a_2 = v_5(896u);
   matrix<float16_t, 3, 2> l_a_3_a_2_m = v_2(896u);
-  vector<float16_t, 2> l_a_3_a_2_m_1 = tint_bitcast_to_f16(a[56u].x);
+  vector<float16_t, 2> l_a_3_a_2_m_1 = tint_bitcast_to_f16(a[56u].y);
   float16_t l_a_3_a_2_m_1_0 = float16_t(f16tof32(a[56u].y));
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
index f57fb6e..2fdb486 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
@@ -11,12 +11,9 @@
 }
 
 matrix<float16_t, 3, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 3, 2>(v_4, v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 3, 2>(v_3, v_4, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl
index f9590ee..6f48fe7 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl
@@ -32,50 +32,47 @@
 }
 
 matrix<float16_t, 3, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 3, 2>(v_4, v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 3, 2>(v_3, v_4, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]));
 }
 
-S v_8(uint start_byte_offset) {
-  int v_9 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 3, 2> v_10 = v_2((4u + start_byte_offset));
-  S v_11 = {v_9, v_10, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_11;
+S v_5(uint start_byte_offset) {
+  int v_6 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 3, 2> v_7 = v_2((4u + start_byte_offset));
+  S v_8 = {v_6, v_7, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_8;
 }
 
 typedef S ary_ret[4];
-ary_ret v_12(uint start_byte_offset) {
+ary_ret v_9(uint start_byte_offset) {
   S a_2[4] = (S[4])0;
   {
-    uint v_13 = 0u;
-    v_13 = 0u;
+    uint v_10 = 0u;
+    v_10 = 0u;
     while(true) {
-      uint v_14 = v_13;
-      if ((v_14 >= 4u)) {
+      uint v_11 = v_10;
+      if ((v_11 >= 4u)) {
         break;
       }
-      S v_15 = v_8((start_byte_offset + (v_14 * 128u)));
-      a_2[v_14] = v_15;
+      S v_12 = v_5((start_byte_offset + (v_11 * 128u)));
+      a_2[v_11] = v_12;
       {
-        v_13 = (v_14 + 1u);
+        v_10 = (v_11 + 1u);
       }
       continue;
     }
   }
-  S v_16[4] = a_2;
-  return v_16;
+  S v_13[4] = a_2;
+  return v_13;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_17[4] = v_12(0u);
-  a(v_17);
-  S v_18 = v_8(256u);
-  b(v_18);
+  S v_14[4] = v_9(0u);
+  a(v_14);
+  S v_15 = v_5(256u);
+  b(v_15);
   c(v_2(260u));
   d(tint_bitcast_to_f16(u[0u].z).yx);
   e(tint_bitcast_to_f16(u[0u].z).yx[0u]);
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_private.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_private.wgsl.expected.ir.dxc.hlsl
index 66c2bbf..5717624 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_private.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_private.wgsl.expected.ir.dxc.hlsl
@@ -18,50 +18,47 @@
 }
 
 matrix<float16_t, 3, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 3, 2>(v_4, v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 3, 2>(v_3, v_4, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]));
 }
 
-S v_8(uint start_byte_offset) {
-  int v_9 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 3, 2> v_10 = v_2((4u + start_byte_offset));
-  S v_11 = {v_9, v_10, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_11;
+S v_5(uint start_byte_offset) {
+  int v_6 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 3, 2> v_7 = v_2((4u + start_byte_offset));
+  S v_8 = {v_6, v_7, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_8;
 }
 
 typedef S ary_ret[4];
-ary_ret v_12(uint start_byte_offset) {
+ary_ret v_9(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
-    uint v_13 = 0u;
-    v_13 = 0u;
+    uint v_10 = 0u;
+    v_10 = 0u;
     while(true) {
-      uint v_14 = v_13;
-      if ((v_14 >= 4u)) {
+      uint v_11 = v_10;
+      if ((v_11 >= 4u)) {
         break;
       }
-      S v_15 = v_8((start_byte_offset + (v_14 * 128u)));
-      a[v_14] = v_15;
+      S v_12 = v_5((start_byte_offset + (v_11 * 128u)));
+      a[v_11] = v_12;
       {
-        v_13 = (v_14 + 1u);
+        v_10 = (v_11 + 1u);
       }
       continue;
     }
   }
-  S v_16[4] = a;
-  return v_16;
+  S v_13[4] = a;
+  return v_13;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_17[4] = v_12(0u);
-  p = v_17;
-  S v_18 = v_8(256u);
-  p[int(1)] = v_18;
+  S v_14[4] = v_9(0u);
+  p = v_14;
+  S v_15 = v_5(256u);
+  p[int(1)] = v_15;
   p[int(3)].m = v_2(260u);
   p[int(1)].m[int(0)] = tint_bitcast_to_f16(u[0u].z).yx;
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl
index cf94e83..10cfe97 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl
@@ -24,40 +24,37 @@
 }
 
 matrix<float16_t, 3, 2> v_3(uint start_byte_offset) {
-  uint4 v_4 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_5 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_4.z) : (v_4.x)));
-  uint4 v_6 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_7 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_6.z) : (v_6.x)));
-  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 3, 2>(v_5, v_7, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.z) : (v_8.x))));
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 3, 2>(v_4, v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]));
 }
 
-void v_9(uint offset, S obj) {
+void v_6(uint offset, S obj) {
   s.Store((offset + 0u), asuint(obj.before));
   v_2((offset + 4u), obj.m);
   s.Store((offset + 64u), asuint(obj.after));
 }
 
-S v_10(uint start_byte_offset) {
-  int v_11 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 3, 2> v_12 = v_3((4u + start_byte_offset));
-  S v_13 = {v_11, v_12, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_13;
+S v_7(uint start_byte_offset) {
+  int v_8 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 3, 2> v_9 = v_3((4u + start_byte_offset));
+  S v_10 = {v_8, v_9, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_10;
 }
 
-void v_14(uint offset, S obj[4]) {
+void v_11(uint offset, S obj[4]) {
   {
-    uint v_15 = 0u;
-    v_15 = 0u;
+    uint v_12 = 0u;
+    v_12 = 0u;
     while(true) {
-      uint v_16 = v_15;
-      if ((v_16 >= 4u)) {
+      uint v_13 = v_12;
+      if ((v_13 >= 4u)) {
         break;
       }
-      S v_17 = obj[v_16];
-      v_9((offset + (v_16 * 128u)), v_17);
+      S v_14 = obj[v_13];
+      v_6((offset + (v_13 * 128u)), v_14);
       {
-        v_15 = (v_16 + 1u);
+        v_12 = (v_13 + 1u);
       }
       continue;
     }
@@ -65,34 +62,34 @@
 }
 
 typedef S ary_ret[4];
-ary_ret v_18(uint start_byte_offset) {
+ary_ret v_15(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
-    uint v_19 = 0u;
-    v_19 = 0u;
+    uint v_16 = 0u;
+    v_16 = 0u;
     while(true) {
-      uint v_20 = v_19;
-      if ((v_20 >= 4u)) {
+      uint v_17 = v_16;
+      if ((v_17 >= 4u)) {
         break;
       }
-      S v_21 = v_10((start_byte_offset + (v_20 * 128u)));
-      a[v_20] = v_21;
+      S v_18 = v_7((start_byte_offset + (v_17 * 128u)));
+      a[v_17] = v_18;
       {
-        v_19 = (v_20 + 1u);
+        v_16 = (v_17 + 1u);
       }
       continue;
     }
   }
-  S v_22[4] = a;
-  return v_22;
+  S v_19[4] = a;
+  return v_19;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_23[4] = v_18(0u);
-  v_14(0u, v_23);
-  S v_24 = v_10(256u);
-  v_9(128u, v_24);
+  S v_20[4] = v_15(0u);
+  v_11(0u, v_20);
+  S v_21 = v_7(256u);
+  v_6(128u, v_21);
   v_2(388u, v_3(260u));
   s.Store<vector<float16_t, 2> >(132u, tint_bitcast_to_f16(u[0u].z).yx);
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
index 628b937..fbd82fb 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
@@ -22,66 +22,63 @@
 }
 
 matrix<float16_t, 3, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 3, 2>(v_4, v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 3, 2>(v_3, v_4, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]));
 }
 
-S v_8(uint start_byte_offset) {
-  int v_9 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 3, 2> v_10 = v_2((4u + start_byte_offset));
-  S v_11 = {v_9, v_10, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_11;
+S v_5(uint start_byte_offset) {
+  int v_6 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 3, 2> v_7 = v_2((4u + start_byte_offset));
+  S v_8 = {v_6, v_7, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_8;
 }
 
 typedef S ary_ret[4];
-ary_ret v_12(uint start_byte_offset) {
+ary_ret v_9(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
-    uint v_13 = 0u;
-    v_13 = 0u;
+    uint v_10 = 0u;
+    v_10 = 0u;
     while(true) {
-      uint v_14 = v_13;
-      if ((v_14 >= 4u)) {
+      uint v_11 = v_10;
+      if ((v_11 >= 4u)) {
         break;
       }
-      S v_15 = v_8((start_byte_offset + (v_14 * 128u)));
-      a[v_14] = v_15;
+      S v_12 = v_5((start_byte_offset + (v_11 * 128u)));
+      a[v_11] = v_12;
       {
-        v_13 = (v_14 + 1u);
+        v_10 = (v_11 + 1u);
       }
       continue;
     }
   }
-  S v_16[4] = a;
-  return v_16;
+  S v_13[4] = a;
+  return v_13;
 }
 
 void f_inner(uint tint_local_index) {
   {
-    uint v_17 = 0u;
-    v_17 = tint_local_index;
+    uint v_14 = 0u;
+    v_14 = tint_local_index;
     while(true) {
-      uint v_18 = v_17;
-      if ((v_18 >= 4u)) {
+      uint v_15 = v_14;
+      if ((v_15 >= 4u)) {
         break;
       }
-      S v_19 = (S)0;
-      w[v_18] = v_19;
+      S v_16 = (S)0;
+      w[v_15] = v_16;
       {
-        v_17 = (v_18 + 1u);
+        v_14 = (v_15 + 1u);
       }
       continue;
     }
   }
   GroupMemoryBarrierWithGroupSync();
-  S v_20[4] = v_12(0u);
-  w = v_20;
-  S v_21 = v_8(256u);
-  w[int(1)] = v_21;
+  S v_17[4] = v_9(0u);
+  w = v_17;
+  S v_18 = v_5(256u);
+  w[int(1)] = v_18;
   w[int(3)].m = v_2(260u);
   w[int(1)].m[int(0)] = tint_bitcast_to_f16(u[0u].z).yx;
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 1a226d9..3bc7fbe 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -16,12 +16,12 @@
   return counter;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -29,81 +29,85 @@
 }
 
 matrix<float16_t, 3, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 3, 3>(v_5, v_6, tint_bitcast_to_f16(a[((16u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = a[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = a[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 3>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz);
 }
 
-Inner v_7(uint start_byte_offset) {
-  Inner v_8 = {v_4(start_byte_offset)};
-  return v_8;
+Inner v_10(uint start_byte_offset) {
+  Inner v_11 = {v_4(start_byte_offset)};
+  return v_11;
 }
 
 typedef Inner ary_ret[4];
-ary_ret v_9(uint start_byte_offset) {
+ary_ret v_12(uint start_byte_offset) {
   Inner a_2[4] = (Inner[4])0;
   {
-    uint v_10 = 0u;
-    v_10 = 0u;
+    uint v_13 = 0u;
+    v_13 = 0u;
     while(true) {
-      uint v_11 = v_10;
-      if ((v_11 >= 4u)) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
         break;
       }
-      Inner v_12 = v_7((start_byte_offset + (v_11 * 64u)));
-      a_2[v_11] = v_12;
+      Inner v_15 = v_10((start_byte_offset + (v_14 * 64u)));
+      a_2[v_14] = v_15;
       {
-        v_10 = (v_11 + 1u);
+        v_13 = (v_14 + 1u);
       }
       continue;
     }
   }
-  Inner v_13[4] = a_2;
-  return v_13;
-}
-
-Outer v_14(uint start_byte_offset) {
-  Inner v_15[4] = v_9(start_byte_offset);
-  Outer v_16 = {v_15};
+  Inner v_16[4] = a_2;
   return v_16;
 }
 
+Outer v_17(uint start_byte_offset) {
+  Inner v_18[4] = v_12(start_byte_offset);
+  Outer v_19 = {v_18};
+  return v_19;
+}
+
 typedef Outer ary_ret_1[4];
-ary_ret_1 v_17(uint start_byte_offset) {
+ary_ret_1 v_20(uint start_byte_offset) {
   Outer a_1[4] = (Outer[4])0;
   {
-    uint v_18 = 0u;
-    v_18 = 0u;
+    uint v_21 = 0u;
+    v_21 = 0u;
     while(true) {
-      uint v_19 = v_18;
-      if ((v_19 >= 4u)) {
+      uint v_22 = v_21;
+      if ((v_22 >= 4u)) {
         break;
       }
-      Outer v_20 = v_14((start_byte_offset + (v_19 * 256u)));
-      a_1[v_19] = v_20;
+      Outer v_23 = v_17((start_byte_offset + (v_22 * 256u)));
+      a_1[v_22] = v_23;
       {
-        v_18 = (v_19 + 1u);
+        v_21 = (v_22 + 1u);
       }
       continue;
     }
   }
-  Outer v_21[4] = a_1;
-  return v_21;
+  Outer v_24[4] = a_1;
+  return v_24;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  uint v_22 = (256u * uint(i()));
-  uint v_23 = (64u * uint(i()));
-  uint v_24 = (8u * uint(i()));
-  Outer l_a[4] = v_17(0u);
-  Outer l_a_i = v_14(v_22);
-  Inner l_a_i_a[4] = v_9(v_22);
-  Inner l_a_i_a_i = v_7((v_22 + v_23));
-  matrix<float16_t, 3, 3> l_a_i_a_i_m = v_4((v_22 + v_23));
-  vector<float16_t, 3> l_a_i_a_i_m_i = tint_bitcast_to_f16(a[(((v_22 + v_23) + v_24) / 16u)]).xyz;
-  uint v_25 = (((v_22 + v_23) + v_24) + (uint(i()) * 2u));
-  uint v_26 = a[(v_25 / 16u)][((v_25 % 16u) / 4u)];
-  float16_t l_a_i_a_i_m_i_i = float16_t(f16tof32((v_26 >> ((((v_25 % 4u) == 0u)) ? (0u) : (16u)))));
+  uint v_25 = (256u * uint(i()));
+  uint v_26 = (64u * uint(i()));
+  uint v_27 = (8u * uint(i()));
+  Outer l_a[4] = v_20(0u);
+  Outer l_a_i = v_17(v_25);
+  Inner l_a_i_a[4] = v_12(v_25);
+  Inner l_a_i_a_i = v_10((v_25 + v_26));
+  matrix<float16_t, 3, 3> l_a_i_a_i_m = v_4((v_25 + v_26));
+  uint4 v_28 = a[(((v_25 + v_26) + v_27) / 16u)];
+  vector<float16_t, 3> l_a_i_a_i_m_i = tint_bitcast_to_f16((((((((v_25 + v_26) + v_27) % 16u) / 4u) == 2u)) ? (v_28.zw) : (v_28.xy))).xyz;
+  uint v_29 = (((v_25 + v_26) + v_27) + (uint(i()) * 2u));
+  uint v_30 = a[(v_29 / 16u)][((v_29 % 16u) / 4u)];
+  float16_t l_a_i_a_i_m_i_i = float16_t(f16tof32((v_30 >> ((((v_29 % 4u) == 0u)) ? (0u) : (16u)))));
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 03235d1..6137767 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -10,12 +10,12 @@
 cbuffer cbuffer_a : register(b0) {
   uint4 a[64];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -23,76 +23,79 @@
 }
 
 matrix<float16_t, 3, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 3, 3>(v_5, v_6, tint_bitcast_to_f16(a[((16u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = a[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = a[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 3>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz);
 }
 
-Inner v_7(uint start_byte_offset) {
-  Inner v_8 = {v_4(start_byte_offset)};
-  return v_8;
+Inner v_10(uint start_byte_offset) {
+  Inner v_11 = {v_4(start_byte_offset)};
+  return v_11;
 }
 
 typedef Inner ary_ret[4];
-ary_ret v_9(uint start_byte_offset) {
+ary_ret v_12(uint start_byte_offset) {
   Inner a_2[4] = (Inner[4])0;
   {
-    uint v_10 = 0u;
-    v_10 = 0u;
+    uint v_13 = 0u;
+    v_13 = 0u;
     while(true) {
-      uint v_11 = v_10;
-      if ((v_11 >= 4u)) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
         break;
       }
-      Inner v_12 = v_7((start_byte_offset + (v_11 * 64u)));
-      a_2[v_11] = v_12;
+      Inner v_15 = v_10((start_byte_offset + (v_14 * 64u)));
+      a_2[v_14] = v_15;
       {
-        v_10 = (v_11 + 1u);
+        v_13 = (v_14 + 1u);
       }
       continue;
     }
   }
-  Inner v_13[4] = a_2;
-  return v_13;
-}
-
-Outer v_14(uint start_byte_offset) {
-  Inner v_15[4] = v_9(start_byte_offset);
-  Outer v_16 = {v_15};
+  Inner v_16[4] = a_2;
   return v_16;
 }
 
+Outer v_17(uint start_byte_offset) {
+  Inner v_18[4] = v_12(start_byte_offset);
+  Outer v_19 = {v_18};
+  return v_19;
+}
+
 typedef Outer ary_ret_1[4];
-ary_ret_1 v_17(uint start_byte_offset) {
+ary_ret_1 v_20(uint start_byte_offset) {
   Outer a_1[4] = (Outer[4])0;
   {
-    uint v_18 = 0u;
-    v_18 = 0u;
+    uint v_21 = 0u;
+    v_21 = 0u;
     while(true) {
-      uint v_19 = v_18;
-      if ((v_19 >= 4u)) {
+      uint v_22 = v_21;
+      if ((v_22 >= 4u)) {
         break;
       }
-      Outer v_20 = v_14((start_byte_offset + (v_19 * 256u)));
-      a_1[v_19] = v_20;
+      Outer v_23 = v_17((start_byte_offset + (v_22 * 256u)));
+      a_1[v_22] = v_23;
       {
-        v_18 = (v_19 + 1u);
+        v_21 = (v_22 + 1u);
       }
       continue;
     }
   }
-  Outer v_21[4] = a_1;
-  return v_21;
+  Outer v_24[4] = a_1;
+  return v_24;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  Outer l_a[4] = v_17(0u);
-  Outer l_a_3 = v_14(768u);
-  Inner l_a_3_a[4] = v_9(768u);
-  Inner l_a_3_a_2 = v_7(896u);
+  Outer l_a[4] = v_20(0u);
+  Outer l_a_3 = v_17(768u);
+  Inner l_a_3_a[4] = v_12(768u);
+  Inner l_a_3_a_2 = v_10(896u);
   matrix<float16_t, 3, 3> l_a_3_a_2_m = v_4(896u);
-  vector<float16_t, 3> l_a_3_a_2_m_1 = tint_bitcast_to_f16(a[56u]).xyz;
+  vector<float16_t, 3> l_a_3_a_2_m_1 = tint_bitcast_to_f16(a[56u].zw).xyz;
   float16_t l_a_3_a_2_m_1_0 = float16_t(f16tof32(a[56u].z));
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
index ef709aa..fce01ba 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
@@ -2,12 +2,12 @@
 cbuffer cbuffer_u : register(b0) {
   uint4 u[32];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -15,15 +15,18 @@
 }
 
 matrix<float16_t, 3, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 3, 3>(v_5, v_6, tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 3>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 3, 3> t = transpose(v_4(264u));
-  float16_t l = length(tint_bitcast_to_f16(u[1u]).xyz.zxy);
-  float16_t a = abs(tint_bitcast_to_f16(u[1u]).xyz.zxy[0u]);
+  float16_t l = length(tint_bitcast_to_f16(u[1u].xy).xyz.zxy);
+  float16_t a = abs(tint_bitcast_to_f16(u[1u].xy).xyz.zxy[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
index 0b4a6c4..50ded4f 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
@@ -23,12 +23,12 @@
 void e(float16_t f_1) {
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -36,49 +36,52 @@
 }
 
 matrix<float16_t, 3, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 3, 3>(v_5, v_6, tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 3>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz);
 }
 
-S v_7(uint start_byte_offset) {
-  int v_8 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 3, 3> v_9 = v_4((8u + start_byte_offset));
-  S v_10 = {v_8, v_9, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_10;
+S v_10(uint start_byte_offset) {
+  int v_11 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 3, 3> v_12 = v_4((8u + start_byte_offset));
+  S v_13 = {v_11, v_12, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_13;
 }
 
 typedef S ary_ret[4];
-ary_ret v_11(uint start_byte_offset) {
+ary_ret v_14(uint start_byte_offset) {
   S a_2[4] = (S[4])0;
   {
-    uint v_12 = 0u;
-    v_12 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_13 = v_12;
-      if ((v_13 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      S v_14 = v_7((start_byte_offset + (v_13 * 128u)));
-      a_2[v_13] = v_14;
+      S v_17 = v_10((start_byte_offset + (v_16 * 128u)));
+      a_2[v_16] = v_17;
       {
-        v_12 = (v_13 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  S v_15[4] = a_2;
-  return v_15;
+  S v_18[4] = a_2;
+  return v_18;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_16[4] = v_11(0u);
-  a(v_16);
-  S v_17 = v_7(256u);
-  b(v_17);
+  S v_19[4] = v_14(0u);
+  a(v_19);
+  S v_20 = v_10(256u);
+  b(v_20);
   c(v_4(264u));
-  d(tint_bitcast_to_f16(u[1u]).xyz.zxy);
-  e(tint_bitcast_to_f16(u[1u]).xyz.zxy[0u]);
+  d(tint_bitcast_to_f16(u[1u].xy).xyz.zxy);
+  e(tint_bitcast_to_f16(u[1u].xy).xyz.zxy[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_private.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
index d4539b5..bd2fb6b 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
@@ -9,12 +9,12 @@
   uint4 u[32];
 };
 static S p[4] = (S[4])0;
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -22,48 +22,51 @@
 }
 
 matrix<float16_t, 3, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 3, 3>(v_5, v_6, tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 3>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz);
 }
 
-S v_7(uint start_byte_offset) {
-  int v_8 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 3, 3> v_9 = v_4((8u + start_byte_offset));
-  S v_10 = {v_8, v_9, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_10;
+S v_10(uint start_byte_offset) {
+  int v_11 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 3, 3> v_12 = v_4((8u + start_byte_offset));
+  S v_13 = {v_11, v_12, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_13;
 }
 
 typedef S ary_ret[4];
-ary_ret v_11(uint start_byte_offset) {
+ary_ret v_14(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
-    uint v_12 = 0u;
-    v_12 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_13 = v_12;
-      if ((v_13 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      S v_14 = v_7((start_byte_offset + (v_13 * 128u)));
-      a[v_13] = v_14;
+      S v_17 = v_10((start_byte_offset + (v_16 * 128u)));
+      a[v_16] = v_17;
       {
-        v_12 = (v_13 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  S v_15[4] = a;
-  return v_15;
+  S v_18[4] = a;
+  return v_18;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_16[4] = v_11(0u);
-  p = v_16;
-  S v_17 = v_7(256u);
-  p[int(1)] = v_17;
+  S v_19[4] = v_14(0u);
+  p = v_19;
+  S v_20 = v_10(256u);
+  p[int(1)] = v_20;
   p[int(3)].m = v_4(264u);
-  p[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u]).xyz.zxy;
+  p[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u].xy).xyz.zxy;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
index a0f2cf4..828b1c7 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
@@ -9,12 +9,12 @@
   uint4 u[32];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -28,37 +28,40 @@
 }
 
 matrix<float16_t, 3, 3> v_5(uint start_byte_offset) {
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 3, 3>(v_6, v_7, tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_6 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.zw) : (v_6.xy))).xyz;
+  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_9 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy))).xyz;
+  uint4 v_10 = u[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 3>(v_7, v_9, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_10.zw) : (v_10.xy))).xyz);
 }
 
-void v_8(uint offset, S obj) {
+void v_11(uint offset, S obj) {
   s.Store((offset + 0u), asuint(obj.before));
   v_4((offset + 8u), obj.m);
   s.Store((offset + 64u), asuint(obj.after));
 }
 
-S v_9(uint start_byte_offset) {
-  int v_10 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 3, 3> v_11 = v_5((8u + start_byte_offset));
-  S v_12 = {v_10, v_11, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_12;
+S v_12(uint start_byte_offset) {
+  int v_13 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 3, 3> v_14 = v_5((8u + start_byte_offset));
+  S v_15 = {v_13, v_14, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_15;
 }
 
-void v_13(uint offset, S obj[4]) {
+void v_16(uint offset, S obj[4]) {
   {
-    uint v_14 = 0u;
-    v_14 = 0u;
+    uint v_17 = 0u;
+    v_17 = 0u;
     while(true) {
-      uint v_15 = v_14;
-      if ((v_15 >= 4u)) {
+      uint v_18 = v_17;
+      if ((v_18 >= 4u)) {
         break;
       }
-      S v_16 = obj[v_15];
-      v_8((offset + (v_15 * 128u)), v_16);
+      S v_19 = obj[v_18];
+      v_11((offset + (v_18 * 128u)), v_19);
       {
-        v_14 = (v_15 + 1u);
+        v_17 = (v_18 + 1u);
       }
       continue;
     }
@@ -66,35 +69,35 @@
 }
 
 typedef S ary_ret[4];
-ary_ret v_17(uint start_byte_offset) {
+ary_ret v_20(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
-    uint v_18 = 0u;
-    v_18 = 0u;
+    uint v_21 = 0u;
+    v_21 = 0u;
     while(true) {
-      uint v_19 = v_18;
-      if ((v_19 >= 4u)) {
+      uint v_22 = v_21;
+      if ((v_22 >= 4u)) {
         break;
       }
-      S v_20 = v_9((start_byte_offset + (v_19 * 128u)));
-      a[v_19] = v_20;
+      S v_23 = v_12((start_byte_offset + (v_22 * 128u)));
+      a[v_22] = v_23;
       {
-        v_18 = (v_19 + 1u);
+        v_21 = (v_22 + 1u);
       }
       continue;
     }
   }
-  S v_21[4] = a;
-  return v_21;
+  S v_24[4] = a;
+  return v_24;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_22[4] = v_17(0u);
-  v_13(0u, v_22);
-  S v_23 = v_9(256u);
-  v_8(128u, v_23);
+  S v_25[4] = v_20(0u);
+  v_16(0u, v_25);
+  S v_26 = v_12(256u);
+  v_11(128u, v_26);
   v_4(392u, v_5(264u));
-  s.Store<vector<float16_t, 3> >(136u, tint_bitcast_to_f16(u[1u]).xyz.zxy);
+  s.Store<vector<float16_t, 3> >(136u, tint_bitcast_to_f16(u[1u].xy).xyz.zxy);
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
index 455bdc7..479345a 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
@@ -13,12 +13,12 @@
   uint4 u[32];
 };
 groupshared S w[4];
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -26,65 +26,68 @@
 }
 
 matrix<float16_t, 3, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 3, 3>(v_5, v_6, tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 3>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz);
 }
 
-S v_7(uint start_byte_offset) {
-  int v_8 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 3, 3> v_9 = v_4((8u + start_byte_offset));
-  S v_10 = {v_8, v_9, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_10;
+S v_10(uint start_byte_offset) {
+  int v_11 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 3, 3> v_12 = v_4((8u + start_byte_offset));
+  S v_13 = {v_11, v_12, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_13;
 }
 
 typedef S ary_ret[4];
-ary_ret v_11(uint start_byte_offset) {
+ary_ret v_14(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
-    uint v_12 = 0u;
-    v_12 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_13 = v_12;
-      if ((v_13 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      S v_14 = v_7((start_byte_offset + (v_13 * 128u)));
-      a[v_13] = v_14;
+      S v_17 = v_10((start_byte_offset + (v_16 * 128u)));
+      a[v_16] = v_17;
       {
-        v_12 = (v_13 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  S v_15[4] = a;
-  return v_15;
+  S v_18[4] = a;
+  return v_18;
 }
 
 void f_inner(uint tint_local_index) {
   {
-    uint v_16 = 0u;
-    v_16 = tint_local_index;
+    uint v_19 = 0u;
+    v_19 = tint_local_index;
     while(true) {
-      uint v_17 = v_16;
-      if ((v_17 >= 4u)) {
+      uint v_20 = v_19;
+      if ((v_20 >= 4u)) {
         break;
       }
-      S v_18 = (S)0;
-      w[v_17] = v_18;
+      S v_21 = (S)0;
+      w[v_20] = v_21;
       {
-        v_16 = (v_17 + 1u);
+        v_19 = (v_20 + 1u);
       }
       continue;
     }
   }
   GroupMemoryBarrierWithGroupSync();
-  S v_19[4] = v_11(0u);
-  w = v_19;
-  S v_20 = v_7(256u);
-  w[int(1)] = v_20;
+  S v_22[4] = v_14(0u);
+  w = v_22;
+  S v_23 = v_10(256u);
+  w[int(1)] = v_23;
   w[int(3)].m = v_4(264u);
-  w[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u]).xyz.zxy;
+  w[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u].xy).xyz.zxy;
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index cb3f82c..dfbe35b 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -16,12 +16,12 @@
   return counter;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -29,81 +29,85 @@
 }
 
 matrix<float16_t, 3, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 3, 4>(v_5, v_6, tint_bitcast_to_f16(a[((16u + start_byte_offset) / 16u)]));
+  uint4 v_5 = a[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = a[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 4>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))));
 }
 
-Inner v_7(uint start_byte_offset) {
-  Inner v_8 = {v_4(start_byte_offset)};
-  return v_8;
+Inner v_10(uint start_byte_offset) {
+  Inner v_11 = {v_4(start_byte_offset)};
+  return v_11;
 }
 
 typedef Inner ary_ret[4];
-ary_ret v_9(uint start_byte_offset) {
+ary_ret v_12(uint start_byte_offset) {
   Inner a_2[4] = (Inner[4])0;
   {
-    uint v_10 = 0u;
-    v_10 = 0u;
+    uint v_13 = 0u;
+    v_13 = 0u;
     while(true) {
-      uint v_11 = v_10;
-      if ((v_11 >= 4u)) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
         break;
       }
-      Inner v_12 = v_7((start_byte_offset + (v_11 * 64u)));
-      a_2[v_11] = v_12;
+      Inner v_15 = v_10((start_byte_offset + (v_14 * 64u)));
+      a_2[v_14] = v_15;
       {
-        v_10 = (v_11 + 1u);
+        v_13 = (v_14 + 1u);
       }
       continue;
     }
   }
-  Inner v_13[4] = a_2;
-  return v_13;
-}
-
-Outer v_14(uint start_byte_offset) {
-  Inner v_15[4] = v_9(start_byte_offset);
-  Outer v_16 = {v_15};
+  Inner v_16[4] = a_2;
   return v_16;
 }
 
+Outer v_17(uint start_byte_offset) {
+  Inner v_18[4] = v_12(start_byte_offset);
+  Outer v_19 = {v_18};
+  return v_19;
+}
+
 typedef Outer ary_ret_1[4];
-ary_ret_1 v_17(uint start_byte_offset) {
+ary_ret_1 v_20(uint start_byte_offset) {
   Outer a_1[4] = (Outer[4])0;
   {
-    uint v_18 = 0u;
-    v_18 = 0u;
+    uint v_21 = 0u;
+    v_21 = 0u;
     while(true) {
-      uint v_19 = v_18;
-      if ((v_19 >= 4u)) {
+      uint v_22 = v_21;
+      if ((v_22 >= 4u)) {
         break;
       }
-      Outer v_20 = v_14((start_byte_offset + (v_19 * 256u)));
-      a_1[v_19] = v_20;
+      Outer v_23 = v_17((start_byte_offset + (v_22 * 256u)));
+      a_1[v_22] = v_23;
       {
-        v_18 = (v_19 + 1u);
+        v_21 = (v_22 + 1u);
       }
       continue;
     }
   }
-  Outer v_21[4] = a_1;
-  return v_21;
+  Outer v_24[4] = a_1;
+  return v_24;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  uint v_22 = (256u * uint(i()));
-  uint v_23 = (64u * uint(i()));
-  uint v_24 = (8u * uint(i()));
-  Outer l_a[4] = v_17(0u);
-  Outer l_a_i = v_14(v_22);
-  Inner l_a_i_a[4] = v_9(v_22);
-  Inner l_a_i_a_i = v_7((v_22 + v_23));
-  matrix<float16_t, 3, 4> l_a_i_a_i_m = v_4((v_22 + v_23));
-  vector<float16_t, 4> l_a_i_a_i_m_i = tint_bitcast_to_f16(a[(((v_22 + v_23) + v_24) / 16u)]);
-  uint v_25 = (((v_22 + v_23) + v_24) + (uint(i()) * 2u));
-  uint v_26 = a[(v_25 / 16u)][((v_25 % 16u) / 4u)];
-  float16_t l_a_i_a_i_m_i_i = float16_t(f16tof32((v_26 >> ((((v_25 % 4u) == 0u)) ? (0u) : (16u)))));
+  uint v_25 = (256u * uint(i()));
+  uint v_26 = (64u * uint(i()));
+  uint v_27 = (8u * uint(i()));
+  Outer l_a[4] = v_20(0u);
+  Outer l_a_i = v_17(v_25);
+  Inner l_a_i_a[4] = v_12(v_25);
+  Inner l_a_i_a_i = v_10((v_25 + v_26));
+  matrix<float16_t, 3, 4> l_a_i_a_i_m = v_4((v_25 + v_26));
+  uint4 v_28 = a[(((v_25 + v_26) + v_27) / 16u)];
+  vector<float16_t, 4> l_a_i_a_i_m_i = tint_bitcast_to_f16((((((((v_25 + v_26) + v_27) % 16u) / 4u) == 2u)) ? (v_28.zw) : (v_28.xy)));
+  uint v_29 = (((v_25 + v_26) + v_27) + (uint(i()) * 2u));
+  uint v_30 = a[(v_29 / 16u)][((v_29 % 16u) / 4u)];
+  float16_t l_a_i_a_i_m_i_i = float16_t(f16tof32((v_30 >> ((((v_29 % 4u) == 0u)) ? (0u) : (16u)))));
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 13ee62a..c2c61eb 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -10,12 +10,12 @@
 cbuffer cbuffer_a : register(b0) {
   uint4 a[64];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -23,76 +23,79 @@
 }
 
 matrix<float16_t, 3, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 3, 4>(v_5, v_6, tint_bitcast_to_f16(a[((16u + start_byte_offset) / 16u)]));
+  uint4 v_5 = a[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = a[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 4>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))));
 }
 
-Inner v_7(uint start_byte_offset) {
-  Inner v_8 = {v_4(start_byte_offset)};
-  return v_8;
+Inner v_10(uint start_byte_offset) {
+  Inner v_11 = {v_4(start_byte_offset)};
+  return v_11;
 }
 
 typedef Inner ary_ret[4];
-ary_ret v_9(uint start_byte_offset) {
+ary_ret v_12(uint start_byte_offset) {
   Inner a_2[4] = (Inner[4])0;
   {
-    uint v_10 = 0u;
-    v_10 = 0u;
+    uint v_13 = 0u;
+    v_13 = 0u;
     while(true) {
-      uint v_11 = v_10;
-      if ((v_11 >= 4u)) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
         break;
       }
-      Inner v_12 = v_7((start_byte_offset + (v_11 * 64u)));
-      a_2[v_11] = v_12;
+      Inner v_15 = v_10((start_byte_offset + (v_14 * 64u)));
+      a_2[v_14] = v_15;
       {
-        v_10 = (v_11 + 1u);
+        v_13 = (v_14 + 1u);
       }
       continue;
     }
   }
-  Inner v_13[4] = a_2;
-  return v_13;
-}
-
-Outer v_14(uint start_byte_offset) {
-  Inner v_15[4] = v_9(start_byte_offset);
-  Outer v_16 = {v_15};
+  Inner v_16[4] = a_2;
   return v_16;
 }
 
+Outer v_17(uint start_byte_offset) {
+  Inner v_18[4] = v_12(start_byte_offset);
+  Outer v_19 = {v_18};
+  return v_19;
+}
+
 typedef Outer ary_ret_1[4];
-ary_ret_1 v_17(uint start_byte_offset) {
+ary_ret_1 v_20(uint start_byte_offset) {
   Outer a_1[4] = (Outer[4])0;
   {
-    uint v_18 = 0u;
-    v_18 = 0u;
+    uint v_21 = 0u;
+    v_21 = 0u;
     while(true) {
-      uint v_19 = v_18;
-      if ((v_19 >= 4u)) {
+      uint v_22 = v_21;
+      if ((v_22 >= 4u)) {
         break;
       }
-      Outer v_20 = v_14((start_byte_offset + (v_19 * 256u)));
-      a_1[v_19] = v_20;
+      Outer v_23 = v_17((start_byte_offset + (v_22 * 256u)));
+      a_1[v_22] = v_23;
       {
-        v_18 = (v_19 + 1u);
+        v_21 = (v_22 + 1u);
       }
       continue;
     }
   }
-  Outer v_21[4] = a_1;
-  return v_21;
+  Outer v_24[4] = a_1;
+  return v_24;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  Outer l_a[4] = v_17(0u);
-  Outer l_a_3 = v_14(768u);
-  Inner l_a_3_a[4] = v_9(768u);
-  Inner l_a_3_a_2 = v_7(896u);
+  Outer l_a[4] = v_20(0u);
+  Outer l_a_3 = v_17(768u);
+  Inner l_a_3_a[4] = v_12(768u);
+  Inner l_a_3_a_2 = v_10(896u);
   matrix<float16_t, 3, 4> l_a_3_a_2_m = v_4(896u);
-  vector<float16_t, 4> l_a_3_a_2_m_1 = tint_bitcast_to_f16(a[56u]);
+  vector<float16_t, 4> l_a_3_a_2_m_1 = tint_bitcast_to_f16(a[56u].zw);
   float16_t l_a_3_a_2_m_1_0 = float16_t(f16tof32(a[56u].z));
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
index 4e2f1ed..616a3b3 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
@@ -2,12 +2,12 @@
 cbuffer cbuffer_u : register(b0) {
   uint4 u[32];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -15,15 +15,18 @@
 }
 
 matrix<float16_t, 3, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 3, 4>(v_5, v_6, tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 4>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 4, 3> t = transpose(v_4(264u));
-  float16_t l = length(tint_bitcast_to_f16(u[1u]).ywxz);
-  float16_t a = abs(tint_bitcast_to_f16(u[1u]).ywxz[0u]);
+  float16_t l = length(tint_bitcast_to_f16(u[1u].xy).ywxz);
+  float16_t a = abs(tint_bitcast_to_f16(u[1u].xy).ywxz[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
index d9b6fd6..fa58d06 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
@@ -23,12 +23,12 @@
 void e(float16_t f_1) {
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -36,49 +36,52 @@
 }
 
 matrix<float16_t, 3, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 3, 4>(v_5, v_6, tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 4>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))));
 }
 
-S v_7(uint start_byte_offset) {
-  int v_8 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 3, 4> v_9 = v_4((8u + start_byte_offset));
-  S v_10 = {v_8, v_9, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_10;
+S v_10(uint start_byte_offset) {
+  int v_11 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 3, 4> v_12 = v_4((8u + start_byte_offset));
+  S v_13 = {v_11, v_12, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_13;
 }
 
 typedef S ary_ret[4];
-ary_ret v_11(uint start_byte_offset) {
+ary_ret v_14(uint start_byte_offset) {
   S a_2[4] = (S[4])0;
   {
-    uint v_12 = 0u;
-    v_12 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_13 = v_12;
-      if ((v_13 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      S v_14 = v_7((start_byte_offset + (v_13 * 128u)));
-      a_2[v_13] = v_14;
+      S v_17 = v_10((start_byte_offset + (v_16 * 128u)));
+      a_2[v_16] = v_17;
       {
-        v_12 = (v_13 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  S v_15[4] = a_2;
-  return v_15;
+  S v_18[4] = a_2;
+  return v_18;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_16[4] = v_11(0u);
-  a(v_16);
-  S v_17 = v_7(256u);
-  b(v_17);
+  S v_19[4] = v_14(0u);
+  a(v_19);
+  S v_20 = v_10(256u);
+  b(v_20);
   c(v_4(264u));
-  d(tint_bitcast_to_f16(u[1u]).ywxz);
-  e(tint_bitcast_to_f16(u[1u]).ywxz[0u]);
+  d(tint_bitcast_to_f16(u[1u].xy).ywxz);
+  e(tint_bitcast_to_f16(u[1u].xy).ywxz[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_private.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
index 2c253c3..5a05965 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
@@ -9,12 +9,12 @@
   uint4 u[32];
 };
 static S p[4] = (S[4])0;
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -22,48 +22,51 @@
 }
 
 matrix<float16_t, 3, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 3, 4>(v_5, v_6, tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 4>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))));
 }
 
-S v_7(uint start_byte_offset) {
-  int v_8 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 3, 4> v_9 = v_4((8u + start_byte_offset));
-  S v_10 = {v_8, v_9, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_10;
+S v_10(uint start_byte_offset) {
+  int v_11 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 3, 4> v_12 = v_4((8u + start_byte_offset));
+  S v_13 = {v_11, v_12, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_13;
 }
 
 typedef S ary_ret[4];
-ary_ret v_11(uint start_byte_offset) {
+ary_ret v_14(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
-    uint v_12 = 0u;
-    v_12 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_13 = v_12;
-      if ((v_13 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      S v_14 = v_7((start_byte_offset + (v_13 * 128u)));
-      a[v_13] = v_14;
+      S v_17 = v_10((start_byte_offset + (v_16 * 128u)));
+      a[v_16] = v_17;
       {
-        v_12 = (v_13 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  S v_15[4] = a;
-  return v_15;
+  S v_18[4] = a;
+  return v_18;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_16[4] = v_11(0u);
-  p = v_16;
-  S v_17 = v_7(256u);
-  p[int(1)] = v_17;
+  S v_19[4] = v_14(0u);
+  p = v_19;
+  S v_20 = v_10(256u);
+  p[int(1)] = v_20;
   p[int(3)].m = v_4(264u);
-  p[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u]).ywxz;
+  p[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u].xy).ywxz;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
index 65ff649..e1263d4 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
@@ -9,12 +9,12 @@
   uint4 u[32];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -28,37 +28,40 @@
 }
 
 matrix<float16_t, 3, 4> v_5(uint start_byte_offset) {
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 3, 4>(v_6, v_7, tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]));
+  uint4 v_6 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.zw) : (v_6.xy)));
+  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_9 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy)));
+  uint4 v_10 = u[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 4>(v_7, v_9, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_10.zw) : (v_10.xy))));
 }
 
-void v_8(uint offset, S obj) {
+void v_11(uint offset, S obj) {
   s.Store((offset + 0u), asuint(obj.before));
   v_4((offset + 8u), obj.m);
   s.Store((offset + 64u), asuint(obj.after));
 }
 
-S v_9(uint start_byte_offset) {
-  int v_10 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 3, 4> v_11 = v_5((8u + start_byte_offset));
-  S v_12 = {v_10, v_11, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_12;
+S v_12(uint start_byte_offset) {
+  int v_13 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 3, 4> v_14 = v_5((8u + start_byte_offset));
+  S v_15 = {v_13, v_14, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_15;
 }
 
-void v_13(uint offset, S obj[4]) {
+void v_16(uint offset, S obj[4]) {
   {
-    uint v_14 = 0u;
-    v_14 = 0u;
+    uint v_17 = 0u;
+    v_17 = 0u;
     while(true) {
-      uint v_15 = v_14;
-      if ((v_15 >= 4u)) {
+      uint v_18 = v_17;
+      if ((v_18 >= 4u)) {
         break;
       }
-      S v_16 = obj[v_15];
-      v_8((offset + (v_15 * 128u)), v_16);
+      S v_19 = obj[v_18];
+      v_11((offset + (v_18 * 128u)), v_19);
       {
-        v_14 = (v_15 + 1u);
+        v_17 = (v_18 + 1u);
       }
       continue;
     }
@@ -66,35 +69,35 @@
 }
 
 typedef S ary_ret[4];
-ary_ret v_17(uint start_byte_offset) {
+ary_ret v_20(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
-    uint v_18 = 0u;
-    v_18 = 0u;
+    uint v_21 = 0u;
+    v_21 = 0u;
     while(true) {
-      uint v_19 = v_18;
-      if ((v_19 >= 4u)) {
+      uint v_22 = v_21;
+      if ((v_22 >= 4u)) {
         break;
       }
-      S v_20 = v_9((start_byte_offset + (v_19 * 128u)));
-      a[v_19] = v_20;
+      S v_23 = v_12((start_byte_offset + (v_22 * 128u)));
+      a[v_22] = v_23;
       {
-        v_18 = (v_19 + 1u);
+        v_21 = (v_22 + 1u);
       }
       continue;
     }
   }
-  S v_21[4] = a;
-  return v_21;
+  S v_24[4] = a;
+  return v_24;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_22[4] = v_17(0u);
-  v_13(0u, v_22);
-  S v_23 = v_9(256u);
-  v_8(128u, v_23);
+  S v_25[4] = v_20(0u);
+  v_16(0u, v_25);
+  S v_26 = v_12(256u);
+  v_11(128u, v_26);
   v_4(392u, v_5(264u));
-  s.Store<vector<float16_t, 4> >(136u, tint_bitcast_to_f16(u[1u]).ywxz);
+  s.Store<vector<float16_t, 4> >(136u, tint_bitcast_to_f16(u[1u].xy).ywxz);
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
index cc6880e..65ad625 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
@@ -13,12 +13,12 @@
   uint4 u[32];
 };
 groupshared S w[4];
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -26,65 +26,68 @@
 }
 
 matrix<float16_t, 3, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 3, 4>(v_5, v_6, tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 4>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))));
 }
 
-S v_7(uint start_byte_offset) {
-  int v_8 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 3, 4> v_9 = v_4((8u + start_byte_offset));
-  S v_10 = {v_8, v_9, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_10;
+S v_10(uint start_byte_offset) {
+  int v_11 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 3, 4> v_12 = v_4((8u + start_byte_offset));
+  S v_13 = {v_11, v_12, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_13;
 }
 
 typedef S ary_ret[4];
-ary_ret v_11(uint start_byte_offset) {
+ary_ret v_14(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
-    uint v_12 = 0u;
-    v_12 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_13 = v_12;
-      if ((v_13 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      S v_14 = v_7((start_byte_offset + (v_13 * 128u)));
-      a[v_13] = v_14;
+      S v_17 = v_10((start_byte_offset + (v_16 * 128u)));
+      a[v_16] = v_17;
       {
-        v_12 = (v_13 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  S v_15[4] = a;
-  return v_15;
+  S v_18[4] = a;
+  return v_18;
 }
 
 void f_inner(uint tint_local_index) {
   {
-    uint v_16 = 0u;
-    v_16 = tint_local_index;
+    uint v_19 = 0u;
+    v_19 = tint_local_index;
     while(true) {
-      uint v_17 = v_16;
-      if ((v_17 >= 4u)) {
+      uint v_20 = v_19;
+      if ((v_20 >= 4u)) {
         break;
       }
-      S v_18 = (S)0;
-      w[v_17] = v_18;
+      S v_21 = (S)0;
+      w[v_20] = v_21;
       {
-        v_16 = (v_17 + 1u);
+        v_19 = (v_20 + 1u);
       }
       continue;
     }
   }
   GroupMemoryBarrierWithGroupSync();
-  S v_19[4] = v_11(0u);
-  w = v_19;
-  S v_20 = v_7(256u);
-  w[int(1)] = v_20;
+  S v_22[4] = v_14(0u);
+  w = v_22;
+  S v_23 = v_10(256u);
+  w[int(1)] = v_23;
   w[int(3)].m = v_4(264u);
-  w[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u]).ywxz;
+  w[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u].xy).ywxz;
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 567e07e..a2d7997 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -25,87 +25,82 @@
 }
 
 matrix<float16_t, 4, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = a[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = a[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x)));
-  uint4 v_9 = a[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_4, v_6, v_8, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.z) : (v_9.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(a[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_3, v_4, v_5, tint_bitcast_to_f16(a[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
-Inner v_10(uint start_byte_offset) {
-  Inner v_11 = {v_2(start_byte_offset)};
-  return v_11;
+Inner v_6(uint start_byte_offset) {
+  Inner v_7 = {v_2(start_byte_offset)};
+  return v_7;
 }
 
 typedef Inner ary_ret[4];
-ary_ret v_12(uint start_byte_offset) {
+ary_ret v_8(uint start_byte_offset) {
   Inner a_2[4] = (Inner[4])0;
   {
-    uint v_13 = 0u;
-    v_13 = 0u;
+    uint v_9 = 0u;
+    v_9 = 0u;
     while(true) {
-      uint v_14 = v_13;
-      if ((v_14 >= 4u)) {
+      uint v_10 = v_9;
+      if ((v_10 >= 4u)) {
         break;
       }
-      Inner v_15 = v_10((start_byte_offset + (v_14 * 64u)));
-      a_2[v_14] = v_15;
+      Inner v_11 = v_6((start_byte_offset + (v_10 * 64u)));
+      a_2[v_10] = v_11;
       {
-        v_13 = (v_14 + 1u);
+        v_9 = (v_10 + 1u);
       }
       continue;
     }
   }
-  Inner v_16[4] = a_2;
-  return v_16;
+  Inner v_12[4] = a_2;
+  return v_12;
 }
 
-Outer v_17(uint start_byte_offset) {
-  Inner v_18[4] = v_12(start_byte_offset);
-  Outer v_19 = {v_18};
-  return v_19;
+Outer v_13(uint start_byte_offset) {
+  Inner v_14[4] = v_8(start_byte_offset);
+  Outer v_15 = {v_14};
+  return v_15;
 }
 
 typedef Outer ary_ret_1[4];
-ary_ret_1 v_20(uint start_byte_offset) {
+ary_ret_1 v_16(uint start_byte_offset) {
   Outer a_1[4] = (Outer[4])0;
   {
-    uint v_21 = 0u;
-    v_21 = 0u;
+    uint v_17 = 0u;
+    v_17 = 0u;
     while(true) {
-      uint v_22 = v_21;
-      if ((v_22 >= 4u)) {
+      uint v_18 = v_17;
+      if ((v_18 >= 4u)) {
         break;
       }
-      Outer v_23 = v_17((start_byte_offset + (v_22 * 256u)));
-      a_1[v_22] = v_23;
+      Outer v_19 = v_13((start_byte_offset + (v_18 * 256u)));
+      a_1[v_18] = v_19;
       {
-        v_21 = (v_22 + 1u);
+        v_17 = (v_18 + 1u);
       }
       continue;
     }
   }
-  Outer v_24[4] = a_1;
-  return v_24;
+  Outer v_20[4] = a_1;
+  return v_20;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  uint v_25 = (256u * uint(i()));
-  uint v_26 = (64u * uint(i()));
-  uint v_27 = (4u * uint(i()));
-  Outer l_a[4] = v_20(0u);
-  Outer l_a_i = v_17(v_25);
-  Inner l_a_i_a[4] = v_12(v_25);
-  Inner l_a_i_a_i = v_10((v_25 + v_26));
-  matrix<float16_t, 4, 2> l_a_i_a_i_m = v_2((v_25 + v_26));
-  uint4 v_28 = a[(((v_25 + v_26) + v_27) / 16u)];
-  vector<float16_t, 2> l_a_i_a_i_m_i = tint_bitcast_to_f16((((((((v_25 + v_26) + v_27) % 16u) / 4u) == 2u)) ? (v_28.z) : (v_28.x)));
-  uint v_29 = (((v_25 + v_26) + v_27) + (uint(i()) * 2u));
-  uint v_30 = a[(v_29 / 16u)][((v_29 % 16u) / 4u)];
-  float16_t l_a_i_a_i_m_i_i = float16_t(f16tof32((v_30 >> ((((v_29 % 4u) == 0u)) ? (0u) : (16u)))));
+  uint v_21 = (256u * uint(i()));
+  uint v_22 = (64u * uint(i()));
+  uint v_23 = (4u * uint(i()));
+  Outer l_a[4] = v_16(0u);
+  Outer l_a_i = v_13(v_21);
+  Inner l_a_i_a[4] = v_8(v_21);
+  Inner l_a_i_a_i = v_6((v_21 + v_22));
+  matrix<float16_t, 4, 2> l_a_i_a_i_m = v_2((v_21 + v_22));
+  vector<float16_t, 2> l_a_i_a_i_m_i = tint_bitcast_to_f16(a[(((v_21 + v_22) + v_23) / 16u)][((((v_21 + v_22) + v_23) % 16u) / 4u)]);
+  uint v_24 = (((v_21 + v_22) + v_23) + (uint(i()) * 2u));
+  uint v_25 = a[(v_24 / 16u)][((v_24 % 16u) / 4u)];
+  float16_t l_a_i_a_i_m_i_i = float16_t(f16tof32((v_25 >> ((((v_24 % 4u) == 0u)) ? (0u) : (16u)))));
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 2fa5c48..6b9a0c3 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -19,81 +19,77 @@
 }
 
 matrix<float16_t, 4, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = a[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = a[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x)));
-  uint4 v_9 = a[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_4, v_6, v_8, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.z) : (v_9.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(a[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_3, v_4, v_5, tint_bitcast_to_f16(a[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
-Inner v_10(uint start_byte_offset) {
-  Inner v_11 = {v_2(start_byte_offset)};
-  return v_11;
+Inner v_6(uint start_byte_offset) {
+  Inner v_7 = {v_2(start_byte_offset)};
+  return v_7;
 }
 
 typedef Inner ary_ret[4];
-ary_ret v_12(uint start_byte_offset) {
+ary_ret v_8(uint start_byte_offset) {
   Inner a_2[4] = (Inner[4])0;
   {
-    uint v_13 = 0u;
-    v_13 = 0u;
+    uint v_9 = 0u;
+    v_9 = 0u;
     while(true) {
-      uint v_14 = v_13;
-      if ((v_14 >= 4u)) {
+      uint v_10 = v_9;
+      if ((v_10 >= 4u)) {
         break;
       }
-      Inner v_15 = v_10((start_byte_offset + (v_14 * 64u)));
-      a_2[v_14] = v_15;
+      Inner v_11 = v_6((start_byte_offset + (v_10 * 64u)));
+      a_2[v_10] = v_11;
       {
-        v_13 = (v_14 + 1u);
+        v_9 = (v_10 + 1u);
       }
       continue;
     }
   }
-  Inner v_16[4] = a_2;
-  return v_16;
+  Inner v_12[4] = a_2;
+  return v_12;
 }
 
-Outer v_17(uint start_byte_offset) {
-  Inner v_18[4] = v_12(start_byte_offset);
-  Outer v_19 = {v_18};
-  return v_19;
+Outer v_13(uint start_byte_offset) {
+  Inner v_14[4] = v_8(start_byte_offset);
+  Outer v_15 = {v_14};
+  return v_15;
 }
 
 typedef Outer ary_ret_1[4];
-ary_ret_1 v_20(uint start_byte_offset) {
+ary_ret_1 v_16(uint start_byte_offset) {
   Outer a_1[4] = (Outer[4])0;
   {
-    uint v_21 = 0u;
-    v_21 = 0u;
+    uint v_17 = 0u;
+    v_17 = 0u;
     while(true) {
-      uint v_22 = v_21;
-      if ((v_22 >= 4u)) {
+      uint v_18 = v_17;
+      if ((v_18 >= 4u)) {
         break;
       }
-      Outer v_23 = v_17((start_byte_offset + (v_22 * 256u)));
-      a_1[v_22] = v_23;
+      Outer v_19 = v_13((start_byte_offset + (v_18 * 256u)));
+      a_1[v_18] = v_19;
       {
-        v_21 = (v_22 + 1u);
+        v_17 = (v_18 + 1u);
       }
       continue;
     }
   }
-  Outer v_24[4] = a_1;
-  return v_24;
+  Outer v_20[4] = a_1;
+  return v_20;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  Outer l_a[4] = v_20(0u);
-  Outer l_a_3 = v_17(768u);
-  Inner l_a_3_a[4] = v_12(768u);
-  Inner l_a_3_a_2 = v_10(896u);
+  Outer l_a[4] = v_16(0u);
+  Outer l_a_3 = v_13(768u);
+  Inner l_a_3_a[4] = v_8(768u);
+  Inner l_a_3_a_2 = v_6(896u);
   matrix<float16_t, 4, 2> l_a_3_a_2_m = v_2(896u);
-  vector<float16_t, 2> l_a_3_a_2_m_1 = tint_bitcast_to_f16(a[56u].x);
+  vector<float16_t, 2> l_a_3_a_2_m_1 = tint_bitcast_to_f16(a[56u].y);
   float16_t l_a_3_a_2_m_1_0 = float16_t(f16tof32(a[56u].y));
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
index 84d7a86..0e87102 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
@@ -11,14 +11,10 @@
 }
 
 matrix<float16_t, 4, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x)));
-  uint4 v_9 = u[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_4, v_6, v_8, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.z) : (v_9.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_3, v_4, v_5, tint_bitcast_to_f16(u[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl
index 1a54175..4d956b0 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl
@@ -32,52 +32,48 @@
 }
 
 matrix<float16_t, 4, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x)));
-  uint4 v_9 = u[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_4, v_6, v_8, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.z) : (v_9.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_3, v_4, v_5, tint_bitcast_to_f16(u[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
-S v_10(uint start_byte_offset) {
-  int v_11 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 4, 2> v_12 = v_2((4u + start_byte_offset));
-  S v_13 = {v_11, v_12, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_13;
+S v_6(uint start_byte_offset) {
+  int v_7 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 4, 2> v_8 = v_2((4u + start_byte_offset));
+  S v_9 = {v_7, v_8, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_9;
 }
 
 typedef S ary_ret[4];
-ary_ret v_14(uint start_byte_offset) {
+ary_ret v_10(uint start_byte_offset) {
   S a_2[4] = (S[4])0;
   {
-    uint v_15 = 0u;
-    v_15 = 0u;
+    uint v_11 = 0u;
+    v_11 = 0u;
     while(true) {
-      uint v_16 = v_15;
-      if ((v_16 >= 4u)) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
         break;
       }
-      S v_17 = v_10((start_byte_offset + (v_16 * 128u)));
-      a_2[v_16] = v_17;
+      S v_13 = v_6((start_byte_offset + (v_12 * 128u)));
+      a_2[v_12] = v_13;
       {
-        v_15 = (v_16 + 1u);
+        v_11 = (v_12 + 1u);
       }
       continue;
     }
   }
-  S v_18[4] = a_2;
-  return v_18;
+  S v_14[4] = a_2;
+  return v_14;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_19[4] = v_14(0u);
-  a(v_19);
-  S v_20 = v_10(256u);
-  b(v_20);
+  S v_15[4] = v_10(0u);
+  a(v_15);
+  S v_16 = v_6(256u);
+  b(v_16);
   c(v_2(260u));
   d(tint_bitcast_to_f16(u[0u].z).yx);
   e(tint_bitcast_to_f16(u[0u].z).yx[0u]);
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_private.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_private.wgsl.expected.ir.dxc.hlsl
index d2210d8..0996879 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_private.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_private.wgsl.expected.ir.dxc.hlsl
@@ -18,52 +18,48 @@
 }
 
 matrix<float16_t, 4, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x)));
-  uint4 v_9 = u[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_4, v_6, v_8, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.z) : (v_9.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_3, v_4, v_5, tint_bitcast_to_f16(u[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
-S v_10(uint start_byte_offset) {
-  int v_11 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 4, 2> v_12 = v_2((4u + start_byte_offset));
-  S v_13 = {v_11, v_12, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_13;
+S v_6(uint start_byte_offset) {
+  int v_7 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 4, 2> v_8 = v_2((4u + start_byte_offset));
+  S v_9 = {v_7, v_8, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_9;
 }
 
 typedef S ary_ret[4];
-ary_ret v_14(uint start_byte_offset) {
+ary_ret v_10(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
-    uint v_15 = 0u;
-    v_15 = 0u;
+    uint v_11 = 0u;
+    v_11 = 0u;
     while(true) {
-      uint v_16 = v_15;
-      if ((v_16 >= 4u)) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
         break;
       }
-      S v_17 = v_10((start_byte_offset + (v_16 * 128u)));
-      a[v_16] = v_17;
+      S v_13 = v_6((start_byte_offset + (v_12 * 128u)));
+      a[v_12] = v_13;
       {
-        v_15 = (v_16 + 1u);
+        v_11 = (v_12 + 1u);
       }
       continue;
     }
   }
-  S v_18[4] = a;
-  return v_18;
+  S v_14[4] = a;
+  return v_14;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_19[4] = v_14(0u);
-  p = v_19;
-  S v_20 = v_10(256u);
-  p[int(1)] = v_20;
+  S v_15[4] = v_10(0u);
+  p = v_15;
+  S v_16 = v_6(256u);
+  p[int(1)] = v_16;
   p[int(3)].m = v_2(260u);
   p[int(1)].m[int(0)] = tint_bitcast_to_f16(u[0u].z).yx;
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl
index 1b6f91b..d937577 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl
@@ -25,30 +25,47 @@
 }
 
 matrix<float16_t, 4, 2> v_3(uint start_byte_offset) {
-  uint4 v_4 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_5 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_4.z) : (v_4.x)));
-  uint4 v_6 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_7 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_6.z) : (v_6.x)));
-  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_9 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.z) : (v_8.x)));
-  uint4 v_10 = u[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_5, v_7, v_9, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_10.z) : (v_10.x))));
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_4, v_5, v_6, tint_bitcast_to_f16(u[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
-void v_11(uint offset, S obj) {
+void v_7(uint offset, S obj) {
   s.Store((offset + 0u), asuint(obj.before));
   v_2((offset + 4u), obj.m);
   s.Store((offset + 64u), asuint(obj.after));
 }
 
-S v_12(uint start_byte_offset) {
-  int v_13 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 4, 2> v_14 = v_3((4u + start_byte_offset));
-  S v_15 = {v_13, v_14, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_15;
+S v_8(uint start_byte_offset) {
+  int v_9 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 4, 2> v_10 = v_3((4u + start_byte_offset));
+  S v_11 = {v_9, v_10, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_11;
 }
 
-void v_16(uint offset, S obj[4]) {
+void v_12(uint offset, S obj[4]) {
+  {
+    uint v_13 = 0u;
+    v_13 = 0u;
+    while(true) {
+      uint v_14 = v_13;
+      if ((v_14 >= 4u)) {
+        break;
+      }
+      S v_15 = obj[v_14];
+      v_7((offset + (v_14 * 128u)), v_15);
+      {
+        v_13 = (v_14 + 1u);
+      }
+      continue;
+    }
+  }
+}
+
+typedef S ary_ret[4];
+ary_ret v_16(uint start_byte_offset) {
+  S a[4] = (S[4])0;
   {
     uint v_17 = 0u;
     v_17 = 0u;
@@ -57,45 +74,24 @@
       if ((v_18 >= 4u)) {
         break;
       }
-      S v_19 = obj[v_18];
-      v_11((offset + (v_18 * 128u)), v_19);
+      S v_19 = v_8((start_byte_offset + (v_18 * 128u)));
+      a[v_18] = v_19;
       {
         v_17 = (v_18 + 1u);
       }
       continue;
     }
   }
-}
-
-typedef S ary_ret[4];
-ary_ret v_20(uint start_byte_offset) {
-  S a[4] = (S[4])0;
-  {
-    uint v_21 = 0u;
-    v_21 = 0u;
-    while(true) {
-      uint v_22 = v_21;
-      if ((v_22 >= 4u)) {
-        break;
-      }
-      S v_23 = v_12((start_byte_offset + (v_22 * 128u)));
-      a[v_22] = v_23;
-      {
-        v_21 = (v_22 + 1u);
-      }
-      continue;
-    }
-  }
-  S v_24[4] = a;
-  return v_24;
+  S v_20[4] = a;
+  return v_20;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_25[4] = v_20(0u);
-  v_16(0u, v_25);
-  S v_26 = v_12(256u);
-  v_11(128u, v_26);
+  S v_21[4] = v_16(0u);
+  v_12(0u, v_21);
+  S v_22 = v_8(256u);
+  v_7(128u, v_22);
   v_2(388u, v_3(260u));
   s.Store<vector<float16_t, 2> >(132u, tint_bitcast_to_f16(u[0u].z).yx);
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
index 87d9d81..4af271d 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
@@ -22,68 +22,64 @@
 }
 
 matrix<float16_t, 4, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x)));
-  uint4 v_9 = u[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_4, v_6, v_8, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.z) : (v_9.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_3, v_4, v_5, tint_bitcast_to_f16(u[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
-S v_10(uint start_byte_offset) {
-  int v_11 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 4, 2> v_12 = v_2((4u + start_byte_offset));
-  S v_13 = {v_11, v_12, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_13;
+S v_6(uint start_byte_offset) {
+  int v_7 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 4, 2> v_8 = v_2((4u + start_byte_offset));
+  S v_9 = {v_7, v_8, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_9;
 }
 
 typedef S ary_ret[4];
-ary_ret v_14(uint start_byte_offset) {
+ary_ret v_10(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
+    uint v_11 = 0u;
+    v_11 = 0u;
+    while(true) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
+        break;
+      }
+      S v_13 = v_6((start_byte_offset + (v_12 * 128u)));
+      a[v_12] = v_13;
+      {
+        v_11 = (v_12 + 1u);
+      }
+      continue;
+    }
+  }
+  S v_14[4] = a;
+  return v_14;
+}
+
+void f_inner(uint tint_local_index) {
+  {
     uint v_15 = 0u;
-    v_15 = 0u;
+    v_15 = tint_local_index;
     while(true) {
       uint v_16 = v_15;
       if ((v_16 >= 4u)) {
         break;
       }
-      S v_17 = v_10((start_byte_offset + (v_16 * 128u)));
-      a[v_16] = v_17;
+      S v_17 = (S)0;
+      w[v_16] = v_17;
       {
         v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  S v_18[4] = a;
-  return v_18;
-}
-
-void f_inner(uint tint_local_index) {
-  {
-    uint v_19 = 0u;
-    v_19 = tint_local_index;
-    while(true) {
-      uint v_20 = v_19;
-      if ((v_20 >= 4u)) {
-        break;
-      }
-      S v_21 = (S)0;
-      w[v_20] = v_21;
-      {
-        v_19 = (v_20 + 1u);
-      }
-      continue;
-    }
-  }
   GroupMemoryBarrierWithGroupSync();
-  S v_22[4] = v_14(0u);
-  w = v_22;
-  S v_23 = v_10(256u);
-  w[int(1)] = v_23;
+  S v_18[4] = v_10(0u);
+  w = v_18;
+  S v_19 = v_6(256u);
+  w[int(1)] = v_19;
   w[int(3)].m = v_2(260u);
   w[int(1)].m[int(0)] = tint_bitcast_to_f16(u[0u].z).yx;
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 4278f21..c025f59 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -16,12 +16,12 @@
   return counter;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -29,82 +29,87 @@
 }
 
 matrix<float16_t, 4, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(a[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_5, v_6, v_7, tint_bitcast_to_f16(a[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = a[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = a[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz;
+  uint4 v_11 = a[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))).xyz);
 }
 
-Inner v_8(uint start_byte_offset) {
-  Inner v_9 = {v_4(start_byte_offset)};
-  return v_9;
+Inner v_12(uint start_byte_offset) {
+  Inner v_13 = {v_4(start_byte_offset)};
+  return v_13;
 }
 
 typedef Inner ary_ret[4];
-ary_ret v_10(uint start_byte_offset) {
+ary_ret v_14(uint start_byte_offset) {
   Inner a_2[4] = (Inner[4])0;
   {
-    uint v_11 = 0u;
-    v_11 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_12 = v_11;
-      if ((v_12 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      Inner v_13 = v_8((start_byte_offset + (v_12 * 64u)));
-      a_2[v_12] = v_13;
+      Inner v_17 = v_12((start_byte_offset + (v_16 * 64u)));
+      a_2[v_16] = v_17;
       {
-        v_11 = (v_12 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  Inner v_14[4] = a_2;
-  return v_14;
+  Inner v_18[4] = a_2;
+  return v_18;
 }
 
-Outer v_15(uint start_byte_offset) {
-  Inner v_16[4] = v_10(start_byte_offset);
-  Outer v_17 = {v_16};
-  return v_17;
+Outer v_19(uint start_byte_offset) {
+  Inner v_20[4] = v_14(start_byte_offset);
+  Outer v_21 = {v_20};
+  return v_21;
 }
 
 typedef Outer ary_ret_1[4];
-ary_ret_1 v_18(uint start_byte_offset) {
+ary_ret_1 v_22(uint start_byte_offset) {
   Outer a_1[4] = (Outer[4])0;
   {
-    uint v_19 = 0u;
-    v_19 = 0u;
+    uint v_23 = 0u;
+    v_23 = 0u;
     while(true) {
-      uint v_20 = v_19;
-      if ((v_20 >= 4u)) {
+      uint v_24 = v_23;
+      if ((v_24 >= 4u)) {
         break;
       }
-      Outer v_21 = v_15((start_byte_offset + (v_20 * 256u)));
-      a_1[v_20] = v_21;
+      Outer v_25 = v_19((start_byte_offset + (v_24 * 256u)));
+      a_1[v_24] = v_25;
       {
-        v_19 = (v_20 + 1u);
+        v_23 = (v_24 + 1u);
       }
       continue;
     }
   }
-  Outer v_22[4] = a_1;
-  return v_22;
+  Outer v_26[4] = a_1;
+  return v_26;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  uint v_23 = (256u * uint(i()));
-  uint v_24 = (64u * uint(i()));
-  uint v_25 = (8u * uint(i()));
-  Outer l_a[4] = v_18(0u);
-  Outer l_a_i = v_15(v_23);
-  Inner l_a_i_a[4] = v_10(v_23);
-  Inner l_a_i_a_i = v_8((v_23 + v_24));
-  matrix<float16_t, 4, 3> l_a_i_a_i_m = v_4((v_23 + v_24));
-  vector<float16_t, 3> l_a_i_a_i_m_i = tint_bitcast_to_f16(a[(((v_23 + v_24) + v_25) / 16u)]).xyz;
-  uint v_26 = (((v_23 + v_24) + v_25) + (uint(i()) * 2u));
-  uint v_27 = a[(v_26 / 16u)][((v_26 % 16u) / 4u)];
-  float16_t l_a_i_a_i_m_i_i = float16_t(f16tof32((v_27 >> ((((v_26 % 4u) == 0u)) ? (0u) : (16u)))));
+  uint v_27 = (256u * uint(i()));
+  uint v_28 = (64u * uint(i()));
+  uint v_29 = (8u * uint(i()));
+  Outer l_a[4] = v_22(0u);
+  Outer l_a_i = v_19(v_27);
+  Inner l_a_i_a[4] = v_14(v_27);
+  Inner l_a_i_a_i = v_12((v_27 + v_28));
+  matrix<float16_t, 4, 3> l_a_i_a_i_m = v_4((v_27 + v_28));
+  uint4 v_30 = a[(((v_27 + v_28) + v_29) / 16u)];
+  vector<float16_t, 3> l_a_i_a_i_m_i = tint_bitcast_to_f16((((((((v_27 + v_28) + v_29) % 16u) / 4u) == 2u)) ? (v_30.zw) : (v_30.xy))).xyz;
+  uint v_31 = (((v_27 + v_28) + v_29) + (uint(i()) * 2u));
+  uint v_32 = a[(v_31 / 16u)][((v_31 % 16u) / 4u)];
+  float16_t l_a_i_a_i_m_i_i = float16_t(f16tof32((v_32 >> ((((v_31 % 4u) == 0u)) ? (0u) : (16u)))));
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 0373960..e2b1842 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -10,12 +10,12 @@
 cbuffer cbuffer_a : register(b0) {
   uint4 a[64];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -23,77 +23,81 @@
 }
 
 matrix<float16_t, 4, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(a[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_5, v_6, v_7, tint_bitcast_to_f16(a[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = a[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = a[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz;
+  uint4 v_11 = a[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))).xyz);
 }
 
-Inner v_8(uint start_byte_offset) {
-  Inner v_9 = {v_4(start_byte_offset)};
-  return v_9;
+Inner v_12(uint start_byte_offset) {
+  Inner v_13 = {v_4(start_byte_offset)};
+  return v_13;
 }
 
 typedef Inner ary_ret[4];
-ary_ret v_10(uint start_byte_offset) {
+ary_ret v_14(uint start_byte_offset) {
   Inner a_2[4] = (Inner[4])0;
   {
-    uint v_11 = 0u;
-    v_11 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_12 = v_11;
-      if ((v_12 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      Inner v_13 = v_8((start_byte_offset + (v_12 * 64u)));
-      a_2[v_12] = v_13;
+      Inner v_17 = v_12((start_byte_offset + (v_16 * 64u)));
+      a_2[v_16] = v_17;
       {
-        v_11 = (v_12 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  Inner v_14[4] = a_2;
-  return v_14;
+  Inner v_18[4] = a_2;
+  return v_18;
 }
 
-Outer v_15(uint start_byte_offset) {
-  Inner v_16[4] = v_10(start_byte_offset);
-  Outer v_17 = {v_16};
-  return v_17;
+Outer v_19(uint start_byte_offset) {
+  Inner v_20[4] = v_14(start_byte_offset);
+  Outer v_21 = {v_20};
+  return v_21;
 }
 
 typedef Outer ary_ret_1[4];
-ary_ret_1 v_18(uint start_byte_offset) {
+ary_ret_1 v_22(uint start_byte_offset) {
   Outer a_1[4] = (Outer[4])0;
   {
-    uint v_19 = 0u;
-    v_19 = 0u;
+    uint v_23 = 0u;
+    v_23 = 0u;
     while(true) {
-      uint v_20 = v_19;
-      if ((v_20 >= 4u)) {
+      uint v_24 = v_23;
+      if ((v_24 >= 4u)) {
         break;
       }
-      Outer v_21 = v_15((start_byte_offset + (v_20 * 256u)));
-      a_1[v_20] = v_21;
+      Outer v_25 = v_19((start_byte_offset + (v_24 * 256u)));
+      a_1[v_24] = v_25;
       {
-        v_19 = (v_20 + 1u);
+        v_23 = (v_24 + 1u);
       }
       continue;
     }
   }
-  Outer v_22[4] = a_1;
-  return v_22;
+  Outer v_26[4] = a_1;
+  return v_26;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  Outer l_a[4] = v_18(0u);
-  Outer l_a_3 = v_15(768u);
-  Inner l_a_3_a[4] = v_10(768u);
-  Inner l_a_3_a_2 = v_8(896u);
+  Outer l_a[4] = v_22(0u);
+  Outer l_a_3 = v_19(768u);
+  Inner l_a_3_a[4] = v_14(768u);
+  Inner l_a_3_a_2 = v_12(896u);
   matrix<float16_t, 4, 3> l_a_3_a_2_m = v_4(896u);
-  vector<float16_t, 3> l_a_3_a_2_m_1 = tint_bitcast_to_f16(a[56u]).xyz;
+  vector<float16_t, 3> l_a_3_a_2_m_1 = tint_bitcast_to_f16(a[56u].zw).xyz;
   float16_t l_a_3_a_2_m_1_0 = float16_t(f16tof32(a[56u].z));
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
index 336635e..f9642ed 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
@@ -2,12 +2,12 @@
 cbuffer cbuffer_u : register(b0) {
   uint4 u[32];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -15,16 +15,20 @@
 }
 
 matrix<float16_t, 4, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz;
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 3, 4> t = transpose(v_4(264u));
-  float16_t l = length(tint_bitcast_to_f16(u[1u]).xyz.zxy);
-  float16_t a = abs(tint_bitcast_to_f16(u[1u]).xyz.zxy[0u]);
+  float16_t l = length(tint_bitcast_to_f16(u[1u].xy).xyz.zxy);
+  float16_t a = abs(tint_bitcast_to_f16(u[1u].xy).xyz.zxy[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
index d4e42f8..53303c6 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
@@ -23,12 +23,12 @@
 void e(float16_t f_1) {
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -36,50 +36,54 @@
 }
 
 matrix<float16_t, 4, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz;
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))).xyz);
 }
 
-S v_8(uint start_byte_offset) {
-  int v_9 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 4, 3> v_10 = v_4((8u + start_byte_offset));
-  S v_11 = {v_9, v_10, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_11;
+S v_12(uint start_byte_offset) {
+  int v_13 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 4, 3> v_14 = v_4((8u + start_byte_offset));
+  S v_15 = {v_13, v_14, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_15;
 }
 
 typedef S ary_ret[4];
-ary_ret v_12(uint start_byte_offset) {
+ary_ret v_16(uint start_byte_offset) {
   S a_2[4] = (S[4])0;
   {
-    uint v_13 = 0u;
-    v_13 = 0u;
+    uint v_17 = 0u;
+    v_17 = 0u;
     while(true) {
-      uint v_14 = v_13;
-      if ((v_14 >= 4u)) {
+      uint v_18 = v_17;
+      if ((v_18 >= 4u)) {
         break;
       }
-      S v_15 = v_8((start_byte_offset + (v_14 * 128u)));
-      a_2[v_14] = v_15;
+      S v_19 = v_12((start_byte_offset + (v_18 * 128u)));
+      a_2[v_18] = v_19;
       {
-        v_13 = (v_14 + 1u);
+        v_17 = (v_18 + 1u);
       }
       continue;
     }
   }
-  S v_16[4] = a_2;
-  return v_16;
+  S v_20[4] = a_2;
+  return v_20;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_17[4] = v_12(0u);
-  a(v_17);
-  S v_18 = v_8(256u);
-  b(v_18);
+  S v_21[4] = v_16(0u);
+  a(v_21);
+  S v_22 = v_12(256u);
+  b(v_22);
   c(v_4(264u));
-  d(tint_bitcast_to_f16(u[1u]).xyz.zxy);
-  e(tint_bitcast_to_f16(u[1u]).xyz.zxy[0u]);
+  d(tint_bitcast_to_f16(u[1u].xy).xyz.zxy);
+  e(tint_bitcast_to_f16(u[1u].xy).xyz.zxy[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_private.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
index 0c59ebc..cb72f9e 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
@@ -9,12 +9,12 @@
   uint4 u[32];
 };
 static S p[4] = (S[4])0;
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -22,49 +22,53 @@
 }
 
 matrix<float16_t, 4, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz;
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))).xyz);
 }
 
-S v_8(uint start_byte_offset) {
-  int v_9 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 4, 3> v_10 = v_4((8u + start_byte_offset));
-  S v_11 = {v_9, v_10, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_11;
+S v_12(uint start_byte_offset) {
+  int v_13 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 4, 3> v_14 = v_4((8u + start_byte_offset));
+  S v_15 = {v_13, v_14, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_15;
 }
 
 typedef S ary_ret[4];
-ary_ret v_12(uint start_byte_offset) {
+ary_ret v_16(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
-    uint v_13 = 0u;
-    v_13 = 0u;
+    uint v_17 = 0u;
+    v_17 = 0u;
     while(true) {
-      uint v_14 = v_13;
-      if ((v_14 >= 4u)) {
+      uint v_18 = v_17;
+      if ((v_18 >= 4u)) {
         break;
       }
-      S v_15 = v_8((start_byte_offset + (v_14 * 128u)));
-      a[v_14] = v_15;
+      S v_19 = v_12((start_byte_offset + (v_18 * 128u)));
+      a[v_18] = v_19;
       {
-        v_13 = (v_14 + 1u);
+        v_17 = (v_18 + 1u);
       }
       continue;
     }
   }
-  S v_16[4] = a;
-  return v_16;
+  S v_20[4] = a;
+  return v_20;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_17[4] = v_12(0u);
-  p = v_17;
-  S v_18 = v_8(256u);
-  p[int(1)] = v_18;
+  S v_21[4] = v_16(0u);
+  p = v_21;
+  S v_22 = v_12(256u);
+  p[int(1)] = v_22;
   p[int(3)].m = v_4(264u);
-  p[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u]).xyz.zxy;
+  p[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u].xy).xyz.zxy;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
index fa632e5..ec48ccb 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
@@ -9,12 +9,12 @@
   uint4 u[32];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -29,47 +29,30 @@
 }
 
 matrix<float16_t, 4, 3> v_5(uint start_byte_offset) {
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_6, v_7, v_8, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_6 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.zw) : (v_6.xy))).xyz;
+  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_9 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy))).xyz;
+  uint4 v_10 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_11 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_10.zw) : (v_10.xy))).xyz;
+  uint4 v_12 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_7, v_9, v_11, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_12.zw) : (v_12.xy))).xyz);
 }
 
-void v_9(uint offset, S obj) {
+void v_13(uint offset, S obj) {
   s.Store((offset + 0u), asuint(obj.before));
   v_4((offset + 8u), obj.m);
   s.Store((offset + 64u), asuint(obj.after));
 }
 
-S v_10(uint start_byte_offset) {
-  int v_11 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 4, 3> v_12 = v_5((8u + start_byte_offset));
-  S v_13 = {v_11, v_12, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_13;
+S v_14(uint start_byte_offset) {
+  int v_15 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 4, 3> v_16 = v_5((8u + start_byte_offset));
+  S v_17 = {v_15, v_16, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_17;
 }
 
-void v_14(uint offset, S obj[4]) {
-  {
-    uint v_15 = 0u;
-    v_15 = 0u;
-    while(true) {
-      uint v_16 = v_15;
-      if ((v_16 >= 4u)) {
-        break;
-      }
-      S v_17 = obj[v_16];
-      v_9((offset + (v_16 * 128u)), v_17);
-      {
-        v_15 = (v_16 + 1u);
-      }
-      continue;
-    }
-  }
-}
-
-typedef S ary_ret[4];
-ary_ret v_18(uint start_byte_offset) {
-  S a[4] = (S[4])0;
+void v_18(uint offset, S obj[4]) {
   {
     uint v_19 = 0u;
     v_19 = 0u;
@@ -78,25 +61,46 @@
       if ((v_20 >= 4u)) {
         break;
       }
-      S v_21 = v_10((start_byte_offset + (v_20 * 128u)));
-      a[v_20] = v_21;
+      S v_21 = obj[v_20];
+      v_13((offset + (v_20 * 128u)), v_21);
       {
         v_19 = (v_20 + 1u);
       }
       continue;
     }
   }
-  S v_22[4] = a;
-  return v_22;
+}
+
+typedef S ary_ret[4];
+ary_ret v_22(uint start_byte_offset) {
+  S a[4] = (S[4])0;
+  {
+    uint v_23 = 0u;
+    v_23 = 0u;
+    while(true) {
+      uint v_24 = v_23;
+      if ((v_24 >= 4u)) {
+        break;
+      }
+      S v_25 = v_14((start_byte_offset + (v_24 * 128u)));
+      a[v_24] = v_25;
+      {
+        v_23 = (v_24 + 1u);
+      }
+      continue;
+    }
+  }
+  S v_26[4] = a;
+  return v_26;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_23[4] = v_18(0u);
-  v_14(0u, v_23);
-  S v_24 = v_10(256u);
-  v_9(128u, v_24);
+  S v_27[4] = v_22(0u);
+  v_18(0u, v_27);
+  S v_28 = v_14(256u);
+  v_13(128u, v_28);
   v_4(392u, v_5(264u));
-  s.Store<vector<float16_t, 3> >(136u, tint_bitcast_to_f16(u[1u]).xyz.zxy);
+  s.Store<vector<float16_t, 3> >(136u, tint_bitcast_to_f16(u[1u].xy).xyz.zxy);
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
index decee30..1bafc47 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
@@ -13,12 +13,12 @@
   uint4 u[32];
 };
 groupshared S w[4];
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -26,66 +26,70 @@
 }
 
 matrix<float16_t, 4, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz;
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))).xyz);
 }
 
-S v_8(uint start_byte_offset) {
-  int v_9 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 4, 3> v_10 = v_4((8u + start_byte_offset));
-  S v_11 = {v_9, v_10, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_11;
+S v_12(uint start_byte_offset) {
+  int v_13 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 4, 3> v_14 = v_4((8u + start_byte_offset));
+  S v_15 = {v_13, v_14, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_15;
 }
 
 typedef S ary_ret[4];
-ary_ret v_12(uint start_byte_offset) {
+ary_ret v_16(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
-    uint v_13 = 0u;
-    v_13 = 0u;
-    while(true) {
-      uint v_14 = v_13;
-      if ((v_14 >= 4u)) {
-        break;
-      }
-      S v_15 = v_8((start_byte_offset + (v_14 * 128u)));
-      a[v_14] = v_15;
-      {
-        v_13 = (v_14 + 1u);
-      }
-      continue;
-    }
-  }
-  S v_16[4] = a;
-  return v_16;
-}
-
-void f_inner(uint tint_local_index) {
-  {
     uint v_17 = 0u;
-    v_17 = tint_local_index;
+    v_17 = 0u;
     while(true) {
       uint v_18 = v_17;
       if ((v_18 >= 4u)) {
         break;
       }
-      S v_19 = (S)0;
-      w[v_18] = v_19;
+      S v_19 = v_12((start_byte_offset + (v_18 * 128u)));
+      a[v_18] = v_19;
       {
         v_17 = (v_18 + 1u);
       }
       continue;
     }
   }
+  S v_20[4] = a;
+  return v_20;
+}
+
+void f_inner(uint tint_local_index) {
+  {
+    uint v_21 = 0u;
+    v_21 = tint_local_index;
+    while(true) {
+      uint v_22 = v_21;
+      if ((v_22 >= 4u)) {
+        break;
+      }
+      S v_23 = (S)0;
+      w[v_22] = v_23;
+      {
+        v_21 = (v_22 + 1u);
+      }
+      continue;
+    }
+  }
   GroupMemoryBarrierWithGroupSync();
-  S v_20[4] = v_12(0u);
-  w = v_20;
-  S v_21 = v_8(256u);
-  w[int(1)] = v_21;
+  S v_24[4] = v_16(0u);
+  w = v_24;
+  S v_25 = v_12(256u);
+  w[int(1)] = v_25;
   w[int(3)].m = v_4(264u);
-  w[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u]).xyz.zxy;
+  w[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u].xy).xyz.zxy;
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index b6d0f07..0cc994b 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -16,12 +16,12 @@
   return counter;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -29,82 +29,87 @@
 }
 
 matrix<float16_t, 4, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(a[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_5, v_6, v_7, tint_bitcast_to_f16(a[((24u + start_byte_offset) / 16u)]));
+  uint4 v_5 = a[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = a[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy)));
+  uint4 v_11 = a[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))));
 }
 
-Inner v_8(uint start_byte_offset) {
-  Inner v_9 = {v_4(start_byte_offset)};
-  return v_9;
+Inner v_12(uint start_byte_offset) {
+  Inner v_13 = {v_4(start_byte_offset)};
+  return v_13;
 }
 
 typedef Inner ary_ret[4];
-ary_ret v_10(uint start_byte_offset) {
+ary_ret v_14(uint start_byte_offset) {
   Inner a_2[4] = (Inner[4])0;
   {
-    uint v_11 = 0u;
-    v_11 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_12 = v_11;
-      if ((v_12 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      Inner v_13 = v_8((start_byte_offset + (v_12 * 64u)));
-      a_2[v_12] = v_13;
+      Inner v_17 = v_12((start_byte_offset + (v_16 * 64u)));
+      a_2[v_16] = v_17;
       {
-        v_11 = (v_12 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  Inner v_14[4] = a_2;
-  return v_14;
+  Inner v_18[4] = a_2;
+  return v_18;
 }
 
-Outer v_15(uint start_byte_offset) {
-  Inner v_16[4] = v_10(start_byte_offset);
-  Outer v_17 = {v_16};
-  return v_17;
+Outer v_19(uint start_byte_offset) {
+  Inner v_20[4] = v_14(start_byte_offset);
+  Outer v_21 = {v_20};
+  return v_21;
 }
 
 typedef Outer ary_ret_1[4];
-ary_ret_1 v_18(uint start_byte_offset) {
+ary_ret_1 v_22(uint start_byte_offset) {
   Outer a_1[4] = (Outer[4])0;
   {
-    uint v_19 = 0u;
-    v_19 = 0u;
+    uint v_23 = 0u;
+    v_23 = 0u;
     while(true) {
-      uint v_20 = v_19;
-      if ((v_20 >= 4u)) {
+      uint v_24 = v_23;
+      if ((v_24 >= 4u)) {
         break;
       }
-      Outer v_21 = v_15((start_byte_offset + (v_20 * 256u)));
-      a_1[v_20] = v_21;
+      Outer v_25 = v_19((start_byte_offset + (v_24 * 256u)));
+      a_1[v_24] = v_25;
       {
-        v_19 = (v_20 + 1u);
+        v_23 = (v_24 + 1u);
       }
       continue;
     }
   }
-  Outer v_22[4] = a_1;
-  return v_22;
+  Outer v_26[4] = a_1;
+  return v_26;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  uint v_23 = (256u * uint(i()));
-  uint v_24 = (64u * uint(i()));
-  uint v_25 = (8u * uint(i()));
-  Outer l_a[4] = v_18(0u);
-  Outer l_a_i = v_15(v_23);
-  Inner l_a_i_a[4] = v_10(v_23);
-  Inner l_a_i_a_i = v_8((v_23 + v_24));
-  matrix<float16_t, 4, 4> l_a_i_a_i_m = v_4((v_23 + v_24));
-  vector<float16_t, 4> l_a_i_a_i_m_i = tint_bitcast_to_f16(a[(((v_23 + v_24) + v_25) / 16u)]);
-  uint v_26 = (((v_23 + v_24) + v_25) + (uint(i()) * 2u));
-  uint v_27 = a[(v_26 / 16u)][((v_26 % 16u) / 4u)];
-  float16_t l_a_i_a_i_m_i_i = float16_t(f16tof32((v_27 >> ((((v_26 % 4u) == 0u)) ? (0u) : (16u)))));
+  uint v_27 = (256u * uint(i()));
+  uint v_28 = (64u * uint(i()));
+  uint v_29 = (8u * uint(i()));
+  Outer l_a[4] = v_22(0u);
+  Outer l_a_i = v_19(v_27);
+  Inner l_a_i_a[4] = v_14(v_27);
+  Inner l_a_i_a_i = v_12((v_27 + v_28));
+  matrix<float16_t, 4, 4> l_a_i_a_i_m = v_4((v_27 + v_28));
+  uint4 v_30 = a[(((v_27 + v_28) + v_29) / 16u)];
+  vector<float16_t, 4> l_a_i_a_i_m_i = tint_bitcast_to_f16((((((((v_27 + v_28) + v_29) % 16u) / 4u) == 2u)) ? (v_30.zw) : (v_30.xy)));
+  uint v_31 = (((v_27 + v_28) + v_29) + (uint(i()) * 2u));
+  uint v_32 = a[(v_31 / 16u)][((v_31 % 16u) / 4u)];
+  float16_t l_a_i_a_i_m_i_i = float16_t(f16tof32((v_32 >> ((((v_31 % 4u) == 0u)) ? (0u) : (16u)))));
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 8375781..b4f72db 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -10,12 +10,12 @@
 cbuffer cbuffer_a : register(b0) {
   uint4 a[64];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -23,77 +23,81 @@
 }
 
 matrix<float16_t, 4, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(a[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(a[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(a[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_5, v_6, v_7, tint_bitcast_to_f16(a[((24u + start_byte_offset) / 16u)]));
+  uint4 v_5 = a[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = a[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = a[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy)));
+  uint4 v_11 = a[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))));
 }
 
-Inner v_8(uint start_byte_offset) {
-  Inner v_9 = {v_4(start_byte_offset)};
-  return v_9;
+Inner v_12(uint start_byte_offset) {
+  Inner v_13 = {v_4(start_byte_offset)};
+  return v_13;
 }
 
 typedef Inner ary_ret[4];
-ary_ret v_10(uint start_byte_offset) {
+ary_ret v_14(uint start_byte_offset) {
   Inner a_2[4] = (Inner[4])0;
   {
-    uint v_11 = 0u;
-    v_11 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_12 = v_11;
-      if ((v_12 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      Inner v_13 = v_8((start_byte_offset + (v_12 * 64u)));
-      a_2[v_12] = v_13;
+      Inner v_17 = v_12((start_byte_offset + (v_16 * 64u)));
+      a_2[v_16] = v_17;
       {
-        v_11 = (v_12 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  Inner v_14[4] = a_2;
-  return v_14;
+  Inner v_18[4] = a_2;
+  return v_18;
 }
 
-Outer v_15(uint start_byte_offset) {
-  Inner v_16[4] = v_10(start_byte_offset);
-  Outer v_17 = {v_16};
-  return v_17;
+Outer v_19(uint start_byte_offset) {
+  Inner v_20[4] = v_14(start_byte_offset);
+  Outer v_21 = {v_20};
+  return v_21;
 }
 
 typedef Outer ary_ret_1[4];
-ary_ret_1 v_18(uint start_byte_offset) {
+ary_ret_1 v_22(uint start_byte_offset) {
   Outer a_1[4] = (Outer[4])0;
   {
-    uint v_19 = 0u;
-    v_19 = 0u;
+    uint v_23 = 0u;
+    v_23 = 0u;
     while(true) {
-      uint v_20 = v_19;
-      if ((v_20 >= 4u)) {
+      uint v_24 = v_23;
+      if ((v_24 >= 4u)) {
         break;
       }
-      Outer v_21 = v_15((start_byte_offset + (v_20 * 256u)));
-      a_1[v_20] = v_21;
+      Outer v_25 = v_19((start_byte_offset + (v_24 * 256u)));
+      a_1[v_24] = v_25;
       {
-        v_19 = (v_20 + 1u);
+        v_23 = (v_24 + 1u);
       }
       continue;
     }
   }
-  Outer v_22[4] = a_1;
-  return v_22;
+  Outer v_26[4] = a_1;
+  return v_26;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  Outer l_a[4] = v_18(0u);
-  Outer l_a_3 = v_15(768u);
-  Inner l_a_3_a[4] = v_10(768u);
-  Inner l_a_3_a_2 = v_8(896u);
+  Outer l_a[4] = v_22(0u);
+  Outer l_a_3 = v_19(768u);
+  Inner l_a_3_a[4] = v_14(768u);
+  Inner l_a_3_a_2 = v_12(896u);
   matrix<float16_t, 4, 4> l_a_3_a_2_m = v_4(896u);
-  vector<float16_t, 4> l_a_3_a_2_m_1 = tint_bitcast_to_f16(a[56u]);
+  vector<float16_t, 4> l_a_3_a_2_m_1 = tint_bitcast_to_f16(a[56u].zw);
   float16_t l_a_3_a_2_m_1_0 = float16_t(f16tof32(a[56u].z));
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
index 0795183..2c5d181 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
@@ -2,12 +2,12 @@
 cbuffer cbuffer_u : register(b0) {
   uint4 u[32];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -15,16 +15,20 @@
 }
 
 matrix<float16_t, 4, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy)));
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 4, 4> t = transpose(v_4(264u));
-  float16_t l = length(tint_bitcast_to_f16(u[1u]).ywxz);
-  float16_t a = abs(tint_bitcast_to_f16(u[1u]).ywxz[0u]);
+  float16_t l = length(tint_bitcast_to_f16(u[1u].xy).ywxz);
+  float16_t a = abs(tint_bitcast_to_f16(u[1u].xy).ywxz[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
index 8a0f55b..3f69c24 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
@@ -23,12 +23,12 @@
 void e(float16_t f_1) {
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -36,50 +36,54 @@
 }
 
 matrix<float16_t, 4, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy)));
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))));
 }
 
-S v_8(uint start_byte_offset) {
-  int v_9 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 4, 4> v_10 = v_4((8u + start_byte_offset));
-  S v_11 = {v_9, v_10, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_11;
+S v_12(uint start_byte_offset) {
+  int v_13 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 4, 4> v_14 = v_4((8u + start_byte_offset));
+  S v_15 = {v_13, v_14, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_15;
 }
 
 typedef S ary_ret[4];
-ary_ret v_12(uint start_byte_offset) {
+ary_ret v_16(uint start_byte_offset) {
   S a_2[4] = (S[4])0;
   {
-    uint v_13 = 0u;
-    v_13 = 0u;
+    uint v_17 = 0u;
+    v_17 = 0u;
     while(true) {
-      uint v_14 = v_13;
-      if ((v_14 >= 4u)) {
+      uint v_18 = v_17;
+      if ((v_18 >= 4u)) {
         break;
       }
-      S v_15 = v_8((start_byte_offset + (v_14 * 128u)));
-      a_2[v_14] = v_15;
+      S v_19 = v_12((start_byte_offset + (v_18 * 128u)));
+      a_2[v_18] = v_19;
       {
-        v_13 = (v_14 + 1u);
+        v_17 = (v_18 + 1u);
       }
       continue;
     }
   }
-  S v_16[4] = a_2;
-  return v_16;
+  S v_20[4] = a_2;
+  return v_20;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_17[4] = v_12(0u);
-  a(v_17);
-  S v_18 = v_8(256u);
-  b(v_18);
+  S v_21[4] = v_16(0u);
+  a(v_21);
+  S v_22 = v_12(256u);
+  b(v_22);
   c(v_4(264u));
-  d(tint_bitcast_to_f16(u[1u]).ywxz);
-  e(tint_bitcast_to_f16(u[1u]).ywxz[0u]);
+  d(tint_bitcast_to_f16(u[1u].xy).ywxz);
+  e(tint_bitcast_to_f16(u[1u].xy).ywxz[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_private.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
index 81d479d..40b6938 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
@@ -9,12 +9,12 @@
   uint4 u[32];
 };
 static S p[4] = (S[4])0;
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -22,49 +22,53 @@
 }
 
 matrix<float16_t, 4, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy)));
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))));
 }
 
-S v_8(uint start_byte_offset) {
-  int v_9 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 4, 4> v_10 = v_4((8u + start_byte_offset));
-  S v_11 = {v_9, v_10, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_11;
+S v_12(uint start_byte_offset) {
+  int v_13 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 4, 4> v_14 = v_4((8u + start_byte_offset));
+  S v_15 = {v_13, v_14, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_15;
 }
 
 typedef S ary_ret[4];
-ary_ret v_12(uint start_byte_offset) {
+ary_ret v_16(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
-    uint v_13 = 0u;
-    v_13 = 0u;
+    uint v_17 = 0u;
+    v_17 = 0u;
     while(true) {
-      uint v_14 = v_13;
-      if ((v_14 >= 4u)) {
+      uint v_18 = v_17;
+      if ((v_18 >= 4u)) {
         break;
       }
-      S v_15 = v_8((start_byte_offset + (v_14 * 128u)));
-      a[v_14] = v_15;
+      S v_19 = v_12((start_byte_offset + (v_18 * 128u)));
+      a[v_18] = v_19;
       {
-        v_13 = (v_14 + 1u);
+        v_17 = (v_18 + 1u);
       }
       continue;
     }
   }
-  S v_16[4] = a;
-  return v_16;
+  S v_20[4] = a;
+  return v_20;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_17[4] = v_12(0u);
-  p = v_17;
-  S v_18 = v_8(256u);
-  p[int(1)] = v_18;
+  S v_21[4] = v_16(0u);
+  p = v_21;
+  S v_22 = v_12(256u);
+  p[int(1)] = v_22;
   p[int(3)].m = v_4(264u);
-  p[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u]).ywxz;
+  p[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u].xy).ywxz;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
index af568c1..6aeac08 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
@@ -9,12 +9,12 @@
   uint4 u[32];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -29,47 +29,30 @@
 }
 
 matrix<float16_t, 4, 4> v_5(uint start_byte_offset) {
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_6, v_7, v_8, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]));
+  uint4 v_6 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.zw) : (v_6.xy)));
+  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_9 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy)));
+  uint4 v_10 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_11 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_10.zw) : (v_10.xy)));
+  uint4 v_12 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_7, v_9, v_11, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_12.zw) : (v_12.xy))));
 }
 
-void v_9(uint offset, S obj) {
+void v_13(uint offset, S obj) {
   s.Store((offset + 0u), asuint(obj.before));
   v_4((offset + 8u), obj.m);
   s.Store((offset + 64u), asuint(obj.after));
 }
 
-S v_10(uint start_byte_offset) {
-  int v_11 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 4, 4> v_12 = v_5((8u + start_byte_offset));
-  S v_13 = {v_11, v_12, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_13;
+S v_14(uint start_byte_offset) {
+  int v_15 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 4, 4> v_16 = v_5((8u + start_byte_offset));
+  S v_17 = {v_15, v_16, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_17;
 }
 
-void v_14(uint offset, S obj[4]) {
-  {
-    uint v_15 = 0u;
-    v_15 = 0u;
-    while(true) {
-      uint v_16 = v_15;
-      if ((v_16 >= 4u)) {
-        break;
-      }
-      S v_17 = obj[v_16];
-      v_9((offset + (v_16 * 128u)), v_17);
-      {
-        v_15 = (v_16 + 1u);
-      }
-      continue;
-    }
-  }
-}
-
-typedef S ary_ret[4];
-ary_ret v_18(uint start_byte_offset) {
-  S a[4] = (S[4])0;
+void v_18(uint offset, S obj[4]) {
   {
     uint v_19 = 0u;
     v_19 = 0u;
@@ -78,25 +61,46 @@
       if ((v_20 >= 4u)) {
         break;
       }
-      S v_21 = v_10((start_byte_offset + (v_20 * 128u)));
-      a[v_20] = v_21;
+      S v_21 = obj[v_20];
+      v_13((offset + (v_20 * 128u)), v_21);
       {
         v_19 = (v_20 + 1u);
       }
       continue;
     }
   }
-  S v_22[4] = a;
-  return v_22;
+}
+
+typedef S ary_ret[4];
+ary_ret v_22(uint start_byte_offset) {
+  S a[4] = (S[4])0;
+  {
+    uint v_23 = 0u;
+    v_23 = 0u;
+    while(true) {
+      uint v_24 = v_23;
+      if ((v_24 >= 4u)) {
+        break;
+      }
+      S v_25 = v_14((start_byte_offset + (v_24 * 128u)));
+      a[v_24] = v_25;
+      {
+        v_23 = (v_24 + 1u);
+      }
+      continue;
+    }
+  }
+  S v_26[4] = a;
+  return v_26;
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  S v_23[4] = v_18(0u);
-  v_14(0u, v_23);
-  S v_24 = v_10(256u);
-  v_9(128u, v_24);
+  S v_27[4] = v_22(0u);
+  v_18(0u, v_27);
+  S v_28 = v_14(256u);
+  v_13(128u, v_28);
   v_4(392u, v_5(264u));
-  s.Store<vector<float16_t, 4> >(136u, tint_bitcast_to_f16(u[1u]).ywxz);
+  s.Store<vector<float16_t, 4> >(136u, tint_bitcast_to_f16(u[1u].xy).ywxz);
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
index f65e027..43b7684 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
@@ -13,12 +13,12 @@
   uint4 u[32];
 };
 groupshared S w[4];
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -26,66 +26,70 @@
 }
 
 matrix<float16_t, 4, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy)));
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))));
 }
 
-S v_8(uint start_byte_offset) {
-  int v_9 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
-  matrix<float16_t, 4, 4> v_10 = v_4((8u + start_byte_offset));
-  S v_11 = {v_9, v_10, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
-  return v_11;
+S v_12(uint start_byte_offset) {
+  int v_13 = asint(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  matrix<float16_t, 4, 4> v_14 = v_4((8u + start_byte_offset));
+  S v_15 = {v_13, v_14, asint(u[((64u + start_byte_offset) / 16u)][(((64u + start_byte_offset) % 16u) / 4u)])};
+  return v_15;
 }
 
 typedef S ary_ret[4];
-ary_ret v_12(uint start_byte_offset) {
+ary_ret v_16(uint start_byte_offset) {
   S a[4] = (S[4])0;
   {
-    uint v_13 = 0u;
-    v_13 = 0u;
-    while(true) {
-      uint v_14 = v_13;
-      if ((v_14 >= 4u)) {
-        break;
-      }
-      S v_15 = v_8((start_byte_offset + (v_14 * 128u)));
-      a[v_14] = v_15;
-      {
-        v_13 = (v_14 + 1u);
-      }
-      continue;
-    }
-  }
-  S v_16[4] = a;
-  return v_16;
-}
-
-void f_inner(uint tint_local_index) {
-  {
     uint v_17 = 0u;
-    v_17 = tint_local_index;
+    v_17 = 0u;
     while(true) {
       uint v_18 = v_17;
       if ((v_18 >= 4u)) {
         break;
       }
-      S v_19 = (S)0;
-      w[v_18] = v_19;
+      S v_19 = v_12((start_byte_offset + (v_18 * 128u)));
+      a[v_18] = v_19;
       {
         v_17 = (v_18 + 1u);
       }
       continue;
     }
   }
+  S v_20[4] = a;
+  return v_20;
+}
+
+void f_inner(uint tint_local_index) {
+  {
+    uint v_21 = 0u;
+    v_21 = tint_local_index;
+    while(true) {
+      uint v_22 = v_21;
+      if ((v_22 >= 4u)) {
+        break;
+      }
+      S v_23 = (S)0;
+      w[v_22] = v_23;
+      {
+        v_21 = (v_22 + 1u);
+      }
+      continue;
+    }
+  }
   GroupMemoryBarrierWithGroupSync();
-  S v_20[4] = v_12(0u);
-  w = v_20;
-  S v_21 = v_8(256u);
-  w[int(1)] = v_21;
+  S v_24[4] = v_16(0u);
+  w = v_24;
+  S v_25 = v_12(256u);
+  w[int(1)] = v_25;
   w[int(3)].m = v_4(264u);
-  w[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u]).ywxz;
+  w[int(1)].m[int(0)] = tint_bitcast_to_f16(u[1u].xy).ywxz;
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index c20960a..68d778f 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -17,17 +17,14 @@
 }
 
 matrix<float16_t, 2, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = m[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = m[((4u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 2, 2>(v_4, tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(m[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  return matrix<float16_t, 2, 2>(v_3, tint_bitcast_to_f16(m[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  uint v_6 = (4u * uint(i()));
+  uint v_4 = (4u * uint(i()));
   matrix<float16_t, 2, 2> l_m = v_2(0u);
-  uint4 v_7 = m[(v_6 / 16u)];
-  vector<float16_t, 2> l_m_i = tint_bitcast_to_f16((((((v_6 % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x)));
+  vector<float16_t, 2> l_m_i = tint_bitcast_to_f16(m[(v_4 / 16u)][((v_4 % 16u) / 4u)]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 3f63cd9..b57483d 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -17,15 +17,13 @@
 }
 
 matrix<float16_t, 2, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = m[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = m[((4u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 2, 2>(v_4, tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(m[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  return matrix<float16_t, 2, 2>(v_3, tint_bitcast_to_f16(m[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 2, 2> l_m = v_2(0u);
-  vector<float16_t, 2> l_m_1 = tint_bitcast_to_f16(m[0u].x);
+  vector<float16_t, 2> l_m_1 = tint_bitcast_to_f16(m[0u].y);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
index abe7f20..517682e 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
@@ -11,16 +11,14 @@
 }
 
 matrix<float16_t, 2, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 2, 2>(v_4, tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  return matrix<float16_t, 2, 2>(v_3, tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 2, 2> t = transpose(v_2(0u));
-  float16_t l = length(tint_bitcast_to_f16(u[0u].x));
+  float16_t l = length(tint_bitcast_to_f16(u[0u].y));
   float16_t a = abs(tint_bitcast_to_f16(u[0u].x).yx[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl
index ba67b7d..d5fd370 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl
@@ -20,18 +20,16 @@
 }
 
 matrix<float16_t, 2, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 2, 2>(v_4, tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  return matrix<float16_t, 2, 2>(v_3, tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   a(v_2(0u));
-  b(tint_bitcast_to_f16(u[0u].x));
-  b(tint_bitcast_to_f16(u[0u].x).yx);
+  b(tint_bitcast_to_f16(u[0u].y));
+  b(tint_bitcast_to_f16(u[0u].y).yx);
   c(float16_t(f16tof32(u[0u].y)));
-  c(tint_bitcast_to_f16(u[0u].x).yx[0u]);
+  c(tint_bitcast_to_f16(u[0u].y).yx[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_private.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_private.wgsl.expected.ir.dxc.hlsl
index 73fa1f4..0263d20 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_private.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_private.wgsl.expected.ir.dxc.hlsl
@@ -12,10 +12,8 @@
 }
 
 matrix<float16_t, 2, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 2, 2>(v_4, tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  return matrix<float16_t, 2, 2>(v_3, tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl
index e2627f2..b3bab98 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl
@@ -17,10 +17,8 @@
 }
 
 matrix<float16_t, 2, 2> v_3(uint start_byte_offset) {
-  uint4 v_4 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_5 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_4.z) : (v_4.x)));
-  uint4 v_6 = u[((4u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 2, 2>(v_5, tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_6.z) : (v_6.x))));
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  return matrix<float16_t, 2, 2>(v_4, tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
index 123a4b3..82e1256 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
@@ -16,10 +16,8 @@
 }
 
 matrix<float16_t, 2, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 2, 2>(v_4, tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  return matrix<float16_t, 2, 2>(v_3, tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]));
 }
 
 void f_inner(uint tint_local_index) {
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index f2023fd..b018752 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -8,12 +8,12 @@
   return counter;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -21,14 +21,17 @@
 }
 
 matrix<float16_t, 2, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(m[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_5, tint_bitcast_to_f16(m[((8u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = m[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = m[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  uint v_6 = (8u * uint(i()));
+  uint v_8 = (8u * uint(i()));
   matrix<float16_t, 2, 3> l_m = v_4(0u);
-  vector<float16_t, 3> l_m_i = tint_bitcast_to_f16(m[(v_6 / 16u)]).xyz;
+  uint4 v_9 = m[(v_8 / 16u)];
+  vector<float16_t, 3> l_m_i = tint_bitcast_to_f16((((((v_8 % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 8dcc486..7a85e4c 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -8,12 +8,12 @@
   return counter;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -21,13 +21,15 @@
 }
 
 matrix<float16_t, 2, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(m[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_5, tint_bitcast_to_f16(m[((8u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = m[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = m[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 2, 3> l_m = v_4(0u);
-  vector<float16_t, 3> l_m_1 = tint_bitcast_to_f16(m[0u]).xyz;
+  vector<float16_t, 3> l_m_1 = tint_bitcast_to_f16(m[0u].zw).xyz;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
index a761a92..9f8a1bf 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
@@ -2,12 +2,12 @@
 cbuffer cbuffer_u : register(b0) {
   uint4 u[1];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -15,14 +15,16 @@
 }
 
 matrix<float16_t, 2, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 3, 2> t = transpose(v_4(0u));
-  float16_t l = length(tint_bitcast_to_f16(u[0u]).xyz);
-  float16_t a = abs(tint_bitcast_to_f16(u[0u]).xyz.zxy[0u]);
+  float16_t l = length(tint_bitcast_to_f16(u[0u].zw).xyz);
+  float16_t a = abs(tint_bitcast_to_f16(u[0u].xy).xyz.zxy[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
index fe8551d..f4049ee 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
@@ -11,12 +11,12 @@
 void c(float16_t f_1) {
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -24,16 +24,18 @@
 }
 
 matrix<float16_t, 2, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   a(v_4(0u));
-  b(tint_bitcast_to_f16(u[0u]).xyz);
-  b(tint_bitcast_to_f16(u[0u]).xyz.zxy);
+  b(tint_bitcast_to_f16(u[0u].zw).xyz);
+  b(tint_bitcast_to_f16(u[0u].zw).xyz.zxy);
   c(float16_t(f16tof32(u[0u].z)));
-  c(tint_bitcast_to_f16(u[0u]).xyz.zxy[0u]);
+  c(tint_bitcast_to_f16(u[0u].zw).xyz.zxy[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_private.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
index fe2d12b..6c2d9af 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 u[1];
 };
 static matrix<float16_t, 2, 3> p = matrix<float16_t, 2, 3>((float16_t(0.0h)).xxx, (float16_t(0.0h)).xxx);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -16,15 +16,17 @@
 }
 
 matrix<float16_t, 2, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   p = v_4(0u);
-  p[int(1)] = tint_bitcast_to_f16(u[0u]).xyz;
-  p[int(1)] = tint_bitcast_to_f16(u[0u]).xyz.zxy;
+  p[int(1)] = tint_bitcast_to_f16(u[0u].xy).xyz;
+  p[int(1)] = tint_bitcast_to_f16(u[0u].xy).xyz.zxy;
   p[int(0)][int(1)] = float16_t(f16tof32(u[0u].z));
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
index 9126b0a..0476d1c 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 u[1];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -21,15 +21,17 @@
 }
 
 matrix<float16_t, 2, 3> v_5(uint start_byte_offset) {
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_6, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_6 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.zw) : (v_6.xy))).xyz;
+  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_7, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   v_4(0u, v_5(0u));
-  s.Store<vector<float16_t, 3> >(8u, tint_bitcast_to_f16(u[0u]).xyz);
-  s.Store<vector<float16_t, 3> >(8u, tint_bitcast_to_f16(u[0u]).xyz.zxy);
+  s.Store<vector<float16_t, 3> >(8u, tint_bitcast_to_f16(u[0u].xy).xyz);
+  s.Store<vector<float16_t, 3> >(8u, tint_bitcast_to_f16(u[0u].xy).xyz.zxy);
   s.Store<float16_t>(2u, float16_t(f16tof32(u[0u].z)));
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
index 993f180..40f141a 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
@@ -7,12 +7,12 @@
   uint4 u[1];
 };
 groupshared matrix<float16_t, 2, 3> w;
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -20,8 +20,10 @@
 }
 
 matrix<float16_t, 2, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz);
 }
 
 void f_inner(uint tint_local_index) {
@@ -30,8 +32,8 @@
   }
   GroupMemoryBarrierWithGroupSync();
   w = v_4(0u);
-  w[int(1)] = tint_bitcast_to_f16(u[0u]).xyz;
-  w[int(1)] = tint_bitcast_to_f16(u[0u]).xyz.zxy;
+  w[int(1)] = tint_bitcast_to_f16(u[0u].xy).xyz;
+  w[int(1)] = tint_bitcast_to_f16(u[0u].xy).xyz.zxy;
   w[int(0)][int(1)] = float16_t(f16tof32(u[0u].z));
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 2963e8a..88cc783 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -8,12 +8,12 @@
   return counter;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -21,14 +21,17 @@
 }
 
 matrix<float16_t, 2, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(m[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_5, tint_bitcast_to_f16(m[((8u + start_byte_offset) / 16u)]));
+  uint4 v_5 = m[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = m[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  uint v_6 = (8u * uint(i()));
+  uint v_8 = (8u * uint(i()));
   matrix<float16_t, 2, 4> l_m = v_4(0u);
-  vector<float16_t, 4> l_m_i = tint_bitcast_to_f16(m[(v_6 / 16u)]);
+  uint4 v_9 = m[(v_8 / 16u)];
+  vector<float16_t, 4> l_m_i = tint_bitcast_to_f16((((((v_8 % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy)));
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 3666e91..d42b22a 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -8,12 +8,12 @@
   return counter;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -21,13 +21,15 @@
 }
 
 matrix<float16_t, 2, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(m[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_5, tint_bitcast_to_f16(m[((8u + start_byte_offset) / 16u)]));
+  uint4 v_5 = m[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = m[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 2, 4> l_m = v_4(0u);
-  vector<float16_t, 4> l_m_1 = tint_bitcast_to_f16(m[0u]);
+  vector<float16_t, 4> l_m_1 = tint_bitcast_to_f16(m[0u].zw);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
index 1f8b9db..a1140ac 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
@@ -2,12 +2,12 @@
 cbuffer cbuffer_u : register(b0) {
   uint4 u[1];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -15,14 +15,16 @@
 }
 
 matrix<float16_t, 2, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 4, 2> t = transpose(v_4(0u));
-  float16_t l = length(tint_bitcast_to_f16(u[0u]));
-  float16_t a = abs(tint_bitcast_to_f16(u[0u]).ywxz[0u]);
+  float16_t l = length(tint_bitcast_to_f16(u[0u].zw));
+  float16_t a = abs(tint_bitcast_to_f16(u[0u].xy).ywxz[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
index 1291577..ce7990e 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
@@ -11,12 +11,12 @@
 void c(float16_t f_1) {
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -24,16 +24,18 @@
 }
 
 matrix<float16_t, 2, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   a(v_4(0u));
-  b(tint_bitcast_to_f16(u[0u]));
-  b(tint_bitcast_to_f16(u[0u]).ywxz);
+  b(tint_bitcast_to_f16(u[0u].zw));
+  b(tint_bitcast_to_f16(u[0u].zw).ywxz);
   c(float16_t(f16tof32(u[0u].z)));
-  c(tint_bitcast_to_f16(u[0u]).ywxz[0u]);
+  c(tint_bitcast_to_f16(u[0u].zw).ywxz[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_private.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
index f9c2b59..2c4fc3f 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 u[1];
 };
 static matrix<float16_t, 2, 4> p = matrix<float16_t, 2, 4>((float16_t(0.0h)).xxxx, (float16_t(0.0h)).xxxx);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -16,15 +16,17 @@
 }
 
 matrix<float16_t, 2, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   p = v_4(0u);
-  p[int(1)] = tint_bitcast_to_f16(u[0u]);
-  p[int(1)] = tint_bitcast_to_f16(u[0u]).ywxz;
+  p[int(1)] = tint_bitcast_to_f16(u[0u].xy);
+  p[int(1)] = tint_bitcast_to_f16(u[0u].xy).ywxz;
   p[int(0)][int(1)] = float16_t(f16tof32(u[0u].z));
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
index 2ae30db..39767152 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 u[1];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -21,15 +21,17 @@
 }
 
 matrix<float16_t, 2, 4> v_5(uint start_byte_offset) {
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_6, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]));
+  uint4 v_6 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.zw) : (v_6.xy)));
+  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_7, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy))));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   v_4(0u, v_5(0u));
-  s.Store<vector<float16_t, 4> >(8u, tint_bitcast_to_f16(u[0u]));
-  s.Store<vector<float16_t, 4> >(8u, tint_bitcast_to_f16(u[0u]).ywxz);
+  s.Store<vector<float16_t, 4> >(8u, tint_bitcast_to_f16(u[0u].xy));
+  s.Store<vector<float16_t, 4> >(8u, tint_bitcast_to_f16(u[0u].xy).ywxz);
   s.Store<float16_t>(2u, float16_t(f16tof32(u[0u].z)));
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
index 89fd265..ea4d4fc 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
@@ -7,12 +7,12 @@
   uint4 u[1];
 };
 groupshared matrix<float16_t, 2, 4> w;
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -20,8 +20,10 @@
 }
 
 matrix<float16_t, 2, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))));
 }
 
 void f_inner(uint tint_local_index) {
@@ -30,8 +32,8 @@
   }
   GroupMemoryBarrierWithGroupSync();
   w = v_4(0u);
-  w[int(1)] = tint_bitcast_to_f16(u[0u]);
-  w[int(1)] = tint_bitcast_to_f16(u[0u]).ywxz;
+  w[int(1)] = tint_bitcast_to_f16(u[0u].xy);
+  w[int(1)] = tint_bitcast_to_f16(u[0u].xy).ywxz;
   w[int(0)][int(1)] = float16_t(f16tof32(u[0u].z));
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 92f21d2..9213578 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -17,19 +17,15 @@
 }
 
 matrix<float16_t, 3, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = m[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = m[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = m[((8u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 3, 2>(v_4, v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(m[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(m[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 3, 2>(v_3, v_4, tint_bitcast_to_f16(m[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  uint v_8 = (4u * uint(i()));
+  uint v_5 = (4u * uint(i()));
   matrix<float16_t, 3, 2> l_m = v_2(0u);
-  uint4 v_9 = m[(v_8 / 16u)];
-  vector<float16_t, 2> l_m_i = tint_bitcast_to_f16((((((v_8 % 16u) / 4u) == 2u)) ? (v_9.z) : (v_9.x)));
+  vector<float16_t, 2> l_m_i = tint_bitcast_to_f16(m[(v_5 / 16u)][((v_5 % 16u) / 4u)]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 5aeeb1f..69c9c7a 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -17,17 +17,14 @@
 }
 
 matrix<float16_t, 3, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = m[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = m[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = m[((8u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 3, 2>(v_4, v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(m[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(m[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 3, 2>(v_3, v_4, tint_bitcast_to_f16(m[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 3, 2> l_m = v_2(0u);
-  vector<float16_t, 2> l_m_1 = tint_bitcast_to_f16(m[0u].x);
+  vector<float16_t, 2> l_m_1 = tint_bitcast_to_f16(m[0u].y);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
index 5763730..bea0080 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
@@ -11,18 +11,15 @@
 }
 
 matrix<float16_t, 3, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 3, 2>(v_4, v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 3, 2>(v_3, v_4, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 2, 3> t = transpose(v_2(0u));
-  float16_t l = length(tint_bitcast_to_f16(u[0u].x));
+  float16_t l = length(tint_bitcast_to_f16(u[0u].y));
   float16_t a = abs(tint_bitcast_to_f16(u[0u].x).yx[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl
index 397398b..7202053 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl
@@ -20,20 +20,17 @@
 }
 
 matrix<float16_t, 3, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 3, 2>(v_4, v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 3, 2>(v_3, v_4, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   a(v_2(0u));
-  b(tint_bitcast_to_f16(u[0u].x));
-  b(tint_bitcast_to_f16(u[0u].x).yx);
+  b(tint_bitcast_to_f16(u[0u].y));
+  b(tint_bitcast_to_f16(u[0u].y).yx);
   c(float16_t(f16tof32(u[0u].y)));
-  c(tint_bitcast_to_f16(u[0u].x).yx[0u]);
+  c(tint_bitcast_to_f16(u[0u].y).yx[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_private.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_private.wgsl.expected.ir.dxc.hlsl
index 0b2d6f6..22399a0 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_private.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_private.wgsl.expected.ir.dxc.hlsl
@@ -12,12 +12,9 @@
 }
 
 matrix<float16_t, 3, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 3, 2>(v_4, v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 3, 2>(v_3, v_4, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl
index 9c794b5..5fe878a 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl
@@ -18,12 +18,9 @@
 }
 
 matrix<float16_t, 3, 2> v_3(uint start_byte_offset) {
-  uint4 v_4 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_5 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_4.z) : (v_4.x)));
-  uint4 v_6 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_7 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_6.z) : (v_6.x)));
-  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 3, 2>(v_5, v_7, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.z) : (v_8.x))));
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 3, 2>(v_4, v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
index e955b12..78eacd2 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
@@ -16,12 +16,9 @@
 }
 
 matrix<float16_t, 3, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 3, 2>(v_4, v_6, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 3, 2>(v_3, v_4, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]));
 }
 
 void f_inner(uint tint_local_index) {
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 45461c1..f438c1d 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -8,12 +8,12 @@
   return counter;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -21,15 +21,19 @@
 }
 
 matrix<float16_t, 3, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(m[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(m[((8u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 3, 3>(v_5, v_6, tint_bitcast_to_f16(m[((16u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = m[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = m[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = m[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 3>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  uint v_7 = (8u * uint(i()));
+  uint v_10 = (8u * uint(i()));
   matrix<float16_t, 3, 3> l_m = v_4(0u);
-  vector<float16_t, 3> l_m_i = tint_bitcast_to_f16(m[(v_7 / 16u)]).xyz;
+  uint4 v_11 = m[(v_10 / 16u)];
+  vector<float16_t, 3> l_m_i = tint_bitcast_to_f16((((((v_10 % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))).xyz;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 561bf35..ac43c84 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -8,12 +8,12 @@
   return counter;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -21,14 +21,17 @@
 }
 
 matrix<float16_t, 3, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(m[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(m[((8u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 3, 3>(v_5, v_6, tint_bitcast_to_f16(m[((16u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = m[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = m[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = m[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 3>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 3, 3> l_m = v_4(0u);
-  vector<float16_t, 3> l_m_1 = tint_bitcast_to_f16(m[0u]).xyz;
+  vector<float16_t, 3> l_m_1 = tint_bitcast_to_f16(m[0u].zw).xyz;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
index 33815d4..0ca6228 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
@@ -2,12 +2,12 @@
 cbuffer cbuffer_u : register(b0) {
   uint4 u[2];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -15,15 +15,18 @@
 }
 
 matrix<float16_t, 3, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 3, 3>(v_5, v_6, tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 3>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 3, 3> t = transpose(v_4(0u));
-  float16_t l = length(tint_bitcast_to_f16(u[0u]).xyz);
-  float16_t a = abs(tint_bitcast_to_f16(u[0u]).xyz.zxy[0u]);
+  float16_t l = length(tint_bitcast_to_f16(u[0u].zw).xyz);
+  float16_t a = abs(tint_bitcast_to_f16(u[0u].xy).xyz.zxy[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
index 8104984..e01b446 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
@@ -11,12 +11,12 @@
 void c(float16_t f_1) {
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -24,17 +24,20 @@
 }
 
 matrix<float16_t, 3, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 3, 3>(v_5, v_6, tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 3>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   a(v_4(0u));
-  b(tint_bitcast_to_f16(u[0u]).xyz);
-  b(tint_bitcast_to_f16(u[0u]).xyz.zxy);
+  b(tint_bitcast_to_f16(u[0u].zw).xyz);
+  b(tint_bitcast_to_f16(u[0u].zw).xyz.zxy);
   c(float16_t(f16tof32(u[0u].z)));
-  c(tint_bitcast_to_f16(u[0u]).xyz.zxy[0u]);
+  c(tint_bitcast_to_f16(u[0u].zw).xyz.zxy[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_private.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
index e53bea6..1b9e1ad 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 u[2];
 };
 static matrix<float16_t, 3, 3> p = matrix<float16_t, 3, 3>((float16_t(0.0h)).xxx, (float16_t(0.0h)).xxx, (float16_t(0.0h)).xxx);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -16,16 +16,19 @@
 }
 
 matrix<float16_t, 3, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 3, 3>(v_5, v_6, tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 3>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   p = v_4(0u);
-  p[int(1)] = tint_bitcast_to_f16(u[0u]).xyz;
-  p[int(1)] = tint_bitcast_to_f16(u[0u]).xyz.zxy;
+  p[int(1)] = tint_bitcast_to_f16(u[0u].xy).xyz;
+  p[int(1)] = tint_bitcast_to_f16(u[0u].xy).xyz.zxy;
   p[int(0)][int(1)] = float16_t(f16tof32(u[0u].z));
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
index 600bab5..e0003fa 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 u[2];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -22,16 +22,19 @@
 }
 
 matrix<float16_t, 3, 3> v_5(uint start_byte_offset) {
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 3, 3>(v_6, v_7, tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_6 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.zw) : (v_6.xy))).xyz;
+  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_9 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy))).xyz;
+  uint4 v_10 = u[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 3>(v_7, v_9, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_10.zw) : (v_10.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   v_4(0u, v_5(0u));
-  s.Store<vector<float16_t, 3> >(8u, tint_bitcast_to_f16(u[0u]).xyz);
-  s.Store<vector<float16_t, 3> >(8u, tint_bitcast_to_f16(u[0u]).xyz.zxy);
+  s.Store<vector<float16_t, 3> >(8u, tint_bitcast_to_f16(u[0u].xy).xyz);
+  s.Store<vector<float16_t, 3> >(8u, tint_bitcast_to_f16(u[0u].xy).xyz.zxy);
   s.Store<float16_t>(2u, float16_t(f16tof32(u[0u].z)));
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
index 1248da0..ea70e29 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
@@ -7,12 +7,12 @@
   uint4 u[2];
 };
 groupshared matrix<float16_t, 3, 3> w;
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -20,9 +20,12 @@
 }
 
 matrix<float16_t, 3, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 3, 3>(v_5, v_6, tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 3>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz);
 }
 
 void f_inner(uint tint_local_index) {
@@ -31,8 +34,8 @@
   }
   GroupMemoryBarrierWithGroupSync();
   w = v_4(0u);
-  w[int(1)] = tint_bitcast_to_f16(u[0u]).xyz;
-  w[int(1)] = tint_bitcast_to_f16(u[0u]).xyz.zxy;
+  w[int(1)] = tint_bitcast_to_f16(u[0u].xy).xyz;
+  w[int(1)] = tint_bitcast_to_f16(u[0u].xy).xyz.zxy;
   w[int(0)][int(1)] = float16_t(f16tof32(u[0u].z));
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 42a3a3c..6a7d93d 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -8,12 +8,12 @@
   return counter;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -21,15 +21,19 @@
 }
 
 matrix<float16_t, 3, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(m[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(m[((8u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 3, 4>(v_5, v_6, tint_bitcast_to_f16(m[((16u + start_byte_offset) / 16u)]));
+  uint4 v_5 = m[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = m[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = m[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 4>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  uint v_7 = (8u * uint(i()));
+  uint v_10 = (8u * uint(i()));
   matrix<float16_t, 3, 4> l_m = v_4(0u);
-  vector<float16_t, 4> l_m_i = tint_bitcast_to_f16(m[(v_7 / 16u)]);
+  uint4 v_11 = m[(v_10 / 16u)];
+  vector<float16_t, 4> l_m_i = tint_bitcast_to_f16((((((v_10 % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy)));
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index a2d14b8..7d8cb64 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -8,12 +8,12 @@
   return counter;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -21,14 +21,17 @@
 }
 
 matrix<float16_t, 3, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(m[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(m[((8u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 3, 4>(v_5, v_6, tint_bitcast_to_f16(m[((16u + start_byte_offset) / 16u)]));
+  uint4 v_5 = m[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = m[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = m[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 4>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 3, 4> l_m = v_4(0u);
-  vector<float16_t, 4> l_m_1 = tint_bitcast_to_f16(m[0u]);
+  vector<float16_t, 4> l_m_1 = tint_bitcast_to_f16(m[0u].zw);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
index 35d56f8..74ce9ac 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
@@ -2,12 +2,12 @@
 cbuffer cbuffer_u : register(b0) {
   uint4 u[2];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -15,15 +15,18 @@
 }
 
 matrix<float16_t, 3, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 3, 4>(v_5, v_6, tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 4>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 4, 3> t = transpose(v_4(0u));
-  float16_t l = length(tint_bitcast_to_f16(u[0u]));
-  float16_t a = abs(tint_bitcast_to_f16(u[0u]).ywxz[0u]);
+  float16_t l = length(tint_bitcast_to_f16(u[0u].zw));
+  float16_t a = abs(tint_bitcast_to_f16(u[0u].xy).ywxz[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
index 2c72099..e4bbd92 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
@@ -11,12 +11,12 @@
 void c(float16_t f_1) {
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -24,17 +24,20 @@
 }
 
 matrix<float16_t, 3, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 3, 4>(v_5, v_6, tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 4>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   a(v_4(0u));
-  b(tint_bitcast_to_f16(u[0u]));
-  b(tint_bitcast_to_f16(u[0u]).ywxz);
+  b(tint_bitcast_to_f16(u[0u].zw));
+  b(tint_bitcast_to_f16(u[0u].zw).ywxz);
   c(float16_t(f16tof32(u[0u].z)));
-  c(tint_bitcast_to_f16(u[0u]).ywxz[0u]);
+  c(tint_bitcast_to_f16(u[0u].zw).ywxz[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_private.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
index cd89793..08af1bb 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 u[2];
 };
 static matrix<float16_t, 3, 4> p = matrix<float16_t, 3, 4>((float16_t(0.0h)).xxxx, (float16_t(0.0h)).xxxx, (float16_t(0.0h)).xxxx);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -16,16 +16,19 @@
 }
 
 matrix<float16_t, 3, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 3, 4>(v_5, v_6, tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 4>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   p = v_4(0u);
-  p[int(1)] = tint_bitcast_to_f16(u[0u]);
-  p[int(1)] = tint_bitcast_to_f16(u[0u]).ywxz;
+  p[int(1)] = tint_bitcast_to_f16(u[0u].xy);
+  p[int(1)] = tint_bitcast_to_f16(u[0u].xy).ywxz;
   p[int(0)][int(1)] = float16_t(f16tof32(u[0u].z));
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
index 9f9829a..b0d0d57 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 u[2];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -22,16 +22,19 @@
 }
 
 matrix<float16_t, 3, 4> v_5(uint start_byte_offset) {
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 3, 4>(v_6, v_7, tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]));
+  uint4 v_6 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.zw) : (v_6.xy)));
+  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_9 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy)));
+  uint4 v_10 = u[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 4>(v_7, v_9, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_10.zw) : (v_10.xy))));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   v_4(0u, v_5(0u));
-  s.Store<vector<float16_t, 4> >(8u, tint_bitcast_to_f16(u[0u]));
-  s.Store<vector<float16_t, 4> >(8u, tint_bitcast_to_f16(u[0u]).ywxz);
+  s.Store<vector<float16_t, 4> >(8u, tint_bitcast_to_f16(u[0u].xy));
+  s.Store<vector<float16_t, 4> >(8u, tint_bitcast_to_f16(u[0u].xy).ywxz);
   s.Store<float16_t>(2u, float16_t(f16tof32(u[0u].z)));
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
index 76033cc..52cbac1 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
@@ -7,12 +7,12 @@
   uint4 u[2];
 };
 groupshared matrix<float16_t, 3, 4> w;
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -20,9 +20,12 @@
 }
 
 matrix<float16_t, 3, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 3, 4>(v_5, v_6, tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 4>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))));
 }
 
 void f_inner(uint tint_local_index) {
@@ -31,8 +34,8 @@
   }
   GroupMemoryBarrierWithGroupSync();
   w = v_4(0u);
-  w[int(1)] = tint_bitcast_to_f16(u[0u]);
-  w[int(1)] = tint_bitcast_to_f16(u[0u]).ywxz;
+  w[int(1)] = tint_bitcast_to_f16(u[0u].xy);
+  w[int(1)] = tint_bitcast_to_f16(u[0u].xy).ywxz;
   w[int(0)][int(1)] = float16_t(f16tof32(u[0u].z));
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 63720ef..c388ebf 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -17,21 +17,16 @@
 }
 
 matrix<float16_t, 4, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = m[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = m[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = m[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x)));
-  uint4 v_9 = m[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_4, v_6, v_8, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.z) : (v_9.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(m[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(m[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(m[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_3, v_4, v_5, tint_bitcast_to_f16(m[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  uint v_10 = (4u * uint(i()));
+  uint v_6 = (4u * uint(i()));
   matrix<float16_t, 4, 2> l_m = v_2(0u);
-  uint4 v_11 = m[(v_10 / 16u)];
-  vector<float16_t, 2> l_m_i = tint_bitcast_to_f16((((((v_10 % 16u) / 4u) == 2u)) ? (v_11.z) : (v_11.x)));
+  vector<float16_t, 2> l_m_i = tint_bitcast_to_f16(m[(v_6 / 16u)][((v_6 % 16u) / 4u)]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 5958a78..55a87f2 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -17,19 +17,15 @@
 }
 
 matrix<float16_t, 4, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = m[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = m[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = m[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x)));
-  uint4 v_9 = m[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_4, v_6, v_8, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.z) : (v_9.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(m[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(m[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(m[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_3, v_4, v_5, tint_bitcast_to_f16(m[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 4, 2> l_m = v_2(0u);
-  vector<float16_t, 2> l_m_1 = tint_bitcast_to_f16(m[0u].x);
+  vector<float16_t, 2> l_m_1 = tint_bitcast_to_f16(m[0u].y);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
index 6b6ce3d..7424c44 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
@@ -11,20 +11,16 @@
 }
 
 matrix<float16_t, 4, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x)));
-  uint4 v_9 = u[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_4, v_6, v_8, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.z) : (v_9.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_3, v_4, v_5, tint_bitcast_to_f16(u[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 2, 4> t = transpose(v_2(0u));
-  float16_t l = length(tint_bitcast_to_f16(u[0u].x));
+  float16_t l = length(tint_bitcast_to_f16(u[0u].y));
   float16_t a = abs(tint_bitcast_to_f16(u[0u].x).yx[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl
index f36e793..a9c6093 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_fn.wgsl.expected.ir.dxc.hlsl
@@ -20,22 +20,18 @@
 }
 
 matrix<float16_t, 4, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x)));
-  uint4 v_9 = u[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_4, v_6, v_8, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.z) : (v_9.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_3, v_4, v_5, tint_bitcast_to_f16(u[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   a(v_2(0u));
-  b(tint_bitcast_to_f16(u[0u].x));
-  b(tint_bitcast_to_f16(u[0u].x).yx);
+  b(tint_bitcast_to_f16(u[0u].y));
+  b(tint_bitcast_to_f16(u[0u].y).yx);
   c(float16_t(f16tof32(u[0u].y)));
-  c(tint_bitcast_to_f16(u[0u].x).yx[0u]);
+  c(tint_bitcast_to_f16(u[0u].y).yx[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_private.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_private.wgsl.expected.ir.dxc.hlsl
index 64e3214..21d6939 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_private.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_private.wgsl.expected.ir.dxc.hlsl
@@ -12,14 +12,10 @@
 }
 
 matrix<float16_t, 4, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x)));
-  uint4 v_9 = u[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_4, v_6, v_8, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.z) : (v_9.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_3, v_4, v_5, tint_bitcast_to_f16(u[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl
index 8bb3e8a..51e6351 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_storage.wgsl.expected.ir.dxc.hlsl
@@ -19,14 +19,10 @@
 }
 
 matrix<float16_t, 4, 2> v_3(uint start_byte_offset) {
-  uint4 v_4 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_5 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_4.z) : (v_4.x)));
-  uint4 v_6 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_7 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_6.z) : (v_6.x)));
-  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_9 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.z) : (v_8.x)));
-  uint4 v_10 = u[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_5, v_7, v_9, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_10.z) : (v_10.x))));
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_4, v_5, v_6, tint_bitcast_to_f16(u[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
index 592a63f..3610678 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
@@ -16,14 +16,10 @@
 }
 
 matrix<float16_t, 4, 2> v_2(uint start_byte_offset) {
-  uint4 v_3 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
-  uint4 v_5 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
-  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x)));
-  uint4 v_9 = u[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_4, v_6, v_8, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.z) : (v_9.x))));
+  vector<float16_t, 2> v_3 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_3, v_4, v_5, tint_bitcast_to_f16(u[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
 void f_inner(uint tint_local_index) {
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 901f946..799812f 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -8,12 +8,12 @@
   return counter;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -21,16 +21,21 @@
 }
 
 matrix<float16_t, 4, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(m[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(m[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(m[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_5, v_6, v_7, tint_bitcast_to_f16(m[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = m[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = m[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = m[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz;
+  uint4 v_11 = m[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  uint v_8 = (8u * uint(i()));
+  uint v_12 = (8u * uint(i()));
   matrix<float16_t, 4, 3> l_m = v_4(0u);
-  vector<float16_t, 3> l_m_i = tint_bitcast_to_f16(m[(v_8 / 16u)]).xyz;
+  uint4 v_13 = m[(v_12 / 16u)];
+  vector<float16_t, 3> l_m_i = tint_bitcast_to_f16((((((v_12 % 16u) / 4u) == 2u)) ? (v_13.zw) : (v_13.xy))).xyz;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 3c935be..3c591e3 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -8,12 +8,12 @@
   return counter;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -21,15 +21,19 @@
 }
 
 matrix<float16_t, 4, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(m[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(m[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(m[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_5, v_6, v_7, tint_bitcast_to_f16(m[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = m[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = m[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = m[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz;
+  uint4 v_11 = m[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 4, 3> l_m = v_4(0u);
-  vector<float16_t, 3> l_m_1 = tint_bitcast_to_f16(m[0u]).xyz;
+  vector<float16_t, 3> l_m_1 = tint_bitcast_to_f16(m[0u].zw).xyz;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
index 58c24d2..af8b645 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
@@ -2,12 +2,12 @@
 cbuffer cbuffer_u : register(b0) {
   uint4 u[2];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -15,16 +15,20 @@
 }
 
 matrix<float16_t, 4, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz;
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 3, 4> t = transpose(v_4(0u));
-  float16_t l = length(tint_bitcast_to_f16(u[0u]).xyz);
-  float16_t a = abs(tint_bitcast_to_f16(u[0u]).xyz.zxy[0u]);
+  float16_t l = length(tint_bitcast_to_f16(u[0u].zw).xyz);
+  float16_t a = abs(tint_bitcast_to_f16(u[0u].xy).xyz.zxy[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
index 63b733d..ae09940 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_fn.wgsl.expected.ir.dxc.hlsl
@@ -11,12 +11,12 @@
 void c(float16_t f_1) {
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -24,18 +24,22 @@
 }
 
 matrix<float16_t, 4, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz;
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   a(v_4(0u));
-  b(tint_bitcast_to_f16(u[0u]).xyz);
-  b(tint_bitcast_to_f16(u[0u]).xyz.zxy);
+  b(tint_bitcast_to_f16(u[0u].zw).xyz);
+  b(tint_bitcast_to_f16(u[0u].zw).xyz.zxy);
   c(float16_t(f16tof32(u[0u].z)));
-  c(tint_bitcast_to_f16(u[0u]).xyz.zxy[0u]);
+  c(tint_bitcast_to_f16(u[0u].zw).xyz.zxy[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_private.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
index a236b2b..a2d73a3 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_private.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 u[2];
 };
 static matrix<float16_t, 4, 3> p = matrix<float16_t, 4, 3>((float16_t(0.0h)).xxx, (float16_t(0.0h)).xxx, (float16_t(0.0h)).xxx, (float16_t(0.0h)).xxx);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -16,17 +16,21 @@
 }
 
 matrix<float16_t, 4, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz;
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   p = v_4(0u);
-  p[int(1)] = tint_bitcast_to_f16(u[0u]).xyz;
-  p[int(1)] = tint_bitcast_to_f16(u[0u]).xyz.zxy;
+  p[int(1)] = tint_bitcast_to_f16(u[0u].xy).xyz;
+  p[int(1)] = tint_bitcast_to_f16(u[0u].xy).xyz.zxy;
   p[int(0)][int(1)] = float16_t(f16tof32(u[0u].z));
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
index 9b55367..ac859bf 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_storage.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 u[2];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -23,17 +23,21 @@
 }
 
 matrix<float16_t, 4, 3> v_5(uint start_byte_offset) {
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_6, v_7, v_8, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_6 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.zw) : (v_6.xy))).xyz;
+  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_9 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy))).xyz;
+  uint4 v_10 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_11 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_10.zw) : (v_10.xy))).xyz;
+  uint4 v_12 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_7, v_9, v_11, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_12.zw) : (v_12.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   v_4(0u, v_5(0u));
-  s.Store<vector<float16_t, 3> >(8u, tint_bitcast_to_f16(u[0u]).xyz);
-  s.Store<vector<float16_t, 3> >(8u, tint_bitcast_to_f16(u[0u]).xyz.zxy);
+  s.Store<vector<float16_t, 3> >(8u, tint_bitcast_to_f16(u[0u].xy).xyz);
+  s.Store<vector<float16_t, 3> >(8u, tint_bitcast_to_f16(u[0u].xy).xyz.zxy);
   s.Store<float16_t>(2u, float16_t(f16tof32(u[0u].z)));
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
index 067ac1e..6437200 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
@@ -7,12 +7,12 @@
   uint4 u[2];
 };
 groupshared matrix<float16_t, 4, 3> w;
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -20,10 +20,14 @@
 }
 
 matrix<float16_t, 4, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz;
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))).xyz);
 }
 
 void f_inner(uint tint_local_index) {
@@ -32,8 +36,8 @@
   }
   GroupMemoryBarrierWithGroupSync();
   w = v_4(0u);
-  w[int(1)] = tint_bitcast_to_f16(u[0u]).xyz;
-  w[int(1)] = tint_bitcast_to_f16(u[0u]).xyz.zxy;
+  w[int(1)] = tint_bitcast_to_f16(u[0u].xy).xyz;
+  w[int(1)] = tint_bitcast_to_f16(u[0u].xy).xyz.zxy;
   w[int(0)][int(1)] = float16_t(f16tof32(u[0u].z));
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 90ab6f2..f5a1a64 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -8,12 +8,12 @@
   return counter;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -21,16 +21,21 @@
 }
 
 matrix<float16_t, 4, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(m[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(m[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(m[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_5, v_6, v_7, tint_bitcast_to_f16(m[((24u + start_byte_offset) / 16u)]));
+  uint4 v_5 = m[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = m[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = m[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy)));
+  uint4 v_11 = m[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
-  uint v_8 = (8u * uint(i()));
+  uint v_12 = (8u * uint(i()));
   matrix<float16_t, 4, 4> l_m = v_4(0u);
-  vector<float16_t, 4> l_m_i = tint_bitcast_to_f16(m[(v_8 / 16u)]);
+  uint4 v_13 = m[(v_12 / 16u)];
+  vector<float16_t, 4> l_m_i = tint_bitcast_to_f16((((((v_12 % 16u) / 4u) == 2u)) ? (v_13.zw) : (v_13.xy)));
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
index 078ebab..d881ec3 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/static_index_via_ptr.wgsl.expected.ir.dxc.hlsl
@@ -8,12 +8,12 @@
   return counter;
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -21,15 +21,19 @@
 }
 
 matrix<float16_t, 4, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(m[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(m[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(m[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_5, v_6, v_7, tint_bitcast_to_f16(m[((24u + start_byte_offset) / 16u)]));
+  uint4 v_5 = m[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = m[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = m[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy)));
+  uint4 v_11 = m[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 4, 4> l_m = v_4(0u);
-  vector<float16_t, 4> l_m_1 = tint_bitcast_to_f16(m[0u]);
+  vector<float16_t, 4> l_m_1 = tint_bitcast_to_f16(m[0u].zw);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
index 761c994..d9b1d10 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_builtin.wgsl.expected.ir.dxc.hlsl
@@ -2,12 +2,12 @@
 cbuffer cbuffer_u : register(b0) {
   uint4 u[2];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -15,16 +15,20 @@
 }
 
 matrix<float16_t, 4, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy)));
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   matrix<float16_t, 4, 4> t = transpose(v_4(0u));
-  float16_t l = length(tint_bitcast_to_f16(u[0u]));
-  float16_t a = abs(tint_bitcast_to_f16(u[0u]).ywxz[0u]);
+  float16_t l = length(tint_bitcast_to_f16(u[0u].zw));
+  float16_t a = abs(tint_bitcast_to_f16(u[0u].xy).ywxz[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
index a2612e6..61d3db3 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_fn.wgsl.expected.ir.dxc.hlsl
@@ -11,12 +11,12 @@
 void c(float16_t f_1) {
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -24,18 +24,22 @@
 }
 
 matrix<float16_t, 4, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy)));
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   a(v_4(0u));
-  b(tint_bitcast_to_f16(u[0u]));
-  b(tint_bitcast_to_f16(u[0u]).ywxz);
+  b(tint_bitcast_to_f16(u[0u].zw));
+  b(tint_bitcast_to_f16(u[0u].zw).ywxz);
   c(float16_t(f16tof32(u[0u].z)));
-  c(tint_bitcast_to_f16(u[0u]).ywxz[0u]);
+  c(tint_bitcast_to_f16(u[0u].zw).ywxz[0u]);
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_private.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
index 97a0080..6105a3c 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_private.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 u[2];
 };
 static matrix<float16_t, 4, 4> p = matrix<float16_t, 4, 4>((float16_t(0.0h)).xxxx, (float16_t(0.0h)).xxxx, (float16_t(0.0h)).xxxx, (float16_t(0.0h)).xxxx);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -16,17 +16,21 @@
 }
 
 matrix<float16_t, 4, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy)));
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   p = v_4(0u);
-  p[int(1)] = tint_bitcast_to_f16(u[0u]);
-  p[int(1)] = tint_bitcast_to_f16(u[0u]).ywxz;
+  p[int(1)] = tint_bitcast_to_f16(u[0u].xy);
+  p[int(1)] = tint_bitcast_to_f16(u[0u].xy).ywxz;
   p[int(0)][int(1)] = float16_t(f16tof32(u[0u].z));
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
index 3abeb5d..5ba82e0 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_storage.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 u[2];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -23,17 +23,21 @@
 }
 
 matrix<float16_t, 4, 4> v_5(uint start_byte_offset) {
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_6, v_7, v_8, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]));
+  uint4 v_6 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.zw) : (v_6.xy)));
+  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_9 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy)));
+  uint4 v_10 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_11 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_10.zw) : (v_10.xy)));
+  uint4 v_12 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_7, v_9, v_11, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_12.zw) : (v_12.xy))));
 }
 
 [numthreads(1, 1, 1)]
 void f() {
   v_4(0u, v_5(0u));
-  s.Store<vector<float16_t, 4> >(8u, tint_bitcast_to_f16(u[0u]));
-  s.Store<vector<float16_t, 4> >(8u, tint_bitcast_to_f16(u[0u]).ywxz);
+  s.Store<vector<float16_t, 4> >(8u, tint_bitcast_to_f16(u[0u].xy));
+  s.Store<vector<float16_t, 4> >(8u, tint_bitcast_to_f16(u[0u].xy).ywxz);
   s.Store<float16_t>(2u, float16_t(f16tof32(u[0u].z)));
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
index 7b91ba8..710f562 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_workgroup.wgsl.expected.ir.dxc.hlsl
@@ -7,12 +7,12 @@
   uint4 u[2];
 };
 groupshared matrix<float16_t, 4, 4> w;
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -20,10 +20,14 @@
 }
 
 matrix<float16_t, 4, 4> v_4(uint start_byte_offset) {
-  vector<float16_t, 4> v_5 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_5, v_6, v_7, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]));
+  uint4 v_5 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy)));
+  uint4 v_7 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy)));
+  uint4 v_9 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy)));
+  uint4 v_11 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))));
 }
 
 void f_inner(uint tint_local_index) {
@@ -32,8 +36,8 @@
   }
   GroupMemoryBarrierWithGroupSync();
   w = v_4(0u);
-  w[int(1)] = tint_bitcast_to_f16(u[0u]);
-  w[int(1)] = tint_bitcast_to_f16(u[0u]).ywxz;
+  w[int(1)] = tint_bitcast_to_f16(u[0u].xy);
+  w[int(1)] = tint_bitcast_to_f16(u[0u].xy).ywxz;
   w[int(0)][int(1)] = float16_t(f16tof32(u[0u].z));
 }
 
diff --git a/test/tint/buffer/uniform/types/mat2x2_f16.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/types/mat2x2_f16.wgsl.expected.ir.dxc.hlsl
index 717e383..222bb4e 100644
--- a/test/tint/buffer/uniform/types/mat2x2_f16.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/types/mat2x2_f16.wgsl.expected.ir.dxc.hlsl
@@ -17,10 +17,8 @@
 }
 
 matrix<float16_t, 2, 2> v_3(uint start_byte_offset) {
-  uint4 v_4 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_5 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_4.z) : (v_4.x)));
-  uint4 v_6 = u[((4u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 2, 2>(v_5, tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_6.z) : (v_6.x))));
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  return matrix<float16_t, 2, 2>(v_4, tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/types/mat2x3_f16.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/types/mat2x3_f16.wgsl.expected.ir.dxc.hlsl
index b75cd09..0d7eeb8 100644
--- a/test/tint/buffer/uniform/types/mat2x3_f16.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/types/mat2x3_f16.wgsl.expected.ir.dxc.hlsl
@@ -8,12 +8,12 @@
   s.Store<vector<float16_t, 3> >((offset + 8u), obj[1u]);
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_2 = float16_t(t_low.x);
   float16_t v_3 = float16_t(t_high.x);
   float16_t v_4 = float16_t(t_low.y);
@@ -21,8 +21,10 @@
 }
 
 matrix<float16_t, 2, 3> v_5(uint start_byte_offset) {
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  return matrix<float16_t, 2, 3>(v_6, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_6 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.zw) : (v_6.xy))).xyz;
+  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 3>(v_7, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/types/mat2x4_f16.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/types/mat2x4_f16.wgsl.expected.ir.dxc.hlsl
index 86d24b4..d453ddc 100644
--- a/test/tint/buffer/uniform/types/mat2x4_f16.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/types/mat2x4_f16.wgsl.expected.ir.dxc.hlsl
@@ -8,12 +8,12 @@
   s.Store<vector<float16_t, 4> >((offset + 8u), obj[1u]);
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_2 = float16_t(t_low.x);
   float16_t v_3 = float16_t(t_high.x);
   float16_t v_4 = float16_t(t_low.y);
@@ -21,8 +21,10 @@
 }
 
 matrix<float16_t, 2, 4> v_5(uint start_byte_offset) {
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_6, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]));
+  uint4 v_6 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.zw) : (v_6.xy)));
+  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_7, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy))));
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/types/mat3x2_f16.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/types/mat3x2_f16.wgsl.expected.ir.dxc.hlsl
index 4f78aec..3496bbf 100644
--- a/test/tint/buffer/uniform/types/mat3x2_f16.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/types/mat3x2_f16.wgsl.expected.ir.dxc.hlsl
@@ -18,12 +18,9 @@
 }
 
 matrix<float16_t, 3, 2> v_3(uint start_byte_offset) {
-  uint4 v_4 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_5 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_4.z) : (v_4.x)));
-  uint4 v_6 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_7 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_6.z) : (v_6.x)));
-  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 3, 2>(v_5, v_7, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.z) : (v_8.x))));
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 3, 2>(v_4, v_5, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/types/mat3x3_f16.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/types/mat3x3_f16.wgsl.expected.ir.dxc.hlsl
index 8c50046..69c9581 100644
--- a/test/tint/buffer/uniform/types/mat3x3_f16.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/types/mat3x3_f16.wgsl.expected.ir.dxc.hlsl
@@ -9,12 +9,12 @@
   s.Store<vector<float16_t, 3> >((offset + 16u), obj[2u]);
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_2 = float16_t(t_low.x);
   float16_t v_3 = float16_t(t_high.x);
   float16_t v_4 = float16_t(t_low.y);
@@ -22,9 +22,12 @@
 }
 
 matrix<float16_t, 3, 3> v_5(uint start_byte_offset) {
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 3, 3>(v_6, v_7, tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_6 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.zw) : (v_6.xy))).xyz;
+  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_9 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy))).xyz;
+  uint4 v_10 = u[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 3>(v_7, v_9, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_10.zw) : (v_10.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/types/mat3x4_f16.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/types/mat3x4_f16.wgsl.expected.ir.dxc.hlsl
index f4ef167..eb5b594 100644
--- a/test/tint/buffer/uniform/types/mat3x4_f16.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/types/mat3x4_f16.wgsl.expected.ir.dxc.hlsl
@@ -9,12 +9,12 @@
   s.Store<vector<float16_t, 4> >((offset + 16u), obj[2u]);
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_2 = float16_t(t_low.x);
   float16_t v_3 = float16_t(t_high.x);
   float16_t v_4 = float16_t(t_low.y);
@@ -22,9 +22,12 @@
 }
 
 matrix<float16_t, 3, 4> v_5(uint start_byte_offset) {
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 3, 4>(v_6, v_7, tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]));
+  uint4 v_6 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.zw) : (v_6.xy)));
+  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_9 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy)));
+  uint4 v_10 = u[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 4>(v_7, v_9, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_10.zw) : (v_10.xy))));
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/types/mat4x2_f16.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/types/mat4x2_f16.wgsl.expected.ir.dxc.hlsl
index 8acb4f1..dd67234 100644
--- a/test/tint/buffer/uniform/types/mat4x2_f16.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/types/mat4x2_f16.wgsl.expected.ir.dxc.hlsl
@@ -19,14 +19,10 @@
 }
 
 matrix<float16_t, 4, 2> v_3(uint start_byte_offset) {
-  uint4 v_4 = u[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_5 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_4.z) : (v_4.x)));
-  uint4 v_6 = u[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_7 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_6.z) : (v_6.x)));
-  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_9 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.z) : (v_8.x)));
-  uint4 v_10 = u[((12u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 4, 2>(v_5, v_7, v_9, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_10.z) : (v_10.x))));
+  vector<float16_t, 2> v_4 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_5 = tint_bitcast_to_f16(u[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  vector<float16_t, 2> v_6 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 4, 2>(v_4, v_5, v_6, tint_bitcast_to_f16(u[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]));
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/types/mat4x3_f16.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/types/mat4x3_f16.wgsl.expected.ir.dxc.hlsl
index d1c6745..0483252 100644
--- a/test/tint/buffer/uniform/types/mat4x3_f16.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/types/mat4x3_f16.wgsl.expected.ir.dxc.hlsl
@@ -10,12 +10,12 @@
   s.Store<vector<float16_t, 3> >((offset + 24u), obj[3u]);
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_2 = float16_t(t_low.x);
   float16_t v_3 = float16_t(t_high.x);
   float16_t v_4 = float16_t(t_low.y);
@@ -23,10 +23,14 @@
 }
 
 matrix<float16_t, 4, 3> v_5(uint start_byte_offset) {
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_6, v_7, v_8, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_6 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.zw) : (v_6.xy))).xyz;
+  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_9 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy))).xyz;
+  uint4 v_10 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_11 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_10.zw) : (v_10.xy))).xyz;
+  uint4 v_12 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_7, v_9, v_11, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_12.zw) : (v_12.xy))).xyz);
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/types/mat4x4_f16.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/types/mat4x4_f16.wgsl.expected.ir.dxc.hlsl
index ac0b195..e8c4c69 100644
--- a/test/tint/buffer/uniform/types/mat4x4_f16.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/types/mat4x4_f16.wgsl.expected.ir.dxc.hlsl
@@ -10,12 +10,12 @@
   s.Store<vector<float16_t, 4> >((offset + 24u), obj[3u]);
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_2 = float16_t(t_low.x);
   float16_t v_3 = float16_t(t_high.x);
   float16_t v_4 = float16_t(t_low.y);
@@ -23,10 +23,14 @@
 }
 
 matrix<float16_t, 4, 4> v_5(uint start_byte_offset) {
-  vector<float16_t, 4> v_6 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  vector<float16_t, 4> v_7 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]);
-  vector<float16_t, 4> v_8 = tint_bitcast_to_f16(u[((16u + start_byte_offset) / 16u)]);
-  return matrix<float16_t, 4, 4>(v_6, v_7, v_8, tint_bitcast_to_f16(u[((24u + start_byte_offset) / 16u)]));
+  uint4 v_6 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.zw) : (v_6.xy)));
+  uint4 v_8 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_9 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.zw) : (v_8.xy)));
+  uint4 v_10 = u[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 4> v_11 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_10.zw) : (v_10.xy)));
+  uint4 v_12 = u[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 4>(v_7, v_9, v_11, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_12.zw) : (v_12.xy))));
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/buffer/uniform/types/struct_f16.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/types/struct_f16.wgsl.expected.ir.dxc.hlsl
index 1ca330c..83d4446 100644
--- a/test/tint/buffer/uniform/types/struct_f16.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/types/struct_f16.wgsl.expected.ir.dxc.hlsl
@@ -29,12 +29,12 @@
   v_2((offset + 0u), v_4);
 }
 
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_5 = float16_t(t_low.x);
   float16_t v_6 = float16_t(t_high.x);
   float16_t v_7 = float16_t(t_low.y);
@@ -42,27 +42,30 @@
 }
 
 matrix<float16_t, 2, 4> v_8(uint start_byte_offset) {
-  vector<float16_t, 4> v_9 = tint_bitcast_to_f16(u[(start_byte_offset / 16u)]);
-  return matrix<float16_t, 2, 4>(v_9, tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]));
+  uint4 v_9 = u[(start_byte_offset / 16u)];
+  vector<float16_t, 4> v_10 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy)));
+  uint4 v_11 = u[((8u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 2, 4>(v_10, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))));
 }
 
-Inner v_10(uint start_byte_offset) {
-  uint v_11 = u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)];
-  float16_t v_12 = float16_t(f16tof32((v_11 >> ((((start_byte_offset % 4u) == 0u)) ? (0u) : (16u)))));
-  vector<float16_t, 3> v_13 = tint_bitcast_to_f16(u[((8u + start_byte_offset) / 16u)]).xyz;
-  Inner v_14 = {v_12, v_13, v_8((16u + start_byte_offset))};
-  return v_14;
-}
-
-S v_15(uint start_byte_offset) {
-  Inner v_16 = v_10(start_byte_offset);
-  S v_17 = {v_16};
+Inner v_12(uint start_byte_offset) {
+  uint v_13 = u[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)];
+  float16_t v_14 = float16_t(f16tof32((v_13 >> ((((start_byte_offset % 4u) == 0u)) ? (0u) : (16u)))));
+  uint4 v_15 = u[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_16 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_15.zw) : (v_15.xy))).xyz;
+  Inner v_17 = {v_14, v_16, v_8((16u + start_byte_offset))};
   return v_17;
 }
 
+S v_18(uint start_byte_offset) {
+  Inner v_19 = v_12(start_byte_offset);
+  S v_20 = {v_19};
+  return v_20;
+}
+
 [numthreads(1, 1, 1)]
 void main() {
-  S x = v_15(0u);
+  S x = v_18(0u);
   v_3(0u, x);
 }
 
diff --git a/test/tint/buffer/uniform/types/vec3_f16.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/types/vec3_f16.wgsl.expected.ir.dxc.hlsl
index 00858ee..c4303fe 100644
--- a/test/tint/buffer/uniform/types/vec3_f16.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/types/vec3_f16.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 u[1];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -17,7 +17,7 @@
 
 [numthreads(1, 1, 1)]
 void main() {
-  vector<float16_t, 3> x = tint_bitcast_to_f16(u[0u]).xyz;
+  vector<float16_t, 3> x = tint_bitcast_to_f16(u[0u].xy).xyz;
   s.Store<vector<float16_t, 3> >(0u, x);
 }
 
diff --git a/test/tint/buffer/uniform/types/vec4_f16.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/types/vec4_f16.wgsl.expected.ir.dxc.hlsl
index 375cb7e..4acf97d 100644
--- a/test/tint/buffer/uniform/types/vec4_f16.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/types/vec4_f16.wgsl.expected.ir.dxc.hlsl
@@ -3,12 +3,12 @@
   uint4 u[1];
 };
 RWByteAddressBuffer s : register(u1);
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -17,7 +17,7 @@
 
 [numthreads(1, 1, 1)]
 void main() {
-  vector<float16_t, 4> x = tint_bitcast_to_f16(u[0u]);
+  vector<float16_t, 4> x = tint_bitcast_to_f16(u[0u].xy);
   s.Store<vector<float16_t, 4> >(0u, x);
 }
 
diff --git a/test/tint/expressions/binary/mul/mat3x2-vec3/f16.wgsl.expected.ir.dxc.hlsl b/test/tint/expressions/binary/mul/mat3x2-vec3/f16.wgsl.expected.ir.dxc.hlsl
index 3fe0ad3..26804ea 100644
--- a/test/tint/expressions/binary/mul/mat3x2-vec3/f16.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/expressions/binary/mul/mat3x2-vec3/f16.wgsl.expected.ir.dxc.hlsl
@@ -2,12 +2,12 @@
 cbuffer cbuffer_data : register(b0) {
   uint4 data[2];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -23,16 +23,13 @@
 }
 
 matrix<float16_t, 3, 2> v_5(uint start_byte_offset) {
-  uint4 v_6 = data[(start_byte_offset / 16u)];
-  vector<float16_t, 2> v_7 = tint_bitcast_to_f16_1((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.z) : (v_6.x)));
-  uint4 v_8 = data[((4u + start_byte_offset) / 16u)];
-  vector<float16_t, 2> v_9 = tint_bitcast_to_f16_1(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.z) : (v_8.x)));
-  uint4 v_10 = data[((8u + start_byte_offset) / 16u)];
-  return matrix<float16_t, 3, 2>(v_7, v_9, tint_bitcast_to_f16_1(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_10.z) : (v_10.x))));
+  vector<float16_t, 2> v_6 = tint_bitcast_to_f16_1(data[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
+  vector<float16_t, 2> v_7 = tint_bitcast_to_f16_1(data[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
+  return matrix<float16_t, 3, 2>(v_6, v_7, tint_bitcast_to_f16_1(data[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]));
 }
 
 void main() {
-  matrix<float16_t, 3, 2> v_11 = v_5(0u);
-  vector<float16_t, 2> x = mul(tint_bitcast_to_f16(data[1u]).xyz, v_11);
+  matrix<float16_t, 3, 2> v_8 = v_5(0u);
+  vector<float16_t, 2> x = mul(tint_bitcast_to_f16(data[1u].xy).xyz, v_8);
 }
 
diff --git a/test/tint/expressions/binary/mul/mat3x3-vec3/f16.wgsl.expected.ir.dxc.hlsl b/test/tint/expressions/binary/mul/mat3x3-vec3/f16.wgsl.expected.ir.dxc.hlsl
index 08b68de..eb4d325 100644
--- a/test/tint/expressions/binary/mul/mat3x3-vec3/f16.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/expressions/binary/mul/mat3x3-vec3/f16.wgsl.expected.ir.dxc.hlsl
@@ -2,12 +2,12 @@
 cbuffer cbuffer_data : register(b0) {
   uint4 data[2];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -15,13 +15,16 @@
 }
 
 matrix<float16_t, 3, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(data[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(data[((8u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 3, 3>(v_5, v_6, tint_bitcast_to_f16(data[((16u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = data[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = data[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = data[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 3>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz);
 }
 
 void main() {
-  matrix<float16_t, 3, 3> v_7 = v_4(0u);
-  vector<float16_t, 3> x = mul(tint_bitcast_to_f16(data[1u]).xyz, v_7);
+  matrix<float16_t, 3, 3> v_10 = v_4(0u);
+  vector<float16_t, 3> x = mul(tint_bitcast_to_f16(data[1u].zw).xyz, v_10);
 }
 
diff --git a/test/tint/expressions/binary/mul/vec3-mat3x3/f16.wgsl.expected.ir.dxc.hlsl b/test/tint/expressions/binary/mul/vec3-mat3x3/f16.wgsl.expected.ir.dxc.hlsl
index 1e72cbc..492d6b6 100644
--- a/test/tint/expressions/binary/mul/vec3-mat3x3/f16.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/expressions/binary/mul/vec3-mat3x3/f16.wgsl.expected.ir.dxc.hlsl
@@ -2,12 +2,12 @@
 cbuffer cbuffer_data : register(b0) {
   uint4 data[2];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -15,13 +15,16 @@
 }
 
 matrix<float16_t, 3, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(data[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(data[((8u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 3, 3>(v_5, v_6, tint_bitcast_to_f16(data[((16u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = data[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = data[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = data[((16u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 3, 3>(v_6, v_8, tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz);
 }
 
 void main() {
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(data[1u]).xyz;
-  vector<float16_t, 3> x = mul(v_4(0u), v_7);
+  vector<float16_t, 3> v_10 = tint_bitcast_to_f16(data[1u].zw).xyz;
+  vector<float16_t, 3> x = mul(v_4(0u), v_10);
 }
 
diff --git a/test/tint/expressions/binary/mul/vec3-mat4x3/f16.wgsl.expected.ir.dxc.hlsl b/test/tint/expressions/binary/mul/vec3-mat4x3/f16.wgsl.expected.ir.dxc.hlsl
index 78bafe0..896f8f4 100644
--- a/test/tint/expressions/binary/mul/vec3-mat4x3/f16.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/expressions/binary/mul/vec3-mat4x3/f16.wgsl.expected.ir.dxc.hlsl
@@ -2,12 +2,12 @@
 cbuffer cbuffer_data : register(b0) {
   uint4 data[3];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -15,14 +15,18 @@
 }
 
 matrix<float16_t, 4, 3> v_4(uint start_byte_offset) {
-  vector<float16_t, 3> v_5 = tint_bitcast_to_f16(data[(start_byte_offset / 16u)]).xyz;
-  vector<float16_t, 3> v_6 = tint_bitcast_to_f16(data[((8u + start_byte_offset) / 16u)]).xyz;
-  vector<float16_t, 3> v_7 = tint_bitcast_to_f16(data[((16u + start_byte_offset) / 16u)]).xyz;
-  return matrix<float16_t, 4, 3>(v_5, v_6, v_7, tint_bitcast_to_f16(data[((24u + start_byte_offset) / 16u)]).xyz);
+  uint4 v_5 = data[(start_byte_offset / 16u)];
+  vector<float16_t, 3> v_6 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_5.zw) : (v_5.xy))).xyz;
+  uint4 v_7 = data[((8u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.zw) : (v_7.xy))).xyz;
+  uint4 v_9 = data[((16u + start_byte_offset) / 16u)];
+  vector<float16_t, 3> v_10 = tint_bitcast_to_f16(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.zw) : (v_9.xy))).xyz;
+  uint4 v_11 = data[((24u + start_byte_offset) / 16u)];
+  return matrix<float16_t, 4, 3>(v_6, v_8, v_10, tint_bitcast_to_f16(((((((24u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_11.zw) : (v_11.xy))).xyz);
 }
 
 void main() {
-  vector<float16_t, 3> v_8 = tint_bitcast_to_f16(data[2u]).xyz;
-  vector<float16_t, 4> x = mul(v_4(0u), v_8);
+  vector<float16_t, 3> v_12 = tint_bitcast_to_f16(data[2u].xy).xyz;
+  vector<float16_t, 4> x = mul(v_4(0u), v_12);
 }
 
diff --git a/test/tint/expressions/swizzle/read/packed_vec3/f16.wgsl.expected.ir.dxc.hlsl b/test/tint/expressions/swizzle/read/packed_vec3/f16.wgsl.expected.ir.dxc.hlsl
index 8c6f20c..2937bb6 100644
--- a/test/tint/expressions/swizzle/read/packed_vec3/f16.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/expressions/swizzle/read/packed_vec3/f16.wgsl.expected.ir.dxc.hlsl
@@ -2,12 +2,12 @@
 cbuffer cbuffer_U : register(b0) {
   uint4 U[1];
 };
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
-  uint4 v = src;
-  uint4 mask = (65535u).xxxx;
-  uint4 shift = (16u).xxxx;
-  float4 t_low = f16tof32((v & mask));
-  float4 t_high = f16tof32(((v >> shift) & mask));
+vector<float16_t, 4> tint_bitcast_to_f16(uint2 src) {
+  uint2 v = src;
+  uint2 mask = (65535u).xx;
+  uint2 shift = (16u).xx;
+  float2 t_low = f16tof32((v & mask));
+  float2 t_high = f16tof32(((v >> shift) & mask));
   float16_t v_1 = float16_t(t_low.x);
   float16_t v_2 = float16_t(t_high.x);
   float16_t v_3 = float16_t(t_low.y);
@@ -15,127 +15,127 @@
 }
 
 void f() {
-  vector<float16_t, 3> v = tint_bitcast_to_f16(U[0u]).xyz;
+  vector<float16_t, 3> v = tint_bitcast_to_f16(U[0u].xy).xyz;
   float16_t x = float16_t(f16tof32(U[0u].x));
   float16_t y = float16_t(f16tof32((U[0u].x >> 16u)));
   float16_t z = float16_t(f16tof32(U[0u].y));
-  vector<float16_t, 2> xx = tint_bitcast_to_f16(U[0u]).xyz.xx;
-  vector<float16_t, 2> xy = tint_bitcast_to_f16(U[0u]).xyz.xy;
-  vector<float16_t, 2> xz = tint_bitcast_to_f16(U[0u]).xyz.xz;
-  vector<float16_t, 2> yx = tint_bitcast_to_f16(U[0u]).xyz.yx;
-  vector<float16_t, 2> yy = tint_bitcast_to_f16(U[0u]).xyz.yy;
-  vector<float16_t, 2> yz = tint_bitcast_to_f16(U[0u]).xyz.yz;
-  vector<float16_t, 2> zx = tint_bitcast_to_f16(U[0u]).xyz.zx;
-  vector<float16_t, 2> zy = tint_bitcast_to_f16(U[0u]).xyz.zy;
-  vector<float16_t, 2> zz = tint_bitcast_to_f16(U[0u]).xyz.zz;
-  vector<float16_t, 3> xxx = tint_bitcast_to_f16(U[0u]).xyz.xxx;
-  vector<float16_t, 3> xxy = tint_bitcast_to_f16(U[0u]).xyz.xxy;
-  vector<float16_t, 3> xxz = tint_bitcast_to_f16(U[0u]).xyz.xxz;
-  vector<float16_t, 3> xyx = tint_bitcast_to_f16(U[0u]).xyz.xyx;
-  vector<float16_t, 3> xyy = tint_bitcast_to_f16(U[0u]).xyz.xyy;
-  vector<float16_t, 3> xyz = tint_bitcast_to_f16(U[0u]).xyz.xyz;
-  vector<float16_t, 3> xzx = tint_bitcast_to_f16(U[0u]).xyz.xzx;
-  vector<float16_t, 3> xzy = tint_bitcast_to_f16(U[0u]).xyz.xzy;
-  vector<float16_t, 3> xzz = tint_bitcast_to_f16(U[0u]).xyz.xzz;
-  vector<float16_t, 3> yxx = tint_bitcast_to_f16(U[0u]).xyz.yxx;
-  vector<float16_t, 3> yxy = tint_bitcast_to_f16(U[0u]).xyz.yxy;
-  vector<float16_t, 3> yxz = tint_bitcast_to_f16(U[0u]).xyz.yxz;
-  vector<float16_t, 3> yyx = tint_bitcast_to_f16(U[0u]).xyz.yyx;
-  vector<float16_t, 3> yyy = tint_bitcast_to_f16(U[0u]).xyz.yyy;
-  vector<float16_t, 3> yyz = tint_bitcast_to_f16(U[0u]).xyz.yyz;
-  vector<float16_t, 3> yzx = tint_bitcast_to_f16(U[0u]).xyz.yzx;
-  vector<float16_t, 3> yzy = tint_bitcast_to_f16(U[0u]).xyz.yzy;
-  vector<float16_t, 3> yzz = tint_bitcast_to_f16(U[0u]).xyz.yzz;
-  vector<float16_t, 3> zxx = tint_bitcast_to_f16(U[0u]).xyz.zxx;
-  vector<float16_t, 3> zxy = tint_bitcast_to_f16(U[0u]).xyz.zxy;
-  vector<float16_t, 3> zxz = tint_bitcast_to_f16(U[0u]).xyz.zxz;
-  vector<float16_t, 3> zyx = tint_bitcast_to_f16(U[0u]).xyz.zyx;
-  vector<float16_t, 3> zyy = tint_bitcast_to_f16(U[0u]).xyz.zyy;
-  vector<float16_t, 3> zyz = tint_bitcast_to_f16(U[0u]).xyz.zyz;
-  vector<float16_t, 3> zzx = tint_bitcast_to_f16(U[0u]).xyz.zzx;
-  vector<float16_t, 3> zzy = tint_bitcast_to_f16(U[0u]).xyz.zzy;
-  vector<float16_t, 3> zzz = tint_bitcast_to_f16(U[0u]).xyz.zzz;
-  vector<float16_t, 4> xxxx = tint_bitcast_to_f16(U[0u]).xyz.xxxx;
-  vector<float16_t, 4> xxxy = tint_bitcast_to_f16(U[0u]).xyz.xxxy;
-  vector<float16_t, 4> xxxz = tint_bitcast_to_f16(U[0u]).xyz.xxxz;
-  vector<float16_t, 4> xxyx = tint_bitcast_to_f16(U[0u]).xyz.xxyx;
-  vector<float16_t, 4> xxyy = tint_bitcast_to_f16(U[0u]).xyz.xxyy;
-  vector<float16_t, 4> xxyz = tint_bitcast_to_f16(U[0u]).xyz.xxyz;
-  vector<float16_t, 4> xxzx = tint_bitcast_to_f16(U[0u]).xyz.xxzx;
-  vector<float16_t, 4> xxzy = tint_bitcast_to_f16(U[0u]).xyz.xxzy;
-  vector<float16_t, 4> xxzz = tint_bitcast_to_f16(U[0u]).xyz.xxzz;
-  vector<float16_t, 4> xyxx = tint_bitcast_to_f16(U[0u]).xyz.xyxx;
-  vector<float16_t, 4> xyxy = tint_bitcast_to_f16(U[0u]).xyz.xyxy;
-  vector<float16_t, 4> xyxz = tint_bitcast_to_f16(U[0u]).xyz.xyxz;
-  vector<float16_t, 4> xyyx = tint_bitcast_to_f16(U[0u]).xyz.xyyx;
-  vector<float16_t, 4> xyyy = tint_bitcast_to_f16(U[0u]).xyz.xyyy;
-  vector<float16_t, 4> xyyz = tint_bitcast_to_f16(U[0u]).xyz.xyyz;
-  vector<float16_t, 4> xyzx = tint_bitcast_to_f16(U[0u]).xyz.xyzx;
-  vector<float16_t, 4> xyzy = tint_bitcast_to_f16(U[0u]).xyz.xyzy;
-  vector<float16_t, 4> xyzz = tint_bitcast_to_f16(U[0u]).xyz.xyzz;
-  vector<float16_t, 4> xzxx = tint_bitcast_to_f16(U[0u]).xyz.xzxx;
-  vector<float16_t, 4> xzxy = tint_bitcast_to_f16(U[0u]).xyz.xzxy;
-  vector<float16_t, 4> xzxz = tint_bitcast_to_f16(U[0u]).xyz.xzxz;
-  vector<float16_t, 4> xzyx = tint_bitcast_to_f16(U[0u]).xyz.xzyx;
-  vector<float16_t, 4> xzyy = tint_bitcast_to_f16(U[0u]).xyz.xzyy;
-  vector<float16_t, 4> xzyz = tint_bitcast_to_f16(U[0u]).xyz.xzyz;
-  vector<float16_t, 4> xzzx = tint_bitcast_to_f16(U[0u]).xyz.xzzx;
-  vector<float16_t, 4> xzzy = tint_bitcast_to_f16(U[0u]).xyz.xzzy;
-  vector<float16_t, 4> xzzz = tint_bitcast_to_f16(U[0u]).xyz.xzzz;
-  vector<float16_t, 4> yxxx = tint_bitcast_to_f16(U[0u]).xyz.yxxx;
-  vector<float16_t, 4> yxxy = tint_bitcast_to_f16(U[0u]).xyz.yxxy;
-  vector<float16_t, 4> yxxz = tint_bitcast_to_f16(U[0u]).xyz.yxxz;
-  vector<float16_t, 4> yxyx = tint_bitcast_to_f16(U[0u]).xyz.yxyx;
-  vector<float16_t, 4> yxyy = tint_bitcast_to_f16(U[0u]).xyz.yxyy;
-  vector<float16_t, 4> yxyz = tint_bitcast_to_f16(U[0u]).xyz.yxyz;
-  vector<float16_t, 4> yxzx = tint_bitcast_to_f16(U[0u]).xyz.yxzx;
-  vector<float16_t, 4> yxzy = tint_bitcast_to_f16(U[0u]).xyz.yxzy;
-  vector<float16_t, 4> yxzz = tint_bitcast_to_f16(U[0u]).xyz.yxzz;
-  vector<float16_t, 4> yyxx = tint_bitcast_to_f16(U[0u]).xyz.yyxx;
-  vector<float16_t, 4> yyxy = tint_bitcast_to_f16(U[0u]).xyz.yyxy;
-  vector<float16_t, 4> yyxz = tint_bitcast_to_f16(U[0u]).xyz.yyxz;
-  vector<float16_t, 4> yyyx = tint_bitcast_to_f16(U[0u]).xyz.yyyx;
-  vector<float16_t, 4> yyyy = tint_bitcast_to_f16(U[0u]).xyz.yyyy;
-  vector<float16_t, 4> yyyz = tint_bitcast_to_f16(U[0u]).xyz.yyyz;
-  vector<float16_t, 4> yyzx = tint_bitcast_to_f16(U[0u]).xyz.yyzx;
-  vector<float16_t, 4> yyzy = tint_bitcast_to_f16(U[0u]).xyz.yyzy;
-  vector<float16_t, 4> yyzz = tint_bitcast_to_f16(U[0u]).xyz.yyzz;
-  vector<float16_t, 4> yzxx = tint_bitcast_to_f16(U[0u]).xyz.yzxx;
-  vector<float16_t, 4> yzxy = tint_bitcast_to_f16(U[0u]).xyz.yzxy;
-  vector<float16_t, 4> yzxz = tint_bitcast_to_f16(U[0u]).xyz.yzxz;
-  vector<float16_t, 4> yzyx = tint_bitcast_to_f16(U[0u]).xyz.yzyx;
-  vector<float16_t, 4> yzyy = tint_bitcast_to_f16(U[0u]).xyz.yzyy;
-  vector<float16_t, 4> yzyz = tint_bitcast_to_f16(U[0u]).xyz.yzyz;
-  vector<float16_t, 4> yzzx = tint_bitcast_to_f16(U[0u]).xyz.yzzx;
-  vector<float16_t, 4> yzzy = tint_bitcast_to_f16(U[0u]).xyz.yzzy;
-  vector<float16_t, 4> yzzz = tint_bitcast_to_f16(U[0u]).xyz.yzzz;
-  vector<float16_t, 4> zxxx = tint_bitcast_to_f16(U[0u]).xyz.zxxx;
-  vector<float16_t, 4> zxxy = tint_bitcast_to_f16(U[0u]).xyz.zxxy;
-  vector<float16_t, 4> zxxz = tint_bitcast_to_f16(U[0u]).xyz.zxxz;
-  vector<float16_t, 4> zxyx = tint_bitcast_to_f16(U[0u]).xyz.zxyx;
-  vector<float16_t, 4> zxyy = tint_bitcast_to_f16(U[0u]).xyz.zxyy;
-  vector<float16_t, 4> zxyz = tint_bitcast_to_f16(U[0u]).xyz.zxyz;
-  vector<float16_t, 4> zxzx = tint_bitcast_to_f16(U[0u]).xyz.zxzx;
-  vector<float16_t, 4> zxzy = tint_bitcast_to_f16(U[0u]).xyz.zxzy;
-  vector<float16_t, 4> zxzz = tint_bitcast_to_f16(U[0u]).xyz.zxzz;
-  vector<float16_t, 4> zyxx = tint_bitcast_to_f16(U[0u]).xyz.zyxx;
-  vector<float16_t, 4> zyxy = tint_bitcast_to_f16(U[0u]).xyz.zyxy;
-  vector<float16_t, 4> zyxz = tint_bitcast_to_f16(U[0u]).xyz.zyxz;
-  vector<float16_t, 4> zyyx = tint_bitcast_to_f16(U[0u]).xyz.zyyx;
-  vector<float16_t, 4> zyyy = tint_bitcast_to_f16(U[0u]).xyz.zyyy;
-  vector<float16_t, 4> zyyz = tint_bitcast_to_f16(U[0u]).xyz.zyyz;
-  vector<float16_t, 4> zyzx = tint_bitcast_to_f16(U[0u]).xyz.zyzx;
-  vector<float16_t, 4> zyzy = tint_bitcast_to_f16(U[0u]).xyz.zyzy;
-  vector<float16_t, 4> zyzz = tint_bitcast_to_f16(U[0u]).xyz.zyzz;
-  vector<float16_t, 4> zzxx = tint_bitcast_to_f16(U[0u]).xyz.zzxx;
-  vector<float16_t, 4> zzxy = tint_bitcast_to_f16(U[0u]).xyz.zzxy;
-  vector<float16_t, 4> zzxz = tint_bitcast_to_f16(U[0u]).xyz.zzxz;
-  vector<float16_t, 4> zzyx = tint_bitcast_to_f16(U[0u]).xyz.zzyx;
-  vector<float16_t, 4> zzyy = tint_bitcast_to_f16(U[0u]).xyz.zzyy;
-  vector<float16_t, 4> zzyz = tint_bitcast_to_f16(U[0u]).xyz.zzyz;
-  vector<float16_t, 4> zzzx = tint_bitcast_to_f16(U[0u]).xyz.zzzx;
-  vector<float16_t, 4> zzzy = tint_bitcast_to_f16(U[0u]).xyz.zzzy;
-  vector<float16_t, 4> zzzz = tint_bitcast_to_f16(U[0u]).xyz.zzzz;
+  vector<float16_t, 2> xx = tint_bitcast_to_f16(U[0u].xy).xyz.xx;
+  vector<float16_t, 2> xy = tint_bitcast_to_f16(U[0u].xy).xyz.xy;
+  vector<float16_t, 2> xz = tint_bitcast_to_f16(U[0u].xy).xyz.xz;
+  vector<float16_t, 2> yx = tint_bitcast_to_f16(U[0u].xy).xyz.yx;
+  vector<float16_t, 2> yy = tint_bitcast_to_f16(U[0u].xy).xyz.yy;
+  vector<float16_t, 2> yz = tint_bitcast_to_f16(U[0u].xy).xyz.yz;
+  vector<float16_t, 2> zx = tint_bitcast_to_f16(U[0u].xy).xyz.zx;
+  vector<float16_t, 2> zy = tint_bitcast_to_f16(U[0u].xy).xyz.zy;
+  vector<float16_t, 2> zz = tint_bitcast_to_f16(U[0u].xy).xyz.zz;
+  vector<float16_t, 3> xxx = tint_bitcast_to_f16(U[0u].xy).xyz.xxx;
+  vector<float16_t, 3> xxy = tint_bitcast_to_f16(U[0u].xy).xyz.xxy;
+  vector<float16_t, 3> xxz = tint_bitcast_to_f16(U[0u].xy).xyz.xxz;
+  vector<float16_t, 3> xyx = tint_bitcast_to_f16(U[0u].xy).xyz.xyx;
+  vector<float16_t, 3> xyy = tint_bitcast_to_f16(U[0u].xy).xyz.xyy;
+  vector<float16_t, 3> xyz = tint_bitcast_to_f16(U[0u].xy).xyz.xyz;
+  vector<float16_t, 3> xzx = tint_bitcast_to_f16(U[0u].xy).xyz.xzx;
+  vector<float16_t, 3> xzy = tint_bitcast_to_f16(U[0u].xy).xyz.xzy;
+  vector<float16_t, 3> xzz = tint_bitcast_to_f16(U[0u].xy).xyz.xzz;
+  vector<float16_t, 3> yxx = tint_bitcast_to_f16(U[0u].xy).xyz.yxx;
+  vector<float16_t, 3> yxy = tint_bitcast_to_f16(U[0u].xy).xyz.yxy;
+  vector<float16_t, 3> yxz = tint_bitcast_to_f16(U[0u].xy).xyz.yxz;
+  vector<float16_t, 3> yyx = tint_bitcast_to_f16(U[0u].xy).xyz.yyx;
+  vector<float16_t, 3> yyy = tint_bitcast_to_f16(U[0u].xy).xyz.yyy;
+  vector<float16_t, 3> yyz = tint_bitcast_to_f16(U[0u].xy).xyz.yyz;
+  vector<float16_t, 3> yzx = tint_bitcast_to_f16(U[0u].xy).xyz.yzx;
+  vector<float16_t, 3> yzy = tint_bitcast_to_f16(U[0u].xy).xyz.yzy;
+  vector<float16_t, 3> yzz = tint_bitcast_to_f16(U[0u].xy).xyz.yzz;
+  vector<float16_t, 3> zxx = tint_bitcast_to_f16(U[0u].xy).xyz.zxx;
+  vector<float16_t, 3> zxy = tint_bitcast_to_f16(U[0u].xy).xyz.zxy;
+  vector<float16_t, 3> zxz = tint_bitcast_to_f16(U[0u].xy).xyz.zxz;
+  vector<float16_t, 3> zyx = tint_bitcast_to_f16(U[0u].xy).xyz.zyx;
+  vector<float16_t, 3> zyy = tint_bitcast_to_f16(U[0u].xy).xyz.zyy;
+  vector<float16_t, 3> zyz = tint_bitcast_to_f16(U[0u].xy).xyz.zyz;
+  vector<float16_t, 3> zzx = tint_bitcast_to_f16(U[0u].xy).xyz.zzx;
+  vector<float16_t, 3> zzy = tint_bitcast_to_f16(U[0u].xy).xyz.zzy;
+  vector<float16_t, 3> zzz = tint_bitcast_to_f16(U[0u].xy).xyz.zzz;
+  vector<float16_t, 4> xxxx = tint_bitcast_to_f16(U[0u].xy).xyz.xxxx;
+  vector<float16_t, 4> xxxy = tint_bitcast_to_f16(U[0u].xy).xyz.xxxy;
+  vector<float16_t, 4> xxxz = tint_bitcast_to_f16(U[0u].xy).xyz.xxxz;
+  vector<float16_t, 4> xxyx = tint_bitcast_to_f16(U[0u].xy).xyz.xxyx;
+  vector<float16_t, 4> xxyy = tint_bitcast_to_f16(U[0u].xy).xyz.xxyy;
+  vector<float16_t, 4> xxyz = tint_bitcast_to_f16(U[0u].xy).xyz.xxyz;
+  vector<float16_t, 4> xxzx = tint_bitcast_to_f16(U[0u].xy).xyz.xxzx;
+  vector<float16_t, 4> xxzy = tint_bitcast_to_f16(U[0u].xy).xyz.xxzy;
+  vector<float16_t, 4> xxzz = tint_bitcast_to_f16(U[0u].xy).xyz.xxzz;
+  vector<float16_t, 4> xyxx = tint_bitcast_to_f16(U[0u].xy).xyz.xyxx;
+  vector<float16_t, 4> xyxy = tint_bitcast_to_f16(U[0u].xy).xyz.xyxy;
+  vector<float16_t, 4> xyxz = tint_bitcast_to_f16(U[0u].xy).xyz.xyxz;
+  vector<float16_t, 4> xyyx = tint_bitcast_to_f16(U[0u].xy).xyz.xyyx;
+  vector<float16_t, 4> xyyy = tint_bitcast_to_f16(U[0u].xy).xyz.xyyy;
+  vector<float16_t, 4> xyyz = tint_bitcast_to_f16(U[0u].xy).xyz.xyyz;
+  vector<float16_t, 4> xyzx = tint_bitcast_to_f16(U[0u].xy).xyz.xyzx;
+  vector<float16_t, 4> xyzy = tint_bitcast_to_f16(U[0u].xy).xyz.xyzy;
+  vector<float16_t, 4> xyzz = tint_bitcast_to_f16(U[0u].xy).xyz.xyzz;
+  vector<float16_t, 4> xzxx = tint_bitcast_to_f16(U[0u].xy).xyz.xzxx;
+  vector<float16_t, 4> xzxy = tint_bitcast_to_f16(U[0u].xy).xyz.xzxy;
+  vector<float16_t, 4> xzxz = tint_bitcast_to_f16(U[0u].xy).xyz.xzxz;
+  vector<float16_t, 4> xzyx = tint_bitcast_to_f16(U[0u].xy).xyz.xzyx;
+  vector<float16_t, 4> xzyy = tint_bitcast_to_f16(U[0u].xy).xyz.xzyy;
+  vector<float16_t, 4> xzyz = tint_bitcast_to_f16(U[0u].xy).xyz.xzyz;
+  vector<float16_t, 4> xzzx = tint_bitcast_to_f16(U[0u].xy).xyz.xzzx;
+  vector<float16_t, 4> xzzy = tint_bitcast_to_f16(U[0u].xy).xyz.xzzy;
+  vector<float16_t, 4> xzzz = tint_bitcast_to_f16(U[0u].xy).xyz.xzzz;
+  vector<float16_t, 4> yxxx = tint_bitcast_to_f16(U[0u].xy).xyz.yxxx;
+  vector<float16_t, 4> yxxy = tint_bitcast_to_f16(U[0u].xy).xyz.yxxy;
+  vector<float16_t, 4> yxxz = tint_bitcast_to_f16(U[0u].xy).xyz.yxxz;
+  vector<float16_t, 4> yxyx = tint_bitcast_to_f16(U[0u].xy).xyz.yxyx;
+  vector<float16_t, 4> yxyy = tint_bitcast_to_f16(U[0u].xy).xyz.yxyy;
+  vector<float16_t, 4> yxyz = tint_bitcast_to_f16(U[0u].xy).xyz.yxyz;
+  vector<float16_t, 4> yxzx = tint_bitcast_to_f16(U[0u].xy).xyz.yxzx;
+  vector<float16_t, 4> yxzy = tint_bitcast_to_f16(U[0u].xy).xyz.yxzy;
+  vector<float16_t, 4> yxzz = tint_bitcast_to_f16(U[0u].xy).xyz.yxzz;
+  vector<float16_t, 4> yyxx = tint_bitcast_to_f16(U[0u].xy).xyz.yyxx;
+  vector<float16_t, 4> yyxy = tint_bitcast_to_f16(U[0u].xy).xyz.yyxy;
+  vector<float16_t, 4> yyxz = tint_bitcast_to_f16(U[0u].xy).xyz.yyxz;
+  vector<float16_t, 4> yyyx = tint_bitcast_to_f16(U[0u].xy).xyz.yyyx;
+  vector<float16_t, 4> yyyy = tint_bitcast_to_f16(U[0u].xy).xyz.yyyy;
+  vector<float16_t, 4> yyyz = tint_bitcast_to_f16(U[0u].xy).xyz.yyyz;
+  vector<float16_t, 4> yyzx = tint_bitcast_to_f16(U[0u].xy).xyz.yyzx;
+  vector<float16_t, 4> yyzy = tint_bitcast_to_f16(U[0u].xy).xyz.yyzy;
+  vector<float16_t, 4> yyzz = tint_bitcast_to_f16(U[0u].xy).xyz.yyzz;
+  vector<float16_t, 4> yzxx = tint_bitcast_to_f16(U[0u].xy).xyz.yzxx;
+  vector<float16_t, 4> yzxy = tint_bitcast_to_f16(U[0u].xy).xyz.yzxy;
+  vector<float16_t, 4> yzxz = tint_bitcast_to_f16(U[0u].xy).xyz.yzxz;
+  vector<float16_t, 4> yzyx = tint_bitcast_to_f16(U[0u].xy).xyz.yzyx;
+  vector<float16_t, 4> yzyy = tint_bitcast_to_f16(U[0u].xy).xyz.yzyy;
+  vector<float16_t, 4> yzyz = tint_bitcast_to_f16(U[0u].xy).xyz.yzyz;
+  vector<float16_t, 4> yzzx = tint_bitcast_to_f16(U[0u].xy).xyz.yzzx;
+  vector<float16_t, 4> yzzy = tint_bitcast_to_f16(U[0u].xy).xyz.yzzy;
+  vector<float16_t, 4> yzzz = tint_bitcast_to_f16(U[0u].xy).xyz.yzzz;
+  vector<float16_t, 4> zxxx = tint_bitcast_to_f16(U[0u].xy).xyz.zxxx;
+  vector<float16_t, 4> zxxy = tint_bitcast_to_f16(U[0u].xy).xyz.zxxy;
+  vector<float16_t, 4> zxxz = tint_bitcast_to_f16(U[0u].xy).xyz.zxxz;
+  vector<float16_t, 4> zxyx = tint_bitcast_to_f16(U[0u].xy).xyz.zxyx;
+  vector<float16_t, 4> zxyy = tint_bitcast_to_f16(U[0u].xy).xyz.zxyy;
+  vector<float16_t, 4> zxyz = tint_bitcast_to_f16(U[0u].xy).xyz.zxyz;
+  vector<float16_t, 4> zxzx = tint_bitcast_to_f16(U[0u].xy).xyz.zxzx;
+  vector<float16_t, 4> zxzy = tint_bitcast_to_f16(U[0u].xy).xyz.zxzy;
+  vector<float16_t, 4> zxzz = tint_bitcast_to_f16(U[0u].xy).xyz.zxzz;
+  vector<float16_t, 4> zyxx = tint_bitcast_to_f16(U[0u].xy).xyz.zyxx;
+  vector<float16_t, 4> zyxy = tint_bitcast_to_f16(U[0u].xy).xyz.zyxy;
+  vector<float16_t, 4> zyxz = tint_bitcast_to_f16(U[0u].xy).xyz.zyxz;
+  vector<float16_t, 4> zyyx = tint_bitcast_to_f16(U[0u].xy).xyz.zyyx;
+  vector<float16_t, 4> zyyy = tint_bitcast_to_f16(U[0u].xy).xyz.zyyy;
+  vector<float16_t, 4> zyyz = tint_bitcast_to_f16(U[0u].xy).xyz.zyyz;
+  vector<float16_t, 4> zyzx = tint_bitcast_to_f16(U[0u].xy).xyz.zyzx;
+  vector<float16_t, 4> zyzy = tint_bitcast_to_f16(U[0u].xy).xyz.zyzy;
+  vector<float16_t, 4> zyzz = tint_bitcast_to_f16(U[0u].xy).xyz.zyzz;
+  vector<float16_t, 4> zzxx = tint_bitcast_to_f16(U[0u].xy).xyz.zzxx;
+  vector<float16_t, 4> zzxy = tint_bitcast_to_f16(U[0u].xy).xyz.zzxy;
+  vector<float16_t, 4> zzxz = tint_bitcast_to_f16(U[0u].xy).xyz.zzxz;
+  vector<float16_t, 4> zzyx = tint_bitcast_to_f16(U[0u].xy).xyz.zzyx;
+  vector<float16_t, 4> zzyy = tint_bitcast_to_f16(U[0u].xy).xyz.zzyy;
+  vector<float16_t, 4> zzyz = tint_bitcast_to_f16(U[0u].xy).xyz.zzyz;
+  vector<float16_t, 4> zzzx = tint_bitcast_to_f16(U[0u].xy).xyz.zzzx;
+  vector<float16_t, 4> zzzy = tint_bitcast_to_f16(U[0u].xy).xyz.zzzy;
+  vector<float16_t, 4> zzzz = tint_bitcast_to_f16(U[0u].xy).xyz.zzzz;
 }
 
 [numthreads(1, 1, 1)]