Update copyright notices with scripts/update-copyrights
[jlayton/glibc.git] / nptl / sysdeps / unix / sysv / linux / sh / sem_post.S
1 /* Copyright (C) 2003-2014 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, see
16    <http://www.gnu.org/licenses/>.  */
17
18 #include <sysdep.h>
19 #include <shlib-compat.h>
20 #include <pthread-errnos.h>
21 #include <structsem.h>
22 #include <lowlevellock.h>
23 #include "lowlevel-atomic.h"
24
25
26         .text
27
28         .globl  __new_sem_post
29         .type   __new_sem_post,@function
30         .align  5
31         cfi_startproc
32 __new_sem_post:
33         mov.l   @(VALUE,r4), r2
34 0:
35         mov.l   .Lmax, r1
36         cmp/eq  r1, r2
37         bt/s    3f
38          mov    r2, r3
39         mov     r3, r5
40         add     #1, r5
41         CMPXCHG (r3, @(VALUE,r4), r5, r2)
42         bf      0b
43         mov.l   @(NWAITERS,r4), r2
44         tst     r2, r2
45         bt      2f
46         mov     #FUTEX_WAKE, r5
47         mov.l   @(PRIVATE,r4), r1
48         or      r1, r5
49         mov     #1, r6
50         mov     #0, r7
51         mov     #SYS_futex, r3
52         extu.b  r3, r3
53         trapa   #0x14
54         SYSCALL_INST_PAD
55
56         cmp/pz  r0
57         bf      1f
58 2:
59         rts
60          mov    #0, r0
61
62 1:
63         bra     4f
64          mov    #EINVAL, r2
65
66 3:
67         mov     #EOVERFLOW, r2
68 4:
69         mov.l   r12, @-r15
70         cfi_adjust_cfa_offset (4)
71         cfi_rel_offset (r12, 0)
72         mov.l   r8, @-r15
73         cfi_adjust_cfa_offset (4)
74         cfi_rel_offset (r8, 0)
75         sts.l   pr, @-r15
76         cfi_adjust_cfa_offset (4)
77         cfi_rel_offset (pr, 0)
78         mova    .Lgot3, r0
79         mov.l   .Lgot3, r12
80         add     r0, r12
81
82         mov.l   .Lerrno3, r0
83         stc     gbr, r1
84         mov.l   @(r0, r12), r0
85         bra     .Lexit
86          add    r1, r0
87         .align  2
88 .Lerrno3:
89         .long   errno@GOTTPOFF
90 .Lexit:
91         mov.l   r2, @r0
92         lds.l   @r15+, pr
93         cfi_adjust_cfa_offset (-4)
94         cfi_restore (pr)
95         mov.l   @r15+, r8
96         cfi_adjust_cfa_offset (-4)
97         cfi_restore (r8)
98         mov.l   @r15+, r12
99         cfi_adjust_cfa_offset (-4)
100         cfi_restore (r12)
101         rts
102          mov    #-1, r0
103         cfi_endproc
104
105         .align  2
106 .Lmax:
107         .long   SEM_VALUE_MAX
108 .Lgot3:
109         .long   _GLOBAL_OFFSET_TABLE_
110         .size   __new_sem_post,.-__new_sem_post
111         versioned_symbol(libpthread, __new_sem_post, sem_post, GLIBC_2_1)