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:
150:
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:
341:
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:
562:
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