Groonga 3.0.9 Source Code Document
Main Page
Related Pages
Namespaces
Data Structures
Files
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Pages
groonga
vendor
nginx-1.4.2
src
os
unix
ngx_gcc_atomic_ppc.h
Go to the documentation of this file.
1
2
/*
3
* Copyright (C) Igor Sysoev
4
* Copyright (C) Nginx, Inc.
5
*/
6
7
8
/*
9
* The ppc assembler treats ";" as comment, so we have to use "\n".
10
* The minus in "bne-" is a hint for the branch prediction unit that
11
* this branch is unlikely to be taken.
12
* The "1b" means the nearest backward label "1" and the "1f" means
13
* the nearest forward label "1".
14
*
15
* The "b" means that the base registers can be used only, i.e.
16
* any register except r0. The r0 register always has a zero value and
17
* could not be used in "addi r0, r0, 1".
18
* The "=&b" means that no input registers can be used.
19
*
20
* "sync" read and write barriers
21
* "isync" read barrier, is faster than "sync"
22
* "eieio" write barrier, is faster than "sync"
23
* "lwsync" write barrier, is faster than "eieio" on ppc64
24
*/
25
26
#if (NGX_PTR_SIZE == 8)
27
28
static
ngx_inline
ngx_atomic_uint_t
29
ngx_atomic_cmp_set(
ngx_atomic_t
*lock,
ngx_atomic_uint_t
old,
30
ngx_atomic_uint_t
set
)
31
{
32
ngx_atomic_uint_t
res, temp;
33
34
__asm__
volatile
(
35
36
" li %0, 0 \n"
/* preset "0" to "res" */
37
" lwsync \n"
/* write barrier */
38
"1: \n"
39
" ldarx %1, 0, %2 \n"
/* load from [lock] into "temp" */
40
/* and store reservation */
41
" cmpd %1, %3 \n"
/* compare "temp" and "old" */
42
" bne- 2f \n"
/* not equal */
43
" stdcx. %4, 0, %2 \n"
/* store "set" into [lock] if reservation */
44
/* is not cleared */
45
" bne- 1b \n"
/* the reservation was cleared */
46
" isync \n"
/* read barrier */
47
" li %0, 1 \n"
/* set "1" to "res" */
48
"2: \n"
49
50
:
"=&b"
(res),
"=&b"
(temp)
51
:
"b"
(lock),
"b"
(old),
"b"
(
set
)
52
:
"cc"
,
"memory"
);
53
54
return
res;
55
}
56
57
58
static
ngx_inline
ngx_atomic_int_t
59
ngx_atomic_fetch_add(
ngx_atomic_t
*value,
ngx_atomic_int_t
add)
60
{
61
ngx_atomic_uint_t
res, temp;
62
63
__asm__
volatile
(
64
65
" lwsync \n"
/* write barrier */
66
"1: ldarx %0, 0, %2 \n"
/* load from [value] into "res" */
67
/* and store reservation */
68
" add %1, %0, %3 \n"
/* "res" + "add" store in "temp" */
69
" stdcx. %1, 0, %2 \n"
/* store "temp" into [value] if reservation */
70
/* is not cleared */
71
" bne- 1b \n"
/* try again if reservation was cleared */
72
" isync \n"
/* read barrier */
73
74
:
"=&b"
(res),
"=&b"
(temp)
75
:
"b"
(value),
"b"
(add)
76
:
"cc"
,
"memory"
);
77
78
return
res;
79
}
80
81
82
#if (NGX_SMP)
83
#define ngx_memory_barrier() \
84
__asm__ volatile ("isync \n lwsync \n" ::: "memory")
85
#else
86
#define ngx_memory_barrier() __asm__ volatile ("" ::: "memory")
87
#endif
88
89
#else
90
91
static
ngx_inline
ngx_atomic_uint_t
92
ngx_atomic_cmp_set(
ngx_atomic_t
*lock,
ngx_atomic_uint_t
old,
93
ngx_atomic_uint_t
set
)
94
{
95
ngx_atomic_uint_t
res, temp;
96
97
__asm__
volatile
(
98
99
" li %0, 0 \n"
/* preset "0" to "res" */
100
" eieio \n"
/* write barrier */
101
"1: \n"
102
" lwarx %1, 0, %2 \n"
/* load from [lock] into "temp" */
103
/* and store reservation */
104
" cmpw %1, %3 \n"
/* compare "temp" and "old" */
105
" bne- 2f \n"
/* not equal */
106
" stwcx. %4, 0, %2 \n"
/* store "set" into [lock] if reservation */
107
/* is not cleared */
108
" bne- 1b \n"
/* the reservation was cleared */
109
" isync \n"
/* read barrier */
110
" li %0, 1 \n"
/* set "1" to "res" */
111
"2: \n"
112
113
:
"=&b"
(res),
"=&b"
(temp)
114
:
"b"
(lock),
"b"
(old),
"b"
(
set
)
115
:
"cc"
,
"memory"
);
116
117
return
res;
118
}
119
120
121
static
ngx_inline
ngx_atomic_int_t
122
ngx_atomic_fetch_add(
ngx_atomic_t
*value,
ngx_atomic_int_t
add)
123
{
124
ngx_atomic_uint_t
res, temp;
125
126
__asm__
volatile
(
127
128
" eieio \n"
/* write barrier */
129
"1: lwarx %0, 0, %2 \n"
/* load from [value] into "res" */
130
/* and store reservation */
131
" add %1, %0, %3 \n"
/* "res" + "add" store in "temp" */
132
" stwcx. %1, 0, %2 \n"
/* store "temp" into [value] if reservation */
133
/* is not cleared */
134
" bne- 1b \n"
/* try again if reservation was cleared */
135
" isync \n"
/* read barrier */
136
137
:
"=&b"
(res),
"=&b"
(temp)
138
:
"b"
(value),
"b"
(add)
139
:
"cc"
,
"memory"
);
140
141
return
res;
142
}
143
144
145
#if (NGX_SMP)
146
#define ngx_memory_barrier() \
147
__asm__ volatile ("isync \n eieio \n" ::: "memory")
148
#else
149
#define ngx_memory_barrier() __asm__ volatile ("" ::: "memory")
150
#endif
151
152
#endif
153
154
155
#define ngx_cpu_pause()
Generated on Sun Nov 10 2013 09:49:09 for Groonga 3.0.9 Source Code Document by
1.8.1.2