summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/cddl/contrib/opensolaris/common/atomic/ia64/atomic.S54
-rw-r--r--sys/contrib/opensolaris/common/atomic/ia64/atomic.S54
2 files changed, 108 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)
diff --git a/sys/contrib/opensolaris/common/atomic/ia64/atomic.S b/sys/contrib/opensolaris/common/atomic/ia64/atomic.S
new file mode 100644
index 0000000..827232b
--- /dev/null
+++ b/sys/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)
OpenPOWER on IntegriCloud