#include <metal_stdlib>

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

void firstTrailingBit_7496d6(device packed_int3* const tint_symbol_1) {
  int3 arg_0 = int3(1);
  int3 res = tint_first_trailing_bit(arg_0);
  *(tint_symbol_1) = packed_int3(res);
}

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

float4 vertex_main_inner(device packed_int3* const tint_symbol_2) {
  firstTrailingBit_7496d6(tint_symbol_2);
  return float4(0.0f);
}

vertex tint_symbol vertex_main(device packed_int3* 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 packed_int3* tint_symbol_4 [[buffer(0)]]) {
  firstTrailingBit_7496d6(tint_symbol_4);
  return;
}

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

