#include <metal_stdlib>
using namespace metal;

struct tint_immediate_data_struct {
  /* 0x0000 */ uint tint_non_constant_zero;
  /* 0x0004 */ array<int8_t, 2044> tint_pad;
  /* 0x0800 */ array<uint, 1> tint_storage_buffer_sizes;
};

struct tint_module_vars_struct {
  device array<uint, 1>* s;
  const constant tint_immediate_data_struct* tint_immediate_data;
};

struct tint_array_lengths_struct {
  uint tint_array_length_0_0;
};
const constant array<half3x2, 2> v = array<half3x2, 2>{half3x2(half2(0.0h, 1.0h), half2(2.0h, 3.0h), half2(2.0h, 3.0h)), half3x2(half2(0.0h, 1.0h), half2(2.0h, 3.0h), half2(2.0h, 3.0h))};

uint tint_f16_to_u32(half value) {
  return uint(clamp(value, 0.0h, 65504.0h));
}

[[max_total_threads_per_threadgroup(1)]]
kernel void v_1(device array<uint, 1>* s [[buffer(0)]], const constant tint_immediate_data_struct* tint_immediate_data [[buffer(30)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.s=s, .tint_immediate_data=tint_immediate_data};
  uint q = 0u;
  device uint* const v_2 = (&(*tint_module_vars.s)[min(0u, (tint_array_lengths_struct{.tint_array_length_0_0=((*tint_module_vars.tint_immediate_data).tint_storage_buffer_sizes[0u] / 4u)}.tint_array_length_0_0 - 1u))]);
  (*v_2) = tint_f16_to_u32(v[min(q, 1u)][0].x);
}
