Move SH code out of nptl/ subdirectory.
[glibc.git] / sysdeps / unix / sysv / linux / sh / pthread_rwlock_wrlock.S
blob8802fa93837ec6bf7ef08153677bf3cc6d3e6705
1 /* Copyright (C) 2003-2014 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <http://www.gnu.org/licenses/>.  */
18 #include <sysdep.h>
19 #include <lowlevellock.h>
20 #include <lowlevelrwlock.h>
21 #include <pthread-errnos.h>
22 #include <tcb-offsets.h>
23 #include <kernel-features.h>
24 #include "lowlevel-atomic.h"
27         .text
29         .globl  __pthread_rwlock_wrlock
30         .type   __pthread_rwlock_wrlock,@function
31         .align  5
32         cfi_startproc
33 __pthread_rwlock_wrlock:
34         mov.l   r12, @-r15
35         cfi_adjust_cfa_offset (4)
36         cfi_rel_offset (r12, 0)
37         mov.l   r9, @-r15
38         cfi_adjust_cfa_offset (4)
39         cfi_rel_offset (r9, 0)
40         mov.l   r8, @-r15
41         cfi_adjust_cfa_offset (4)
42         cfi_rel_offset (r8, 0)
43         sts.l   pr, @-r15
44         cfi_adjust_cfa_offset (4)
45         cfi_rel_offset (pr, 0)
46         mov     r4, r8
48         /* Get the lock.  */
49         mov     #0, r3
50         mov     #1, r4
51 #if MUTEX == 0
52         CMPXCHG (r3, @r8, r4, r2)
53 #else
54         CMPXCHG (r3, @(MUTEX,r8), r4, r2)
55 #endif
56         bf      1f
58         mov.l   @(WRITER,r8), r0
59         tst     r0, r0
60         bf      14f
61         mov.l   @(NR_READERS,r8), r0
62         tst     r0, r0
63         bt      5f
65         mov.l   @(WRITERS_QUEUED,r8), r0
66         add     #1, r0
67         mov.l   r0, @(WRITERS_QUEUED,r8)
68         tst     r0, r0
69         bt      4f
71         mov.l   @(WRITERS_WAKEUP,r8), r9
73 #if MUTEX == 0
74         DEC (@r8, r2)
75 #else
76         DEC (@(MUTEX,r8), r2)
77 #endif
78         tst     r2, r2
79         bf      10f
80 11:
81         mov     r8, r4
82         add     #WRITERS_WAKEUP, r4
83 #ifdef __ASSUME_PRIVATE_FUTEX
84         mov     #PSHARED, r0
85         mov.b   @(r0,r8), r5
86         mov     #(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r0
87         xor     r0, r5
88         extu.b  r5, r5
89 #else
90         mov     #PSHARED, r0
91         mov.b   @(r0,r8), r5
92         extu.b  r5, r5
93 # if FUTEX_WAIT != 0
94         mov     #FUTEX_WAIT, r0
95         or      r0, r5
96 # endif
97         stc     gbr, r1
98         mov.w   .Lpfoff, r2
99         add     r2, r1
100         mov.l   @r1, r0
101         xor     r0, r5
102 #endif
103         mov     r9, r6
104         mov     #0, r7
105         mov     #SYS_futex, r3
106         extu.b  r3, r3
107         trapa   #0x14
108         SYSCALL_INST_PAD
110         /* Reget the lock.  */
111         mov     #0, r3
112         mov     #1, r4
113 #if MUTEX == 0
114         CMPXCHG (r3, @r8, r4, r2)
115 #else
116         CMPXCHG (r3, @(MUTEX,r8), r4, r2)
117 #endif
118         bf      12f
120         mov.l   @(WRITERS_QUEUED,r8), r0
121         add     #-1, r0
122         bra     2b
123          mov.l  r0, @(WRITERS_QUEUED,r8)
126         mov     #0, r3
127         stc     gbr, r0
128         mov.w   .Ltidoff, r1
129         mov.l   @(r0,r1), r0
130         mov.l   r0, @(WRITER,r8)
132 #if MUTEX == 0
133         DEC (@r8, r2)
134 #else
135         DEC (@(MUTEX,r8), r2)
136 #endif
137         tst     r2, r2
138         bf      6f
140         cfi_remember_state
141         lds.l   @r15+, pr
142         cfi_adjust_cfa_offset (-4)
143         cfi_restore (pr)
144         mov.l   @r15+, r8
145         cfi_adjust_cfa_offset (-4)
146         cfi_restore (r8)
147         mov.l   @r15+, r9
148         cfi_adjust_cfa_offset (-4)
149         cfi_restore (r9)
150         mov.l   @r15+, r12
151         cfi_adjust_cfa_offset (-4)
152         cfi_restore (r12)
153         rts
154          mov    r3, r0
155         cfi_restore_state
158         mov     r8, r5
159 #if MUTEX != 0
160         add     #MUTEX, r5
161 #endif
162         mov     #PSHARED, r0
163         mov.b   @(r0,r8), r6
164         extu.b  r6, r6
165         mov.l   .Lwait4, r1
166         bsrf    r1
167          mov    r2, r4
168 .Lwait4b:
169         bra     2b
170          nop
172         stc     gbr, r1
173         mov.w   .Ltidoff, r2
174         add     r2, r1
175         mov.l   @r1, r1
176         cmp/eq  r1, r0
177         bf      3b
178         bra     9b
179          mov    #EDEADLK, r3
181         mov     r8, r4
182 #if MUTEX != 0
183         add     #MUTEX, r4
184 #endif
185         mov     #PSHARED, r0
186         mov.b   @(r0,r8), r5
187         extu.b  r5, r5
188         mov.l   .Lwake4, r1
189         bsrf    r1
190          nop
191 .Lwake4b:
192         bra     7b
193          mov    #0, r3
195 #ifndef __ASSUME_PRIVATE_FUTEX
196 .Lpfoff:
197         .word   PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
198 #endif
199 .Ltidoff:
200         .word   TID - TLS_PRE_TCB_SIZE
203         mov.l   @(WRITERS_QUEUED,r8), r1
204         add     #-1, r1
205         mov.l   r1, @(WRITERS_QUEUED,r8)
206         bra     9b
207          mov    #EAGAIN, r3
210         mov     r8, r4
211 #if MUTEX != 0
212         add     #MUTEX, r4
213 #endif
214         mov     #PSHARED, r0
215         mov.b   @(r0,r8), r5
216         extu.b  r5, r5
217         mov.l   .Lwake5, r1
218         bsrf    r1
219          nop
220 .Lwake5b:
221         bra     11b
222          nop
225         mov     r8, r5
226 #if MUTEX != 0
227         add     #MUTEX, r5
228 #endif
229         mov     #PSHARED, r0
230         mov.b   @(r0,r8), r6
231         extu.b  r6, r6
232         mov.l   .Lwait5, r1
233         bsrf    r1
234          mov    r2, r4
235 .Lwait5b:
236         bra     13b
237          nop
239         cfi_endproc
241         .align  2
242 .Lwait4:
243         .long   __lll_lock_wait-.Lwait4b
244 .Lwake4:
245         .long   __lll_unlock_wake-.Lwake4b
246 .Lwait5:
247         .long   __lll_lock_wait-.Lwait5b
248 .Lwake5:
249         .long   __lll_unlock_wake-.Lwake5b
251 strong_alias (__pthread_rwlock_wrlock, pthread_rwlock_wrlock)
252 hidden_def (__pthread_rwlock_wrlock)