#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_symbol_6 {
  half3x3 w;
};

struct tint_packed_vec3_f16_array_element {
  /* 0x0000 */ packed_half3 elements;
  /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
};

half3x3 tint_unpack_vec3_in_composite(tint_array<tint_packed_vec3_f16_array_element, 3> in) {
  half3x3 result = half3x3(half3(in[0].elements), half3(in[1].elements), half3(in[2].elements));
  return result;
}

void tint_zero_workgroup_memory(uint local_idx, threadgroup half3x3* const tint_symbol) {
  if ((local_idx < 1u)) {
    *(tint_symbol) = half3x3(half3(0.0h), half3(0.0h), half3(0.0h));
  }
  threadgroup_barrier(mem_flags::mem_threadgroup);
}

void f_inner(uint local_invocation_index, threadgroup half3x3* const tint_symbol_1, const constant tint_array<tint_packed_vec3_f16_array_element, 3>* const tint_symbol_2) {
  tint_zero_workgroup_memory(local_invocation_index, tint_symbol_1);
  *(tint_symbol_1) = tint_unpack_vec3_in_composite(*(tint_symbol_2));
  (*(tint_symbol_1))[1] = half3((*(tint_symbol_2))[0].elements);
  (*(tint_symbol_1))[1] = half3((*(tint_symbol_2))[0].elements).zxy;
  (*(tint_symbol_1))[0][1] = (*(tint_symbol_2))[1].elements[0];
}

kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 3>* tint_symbol_5 [[buffer(0)]], threadgroup tint_symbol_6* tint_symbol_4 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
  threadgroup half3x3* const tint_symbol_3 = &((*(tint_symbol_4)).w);
  f_inner(local_invocation_index, tint_symbol_3, tint_symbol_5);
  return;
}

