Implement C23 <stdbit.h>
[glibc.git] / sysdeps / unix / sysv / linux / ia64 / setjmp.S
blob487cdd4b0c2b8d239e20ec4d038f79b45d2e869f
1 /* Copyright (C) 1999-2024 Free Software Foundation, Inc.
3    The GNU C Library is free software; you can redistribute it and/or
4    modify it under the terms of the GNU Lesser General Public
5    License as published by the Free Software Foundation; either
6    version 2.1 of the License, or (at your option) any later version.
8    The GNU C Library is distributed in the hope that it will be useful,
9    but WITHOUT ANY WARRANTY; without even the implied warranty of
10    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11    Lesser General Public License for more details.
13    You should have received a copy of the GNU Lesser General Public
14    License along with the GNU C Library; if not, see
15    <https://www.gnu.org/licenses/>.
17    The layout of the jmp_buf is as follows.  This is subject to change
18    and user-code should never depend on the particular layout of
19    jmp_buf!
22         offset: description:
23         ------- ------------
24         0x000   stack pointer (r12)     ; unchangeable (see _JMPBUF_UNWINDS)
25         0x008   r1 (gp)
26         0x010   caller's unat
27         0x018   fpsr                    ; disabled per the C standard; BZ 16379
28         0x020   r4
29         0x028   r5
30         0x030   r6
31         0x038   r7
32         0x040   rp (b0)
33         0x048   b1
34         0x050   b2
35         0x058   b3
36         0x060   b4
37         0x068   b5
38         0x070   ar.pfs
39         0x078   ar.lc
40         0x080   pr
41         0x088   ar.bsp                  ; unchangeable (see __longjmp.S)
42         0x090   ar.unat
43         0x098   &__jmp_buf      ; address of the jmpbuf (needed to locate NaT bits in unat)
44         0x0a0    f2
45         0x0b0    f3
46         0x0c0    f4
47         0x0d0    f5
48         0x0e0   f16
49         0x0f0   f17
50         0x100   f18
51         0x110   f19
52         0x120   f20
53         0x130   f21
54         0x130   f22
55         0x140   f23
56         0x150   f24
57         0x160   f25
58         0x170   f26
59         0x180   f27
60         0x190   f28
61         0x1a0   f29
62         0x1b0   f30
63         0x1c0   f31 */
65 #include <sysdep.h>
66 #include <pointer_guard.h>
67 #include <features.h>
69         /* The following two entry points are the traditional entry points: */
71 LEAF(setjmp)
72         alloc r8=ar.pfs,2,0,0,0
73         mov in1=1
74         br.cond.sptk.many HIDDEN_JUMPTARGET(__sigsetjmp)
75 END(setjmp)
77 LEAF(_setjmp)
78         alloc r8=ar.pfs,2,0,0,0
79         mov in1=0
80         br.cond.sptk.many HIDDEN_JUMPTARGET(__sigsetjmp)
81 END(_setjmp)
82 libc_hidden_def (_setjmp)
84         /* __sigsetjmp(__jmp_buf buf, int savemask) */
86 ENTRY(__sigsetjmp)
87         .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)
88         alloc loc1=ar.pfs,2,5,2,0
89         .save ar.unat, loc2
90         mov loc2=ar.unat
91         ;;
92 //      mov r17=ar.fpsr
93         mov r2=in0
94         add r3=8,in0
95         ;;
96 .mem.offset 8,0;        st8.spill.nta [r2]=sp,16        // r12 (sp)
97 .mem.offset 0,0;        st8.spill.nta [r3]=gp,32        // r1 (gp)
98         ;;
99         st8.nta [r2]=loc2,16            // save caller's unat
100 //      st8.nta [r3]=r17,16             // save fpsr
101         add r8=0xa0,in0
102         ;;
103 .mem.offset 8,0;        st8.spill.nta [r2]=r4,16        // r4
104 .mem.offset 0,0;        st8.spill.nta [r3]=r5,16        // r5
105         add r9=0xb0,in0
106         ;;
107         stf.spill.nta [r8]=f2,32
108         stf.spill.nta [r9]=f3,32
109         mov loc0=rp
110         .body
111         ;;
112         stf.spill.nta [r8]=f4,32
113         stf.spill.nta [r9]=f5,32
114         mov r17=b1
115         ;;
116         stf.spill.nta [r8]=f16,32
117         stf.spill.nta [r9]=f17,32
118         mov r18=b2
119         ;;
120         stf.spill.nta [r8]=f18,32
121         stf.spill.nta [r9]=f19,32
122         mov r19=b3
123         ;;
124         stf.spill.nta [r8]=f20,32
125         stf.spill.nta [r9]=f21,32
126         mov r20=b4
127         ;;
128         stf.spill.nta [r8]=f22,32
129         stf.spill.nta [r9]=f23,32
130         mov r21=b5
131         ;;
132         stf.spill.nta [r8]=f24,32
133         stf.spill.nta [r9]=f25,32
134         mov r22=ar.lc
135         ;;
136         stf.spill.nta [r8]=f26,32
137         stf.spill.nta [r9]=f27,32
138         mov r24=pr
139         ;;
140         stf.spill.nta [r8]=f28,32
141         stf.spill.nta [r9]=f29,32
142 #ifdef PTR_MANGLE
143         mov loc3=loc0
144         ;;
145         PTR_MANGLE (loc3, loc4)
146 #else
147         ;;
148 #endif
149         stf.spill.nta [r8]=f30
150         stf.spill.nta [r9]=f31
152 .mem.offset 8,0;        st8.spill.nta [r2]=r6,16        // r6
153 .mem.offset 0,0;        st8.spill.nta [r3]=r7,16        // r7
154         ;;
155         mov r23=ar.bsp
156         mov r25=ar.unat
157         mov out0=in0
159 #ifdef PTR_MANGLE
160         st8.nta [r2]=loc3,16            // b0
161 #else
162         st8.nta [r2]=loc0,16            // b0
163 #endif
164         st8.nta [r3]=r17,16             // b1
165         mov out1=in1
166         ;;
167         st8.nta [r2]=r18,16             // b2
168         st8.nta [r3]=r19,16             // b3
169         ;;
170         st8.nta [r2]=r20,16             // b4
171         st8.nta [r3]=r21,16             // b5
172         ;;
173         st8.nta [r2]=loc1,16            // ar.pfs
174         st8.nta [r3]=r22,16             // ar.lc
175         ;;
176         st8.nta [r2]=r24,16             // pr
177         st8.nta [r3]=r23,16             // ar.bsp
178         ;;
179         st8.nta [r2]=r25                // ar.unat
180         st8.nta [r3]=in0                // &__jmp_buf
181 #if IS_IN (rtld)
182         /* In ld.so we never save the signal mask.  */
183         ;;
184 #else
185         br.call.dpnt.few rp=__sigjmp_save
186 #endif
187 .ret0:                                  // force a new bundle ::q
188         mov.m ar.unat=loc2              // restore caller's unat
189         mov rp=loc0
190         mov ar.pfs=loc1
191         mov r8=0
192         ret
193 END(__sigsetjmp)
194 libc_hidden_def (__sigsetjmp)
195 rtld_hidden_def (__sigsetjmp)
197 weak_extern(_setjmp)
198 weak_extern(setjmp)