summaryrefslogtreecommitdiff
path: root/atomic
diff options
context:
space:
mode:
authorianh <ianh@13f79535-47bb-0310-9956-ffa450edef68>2002-02-19 23:45:06 +0000
committerianh <ianh@13f79535-47bb-0310-9956-ffa450edef68>2002-02-19 23:45:06 +0000
commit70212b146b2823174a0b801096c81b05453aeafb (patch)
tree07281204823fc7fa3c129867165cb2af262efabd /atomic
parent6e81a9cc203db8d97fdccc356c8840c764356976 (diff)
downloadlibapr-70212b146b2823174a0b801096c81b05453aeafb.tar.gz
enable sun-sparc specific code
git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@63028 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'atomic')
-rw-r--r--atomic/solaris_sparc/apr_atomic_sparc.s37
1 files changed, 30 insertions, 7 deletions
diff --git a/atomic/solaris_sparc/apr_atomic_sparc.s b/atomic/solaris_sparc/apr_atomic_sparc.s
index f17cb2bbe..95f438d81 100644
--- a/atomic/solaris_sparc/apr_atomic_sparc.s
+++ b/atomic/solaris_sparc/apr_atomic_sparc.s
@@ -71,19 +71,20 @@
!
ENTRY(apr_atomic_add_sparc)
- ld [%o0], %o2
+ ld [%o0], %o2 ! set o2 to current value
_apr_atomic_add_sparc_loop:
- add %o2, %o1, %o3
- cas [%o0], %o2, %o3
- cmp %o2, %o3
- bne,a _apr_atomic_add_sparc_loop
- ld [%o0], %o2
+ add %o2, %o1, %o3 ! o3 = o2 + o1
+ cas [%o0], %o2, %o3 ! if cur-val==o2 then cur-val=03
+ cmp %o2, %o3 ! see if the CAS worked
+ bne,a _apr_atomic_add_sparc_loop ! if not try again
+ ld [%o0], %o2 ! return the previous value
retl
mov %o3, %o0
SET_SIZE(apr_atomic_add_sparc)
!
!
+!
ENTRY(apr_atomic_sub_sparc)
ld [%o0], %o2
@@ -96,5 +97,27 @@ _apr_atomic_sub_sparc_loop:
retl
mov %o3, %o0
- SET_SIZE(apr_atomic_sub_sparc)
+ SET_SIZE(apr_atomic_sub_sparc)
+!
+!
+!
+! %o0 [input] - the address of the value to compare
+! %o1 [input] - the new value
+! %o2 [input] - value to compare against
+! %o0 [output] - the return value
+!
+ ENTRY(apr_atomic_cas_sparc)
+ ENTRY(apr_atomic_casptr_sparc)
+
+ cas [%o0], %o2, %o1
+ cmp %o1, %o2 ! if o1 == o2 values weren't swapped
+ bne,a _apr_atomic_cas_ne
+ mov %o2, %o0
+ retl
+ mov %o2, %o0
+_apr_atomic_cas_ne:
+ retl
+ mov %o1, %o0
+
+ SET_SIZE(apr_atomic_cas_sparc)