Change defined(USE___THREAD) to USE___THREAD.
[kopensolaris-gnu/glibc.git] / sysdeps / unix / alpha / sysdep.S
1 /* Copyright (C) 1993, 1996, 1998, 2002 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Brendan Kehoe (brendan@zen.org).
4
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.
9
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.
14
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.  */
19
20 #include <sysdep.h>
21 #include <features.h>
22
23 #if defined(__ELF__) && defined(PIC)
24         /* Put this at the end of libc's text segment so that all of
25            the direct branches from the syscalls are forward, and 
26            thus predicted not taken.  */
27         .section .text.last, "ax", @progbits
28 #else
29         .text
30 #endif
31
32 #ifdef PIC
33         /* When building a shared library, we branch here without
34            having loaded the GP.  Nor, since it was a direct branch,
35            have we loaded PV with our address.  Do both.  */
36 # define LOADGP         br pv, 1f; 1: ldgp gp, 0(pv)
37 # define PROLOGUE       .prologue 0
38 #else
39 # define LOADGP         ldgp gp, 0(pv)
40 # define PROLOGUE       .prologue 1
41 #endif
42
43         .align 4
44         .globl __syscall_error
45         .ent __syscall_error
46 __syscall_error:
47
48 #if defined(_LIBC_REENTRANT) && USE___THREAD
49
50         LOADGP
51         PROLOGUE
52         mov     v0, t0
53         call_pal PAL_rduniq
54         ldq     t1, __libc_errno(gp) !gottprel
55         addq    v0, t1, v0
56         stl     t0, 0(v0)
57         lda     v0, -1
58         ret
59
60 #elif defined(_LIBC_REENTRANT)
61
62         LOADGP
63         lda     sp, -16(sp)
64         .frame  sp, 16, ra, 0
65         stq     ra, 0(sp)
66         stq     v0, 8(sp)
67         .mask   0x4000001, -16
68         PROLOGUE
69
70         /* Find our per-thread errno address  */
71 #ifdef PIC
72         bsr     ra, __errno_location    !samegp
73 #else
74         jsr     ra, __errno_location
75 #endif
76
77         /* Store the error value.  */
78         ldq     t0, 8(sp)
79         stl     t0, 0(v0)
80
81         /* And kick back a -1.  */
82         ldi     v0, -1
83
84         ldq     ra, 0(sp)
85         lda     sp, 16(sp)
86         ret
87
88 #else
89
90         LOADGP
91         PROLOGUE
92         stl     v0, errno
93         lda     v0, -1
94         ret
95
96 #endif
97
98         .end __syscall_error