Cucumber/Kernel/include/Tier0/atomic_operations.h

61 lines
1.4 KiB
C
Raw Normal View History

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