opensolaris_atomic.S revision 170430
1#include <machine/asm.h> 2 3 .text 4 5/* 6 * uint64_t atomic_cas_64(volatile uint64_t *p, uint64_t cmp, uint64_t v) 7 */ 8ENTRY(atomic_cas_64, 3) 9 mov ar.ccv = r33 10 ;; 11 cmpxchg8.acq r8 = [r32], r34, ar.ccv 12 ;; 13 br.ret.sptk rp 14END(atomic_cas_64) 15 16/* 17 * uint64_t atomic_add_64_nv(volatile uint64_t *p, uint64_t v) 18 */ 19ENTRY(atomic_add_64_nv, 2) 201: 21 ld8 r16 = [r32] 22 ;; 23 mov ar.ccv = r16 24 add r8 = r16, r33 25 ;; 26 cmpxchg8.acq r17 = [r32], r8, ar.ccv 27 ;; 28 cmp.eq p6, p7 = r16, r17 29(p6) br.ret.sptk rp 30(p7) br.cond.spnt 1b 31END(atomic_add_64_nv) 32 33/* 34 * uint8_t atomic_or_8_nv(volatile uint8_t *p, uint8_t v) 35 */ 36ENTRY(atomic_or_8_nv, 2) 371: 38 ld8 r16 = [r32] 39 ;; 40 mov ar.ccv = r16 41 or r8 = r16, r33 42 ;; 43 cmpxchg1.acq r17 = [r32], r8, ar.ccv 44 ;; 45 cmp.eq p6, p7 = r16, r17 46(p6) br.ret.sptk rp 47(p7) br.cond.spnt 1b 48END(atomic_or_8_nv) 49 50ENTRY(membar_producer, 0) 51 mf.a 52 ;; 53 br.ret.sptk rp 54END(membar_producer) 55