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