PowerPC: Enable POWER8 platform sans hwcap bits.
[glibc.git] / sysdeps / powerpc / powerpc64 / __longjmp-common.S
blob716b8ab7b00a6553d39f1239af9cec50e47df354
1 /* longjmp for PowerPC64.
2    Copyright (C) 1995-2012 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, see
17    <http://www.gnu.org/licenses/>.  */
19 #include <sysdep.h>
20 #define _ASM
21 #define _SETJMP_H
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 #ifndef __NO_VMX__
31         .section        ".toc","aw"
32 .LC__dl_hwcap:
33 # ifdef SHARED
34 #  ifdef IS_IN_rtld
35         /* Inside ld.so we use the local alias to avoid runtime GOT
36            relocations.  */
37         .tc _rtld_local_ro[TC],_rtld_local_ro
38 #  else
39         .tc _rtld_global_ro[TC],_rtld_global_ro
40 #  endif
41 # else
42         .tc _dl_hwcap[TC],_dl_hwcap
43 # endif
44         .section ".text"
45 #endif
47         .machine        "altivec"
48 ENTRY (BP_SYM (__longjmp))
49         CALL_MCOUNT 2
50         CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
51 #ifndef __NO_VMX__
52         ld    r5,.LC__dl_hwcap@toc(r2)
53 # ifdef SHARED
54         /* Load _rtld-global._dl_hwcap.  */
55         ld    r5,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET(r5)
56 # else
57         ld    r5,0(r5) /* Load extern _dl_hwcap.  */
58 # endif
59         andis.  r5,r5,(PPC_FEATURE_HAS_ALTIVEC >> 16)
60         beq     L(no_vmx)
61         la      r5,((JB_VRS)*8)(3)
62         andi.   r6,r5,0xf
63         lwz     r0,((JB_VRSAVE)*8)(3)
64         mtspr   VRSAVE,r0
65         beq+    L(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 L(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 #if defined PTR_DEMANGLE || defined CHECK_SP
116         ld r22,(JB_GPR1*8)(r3)
117 #else
118         ld r1,(JB_GPR1*8)(r3)
119 #endif
120 #ifdef PTR_DEMANGLE
121 # ifdef CHECK_SP
122         PTR_DEMANGLE3 (r22, r22, r25)
123 # else
124         PTR_DEMANGLE3 (r1, r22, r25)
125 # endif
126 #endif
127 #ifdef CHECK_SP
128         CHECK_SP (r22)
129         mr r1,r22
130 #endif
131         ld r2,(JB_GPR2*8)(r3)
132         ld r0,(JB_LR*8)(r3)
133         ld r14,((JB_GPRS+0)*8)(r3)
134         lfd fp14,((JB_FPRS+0)*8)(r3)
135 #if defined SHARED && !defined IS_IN_rtld
136         std r2,40(r1)   /* Restore the callers TOC save area.  */
137 #endif
138         ld r15,((JB_GPRS+1)*8)(r3)
139         lfd fp15,((JB_FPRS+1)*8)(r3)
140         ld r16,((JB_GPRS+2)*8)(r3)
141         lfd fp16,((JB_FPRS+2)*8)(r3)
142         ld r17,((JB_GPRS+3)*8)(r3)
143         lfd fp17,((JB_FPRS+3)*8)(r3)
144         ld r18,((JB_GPRS+4)*8)(r3)
145         lfd fp18,((JB_FPRS+4)*8)(r3)
146         ld r19,((JB_GPRS+5)*8)(r3)
147         lfd fp19,((JB_FPRS+5)*8)(r3)
148         ld r20,((JB_GPRS+6)*8)(r3)
149         lfd fp20,((JB_FPRS+6)*8)(r3)
150 #ifdef PTR_DEMANGLE
151         PTR_DEMANGLE2 (r0, r25)
152 #endif
153         mtlr r0
154 /*      std r2,40(r1)   Restore the TOC save area.  */
155         ld r21,((JB_GPRS+7)*8)(r3)
156         lfd fp21,((JB_FPRS+7)*8)(r3)
157         ld r22,((JB_GPRS+8)*8)(r3)
158         lfd fp22,((JB_FPRS+8)*8)(r3)
159         ld r0,(JB_CR*8)(r3)
160         ld r23,((JB_GPRS+9)*8)(r3)
161         lfd fp23,((JB_FPRS+9)*8)(r3)
162         ld r24,((JB_GPRS+10)*8)(r3)
163         lfd fp24,((JB_FPRS+10)*8)(r3)
164         ld r25,((JB_GPRS+11)*8)(r3)
165         lfd fp25,((JB_FPRS+11)*8)(r3)
166         mtcrf 0xFF,r0
167         ld r26,((JB_GPRS+12)*8)(r3)
168         lfd fp26,((JB_FPRS+12)*8)(r3)
169         ld r27,((JB_GPRS+13)*8)(r3)
170         lfd fp27,((JB_FPRS+13)*8)(r3)
171         ld r28,((JB_GPRS+14)*8)(r3)
172         lfd fp28,((JB_FPRS+14)*8)(r3)
173         ld r29,((JB_GPRS+15)*8)(r3)
174         lfd fp29,((JB_FPRS+15)*8)(r3)
175         ld r30,((JB_GPRS+16)*8)(r3)
176         lfd fp30,((JB_FPRS+16)*8)(r3)
177         ld r31,((JB_GPRS+17)*8)(r3)
178         lfd fp31,((JB_FPRS+17)*8)(r3)
179         mr r3,r4
180         blr
181 END (BP_SYM (__longjmp))