#include <metal_stdlib>

using namespace metal;
struct S {
  /* 0x0000 */ int field0[1];
};
struct main_out {
  int x_4_1;
};
struct tint_symbol_2 {
  int x_3_param [[user(locn0)]];
};
struct tint_symbol_3 {
  int x_4_1 [[color(0)]];
};

void main_1(device S& x_5, thread int* const tint_symbol_5, thread float4* const tint_symbol_6, thread int* const tint_symbol_7) {
  *(tint_symbol_5) = 1;
  float4 const x_23 = *(tint_symbol_6);
  int const x_27 = int(x_23.x);
  int const x_28 = int(x_23.y);
  int const x_33 = *(tint_symbol_7);
  x_5.field0[as_type<int>((as_type<uint>(x_27) + as_type<uint>(as_type<int>((as_type<uint>(x_28) * as_type<uint>(8))))))] = x_27;
  if ((as_type<int>((as_type<uint>(as_type<int>((as_type<uint>((x_27 & 1)) + as_type<uint>((x_28 & 1))))) + as_type<uint>(x_33))) == int(x_23.z))) {
  }
  return;
}

main_out tint_symbol_inner(device S& x_5, float4 x_2_param, int x_3_param, thread float4* const tint_symbol_8, thread int* const tint_symbol_9, thread int* const tint_symbol_10) {
  *(tint_symbol_8) = x_2_param;
  *(tint_symbol_9) = x_3_param;
  main_1(x_5, tint_symbol_10, tint_symbol_8, tint_symbol_9);
  main_out const tint_symbol_4 = {.x_4_1=*(tint_symbol_10)};
  return tint_symbol_4;
}

fragment tint_symbol_3 tint_symbol(float4 x_2_param [[position]], tint_symbol_2 tint_symbol_1 [[stage_in]], device S& x_5 [[buffer(0)]]) {
  thread float4 tint_symbol_11 = 0.0f;
  thread int tint_symbol_12 = 0;
  thread int tint_symbol_13 = 0;
  main_out const inner_result = tint_symbol_inner(x_5, x_2_param, tint_symbol_1.x_3_param, &(tint_symbol_11), &(tint_symbol_12), &(tint_symbol_13));
  tint_symbol_3 wrapper_result = {};
  wrapper_result.x_4_1 = inner_result.x_4_1;
  return wrapper_result;
}

