comparison src/os/unix/ngx_gcc_atomic_amd64.h @ 110:dad2fe8ecf08 NGINX_0_3_2

nginx 0.3.2 *) Feature: the Sun Studio 10 C compiler support. *) Feature: the "proxy_upstream_max_fails", "proxy_upstream_fail_timeout", "fastcgi_upstream_max_fails", and "fastcgi_upstream_fail_timeout" directives.
author Igor Sysoev <http://sysoev.ru>
date Wed, 12 Oct 2005 00:00:00 +0400
parents
children 408f195b3482
comparison
equal deleted inserted replaced
109:97da525033a1 110:dad2fe8ecf08
1
2 /*
3 * Copyright (C) Igor Sysoev
4 */
5
6
7 #if (NGX_SMP)
8 #define NGX_SMP_LOCK "lock;"
9 #else
10 #define NGX_SMP_LOCK
11 #endif
12
13
14 /*
15 * "cmpxchgq r, [m]":
16 *
17 * if (rax == [m]) {
18 * zf = 1;
19 * [m] = r;
20 * } else {
21 * zf = 0;
22 * rax = [m];
23 * }
24 *
25 *
26 * The "r" is any register, %rax (%r0) - %r16.
27 * The "=a" and "a" are the %rax register. Although we can return result
28 * in any register, we use %rax because it is used in cmpxchgq anyway.
29 * The "cc" means that flags were changed.
30 */
31
32 static ngx_inline ngx_atomic_uint_t
33 ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,
34 ngx_atomic_uint_t set)
35 {
36 ngx_atomic_uint_t res;
37
38 __asm__ volatile (
39
40 NGX_SMP_LOCK
41 " cmpxchgq %3, %1; "
42 " setz %b0; "
43 " movzbq %b0, %0; "
44
45 : "=a" (res) : "m" (*lock), "a" (old), "r" (set) : "cc", "memory");
46
47 return res;
48 }
49
50
51 /*
52 * "xaddq r, [m]":
53 *
54 * temp = [m];
55 * [m] += r;
56 * r = temp;
57 *
58 *
59 * The "+r" is any register, %rax (%r0) - %r16.
60 * The "cc" means that flags were changed.
61 */
62
63 static ngx_inline ngx_atomic_int_t
64 ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)
65 {
66 __asm__ volatile (
67
68 NGX_SMP_LOCK
69 " xaddq %0, %1; "
70
71 : "+q" (add) : "m" (*value) : "cc", "memory");
72
73 return add;
74 }