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