diff -r 000000000000 -r bde4ae8d615e os/ossrv/genericopenlibs/cppstdlib/stl/src/sparc_atomic64.s --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/ossrv/genericopenlibs/cppstdlib/stl/src/sparc_atomic64.s Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,65 @@ + .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) + + +