]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/powerpc/powerpc64/setjmp-common.S
* libio/wmemstream.c: New file.
[thirdparty/glibc.git] / sysdeps / powerpc / powerpc64 / setjmp-common.S
CommitLineData
5c76ff27 1/* setjmp for PowerPC64.
d87921ee 2 Copyright (C) 1995-2003, 2004, 2005 Free Software Foundation, Inc.
5c76ff27
UD
3 This file is part of the GNU C Library.
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#define _ASM
a334319f 22#define _SETJMP_H
5c76ff27
UD
23#ifdef __NO_VMX__
24#include <novmxsetjmp.h>
25#else
a334319f 26#include <bits/setjmp.h>
5c76ff27
UD
27#endif
28#include <bp-sym.h>
29#include <bp-asm.h>
30
31#ifndef __NO_VMX__
32 .section ".toc","aw"
33.LC__dl_hwcap:
ef690add
UD
34# ifdef SHARED
35 .tc _rtld_global_ro[TC],_rtld_global_ro
36# else
5c76ff27 37 .tc _dl_hwcap[TC],_dl_hwcap
ef690add 38# endif
5c76ff27
UD
39 .section ".text"
40#endif
41
f2bfeadf 42 .machine "altivec"
5c76ff27 43ENTRY (BP_SYM (__sigsetjmp))
d7d06f79
UD
44 CALL_MCOUNT 2
45 .globl JUMPTARGET(GLUE(__sigsetjmp,_ent))
46 .hidden JUMPTARGET(GLUE(__sigsetjmp,_ent))
47JUMPTARGET(GLUE(__sigsetjmp,_ent)):
5c76ff27 48 CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
4e54d7e4
UD
49#ifdef PTR_MANGLE
50 mr r5, r1
5ad77144 51 PTR_MANGLE (r5, r6)
4e54d7e4
UD
52 std r5,(JB_GPR1*8)(3)
53#else
5c76ff27 54 std r1,(JB_GPR1*8)(3)
4e54d7e4 55#endif
5c76ff27 56 mflr r0
77d60040
UD
57#if defined SHARED && !defined IS_IN_rtld
58 ld r5,40(r1) /* Retrieve the callers TOC. */
59 std r5,(JB_GPR2*8)(3)
60#else
5c76ff27 61 std r2,(JB_GPR2*8)(3)
77d60040 62#endif
5c76ff27
UD
63 std r14,((JB_GPRS+0)*8)(3)
64 stfd fp14,((JB_FPRS+0)*8)(3)
00c2b3b9 65#ifdef PTR_MANGLE
5ad77144 66 PTR_MANGLE2 (r0, r6)
00c2b3b9 67#endif
5c76ff27
UD
68 std r0,(JB_LR*8)(3)
69 std r15,((JB_GPRS+1)*8)(3)
70 stfd fp15,((JB_FPRS+1)*8)(3)
71 mfcr r0
72 std r16,((JB_GPRS+2)*8)(3)
73 stfd fp16,((JB_FPRS+2)*8)(3)
74 std r0,(JB_CR*8)(3)
75 std r17,((JB_GPRS+3)*8)(3)
76 stfd fp17,((JB_FPRS+3)*8)(3)
77 std r18,((JB_GPRS+4)*8)(3)
78 stfd fp18,((JB_FPRS+4)*8)(3)
79 std r19,((JB_GPRS+5)*8)(3)
80 stfd fp19,((JB_FPRS+5)*8)(3)
81 std r20,((JB_GPRS+6)*8)(3)
82 stfd fp20,((JB_FPRS+6)*8)(3)
83 std r21,((JB_GPRS+7)*8)(3)
84 stfd fp21,((JB_FPRS+7)*8)(3)
85 std r22,((JB_GPRS+8)*8)(3)
86 stfd fp22,((JB_FPRS+8)*8)(3)
87 std r23,((JB_GPRS+9)*8)(3)
88 stfd fp23,((JB_FPRS+9)*8)(3)
89 std r24,((JB_GPRS+10)*8)(3)
90 stfd fp24,((JB_FPRS+10)*8)(3)
91 std r25,((JB_GPRS+11)*8)(3)
92 stfd fp25,((JB_FPRS+11)*8)(3)
93 std r26,((JB_GPRS+12)*8)(3)
94 stfd fp26,((JB_FPRS+12)*8)(3)
95 std r27,((JB_GPRS+13)*8)(3)
96 stfd fp27,((JB_FPRS+13)*8)(3)
97 std r28,((JB_GPRS+14)*8)(3)
98 stfd fp28,((JB_FPRS+14)*8)(3)
99 std r29,((JB_GPRS+15)*8)(3)
100 stfd fp29,((JB_FPRS+15)*8)(3)
101 std r30,((JB_GPRS+16)*8)(3)
102 stfd fp30,((JB_FPRS+16)*8)(3)
103 std r31,((JB_GPRS+17)*8)(3)
104 stfd fp31,((JB_FPRS+17)*8)(3)
105#ifndef __NO_VMX__
5ad77144 106 ld r6,.LC__dl_hwcap@toc(r2)
ef690add 107# ifdef SHARED
5c76ff27 108 /* Load _rtld-global._dl_hwcap. */
5ad77144 109 ld r6,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET(r6)
ef690add 110# else
5ad77144 111 ld r6,0(r6) /* Load extern _dl_hwcap. */
ef690add 112# endif
5ad77144 113 andis. r6,r6,(PPC_FEATURE_HAS_ALTIVEC >> 16)
37272306 114 beq L(no_vmx)
5c76ff27
UD
115 la r5,((JB_VRS)*8)(3)
116 andi. r6,r5,0xf
117 mfspr r0,VRSAVE
118 stw r0,((JB_VRSAVE)*8)(3)
119 addi r6,r5,16
37272306 120 beq+ L(aligned_save_vmx)
5c76ff27
UD
121 lvsr v0,0,r5
122 vspltisb v1,-1 /* set v1 to all 1's */
123 vspltisb v2,0 /* set v2 to all 0's */
124 vperm v3,v2,v1,v0 /* v3 contains shift mask with num all 1 bytes
125 on left = misalignment */
126
127
128 /* Special case for v20 we need to preserve what is in save area
129 below v20 before obliterating it */
130 lvx v5,0,r5
131 vperm v20,v20,v20,v0
132 vsel v5,v5,v20,v3
133 vsel v20,v20,v2,v3
134 stvx v5,0,r5
135
ef690add 136# define save_2vmx_partial(savevr,prev_savevr,hivr,shiftvr,maskvr,savegpr,addgpr) \
5c76ff27
UD
137 addi addgpr,addgpr,32; \
138 vperm savevr,savevr,savevr,shiftvr; \
139 vsel hivr,prev_savevr,savevr,maskvr; \
140 stvx hivr,0,savegpr;
141
142 save_2vmx_partial(v21,v20,v5,v0,v3,r6,r5)
143 save_2vmx_partial(v22,v21,v5,v0,v3,r5,r6)
144 save_2vmx_partial(v23,v22,v5,v0,v3,r6,r5)
145 save_2vmx_partial(v24,v23,v5,v0,v3,r5,r6)
146 save_2vmx_partial(v25,v24,v5,v0,v3,r6,r5)
147 save_2vmx_partial(v26,v25,v5,v0,v3,r5,r6)
148 save_2vmx_partial(v27,v26,v5,v0,v3,r6,r5)
149 save_2vmx_partial(v28,v27,v5,v0,v3,r5,r6)
150 save_2vmx_partial(v29,v28,v5,v0,v3,r6,r5)
151 save_2vmx_partial(v30,v29,v5,v0,v3,r5,r6)
152
153 /* Special case for r31 we need to preserve what is in save area
154 above v31 before obliterating it */
155 addi r5,r5,32
156 vperm v31,v31,v31,v0
157 lvx v4,0,r5
158 vsel v5,v30,v31,v3
159 stvx v5,0,r6
160 vsel v4,v31,v4,v3
161 stvx v4,0,r5
37272306 162 b L(no_vmx)
5c76ff27 163
37272306 164L(aligned_save_vmx):
5c76ff27
UD
165 stvx 20,0,r5
166 addi r5,r5,32
167 stvx 21,0,r6
168 addi r6,r6,32
169 stvx 22,0,r5
170 addi r5,r5,32
171 stvx 23,0,r6
172 addi r6,r6,32
173 stvx 24,0,r5
174 addi r5,r5,32
175 stvx 25,0,r6
176 addi r6,r6,32
177 stvx 26,0,r5
178 addi r5,r5,32
179 stvx 27,0,r6
180 addi r6,r6,32
181 stvx 28,0,r5
182 addi r5,r5,32
183 stvx 29,0,r6
184 addi r6,r6,32
185 stvx 30,0,r5
186 stvx 31,0,r6
37272306 187L(no_vmx):
5ad77144
UD
188#else
189 li r6,0
5c76ff27 190#endif
d87921ee
UD
191#if defined NOT_IN_libc && defined IS_IN_rtld
192 li r3,0
193 blr
194#else
5c76ff27 195 b JUMPTARGET (BP_SYM (__sigjmp_save))
d87921ee 196#endif
5c76ff27 197END (BP_SYM (__sigsetjmp))