(pthread_barrier_wait): Don't save, load, and restore %esi for last thread.
[kopensolaris-gnu/glibc.git] / nptl / sysdeps / unix / sysv / linux / sh / sem_trywait.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_trywait
38         .type   __new_sem_trywait,@function
39         .align  5
40 __new_sem_trywait:
41         mov.l   r12, @-r15
42         mov.l   r8, @-r15
43         sts.l   pr, @-r15
44         mov     r4, r8
45         mov.l   @r8, r0
46 2:
47         tst     r0, r0
48         bt      1f
49
50         mov     r0, r3
51         mov     r0, r4
52         add     #-1, r3
53         CMPXCHG (r4, @r8, r3, r2)
54         bf/s    2b
55          mov    r2, r0
56
57         lds.l   @r15+, pr
58         mov.l   @r15+, r8
59         mov.l   @r15+, r12
60         rts
61          mov    #0, r0
62
63 1:
64         mov     #EAGAIN, r8
65         mova    .Lgot1, r0
66         mov.l   .Lgot1, r12
67         add     r0, r12
68
69 #if USE___THREAD
70         mov.l   .Lerrno1, r0
71         stc     gbr, r1
72         mov.l   @(r0, r12), r0
73         add     r1, r0
74         mov.l   r8, @r0
75 #else
76         mov.l   .Lerrloc1, r1
77         bsrf    r1
78          nop
79 .Lerrloc1b:
80         mov.l   r8, @r0
81 #endif
82         lds.l   @r15+, pr
83         mov.l   @r15+, r8
84         mov.l   @r15+, r12
85         rts
86          mov    #-1, r0
87
88         .align  2
89 .Lgot1:
90         .long   _GLOBAL_OFFSET_TABLE_
91 #if USE___THREAD
92 .Lerrno1:
93         .long   errno@GOTTPOFF
94 #else
95 .Lerrloc1:
96         .long   __errno_location@PLT-(.Lerrloc1b+2-.)
97 #endif
98         .size   __new_sem_trywait,.-__new_sem_trywait
99         .symver __new_sem_trywait, sem_trywait@@GLIBC_2.2