fixes for host gcc 4.6.1
[zpugcc/jano.git] / toolchain / gcc / newlib / libc / machine / zpu / setjmp.S
blob13a3ea368156b6a385c7758a9db6e6223ff0dfd4
1 /* 
2  * Copyright (C) 1999, 2000, 2001, 2002 Stephane Carrez (stcarrez@nerim.fr)     
3  *
4  * The authors hereby grant permission to use, copy, modify, distribute,
5  * and license this software and its documentation for any purpose, provided
6  * that existing copyright notices are retained in all copies and that this
7  * notice is included verbatim in any distributions. No written agreement,
8  * license, or royalty fee is required for any of the authorized uses.
9  * Modifications to this software may be copyrighted by their authors
10  * and need not follow the licensing terms described here, provided that
11  * the new terms are clearly indicated on the first page of each file where
12  * they apply.
13  */
16         .text
17         
18         .global setjmp
19         .globl  longjmp
22 setjmp:
23         ; store r0. We won't be needing it, but what the heck.
24         im 0
25         load
26         loadsp 8 ; fetch argument
27         store   
29         ; store r1
30         im 4
31         load
32         loadsp 8 ; fetch argument
33         im 4
34         add
35         store   
37         ; store r2
38         im 8
39         load
40         loadsp 8 ; fetch argument
41         im 8
42         add
43         store   
45         ; store r3
46         im 12
47         load
48         loadsp 8 ; fetch argument
49         im 12
50         add
51         store   
53         ; store r4
54         im 16
55         load
56         loadsp 8 ; fetch argument
57         im 16
58         add
59         store   
61         ; store r5
62         im 20
63         load
64         loadsp 8 ; fetch argument
65         im 20
66         add
67         store   
69         ; store r6
70         im 24
71         load
72         loadsp 8 ; fetch argument
73         im 24
74         add
75         store   
77         ; store r7
78         im 28
79         load
80         loadsp 8 ; fetch argument
81         im 28
82         add
83         store   
85         ; store sp
86         pushsp
87         loadsp 8 ; fetch argument
88         im 8*4
89         add
90         store   
92         ; store return value from this fn into setjmp buffer
93         loadsp 0
94         loadsp 8
95         im 8+8*4
96         add
97         store
99         ; store pc
100         impcrel .Lto
101         pushpc
102         add
103         
104         loadsp 8 ; fetch argument
105         im 4+8*4
106         add
107         store
109         ; set return value to 0
110         im 0
111         nop
112         im 0
113         store
115 .Lto:
116         poppc
119         ; arguments are buffer + return value
120 longjmp:
121         ; load r1
122         loadsp 4
123         im 4
124         add
125         load
126         im 4
127         store
129         ; load r2
130         loadsp 4
131         im 8
132         add
133         load
134         im 8
135         store
136         
137         ; load r3
138         loadsp 4
139         im 12
140         add
141         load
142         im 12
143         store
145         ; load r4
146         loadsp 4
147         im 16
148         add
149         load
150         im 16
151         store
153         ; load r5
154         loadsp 4
155         im 20
156         add
157         load
158         im 20
159         store
161         ; load r6
162         loadsp 4
163         im 24
164         add
165         load
166         im 24
167         store
169         ; load r7
170         loadsp 4
171         im 28
172         add
173         load
174         im 28
175         store
177         ; Danger! here be dragons!
178         ;
179         ; Once we are on the stack from the setjmp, 
180         ; remember that calling convention has destroyed
181         ; the arguments to the setjmp fn.
184         ; copy value of r0(which is decided by the second argument
185         ; to longjmp) to setjmp buffer
186         loadsp 8
187         loadsp 8
188         store
189         
190         ; store pointer to setjmp buffer in r0
191         loadsp 4
192         im 0
193         store
195         ; restore stack
196         loadsp 4
197         im 8*4
198         add
199         load
200         popsp
201         
202         ; Danger! here be dragons!
203         ; have now switched stacks!
204         
205         ; restore return address since it has been destroyed
206         im 0
207         load
208         im 8+8*4
209         add
210         load
211         storesp 4
212         
213         ; push pc onto stack
214         im 0
215         load
216         im 4+8*4
217         add
218         load
220         ; fill in correct value in r0, which we
221         ; take from the setjmp buffer....
222         im 0
223         load
224         load
225         im 0
226         store
227         
228         poppc