1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott .section ".text",#alloc,#execinstr 2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott .align 8 3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott .skip 16 4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott /* 7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ** int _STLP_atomic_exchange (void *pvalue, int value) 8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */ 9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott .type _STLP_atomic_exchange,#function 11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott .global _STLP_atomic_exchange 12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott .align 8 13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_atomic_exchange: 15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott0: 16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ld [%o0], %o2 ! Set the current value 17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott mov %o1, %o3 ! Set the new value 18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott! swap [%o0], %o3 ! Do the compare and swap 19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott cas [%o0], %o2, %o3 20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott cmp %o2, %o3 ! Check whether successful 21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott bne 0b ! Retry upon failure 22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott stbar 23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott mov %o2, %o0 ! Set the new value 24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott retl ! return 25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott nop 26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott .size _STLP_atomic_exchange,(.-_STLP_atomic_exchange) 27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott /* int _STLP_atomic_increment (void *pvalue) */ 29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott .type _STLP_atomic_increment,#function 31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott .global _STLP_atomic_increment 32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott .align 8 33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_atomic_increment: 34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott1: 35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ld [%o0], %o2 ! set the current 36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott add %o2, 0x1, %o3 ! Increment and store current 37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott! swap [%o0], %o3 ! Do the compare and swap 38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott cas [%o0], %o2, %o3 39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott cmp %o3, %o2 ! Check whether successful 40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott bne 1b ! Retry if we failed. 41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott membar #LoadLoad | #LoadStore ! Ensure the cas finishes before 42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ! returning 43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott nop 44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott retl ! return 45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott nop 46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott .size _STLP_atomic_increment,(.-_STLP_atomic_increment) 48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott /* int _STLP_atomic_decrement (void *pvalue) */ 51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott .type _STLP_atomic_decrement,#function 52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott .global _STLP_atomic_decrement 53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott .align 8 54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_atomic_decrement: 56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott2: 57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ld [%o0], %o2 ! set the current 58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott sub %o2, 0x1, %o3 ! decrement and store current 59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott! swap [%o0], %o3 ! Do the compare and swap 60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott cas [%o0], %o2, %o3 61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott cmp %o3, %o2 ! Check whether successful 62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott bne 2b ! Retry if we failed. 63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott membar #LoadLoad | #LoadStore ! Ensure the cas finishes before 64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott nop 65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ! returning 66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott retl ! return 67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott nop 68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott .size _STLP_atomic_decrement,(.-_STLP_atomic_decrement) 69