2.9
[glibc/nacl-glibc.git] / nptl / sysdeps / unix / sysv / linux / sh / sem_trywait.S
blob835e37db9f36ab5e0c4695d4c12b2d38bd1e8274
1 /* Copyright (C) 2003, 2004, 2007 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, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 USA.  */
19 #include <sysdep.h>
20 #include <shlib-compat.h>
21 #include <pthread-errnos.h>
22 #include <lowlevellock.h>
23 #include "lowlevel-atomic.h"
26         .text
28         .globl  __new_sem_trywait
29         .type   __new_sem_trywait,@function
30         .align  5
31 __new_sem_trywait:
32         mov.l   r12, @-r15
33         mov.l   r8, @-r15
34         sts.l   pr, @-r15
35         mov     r4, r8
36         mov.l   @r8, r0
38         tst     r0, r0
39         bt      1f
41         mov     r0, r3
42         mov     r0, r4
43         add     #-1, r3
44         CMPXCHG (r4, @r8, r3, r2)
45         bf/s    2b
46          mov    r2, r0
48         lds.l   @r15+, pr
49         mov.l   @r15+, r8
50         mov.l   @r15+, r12
51         rts
52          mov    #0, r0
55         mov     #EAGAIN, r8
56         mova    .Lgot1, r0
57         mov.l   .Lgot1, r12
58         add     r0, r12
60 #if USE___THREAD
61         mov.l   .Lerrno1, r0
62         stc     gbr, r1
63         mov.l   @(r0, r12), r0
64         bra     .Lexit
65          add    r1, r0
66         .align  2
67 .Lerrno1:
68         .long   errno@GOTTPOFF
69 .Lexit:
70 #else
71         mov.l   .Lerrloc1, r1
72         bsrf    r1
73          nop
74 .Lerrloc1b:
75 #endif
76         mov.l   r8, @r0
77         lds.l   @r15+, pr
78         mov.l   @r15+, r8
79         mov.l   @r15+, r12
80         rts
81          mov    #-1, r0
83         .align  2
84 .Lgot1:
85         .long   _GLOBAL_OFFSET_TABLE_
86 #if !USE___THREAD
87 .Lerrloc1:
88         .long   __errno_location@PLT-(.Lerrloc1b-.)
89 #endif
90         .size   __new_sem_trywait,.-__new_sem_trywait
91         versioned_symbol(libpthread, __new_sem_trywait, sem_trywait, GLIBC_2_1)