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