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