Update copyright notices with scripts/update-copyrights
[glibc.git] / nptl / sysdeps / unix / sysv / linux / i386 / i486 / sem_post.S
blobbc091a09269dd481372b365eae8791776c6cea7f
1 /* Copyright (C) 2002-2014 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <http://www.gnu.org/licenses/>.  */
19 #include <sysdep.h>
20 #include <shlib-compat.h>
21 #include <pthread-errnos.h>
22 #include <structsem.h>
23 #include <lowlevellock.h>
26         .text
28         .globl  __new_sem_post
29         .type   __new_sem_post,@function
30         .align  16
31 __new_sem_post:
32         cfi_startproc
33         pushl   %ebx
34         cfi_adjust_cfa_offset(4)
35         cfi_offset(%ebx, -8)
37         movl    8(%esp), %ebx
39 #if VALUE == 0
40         movl    (%ebx), %eax
41 #else
42         movl    VALUE(%ebx), %eax
43 #endif
44 0:      cmpl    $SEM_VALUE_MAX, %eax
45         je      3f
46         leal    1(%eax), %edx
47         LOCK
48 #if VALUE == 0
49         cmpxchgl %edx, (%ebx)
50 #else
51         cmpxchgl %edx, VALUE(%ebx)
52 #endif
53         jnz     0b
55         cmpl    $0, NWAITERS(%ebx)
56         je      2f
58         movl    $FUTEX_WAKE, %ecx
59         orl     PRIVATE(%ebx), %ecx
60         movl    $1, %edx
61         movl    $SYS_futex, %eax
62         ENTER_KERNEL
64         testl   %eax, %eax
65         js      1f
67 2:      xorl    %eax, %eax
68         popl    %ebx
69         cfi_adjust_cfa_offset(-4)
70         cfi_restore(%ebx)
71         ret
73         cfi_adjust_cfa_offset(4)
74         cfi_offset(%ebx, -8)
76 #ifdef PIC
77         SETUP_PIC_REG(bx)
78 #else
79         movl    $4f, %ebx
81 #endif
82         addl    $_GLOBAL_OFFSET_TABLE_, %ebx
83 #ifdef NO_TLS_DIRECT_SEG_REFS
84         movl    errno@gotntpoff(%ebx), %edx
85         addl    %gs:0, %edx
86         movl    $EINVAL, (%edx)
87 #else
88         movl    errno@gotntpoff(%ebx), %edx
89         movl    $EINVAL, %gs:(%edx)
90 #endif
92         orl     $-1, %eax
93         popl    %ebx
94         ret
97 #ifdef PIC
98         SETUP_PIC_REG(bx)
99 #else
100         movl    $5f, %ebx
102 #endif
103         addl    $_GLOBAL_OFFSET_TABLE_, %ebx
104 #ifdef NO_TLS_DIRECT_SEG_REFS
105         movl    errno@gotntpoff(%ebx), %edx
106         addl    %gs:0, %edx
107         movl    $EOVERFLOW, (%edx)
108 #else
109         movl    errno@gotntpoff(%ebx), %edx
110         movl    $EOVERFLOW, %gs:(%edx)
111 #endif
113         orl     $-1, %eax
114         popl    %ebx
115         cfi_adjust_cfa_offset(-4)
116         cfi_restore(%ebx)
117         ret
118         cfi_endproc
119         .size   __new_sem_post,.-__new_sem_post
120         versioned_symbol(libpthread, __new_sem_post, sem_post, GLIBC_2_1)
121 #if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1)
122         .global __old_sem_post
123         .type   __old_sem_post,@function
124 __old_sem_post:
125         cfi_startproc
126         pushl   %ebx
127         cfi_adjust_cfa_offset(4)
128         cfi_offset(%ebx, -8)
130         movl    8(%esp), %ebx
131         LOCK
132         addl    $1, (%ebx)
134         movl    $SYS_futex, %eax
135         movl    $FUTEX_WAKE, %ecx
136         movl    $1, %edx
137         ENTER_KERNEL
139         testl   %eax, %eax
140         js      1b
142         xorl    %eax, %eax
143         popl    %ebx
144         cfi_adjust_cfa_offset(-4)
145         cfi_restore(%ebx)
146         ret
147         cfi_endproc
148         .size   __old_sem_post,.-__old_sem_post
149         compat_symbol(libpthread, __old_sem_post, sem_post, GLIBC_2_0)
150 #endif