genericopenlibs/cppstdlib/stl/src/sparc_atomic.s
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 13 Oct 2010 16:27:53 +0300
branchRCL_3
changeset 75 254b651f304e
parent 0 e4d67989cc36
permissions -rw-r--r--
Revision: 201039 Kit: 201041

        .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:
0:
          ld      [%o0], %o2              ! Set the current value
          mov     %o1, %o3                ! Set the new value
!          swap     [%o0], %o3             ! Do the compare and swap
          cas     [%o0], %o2, %o3
          cmp     %o2, %o3                ! Check whether successful
          bne     0b                      ! Retry upon failure
          stbar
          mov     %o2, %o0                ! Set the new value
          retl                            ! return
          nop
          .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:
1:
          ld      [%o0], %o2              ! set the current
          add             %o2, 0x1, %o3                   ! Increment and store current
!          swap     [%o0], %o3         ! Do the compare and swap
          cas     [%o0], %o2, %o3
          cmp     %o3, %o2                ! Check whether successful
          bne     1b                                         ! Retry if we failed.
          membar  #LoadLoad | #LoadStore  ! Ensure the cas finishes before
                                          ! returning
          nop
          retl                            ! return
          nop

          .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:
2:
          ld      [%o0], %o2              ! set the current
          sub     %o2, 0x1, %o3                   ! decrement and store current
!          swap    [%o0], %o3         ! Do the compare and swap
          cas     [%o0], %o2, %o3
          cmp     %o3, %o2                ! Check whether successful
          bne     2b                                         ! Retry if we failed.
          membar  #LoadLoad | #LoadStore  ! Ensure the cas finishes before
          nop
                                          ! returning
          retl                            ! return
          nop
          .size   _STLP_atomic_decrement,(.-_STLP_atomic_decrement)