Define bit_SSE2 and index_SSE2.
[glibc.git] / sysdeps / powerpc / powerpc32 / fpu / __longjmp-common.S
blob04ed6da68b18256f4bcc1ed2050b6e9213e241cc
1 /* longjmp for PowerPC.
2    Copyright (C) 1995-99, 2000, 2003-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, write to the Free
17    Software Foundation, Inc., 1 Franklin Street, Fifth Floor, Boston MA
18    02110-1301 USA.  */
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>
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+    L(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 L(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 #if defined PTR_DEMANGLE || defined CHECK_SP
118         lwz r24,(JB_GPR1*4)(r3)
119 # ifdef CHECK_SP
120 #  ifdef PTR_DEMANGLE
121         PTR_DEMANGLE3 (r24, r24, r25)
122 #  endif
123         CHECK_SP (r24)
124         mr r1,r24
125 # endif
126 #else
127         lwz r1,(JB_GPR1*4)(r3)
128 #endif
129         lwz r0,(JB_LR*4)(r3)
130         lwz r14,((JB_GPRS+0)*4)(r3)
131         lfd fp14,((JB_FPRS+0*2)*4)(r3)
132         lwz r15,((JB_GPRS+1)*4)(r3)
133         lfd fp15,((JB_FPRS+1*2)*4)(r3)
134         lwz r16,((JB_GPRS+2)*4)(r3)
135         lfd fp16,((JB_FPRS+2*2)*4)(r3)
136         lwz r17,((JB_GPRS+3)*4)(r3)
137         lfd fp17,((JB_FPRS+3*2)*4)(r3)
138         lwz r18,((JB_GPRS+4)*4)(r3)
139         lfd fp18,((JB_FPRS+4*2)*4)(r3)
140         lwz r19,((JB_GPRS+5)*4)(r3)
141         lfd fp19,((JB_FPRS+5*2)*4)(r3)
142         lwz r20,((JB_GPRS+6)*4)(r3)
143         lfd fp20,((JB_FPRS+6*2)*4)(r3)
144 #ifdef PTR_DEMANGLE
145 # ifndef CHECK_SP
146         PTR_DEMANGLE3 (r1, r24, r25)
147 # endif
148         PTR_DEMANGLE2 (r0, r25)
149 #endif
150         mtlr r0
151         lwz r21,((JB_GPRS+7)*4)(r3)
152         lfd fp21,((JB_FPRS+7*2)*4)(r3)
153         lwz r22,((JB_GPRS+8)*4)(r3)
154         lfd fp22,((JB_FPRS+8*2)*4)(r3)
155         lwz r0,(JB_CR*4)(r3)
156         lwz r23,((JB_GPRS+9)*4)(r3)
157         lfd fp23,((JB_FPRS+9*2)*4)(r3)
158         lwz r24,((JB_GPRS+10)*4)(r3)
159         lfd fp24,((JB_FPRS+10*2)*4)(r3)
160         lwz r25,((JB_GPRS+11)*4)(r3)
161         lfd fp25,((JB_FPRS+11*2)*4)(r3)
162         mtcrf 0xFF,r0
163         lwz r26,((JB_GPRS+12)*4)(r3)
164         lfd fp26,((JB_FPRS+12*2)*4)(r3)
165         lwz r27,((JB_GPRS+13)*4)(r3)
166         lfd fp27,((JB_FPRS+13*2)*4)(r3)
167         lwz r28,((JB_GPRS+14)*4)(r3)
168         lfd fp28,((JB_FPRS+14*2)*4)(r3)
169         lwz r29,((JB_GPRS+15)*4)(r3)
170         lfd fp29,((JB_FPRS+15*2)*4)(r3)
171         lwz r30,((JB_GPRS+16)*4)(r3)
172         lfd fp30,((JB_FPRS+16*2)*4)(r3)
173         lwz r31,((JB_GPRS+17)*4)(r3)
174         lfd fp31,((JB_FPRS+17*2)*4)(r3)
175         mr r3,r4
176         blr
177 END (BP_SYM (__longjmp))