Updated to fedora-glibc-20050620T1530
[glibc.git] / sysdeps / powerpc / powerpc32 / fpu / __longjmp-common.S
blob73cc8181f9ee4ea1a4ca6b82b7b7e0c27791600a
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.
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, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
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>
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 #  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         lwz     r5,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET(r5)
50 #  else
51         lwz     r5,_dl_hwcap@got(r5)
52         mtlr    r6
53         lwz     r5,0(r5)
54 #  endif
55 # else
56         lis     r5,_dl_hwcap@ha
57         lwz     r5,_dl_hwcap@l(r5)
58 # endif
59         andis.  r5,r5,(PPC_FEATURE_HAS_ALTIVEC >> 16)
60         beq     L(no_vmx)
61         la      r5,((JB_VRS)*4)(3)
62         andi.   r6,r5,0xf
63         lwz     r0,((JB_VRSAVE)*4)(3)
64         mtspr   VRSAVE,r0
65         beq+    aligned_restore_vmx
66         addi    r6,r5,16
67         lvsl    v0,0,r5
68         lvx     v1,0,r5
69         addi    r5,r5,32
70         lvx     v21,0,r6
71         vperm   v20,v1,v21,v0
72 # define load_misaligned_vmx_lo_loaded(loadvr,lovr,shiftvr,loadgpr,addgpr) \
73         addi    addgpr,addgpr,32; \
74         lvx     lovr,0,loadgpr; \
75         vperm   loadvr,loadvr,lovr,shiftvr;
76         load_misaligned_vmx_lo_loaded(v21,v22,v0,r5,r6)
77         load_misaligned_vmx_lo_loaded(v22,v23,v0,r6,r5)
78         load_misaligned_vmx_lo_loaded(v23,v24,v0,r5,r6)
79         load_misaligned_vmx_lo_loaded(v24,v25,v0,r6,r5)
80         load_misaligned_vmx_lo_loaded(v25,v26,v0,r5,r6)
81         load_misaligned_vmx_lo_loaded(v26,v27,v0,r6,r5)
82         load_misaligned_vmx_lo_loaded(v27,v28,v0,r5,r6)
83         load_misaligned_vmx_lo_loaded(v28,v29,v0,r6,r5)
84         load_misaligned_vmx_lo_loaded(v29,v30,v0,r5,r6)
85         load_misaligned_vmx_lo_loaded(v30,v31,v0,r6,r5)
86         lvx     v1,0,r5
87         vperm   v31,v31,v1,v0
88         b       L(no_vmx)
89 aligned_restore_vmx:
90         addi    r6,r5,16
91         lvx     v20,0,r5
92         addi    r5,r5,32
93         lvx     v21,0,r6
94         addi    r6,r6,32
95         lvx     v22,0,r5
96         addi    r5,r5,32
97         lvx     v23,0,r6
98         addi    r6,r6,32
99         lvx     v24,0,r5
100         addi    r5,r5,32
101         lvx     v25,0,r6
102         addi    r6,r6,32
103         lvx     v26,0,r5
104         addi    r5,r5,32
105         lvx     v27,0,r6
106         addi    r6,r6,32
107         lvx     v28,0,r5
108         addi    r5,r5,32
109         lvx     v29,0,r6
110         addi    r6,r6,32
111         lvx     v30,0,r5
112         lvx     v31,0,r6
113 L(no_vmx):
114 #endif
115         lwz r1,(JB_GPR1*4)(r3)
116         lwz r0,(JB_LR*4)(r3)
117         lwz r14,((JB_GPRS+0)*4)(r3)
118         lfd fp14,((JB_FPRS+0*2)*4)(r3)
119         lwz r15,((JB_GPRS+1)*4)(r3)
120         lfd fp15,((JB_FPRS+1*2)*4)(r3)
121         lwz r16,((JB_GPRS+2)*4)(r3)
122         lfd fp16,((JB_FPRS+2*2)*4)(r3)
123         lwz r17,((JB_GPRS+3)*4)(r3)
124         lfd fp17,((JB_FPRS+3*2)*4)(r3)
125         lwz r18,((JB_GPRS+4)*4)(r3)
126         lfd fp18,((JB_FPRS+4*2)*4)(r3)
127         lwz r19,((JB_GPRS+5)*4)(r3)
128         lfd fp19,((JB_FPRS+5*2)*4)(r3)
129         lwz r20,((JB_GPRS+6)*4)(r3)
130         lfd fp20,((JB_FPRS+6*2)*4)(r3)
131         mtlr r0
132         lwz r21,((JB_GPRS+7)*4)(r3)
133         lfd fp21,((JB_FPRS+7*2)*4)(r3)
134         lwz r22,((JB_GPRS+8)*4)(r3)
135         lfd fp22,((JB_FPRS+8*2)*4)(r3)
136         lwz r0,(JB_CR*4)(r3)
137         lwz r23,((JB_GPRS+9)*4)(r3)
138         lfd fp23,((JB_FPRS+9*2)*4)(r3)
139         lwz r24,((JB_GPRS+10)*4)(r3)
140         lfd fp24,((JB_FPRS+10*2)*4)(r3)
141         lwz r25,((JB_GPRS+11)*4)(r3)
142         lfd fp25,((JB_FPRS+11*2)*4)(r3)
143         mtcrf 0xFF,r0
144         lwz r26,((JB_GPRS+12)*4)(r3)
145         lfd fp26,((JB_FPRS+12*2)*4)(r3)
146         lwz r27,((JB_GPRS+13)*4)(r3)
147         lfd fp27,((JB_FPRS+13*2)*4)(r3)
148         lwz r28,((JB_GPRS+14)*4)(r3)
149         lfd fp28,((JB_FPRS+14*2)*4)(r3)
150         lwz r29,((JB_GPRS+15)*4)(r3)
151         lfd fp29,((JB_FPRS+15*2)*4)(r3)
152         lwz r30,((JB_GPRS+16)*4)(r3)
153         lfd fp30,((JB_FPRS+16*2)*4)(r3)
154         lwz r31,((JB_GPRS+17)*4)(r3)
155         lfd fp31,((JB_FPRS+17*2)*4)(r3)
156         mr r3,r4
157         blr
158 END (BP_SYM (__longjmp))