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