svn commit: r254394 - projects/atomic64/sys/i386/include
Jung-uk Kim
jkim at FreeBSD.org
Fri Aug 16 00:24:34 UTC 2013
Author: jkim
Date: Fri Aug 16 00:24:34 2013
New Revision: 254394
URL: http://svnweb.freebsd.org/changeset/base/254394
Log:
Micro-optimize atomic_cmpset_64_i386().
Modified:
projects/atomic64/sys/i386/include/atomic.h
Modified: projects/atomic64/sys/i386/include/atomic.h
==============================================================================
--- projects/atomic64/sys/i386/include/atomic.h Fri Aug 16 00:14:52 2013 (r254393)
+++ projects/atomic64/sys/i386/include/atomic.h Fri Aug 16 00:24:34 2013 (r254394)
@@ -297,6 +297,7 @@ static __inline int
atomic_cmpset_64_i386(volatile uint64_t *dst, uint64_t expect, uint64_t src)
{
volatile uint32_t *p;
+ u_char res;
p = (volatile uint32_t *)dst;
__asm __volatile(
@@ -305,21 +306,21 @@ atomic_cmpset_64_i386(volatile uint64_t
" xorl %1, %%eax ; "
" xorl %2, %%edx ; "
" orl %%edx, %%eax ; "
- " sete %%al ; "
- " movzbl %%al, %%eax ; "
" jne 1f ; "
- " movl %3, %1 ; "
- " movl %4, %2 ; "
+ " movl %4, %1 ; "
+ " movl %5, %2 ; "
"1: "
+ " sete %3 ; "
" popfl"
: "+A" (expect), /* 0 */
"+m" (*p), /* 1 */
- "+m" (*(p + 1)) /* 2 */
- : "r" ((uint32_t)src), /* 3 */
- "r" ((uint32_t)(src >> 32)) /* 4 */
+ "+m" (*(p + 1)), /* 2 */
+ "=q" (res) /* 3 */
+ : "r" ((uint32_t)src), /* 4 */
+ "r" ((uint32_t)(src >> 32)) /* 5 */
: "memory", "cc");
- return (expect);
+ return (res);
}
static __inline uint64_t
More information about the svn-src-projects
mailing list