#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_6, thread float4* const tint_symbol_7, thread int* const tint_symbol_8) {
  *(tint_symbol_6) = 1;
  float4 const x_23 = *(tint_symbol_7);
  int const x_27 = int(x_23.x);
  int const x_28 = int(x_23.y);
  int const x_33 = *(tint_symbol_8);
  if (((((x_27 & 1) + (x_28 & 1)) + x_33) == int(x_23.z))) {
  }
  x_5.field0[(x_27 + (x_28 * 8))] = x_27;
  return;
}

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_9 = 0.0f;
  thread int tint_symbol_10 = 0;
  thread int tint_symbol_11 = 0;
  int const x_3_param = tint_symbol_1.x_3_param;
  tint_symbol_9 = x_2_param;
  tint_symbol_10 = x_3_param;
  main_1(x_5, &(tint_symbol_11), &(tint_symbol_9), &(tint_symbol_10));
  main_out const tint_symbol_4 = {.x_4_1=tint_symbol_11};
  tint_symbol_3 const tint_symbol_5 = {.x_4_1=tint_symbol_4.x_4_1};
  return tint_symbol_5;
}

