Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nginx/nginx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2007-01-11 19:07:38 +0300
committerIgor Sysoev <igor@sysoev.ru>2007-01-11 19:07:38 +0300
commit43bb0077d134f95b3d27e008e238664649745b30 (patch)
tree2c6f803619f0ba89bc25ad9db23983856f9cbb01 /src/os/unix/ngx_gcc_atomic_amd64.h
parent896b5e4a4f0e6194e3fd5c7b9896932da16f0801 (diff)
optimization
Diffstat (limited to 'src/os/unix/ngx_gcc_atomic_amd64.h')
-rw-r--r--src/os/unix/ngx_gcc_atomic_amd64.h12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/os/unix/ngx_gcc_atomic_amd64.h b/src/os/unix/ngx_gcc_atomic_amd64.h
index faaf7afe8..1008a6017 100644
--- a/src/os/unix/ngx_gcc_atomic_amd64.h
+++ b/src/os/unix/ngx_gcc_atomic_amd64.h
@@ -24,8 +24,11 @@
*
*
* The "r" is any register, %rax (%r0) - %r16.
- * The "=a" and "a" are the %rax register. Although we can return result
- * in any register, we use %rax because it is used in cmpxchgq anyway.
+ * The "=a" and "a" are the %rax register.
+ * Although we can return result in any register, we use "a" because it is
+ * used in cmpxchgq anyway. The result is actually in %al but not in $rax,
+ * however as the code is inlined gcc can test %al as well as %rax.
+ *
* The "cc" means that flags were changed.
*/
@@ -33,14 +36,13 @@ static ngx_inline ngx_atomic_uint_t
ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,
ngx_atomic_uint_t set)
{
- ngx_atomic_uint_t res;
+ u_char res;
__asm__ volatile (
NGX_SMP_LOCK
" cmpxchgq %3, %1; "
- " setz %b0; "
- " movzbq %b0, %0; "
+ " sete %0; "
: "=a" (res) : "m" (*lock), "a" (old), "r" (set) : "cc", "memory");