Home | History | Annotate | Download | only in src
      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