#include <metal_stdlib>

using namespace metal;
struct tint_array_wrapper {
  /* 0x0000 */ int arr[8];
};
struct In2 {
  /* 0x0000 */ tint_array_wrapper data_in2;
};
struct tint_array_wrapper_1 {
  /* 0x0000 */ int arr[1024];
};
struct Out0 {
  /* 0x0000 */ tint_array_wrapper_1 data_out0;
};
struct tint_array_wrapper_2 {
  /* 0x0000 */ int arr[512];
};
struct In0 {
  /* 0x0000 */ tint_array_wrapper_2 data_in0;
};
struct In1 {
  /* 0x0000 */ tint_array_wrapper_2 data_in1;
};

void main_1(const device In2& x_13, const device In0& x_17, device Out0& x_15, const device In1& x_19, thread uint3* const tint_symbol_2) {
  uint base_index_in = 0u;
  uint base_index_out = 0u;
  int index_in0 = 0;
  int index_in1 = 0;
  int index_out0 = 0;
  int index_out1 = 0;
  int condition_index = 0;
  int i = 0;
  int temp0 = 0;
  int temp1 = 0;
  uint const x_56 = (*(tint_symbol_2)).x;
  base_index_in = (128u * x_56);
  uint const x_59 = (*(tint_symbol_2)).x;
  base_index_out = (256u * x_59);
  index_in0 = 0;
  index_in1 = -128;
  index_out0 = 0;
  index_out1 = -128;
  condition_index = 0;
  i = 0;
  while (true) {
    int const x_65 = i;
    if ((x_65 < 256)) {
    } else {
      break;
    }
    int const x_68 = condition_index;
    int const x_70 = x_13.data_in2.arr[x_68];
    if ((x_70 == 0)) {
      uint const x_75 = base_index_out;
      int const x_76 = index_out0;
      uint const x_79 = base_index_in;
      int const x_80 = index_in0;
      int const x_84 = x_17.data_in0.arr[(x_79 + as_type<uint>(x_80))];
      x_15.data_out0.arr[(x_75 + as_type<uint>(x_76))] = x_84;
      int const x_86 = index_out0;
      index_out0 = (x_86 + 1);
      int const x_88 = index_in1;
      index_in1 = (x_88 + 1);
    } else {
      uint const x_90 = base_index_out;
      int const x_91 = index_out1;
      uint const x_94 = base_index_in;
      int const x_95 = index_in1;
      int const x_99 = x_19.data_in1.arr[(x_94 + as_type<uint>(x_95))];
      x_15.data_out0.arr[(x_90 + as_type<uint>(x_91))] = x_99;
      int const x_101 = index_out1;
      index_out1 = (x_101 + 1);
      int const x_103 = index_in1;
      index_in1 = (x_103 + 1);
    }
    int const x_105 = condition_index;
    int const x_108 = x_13.data_in2.arr[(x_105 + 1)];
    int const x_109 = condition_index;
    condition_index = (x_109 + x_108);
    int const x_111 = index_in0;
    temp0 = x_111;
    int const x_112 = index_in1;
    index_in0 = x_112;
    int const x_113 = temp0;
    index_in1 = x_113;
    int const x_114 = index_out0;
    temp1 = x_114;
    int const x_115 = index_out1;
    index_out0 = x_115;
    int const x_116 = temp1;
    index_out1 = x_116;
    {
      int const x_117 = i;
      i = (x_117 + 1);
    }
  }
  return;
}

kernel void tint_symbol(uint3 gl_WorkGroupID_param [[threadgroup_position_in_grid]], const device In2& x_13 [[buffer(2)]], const device In0& x_17 [[buffer(0)]], device Out0& x_15 [[buffer(3)]], const device In1& x_19 [[buffer(1)]]) {
  thread uint3 tint_symbol_3 = 0u;
  tint_symbol_3 = gl_WorkGroupID_param;
  main_1(x_13, x_17, x_15, x_19, &(tint_symbol_3));
  return;
}

