#include <metal_stdlib>

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

void firstTrailingBit_47d475() {
  uint arg_0 = 1u;
  uint res = tint_first_trailing_bit(arg_0);
}

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

float4 vertex_main_inner() {
  firstTrailingBit_47d475();
  return float4(0.0f);
}

vertex tint_symbol vertex_main() {
  float4 const inner_result = vertex_main_inner();
  tint_symbol wrapper_result = {};
  wrapper_result.value = inner_result;
  return wrapper_result;
}

fragment void fragment_main() {
  firstTrailingBit_47d475();
  return;
}

kernel void compute_main() {
  firstTrailingBit_47d475();
  return;
}

