Replace FSF snail mail address with URLs.
[glibc.git] / sysdeps / powerpc / powerpc64 / __longjmp-common.S
blob2ff9078ec20fc1427eed4630463767ac3934b247
1 /* longjmp for PowerPC64.
2    Copyright (C) 1995, 1996,1997,1999-2006,2009 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 #define _SETJMP_H
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 #ifndef __NO_VMX__
31         .section        ".toc","aw"
32 .LC__dl_hwcap:
33 # ifdef SHARED
34         .tc _rtld_global_ro[TC],_rtld_global_ro
35 # else
36         .tc _dl_hwcap[TC],_dl_hwcap
37 # endif
38         .section ".text"
39 #endif
41         .machine        "altivec"
42 ENTRY (BP_SYM (__longjmp))
43         CALL_MCOUNT 2
44         CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
45 #ifndef __NO_VMX__
46         ld    r5,.LC__dl_hwcap@toc(r2)
47 # ifdef SHARED
48         /* Load _rtld-global._dl_hwcap.  */
49         ld    r5,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET(r5)
50 # else
51         ld    r5,0(r5) /* Load extern _dl_hwcap.  */
52 # endif
53         andis.  r5,r5,(PPC_FEATURE_HAS_ALTIVEC >> 16)
54         beq     L(no_vmx)
55         la      r5,((JB_VRS)*8)(3)
56         andi.   r6,r5,0xf
57         lwz     r0,((JB_VRSAVE)*8)(3)
58         mtspr   VRSAVE,r0
59         beq+    L(aligned_restore_vmx)
60         addi    r6,r5,16
61         lvsl    v0,0,r5
62         lvx     v1,0,r5
63         addi    r5,r5,32
64         lvx     v21,0,r6
65         vperm   v20,v1,v21,v0
66 # define load_misaligned_vmx_lo_loaded(loadvr,lovr,shiftvr,loadgpr,addgpr) \
67         addi    addgpr,addgpr,32; \
68         lvx     lovr,0,loadgpr; \
69         vperm   loadvr,loadvr,lovr,shiftvr;
70         load_misaligned_vmx_lo_loaded(v21,v22,v0,r5,r6)
71         load_misaligned_vmx_lo_loaded(v22,v23,v0,r6,r5)
72         load_misaligned_vmx_lo_loaded(v23,v24,v0,r5,r6)
73         load_misaligned_vmx_lo_loaded(v24,v25,v0,r6,r5)
74         load_misaligned_vmx_lo_loaded(v25,v26,v0,r5,r6)
75         load_misaligned_vmx_lo_loaded(v26,v27,v0,r6,r5)
76         load_misaligned_vmx_lo_loaded(v27,v28,v0,r5,r6)
77         load_misaligned_vmx_lo_loaded(v28,v29,v0,r6,r5)
78         load_misaligned_vmx_lo_loaded(v29,v30,v0,r5,r6)
79         load_misaligned_vmx_lo_loaded(v30,v31,v0,r6,r5)
80         lvx     v1,0,r5
81         vperm   v31,v31,v1,v0
82         b       L(no_vmx)
83 L(aligned_restore_vmx):
84         addi    r6,r5,16
85         lvx     v20,0,r5
86         addi    r5,r5,32
87         lvx     v21,0,r6
88         addi    r6,r6,32
89         lvx     v22,0,r5
90         addi    r5,r5,32
91         lvx     v23,0,r6
92         addi    r6,r6,32
93         lvx     v24,0,r5
94         addi    r5,r5,32
95         lvx     v25,0,r6
96         addi    r6,r6,32
97         lvx     v26,0,r5
98         addi    r5,r5,32
99         lvx     v27,0,r6
100         addi    r6,r6,32
101         lvx     v28,0,r5
102         addi    r5,r5,32
103         lvx     v29,0,r6
104         addi    r6,r6,32
105         lvx     v30,0,r5
106         lvx     v31,0,r6
107 L(no_vmx):
108 #endif
109 #if defined PTR_DEMANGLE || defined CHECK_SP
110         ld r22,(JB_GPR1*8)(r3)
111 #else
112         ld r1,(JB_GPR1*8)(r3)
113 #endif
114 #ifdef PTR_DEMANGLE
115 # ifdef CHECK_SP
116         PTR_DEMANGLE3 (r22, r22, r25)
117 # else
118         PTR_DEMANGLE3 (r1, r22, r25)
119 # endif
120 #endif
121 #ifdef CHECK_SP
122         CHECK_SP (r22)
123         mr r1,r22
124 #endif
125         ld r2,(JB_GPR2*8)(r3)
126         ld r0,(JB_LR*8)(r3)
127         ld r14,((JB_GPRS+0)*8)(r3)
128         lfd fp14,((JB_FPRS+0)*8)(r3)
129 #if defined SHARED && !defined IS_IN_rtld
130         std r2,40(r1)   /* Restore the callers TOC save area.  */
131 #endif
132         ld r15,((JB_GPRS+1)*8)(r3)
133         lfd fp15,((JB_FPRS+1)*8)(r3)
134         ld r16,((JB_GPRS+2)*8)(r3)
135         lfd fp16,((JB_FPRS+2)*8)(r3)
136         ld r17,((JB_GPRS+3)*8)(r3)
137         lfd fp17,((JB_FPRS+3)*8)(r3)
138         ld r18,((JB_GPRS+4)*8)(r3)
139         lfd fp18,((JB_FPRS+4)*8)(r3)
140         ld r19,((JB_GPRS+5)*8)(r3)
141         lfd fp19,((JB_FPRS+5)*8)(r3)
142         ld r20,((JB_GPRS+6)*8)(r3)
143         lfd fp20,((JB_FPRS+6)*8)(r3)
144 #ifdef PTR_DEMANGLE
145         PTR_DEMANGLE2 (r0, r25)
146 #endif
147         mtlr r0
148 /*      std r2,40(r1)   Restore the TOC save area.  */
149         ld r21,((JB_GPRS+7)*8)(r3)
150         lfd fp21,((JB_FPRS+7)*8)(r3)
151         ld r22,((JB_GPRS+8)*8)(r3)
152         lfd fp22,((JB_FPRS+8)*8)(r3)
153         ld r0,(JB_CR*8)(r3)
154         ld r23,((JB_GPRS+9)*8)(r3)
155         lfd fp23,((JB_FPRS+9)*8)(r3)
156         ld r24,((JB_GPRS+10)*8)(r3)
157         lfd fp24,((JB_FPRS+10)*8)(r3)
158         ld r25,((JB_GPRS+11)*8)(r3)
159         lfd fp25,((JB_FPRS+11)*8)(r3)
160         mtcrf 0xFF,r0
161         ld r26,((JB_GPRS+12)*8)(r3)
162         lfd fp26,((JB_FPRS+12)*8)(r3)
163         ld r27,((JB_GPRS+13)*8)(r3)
164         lfd fp27,((JB_FPRS+13)*8)(r3)
165         ld r28,((JB_GPRS+14)*8)(r3)
166         lfd fp28,((JB_FPRS+14)*8)(r3)
167         ld r29,((JB_GPRS+15)*8)(r3)
168         lfd fp29,((JB_FPRS+15)*8)(r3)
169         ld r30,((JB_GPRS+16)*8)(r3)
170         lfd fp30,((JB_FPRS+16)*8)(r3)
171         ld r31,((JB_GPRS+17)*8)(r3)
172         lfd fp31,((JB_FPRS+17)*8)(r3)
173         mr r3,r4
174         blr
175 END (BP_SYM (__longjmp))