From f25cc1ca4c9929dff27e1d0db4c78685b01657c9 Mon Sep 17 00:00:00 2001 From: pjd Date: Fri, 8 Jun 2007 12:26:30 +0000 Subject: Missing atomic operations for ZFS/ia64. Submitted by: marcel --- .../opensolaris/common/atomic/ia64/atomic.S | 54 ++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 sys/cddl/contrib/opensolaris/common/atomic/ia64/atomic.S (limited to 'sys/cddl') diff --git a/sys/cddl/contrib/opensolaris/common/atomic/ia64/atomic.S b/sys/cddl/contrib/opensolaris/common/atomic/ia64/atomic.S new file mode 100644 index 0000000..827232b --- /dev/null +++ b/sys/cddl/contrib/opensolaris/common/atomic/ia64/atomic.S @@ -0,0 +1,54 @@ +#include + + .text + +/* + * uint64_t atomic_cas_64(volatile uint64_t *p, uint64_t cmp, uint64_t v) + */ +ENTRY(atomic_cas_64, 3) + mov ar.ccv = r33 + ;; + cmpxchg8.acq r8 = [r32], r34, ar.ccv + ;; + br.ret.sptk rp +END(atomic_cas_64) + +/* + * uint64_t atomic_add_64_nv(volatile uint64_t *p, uint64_t v) + */ +ENTRY(atomic_add_64_nv, 2) +1: + ld8 r16 = [r32] + ;; + mov ar.ccv = r16 + add r8 = r16, r33 + ;; + cmpxchg8.acq r17 = [r32], r8, ar.ccv + ;; + cmp.eq p6, p7 = r16, r17 +(p6) br.ret.sptk rp +(p7) br.cond.spnt 1b +END(atomic_add_64_nv) + +/* + * uint8_t atomic_or_8_nv(volatile uint8_t *p, uint8_t v) + */ +ENTRY(atomic_or_8_nv, 2) +1: + ld8 r16 = [r32] + ;; + mov ar.ccv = r16 + or r8 = r16, r33 + ;; + cmpxchg1.acq r17 = [r32], r8, ar.ccv + ;; + cmp.eq p6, p7 = r16, r17 +(p6) br.ret.sptk rp +(p7) br.cond.spnt 1b +END(atomic_or_8_nv) + +ENTRY(membar_producer, 0) + mf.a + ;; + br.ret.sptk rp +END(membar_producer) -- cgit v1.1