Imported Upstream version 3.4
[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 __sigsetjmp:
82         //.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)
83         alloc loc1=ar.pfs,2,2,2,0
84         mov r16=ar.unat
85         ;;
86         mov r17=ar.fpsr
87         mov r2=in0
88         add r3=8,in0
89         ;;
90         st8.spill.nta [r2]=sp,16        // r12 (sp)
91         st8.spill.nta [r3]=gp,16        // r1 (gp)
92         ;;
93         st8.nta [r2]=r16,16             // save caller's unat
94         st8.nta [r3]=r17,16             // save fpsr
95         add r8=0xa0,in0
96         ;;
97         st8.spill.nta [r2]=r4,16        // r4
98         st8.spill.nta [r3]=r5,16        // r5
99         add r9=0xb0,in0
100         ;;
101         stf.spill.nta [r8]=f2,32
102         stf.spill.nta [r9]=f3,32
103         mov loc0=rp
104         .body
105         ;;
106         stf.spill.nta [r8]=f4,32
107         stf.spill.nta [r9]=f5,32
108         mov r17=b1
109         ;;
110         stf.spill.nta [r8]=f16,32
111         stf.spill.nta [r9]=f17,32
112         mov r18=b2
113         ;;
114         stf.spill.nta [r8]=f18,32
115         stf.spill.nta [r9]=f19,32
116         mov r19=b3
117         ;;
118         stf.spill.nta [r8]=f20,32
119         stf.spill.nta [r9]=f21,32
120         mov r20=b4
121         ;;
122         stf.spill.nta [r8]=f22,32
123         stf.spill.nta [r9]=f23,32
124         mov r21=b5
125         ;;
126         stf.spill.nta [r8]=f24,32
127         stf.spill.nta [r9]=f25,32
128         mov r22=ar.lc
129         ;;
130         stf.spill.nta [r8]=f26,32
131         stf.spill.nta [r9]=f27,32
132         mov r24=pr
133         ;;
134         stf.spill.nta [r8]=f28,32
135         stf.spill.nta [r9]=f29,32
136         ;;
137         stf.spill.nta [r8]=f30
138         stf.spill.nta [r9]=f31
139
140         st8.spill.nta [r2]=r6,16        // r6
141         st8.spill.nta [r3]=r7,16        // r7
142         ;;
143         mov r23=ar.bsp
144         mov r25=ar.unat
145         mov out0=in0
146
147         st8.nta [r2]=loc0,16            // b0
148         st8.nta [r3]=r17,16             // b1
149         mov out1=in1
150         ;;
151         st8.nta [r2]=r18,16             // b2
152         st8.nta [r3]=r19,16             // b3
153         ;;
154         st8.nta [r2]=r20,16             // b4
155         st8.nta [r3]=r21,16             // b5
156         ;;
157         st8.nta [r2]=loc1,16            // ar.pfs
158         st8.nta [r3]=r22,16             // ar.lc
159         ;;
160         st8.nta [r2]=r24,16             // pr
161         st8.nta [r3]=r23,16             // ar.bsp
162         ;;
163         st8.nta [r2]=r25                // ar.unat
164         st8.nta [r3]=in0                // &__jmp_buf
165         mov r8=0
166         mov rp=loc0
167         mov ar.pfs=loc1
168         br.ret.sptk.many rp
169
170         .endp __sigsetjmp