Replace FSF snail mail address with URLs.
[glibc.git] / sysdeps / powerpc / powerpc64 / setjmp-common.S
blob1a1326e367642e4692c1424e374487910cd91ea7
1 /* setjmp for PowerPC64.
2    Copyright (C) 1995-2003, 2004, 2005, 2006 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
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 #define _ASM
21 #ifdef __NO_VMX__
22 #include <novmxsetjmp.h>
23 #else
24 #include <jmpbuf-offsets.h>
25 #endif
26 #include <bp-sym.h>
27 #include <bp-asm.h>
29 #ifndef __NO_VMX__
30         .section        ".toc","aw"
31 .LC__dl_hwcap:
32 # ifdef SHARED
33         .tc _rtld_global_ro[TC],_rtld_global_ro
34 # else
35         .tc _dl_hwcap[TC],_dl_hwcap
36 # endif
37         .section ".text"
38 #endif
40         .machine        "altivec"
41 ENTRY (setjmp)
42         CALL_MCOUNT 1
43         li r4,1                 /* Set second argument to 1.  */
44         b JUMPTARGET (GLUE(__sigsetjmp,_ent))
45 END (setjmp)
47 #if defined SHARED && !defined IS_IN_rtld && !defined __NO_VMX__
48 /* When called from within libc we need a special version of _setjmp
49    that saves r2 since the call won't go via a plt call stub.  See
50    bugz #269.  __GI__setjmp is used in csu/libc-start.c when
51    HAVE_CLEANUP_JMP_BUF is defined.  */
52 ENTRY (BP_SYM (__GI__setjmp))
53         std r2,40(r1)           /* Save the callers TOC in the save area.  */
54         cfi_endproc
55 END_2 (BP_SYM (__GI__setjmp))
56 /* Fall thru. */
57 #endif
59 ENTRY (BP_SYM (_setjmp))
60         CALL_MCOUNT 1
61         li r4,0                 /* Set second argument to 0.  */
62         b JUMPTARGET (GLUE(__sigsetjmp,_ent))
63 END (BP_SYM (_setjmp))
64 libc_hidden_def (_setjmp)
66 ENTRY (BP_SYM (__sigsetjmp))
67         CALL_MCOUNT 2
68 JUMPTARGET(GLUE(__sigsetjmp,_ent)):
69         CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
70 #ifdef PTR_MANGLE
71         mr   r5, r1
72         PTR_MANGLE (r5, r6)
73         std  r5,(JB_GPR1*8)(3)
74 #else
75         std  r1,(JB_GPR1*8)(3)
76 #endif
77         mflr r0
78 #if defined SHARED && !defined IS_IN_rtld
79         ld   r5,40(r1)  /* Retrieve the callers TOC.  */
80         std  r5,(JB_GPR2*8)(3)
81 #else
82         std  r2,(JB_GPR2*8)(3)
83 #endif
84         std  r14,((JB_GPRS+0)*8)(3)
85         stfd fp14,((JB_FPRS+0)*8)(3)
86 #ifdef PTR_MANGLE
87         PTR_MANGLE2 (r0, r6)
88 #endif
89         std  r0,(JB_LR*8)(3)
90         std  r15,((JB_GPRS+1)*8)(3)
91         stfd fp15,((JB_FPRS+1)*8)(3)
92         mfcr r0
93         std  r16,((JB_GPRS+2)*8)(3)
94         stfd fp16,((JB_FPRS+2)*8)(3)
95         std  r0,(JB_CR*8)(3)
96         std  r17,((JB_GPRS+3)*8)(3)
97         stfd fp17,((JB_FPRS+3)*8)(3)
98         std  r18,((JB_GPRS+4)*8)(3)
99         stfd fp18,((JB_FPRS+4)*8)(3)
100         std  r19,((JB_GPRS+5)*8)(3)
101         stfd fp19,((JB_FPRS+5)*8)(3)
102         std  r20,((JB_GPRS+6)*8)(3)
103         stfd fp20,((JB_FPRS+6)*8)(3)
104         std  r21,((JB_GPRS+7)*8)(3)
105         stfd fp21,((JB_FPRS+7)*8)(3)
106         std  r22,((JB_GPRS+8)*8)(3)
107         stfd fp22,((JB_FPRS+8)*8)(3)
108         std  r23,((JB_GPRS+9)*8)(3)
109         stfd fp23,((JB_FPRS+9)*8)(3)
110         std  r24,((JB_GPRS+10)*8)(3)
111         stfd fp24,((JB_FPRS+10)*8)(3)
112         std  r25,((JB_GPRS+11)*8)(3)
113         stfd fp25,((JB_FPRS+11)*8)(3)
114         std  r26,((JB_GPRS+12)*8)(3)
115         stfd fp26,((JB_FPRS+12)*8)(3)
116         std  r27,((JB_GPRS+13)*8)(3)
117         stfd fp27,((JB_FPRS+13)*8)(3)
118         std  r28,((JB_GPRS+14)*8)(3)
119         stfd fp28,((JB_FPRS+14)*8)(3)
120         std  r29,((JB_GPRS+15)*8)(3)
121         stfd fp29,((JB_FPRS+15)*8)(3)
122         std  r30,((JB_GPRS+16)*8)(3)
123         stfd fp30,((JB_FPRS+16)*8)(3)
124         std  r31,((JB_GPRS+17)*8)(3)
125         stfd fp31,((JB_FPRS+17)*8)(3)
126 #ifndef __NO_VMX__
127         ld    r6,.LC__dl_hwcap@toc(r2)
128 # ifdef SHARED
129         /* Load _rtld-global._dl_hwcap.  */
130         ld    r6,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET(r6)
131 # else
132         ld    r6,0(r6) /* Load extern _dl_hwcap.  */
133 # endif
134         andis.  r6,r6,(PPC_FEATURE_HAS_ALTIVEC >> 16)
135         beq     L(no_vmx)
136         la      r5,((JB_VRS)*8)(3)
137         andi.   r6,r5,0xf
138         mfspr   r0,VRSAVE
139         stw     r0,((JB_VRSAVE)*8)(3)
140         addi    r6,r5,16
141         beq+    L(aligned_save_vmx)
142         lvsr    v0,0,r5
143         vspltisb v1,-1         /* set v1 to all 1's */
144         vspltisb v2,0          /* set v2 to all 0's */
145         vperm   v3,v2,v1,v0   /* v3 contains shift mask with num all 1 bytes
146                                  on left = misalignment  */
149         /* Special case for v20 we need to preserve what is in save area
150            below v20 before obliterating it */
151         lvx     v5,0,r5
152         vperm   v20,v20,v20,v0
153         vsel    v5,v5,v20,v3
154         vsel    v20,v20,v2,v3
155         stvx    v5,0,r5
157 # define save_2vmx_partial(savevr,prev_savevr,hivr,shiftvr,maskvr,savegpr,addgpr) \
158         addi    addgpr,addgpr,32; \
159         vperm   savevr,savevr,savevr,shiftvr; \
160         vsel    hivr,prev_savevr,savevr,maskvr; \
161         stvx    hivr,0,savegpr;
163         save_2vmx_partial(v21,v20,v5,v0,v3,r6,r5)
164         save_2vmx_partial(v22,v21,v5,v0,v3,r5,r6)
165         save_2vmx_partial(v23,v22,v5,v0,v3,r6,r5)
166         save_2vmx_partial(v24,v23,v5,v0,v3,r5,r6)
167         save_2vmx_partial(v25,v24,v5,v0,v3,r6,r5)
168         save_2vmx_partial(v26,v25,v5,v0,v3,r5,r6)
169         save_2vmx_partial(v27,v26,v5,v0,v3,r6,r5)
170         save_2vmx_partial(v28,v27,v5,v0,v3,r5,r6)
171         save_2vmx_partial(v29,v28,v5,v0,v3,r6,r5)
172         save_2vmx_partial(v30,v29,v5,v0,v3,r5,r6)
174         /* Special case for r31 we need to preserve what is in save area
175            above v31 before obliterating it */
176         addi    r5,r5,32
177         vperm   v31,v31,v31,v0
178         lvx     v4,0,r5
179         vsel    v5,v30,v31,v3
180         stvx    v5,0,r6
181         vsel    v4,v31,v4,v3
182         stvx    v4,0,r5
183         b       L(no_vmx)
185 L(aligned_save_vmx):
186         stvx    20,0,r5
187         addi    r5,r5,32
188         stvx    21,0,r6
189         addi    r6,r6,32
190         stvx    22,0,r5
191         addi    r5,r5,32
192         stvx    23,0,r6
193         addi    r6,r6,32
194         stvx    24,0,r5
195         addi    r5,r5,32
196         stvx    25,0,r6
197         addi    r6,r6,32
198         stvx    26,0,r5
199         addi    r5,r5,32
200         stvx    27,0,r6
201         addi    r6,r6,32
202         stvx    28,0,r5
203         addi    r5,r5,32
204         stvx    29,0,r6
205         addi    r6,r6,32
206         stvx    30,0,r5
207         stvx    31,0,r6
208 L(no_vmx):
209 #else
210         li      r6,0
211 #endif
212 #if defined NOT_IN_libc && defined IS_IN_rtld
213         li      r3,0
214         blr
215 #elif defined SHARED
216         b       JUMPTARGET (BP_SYM (__sigjmp_save))
217 #else
218         mflr    r0
219         std     r0,16(r1)
220         stdu    r1,-112(r1)
221         cfi_adjust_cfa_offset(112)
222         cfi_offset(lr,16)
223         bl      JUMPTARGET (BP_SYM (__sigjmp_save))
224         nop
225         ld      r0,112+16(r1)
226         addi    r1,r1,112
227         mtlr    r0
228         blr
229 #endif
230 END (BP_SYM (__sigsetjmp))