Cucumber/Kernel/include/Tier0/atomic_operations.h

61 lines
1.4 KiB
C

#ifndef __ATOMIC_OPERATIONS_H__
#define __ATOMIC_OPERATIONS_H__
#include "types.h"
typedef struct {
u64 Value;
} T_ATOMIC;
#define atomic_init(n) { (n) }
#define atomic_read(v) ((v)->Value)
#define atomic_set(v, n) (((v)->Value) = n)
static inline void atomic_add(T_ATOMIC *Atom, u64 Value)
{
__asm__ volatile("lock addq %1, %0" : "+m"(Atom->Value) : "ir"(Value));
}
static inline void atomic_sub(T_ATOMIC *Atom, u64 Value)
{
__asm__ volatile("lock subq %1, %0" : "+m"(Atom->Value) : "ir"(Value));
}
static inline u8 atomic_sub_and_test(T_ATOMIC *Atom, u64 Value)
{
u8 C;
__asm__ volatile("lock subq %2, %0\n"
"sete %1\n"
: "+m"(Atom->Value), "=qm"(C)
: "ir" (Value) : "memory");
return C;
}
static inline void atomic_inc(T_ATOMIC *Atom)
{
__asm__ volatile("lock incq %0" : "+m"(Atom->Value));
}
static inline void atomic_dec(T_ATOMIC *Atom)
{
__asm__ volatile("lock decq %0" : "+m"(Atom->Value));
}
static inline u8 atomic_dec_and_test(T_ATOMIC *Atom)
{
u8 C;
__asm__ volatile("lock decq %0\n"
"sete %1" : "+m"(Atom->Value), "=qm"(C) :: "memory");
return C;
}
static inline u8 atomic_inc_and_test(T_ATOMIC *Atom)
{
u8 C;
__asm__ volatile("lock incq %0\n"
"sete %1" : "+m"(Atom->Value), "=qm"(C) :: "memory");
return C;
}
#endif