Date: Sat, 3 Aug 2013 00:19:27 +0000 (UTC) From: Jung-uk Kim <jkim@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r253904 - in projects/atomic64/sys: amd64/include i386/include Message-ID: <201308030019.r730JRBn060009@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jkim Date: Sat Aug 3 00:19:26 2013 New Revision: 253904 URL: http://svnweb.freebsd.org/changeset/base/253904 Log: Redo r253891. It seems compilers generate better code with this change. Modified: projects/atomic64/sys/amd64/include/atomic.h projects/atomic64/sys/i386/include/atomic.h Modified: projects/atomic64/sys/amd64/include/atomic.h ============================================================================== --- projects/atomic64/sys/amd64/include/atomic.h Fri Aug 2 23:33:40 2013 (r253903) +++ projects/atomic64/sys/amd64/include/atomic.h Sat Aug 3 00:19:26 2013 (r253904) @@ -82,8 +82,8 @@ int atomic_cmpset_int(volatile u_int *ds int atomic_cmpset_long(volatile u_long *dst, u_long expect, u_long src); u_int atomic_fetchadd_int(volatile u_int *p, u_int v); u_long atomic_fetchadd_long(volatile u_long *p, u_long v); -int atomic_testandset_int(volatile u_int *p, int v); -int atomic_testandset_long(volatile u_long *p, int v); +int atomic_testandset_int(volatile u_int *p, u_int v); +int atomic_testandset_long(volatile u_long *p, u_int v); #define ATOMIC_LOAD(TYPE, LOP) \ u_##TYPE atomic_load_acq_##TYPE(volatile u_##TYPE *p) @@ -214,7 +214,7 @@ atomic_fetchadd_long(volatile u_long *p, } static __inline int -atomic_testandset_int(volatile u_int *p, int v) +atomic_testandset_int(volatile u_int *p, u_int v) { u_char res; @@ -225,14 +225,14 @@ atomic_testandset_int(volatile u_int *p, "# atomic_testandset_int" : "=r" (res), /* 0 */ "=m" (*p) /* 1 */ - : "ir" (v), /* 2 */ + : "Ir" (v & 0x1f), /* 2 */ "m" (*p) /* 3 */ : "cc"); return (res); } static __inline int -atomic_testandset_long(volatile u_long *p, int v) +atomic_testandset_long(volatile u_long *p, u_int v) { u_char res; @@ -243,7 +243,7 @@ atomic_testandset_long(volatile u_long * "# atomic_testandset_long" : "=r" (res), /* 0 */ "=m" (*p) /* 1 */ - : "ir" ((u_long)v), /* 2 */ + : "Jr" ((u_long)(v & 0x3f)), /* 2 */ "m" (*p) /* 3 */ : "cc"); return (res); Modified: projects/atomic64/sys/i386/include/atomic.h ============================================================================== --- projects/atomic64/sys/i386/include/atomic.h Fri Aug 2 23:33:40 2013 (r253903) +++ projects/atomic64/sys/i386/include/atomic.h Sat Aug 3 00:19:26 2013 (r253904) @@ -80,7 +80,7 @@ void atomic_##NAME##_barr_##TYPE(volatil int atomic_cmpset_int(volatile u_int *dst, u_int expect, u_int src); u_int atomic_fetchadd_int(volatile u_int *p, u_int v); -int atomic_testandset_int(volatile u_int *p, int v); +int atomic_testandset_int(volatile u_int *p, u_int v); #define ATOMIC_LOAD(TYPE, LOP) \ u_##TYPE atomic_load_acq_##TYPE(volatile u_##TYPE *p) @@ -184,9 +184,9 @@ atomic_swap_64_i386(volatile uint64_t *p } static __inline int -atomic_testandset_64_i386(volatile uint64_t *p, int v) +atomic_testandset_64_i386(volatile uint64_t *p, u_int v) { - const uint64_t s = 1ULL << v % 64; + const uint64_t s = 1ULL << (v & 0x3f); int res; register_t lock; @@ -269,9 +269,9 @@ atomic_swap_64_i586(volatile uint64_t *p } static __inline int -atomic_testandset_64_i586(volatile uint64_t *p, int v) +atomic_testandset_64_i586(volatile uint64_t *p, u_int v) { - const uint64_t s = 1ULL << v % 64; + const uint64_t s = 1ULL << (v & 0x3f); uint64_t n; do { @@ -355,7 +355,7 @@ atomic_fetchadd_int(volatile u_int *p, u } static __inline int -atomic_testandset_int(volatile u_int *p, int v) +atomic_testandset_int(volatile u_int *p, u_int v) { u_char res; @@ -366,7 +366,7 @@ atomic_testandset_int(volatile u_int *p, "# atomic_testandset_int" : "=r" (res), /* 0 */ "=m" (*p) /* 1 */ - : "ir" (v), /* 2 */ + : "Ir" (v & 0x1f), /* 2 */ "m" (*p) /* 3 */ : "cc"); return (res); @@ -469,7 +469,7 @@ extern int (*atomic_cmpset_64)(volatile extern uint64_t (*atomic_load_acq_64)(volatile uint64_t *); extern void (*atomic_store_rel_64)(volatile uint64_t *, uint64_t); extern uint64_t (*atomic_swap_64)(volatile uint64_t *, uint64_t); -extern int (*atomic_testandset_64)(volatile uint64_t *, int); +extern int (*atomic_testandset_64)(volatile uint64_t *, u_int); #endif static __inline int @@ -488,7 +488,7 @@ atomic_fetchadd_long(volatile u_long *p, } static __inline int -atomic_testandset_long(volatile u_long *p, int v) +atomic_testandset_long(volatile u_long *p, u_int v) { return (atomic_testandset_int((volatile u_int *)p, v));
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201308030019.r730JRBn060009>