Index: atomic.S =================================================================== RCS file: /cvsroot/src/common/lib/libc/arch/i386/atomic/atomic.S,v retrieving revision 1.20 diff -u -u -r1.20 atomic.S --- atomic.S 18 Feb 2014 10:16:55 -0000 1.20 +++ atomic.S 22 Apr 2014 12:25:35 -0000 @@ -175,10 +175,11 @@ ret ENDLABEL(membar_sync_end) -#ifdef _HARDKERNEL ENTRY(_atomic_cas_64) +#ifdef _HARDKERNEL pushf cli +#endif /* _HARDKERNEL */ pushl %edi pushl %ebx movl 12(%esp), %edi @@ -195,7 +196,9 @@ 1: popl %ebx popl %edi +#ifdef _HARDKERNEL popf +#endif /* _HARDKERNEL */ ret 2: movl 0(%edi), %eax @@ -216,13 +219,16 @@ popl %ebx popl %edi ret +#ifdef _HARDKERNEL #ifdef GPROF .space 16, 0x90 #else .space 32, 0x90 #endif +#endif /* _HARDKERNEL */ ENDLABEL(_atomic_cas_cx8_end) +#ifdef _HARDKERNEL ENTRY(sse2_lfence) lfence ret @@ -238,20 +244,6 @@ .long .Lpatch1, .Lpatch2, .Lpatch3, .Lpatch4, .Lpatch5 .long .Lpatch6, .Lpatch7, .Lpatch8, .Lpatch9, .Lpatch10 .long .Lpatch12, .Lpatch13, .Lpatch14, .Lpatch15, 0 -#else -ENTRY(_atomic_cas_64) - pushl %edi - pushl %ebx - movl 12(%esp), %edi - movl 16(%esp), %eax - movl 20(%esp), %edx - movl 24(%esp), %ebx - movl 28(%esp), %ecx - lock - cmpxchg8b (%edi) - popl %ebx - popl %edi - ret #endif /* _HARDKERNEL */ ALIAS(atomic_add_32,_atomic_add_32) @@ -319,9 +311,15 @@ ALIAS(atomic_cas_ulong_ni,_atomic_cas_32_ni) ALIAS(atomic_cas_ptr_ni,_atomic_cas_32_ni) +#if __i586__ /* pentium or higher */ +ALIAS(atomic_cas_64,_atomic_cas_cx8) +ALIAS(atomic_cas_64_ni,_atomic_cas_cx8) +ALIAS(__sync_val_compare_and_swap_8,_atomic_cas_cx8) +#else ALIAS(atomic_cas_64,_atomic_cas_64) ALIAS(atomic_cas_64_ni,_atomic_cas_64) ALIAS(__sync_val_compare_and_swap_8,_atomic_cas_64) +#endif ALIAS(membar_consumer,_membar_consumer) ALIAS(membar_producer,_membar_producer)