]> git.ipfire.org Git - thirdparty/glibc.git/blob - sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S
[BZ #6411]
[thirdparty/glibc.git] / sysdeps / powerpc / powerpc32 / fpu / __longjmp-common.S
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.
4
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.
9
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.
14
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. */
19
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>
29
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+4(r5)
51 # else
52 lwz r5,_dl_hwcap@got(r5)
53 mtlr r6
54 cfi_same_value (lr)
55 lwz r5,4(r5)
56 # endif
57 # else
58 lis r5,(_dl_hwcap+4)@ha
59 lwz r5,(_dl_hwcap+4)@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))