* elf/tst-tls8.c (do_test): Use $ORIGIN in module names.
[glibc.git] / sysdeps / powerpc / powerpc32 / fpu / __longjmp-common.S
blob644e626aa88f2bef465787e0e53090d6572eaafd
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.
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 #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         cfi_register (lr,r6)
38 #  ifdef HAVE_ASM_PPC_REL16
39         bcl     20,31,1f
40 1:      mflr    r5
41         addis   r5,r5,_GLOBAL_OFFSET_TABLE_-1b@ha
42         addi    r5,r5,_GLOBAL_OFFSET_TABLE_-1b@l
43 #  else
44         bl      _GLOBAL_OFFSET_TABLE_@local-4
45         mflr    r5
46 #  endif
47 #  ifdef SHARED
48         lwz     r5,_rtld_global_ro@got(r5)
49         mtlr    r6
50         cfi_same_value (lr)
51         lwz     r5,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET(r5)
52 #  else
53         lwz     r5,_dl_hwcap@got(r5)
54         mtlr    r6
55         cfi_same_value (lr)
56         lwz     r5,0(r5)
57 #  endif
58 # else
59         lis     r5,_dl_hwcap@ha
60         lwz     r5,_dl_hwcap@l(r5)
61 # endif
62         andis.  r5,r5,(PPC_FEATURE_HAS_ALTIVEC >> 16)
63         beq     L(no_vmx)
64         la      r5,((JB_VRS)*4)(3)
65         andi.   r6,r5,0xf
66         lwz     r0,((JB_VRSAVE)*4)(3)
67         mtspr   VRSAVE,r0
68         beq+    aligned_restore_vmx
69         addi    r6,r5,16
70         lvsl    v0,0,r5
71         lvx     v1,0,r5
72         addi    r5,r5,32
73         lvx     v21,0,r6
74         vperm   v20,v1,v21,v0
75 # define load_misaligned_vmx_lo_loaded(loadvr,lovr,shiftvr,loadgpr,addgpr) \
76         addi    addgpr,addgpr,32; \
77         lvx     lovr,0,loadgpr; \
78         vperm   loadvr,loadvr,lovr,shiftvr;
79         load_misaligned_vmx_lo_loaded(v21,v22,v0,r5,r6)
80         load_misaligned_vmx_lo_loaded(v22,v23,v0,r6,r5)
81         load_misaligned_vmx_lo_loaded(v23,v24,v0,r5,r6)
82         load_misaligned_vmx_lo_loaded(v24,v25,v0,r6,r5)
83         load_misaligned_vmx_lo_loaded(v25,v26,v0,r5,r6)
84         load_misaligned_vmx_lo_loaded(v26,v27,v0,r6,r5)
85         load_misaligned_vmx_lo_loaded(v27,v28,v0,r5,r6)
86         load_misaligned_vmx_lo_loaded(v28,v29,v0,r6,r5)
87         load_misaligned_vmx_lo_loaded(v29,v30,v0,r5,r6)
88         load_misaligned_vmx_lo_loaded(v30,v31,v0,r6,r5)
89         lvx     v1,0,r5
90         vperm   v31,v31,v1,v0
91         b       L(no_vmx)
92 aligned_restore_vmx:
93         addi    r6,r5,16
94         lvx     v20,0,r5
95         addi    r5,r5,32
96         lvx     v21,0,r6
97         addi    r6,r6,32
98         lvx     v22,0,r5
99         addi    r5,r5,32
100         lvx     v23,0,r6
101         addi    r6,r6,32
102         lvx     v24,0,r5
103         addi    r5,r5,32
104         lvx     v25,0,r6
105         addi    r6,r6,32
106         lvx     v26,0,r5
107         addi    r5,r5,32
108         lvx     v27,0,r6
109         addi    r6,r6,32
110         lvx     v28,0,r5
111         addi    r5,r5,32
112         lvx     v29,0,r6
113         addi    r6,r6,32
114         lvx     v30,0,r5
115         lvx     v31,0,r6
116 L(no_vmx):
117 #endif
118         lwz r1,(JB_GPR1*4)(r3)
119         lwz r0,(JB_LR*4)(r3)
120         lwz r14,((JB_GPRS+0)*4)(r3)
121         lfd fp14,((JB_FPRS+0*2)*4)(r3)
122         lwz r15,((JB_GPRS+1)*4)(r3)
123         lfd fp15,((JB_FPRS+1*2)*4)(r3)
124         lwz r16,((JB_GPRS+2)*4)(r3)
125         lfd fp16,((JB_FPRS+2*2)*4)(r3)
126         lwz r17,((JB_GPRS+3)*4)(r3)
127         lfd fp17,((JB_FPRS+3*2)*4)(r3)
128         lwz r18,((JB_GPRS+4)*4)(r3)
129         lfd fp18,((JB_FPRS+4*2)*4)(r3)
130         lwz r19,((JB_GPRS+5)*4)(r3)
131         lfd fp19,((JB_FPRS+5*2)*4)(r3)
132         lwz r20,((JB_GPRS+6)*4)(r3)
133         lfd fp20,((JB_FPRS+6*2)*4)(r3)
134 #ifdef PTR_DEMANGLE
135         PTR_DEMANGLE (r0, r25)
136         PTR_DEMANGLE2 (r1, r25)
137 #endif
138         mtlr r0
139         lwz r21,((JB_GPRS+7)*4)(r3)
140         lfd fp21,((JB_FPRS+7*2)*4)(r3)
141         lwz r22,((JB_GPRS+8)*4)(r3)
142         lfd fp22,((JB_FPRS+8*2)*4)(r3)
143         lwz r0,(JB_CR*4)(r3)
144         lwz r23,((JB_GPRS+9)*4)(r3)
145         lfd fp23,((JB_FPRS+9*2)*4)(r3)
146         lwz r24,((JB_GPRS+10)*4)(r3)
147         lfd fp24,((JB_FPRS+10*2)*4)(r3)
148         lwz r25,((JB_GPRS+11)*4)(r3)
149         lfd fp25,((JB_FPRS+11*2)*4)(r3)
150         mtcrf 0xFF,r0
151         lwz r26,((JB_GPRS+12)*4)(r3)
152         lfd fp26,((JB_FPRS+12*2)*4)(r3)
153         lwz r27,((JB_GPRS+13)*4)(r3)
154         lfd fp27,((JB_FPRS+13*2)*4)(r3)
155         lwz r28,((JB_GPRS+14)*4)(r3)
156         lfd fp28,((JB_FPRS+14*2)*4)(r3)
157         lwz r29,((JB_GPRS+15)*4)(r3)
158         lfd fp29,((JB_FPRS+15*2)*4)(r3)
159         lwz r30,((JB_GPRS+16)*4)(r3)
160         lfd fp30,((JB_FPRS+16*2)*4)(r3)
161         lwz r31,((JB_GPRS+17)*4)(r3)
162         lfd fp31,((JB_FPRS+17*2)*4)(r3)
163         mr r3,r4
164         blr
165 END (BP_SYM (__longjmp))