(pthread_barrier_wait): Don't save, load, and restore %esi for last thread.
[kopensolaris-gnu/glibc.git] / nptl / sysdeps / unix / sysv / linux / sh / sem_wait.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 <shlib-compat.h>
21 #include "lowlevel-atomic.h"
22
23
24 #define SYS_gettimeofday        __NR_gettimeofday
25 #define SYS_futex               240
26 #define FUTEX_WAIT              0
27 #define FUTEX_WAKE              1
28
29 #define EINTR                   4
30 #define EAGAIN                  11
31 #define EWOULDBLOCK             EAGAIN
32 #define EINVAL                  22
33 #define ETIMEDOUT               110
34
35         .text
36
37         .globl  __new_sem_wait
38         .type   __new_sem_wait,@function
39         .align  5
40 __new_sem_wait:
41         mov.l   r12, @-r15
42         mov.l   r8, @-r15
43         sts.l   pr, @-r15
44         mov     r4, r8
45 3:
46         mov.l   @r8, r0
47 2:
48         tst     r0, r0
49         bt      1f
50         mov     r0, r3
51         mov     r0, r4
52         add     #-1, r3
53         CMPXCHG (r4, @r8, r3, r2)
54         bf      2b
55         lds.l   @r15+, pr
56         mov.l   @r15+, r8
57         mov.l   @r15+, r12
58         rts
59          mov    #0, r0
60
61 1:
62         mov     r8, r4
63         mov     #FUTEX_WAIT, r5
64         mov     #0, r6
65         mov     #0, r7
66         mov     #SYS_futex, r3
67         extu.b  r3, r3
68         trapa   #0x14
69         SYSCALL_INST_PAD
70
71         tst     r0, r0
72         bt      3b
73         cmp/eq  #-EWOULDBLOCK, r0
74         bt      3b
75         neg     r0, r0
76
77         mov     r0, r8
78         mova    .Lgot0, r0
79         mov.l   .Lgot0, r12
80         add     r0, r12
81
82 #if USE___THREAD
83         mov.l   .Lerrno0, r0
84         stc     gbr, r1
85         mov.l   @(r0, r12), r0
86         add     r1, r0
87         mov.l   r8, @r0
88 #else
89         mov.l   .Lerrloc0, r1
90         bsrf    r1
91          nop
92 .Lerrloc0b:
93         mov.l   r8, @r0
94 #endif
95         lds.l   @r15+, pr
96         mov.l   @r15+, r8
97         mov.l   @r15+, r12
98         rts
99          mov    #-1, r0
100
101         .align  2
102 .Lgot0:
103         .long   _GLOBAL_OFFSET_TABLE_
104 #if USE___THREAD
105 .Lerrno0:
106         .long   errno@GOTTPOFF
107 #else
108 .Lerrloc0:
109         .long   __errno_location@PLT-(.Lerrloc0b+2-.)
110 #endif
111         .size   __new_sem_wait,.-__new_sem_wait
112         .symver __new_sem_wait, sem_wait@@GLIBC_2.2