--- /dev/null
+ .section ".text",#alloc,#execinstr
+ .align 8
+ .skip 16
+
+! int _STLP_atomic_exchange (void *pvalue, int value)
+!
+
+ .type _STLP_atomic_exchange,#function
+ .global _STLP_atomic_exchange
+ .align 8
+
+_STLP_atomic_exchange:
+1:
+ ldx [%o0], %o2 ! Set the current value
+ mov %o1, %o3 ! Set the new value
+ casx [%o0], %o2, %o3 ! Do the compare and swap
+ cmp %o2, %o3 ! Check whether successful
+ bne 1b ! Retry upon failure
+ membar #LoadLoad | #LoadStore ! Ensure the cas finishes before
+ ! returning
+ retl ! return
+ mov %o2, %o0 ! Set the new value
+ .size _STLP_atomic_exchange,(.-_STLP_atomic_exchange)
+
+
+! int _STLP_atomic_increment (void *pvalue)
+
+ .type _STLP_atomic_increment,#function
+ .global _STLP_atomic_increment
+ .align 8
+_STLP_atomic_increment:
+0:
+ ldx [%o0], %o2 ! set the current
+ addx %o2, 0x1, %o3 ! Increment and store current
+ casx [%o0], %o2, %o3 ! Do the compare and swap
+ cmp %o3, %o2 ! Check whether successful
+ bne 0b
+ membar #LoadLoad | #LoadStore ! Ensure the cas finishes before
+ ! returning
+ retl ! return
+ mov %o1, %o0 ! Set the return value
+
+ .size _STLP_atomic_increment,(.-_STLP_atomic_increment)
+
+
+! /* int _STLP_atomic_decrement (void *pvalue) */
+ .type _STLP_atomic_decrement,#function
+ .global _STLP_atomic_decrement
+ .align 8
+
+_STLP_atomic_decrement:
+0:
+ ldx [%o0], %o2 ! set the current
+ subx %o2, 0x1, %o3 ! decrement and store current
+ casx [%o0], %o2, %o3 ! Do the compare and swap
+ cmp %o3, %o2 ! Check whether successful
+ bne 0b
+ membar #LoadLoad | #LoadStore ! Ensure the cas finishes before
+ ! returning
+ retl ! return
+ nop
+ .size _STLP_atomic_decrement,(.-_STLP_atomic_decrement)
+
+
+