#include <metal_stdlib>
using namespace metal;

struct tint_module_vars_struct {
  device int* prevent_dce;
};

struct VertexOutput {
  float4 pos;
  int prevent_dce;
};

struct vertex_main_outputs {
  float4 VertexOutput_pos [[position]];
  int VertexOutput_prevent_dce [[user(locn0)]] [[flat]];
};

int firstLeadingBit_57a1a3() {
  int arg_0 = 1;
  uint const v = as_type<uint>(arg_0);
  int res = as_type<int>(select((select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u)) | (select(8u, 0u, (((select(~(v), v, (v < 2147483648u)) >> select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u))) & 65280u) == 0u)) | (select(4u, 0u, ((((select(~(v), v, (v < 2147483648u)) >> select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u))) >> select(8u, 0u, (((select(~(v), v, (v < 2147483648u)) >> select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u))) & 65280u) == 0u))) & 240u) == 0u)) | (select(2u, 0u, (((((select(~(v), v, (v < 2147483648u)) >> select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u))) >> select(8u, 0u, (((select(~(v), v, (v < 2147483648u)) >> select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u))) & 65280u) == 0u))) >> select(4u, 0u, ((((select(~(v), v, (v < 2147483648u)) >> select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u))) >> select(8u, 0u, (((select(~(v), v, (v < 2147483648u)) >> select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u))) & 65280u) == 0u))) & 240u) == 0u))) & 12u) == 0u)) | select(1u, 0u, ((((((select(~(v), v, (v < 2147483648u)) >> select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u))) >> select(8u, 0u, (((select(~(v), v, (v < 2147483648u)) >> select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u))) & 65280u) == 0u))) >> select(4u, 0u, ((((select(~(v), v, (v < 2147483648u)) >> select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u))) >> select(8u, 0u, (((select(~(v), v, (v < 2147483648u)) >> select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u))) & 65280u) == 0u))) & 240u) == 0u))) >> select(2u, 0u, (((((select(~(v), v, (v < 2147483648u)) >> select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u))) >> select(8u, 0u, (((select(~(v), v, (v < 2147483648u)) >> select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u))) & 65280u) == 0u))) >> select(4u, 0u, ((((select(~(v), v, (v < 2147483648u)) >> select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u))) >> select(8u, 0u, (((select(~(v), v, (v < 2147483648u)) >> select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u))) & 65280u) == 0u))) & 240u) == 0u))) & 12u) == 0u))) & 2u) == 0u)))))), 4294967295u, (((((select(~(v), v, (v < 2147483648u)) >> select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u))) >> select(8u, 0u, (((select(~(v), v, (v < 2147483648u)) >> select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u))) & 65280u) == 0u))) >> select(4u, 0u, ((((select(~(v), v, (v < 2147483648u)) >> select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u))) >> select(8u, 0u, (((select(~(v), v, (v < 2147483648u)) >> select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u))) & 65280u) == 0u))) & 240u) == 0u))) >> select(2u, 0u, (((((select(~(v), v, (v < 2147483648u)) >> select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u))) >> select(8u, 0u, (((select(~(v), v, (v < 2147483648u)) >> select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u))) & 65280u) == 0u))) >> select(4u, 0u, ((((select(~(v), v, (v < 2147483648u)) >> select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u))) >> select(8u, 0u, (((select(~(v), v, (v < 2147483648u)) >> select(16u, 0u, ((select(~(v), v, (v < 2147483648u)) & 4294901760u) == 0u))) & 65280u) == 0u))) & 240u) == 0u))) & 12u) == 0u))) == 0u)));
  return res;
}

fragment void fragment_main(device int* prevent_dce [[buffer(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
  (*tint_module_vars.prevent_dce) = firstLeadingBit_57a1a3();
}

kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
  (*tint_module_vars.prevent_dce) = firstLeadingBit_57a1a3();
}

VertexOutput vertex_main_inner() {
  VertexOutput out = {};
  out.pos = float4(0.0f);
  out.prevent_dce = firstLeadingBit_57a1a3();
  return out;
}

vertex vertex_main_outputs vertex_main() {
  VertexOutput const v_1 = vertex_main_inner();
  vertex_main_outputs tint_wrapper_result = {};
  tint_wrapper_result.VertexOutput_pos = v_1.pos;
  tint_wrapper_result.VertexOutput_prevent_dce = v_1.prevent_dce;
  return tint_wrapper_result;
}
