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