#include <metal_stdlib>

using namespace metal;
uint2 tint_first_trailing_bit(uint2 v) {
  uint2 x = uint2(v);
  uint2 const b16 = select(uint2(16u), uint2(0u), bool2((x & uint2(65535u))));
  x = (x >> b16);
  uint2 const b8 = select(uint2(8u), uint2(0u), bool2((x & uint2(255u))));
  x = (x >> b8);
  uint2 const b4 = select(uint2(4u), uint2(0u), bool2((x & uint2(15u))));
  x = (x >> b4);
  uint2 const b2 = select(uint2(2u), uint2(0u), bool2((x & uint2(3u))));
  x = (x >> b2);
  uint2 const b1 = select(uint2(1u), uint2(0u), bool2((x & uint2(1u))));
  uint2 const is_zero = select(uint2(0u), uint2(4294967295u), (x == uint2(0u)));
  return uint2((((((b16 | b8) | b4) | b2) | b1) | is_zero));
}

void firstTrailingBit_45eb10(device uint2* const tint_symbol_1) {
  uint2 arg_0 = uint2(1u);
  uint2 res = tint_first_trailing_bit(arg_0);
  *(tint_symbol_1) = res;
}

struct tint_symbol {
  float4 value [[position]];
};

float4 vertex_main_inner(device uint2* const tint_symbol_2) {
  firstTrailingBit_45eb10(tint_symbol_2);
  return float4(0.0f);
}

vertex tint_symbol vertex_main(device uint2* tint_symbol_3 [[buffer(0)]]) {
  float4 const inner_result = vertex_main_inner(tint_symbol_3);
  tint_symbol wrapper_result = {};
  wrapper_result.value = inner_result;
  return wrapper_result;
}

fragment void fragment_main(device uint2* tint_symbol_4 [[buffer(0)]]) {
  firstTrailingBit_45eb10(tint_symbol_4);
  return;
}

kernel void compute_main(device uint2* tint_symbol_5 [[buffer(0)]]) {
  firstTrailingBit_45eb10(tint_symbol_5);
  return;
}

