#include <metal_stdlib>

using namespace metal;

struct atomic_compare_exchange_result_i32 {
  int old_value;
  bool exchanged;
};
atomic_compare_exchange_result_i32 atomicCompareExchangeWeak_1(device atomic_int* atomic, int compare, int value) {
  int old_value = compare;
  bool exchanged = atomic_compare_exchange_weak_explicit(atomic, &old_value, value, memory_order_relaxed, memory_order_relaxed);
  return {old_value, exchanged};
}

struct SB_RW_atomic {
  /* 0x0000 */ atomic_int arg_0;
};

struct SB_RW {
  int arg_0;
};

struct x__atomic_compare_exchange_resulti32 {
  int old_value;
  bool exchanged;
};

void atomicCompareExchangeWeak_1bd40a(device SB_RW_atomic* const tint_symbol_2) {
  int arg_1 = 0;
  int arg_2 = 0;
  x__atomic_compare_exchange_resulti32 res = x__atomic_compare_exchange_resulti32{};
  arg_1 = 1;
  arg_2 = 1;
  int const x_23 = arg_2;
  int const x_24 = arg_1;
  atomic_compare_exchange_result_i32 const tint_symbol = atomicCompareExchangeWeak_1(&((*(tint_symbol_2)).arg_0), x_24, x_23);
  int const old_value_1 = tint_symbol.old_value;
  int const x_25 = old_value_1;
  x__atomic_compare_exchange_resulti32 const tint_symbol_1 = {.old_value=x_25, .exchanged=(x_25 == x_23)};
  res = tint_symbol_1;
  return;
}

void fragment_main_1(device SB_RW_atomic* const tint_symbol_3) {
  atomicCompareExchangeWeak_1bd40a(tint_symbol_3);
  return;
}

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

void compute_main_1(device SB_RW_atomic* const tint_symbol_5) {
  atomicCompareExchangeWeak_1bd40a(tint_symbol_5);
  return;
}

kernel void compute_main(device SB_RW_atomic* tint_symbol_6 [[buffer(0)]]) {
  compute_main_1(tint_symbol_6);
  return;
}

