#include <metal_stdlib>
using namespace metal;

template<typename T, size_t N>
struct tint_array {
  const constant T& operator[](size_t i) const constant { return elements[i]; }
  device T& operator[](size_t i) device { return elements[i]; }
  const device T& operator[](size_t i) const device { return elements[i]; }
  thread T& operator[](size_t i) thread { return elements[i]; }
  const thread T& operator[](size_t i) const thread { return elements[i]; }
  threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
  const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
  T elements[N];
};

struct tint_module_vars_struct {
  device tint_array<float, 1>* tint_member;
  const constant tint_array<uint4, 1>* tint_storage_buffer_sizes;
};

struct tint_array_lengths_struct {
  uint tint_array_length_0_0;
};

struct S {
  simdgroup_float8x8 l;
  simdgroup_float8x8 r;
};

struct S_Nested {
  S s;
};

kernel void v(device tint_array<float, 1>* v_1 [[buffer(0)]], const constant tint_array<uint4, 1>* tint_storage_buffer_sizes [[buffer(30)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.tint_member=v_1, .tint_storage_buffer_sizes=tint_storage_buffer_sizes};
  tint_array_lengths_struct const v_2 = tint_array_lengths_struct{.tint_array_length_0_0=((*tint_module_vars.tint_storage_buffer_sizes)[0u].x / 4u)};
  simdgroup_float8x8 const v_3 = simdgroup_float8x8();
  if ((((0u + (64u * 7u)) + 8u) <= v_2.tint_array_length_0_0)) {
    simdgroup_store(v_3, (&(*tint_module_vars.tint_member)[0u]), ulong(64u), ulong2(0ul), false);
  }
  simdgroup_float8x8 const v_4 = tint_array<simdgroup_float8x8, 4>{}[1u];
  if ((((0u + (64u * 7u)) + 8u) <= v_2.tint_array_length_0_0)) {
    simdgroup_store(v_4, (&(*tint_module_vars.tint_member)[0u]), ulong(64u), ulong2(0ul), false);
  }
  simdgroup_float8x8 const v_5 = tint_array<tint_array<simdgroup_float8x8, 4>, 4>{}[2u][3u];
  if ((((0u + (64u * 7u)) + 8u) <= v_2.tint_array_length_0_0)) {
    simdgroup_store(v_5, (&(*tint_module_vars.tint_member)[0u]), ulong(64u), ulong2(0ul), false);
  }
  simdgroup_float8x8 const v_6 = S{}.l;
  if ((((0u + (64u * 7u)) + 8u) <= v_2.tint_array_length_0_0)) {
    simdgroup_store(v_6, (&(*tint_module_vars.tint_member)[0u]), ulong(64u), ulong2(0ul), false);
  }
  simdgroup_float8x8 const v_7 = S_Nested{}.s.r;
  if ((((0u + (64u * 7u)) + 8u) <= v_2.tint_array_length_0_0)) {
    simdgroup_store(v_7, (&(*tint_module_vars.tint_member)[0u]), ulong(64u), ulong2(0ul), false);
  }
  simdgroup_float8x8 const v_8 = simdgroup_float8x8(42.0f);
  if ((((0u + (64u * 7u)) + 8u) <= v_2.tint_array_length_0_0)) {
    simdgroup_store(v_8, (&(*tint_module_vars.tint_member)[0u]), ulong(64u), ulong2(0ul), false);
  }
  simdgroup_float8x8 const v_9 = simdgroup_float8x8(42.0f);
  simdgroup_float8x8 const v_10 = tint_array<simdgroup_float8x8, 2>{v_9, simdgroup_float8x8(100.0f)}[1u];
  if ((((0u + (64u * 7u)) + 8u) <= v_2.tint_array_length_0_0)) {
    simdgroup_store(v_10, (&(*tint_module_vars.tint_member)[0u]), ulong(64u), ulong2(0ul), false);
  }
  simdgroup_float8x8 const v_11 = simdgroup_float8x8(42.0f);
  tint_array<simdgroup_float8x8, 2> const v_12 = tint_array<simdgroup_float8x8, 2>{v_11, simdgroup_float8x8(100.0f)};
  simdgroup_float8x8 const v_13 = simdgroup_float8x8(-7.0f);
  simdgroup_float8x8 const v_14 = tint_array<tint_array<simdgroup_float8x8, 2>, 2>{v_12, tint_array<simdgroup_float8x8, 2>{v_13, simdgroup_float8x8(-42.0f)}}[1u][0u];
  if ((((0u + (64u * 7u)) + 8u) <= v_2.tint_array_length_0_0)) {
    simdgroup_store(v_14, (&(*tint_module_vars.tint_member)[0u]), ulong(64u), ulong2(0ul), false);
  }
  simdgroup_float8x8 const v_15 = simdgroup_float8x8(42.0f);
  simdgroup_float8x8 const v_16 = S{.l=v_15, .r=simdgroup_float8x8(100.0f)}.l;
  if ((((0u + (64u * 7u)) + 8u) <= v_2.tint_array_length_0_0)) {
    simdgroup_store(v_16, (&(*tint_module_vars.tint_member)[0u]), ulong(64u), ulong2(0ul), false);
  }
  simdgroup_float8x8 const v_17 = simdgroup_float8x8(42.0f);
  simdgroup_float8x8 const v_18 = S_Nested{.s=S{.l=v_17, .r=simdgroup_float8x8(100.0f)}}.s.r;
  if ((((0u + (64u * 7u)) + 8u) <= v_2.tint_array_length_0_0)) {
    simdgroup_store(v_18, (&(*tint_module_vars.tint_member)[0u]), ulong(64u), ulong2(0ul), false);
  }
}
