#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 ((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))) {
  }
  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;
  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;
}

