2.9
[glibc/nacl-glibc.git] / sysdeps / powerpc / powerpc64 / __longjmp-common.S
blob700a2a543ce61dcf9c2c7797bdfd5ee48000a0e6
1 /* longjmp for PowerPC64.
2    Copyright (C) 1995, 1996,1997,1999,2000,2001,2002,2003,2004,2005,2006
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 <jmpbuf-offsets.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 #ifdef PTR_DEMANGLE
112         ld r22,(JB_GPR1*8)(r3)
113         PTR_DEMANGLE3 (r1, r22, r25)
114 #else
115         ld r1,(JB_GPR1*8)(r3)
116 #endif
117         ld r2,(JB_GPR2*8)(r3)
118         ld r0,(JB_LR*8)(r3)
119         ld r14,((JB_GPRS+0)*8)(r3)
120         lfd fp14,((JB_FPRS+0)*8)(r3)
121 #if defined SHARED && !defined IS_IN_rtld
122         std r2,40(r1)   /* Restore the callers TOC save area.  */
123 #endif
124         ld r15,((JB_GPRS+1)*8)(r3)
125         lfd fp15,((JB_FPRS+1)*8)(r3)
126         ld r16,((JB_GPRS+2)*8)(r3)
127         lfd fp16,((JB_FPRS+2)*8)(r3)
128         ld r17,((JB_GPRS+3)*8)(r3)
129         lfd fp17,((JB_FPRS+3)*8)(r3)
130         ld r18,((JB_GPRS+4)*8)(r3)
131         lfd fp18,((JB_FPRS+4)*8)(r3)
132         ld r19,((JB_GPRS+5)*8)(r3)
133         lfd fp19,((JB_FPRS+5)*8)(r3)
134         ld r20,((JB_GPRS+6)*8)(r3)
135         lfd fp20,((JB_FPRS+6)*8)(r3)
136 #ifdef PTR_DEMANGLE
137         PTR_DEMANGLE2 (r0, r25)
138 #endif
139         mtlr r0
140 /*      std r2,40(r1)   Restore the TOC save area.  */
141         ld r21,((JB_GPRS+7)*8)(r3)
142         lfd fp21,((JB_FPRS+7)*8)(r3)
143         ld r22,((JB_GPRS+8)*8)(r3)
144         lfd fp22,((JB_FPRS+8)*8)(r3)
145         ld r0,(JB_CR*8)(r3)
146         ld r23,((JB_GPRS+9)*8)(r3)
147         lfd fp23,((JB_FPRS+9)*8)(r3)
148         ld r24,((JB_GPRS+10)*8)(r3)
149         lfd fp24,((JB_FPRS+10)*8)(r3)
150         ld r25,((JB_GPRS+11)*8)(r3)
151         lfd fp25,((JB_FPRS+11)*8)(r3)
152         mtcrf 0xFF,r0
153         ld r26,((JB_GPRS+12)*8)(r3)
154         lfd fp26,((JB_FPRS+12)*8)(r3)
155         ld r27,((JB_GPRS+13)*8)(r3)
156         lfd fp27,((JB_FPRS+13)*8)(r3)
157         ld r28,((JB_GPRS+14)*8)(r3)
158         lfd fp28,((JB_FPRS+14)*8)(r3)
159         ld r29,((JB_GPRS+15)*8)(r3)
160         lfd fp29,((JB_FPRS+15)*8)(r3)
161         ld r30,((JB_GPRS+16)*8)(r3)
162         lfd fp30,((JB_FPRS+16)*8)(r3)
163         ld r31,((JB_GPRS+17)*8)(r3)
164         lfd fp31,((JB_FPRS+17)*8)(r3)
165         mr r3,r4
166         blr
167 END (BP_SYM (__longjmp))