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