Imported Upstream version 3.10
[debian/elilo] / ia64 / setjmp.S
1 /* Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
2    Contributed by David Mosberger-Tang <davidm@hpl.hp.com>.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 USA.
18
19    The layout of the jmp_buf is as follows.  This is subject to change
20    and user-code should never depend on the particular layout of
21    jmp_buf!
22
23
24         offset: description:
25         ------- ------------
26         0x000   stack pointer (r12)     ; unchangeable (see _JMPBUF_UNWINDS)
27         0x008   r1 (gp)
28         0x010   caller's unat
29         0x018   fpsr
30         0x020   r4
31         0x028   r5
32         0x030   r6
33         0x038   r7
34         0x040   rp (b0)
35         0x048   b1
36         0x050   b2
37         0x058   b3
38         0x060   b4
39         0x068   b5
40         0x070   ar.pfs
41         0x078   ar.lc
42         0x080   pr
43         0x088   ar.bsp                  ; unchangeable (see __longjmp.S)
44         0x090   ar.unat
45         0x098   &__jmp_buf      ; address of the jmpbuf (needed to locate NaT bits in unat)
46         0x0a0    f2
47         0x0b0    f3
48         0x0c0    f4
49         0x0d0    f5
50         0x0e0   f16
51         0x0f0   f17
52         0x100   f18
53         0x110   f19
54         0x120   f20
55         0x130   f21
56         0x130   f22
57         0x140   f23
58         0x150   f24
59         0x160   f25
60         0x170   f26
61         0x180   f27
62         0x190   f28
63         0x1a0   f29
64         0x1b0   f30
65         0x1c0   f31 */
66
67
68         /* The following two entry points are the traditional entry points: */
69
70         .text
71         .global setjmp
72         .proc setjmp
73 setjmp:
74         alloc r8=ar.pfs,2,0,0,0
75         mov in1=1
76         br.cond.sptk.many __sigsetjmp
77         .endp setjmp
78
79         /* __sigsetjmp(__jmp_buf buf, int savemask) */
80
81         .proc __sigsetjmp
82 __sigsetjmp:
83         //.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)
84         .body
85         alloc loc1=ar.pfs,2,2,2,0
86         mov r16=ar.unat
87         ;;
88         mov r17=ar.fpsr
89         mov r2=in0
90         add r3=8,in0
91         ;;
92         st8.spill.nta [r2]=sp,16        // r12 (sp)
93         ;;
94         st8.spill.nta [r3]=gp,16        // r1 (gp)
95         ;;
96         st8.nta [r2]=r16,16             // save caller's unat
97         st8.nta [r3]=r17,16             // save fpsr
98         add r8=0xa0,in0
99         ;;
100         st8.spill.nta [r2]=r4,16        // r4
101         ;;
102         st8.spill.nta [r3]=r5,16        // r5
103         add r9=0xb0,in0
104         ;;
105         stf.spill.nta [r8]=f2,32
106         stf.spill.nta [r9]=f3,32
107         mov loc0=rp
108         ;;
109         stf.spill.nta [r8]=f4,32
110         stf.spill.nta [r9]=f5,32
111         mov r17=b1
112         ;;
113         stf.spill.nta [r8]=f16,32
114         stf.spill.nta [r9]=f17,32
115         mov r18=b2
116         ;;
117         stf.spill.nta [r8]=f18,32
118         stf.spill.nta [r9]=f19,32
119         mov r19=b3
120         ;;
121         stf.spill.nta [r8]=f20,32
122         stf.spill.nta [r9]=f21,32
123         mov r20=b4
124         ;;
125         stf.spill.nta [r8]=f22,32
126         stf.spill.nta [r9]=f23,32
127         mov r21=b5
128         ;;
129         stf.spill.nta [r8]=f24,32
130         stf.spill.nta [r9]=f25,32
131         mov r22=ar.lc
132         ;;
133         stf.spill.nta [r8]=f26,32
134         stf.spill.nta [r9]=f27,32
135         mov r24=pr
136         ;;
137         stf.spill.nta [r8]=f28,32
138         stf.spill.nta [r9]=f29,32
139         ;;
140         stf.spill.nta [r8]=f30
141         stf.spill.nta [r9]=f31
142
143         st8.spill.nta [r2]=r6,16        // r6
144         ;;
145         st8.spill.nta [r3]=r7,16        // r7
146         ;;
147         mov r23=ar.bsp
148         mov r25=ar.unat
149         mov out0=in0
150
151         st8.nta [r2]=loc0,16            // b0
152         st8.nta [r3]=r17,16             // b1
153         mov out1=in1
154         ;;
155         st8.nta [r2]=r18,16             // b2
156         st8.nta [r3]=r19,16             // b3
157         ;;
158         st8.nta [r2]=r20,16             // b4
159         st8.nta [r3]=r21,16             // b5
160         ;;
161         st8.nta [r2]=loc1,16            // ar.pfs
162         st8.nta [r3]=r22,16             // ar.lc
163         ;;
164         st8.nta [r2]=r24,16             // pr
165         st8.nta [r3]=r23,16             // ar.bsp
166         ;;
167         st8.nta [r2]=r25                // ar.unat
168         st8.nta [r3]=in0                // &__jmp_buf
169         mov r8=0
170         mov rp=loc0
171         mov ar.pfs=loc1
172         br.ret.sptk.many rp
173
174         .endp __sigsetjmp