home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / stlpt453.zip / STLport-4.5.3 / src / sparc_atomic.s < prev    next >
Text File  |  2001-11-10  |  3KB  |  69 lines

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