(pthread_barrier_wait): Don't save, load, and restore %esi for last thread.
[kopensolaris-gnu/glibc.git] / nptl / sysdeps / unix / sysv / linux / sh / libc-lowlevellock.S
1 /* Copyright (C) 2003 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
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.
8
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.
13
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 USA.  */
18
19 #include <sysdep.h>
20 #include <tls.h>
21 #include "lowlevel-atomic.h"
22
23         .text
24
25 #define SYS_gettimeofday        __NR_gettimeofday
26 #define SYS_futex               240
27 #define FUTEX_WAIT              0
28 #define FUTEX_WAKE              1
29
30 #define ETIMEDOUT               110
31
32
33         .globl  __lll_lock_wait
34         .type   __lll_lock_wait,@function
35         .hidden __lll_lock_wait
36         .align  5
37 __lll_lock_wait:
38         mov     r4, r6
39         mov     r5, r4
40         mov     #0, r7          /* No timeout.  */
41         mov     #FUTEX_WAIT, r5
42 2:
43         add     #-1, r6         /* account for the preceeded xadd.  */
44         mov     #SYS_futex, r3
45         extu.b  r3, r3
46         trapa   #0x14
47         SYSCALL_INST_PAD
48
49         mov     #-1, r3
50         XADD (r3, @r4, r2)
51         tst     r3, r3
52         bf/s    2b
53          mov    r2, r6
54
55         mov     #-1, r1
56         mov.l   r1, @r4
57         rts
58          mov    r2, r0
59         .size   __lll_lock_wait,.-__lll_lock_wait
60
61
62         .type   lll_unlock_wake_cb,@function
63         .align  5
64 lll_unlock_wake_cb:
65
66         .align  2
67         mova    1f, r0
68         mov     r15, r1
69         mov     #-6, r15
70 0:
71         mov.l   @r4, r2
72         add     #1, r2
73         mov.l   r2, @r4
74 1:
75         mov     r1, r15
76         cmp/pl  r2
77         bf      2f
78         rts
79          nop
80         .size   lll_unlock_wake_cb,.-lll_unlock_wake_cb
81
82
83         .globl  __lll_unlock_wake
84         .type   __lll_unlock_wake,@function
85         .hidden __lll_unlock_wake
86 __lll_unlock_wake:
87 2:
88         mov     #FUTEX_WAKE, r5
89         mov     #1, r6          /* Wake one thread.  */
90         mov     #0, r7
91         mov.l   r6, @r4         /* Stores 1.  */
92         mov     #SYS_futex, r3
93         extu.b  r3, r3
94         trapa   #0x14
95         SYSCALL_INST_PAD
96         rts
97          nop
98         .size   __lll_unlock_wake,.-__lll_unlock_wake
99
100
101         .globl  __lll_wait_tid
102         .type   __lll_wait_tid,@function
103         .hidden __lll_wait_tid
104 __lll_wait_tid:
105         mov.l   @r4, r6
106 1:
107         mov     #FUTEX_WAIT, r5
108         mov     #0, r7
109         mov     #SYS_futex, r3
110         extu.b  r3, r3
111         trapa   #0x14
112         SYSCALL_INST_PAD
113
114         mov     r0, r1
115
116         mov.l   @r4, r0
117         tst     r0, r0
118         bf/s    1b
119          mov    r0, r6
120         rts
121          nop
122         .size   __lll_wait_tid,.-__lll_wait_tid
123
124         
125         .globl  __lll_timedwait_tid
126         .type   __lll_timedwait_tid,@function
127         .hidden __lll_timedwait_tid
128 __lll_timedwait_tid:
129         mov.l   r9, @-r15
130         mov.l   r8, @-r15
131         mov     r4, r8
132         mov     r5, r9
133         add     #-8, r15
134
135 2:
136         /* Get current time.  */
137         mov     r15, r4
138         mov     #0, r5
139         mov     #SYS_gettimeofday, r3
140         trapa   #0x12
141         SYSCALL_INST_PAD
142
143         /* Compute relative timeout.  */
144         mov.l   @(4,r15), r0
145         mov.w   .L1k, r1
146         dmulu.l r0, r1          /* Milli seconds to nano seconds.  */
147         mov.l   @r9, r2
148         mov.l   @(4,r9), r3
149         mov.l   @r15, r0
150         sts     macl, r1
151         sub     r0, r2
152         clrt
153         subc    r1, r3
154         bf      5f
155         mov.l   .L1g, r1
156         add     r1, r3
157         add     #-1, r2
158 5:
159         cmp/pz  r2
160         bf      6f              /* Time is already up.  */
161
162         mov.l   r2, @r15        /* Store relative timeout.  */
163         mov.l   r3, @(4,r15)
164
165         mov.l   @r8, r6
166         tst     r6, r6
167         bt      4f
168
169         mov     r8, r4
170         mov     #FUTEX_WAIT, r5
171         mov     r15, r7
172         mov     #SYS_futex, r3
173         extu.b  r3, r3
174         trapa   #0x14
175         SYSCALL_INST_PAD
176
177         mov     r0, r1
178
179         mov.l   @r8, r0
180         tst     r0, r0
181         bf      1f
182 4:
183         mov     #0, r0
184 3:
185         add     #8, r15
186         mov.l   @r15+, r8
187         rts
188          mov.l  @r15+, r9
189
190 1:
191         mov     #-ETIMEDOUT, r1
192         cmp/eq  r0, r1
193         bf      2b
194 6:
195         bra     3b
196          mov    #ETIMEDOUT, r0
197
198 .L1k:
199         .word   1000
200         .align  2
201 .L1g:
202         .long   1000000000
203
204         .size   __lll_timedwait_tid,.-__lll_timedwait_tid
205
206
207         .globl  __lll_wake_tid
208         .type   __lll_wake_tid,@function
209         .hidden __lll_wake_tid
210 __lll_wake_tid:
211         mov     #FUTEX_WAKE, r5
212         mov     #-1, r6
213         shlr    r6              /* r6 = 0x7fffffff */
214         mov     #0, r7
215         mov     #SYS_futex, r3
216         extu.b  r3, r3
217         trapa   #0x14
218         SYSCALL_INST_PAD
219         rts
220          nop
221         .size   __lll_wake_tid,.-__lll_wake_tid