Annotation of embedaddon/nginx/src/os/unix/ngx_gcc_atomic_sparc64.h, revision 1.1.1.1
1.1 misho 1:
2: /*
3: * Copyright (C) Igor Sysoev
4: * Copyright (C) Nginx, Inc.
5: */
6:
7:
8: /*
9: * "casa [r1] 0x80, r2, r0" and
10: * "casxa [r1] 0x80, r2, r0" do the following:
11: *
12: * if ([r1] == r2) {
13: * swap(r0, [r1]);
14: * } else {
15: * r0 = [r1];
16: * }
17: *
18: * so "r0 == r2" means that the operation was successful.
19: *
20: *
21: * The "r" means the general register.
22: * The "+r" means the general register used for both input and output.
23: */
24:
25:
26: #if (NGX_PTR_SIZE == 4)
27: #define NGX_CASA "casa"
28: #else
29: #define NGX_CASA "casxa"
30: #endif
31:
32:
33: static ngx_inline ngx_atomic_uint_t
34: ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,
35: ngx_atomic_uint_t set)
36: {
37: __asm__ volatile (
38:
39: NGX_CASA " [%1] 0x80, %2, %0"
40:
41: : "+r" (set) : "r" (lock), "r" (old) : "memory");
42:
43: return (set == old);
44: }
45:
46:
47: static ngx_inline ngx_atomic_int_t
48: ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)
49: {
50: ngx_atomic_uint_t old, res;
51:
52: old = *value;
53:
54: for ( ;; ) {
55:
56: res = old + add;
57:
58: __asm__ volatile (
59:
60: NGX_CASA " [%1] 0x80, %2, %0"
61:
62: : "+r" (res) : "r" (value), "r" (old) : "memory");
63:
64: if (res == old) {
65: return res;
66: }
67:
68: old = res;
69: }
70: }
71:
72:
73: #if (NGX_SMP)
74: #define ngx_memory_barrier() \
75: __asm__ volatile ( \
76: "membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad" \
77: ::: "memory")
78: #else
79: #define ngx_memory_barrier() __asm__ volatile ("" ::: "memory")
80: #endif
81:
82: #define ngx_cpu_pause()
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>