2.9
[glibc/nacl-glibc.git] / nptl / sysdeps / unix / sysv / linux / i386 / i486 / sem_post.S
blob86992c877e141df39fbaabab289cd4e2da14fda4
1 /* Copyright (C) 2002, 2003, 2005, 2007, 2008 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, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
20 #include <sysdep.h>
21 #include <shlib-compat.h>
22 #include <pthread-errnos.h>
23 #include <structsem.h>
24 #include <lowlevellock.h>
27         .text
29         .globl  __new_sem_post
30         .type   __new_sem_post,@function
31         .align  16
32 __new_sem_post:
33         cfi_startproc
34         pushl   %ebx
35         cfi_adjust_cfa_offset(4)
36         cfi_offset(%ebx, -8)
38         movl    8(%esp), %ebx
40 #if VALUE == 0
41         movl    (%ebx), %eax
42 #else
43         movl    VALUE(%ebx), %eax
44 #endif
45 0:      cmpl    $SEM_VALUE_MAX, %eax
46         je      3f
47         leal    1(%eax), %edx
48         LOCK
49 #if VALUE == 0
50         cmpxchgl %edx, (%ebx)
51 #else
52         cmpxchgl %edx, VALUE(%ebx)
53 #endif
54         jnz     0b
56         cmpl    $0, NWAITERS(%ebx)
57         je      2f
59         movl    $FUTEX_WAKE, %ecx
60         orl     PRIVATE(%ebx), %ecx
61         movl    $1, %edx
62         movl    $SYS_futex, %eax
63         ENTER_KERNEL
65         testl   %eax, %eax
66         js      1f
68 2:      xorl    %eax, %eax
69         popl    %ebx
70         cfi_adjust_cfa_offset(-4)
71         cfi_restore(%ebx)
72         ret
74         cfi_adjust_cfa_offset(4)
75         cfi_offset(%ebx, -8)
77 #ifdef PIC
78         call    __i686.get_pc_thunk.bx
79 #else
80         movl    $4f, %ebx
82 #endif
83         addl    $_GLOBAL_OFFSET_TABLE_, %ebx
84 #if USE___THREAD
85 # ifdef NO_TLS_DIRECT_SEG_REFS
86         movl    errno@gotntpoff(%ebx), %edx
87         addl    %gs:0, %edx
88         movl    $EINVAL, (%edx)
89 # else
90         movl    errno@gotntpoff(%ebx), %edx
91         movl    $EINVAL, %gs:(%edx)
92 # endif
93 #else
94         call    __errno_location@plt
95         movl    $EINVAL, (%eax)
96 #endif
98         orl     $-1, %eax
99         popl    %ebx
100         ret
103 #ifdef PIC
104         call    __i686.get_pc_thunk.bx
105 #else
106         movl    $5f, %ebx
108 #endif
109         addl    $_GLOBAL_OFFSET_TABLE_, %ebx
110 #if USE___THREAD
111 # ifdef NO_TLS_DIRECT_SEG_REFS
112         movl    errno@gotntpoff(%ebx), %edx
113         addl    %gs:0, %edx
114         movl    $EOVERFLOW, (%edx)
115 # else
116         movl    errno@gotntpoff(%ebx), %edx
117         movl    $EOVERFLOW, %gs:(%edx)
118 # endif
119 #else
120         call    __errno_location@plt
121         movl    $EOVERFLOW, (%eax)
122 #endif
124         orl     $-1, %eax
125         popl    %ebx
126         cfi_adjust_cfa_offset(-4)
127         cfi_restore(%ebx)
128         ret
129         cfi_endproc
130         .size   __new_sem_post,.-__new_sem_post
131         versioned_symbol(libpthread, __new_sem_post, sem_post, GLIBC_2_1)
132 #if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1)
133         .global __old_sem_post
134         .type   __old_sem_post,@function
135 __old_sem_post:
136         cfi_startproc
137         pushl   %ebx
138         cfi_adjust_cfa_offset(4)
139         cfi_offset(%ebx, -8)
141         movl    8(%esp), %ebx
142         LOCK
143         addl    $1, (%ebx)
145         movl    $SYS_futex, %eax
146         movl    $FUTEX_WAKE, %ecx
147         movl    $1, %edx
148         ENTER_KERNEL
150         testl   %eax, %eax
151         js      1b
153         xorl    %eax, %eax
154         popl    %ebx
155         cfi_adjust_cfa_offset(-4)
156         cfi_restore(%ebx)
157         ret
158         cfi_endproc
159         .size   __old_sem_post,.-__old_sem_post
160         compat_symbol(libpthread, __old_sem_post, sem_post, GLIBC_2_0)
161 #endif
164 #ifdef PIC
165         .section .gnu.linkonce.t.__i686.get_pc_thunk.bx,"ax",@progbits
166         .globl  __i686.get_pc_thunk.bx
167         .hidden __i686.get_pc_thunk.bx
168         .type   __i686.get_pc_thunk.bx,@function
169 __i686.get_pc_thunk.bx:
170         movl (%esp), %ebx;
171         ret
172         .size   __i686.get_pc_thunk.bx,.-__i686.get_pc_thunk.bx
173 #endif