* emit-rtl.c (adjust_address_1): Always copy address to avoid
[official-gcc.git] / gcc / config / v850 / lib1funcs.asm
blob621ba60a4868373059d4f3adb80cd72032e21e9b
1 /* libgcc routines for NEC V850.
2 Copyright (C) 1996, 1997 Free Software Foundation, Inc.
4 This file is part of GNU CC.
6 GNU CC is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
9 later version.
11 In addition to the permissions in the GNU General Public License, the
12 Free Software Foundation gives you unlimited permission to link the
13 compiled version of this file into combinations with other programs,
14 and to distribute those combinations without any restriction coming
15 from the use of this file. (The General Public License restrictions
16 do apply in other respects; for example, they cover modification of
17 the file, and distribution when not linked into a combine
18 executable.)
20 This file is distributed in the hope that it will be useful, but
21 WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 General Public License for more details.
25 You should have received a copy of the GNU General Public License
26 along with this program; see the file COPYING. If not, write to
27 the Free Software Foundation, 59 Temple Place - Suite 330,
28 Boston, MA 02111-1307, USA. */
30 #ifdef L_mulsi3
31 .text
32 .globl ___mulsi3
33 .type ___mulsi3,@function
36 * #define SHIFT 12
37 * #define MASK ((1 << SHIFT) - 1)
39 * #define STEP(i, j) \
40 * ({ \
41 * short a_part = (a >> (i)) & MASK; \
42 * short b_part = (b >> (j)) & MASK; \
43 * int res = (((int)a_part) * ((int)b_part)); \
44 * res; \
45 * })
47 * int
48 * __mulsi3 (unsigned a, unsigned b)
49 * {
50 * return STEP (0, 0) +
51 * ((STEP (SHIFT, 0) + STEP (0, SHIFT)) << SHIFT) +
52 * ((STEP (0, 2 * SHIFT) + STEP (SHIFT, SHIFT) + STEP (2 * SHIFT, 0))
53 * << (2 * SHIFT));
54 * }
57 ___mulsi3:
58 mov r6,r13
59 movea lo(4095),r0,r16
60 and r16,r13
61 mov r7,r15
62 and r16,r15
63 mov r13,r10
64 mulh r15,r10
65 shr 12,r6
66 mov r6,r14
67 and r16,r14
68 mov r14,r11
69 mulh r15,r11
70 shr 12,r7
71 mov r7,r12
72 and r16,r12
73 shr 12,r7
74 and r16,r7
75 mulh r13,r7
76 shr 12,r6
77 mulh r12,r13
78 and r16,r6
79 add r13,r11
80 shl 12,r11
81 add r11,r10
82 mov r14,r11
83 mulh r12,r11
84 mulh r15,r6
85 add r11,r7
86 add r6,r7
87 shl 24,r7
88 add r7,r10
89 jmp [r31]
90 .size ___mulsi3,.-___mulsi3
91 #endif
93 #ifdef L_udivsi3
94 .text
95 .global ___udivsi3
96 .type ___udivsi3,@function
97 ___udivsi3:
98 mov 1,r12
99 mov 0,r10
100 cmp r6,r7
101 bnl .L12
102 movhi hi(-2147483648),r0,r13
103 cmp r0,r7
104 blt .L12
105 .L4:
106 shl 1,r7
107 shl 1,r12
108 cmp r6,r7
109 bnl .L12
110 cmp r0,r12
111 be .L8
112 mov r7,r19
113 and r13,r19
114 be .L4
115 br .L12
116 .L9:
117 cmp r7,r6
118 bl .L10
119 sub r7,r6
120 or r12,r10
121 .L10:
122 shr 1,r12
123 shr 1,r7
124 .L12:
125 cmp r0,r12
126 bne .L9
127 .L8:
128 jmp [r31]
129 .size ___udivsi3,.-___udivsi3
130 #endif
132 #ifdef L_divsi3
133 .text
134 .globl ___divsi3
135 .type ___divsi3,@function
136 ___divsi3:
137 add -8,sp
138 st.w r31,4[sp]
139 st.w r22,0[sp]
140 mov 1,r22
141 tst r7,r7
142 bp .L3
143 subr r0,r7
144 subr r0,r22
145 .L3:
146 tst r6,r6
147 bp .L4
148 subr r0,r6
149 subr r0,r22
150 .L4:
151 jarl ___udivsi3,r31
152 cmp r0,r22
153 bp .L7
154 subr r0,r10
155 .L7:
156 ld.w 0[sp],r22
157 ld.w 4[sp],r31
158 add 8,sp
159 jmp [r31]
160 .size ___divsi3,.-___divsi3
161 #endif
163 #ifdef L_umodsi3
164 .text
165 .globl ___umodsi3
166 .type ___umodsi3,@function
167 ___umodsi3:
168 add -12,sp
169 st.w r31,8[sp]
170 st.w r7,4[sp]
171 st.w r6,0[sp]
172 jarl ___udivsi3,r31
173 ld.w 4[sp],r7
174 mov r10,r6
175 jarl ___mulsi3,r31
176 ld.w 0[sp],r6
177 subr r6,r10
178 ld.w 8[sp],r31
179 add 12,sp
180 jmp [r31]
181 .size ___umodsi3,.-___umodsi3
182 #endif /* L_umodsi3 */
184 #ifdef L_modsi3
185 .text
186 .globl ___modsi3
187 .type ___modsi3,@function
188 ___modsi3:
189 add -12,sp
190 st.w r31,8[sp]
191 st.w r7,4[sp]
192 st.w r6,0[sp]
193 jarl ___divsi3,r31
194 ld.w 4[sp],r7
195 mov r10,r6
196 jarl ___mulsi3,r31
197 ld.w 0[sp],r6
198 subr r6,r10
199 ld.w 8[sp],r31
200 add 12,sp
201 jmp [r31]
202 .size ___modsi3,.-___modsi3
203 #endif /* L_modsi3 */
205 #ifdef L_save_2
206 .text
207 .align 2
208 .globl __save_r2_r29
209 .type __save_r2_r29,@function
210 /* Allocate space and save registers 2, 20 .. 29 on the stack */
211 /* Called via: jalr __save_r2_r29,r10 */
212 __save_r2_r29:
213 mov ep,r1
214 addi -44,sp,sp
215 mov sp,ep
216 sst.w r29,0[ep]
217 sst.w r28,4[ep]
218 sst.w r27,8[ep]
219 sst.w r26,12[ep]
220 sst.w r25,16[ep]
221 sst.w r24,20[ep]
222 sst.w r23,24[ep]
223 sst.w r22,28[ep]
224 sst.w r21,32[ep]
225 sst.w r20,36[ep]
226 sst.w r2,40[ep]
227 mov r1,ep
228 jmp [r10]
229 .size __save_r2_r29,.-__save_r2_r29
231 /* Restore saved registers, deallocate stack and return to the user */
232 /* Called via: jr __return_r2_r29 */
233 .align 2
234 .globl __return_r2_r29
235 .type __return_r2_r29,@function
236 __return_r2_r29:
237 mov ep,r1
238 mov sp,ep
239 sld.w 0[ep],r29
240 sld.w 4[ep],r28
241 sld.w 8[ep],r27
242 sld.w 12[ep],r26
243 sld.w 16[ep],r25
244 sld.w 20[ep],r24
245 sld.w 24[ep],r23
246 sld.w 28[ep],r22
247 sld.w 32[ep],r21
248 sld.w 36[ep],r20
249 sld.w 40[ep],r2
250 addi 44,sp,sp
251 mov r1,ep
252 jmp [r31]
253 .size __return_r2_r29,.-__return_r2_r29
254 #endif /* L_save_2 */
256 #ifdef L_save_20
257 .text
258 .align 2
259 .globl __save_r20_r29
260 .type __save_r20_r29,@function
261 /* Allocate space and save registers 20 .. 29 on the stack */
262 /* Called via: jalr __save_r20_r29,r10 */
263 __save_r20_r29:
264 mov ep,r1
265 addi -40,sp,sp
266 mov sp,ep
267 sst.w r29,0[ep]
268 sst.w r28,4[ep]
269 sst.w r27,8[ep]
270 sst.w r26,12[ep]
271 sst.w r25,16[ep]
272 sst.w r24,20[ep]
273 sst.w r23,24[ep]
274 sst.w r22,28[ep]
275 sst.w r21,32[ep]
276 sst.w r20,36[ep]
277 mov r1,ep
278 jmp [r10]
279 .size __save_r20_r29,.-__save_r20_r29
281 /* Restore saved registers, deallocate stack and return to the user */
282 /* Called via: jr __return_r20_r29 */
283 .align 2
284 .globl __return_r20_r29
285 .type __return_r20_r29,@function
286 __return_r20_r29:
287 mov ep,r1
288 mov sp,ep
289 sld.w 0[ep],r29
290 sld.w 4[ep],r28
291 sld.w 8[ep],r27
292 sld.w 12[ep],r26
293 sld.w 16[ep],r25
294 sld.w 20[ep],r24
295 sld.w 24[ep],r23
296 sld.w 28[ep],r22
297 sld.w 32[ep],r21
298 sld.w 36[ep],r20
299 addi 40,sp,sp
300 mov r1,ep
301 jmp [r31]
302 .size __return_r20_r29,.-__return_r20_r29
303 #endif /* L_save_20 */
305 #ifdef L_save_21
306 .text
307 .align 2
308 .globl __save_r21_r29
309 .type __save_r21_r29,@function
310 /* Allocate space and save registers 21 .. 29 on the stack */
311 /* Called via: jalr __save_r21_r29,r10 */
312 __save_r21_r29:
313 mov ep,r1
314 addi -36,sp,sp
315 mov sp,ep
316 sst.w r29,0[ep]
317 sst.w r28,4[ep]
318 sst.w r27,8[ep]
319 sst.w r26,12[ep]
320 sst.w r25,16[ep]
321 sst.w r24,20[ep]
322 sst.w r23,24[ep]
323 sst.w r22,28[ep]
324 sst.w r21,32[ep]
325 mov r1,ep
326 jmp [r10]
327 .size __save_r21_r29,.-__save_r21_r29
329 /* Restore saved registers, deallocate stack and return to the user */
330 /* Called via: jr __return_r21_r29 */
331 .align 2
332 .globl __return_r21_r29
333 .type __return_r21_r29,@function
334 __return_r21_r29:
335 mov ep,r1
336 mov sp,ep
337 sld.w 0[ep],r29
338 sld.w 4[ep],r28
339 sld.w 8[ep],r27
340 sld.w 12[ep],r26
341 sld.w 16[ep],r25
342 sld.w 20[ep],r24
343 sld.w 24[ep],r23
344 sld.w 28[ep],r22
345 sld.w 32[ep],r21
346 addi 36,sp,sp
347 mov r1,ep
348 jmp [r31]
349 .size __return_r21_r29,.-__return_r21_r29
350 #endif /* L_save_21 */
352 #ifdef L_save_22
353 .text
354 .align 2
355 .globl __save_r22_r29
356 .type __save_r22_r29,@function
357 /* Allocate space and save registers 22 .. 29 on the stack */
358 /* Called via: jalr __save_r22_r29,r10 */
359 __save_r22_r29:
360 mov ep,r1
361 addi -32,sp,sp
362 mov sp,ep
363 sst.w r29,0[ep]
364 sst.w r28,4[ep]
365 sst.w r27,8[ep]
366 sst.w r26,12[ep]
367 sst.w r25,16[ep]
368 sst.w r24,20[ep]
369 sst.w r23,24[ep]
370 sst.w r22,28[ep]
371 mov r1,ep
372 jmp [r10]
373 .size __save_r22_r29,.-__save_r22_r29
375 /* Restore saved registers, deallocate stack and return to the user */
376 /* Called via: jr __return_r22_r29 */
377 .align 2
378 .globl __return_r22_r29
379 .type __return_r22_r29,@function
380 __return_r22_r29:
381 mov ep,r1
382 mov sp,ep
383 sld.w 0[ep],r29
384 sld.w 4[ep],r28
385 sld.w 8[ep],r27
386 sld.w 12[ep],r26
387 sld.w 16[ep],r25
388 sld.w 20[ep],r24
389 sld.w 24[ep],r23
390 sld.w 28[ep],r22
391 addi 32,sp,sp
392 mov r1,ep
393 jmp [r31]
394 .size __return_r22_r29,.-__return_r22_r29
395 #endif /* L_save_22 */
397 #ifdef L_save_23
398 .text
399 .align 2
400 .globl __save_r23_r29
401 .type __save_r23_r29,@function
402 /* Allocate space and save registers 23 .. 29 on the stack */
403 /* Called via: jalr __save_r23_r29,r10 */
404 __save_r23_r29:
405 mov ep,r1
406 addi -28,sp,sp
407 mov sp,ep
408 sst.w r29,0[ep]
409 sst.w r28,4[ep]
410 sst.w r27,8[ep]
411 sst.w r26,12[ep]
412 sst.w r25,16[ep]
413 sst.w r24,20[ep]
414 sst.w r23,24[ep]
415 mov r1,ep
416 jmp [r10]
417 .size __save_r23_r29,.-__save_r23_r29
419 /* Restore saved registers, deallocate stack and return to the user */
420 /* Called via: jr __return_r23_r29 */
421 .align 2
422 .globl __return_r23_r29
423 .type __return_r23_r29,@function
424 __return_r23_r29:
425 mov ep,r1
426 mov sp,ep
427 sld.w 0[ep],r29
428 sld.w 4[ep],r28
429 sld.w 8[ep],r27
430 sld.w 12[ep],r26
431 sld.w 16[ep],r25
432 sld.w 20[ep],r24
433 sld.w 24[ep],r23
434 addi 28,sp,sp
435 mov r1,ep
436 jmp [r31]
437 .size __return_r23_r29,.-__return_r23_r29
438 #endif /* L_save_23 */
440 #ifdef L_save_24
441 .text
442 .align 2
443 .globl __save_r24_r29
444 .type __save_r24_r29,@function
445 /* Allocate space and save registers 24 .. 29 on the stack */
446 /* Called via: jalr __save_r24_r29,r10 */
447 __save_r24_r29:
448 mov ep,r1
449 addi -24,sp,sp
450 mov sp,ep
451 sst.w r29,0[ep]
452 sst.w r28,4[ep]
453 sst.w r27,8[ep]
454 sst.w r26,12[ep]
455 sst.w r25,16[ep]
456 sst.w r24,20[ep]
457 mov r1,ep
458 jmp [r10]
459 .size __save_r24_r29,.-__save_r24_r29
461 /* Restore saved registers, deallocate stack and return to the user */
462 /* Called via: jr __return_r24_r29 */
463 .align 2
464 .globl __return_r24_r29
465 .type __return_r24_r29,@function
466 __return_r24_r29:
467 mov ep,r1
468 mov sp,ep
469 sld.w 0[ep],r29
470 sld.w 4[ep],r28
471 sld.w 8[ep],r27
472 sld.w 12[ep],r26
473 sld.w 16[ep],r25
474 sld.w 20[ep],r24
475 addi 24,sp,sp
476 mov r1,ep
477 jmp [r31]
478 .size __return_r24_r29,.-__return_r24_r29
479 #endif /* L_save_24 */
481 #ifdef L_save_25
482 .text
483 .align 2
484 .globl __save_r25_r29
485 .type __save_r25_r29,@function
486 /* Allocate space and save registers 25 .. 29 on the stack */
487 /* Called via: jalr __save_r25_r29,r10 */
488 __save_r25_r29:
489 mov ep,r1
490 addi -20,sp,sp
491 mov sp,ep
492 sst.w r29,0[ep]
493 sst.w r28,4[ep]
494 sst.w r27,8[ep]
495 sst.w r26,12[ep]
496 sst.w r25,16[ep]
497 mov r1,ep
498 jmp [r10]
499 .size __save_r25_r29,.-__save_r25_r29
501 /* Restore saved registers, deallocate stack and return to the user */
502 /* Called via: jr __return_r25_r29 */
503 .align 2
504 .globl __return_r25_r29
505 .type __return_r25_r29,@function
506 __return_r25_r29:
507 mov ep,r1
508 mov sp,ep
509 sld.w 0[ep],r29
510 sld.w 4[ep],r28
511 sld.w 8[ep],r27
512 sld.w 12[ep],r26
513 sld.w 16[ep],r25
514 addi 20,sp,sp
515 mov r1,ep
516 jmp [r31]
517 .size __return_r25_r29,.-__return_r25_r29
518 #endif /* L_save_25 */
520 #ifdef L_save_26
521 .text
522 .align 2
523 .globl __save_r26_r29
524 .type __save_r26_r29,@function
525 /* Allocate space and save registers 26 .. 29 on the stack */
526 /* Called via: jalr __save_r26_r29,r10 */
527 __save_r26_r29:
528 mov ep,r1
529 add -16,sp
530 mov sp,ep
531 sst.w r29,0[ep]
532 sst.w r28,4[ep]
533 sst.w r27,8[ep]
534 sst.w r26,12[ep]
535 mov r1,ep
536 jmp [r10]
537 .size __save_r26_r29,.-__save_r26_r29
539 /* Restore saved registers, deallocate stack and return to the user */
540 /* Called via: jr __return_r26_r29 */
541 .align 2
542 .globl __return_r26_r29
543 .type __return_r26_r29,@function
544 __return_r26_r29:
545 mov ep,r1
546 mov sp,ep
547 sld.w 0[ep],r29
548 sld.w 4[ep],r28
549 sld.w 8[ep],r27
550 sld.w 12[ep],r26
551 addi 16,sp,sp
552 mov r1,ep
553 jmp [r31]
554 .size __return_r26_r29,.-__return_r26_r29
555 #endif /* L_save_26 */
557 #ifdef L_save_27
558 .text
559 .align 2
560 .globl __save_r27_r29
561 .type __save_r27_r29,@function
562 /* Allocate space and save registers 27 .. 29 on the stack */
563 /* Called via: jalr __save_r27_r29,r10 */
564 __save_r27_r29:
565 add -12,sp
566 st.w r29,0[sp]
567 st.w r28,4[sp]
568 st.w r27,8[sp]
569 jmp [r10]
570 .size __save_r27_r29,.-__save_r27_r29
572 /* Restore saved registers, deallocate stack and return to the user */
573 /* Called via: jr __return_r27_r29 */
574 .align 2
575 .globl __return_r27_r29
576 .type __return_r27_r29,@function
577 __return_r27_r29:
578 ld.w 0[sp],r29
579 ld.w 4[sp],r28
580 ld.w 8[sp],r27
581 add 12,sp
582 jmp [r31]
583 .size __return_r27_r29,.-__return_r27_r29
584 #endif /* L_save_27 */
586 #ifdef L_save_28
587 .text
588 .align 2
589 .globl __save_r28_r29
590 .type __save_r28_r29,@function
591 /* Allocate space and save registers 28,29 on the stack */
592 /* Called via: jalr __save_r28_r29,r10 */
593 __save_r28_r29:
594 add -8,sp
595 st.w r29,0[sp]
596 st.w r28,4[sp]
597 jmp [r10]
598 .size __save_r28_r29,.-__save_r28_r29
600 /* Restore saved registers, deallocate stack and return to the user */
601 /* Called via: jr __return_r28_r29 */
602 .align 2
603 .globl __return_r28_r29
604 .type __return_r28_r29,@function
605 __return_r28_r29:
606 ld.w 0[sp],r29
607 ld.w 4[sp],r28
608 add 8,sp
609 jmp [r31]
610 .size __return_r28_r29,.-__return_r28_r29
611 #endif /* L_save_28 */
613 #ifdef L_save_29
614 .text
615 .align 2
616 .globl __save_r29
617 .type __save_r29,@function
618 /* Allocate space and save register 29 on the stack */
619 /* Called via: jalr __save_r29,r10 */
620 __save_r29:
621 add -4,sp
622 st.w r29,0[sp]
623 jmp [r10]
624 .size __save_r29,.-__save_r29
626 /* Restore saved register 29, deallocate stack and return to the user */
627 /* Called via: jr __return_r29 */
628 .align 2
629 .globl __return_r29
630 .type __return_r29,@function
631 __return_r29:
632 ld.w 0[sp],r29
633 add 4,sp
634 jmp [r31]
635 .size __return_r29,.-__return_r29
636 #endif /* L_save_28 */
638 #ifdef L_save_2c
639 .text
640 .align 2
641 .globl __save_r2_r31
642 .type __save_r2_r31,@function
643 /* Allocate space and save registers 20 .. 29, 31 on the stack */
644 /* Also allocate space for the argument save area */
645 /* Called via: jalr __save_r2_r31,r10 */
646 __save_r2_r31:
647 mov ep,r1
648 addi -64,sp,sp
649 mov sp,ep
650 sst.w r29,16[ep]
651 sst.w r28,20[ep]
652 sst.w r27,24[ep]
653 sst.w r26,28[ep]
654 sst.w r25,32[ep]
655 sst.w r24,36[ep]
656 sst.w r23,40[ep]
657 sst.w r22,44[ep]
658 sst.w r21,48[ep]
659 sst.w r20,52[ep]
660 sst.w r2,56[ep]
661 sst.w r31,60[ep]
662 mov r1,ep
663 jmp [r10]
664 .size __save_r2_r31,.-__save_r2_r31
666 /* Restore saved registers, deallocate stack and return to the user */
667 /* Called via: jr __return_r20_r31 */
668 .align 2
669 .globl __return_r2_r31
670 .type __return_r2_r31,@function
671 __return_r2_r31:
672 mov ep,r1
673 mov sp,ep
674 sld.w 16[ep],r29
675 sld.w 20[ep],r28
676 sld.w 24[ep],r27
677 sld.w 28[ep],r26
678 sld.w 32[ep],r25
679 sld.w 36[ep],r24
680 sld.w 40[ep],r23
681 sld.w 44[ep],r22
682 sld.w 48[ep],r21
683 sld.w 52[ep],r20
684 sld.w 56[ep],r2
685 sld.w 60[ep],r31
686 addi 64,sp,sp
687 mov r1,ep
688 jmp [r31]
689 .size __return_r2_r31,.-__return_r2_r31
690 #endif /* L_save_2c */
692 #ifdef L_save_20c
693 .text
694 .align 2
695 .globl __save_r20_r31
696 .type __save_r20_r31,@function
697 /* Allocate space and save registers 20 .. 29, 31 on the stack */
698 /* Also allocate space for the argument save area */
699 /* Called via: jalr __save_r20_r31,r10 */
700 __save_r20_r31:
701 mov ep,r1
702 addi -60,sp,sp
703 mov sp,ep
704 sst.w r29,16[ep]
705 sst.w r28,20[ep]
706 sst.w r27,24[ep]
707 sst.w r26,28[ep]
708 sst.w r25,32[ep]
709 sst.w r24,36[ep]
710 sst.w r23,40[ep]
711 sst.w r22,44[ep]
712 sst.w r21,48[ep]
713 sst.w r20,52[ep]
714 sst.w r31,56[ep]
715 mov r1,ep
716 jmp [r10]
717 .size __save_r20_r31,.-__save_r20_r31
719 /* Restore saved registers, deallocate stack and return to the user */
720 /* Called via: jr __return_r20_r31 */
721 .align 2
722 .globl __return_r20_r31
723 .type __return_r20_r31,@function
724 __return_r20_r31:
725 mov ep,r1
726 mov sp,ep
727 sld.w 16[ep],r29
728 sld.w 20[ep],r28
729 sld.w 24[ep],r27
730 sld.w 28[ep],r26
731 sld.w 32[ep],r25
732 sld.w 36[ep],r24
733 sld.w 40[ep],r23
734 sld.w 44[ep],r22
735 sld.w 48[ep],r21
736 sld.w 52[ep],r20
737 sld.w 56[ep],r31
738 addi 60,sp,sp
739 mov r1,ep
740 jmp [r31]
741 .size __return_r20_r31,.-__return_r20_r31
742 #endif /* L_save_20c */
744 #ifdef L_save_21c
745 .text
746 .align 2
747 .globl __save_r21_r31
748 .type __save_r21_r31,@function
749 /* Allocate space and save registers 21 .. 29, 31 on the stack */
750 /* Also allocate space for the argument save area */
751 /* Called via: jalr __save_r21_r31,r10 */
752 __save_r21_r31:
753 mov ep,r1
754 addi -56,sp,sp
755 mov sp,ep
756 sst.w r29,16[ep]
757 sst.w r28,20[ep]
758 sst.w r27,24[ep]
759 sst.w r26,28[ep]
760 sst.w r25,32[ep]
761 sst.w r24,36[ep]
762 sst.w r23,40[ep]
763 sst.w r22,44[ep]
764 sst.w r21,48[ep]
765 sst.w r31,52[ep]
766 mov r1,ep
767 jmp [r10]
768 .size __save_r21_r31,.-__save_r21_r31
770 /* Restore saved registers, deallocate stack and return to the user */
771 /* Called via: jr __return_r21_r31 */
772 .align 2
773 .globl __return_r21_r31
774 .type __return_r21_r31,@function
775 __return_r21_r31:
776 mov ep,r1
777 mov sp,ep
778 sld.w 16[ep],r29
779 sld.w 20[ep],r28
780 sld.w 24[ep],r27
781 sld.w 28[ep],r26
782 sld.w 32[ep],r25
783 sld.w 36[ep],r24
784 sld.w 40[ep],r23
785 sld.w 44[ep],r22
786 sld.w 48[ep],r21
787 sld.w 52[ep],r31
788 addi 56,sp,sp
789 mov r1,ep
790 jmp [r31]
791 .size __return_r21_r31,.-__return_r21_r31
792 #endif /* L_save_21c */
794 #ifdef L_save_22c
795 .text
796 .align 2
797 .globl __save_r22_r31
798 .type __save_r22_r31,@function
799 /* Allocate space and save registers 22 .. 29, 31 on the stack */
800 /* Also allocate space for the argument save area */
801 /* Called via: jalr __save_r22_r31,r10 */
802 __save_r22_r31:
803 mov ep,r1
804 addi -52,sp,sp
805 mov sp,ep
806 sst.w r29,16[ep]
807 sst.w r28,20[ep]
808 sst.w r27,24[ep]
809 sst.w r26,28[ep]
810 sst.w r25,32[ep]
811 sst.w r24,36[ep]
812 sst.w r23,40[ep]
813 sst.w r22,44[ep]
814 sst.w r31,48[ep]
815 mov r1,ep
816 jmp [r10]
817 .size __save_r22_r31,.-__save_r22_r31
819 /* Restore saved registers, deallocate stack and return to the user */
820 /* Called via: jr __return_r22_r31 */
821 .align 2
822 .globl __return_r22_r31
823 .type __return_r22_r31,@function
824 __return_r22_r31:
825 mov ep,r1
826 mov sp,ep
827 sld.w 16[ep],r29
828 sld.w 20[ep],r28
829 sld.w 24[ep],r27
830 sld.w 28[ep],r26
831 sld.w 32[ep],r25
832 sld.w 36[ep],r24
833 sld.w 40[ep],r23
834 sld.w 44[ep],r22
835 sld.w 48[ep],r31
836 addi 52,sp,sp
837 mov r1,ep
838 jmp [r31]
839 .size __return_r22_r31,.-__return_r22_r31
840 #endif /* L_save_22c */
842 #ifdef L_save_23c
843 .text
844 .align 2
845 .globl __save_r23_r31
846 .type __save_r23_r31,@function
847 /* Allocate space and save registers 23 .. 29, 31 on the stack */
848 /* Also allocate space for the argument save area */
849 /* Called via: jalr __save_r23_r31,r10 */
850 __save_r23_r31:
851 mov ep,r1
852 addi -48,sp,sp
853 mov sp,ep
854 sst.w r29,16[ep]
855 sst.w r28,20[ep]
856 sst.w r27,24[ep]
857 sst.w r26,28[ep]
858 sst.w r25,32[ep]
859 sst.w r24,36[ep]
860 sst.w r23,40[ep]
861 sst.w r31,44[ep]
862 mov r1,ep
863 jmp [r10]
864 .size __save_r23_r31,.-__save_r23_r31
866 /* Restore saved registers, deallocate stack and return to the user */
867 /* Called via: jr __return_r23_r31 */
868 .align 2
869 .globl __return_r23_r31
870 .type __return_r23_r31,@function
871 __return_r23_r31:
872 mov ep,r1
873 mov sp,ep
874 sld.w 16[ep],r29
875 sld.w 20[ep],r28
876 sld.w 24[ep],r27
877 sld.w 28[ep],r26
878 sld.w 32[ep],r25
879 sld.w 36[ep],r24
880 sld.w 40[ep],r23
881 sld.w 44[ep],r31
882 addi 48,sp,sp
883 mov r1,ep
884 jmp [r31]
885 .size __return_r23_r31,.-__return_r23_r31
886 #endif /* L_save_23c */
888 #ifdef L_save_24c
889 .text
890 .align 2
891 .globl __save_r24_r31
892 .type __save_r24_r31,@function
893 /* Allocate space and save registers 24 .. 29, 31 on the stack */
894 /* Also allocate space for the argument save area */
895 /* Called via: jalr __save_r24_r31,r10 */
896 __save_r24_r31:
897 mov ep,r1
898 addi -44,sp,sp
899 mov sp,ep
900 sst.w r29,16[ep]
901 sst.w r28,20[ep]
902 sst.w r27,24[ep]
903 sst.w r26,28[ep]
904 sst.w r25,32[ep]
905 sst.w r24,36[ep]
906 sst.w r31,40[ep]
907 mov r1,ep
908 jmp [r10]
909 .size __save_r24_r31,.-__save_r24_r31
911 /* Restore saved registers, deallocate stack and return to the user */
912 /* Called via: jr __return_r24_r31 */
913 .align 2
914 .globl __return_r24_r31
915 .type __return_r24_r31,@function
916 __return_r24_r31:
917 mov ep,r1
918 mov sp,ep
919 sld.w 16[ep],r29
920 sld.w 20[ep],r28
921 sld.w 24[ep],r27
922 sld.w 28[ep],r26
923 sld.w 32[ep],r25
924 sld.w 36[ep],r24
925 sld.w 40[ep],r31
926 addi 44,sp,sp
927 mov r1,ep
928 jmp [r31]
929 .size __return_r24_r31,.-__return_r24_r31
930 #endif /* L_save_24c */
932 #ifdef L_save_25c
933 .text
934 .align 2
935 .globl __save_r25_r31
936 .type __save_r25_r31,@function
937 /* Allocate space and save registers 25 .. 29, 31 on the stack */
938 /* Also allocate space for the argument save area */
939 /* Called via: jalr __save_r25_r31,r10 */
940 __save_r25_r31:
941 mov ep,r1
942 addi -40,sp,sp
943 mov sp,ep
944 sst.w r29,16[ep]
945 sst.w r28,20[ep]
946 sst.w r27,24[ep]
947 sst.w r26,28[ep]
948 sst.w r25,32[ep]
949 sst.w r31,36[ep]
950 mov r1,ep
951 jmp [r10]
952 .size __save_r25_r31,.-__save_r25_r31
954 /* Restore saved registers, deallocate stack and return to the user */
955 /* Called via: jr __return_r25_r31 */
956 .align 2
957 .globl __return_r25_r31
958 .type __return_r25_r31,@function
959 __return_r25_r31:
960 mov ep,r1
961 mov sp,ep
962 sld.w 16[ep],r29
963 sld.w 20[ep],r28
964 sld.w 24[ep],r27
965 sld.w 28[ep],r26
966 sld.w 32[ep],r25
967 sld.w 36[ep],r31
968 addi 40,sp,sp
969 mov r1,ep
970 jmp [r31]
971 .size __return_r25_r31,.-__return_r25_r31
972 #endif /* L_save_25c */
974 #ifdef L_save_26c
975 .text
976 .align 2
977 .globl __save_r26_r31
978 .type __save_r26_r31,@function
979 /* Allocate space and save registers 26 .. 29, 31 on the stack */
980 /* Also allocate space for the argument save area */
981 /* Called via: jalr __save_r26_r31,r10 */
982 __save_r26_r31:
983 mov ep,r1
984 addi -36,sp,sp
985 mov sp,ep
986 sst.w r29,16[ep]
987 sst.w r28,20[ep]
988 sst.w r27,24[ep]
989 sst.w r26,28[ep]
990 sst.w r31,32[ep]
991 mov r1,ep
992 jmp [r10]
993 .size __save_r26_r31,.-__save_r26_r31
995 /* Restore saved registers, deallocate stack and return to the user */
996 /* Called via: jr __return_r26_r31 */
997 .align 2
998 .globl __return_r26_r31
999 .type __return_r26_r31,@function
1000 __return_r26_r31:
1001 mov ep,r1
1002 mov sp,ep
1003 sld.w 16[ep],r29
1004 sld.w 20[ep],r28
1005 sld.w 24[ep],r27
1006 sld.w 28[ep],r26
1007 sld.w 32[ep],r31
1008 addi 36,sp,sp
1009 mov r1,ep
1010 jmp [r31]
1011 .size __return_r26_r31,.-__return_r26_r31
1012 #endif /* L_save_26c */
1014 #ifdef L_save_27c
1015 .text
1016 .align 2
1017 .globl __save_r27_r31
1018 .type __save_r27_r31,@function
1019 /* Allocate space and save registers 27 .. 29, 31 on the stack */
1020 /* Also allocate space for the argument save area */
1021 /* Called via: jalr __save_r27_r31,r10 */
1022 __save_r27_r31:
1023 mov ep,r1
1024 addi -32,sp,sp
1025 mov sp,ep
1026 sst.w r29,16[ep]
1027 sst.w r28,20[ep]
1028 sst.w r27,24[ep]
1029 sst.w r31,28[ep]
1030 mov r1,ep
1031 jmp [r10]
1032 .size __save_r27_r31,.-__save_r27_r31
1034 /* Restore saved registers, deallocate stack and return to the user */
1035 /* Called via: jr __return_r27_r31 */
1036 .align 2
1037 .globl __return_r27_r31
1038 .type __return_r27_r31,@function
1039 __return_r27_r31:
1040 mov ep,r1
1041 mov sp,ep
1042 sld.w 16[ep],r29
1043 sld.w 20[ep],r28
1044 sld.w 24[ep],r27
1045 sld.w 28[ep],r31
1046 addi 32,sp,sp
1047 mov r1,ep
1048 jmp [r31]
1049 .size __return_r27_r31,.-__return_r27_r31
1050 #endif /* L_save_27c */
1052 #ifdef L_save_28c
1053 .text
1054 .align 2
1055 .globl __save_r28_r31
1056 .type __save_r28_r31,@function
1057 /* Allocate space and save registers 28 .. 29, 31 on the stack */
1058 /* Also allocate space for the argument save area */
1059 /* Called via: jalr __save_r28_r31,r10 */
1060 __save_r28_r31:
1061 addi -28,sp,sp
1062 st.w r29,16[sp]
1063 st.w r28,20[sp]
1064 st.w r31,24[sp]
1065 jmp [r10]
1066 .size __save_r28_r31,.-__save_r28_r31
1068 /* Restore saved registers, deallocate stack and return to the user */
1069 /* Called via: jr __return_r28_r31 */
1070 .align 2
1071 .globl __return_r28_r31
1072 .type __return_r28_r31,@function
1073 __return_r28_r31:
1074 ld.w 16[sp],r29
1075 ld.w 20[sp],r28
1076 ld.w 24[sp],r31
1077 addi 28,sp,sp
1078 jmp [r31]
1079 .size __return_r28_r31,.-__return_r28_r31
1080 #endif /* L_save_28c */
1082 #ifdef L_save_29c
1083 .text
1084 .align 2
1085 .globl __save_r29_r31
1086 .type __save_r29_r31,@function
1087 /* Allocate space and save registers 29 & 31 on the stack */
1088 /* Also allocate space for the argument save area */
1089 /* Called via: jalr __save_r29_r31,r10 */
1090 __save_r29_r31:
1091 addi -24,sp,sp
1092 st.w r29,16[sp]
1093 st.w r31,20[sp]
1094 jmp [r10]
1095 .size __save_r29_r31,.-__save_r29_r31
1097 /* Restore saved registers, deallocate stack and return to the user */
1098 /* Called via: jr __return_r29_r31 */
1099 .align 2
1100 .globl __return_r29_r31
1101 .type __return_r29_r31,@function
1102 __return_r29_r31:
1103 ld.w 16[sp],r29
1104 ld.w 20[sp],r31
1105 addi 24,sp,sp
1106 jmp [r31]
1107 .size __return_r29_r31,.-__return_r29_r31
1108 #endif /* L_save_29c */
1110 #ifdef L_save_31c
1111 .text
1112 .align 2
1113 .globl __save_r31
1114 .type __save_r31,@function
1115 /* Allocate space and save register 31 on the stack */
1116 /* Also allocate space for the argument save area */
1117 /* Called via: jalr __save_r29_r31,r10 */
1118 __save_r31:
1119 addi -20,sp,sp
1120 st.w r31,16[sp]
1121 jmp [r10]
1122 .size __save_r31,.-__save_r31
1124 /* Restore saved registers, deallocate stack and return to the user */
1125 /* Called via: jr __return_r31 */
1126 .align 2
1127 .globl __return_r31
1128 .type __return_r31,@function
1129 __return_r31:
1130 ld.w 16[sp],r31
1131 addi 20,sp,sp
1132 jmp [r31]
1133 .size __return_r29_r31,.-__return_r29_r31
1134 #endif /* L_save_31c */
1136 #ifdef L_save_varargs
1137 .text
1138 .align 2
1139 .globl __save_r6_r9
1140 .type __save_r6_r9,@function
1141 /* Save registers 6 .. 9 on the stack for variable argument functions */
1142 /* Called via: jalr __save_r6_r9,r10 */
1143 __save_r6_r9:
1144 mov ep,r1
1145 mov sp,ep
1146 sst.w r6,0[ep]
1147 sst.w r7,4[ep]
1148 sst.w r8,8[ep]
1149 sst.w r9,12[ep]
1150 mov r1,ep
1151 jmp [r10]
1152 .size __save_r6_r9,.-__save_r6_r9
1153 #endif /* L_save_varargs */
1155 #ifdef L_save_interrupt
1156 .text
1157 .align 2
1158 .globl __save_interrupt
1159 .type __save_interrupt,@function
1160 /* Save registers r1, r4 on stack and load up with expected values */
1161 /* Note, 12 bytes of stack have already been allocated. */
1162 /* Called via: jalr __save_interrupt,r10 */
1163 __save_interrupt:
1164 st.w ep,0[sp]
1165 st.w gp,4[sp]
1166 st.w r1,8[sp]
1167 movhi hi(__ep),r0,ep
1168 movea lo(__ep),ep,ep
1169 movhi hi(__gp),r0,gp
1170 movea lo(__gp),gp,gp
1171 jmp [r10]
1172 .size __save_interrupt,.-__save_interrupt
1174 /* Restore saved registers, deallocate stack and return from the interrupt */
1175 /* Called via: jr __return_interrupt */
1176 .align 2
1177 .globl __return_interrupt
1178 .type __return_interrupt,@function
1179 __return_interrupt:
1180 ld.w 0[sp],ep
1181 ld.w 4[sp],gp
1182 ld.w 8[sp],r1
1183 ld.w 12[sp],r10
1184 addi 16,sp,sp
1185 reti
1186 .size __return_interrupt,.-__return_interrupt
1187 #endif /* L_save_interrupt */
1189 #ifdef L_save_all_interrupt
1190 .text
1191 .align 2
1192 .globl __save_all_interrupt
1193 .type __save_all_interrupt,@function
1194 /* Save all registers except for those saved in __save_interrupt */
1195 /* allocate enough stack for all of the registers & 16 bytes of space */
1196 /* Called via: jalr __save_all_interrupt,r10 */
1197 __save_all_interrupt:
1198 addi -120,sp,sp
1199 mov ep,r1
1200 mov sp,ep
1201 sst.w r31,116[ep]
1202 sst.w r2,112[ep]
1203 sst.w gp,108[ep]
1204 sst.w r6,104[ep]
1205 sst.w r7,100[ep]
1206 sst.w r8,96[ep]
1207 sst.w r9,92[ep]
1208 sst.w r11,88[ep]
1209 sst.w r12,84[ep]
1210 sst.w r13,80[ep]
1211 sst.w r14,76[ep]
1212 sst.w r15,72[ep]
1213 sst.w r16,68[ep]
1214 sst.w r17,64[ep]
1215 sst.w r18,60[ep]
1216 sst.w r19,56[ep]
1217 sst.w r20,52[ep]
1218 sst.w r21,48[ep]
1219 sst.w r22,44[ep]
1220 sst.w r23,40[ep]
1221 sst.w r24,36[ep]
1222 sst.w r25,32[ep]
1223 sst.w r26,28[ep]
1224 sst.w r27,24[ep]
1225 sst.w r28,20[ep]
1226 sst.w r29,16[ep]
1227 mov r1,ep
1228 jmp [r10]
1229 .size __save_all_interrupt,.-__save_all_interrupt
1231 .globl __restore_all_interrupt
1232 .type __restore_all_interrupt,@function
1233 /* Restore all registers saved in __save_all_interrupt */
1234 /* & deallocate the stack space */
1235 /* Called via: jalr __restore_all_interrupt,r10 */
1236 __restore_all_interrupt:
1237 mov ep,r1
1238 mov sp,ep
1239 sld.w 116[ep],r31
1240 sld.w 112[ep],r2
1241 sld.w 108[ep],gp
1242 sld.w 104[ep],r6
1243 sld.w 100[ep],r7
1244 sld.w 96[ep],r8
1245 sld.w 92[ep],r9
1246 sld.w 88[ep],r11
1247 sld.w 84[ep],r12
1248 sld.w 80[ep],r13
1249 sld.w 76[ep],r14
1250 sld.w 72[ep],r15
1251 sld.w 68[ep],r16
1252 sld.w 64[ep],r17
1253 sld.w 60[ep],r18
1254 sld.w 56[ep],r19
1255 sld.w 52[ep],r20
1256 sld.w 48[ep],r21
1257 sld.w 44[ep],r22
1258 sld.w 40[ep],r23
1259 sld.w 36[ep],r24
1260 sld.w 32[ep],r25
1261 sld.w 28[ep],r26
1262 sld.w 24[ep],r27
1263 sld.w 20[ep],r28
1264 sld.w 16[ep],r29
1265 mov r1,ep
1266 addi 120,sp,sp
1267 jmp [r10]
1268 .size __restore_all_interrupt,.-__restore_all_interrupt
1269 #endif /* L_save_all_interrupt */