// SPDX-License-Identifier: GPL-2.0

// Generated by scripts/atomic/gen-rust-atomic-helpers.sh
// DO NOT MODIFY THIS FILE DIRECTLY

/*
 * This file provides helpers for the various atomic functions for Rust.
 */
#ifndef _RUST_ATOMIC_API_H
#define _RUST_ATOMIC_API_H

#include <linux/atomic.h>

// TODO: Remove this after INLINE_HELPERS support is added.
#ifndef __rust_helper
#define __rust_helper
#endif

__rust_helper int
rust_helper_atomic_read(const atomic_t *v)
{
	return atomic_read(v);
}

__rust_helper int
rust_helper_atomic_read_acquire(const atomic_t *v)
{
	return atomic_read_acquire(v);
}

__rust_helper void
rust_helper_atomic_set(atomic_t *v, int i)
{
	atomic_set(v, i);
}

__rust_helper void
rust_helper_atomic_set_release(atomic_t *v, int i)
{
	atomic_set_release(v, i);
}

__rust_helper void
rust_helper_atomic_add(int i, atomic_t *v)
{
	atomic_add(i, v);
}

__rust_helper int
rust_helper_atomic_add_return(int i, atomic_t *v)
{
	return atomic_add_return(i, v);
}

__rust_helper int
rust_helper_atomic_add_return_acquire(int i, atomic_t *v)
{
	return atomic_add_return_acquire(i, v);
}

__rust_helper int
rust_helper_atomic_add_return_release(int i, atomic_t *v)
{
	return atomic_add_return_release(i, v);
}

__rust_helper int
rust_helper_atomic_add_return_relaxed(int i, atomic_t *v)
{
	return atomic_add_return_relaxed(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_add(int i, atomic_t *v)
{
	return atomic_fetch_add(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_add_acquire(int i, atomic_t *v)
{
	return atomic_fetch_add_acquire(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_add_release(int i, atomic_t *v)
{
	return atomic_fetch_add_release(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_add_relaxed(int i, atomic_t *v)
{
	return atomic_fetch_add_relaxed(i, v);
}

__rust_helper void
rust_helper_atomic_sub(int i, atomic_t *v)
{
	atomic_sub(i, v);
}

__rust_helper int
rust_helper_atomic_sub_return(int i, atomic_t *v)
{
	return atomic_sub_return(i, v);
}

__rust_helper int
rust_helper_atomic_sub_return_acquire(int i, atomic_t *v)
{
	return atomic_sub_return_acquire(i, v);
}

__rust_helper int
rust_helper_atomic_sub_return_release(int i, atomic_t *v)
{
	return atomic_sub_return_release(i, v);
}

__rust_helper int
rust_helper_atomic_sub_return_relaxed(int i, atomic_t *v)
{
	return atomic_sub_return_relaxed(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_sub(int i, atomic_t *v)
{
	return atomic_fetch_sub(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_sub_acquire(int i, atomic_t *v)
{
	return atomic_fetch_sub_acquire(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_sub_release(int i, atomic_t *v)
{
	return atomic_fetch_sub_release(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_sub_relaxed(int i, atomic_t *v)
{
	return atomic_fetch_sub_relaxed(i, v);
}

__rust_helper void
rust_helper_atomic_inc(atomic_t *v)
{
	atomic_inc(v);
}

__rust_helper int
rust_helper_atomic_inc_return(atomic_t *v)
{
	return atomic_inc_return(v);
}

__rust_helper int
rust_helper_atomic_inc_return_acquire(atomic_t *v)
{
	return atomic_inc_return_acquire(v);
}

__rust_helper int
rust_helper_atomic_inc_return_release(atomic_t *v)
{
	return atomic_inc_return_release(v);
}

__rust_helper int
rust_helper_atomic_inc_return_relaxed(atomic_t *v)
{
	return atomic_inc_return_relaxed(v);
}

__rust_helper int
rust_helper_atomic_fetch_inc(atomic_t *v)
{
	return atomic_fetch_inc(v);
}

__rust_helper int
rust_helper_atomic_fetch_inc_acquire(atomic_t *v)
{
	return atomic_fetch_inc_acquire(v);
}

__rust_helper int
rust_helper_atomic_fetch_inc_release(atomic_t *v)
{
	return atomic_fetch_inc_release(v);
}

__rust_helper int
rust_helper_atomic_fetch_inc_relaxed(atomic_t *v)
{
	return atomic_fetch_inc_relaxed(v);
}

__rust_helper void
rust_helper_atomic_dec(atomic_t *v)
{
	atomic_dec(v);
}

__rust_helper int
rust_helper_atomic_dec_return(atomic_t *v)
{
	return atomic_dec_return(v);
}

__rust_helper int
rust_helper_atomic_dec_return_acquire(atomic_t *v)
{
	return atomic_dec_return_acquire(v);
}

__rust_helper int
rust_helper_atomic_dec_return_release(atomic_t *v)
{
	return atomic_dec_return_release(v);
}

__rust_helper int
rust_helper_atomic_dec_return_relaxed(atomic_t *v)
{
	return atomic_dec_return_relaxed(v);
}

__rust_helper int
rust_helper_atomic_fetch_dec(atomic_t *v)
{
	return atomic_fetch_dec(v);
}

__rust_helper int
rust_helper_atomic_fetch_dec_acquire(atomic_t *v)
{
	return atomic_fetch_dec_acquire(v);
}

__rust_helper int
rust_helper_atomic_fetch_dec_release(atomic_t *v)
{
	return atomic_fetch_dec_release(v);
}

__rust_helper int
rust_helper_atomic_fetch_dec_relaxed(atomic_t *v)
{
	return atomic_fetch_dec_relaxed(v);
}

__rust_helper void
rust_helper_atomic_and(int i, atomic_t *v)
{
	atomic_and(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_and(int i, atomic_t *v)
{
	return atomic_fetch_and(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_and_acquire(int i, atomic_t *v)
{
	return atomic_fetch_and_acquire(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_and_release(int i, atomic_t *v)
{
	return atomic_fetch_and_release(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_and_relaxed(int i, atomic_t *v)
{
	return atomic_fetch_and_relaxed(i, v);
}

__rust_helper void
rust_helper_atomic_andnot(int i, atomic_t *v)
{
	atomic_andnot(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_andnot(int i, atomic_t *v)
{
	return atomic_fetch_andnot(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_andnot_acquire(int i, atomic_t *v)
{
	return atomic_fetch_andnot_acquire(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_andnot_release(int i, atomic_t *v)
{
	return atomic_fetch_andnot_release(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_andnot_relaxed(int i, atomic_t *v)
{
	return atomic_fetch_andnot_relaxed(i, v);
}

__rust_helper void
rust_helper_atomic_or(int i, atomic_t *v)
{
	atomic_or(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_or(int i, atomic_t *v)
{
	return atomic_fetch_or(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_or_acquire(int i, atomic_t *v)
{
	return atomic_fetch_or_acquire(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_or_release(int i, atomic_t *v)
{
	return atomic_fetch_or_release(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_or_relaxed(int i, atomic_t *v)
{
	return atomic_fetch_or_relaxed(i, v);
}

__rust_helper void
rust_helper_atomic_xor(int i, atomic_t *v)
{
	atomic_xor(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_xor(int i, atomic_t *v)
{
	return atomic_fetch_xor(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_xor_acquire(int i, atomic_t *v)
{
	return atomic_fetch_xor_acquire(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_xor_release(int i, atomic_t *v)
{
	return atomic_fetch_xor_release(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_xor_relaxed(int i, atomic_t *v)
{
	return atomic_fetch_xor_relaxed(i, v);
}

__rust_helper int
rust_helper_atomic_xchg(atomic_t *v, int new)
{
	return atomic_xchg(v, new);
}

__rust_helper int
rust_helper_atomic_xchg_acquire(atomic_t *v, int new)
{
	return atomic_xchg_acquire(v, new);
}

__rust_helper int
rust_helper_atomic_xchg_release(atomic_t *v, int new)
{
	return atomic_xchg_release(v, new);
}

__rust_helper int
rust_helper_atomic_xchg_relaxed(atomic_t *v, int new)
{
	return atomic_xchg_relaxed(v, new);
}

__rust_helper int
rust_helper_atomic_cmpxchg(atomic_t *v, int old, int new)
{
	return atomic_cmpxchg(v, old, new);
}

__rust_helper int
rust_helper_atomic_cmpxchg_acquire(atomic_t *v, int old, int new)
{
	return atomic_cmpxchg_acquire(v, old, new);
}

__rust_helper int
rust_helper_atomic_cmpxchg_release(atomic_t *v, int old, int new)
{
	return atomic_cmpxchg_release(v, old, new);
}

__rust_helper int
rust_helper_atomic_cmpxchg_relaxed(atomic_t *v, int old, int new)
{
	return atomic_cmpxchg_relaxed(v, old, new);
}

__rust_helper bool
rust_helper_atomic_try_cmpxchg(atomic_t *v, int *old, int new)
{
	return atomic_try_cmpxchg(v, old, new);
}

__rust_helper bool
rust_helper_atomic_try_cmpxchg_acquire(atomic_t *v, int *old, int new)
{
	return atomic_try_cmpxchg_acquire(v, old, new);
}

__rust_helper bool
rust_helper_atomic_try_cmpxchg_release(atomic_t *v, int *old, int new)
{
	return atomic_try_cmpxchg_release(v, old, new);
}

__rust_helper bool
rust_helper_atomic_try_cmpxchg_relaxed(atomic_t *v, int *old, int new)
{
	return atomic_try_cmpxchg_relaxed(v, old, new);
}

__rust_helper bool
rust_helper_atomic_sub_and_test(int i, atomic_t *v)
{
	return atomic_sub_and_test(i, v);
}

__rust_helper bool
rust_helper_atomic_dec_and_test(atomic_t *v)
{
	return atomic_dec_and_test(v);
}

__rust_helper bool
rust_helper_atomic_inc_and_test(atomic_t *v)
{
	return atomic_inc_and_test(v);
}

__rust_helper bool
rust_helper_atomic_add_negative(int i, atomic_t *v)
{
	return atomic_add_negative(i, v);
}

__rust_helper bool
rust_helper_atomic_add_negative_acquire(int i, atomic_t *v)
{
	return atomic_add_negative_acquire(i, v);
}

__rust_helper bool
rust_helper_atomic_add_negative_release(int i, atomic_t *v)
{
	return atomic_add_negative_release(i, v);
}

__rust_helper bool
rust_helper_atomic_add_negative_relaxed(int i, atomic_t *v)
{
	return atomic_add_negative_relaxed(i, v);
}

__rust_helper int
rust_helper_atomic_fetch_add_unless(atomic_t *v, int a, int u)
{
	return atomic_fetch_add_unless(v, a, u);
}

__rust_helper bool
rust_helper_atomic_add_unless(atomic_t *v, int a, int u)
{
	return atomic_add_unless(v, a, u);
}

__rust_helper bool
rust_helper_atomic_inc_not_zero(atomic_t *v)
{
	return atomic_inc_not_zero(v);
}

__rust_helper bool
rust_helper_atomic_inc_unless_negative(atomic_t *v)
{
	return atomic_inc_unless_negative(v);
}

__rust_helper bool
rust_helper_atomic_dec_unless_positive(atomic_t *v)
{
	return atomic_dec_unless_positive(v);
}

__rust_helper int
rust_helper_atomic_dec_if_positive(atomic_t *v)
{
	return atomic_dec_if_positive(v);
}

__rust_helper s64
rust_helper_atomic64_read(const atomic64_t *v)
{
	return atomic64_read(v);
}

__rust_helper s64
rust_helper_atomic64_read_acquire(const atomic64_t *v)
{
	return atomic64_read_acquire(v);
}

__rust_helper void
rust_helper_atomic64_set(atomic64_t *v, s64 i)
{
	atomic64_set(v, i);
}

__rust_helper void
rust_helper_atomic64_set_release(atomic64_t *v, s64 i)
{
	atomic64_set_release(v, i);
}

__rust_helper void
rust_helper_atomic64_add(s64 i, atomic64_t *v)
{
	atomic64_add(i, v);
}

__rust_helper s64
rust_helper_atomic64_add_return(s64 i, atomic64_t *v)
{
	return atomic64_add_return(i, v);
}

__rust_helper s64
rust_helper_atomic64_add_return_acquire(s64 i, atomic64_t *v)
{
	return atomic64_add_return_acquire(i, v);
}

__rust_helper s64
rust_helper_atomic64_add_return_release(s64 i, atomic64_t *v)
{
	return atomic64_add_return_release(i, v);
}

__rust_helper s64
rust_helper_atomic64_add_return_relaxed(s64 i, atomic64_t *v)
{
	return atomic64_add_return_relaxed(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_add(s64 i, atomic64_t *v)
{
	return atomic64_fetch_add(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_add_acquire(s64 i, atomic64_t *v)
{
	return atomic64_fetch_add_acquire(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_add_release(s64 i, atomic64_t *v)
{
	return atomic64_fetch_add_release(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_add_relaxed(s64 i, atomic64_t *v)
{
	return atomic64_fetch_add_relaxed(i, v);
}

__rust_helper void
rust_helper_atomic64_sub(s64 i, atomic64_t *v)
{
	atomic64_sub(i, v);
}

__rust_helper s64
rust_helper_atomic64_sub_return(s64 i, atomic64_t *v)
{
	return atomic64_sub_return(i, v);
}

__rust_helper s64
rust_helper_atomic64_sub_return_acquire(s64 i, atomic64_t *v)
{
	return atomic64_sub_return_acquire(i, v);
}

__rust_helper s64
rust_helper_atomic64_sub_return_release(s64 i, atomic64_t *v)
{
	return atomic64_sub_return_release(i, v);
}

__rust_helper s64
rust_helper_atomic64_sub_return_relaxed(s64 i, atomic64_t *v)
{
	return atomic64_sub_return_relaxed(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_sub(s64 i, atomic64_t *v)
{
	return atomic64_fetch_sub(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_sub_acquire(s64 i, atomic64_t *v)
{
	return atomic64_fetch_sub_acquire(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_sub_release(s64 i, atomic64_t *v)
{
	return atomic64_fetch_sub_release(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_sub_relaxed(s64 i, atomic64_t *v)
{
	return atomic64_fetch_sub_relaxed(i, v);
}

__rust_helper void
rust_helper_atomic64_inc(atomic64_t *v)
{
	atomic64_inc(v);
}

__rust_helper s64
rust_helper_atomic64_inc_return(atomic64_t *v)
{
	return atomic64_inc_return(v);
}

__rust_helper s64
rust_helper_atomic64_inc_return_acquire(atomic64_t *v)
{
	return atomic64_inc_return_acquire(v);
}

__rust_helper s64
rust_helper_atomic64_inc_return_release(atomic64_t *v)
{
	return atomic64_inc_return_release(v);
}

__rust_helper s64
rust_helper_atomic64_inc_return_relaxed(atomic64_t *v)
{
	return atomic64_inc_return_relaxed(v);
}

__rust_helper s64
rust_helper_atomic64_fetch_inc(atomic64_t *v)
{
	return atomic64_fetch_inc(v);
}

__rust_helper s64
rust_helper_atomic64_fetch_inc_acquire(atomic64_t *v)
{
	return atomic64_fetch_inc_acquire(v);
}

__rust_helper s64
rust_helper_atomic64_fetch_inc_release(atomic64_t *v)
{
	return atomic64_fetch_inc_release(v);
}

__rust_helper s64
rust_helper_atomic64_fetch_inc_relaxed(atomic64_t *v)
{
	return atomic64_fetch_inc_relaxed(v);
}

__rust_helper void
rust_helper_atomic64_dec(atomic64_t *v)
{
	atomic64_dec(v);
}

__rust_helper s64
rust_helper_atomic64_dec_return(atomic64_t *v)
{
	return atomic64_dec_return(v);
}

__rust_helper s64
rust_helper_atomic64_dec_return_acquire(atomic64_t *v)
{
	return atomic64_dec_return_acquire(v);
}

__rust_helper s64
rust_helper_atomic64_dec_return_release(atomic64_t *v)
{
	return atomic64_dec_return_release(v);
}

__rust_helper s64
rust_helper_atomic64_dec_return_relaxed(atomic64_t *v)
{
	return atomic64_dec_return_relaxed(v);
}

__rust_helper s64
rust_helper_atomic64_fetch_dec(atomic64_t *v)
{
	return atomic64_fetch_dec(v);
}

__rust_helper s64
rust_helper_atomic64_fetch_dec_acquire(atomic64_t *v)
{
	return atomic64_fetch_dec_acquire(v);
}

__rust_helper s64
rust_helper_atomic64_fetch_dec_release(atomic64_t *v)
{
	return atomic64_fetch_dec_release(v);
}

__rust_helper s64
rust_helper_atomic64_fetch_dec_relaxed(atomic64_t *v)
{
	return atomic64_fetch_dec_relaxed(v);
}

__rust_helper void
rust_helper_atomic64_and(s64 i, atomic64_t *v)
{
	atomic64_and(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_and(s64 i, atomic64_t *v)
{
	return atomic64_fetch_and(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_and_acquire(s64 i, atomic64_t *v)
{
	return atomic64_fetch_and_acquire(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_and_release(s64 i, atomic64_t *v)
{
	return atomic64_fetch_and_release(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_and_relaxed(s64 i, atomic64_t *v)
{
	return atomic64_fetch_and_relaxed(i, v);
}

__rust_helper void
rust_helper_atomic64_andnot(s64 i, atomic64_t *v)
{
	atomic64_andnot(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_andnot(s64 i, atomic64_t *v)
{
	return atomic64_fetch_andnot(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_andnot_acquire(s64 i, atomic64_t *v)
{
	return atomic64_fetch_andnot_acquire(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_andnot_release(s64 i, atomic64_t *v)
{
	return atomic64_fetch_andnot_release(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_andnot_relaxed(s64 i, atomic64_t *v)
{
	return atomic64_fetch_andnot_relaxed(i, v);
}

__rust_helper void
rust_helper_atomic64_or(s64 i, atomic64_t *v)
{
	atomic64_or(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_or(s64 i, atomic64_t *v)
{
	return atomic64_fetch_or(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_or_acquire(s64 i, atomic64_t *v)
{
	return atomic64_fetch_or_acquire(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_or_release(s64 i, atomic64_t *v)
{
	return atomic64_fetch_or_release(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_or_relaxed(s64 i, atomic64_t *v)
{
	return atomic64_fetch_or_relaxed(i, v);
}

__rust_helper void
rust_helper_atomic64_xor(s64 i, atomic64_t *v)
{
	atomic64_xor(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_xor(s64 i, atomic64_t *v)
{
	return atomic64_fetch_xor(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_xor_acquire(s64 i, atomic64_t *v)
{
	return atomic64_fetch_xor_acquire(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_xor_release(s64 i, atomic64_t *v)
{
	return atomic64_fetch_xor_release(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_xor_relaxed(s64 i, atomic64_t *v)
{
	return atomic64_fetch_xor_relaxed(i, v);
}

__rust_helper s64
rust_helper_atomic64_xchg(atomic64_t *v, s64 new)
{
	return atomic64_xchg(v, new);
}

__rust_helper s64
rust_helper_atomic64_xchg_acquire(atomic64_t *v, s64 new)
{
	return atomic64_xchg_acquire(v, new);
}

__rust_helper s64
rust_helper_atomic64_xchg_release(atomic64_t *v, s64 new)
{
	return atomic64_xchg_release(v, new);
}

__rust_helper s64
rust_helper_atomic64_xchg_relaxed(atomic64_t *v, s64 new)
{
	return atomic64_xchg_relaxed(v, new);
}

__rust_helper s64
rust_helper_atomic64_cmpxchg(atomic64_t *v, s64 old, s64 new)
{
	return atomic64_cmpxchg(v, old, new);
}

__rust_helper s64
rust_helper_atomic64_cmpxchg_acquire(atomic64_t *v, s64 old, s64 new)
{
	return atomic64_cmpxchg_acquire(v, old, new);
}

__rust_helper s64
rust_helper_atomic64_cmpxchg_release(atomic64_t *v, s64 old, s64 new)
{
	return atomic64_cmpxchg_release(v, old, new);
}

__rust_helper s64
rust_helper_atomic64_cmpxchg_relaxed(atomic64_t *v, s64 old, s64 new)
{
	return atomic64_cmpxchg_relaxed(v, old, new);
}

__rust_helper bool
rust_helper_atomic64_try_cmpxchg(atomic64_t *v, s64 *old, s64 new)
{
	return atomic64_try_cmpxchg(v, old, new);
}

__rust_helper bool
rust_helper_atomic64_try_cmpxchg_acquire(atomic64_t *v, s64 *old, s64 new)
{
	return atomic64_try_cmpxchg_acquire(v, old, new);
}

__rust_helper bool
rust_helper_atomic64_try_cmpxchg_release(atomic64_t *v, s64 *old, s64 new)
{
	return atomic64_try_cmpxchg_release(v, old, new);
}

__rust_helper bool
rust_helper_atomic64_try_cmpxchg_relaxed(atomic64_t *v, s64 *old, s64 new)
{
	return atomic64_try_cmpxchg_relaxed(v, old, new);
}

__rust_helper bool
rust_helper_atomic64_sub_and_test(s64 i, atomic64_t *v)
{
	return atomic64_sub_and_test(i, v);
}

__rust_helper bool
rust_helper_atomic64_dec_and_test(atomic64_t *v)
{
	return atomic64_dec_and_test(v);
}

__rust_helper bool
rust_helper_atomic64_inc_and_test(atomic64_t *v)
{
	return atomic64_inc_and_test(v);
}

__rust_helper bool
rust_helper_atomic64_add_negative(s64 i, atomic64_t *v)
{
	return atomic64_add_negative(i, v);
}

__rust_helper bool
rust_helper_atomic64_add_negative_acquire(s64 i, atomic64_t *v)
{
	return atomic64_add_negative_acquire(i, v);
}

__rust_helper bool
rust_helper_atomic64_add_negative_release(s64 i, atomic64_t *v)
{
	return atomic64_add_negative_release(i, v);
}

__rust_helper bool
rust_helper_atomic64_add_negative_relaxed(s64 i, atomic64_t *v)
{
	return atomic64_add_negative_relaxed(i, v);
}

__rust_helper s64
rust_helper_atomic64_fetch_add_unless(atomic64_t *v, s64 a, s64 u)
{
	return atomic64_fetch_add_unless(v, a, u);
}

__rust_helper bool
rust_helper_atomic64_add_unless(atomic64_t *v, s64 a, s64 u)
{
	return atomic64_add_unless(v, a, u);
}

__rust_helper bool
rust_helper_atomic64_inc_not_zero(atomic64_t *v)
{
	return atomic64_inc_not_zero(v);
}

__rust_helper bool
rust_helper_atomic64_inc_unless_negative(atomic64_t *v)
{
	return atomic64_inc_unless_negative(v);
}

__rust_helper bool
rust_helper_atomic64_dec_unless_positive(atomic64_t *v)
{
	return atomic64_dec_unless_positive(v);
}

__rust_helper s64
rust_helper_atomic64_dec_if_positive(atomic64_t *v)
{
	return atomic64_dec_if_positive(v);
}

#endif /* _RUST_ATOMIC_API_H */
// 615a0e0c98b5973a47fe4fa65e92935051ca00ed
