//
// fragment_main
//
#include <metal_stdlib>
using namespace metal;

struct tint_module_vars_struct {
  device int4* prevent_dce;
};

int4 extractBits_fb850f() {
  int4 arg_0 = int4(1);
  uint arg_1 = 1u;
  uint arg_2 = 1u;
  uint const v = min(arg_1, 32u);
  int4 res = extract_bits(arg_0, v, min(arg_2, (32u - v)));
  return res;
}

fragment void fragment_main(device int4* 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) = extractBits_fb850f();
}
//
// compute_main
//
#include <metal_stdlib>
using namespace metal;

struct tint_module_vars_struct {
  device int4* prevent_dce;
};

int4 extractBits_fb850f() {
  int4 arg_0 = int4(1);
  uint arg_1 = 1u;
  uint arg_2 = 1u;
  uint const v = min(arg_1, 32u);
  int4 res = extract_bits(arg_0, v, min(arg_2, (32u - v)));
  return res;
}

kernel void compute_main(device int4* 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) = extractBits_fb850f();
}
//
// vertex_main
//
#include <metal_stdlib>
using namespace metal;

struct VertexOutput {
  float4 pos;
  int4 prevent_dce;
};

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

int4 extractBits_fb850f() {
  int4 arg_0 = int4(1);
  uint arg_1 = 1u;
  uint arg_2 = 1u;
  uint const v = min(arg_1, 32u);
  int4 res = extract_bits(arg_0, v, min(arg_2, (32u - v)));
  return res;
}

VertexOutput vertex_main_inner() {
  VertexOutput out = {};
  out.pos = float4(0.0f);
  out.prevent_dce = extractBits_fb850f();
  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;
}
