147 |
147 |
148 return result; |
148 return result; |
149 } |
149 } |
150 |
150 |
151 |
151 |
152 inline void Atomic::inc (volatile jint* dest) { |
|
153 |
|
154 unsigned int temp; |
|
155 |
|
156 __asm__ __volatile__ ( |
|
157 strasm_nobarrier |
|
158 "1: lwarx %0, 0, %2 \n" |
|
159 " addic %0, %0, 1 \n" |
|
160 " stwcx. %0, 0, %2 \n" |
|
161 " bne- 1b \n" |
|
162 strasm_nobarrier |
|
163 : /*%0*/"=&r" (temp), "=m" (*dest) |
|
164 : /*%2*/"r" (dest), "m" (*dest) |
|
165 : "cc" strasm_nobarrier_clobber_memory); |
|
166 |
|
167 } |
|
168 |
|
169 inline void Atomic::inc_ptr(volatile intptr_t* dest) { |
|
170 |
|
171 long temp; |
|
172 |
|
173 __asm__ __volatile__ ( |
|
174 strasm_nobarrier |
|
175 "1: ldarx %0, 0, %2 \n" |
|
176 " addic %0, %0, 1 \n" |
|
177 " stdcx. %0, 0, %2 \n" |
|
178 " bne- 1b \n" |
|
179 strasm_nobarrier |
|
180 : /*%0*/"=&r" (temp), "=m" (*dest) |
|
181 : /*%2*/"r" (dest), "m" (*dest) |
|
182 : "cc" strasm_nobarrier_clobber_memory); |
|
183 |
|
184 } |
|
185 |
|
186 inline void Atomic::inc_ptr(volatile void* dest) { |
|
187 inc_ptr((volatile intptr_t*)dest); |
|
188 } |
|
189 |
|
190 |
|
191 inline void Atomic::dec (volatile jint* dest) { |
|
192 |
|
193 unsigned int temp; |
|
194 |
|
195 __asm__ __volatile__ ( |
|
196 strasm_nobarrier |
|
197 "1: lwarx %0, 0, %2 \n" |
|
198 " addic %0, %0, -1 \n" |
|
199 " stwcx. %0, 0, %2 \n" |
|
200 " bne- 1b \n" |
|
201 strasm_nobarrier |
|
202 : /*%0*/"=&r" (temp), "=m" (*dest) |
|
203 : /*%2*/"r" (dest), "m" (*dest) |
|
204 : "cc" strasm_nobarrier_clobber_memory); |
|
205 |
|
206 } |
|
207 |
|
208 inline void Atomic::dec_ptr(volatile intptr_t* dest) { |
|
209 |
|
210 long temp; |
|
211 |
|
212 __asm__ __volatile__ ( |
|
213 strasm_nobarrier |
|
214 "1: ldarx %0, 0, %2 \n" |
|
215 " addic %0, %0, -1 \n" |
|
216 " stdcx. %0, 0, %2 \n" |
|
217 " bne- 1b \n" |
|
218 strasm_nobarrier |
|
219 : /*%0*/"=&r" (temp), "=m" (*dest) |
|
220 : /*%2*/"r" (dest), "m" (*dest) |
|
221 : "cc" strasm_nobarrier_clobber_memory); |
|
222 |
|
223 } |
|
224 |
|
225 inline void Atomic::dec_ptr(volatile void* dest) { |
|
226 dec_ptr((volatile intptr_t*)dest); |
|
227 } |
|
228 |
|
229 inline jint Atomic::xchg(jint exchange_value, volatile jint* dest) { |
152 inline jint Atomic::xchg(jint exchange_value, volatile jint* dest) { |
230 |
153 |
231 // Note that xchg_ptr doesn't necessarily do an acquire |
154 // Note that xchg_ptr doesn't necessarily do an acquire |
232 // (see synchronizer.cpp). |
155 // (see synchronizer.cpp). |
233 |
156 |