diff options
author | pjd <pjd@FreeBSD.org> | 2007-06-08 12:26:30 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2007-06-08 12:26:30 +0000 |
commit | f25cc1ca4c9929dff27e1d0db4c78685b01657c9 (patch) | |
tree | c8531b7ae44c3ab563dfe8884e5ab76b841c6341 /sys/cddl | |
parent | 2e820ecea1f23a01a478cfd63092b1bf76e57b9c (diff) | |
download | FreeBSD-src-f25cc1ca4c9929dff27e1d0db4c78685b01657c9.zip FreeBSD-src-f25cc1ca4c9929dff27e1d0db4c78685b01657c9.tar.gz |
Missing atomic operations for ZFS/ia64.
Submitted by: marcel
Diffstat (limited to 'sys/cddl')
-rw-r--r-- | sys/cddl/contrib/opensolaris/common/atomic/ia64/atomic.S | 54 |
1 files changed, 54 insertions, 0 deletions
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 <machine/asm.h> + + .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) |