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