From owner-p4-projects@FreeBSD.ORG Mon Mar 7 22:09:04 2005 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 73EDE16A4D0; Mon, 7 Mar 2005 22:09:04 +0000 (GMT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 4732216A4CE for ; Mon, 7 Mar 2005 22:09:04 +0000 (GMT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 2080143D2F for ; Mon, 7 Mar 2005 22:09:04 +0000 (GMT) (envelope-from jhb@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id j27M94ui026260 for ; Mon, 7 Mar 2005 22:09:04 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id j27M93kD026257 for perforce@freebsd.org; Mon, 7 Mar 2005 22:09:03 GMT (envelope-from jhb@freebsd.org) Date: Mon, 7 Mar 2005 22:09:03 GMT Message-Id: <200503072209.j27M93kD026257@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Subject: PERFORCE change 72664 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 07 Mar 2005 22:09:05 -0000 http://perforce.freebsd.org/chv.cgi?CH=72664 Change 72664 by jhb@jhb_slimer on 2005/03/07 22:08:18 - Stop using +m constraint. - Remove "memory" clobber from atomic_cmpset() and instead add the clobber to all of the various acq variants. Affected files ... .. //depot/projects/smpng/sys/i386/include/atomic.h#22 edit Differences ... ==== //depot/projects/smpng/sys/i386/include/atomic.h#22 (text+ko) ==== @@ -96,15 +96,17 @@ atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\ { \ __asm __volatile(__XSTRING(MPLOCKED) OP \ - : "+m" (*p) \ - : CONS (V)); \ + : "=m" (*p) \ + : CONS (V), "m" (*p)); \ } \ +ATOMIC_ACQ(NAME, TYPE); \ struct __hack #else /* !(__GNUC__ || __INTEL_COMPILER) */ #define ATOMIC_ASM(NAME, TYPE, OP, CONS, V) \ -extern void atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v) +extern void atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v); \ +ATOMIC_ACQ(NAME, TYPE) #endif /* __GNUC__ || __INTEL_COMPILER */ @@ -130,16 +132,16 @@ " cli ; " " cmpl %0,%2 ; " " jne 1f ; " - " movl %1,%2 ; " + " movl %2,%1 ; " "1: " " sete %%al; " " movzbl %%al,%0 ; " " popfl ; " "# atomic_cmpset_int" : "+a" (res) /* 0 (result) */ - : "r" (src), /* 1 */ - "m" (*(dst)) /* 2 */ - : "memory"); + "=m" (*dst) /* 1 */ + : "r" (src), /* 2 */ + "m" (*dst)); /* 3 */ return (res); } @@ -153,25 +155,21 @@ __asm __volatile ( " " __XSTRING(MPLOCKED) " " - " cmpxchgl %1,%2 ; " + " cmpxchgl %2,%1 ; " " setz %%al ; " " movzbl %%al,%0 ; " "1: " "# atomic_cmpset_int" : "+a" (res) /* 0 (result) */ - : "r" (src), /* 1 */ - "m" (*(dst)) /* 2 */ - : "memory"); + "=m" (*dst) /* 1 */ + : "r" (src), /* 2 */ + "m" (*dst)); /* 3 */ return (res); } #endif /* defined(CPU_DISABLE_CMPXCHG) */ -#endif /* defined(__GNUC__) || defined(__INTEL_COMPILER) */ - -#if defined(__GNUC__) || defined(__INTEL_COMPILER) - #if defined(_KERNEL) && !defined(SMP) /* @@ -205,8 +203,9 @@ \ __asm __volatile(__XSTRING(MPLOCKED) LOP \ : "=a" (res), /* 0 (result) */\ - "+m" (*p) /* 1 */ \ - : : "memory"); \ + "=m" (*p) /* 1 */ \ + : "m" (*p) /* 2 */ \ + : "memory"); \ \ return (res); \ } \ @@ -218,9 +217,9 @@ atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\ { \ __asm __volatile(SOP \ - : "+m" (*p), /* 0 */ \ + : "=m" (*p), /* 0 */ \ "+r" (v) /* 1 */ \ - : : "memory"); \ + : "m" (*p)); /* 2 */ \ } \ struct __hack @@ -238,6 +237,15 @@ #endif /* KLD_MODULE */ +#define ATOMIC_ACQ(NAME, TYPE) \ +static __inline void \ +atomic_##NAME##_##TYPE##_acq(volatile u_##TYPE *p, u_##TYPE v)\ +{ \ + atomic_##NAME##_##TYPE(p, v); \ + __asm __volatile("" ::: "memory"); \ +} \ +struct __hack + ATOMIC_ASM(set, char, "orb %b1,%0", "iq", v); ATOMIC_ASM(clear, char, "andb %b1,%0", "iq", ~v); ATOMIC_ASM(add, char, "addb %b1,%0", "iq", v); @@ -266,48 +274,30 @@ #undef ATOMIC_ASM #undef ATOMIC_STORE_LOAD -#define atomic_set_acq_char atomic_set_char #define atomic_set_rel_char atomic_set_char -#define atomic_clear_acq_char atomic_clear_char #define atomic_clear_rel_char atomic_clear_char -#define atomic_add_acq_char atomic_add_char #define atomic_add_rel_char atomic_add_char -#define atomic_subtract_acq_char atomic_subtract_char #define atomic_subtract_rel_char atomic_subtract_char -#define atomic_set_acq_short atomic_set_short #define atomic_set_rel_short atomic_set_short -#define atomic_clear_acq_short atomic_clear_short #define atomic_clear_rel_short atomic_clear_short -#define atomic_add_acq_short atomic_add_short #define atomic_add_rel_short atomic_add_short -#define atomic_subtract_acq_short atomic_subtract_short #define atomic_subtract_rel_short atomic_subtract_short -#define atomic_set_acq_int atomic_set_int #define atomic_set_rel_int atomic_set_int -#define atomic_clear_acq_int atomic_clear_int #define atomic_clear_rel_int atomic_clear_int -#define atomic_add_acq_int atomic_add_int #define atomic_add_rel_int atomic_add_int -#define atomic_subtract_acq_int atomic_subtract_int #define atomic_subtract_rel_int atomic_subtract_int -#define atomic_cmpset_acq_int atomic_cmpset_int #define atomic_cmpset_rel_int atomic_cmpset_int -#define atomic_set_acq_long atomic_set_long #define atomic_set_rel_long atomic_set_long -#define atomic_clear_acq_long atomic_clear_long #define atomic_clear_rel_long atomic_clear_long -#define atomic_add_acq_long atomic_add_long #define atomic_add_rel_long atomic_add_long -#define atomic_subtract_acq_long atomic_subtract_long #define atomic_subtract_rel_long atomic_subtract_long #define atomic_cmpset_long atomic_cmpset_int #define atomic_cmpset_acq_long atomic_cmpset_acq_int #define atomic_cmpset_rel_long atomic_cmpset_rel_int -#define atomic_cmpset_acq_ptr atomic_cmpset_ptr #define atomic_cmpset_rel_ptr atomic_cmpset_ptr #define atomic_set_8 atomic_set_char @@ -361,6 +351,16 @@ #if !defined(WANT_FUNCTIONS) static __inline int +atomic_cmpset_acq_int(volatile u_int *dst, u_int exp, u_int src) +{ + int retval; + + retval = atomic_cmpset_int(dst, exp, src); + __asm __volatile("" ::: "memory"); + return (retval); +} + +static __inline int atomic_cmpset_ptr(volatile void *dst, void *exp, void *src) { @@ -368,6 +368,14 @@ (u_int)src)); } +static __inline int +atomic_cmpset_acq_ptr(volatile void *dst, void *exp, void *src) +{ + + return (atomic_cmpset_acq_int((volatile u_int *)dst, (u_int)exp, + (u_int)src)); +} + static __inline void * atomic_load_acq_ptr(volatile void *p) { @@ -421,8 +429,9 @@ " xorl %0,%0 ; " " xchgl %1,%0 ; " "# atomic_readandclear_int" - : "=&r" (result) /* 0 (result) */ - : "m" (*addr)); /* 1 (addr) */ + : "=&r" (result), /* 0 (result) */ + "=m" (*addr) /* 1 (addr) */ + : "m" (*addr)); /* 2 (addr) */ return (result); } @@ -436,8 +445,9 @@ " xorl %0,%0 ; " " xchgl %1,%0 ; " "# atomic_readandclear_int" - : "=&r" (result) /* 0 (result) */ - : "m" (*addr)); /* 1 (addr) */ + : "=&r" (result), /* 0 (result) */ + "=m" (*addr) /* 1 (addr) */ + : "m" (*addr)); /* 2 (addr) */ return (result); }