(CFLAGS-tst-align.c): Add -mpreferred-stack-boundary=4.
[glibc.git] / sysdeps / powerpc / powerpc32 / fpu / __longjmp-common.S
bloba2415b9542a70e1ae8cdea7c8b2487a28f959bfc
1 /* longjmp for PowerPC.
2    Copyright (C) 1995-99, 2000, 2003, 2004 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, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
20 #include <sysdep.h>
21 #define _ASM
22 #define _SETJMP_H
23 #ifdef __NO_VMX__
24 # include <novmxsetjmp.h>
25 #else
26 # include <bits/setjmp.h>
27 #endif
28 #include <bp-sym.h>
29 #include <bp-asm.h>
31         .machine        "altivec"
32 ENTRY (BP_SYM (__longjmp))
33         CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
34 #ifndef __NO_VMX__
35 # ifdef PIC
36         mflr    r6
37         bl      _GLOBAL_OFFSET_TABLE_@local-4
38         mflr    r5
39 #  ifdef SHARED
40         lwz     r5,_rtld_global_ro@got(r5)
41         mtlr    r6
42         lwz     r5,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET(r5)
43 #  else
44         lwz     r5,_rtld_global_ro@got(r5)
45         mtlr    r6
46         lwz     r5,0(r5)
47 #  endif
48 # else
49         lis     r5,_dl_hwcap@ha
50         lwz     r5,_dl_hwcap@l(r5)
51 # endif
52         andis.  r5,r5,(PPC_FEATURE_HAS_ALTIVEC >> 16)
53         beq     L(no_vmx)
54         la      r5,((JB_VRS)*4)(3)
55         andi.   r6,r5,0xf
56         lwz     r0,((JB_VRSAVE)*4)(3)
57         mtspr   VRSAVE,r0
58         beq+    aligned_restore_vmx
59         addi    r6,r5,16
60         lvsl    v0,0,r5
61         lvx     v1,0,r5
62         addi    r5,r5,32
63         lvx     v21,0,r6
64         vperm   v20,v1,v21,v0
65 # define load_misaligned_vmx_lo_loaded(loadvr,lovr,shiftvr,loadgpr,addgpr) \
66         addi    addgpr,addgpr,32; \
67         lvx     lovr,0,loadgpr; \
68         vperm   loadvr,loadvr,lovr,shiftvr;
69         load_misaligned_vmx_lo_loaded(v21,v22,v0,r5,r6)
70         load_misaligned_vmx_lo_loaded(v22,v23,v0,r6,r5)
71         load_misaligned_vmx_lo_loaded(v23,v24,v0,r5,r6)
72         load_misaligned_vmx_lo_loaded(v24,v25,v0,r6,r5)
73         load_misaligned_vmx_lo_loaded(v25,v26,v0,r5,r6)
74         load_misaligned_vmx_lo_loaded(v26,v27,v0,r6,r5)
75         load_misaligned_vmx_lo_loaded(v27,v28,v0,r5,r6)
76         load_misaligned_vmx_lo_loaded(v28,v29,v0,r6,r5)
77         load_misaligned_vmx_lo_loaded(v29,v30,v0,r5,r6)
78         load_misaligned_vmx_lo_loaded(v30,v31,v0,r6,r5)
79         lvx     v1,0,r5
80         vperm   v31,v31,v1,v0
81         b       L(no_vmx)
82 aligned_restore_vmx:
83         addi    r6,r5,16
84         lvx     v20,0,r5
85         addi    r5,r5,32
86         lvx     v21,0,r6
87         addi    r6,r6,32
88         lvx     v22,0,r5
89         addi    r5,r5,32
90         lvx     v23,0,r6
91         addi    r6,r6,32
92         lvx     v24,0,r5
93         addi    r5,r5,32
94         lvx     v25,0,r6
95         addi    r6,r6,32
96         lvx     v26,0,r5
97         addi    r5,r5,32
98         lvx     v27,0,r6
99         addi    r6,r6,32
100         lvx     v28,0,r5
101         addi    r5,r5,32
102         lvx     v29,0,r6
103         addi    r6,r6,32
104         lvx     v30,0,r5
105         lvx     v31,0,r6
106 L(no_vmx):
107 #endif
108         lwz r1,(JB_GPR1*4)(r3)
109         lwz r0,(JB_LR*4)(r3)
110         lwz r14,((JB_GPRS+0)*4)(r3)
111         lfd fp14,((JB_FPRS+0*2)*4)(r3)
112         lwz r15,((JB_GPRS+1)*4)(r3)
113         lfd fp15,((JB_FPRS+1*2)*4)(r3)
114         lwz r16,((JB_GPRS+2)*4)(r3)
115         lfd fp16,((JB_FPRS+2*2)*4)(r3)
116         lwz r17,((JB_GPRS+3)*4)(r3)
117         lfd fp17,((JB_FPRS+3*2)*4)(r3)
118         lwz r18,((JB_GPRS+4)*4)(r3)
119         lfd fp18,((JB_FPRS+4*2)*4)(r3)
120         lwz r19,((JB_GPRS+5)*4)(r3)
121         lfd fp19,((JB_FPRS+5*2)*4)(r3)
122         lwz r20,((JB_GPRS+6)*4)(r3)
123         lfd fp20,((JB_FPRS+6*2)*4)(r3)
124         mtlr r0
125         lwz r21,((JB_GPRS+7)*4)(r3)
126         lfd fp21,((JB_FPRS+7*2)*4)(r3)
127         lwz r22,((JB_GPRS+8)*4)(r3)
128         lfd fp22,((JB_FPRS+8*2)*4)(r3)
129         lwz r0,(JB_CR*4)(r3)
130         lwz r23,((JB_GPRS+9)*4)(r3)
131         lfd fp23,((JB_FPRS+9*2)*4)(r3)
132         lwz r24,((JB_GPRS+10)*4)(r3)
133         lfd fp24,((JB_FPRS+10*2)*4)(r3)
134         lwz r25,((JB_GPRS+11)*4)(r3)
135         lfd fp25,((JB_FPRS+11*2)*4)(r3)
136         mtcrf 0xFF,r0
137         lwz r26,((JB_GPRS+12)*4)(r3)
138         lfd fp26,((JB_FPRS+12*2)*4)(r3)
139         lwz r27,((JB_GPRS+13)*4)(r3)
140         lfd fp27,((JB_FPRS+13*2)*4)(r3)
141         lwz r28,((JB_GPRS+14)*4)(r3)
142         lfd fp28,((JB_FPRS+14*2)*4)(r3)
143         lwz r29,((JB_GPRS+15)*4)(r3)
144         lfd fp29,((JB_FPRS+15*2)*4)(r3)
145         lwz r30,((JB_GPRS+16)*4)(r3)
146         lfd fp30,((JB_FPRS+16*2)*4)(r3)
147         lwz r31,((JB_GPRS+17)*4)(r3)
148         lfd fp31,((JB_FPRS+17*2)*4)(r3)
149         mr r3,r4
150         blr
151 END (BP_SYM (__longjmp))