Index: atomic.h =================================================================== RCS file: /home/ncvs/src/sys/i386/include/atomic.h,v retrieving revision 1.37 diff -u -r1.37 atomic.h --- atomic.h 2 Mar 2005 21:33:26 -0000 1.37 +++ atomic.h 5 Mar 2005 04:39:08 -0000 @@ -71,6 +71,9 @@ #define ATOMIC_ASM(NAME, TYPE, OP, CONS, V) \ void atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v) +#define ATOMIC_ASM_TEST(NAME, TYPE, OP, CONS, V) \ +int atomic_##NAME##_test_##TYPE(volatile u_##TYPE *p, u_##TYPE v) + int atomic_cmpset_int(volatile u_int *dst, u_int exp, u_int src); #define ATOMIC_STORE_LOAD(TYPE, LOP, SOP) \ @@ -105,11 +108,25 @@ } \ struct __hack +#define ATOMIC_ASM_TEST(NAME, TYPE, OP, CONS, V) \ +static __inline int \ +atomic_##NAME##_test_##TYPE(volatile u_##TYPE *p, u_##TYPE v) \ +{ \ + unsigned char r; \ + __asm __volatile(__XSTRING(MPLOCKED) OP "; sete %1" \ + : "+m" (*p), "=qm" (r) \ + : CONS (V)); \ + return r; \ +} + #else /* !__GNUCLIKE_ASM */ #define ATOMIC_ASM(NAME, TYPE, OP, CONS, V) \ extern void atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v) +#define ATOMIC_ASM_TEST(NAME, TYPE, OP, CONS, V) \ +extern int atomic_##NAME##_test_##TYPE(volatile u_##TYPE *p, u_##TYPE v) + #endif /* __GNUCLIKE_ASM */ /* @@ -262,6 +279,15 @@ ATOMIC_ASM(add, long, "addl %1,%0", "ir", v); ATOMIC_ASM(subtract, long, "subl %1,%0", "ir", v); +ATOMIC_ASM_TEST(add, char, "addb %b2,%0", "iq", v); +ATOMIC_ASM_TEST(subtract, char, "subb %b2,%0", "iq", v); +ATOMIC_ASM_TEST(add, short, "addw %w2,%0", "ir", v); +ATOMIC_ASM_TEST(subtract, short, "subw %w2,%0", "ir", v); +ATOMIC_ASM_TEST(add, long, "addl %2,%0", "ir", v); +ATOMIC_ASM_TEST(subtract, long, "subl %2,%0", "ir", v); +ATOMIC_ASM_TEST(add, int, "addl %2,%0", "ir", v); +ATOMIC_ASM_TEST(subtract, int, "subl %2,%0", "ir", v); + ATOMIC_STORE_LOAD(char, "cmpxchgb %b0,%1", "xchgb %b1,%0"); ATOMIC_STORE_LOAD(short,"cmpxchgw %w0,%1", "xchgw %w1,%0"); ATOMIC_STORE_LOAD(int, "cmpxchgl %0,%1", "xchgl %1,%0");