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)