Update copyright dates with scripts/update-copyrights
[glibc.git] / sysdeps / powerpc / powerpc32 / fpu / __longjmp-common.S
blobcb621715f697a6db356167d5b040455210dec619
1 /* longjmp for PowerPC.
2    Copyright (C) 1995-2023 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    <https://www.gnu.org/licenses/>.  */
19 #include <sysdep.h>
20 #include <pointer_guard.h>
21 #include <stap-probe.h>
22 #define _ASM
23 #ifdef __NO_VMX__
24 # include <novmxsetjmp.h>
25 #else
26 # include <jmpbuf-offsets.h>
27 #endif
29         .machine        "altivec"
30 ENTRY (__longjmp_symbol)
31 #ifndef __NO_VMX__
32 # ifdef PIC
33         mflr    r6
34         cfi_register (lr,r6)
35         SETUP_GOT_ACCESS(r5,got_label)
36         addis   r5,r5,_GLOBAL_OFFSET_TABLE_-got_label@ha
37         addi    r5,r5,_GLOBAL_OFFSET_TABLE_-got_label@l
38 #  ifdef SHARED
39 #   if IS_IN (rtld)
40         /* Inside ld.so we use the local alias to avoid runtime GOT
41            relocations.  */
42         lwz     r5,_rtld_local_ro@got(r5)
43 #   else
44         lwz     r5,_rtld_global_ro@got(r5)
45 #   endif
46         mtlr    r6
47         cfi_same_value (lr)
48         lwz     r5,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET+LOWORD(r5)
49 #  else
50         lwz     r5,_dl_hwcap@got(r5)
51         mtlr    r6
52         cfi_same_value (lr)
53         lwz     r5,LOWORD(r5)
54 #  endif
55 # else
56         lis     r5,(_dl_hwcap+LOWORD)@ha
57         lwz     r5,(_dl_hwcap+LOWORD)@l(r5)
58 # endif
59         andis.  r5,r5,(PPC_FEATURE_HAS_ALTIVEC >> 16)
60         beq     L(no_vmx)
61         la      r5,((JB_VRS)*4)(3)
62         andi.   r6,r5,0xf
63         lwz     r0,((JB_VRSAVE)*4)(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         lwz r24,(JB_GPR1*4)(r3)
117 # ifdef CHECK_SP
118 #  ifdef PTR_DEMANGLE
119         PTR_DEMANGLE3 (r24, r24, r25)
120 #  endif
121         CHECK_SP (r24)
122         mr r1,r24
123 # endif
124 #else
125         lwz r1,(JB_GPR1*4)(r3)
126 #endif
127         lwz r0,(JB_LR*4)(r3)
128         lwz r14,((JB_GPRS+0)*4)(r3)
129         lfd fp14,((JB_FPRS+0*2)*4)(r3)
130         lwz r15,((JB_GPRS+1)*4)(r3)
131         lfd fp15,((JB_FPRS+1*2)*4)(r3)
132         lwz r16,((JB_GPRS+2)*4)(r3)
133         lfd fp16,((JB_FPRS+2*2)*4)(r3)
134         lwz r17,((JB_GPRS+3)*4)(r3)
135         lfd fp17,((JB_FPRS+3*2)*4)(r3)
136         lwz r18,((JB_GPRS+4)*4)(r3)
137         lfd fp18,((JB_FPRS+4*2)*4)(r3)
138         lwz r19,((JB_GPRS+5)*4)(r3)
139         lfd fp19,((JB_FPRS+5*2)*4)(r3)
140         lwz r20,((JB_GPRS+6)*4)(r3)
141         lfd fp20,((JB_FPRS+6*2)*4)(r3)
142 #ifdef PTR_DEMANGLE
143 # ifndef CHECK_SP
144         PTR_DEMANGLE3 (r1, r24, r25)
145 # endif
146         PTR_DEMANGLE2 (r0, r25)
147 #endif
148         /* longjmp/longjmp_target probe expects longjmp first argument (4@3),
149            second argument (-4@4), and target address (4@0), respectively.  */
150         LIBC_PROBE (longjmp, 3, 4@3, -4@4, 4@0)
151         mtlr r0
152         lwz r21,((JB_GPRS+7)*4)(r3)
153         lfd fp21,((JB_FPRS+7*2)*4)(r3)
154         lwz r22,((JB_GPRS+8)*4)(r3)
155         lfd fp22,((JB_FPRS+8*2)*4)(r3)
156         lwz r5,(JB_CR*4)(r3)
157         lwz r23,((JB_GPRS+9)*4)(r3)
158         lfd fp23,((JB_FPRS+9*2)*4)(r3)
159         lwz r24,((JB_GPRS+10)*4)(r3)
160         lfd fp24,((JB_FPRS+10*2)*4)(r3)
161         lwz r25,((JB_GPRS+11)*4)(r3)
162         lfd fp25,((JB_FPRS+11*2)*4)(r3)
163         mtcrf 0xFF,r5
164         lwz r26,((JB_GPRS+12)*4)(r3)
165         lfd fp26,((JB_FPRS+12*2)*4)(r3)
166         lwz r27,((JB_GPRS+13)*4)(r3)
167         lfd fp27,((JB_FPRS+13*2)*4)(r3)
168         lwz r28,((JB_GPRS+14)*4)(r3)
169         lfd fp28,((JB_FPRS+14*2)*4)(r3)
170         lwz r29,((JB_GPRS+15)*4)(r3)
171         lfd fp29,((JB_FPRS+15*2)*4)(r3)
172         lwz r30,((JB_GPRS+16)*4)(r3)
173         lfd fp30,((JB_FPRS+16*2)*4)(r3)
174         lwz r31,((JB_GPRS+17)*4)(r3)
175         lfd fp31,((JB_FPRS+17*2)*4)(r3)
176         LIBC_PROBE (longjmp_target, 3, 4@3, -4@4, 4@0)
177         mr r3,r4
178         blr
179 END (__longjmp_symbol)