200 // 201 // Arguments: 202 // add_value: O0 (e.g., +1 or -1) 203 // dest: O1 204 // 205 // Results: 206 // O0: the new value stored in dest 207 // 208 // Overwrites O3 209 210 .inline _Atomic_add64, 2 211 .volatile 212 3: 213 ldx [%o1], %o2 214 add %o0, %o2, %o3 215 casx [%o1], %o2, %o3 216 cmp %o2, %o3 217 bne %xcc, 3b 218 nop 219 add %o0, %o2, %o0 220 .nonvolatile 221 .end 222 223 224 // Support for void OrderAccess::acquire() 225 // The method is intentionally empty. 226 // It exists for the sole purpose of generating 227 // a C/C++ sequence point over which the compiler won't 228 // reorder code. 229 230 .inline _OrderAccess_acquire,0 231 .volatile 232 .nonvolatile 233 .end 234 235 236 // Support for void OrderAccess::fence() 237 238 .inline _OrderAccess_fence,0 239 .volatile 240 membar #StoreLoad 241 .nonvolatile 242 .end 243 244 245 // Support for void Prefetch::read(void *loc, intx interval) 246 // 247 // Prefetch for several reads. 248 249 .inline _Prefetch_read, 2 250 .volatile 251 prefetch [%o0+%o1], 0 252 .nonvolatile 253 .end 254 255 256 // Support for void Prefetch::write(void *loc, intx interval) 257 // 258 // Prefetch for several writes. 259 260 .inline _Prefetch_write, 2 | 200 // 201 // Arguments: 202 // add_value: O0 (e.g., +1 or -1) 203 // dest: O1 204 // 205 // Results: 206 // O0: the new value stored in dest 207 // 208 // Overwrites O3 209 210 .inline _Atomic_add64, 2 211 .volatile 212 3: 213 ldx [%o1], %o2 214 add %o0, %o2, %o3 215 casx [%o1], %o2, %o3 216 cmp %o2, %o3 217 bne %xcc, 3b 218 nop 219 add %o0, %o2, %o0 220 .nonvolatile 221 .end 222 223 224 // Support for void Prefetch::read(void *loc, intx interval) 225 // 226 // Prefetch for several reads. 227 228 .inline _Prefetch_read, 2 229 .volatile 230 prefetch [%o0+%o1], 0 231 .nonvolatile 232 .end 233 234 235 // Support for void Prefetch::write(void *loc, intx interval) 236 // 237 // Prefetch for several writes. 238 239 .inline _Prefetch_write, 2 |