(CFLAGS-tst-align.c): Add -mpreferred-stack-boundary=4.
[glibc.git] / sysdeps / powerpc / powerpc64 / __longjmp-common.S
blob30087d7db497c2566b699fd3620d5d860596a1d3
1 /* longjmp for PowerPC64.
2    Copyright (C) 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2004
3    Free Software Foundation, Inc.
4    This file is part of the GNU C Library.
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
11    The GNU C Library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
16    You should have received a copy of the GNU Lesser General Public
17    License along with the GNU C Library; if not, write to the Free
18    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19    02111-1307 USA.  */
21 #include <sysdep.h>
22 #define _ASM
23 #define _SETJMP_H
24 #ifdef __NO_VMX__
25 # include <novmxsetjmp.h>
26 #else
27 # include <bits/setjmp.h>
28 #endif
29 #include <bp-sym.h>
30 #include <bp-asm.h>
32 #ifndef __NO_VMX__
33         .section        ".toc","aw"
34 .LC__dl_hwcap:
35 # ifdef SHARED
36         .tc _rtld_global_ro[TC],_rtld_global_ro
37 # else
38         .tc _dl_hwcap[TC],_dl_hwcap
39 # endif
40         .section ".text"
41 #endif
43         .machine        "altivec"
44 ENTRY (BP_SYM (__longjmp))
45         CALL_MCOUNT 2
46         CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
47 #ifndef __NO_VMX__
48         ld    r5,.LC__dl_hwcap@toc(r2)
49 # ifdef SHARED
50         /* Load _rtld-global._dl_hwcap.  */
51         ld    r5,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET(r5)
52 # else
53         ld    r5,0(r5) /* Load extern _dl_hwcap.  */
54 # endif
55         andis.  r5,r5,(PPC_FEATURE_HAS_ALTIVEC >> 16)
56         beq     L(no_vmx)
57         la      r5,((JB_VRS)*8)(3)
58         andi.   r6,r5,0xf
59         lwz     r0,((JB_VRSAVE)*8)(3)
60         mtspr   VRSAVE,r0
61         beq+    aligned_restore_vmx
62         addi    r6,r5,16
63         lvsl    v0,0,r5
64         lvx     v1,0,r5
65         addi    r5,r5,32
66         lvx     v21,0,r6
67         vperm   v20,v1,v21,v0
68 # define load_misaligned_vmx_lo_loaded(loadvr,lovr,shiftvr,loadgpr,addgpr) \
69         addi    addgpr,addgpr,32; \
70         lvx     lovr,0,loadgpr; \
71         vperm   loadvr,loadvr,lovr,shiftvr;
72         load_misaligned_vmx_lo_loaded(v21,v22,v0,r5,r6)
73         load_misaligned_vmx_lo_loaded(v22,v23,v0,r6,r5)
74         load_misaligned_vmx_lo_loaded(v23,v24,v0,r5,r6)
75         load_misaligned_vmx_lo_loaded(v24,v25,v0,r6,r5)
76         load_misaligned_vmx_lo_loaded(v25,v26,v0,r5,r6)
77         load_misaligned_vmx_lo_loaded(v26,v27,v0,r6,r5)
78         load_misaligned_vmx_lo_loaded(v27,v28,v0,r5,r6)
79         load_misaligned_vmx_lo_loaded(v28,v29,v0,r6,r5)
80         load_misaligned_vmx_lo_loaded(v29,v30,v0,r5,r6)
81         load_misaligned_vmx_lo_loaded(v30,v31,v0,r6,r5)
82         lvx     v1,0,r5
83         vperm   v31,v31,v1,v0
84         b       L(no_vmx)
85 aligned_restore_vmx:
86         addi    r6,r5,16
87         lvx     v20,0,r5
88         addi    r5,r5,32
89         lvx     v21,0,r6
90         addi    r6,r6,32
91         lvx     v22,0,r5
92         addi    r5,r5,32
93         lvx     v23,0,r6
94         addi    r6,r6,32
95         lvx     v24,0,r5
96         addi    r5,r5,32
97         lvx     v25,0,r6
98         addi    r6,r6,32
99         lvx     v26,0,r5
100         addi    r5,r5,32
101         lvx     v27,0,r6
102         addi    r6,r6,32
103         lvx     v28,0,r5
104         addi    r5,r5,32
105         lvx     v29,0,r6
106         addi    r6,r6,32
107         lvx     v30,0,r5
108         lvx     v31,0,r6
109 L(no_vmx):
110 #endif
111         ld r1,(JB_GPR1*8)(r3)
112         ld r2,(JB_GPR2*8)(r3)
113         ld r0,(JB_LR*8)(r3)
114         ld r14,((JB_GPRS+0)*8)(r3)
115         lfd fp14,((JB_FPRS+0)*8)(r3)
116 #if defined SHARED && !defined IS_IN_rtld
117         std r2,40(r1)   /* Restore the callers TOC save area.  */
118 #endif
119         ld r15,((JB_GPRS+1)*8)(r3)
120         lfd fp15,((JB_FPRS+1)*8)(r3)
121         ld r16,((JB_GPRS+2)*8)(r3)
122         lfd fp16,((JB_FPRS+2)*8)(r3)
123         ld r17,((JB_GPRS+3)*8)(r3)
124         lfd fp17,((JB_FPRS+3)*8)(r3)
125         ld r18,((JB_GPRS+4)*8)(r3)
126         lfd fp18,((JB_FPRS+4)*8)(r3)
127         ld r19,((JB_GPRS+5)*8)(r3)
128         lfd fp19,((JB_FPRS+5)*8)(r3)
129         ld r20,((JB_GPRS+6)*8)(r3)
130         lfd fp20,((JB_FPRS+6)*8)(r3)
131         mtlr r0
132 /*      std r2,40(r1)   Restore the TOC save area.  */
133         ld r21,((JB_GPRS+7)*8)(r3)
134         lfd fp21,((JB_FPRS+7)*8)(r3)
135         ld r22,((JB_GPRS+8)*8)(r3)
136         lfd fp22,((JB_FPRS+8)*8)(r3)
137         ld r0,(JB_CR*8)(r3)
138         ld r23,((JB_GPRS+9)*8)(r3)
139         lfd fp23,((JB_FPRS+9)*8)(r3)
140         ld r24,((JB_GPRS+10)*8)(r3)
141         lfd fp24,((JB_FPRS+10)*8)(r3)
142         ld r25,((JB_GPRS+11)*8)(r3)
143         lfd fp25,((JB_FPRS+11)*8)(r3)
144         mtcrf 0xFF,r0
145         ld r26,((JB_GPRS+12)*8)(r3)
146         lfd fp26,((JB_FPRS+12)*8)(r3)
147         ld r27,((JB_GPRS+13)*8)(r3)
148         lfd fp27,((JB_FPRS+13)*8)(r3)
149         ld r28,((JB_GPRS+14)*8)(r3)
150         lfd fp28,((JB_FPRS+14)*8)(r3)
151         ld r29,((JB_GPRS+15)*8)(r3)
152         lfd fp29,((JB_FPRS+15)*8)(r3)
153         ld r30,((JB_GPRS+16)*8)(r3)
154         lfd fp30,((JB_FPRS+16)*8)(r3)
155         ld r31,((JB_GPRS+17)*8)(r3)
156         lfd fp31,((JB_FPRS+17)*8)(r3)
157         mr r3,r4
158         blr
159 END (BP_SYM (__longjmp))