os/ossrv/genericopenlibs/cppstdlib/stl/src/sparc_atomic.s
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     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)