[BZ #341] (O_NOATIME): Define.
[glibc.git] / sysdeps / powerpc / powerpc64 / __longjmp-common.S
blobb11a0fd7b53a437ebb0ed6aab1eb86392ef527d4
1 /* longjmp for PowerPC64.
2    Copyright (C) 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2004
3    Free Software Foundation, Inc.
4    This file is part of the GNU C Library.
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
11    The GNU C Library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
16    You should have received a copy of the GNU Lesser General Public
17    License along with the GNU C Library; if not, write to the Free
18    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19    02111-1307 USA.  */
21 #include <sysdep.h>
22 #define _ASM
23 #define _SETJMP_H
24 #ifdef __NO_VMX__
25 # include <novmxsetjmp.h>
26 #else
27 # include <bits/setjmp.h>
28 #endif
29 #include <bp-sym.h>
30 #include <bp-asm.h>
32 #ifndef __NO_VMX__
33         .section        ".toc","aw"
34 .LC__dl_hwcap:
35 # ifdef SHARED
36         .tc _rtld_global_ro[TC],_rtld_global_ro
37 # else
38         .tc _dl_hwcap[TC],_dl_hwcap
39 # endif
40         .section ".text"
41 #endif
43         .machine        "altivec"
44 ENTRY (BP_SYM (__longjmp))
45         CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
46 #ifndef __NO_VMX__
47         ld    r5,.LC__dl_hwcap@toc(r2)
48 # ifdef SHARED
49         /* Load _rtld-global._dl_hwcap.  */
50         ld    r5,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET(r5)
51 # else
52         ld    r5,0(r5) /* Load extern _dl_hwcap.  */
53 # endif
54         andis.  r5,r5,(PPC_FEATURE_HAS_ALTIVEC >> 16)
55         beq     no_vmx
56         la      r5,((JB_VRS)*8)(3)
57         andi.   r6,r5,0xf
58         lwz     r0,((JB_VRSAVE)*8)(3)
59         mtspr   VRSAVE,r0
60         beq+    aligned_restore_vmx
61         addi    r6,r5,16
62         lvsl    v0,0,r5
63         lvx     v1,0,r5
64         addi    r5,r5,32
65         lvx     v21,0,r6
66         vperm   v20,v1,v21,v0
67 # define load_misaligned_vmx_lo_loaded(loadvr,lovr,shiftvr,loadgpr,addgpr) \
68         addi    addgpr,addgpr,32; \
69         lvx     lovr,0,loadgpr; \
70         vperm   loadvr,loadvr,lovr,shiftvr;
71         load_misaligned_vmx_lo_loaded(v21,v22,v0,r5,r6)
72         load_misaligned_vmx_lo_loaded(v22,v23,v0,r6,r5)
73         load_misaligned_vmx_lo_loaded(v23,v24,v0,r5,r6)
74         load_misaligned_vmx_lo_loaded(v24,v25,v0,r6,r5)
75         load_misaligned_vmx_lo_loaded(v25,v26,v0,r5,r6)
76         load_misaligned_vmx_lo_loaded(v26,v27,v0,r6,r5)
77         load_misaligned_vmx_lo_loaded(v27,v28,v0,r5,r6)
78         load_misaligned_vmx_lo_loaded(v28,v29,v0,r6,r5)
79         load_misaligned_vmx_lo_loaded(v29,v30,v0,r5,r6)
80         load_misaligned_vmx_lo_loaded(v30,v31,v0,r6,r5)
81         lvx     v1,0,r5
82         vperm   v31,v31,v1,v0
83         b       no_vmx
84 aligned_restore_vmx:
85         addi    r6,r5,16
86         lvx     v20,0,r5
87         addi    r5,r5,32
88         lvx     v21,0,r6
89         addi    r6,r6,32
90         lvx     v22,0,r5
91         addi    r5,r5,32
92         lvx     v23,0,r6
93         addi    r6,r6,32
94         lvx     v24,0,r5
95         addi    r5,r5,32
96         lvx     v25,0,r6
97         addi    r6,r6,32
98         lvx     v26,0,r5
99         addi    r5,r5,32
100         lvx     v27,0,r6
101         addi    r6,r6,32
102         lvx     v28,0,r5
103         addi    r5,r5,32
104         lvx     v29,0,r6
105         addi    r6,r6,32
106         lvx     v30,0,r5
107         lvx     v31,0,r6
108 no_vmx:
109 #endif
110         ld r1,(JB_GPR1*8)(r3)
111         ld r2,(JB_GPR2*8)(r3)
112         ld r0,(JB_LR*8)(r3)
113         ld r14,((JB_GPRS+0)*8)(r3)
114         lfd fp14,((JB_FPRS+0)*8)(r3)
115 #if defined SHARED && !defined IS_IN_rtld
116         std r2,40(r1)   /* Restore the callers TOC save area.  */
117 #endif
118         ld r15,((JB_GPRS+1)*8)(r3)
119         lfd fp15,((JB_FPRS+1)*8)(r3)
120         ld r16,((JB_GPRS+2)*8)(r3)
121         lfd fp16,((JB_FPRS+2)*8)(r3)
122         ld r17,((JB_GPRS+3)*8)(r3)
123         lfd fp17,((JB_FPRS+3)*8)(r3)
124         ld r18,((JB_GPRS+4)*8)(r3)
125         lfd fp18,((JB_FPRS+4)*8)(r3)
126         ld r19,((JB_GPRS+5)*8)(r3)
127         lfd fp19,((JB_FPRS+5)*8)(r3)
128         ld r20,((JB_GPRS+6)*8)(r3)
129         lfd fp20,((JB_FPRS+6)*8)(r3)
130         mtlr r0
131 /*      std r2,40(r1)   Restore the TOC save area.  */
132         ld r21,((JB_GPRS+7)*8)(r3)
133         lfd fp21,((JB_FPRS+7)*8)(r3)
134         ld r22,((JB_GPRS+8)*8)(r3)
135         lfd fp22,((JB_FPRS+8)*8)(r3)
136         ld r0,(JB_CR*8)(r3)
137         ld r23,((JB_GPRS+9)*8)(r3)
138         lfd fp23,((JB_FPRS+9)*8)(r3)
139         ld r24,((JB_GPRS+10)*8)(r3)
140         lfd fp24,((JB_FPRS+10)*8)(r3)
141         ld r25,((JB_GPRS+11)*8)(r3)
142         lfd fp25,((JB_FPRS+11)*8)(r3)
143         mtcrf 0xFF,r0
144         ld r26,((JB_GPRS+12)*8)(r3)
145         lfd fp26,((JB_FPRS+12)*8)(r3)
146         ld r27,((JB_GPRS+13)*8)(r3)
147         lfd fp27,((JB_FPRS+13)*8)(r3)
148         ld r28,((JB_GPRS+14)*8)(r3)
149         lfd fp28,((JB_FPRS+14)*8)(r3)
150         ld r29,((JB_GPRS+15)*8)(r3)
151         lfd fp29,((JB_FPRS+15)*8)(r3)
152         ld r30,((JB_GPRS+16)*8)(r3)
153         lfd fp30,((JB_FPRS+16)*8)(r3)
154         ld r31,((JB_GPRS+17)*8)(r3)
155         lfd fp31,((JB_FPRS+17)*8)(r3)
156         mr r3,r4
157         blr
158 END (BP_SYM (__longjmp))