* config/v850/lib1funcs.S: Only provide CALLT support functions if
[official-gcc.git] / libgcc / config / v850 / lib1funcs.S
blob45ef1de7dd8eae3ca8c5b7e1d1c39dffa3ab5c84
1 /* libgcc routines for NEC V850.
2    Copyright (C) 1996, 1997, 2002, 2005, 2009, 2010, 2013
3    Free Software Foundation, Inc.
5    This file is part of GCC.
7    GCC is free software; you can redistribute it and/or modify it
8    under the terms of the GNU General Public License as published by the
9    Free Software Foundation; either version 3, or (at your option) any
10    later version.
12    This file is distributed in the hope that it will be useful, but
13    WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15    General Public License for more details.
17    Under Section 7 of GPL version 3, you are granted additional
18    permissions described in the GCC Runtime Library Exception, version
19    3.1, as published by the Free Software Foundation.
21    You should have received a copy of the GNU General Public License and
22    a copy of the GCC Runtime Library Exception along with this program;
23    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24    <http://www.gnu.org/licenses/>.  */
26 #ifdef L_mulsi3
27         .text
28         .globl ___mulsi3
29         .type  ___mulsi3,@function
30 ___mulsi3:
31 #ifdef __v850__ 
33    #define SHIFT 12
34    #define MASK ((1 << SHIFT) - 1)
35     
36    #define STEP(i, j)                               \
37    ({                                               \
38        short a_part = (a >> (i)) & MASK;            \
39        short b_part = (b >> (j)) & MASK;            \
40        int res = (((int) a_part) * ((int) b_part)); \
41        res;                                         \
42    })
43   
44    int
45    __mulsi3 (unsigned a, unsigned b)
46    {
47       return STEP (0, 0) +
48           ((STEP (SHIFT, 0) + STEP (0, SHIFT)) << SHIFT) +
49           ((STEP (0, 2 * SHIFT) + STEP (SHIFT, SHIFT) + STEP (2 * SHIFT, 0))
50            << (2 * SHIFT));
51    }
53         mov   r6, r14
54         movea lo(32767), r0, r10
55         and   r10, r14
56         mov   r7,  r15
57         and   r10, r15
58         shr   15,  r6
59         mov   r6,  r13
60         and   r10, r13
61         shr   15,  r7
62         mov   r7,  r12
63         and   r10, r12
64         shr   15,  r6
65         shr   15,  r7
66         mov   r14, r10
67         mulh  r15, r10
68         mov   r14, r11
69         mulh  r12, r11
70         mov   r13, r16
71         mulh  r15, r16
72         mulh  r14, r7
73         mulh  r15, r6
74         add   r16, r11
75         mulh  r13, r12
76         shl   15,  r11
77         add   r11, r10
78         add   r12, r7
79         add   r6,  r7
80         shl   30,  r7
81         add   r7,  r10
82         jmp   [r31]
83 #endif /* __v850__ */
84 #if defined(__v850e__) || defined(__v850ea__) || defined(__v850e2__) || defined(__v850e2v3__)
85         /* This routine is almost unneccesarry because gcc
86            generates the MUL instruction for the RTX mulsi3.
87            But if someone wants to link his application with
88            previsously compiled v850 objects then they will 
89            need this function.  */
91         /* It isn't good to put the inst sequence as below;
92               mul r7, r6,
93               mov r6, r10, r0
94            In this case, there is a RAW hazard between them.
95            MUL inst takes 2 cycle in EX stage, then MOV inst
96            must wait 1cycle.  */
97         mov   r7, r10
98         mul   r6, r10, r0
99         jmp   [r31]
100 #endif /* __v850e__ */
101         .size ___mulsi3,.-___mulsi3
102 #endif /* L_mulsi3 */
105 #ifdef L_udivsi3
106         .text
107         .global ___udivsi3
108         .type   ___udivsi3,@function
109 ___udivsi3:
110 #ifdef __v850__
111         mov 1,r12
112         mov 0,r10
113         cmp r6,r7
114         bnl .L12
115         movhi hi(-2147483648),r0,r13
116         cmp r0,r7
117         blt .L12
118 .L4:
119         shl 1,r7
120         shl 1,r12
121         cmp r6,r7
122         bnl .L12
123         cmp r0,r12
124         be .L8
125         mov r7,r19
126         and r13,r19
127         be .L4
128         br .L12
129 .L9:
130         cmp r7,r6
131         bl .L10
132         sub r7,r6
133         or r12,r10
134 .L10:
135         shr 1,r12
136         shr 1,r7
137 .L12:
138         cmp r0,r12
139         bne .L9
140 .L8:
141         jmp [r31]
143 #else /* defined(__v850e__) */
145         /* See comments at end of __mulsi3.  */
146         mov   r6, r10   
147         divu  r7, r10, r0
148         jmp   [r31]             
150 #endif /* __v850e__ */
152         .size ___udivsi3,.-___udivsi3
153 #endif
155 #ifdef L_divsi3
156         .text
157         .globl ___divsi3
158         .type  ___divsi3,@function
159 ___divsi3:
160 #ifdef __v850__
161         add -8,sp
162         st.w r31,4[sp]
163         st.w r22,0[sp]
164         mov 1,r22
165         tst r7,r7
166         bp .L3
167         subr r0,r7
168         subr r0,r22
169 .L3:
170         tst r6,r6
171         bp .L4
172         subr r0,r6
173         subr r0,r22
174 .L4:
175         jarl ___udivsi3,r31
176         cmp r0,r22
177         bp .L7
178         subr r0,r10
179 .L7:
180         ld.w 0[sp],r22
181         ld.w 4[sp],r31
182         add 8,sp
183         jmp [r31]
185 #else /* defined(__v850e__) */
187         /* See comments at end of __mulsi3.  */
188         mov   r6, r10
189         div   r7, r10, r0
190         jmp   [r31]
192 #endif /* __v850e__ */
194         .size ___divsi3,.-___divsi3
195 #endif
197 #ifdef  L_umodsi3
198         .text
199         .globl ___umodsi3
200         .type  ___umodsi3,@function
201 ___umodsi3:
202 #ifdef __v850__
203         add -12,sp
204         st.w r31,8[sp]
205         st.w r7,4[sp]
206         st.w r6,0[sp]
207         jarl ___udivsi3,r31
208         ld.w 4[sp],r7
209         mov r10,r6
210         jarl ___mulsi3,r31
211         ld.w 0[sp],r6
212         subr r6,r10
213         ld.w 8[sp],r31
214         add 12,sp
215         jmp [r31]
217 #else /* defined(__v850e__) */
219         /* See comments at end of __mulsi3.  */
220         divu  r7, r6, r10
221         jmp   [r31]
223 #endif /* __v850e__ */
225         .size ___umodsi3,.-___umodsi3
226 #endif /* L_umodsi3 */
228 #ifdef  L_modsi3
229         .text
230         .globl ___modsi3
231         .type  ___modsi3,@function
232 ___modsi3:
233 #ifdef __v850__ 
234         add -12,sp
235         st.w r31,8[sp]
236         st.w r7,4[sp]
237         st.w r6,0[sp]
238         jarl ___divsi3,r31
239         ld.w 4[sp],r7
240         mov r10,r6
241         jarl ___mulsi3,r31
242         ld.w 0[sp],r6
243         subr r6,r10
244         ld.w 8[sp],r31
245         add 12,sp
246         jmp [r31]
248 #else /* defined(__v850e__) */
250         /* See comments at end of __mulsi3.  */
251         div  r7, r6, r10
252         jmp [r31]
254 #endif /* __v850e__ */
256         .size ___modsi3,.-___modsi3
257 #endif /* L_modsi3 */
259 #ifdef  L_save_2
260         .text
261         .align  2
262         .globl  __save_r2_r29
263         .type   __save_r2_r29,@function
264         /* Allocate space and save registers 2, 20 .. 29 on the stack.  */
265         /* Called via:  jalr __save_r2_r29,r10.  */
266 __save_r2_r29:
267 #ifdef __EP__
268         mov     ep,r1
269         addi    -44,sp,sp
270         mov     sp,ep
271         sst.w   r29,0[ep]
272         sst.w   r28,4[ep]
273         sst.w   r27,8[ep]
274         sst.w   r26,12[ep]
275         sst.w   r25,16[ep]
276         sst.w   r24,20[ep]
277         sst.w   r23,24[ep]
278         sst.w   r22,28[ep]
279         sst.w   r21,32[ep]
280         sst.w   r20,36[ep]
281         sst.w   r2,40[ep]
282         mov     r1,ep
283 #else
284         addi    -44,sp,sp
285         st.w    r29,0[sp]
286         st.w    r28,4[sp]
287         st.w    r27,8[sp]
288         st.w    r26,12[sp]
289         st.w    r25,16[sp]
290         st.w    r24,20[sp]
291         st.w    r23,24[sp]
292         st.w    r22,28[sp]
293         st.w    r21,32[sp]
294         st.w    r20,36[sp]
295         st.w    r2,40[sp]
296 #endif
297         jmp     [r10]
298         .size   __save_r2_r29,.-__save_r2_r29
300         /* Restore saved registers, deallocate stack and return to the user.  */
301         /* Called via:  jr __return_r2_r29.  */
302         .align  2
303         .globl  __return_r2_r29
304         .type   __return_r2_r29,@function
305 __return_r2_r29:
306 #ifdef __EP__
307         mov     ep,r1
308         mov     sp,ep
309         sld.w   0[ep],r29
310         sld.w   4[ep],r28
311         sld.w   8[ep],r27
312         sld.w   12[ep],r26
313         sld.w   16[ep],r25
314         sld.w   20[ep],r24
315         sld.w   24[ep],r23
316         sld.w   28[ep],r22
317         sld.w   32[ep],r21
318         sld.w   36[ep],r20
319         sld.w   40[ep],r2
320         addi    44,sp,sp
321         mov     r1,ep
322 #else
323         ld.w    0[sp],r29
324         ld.w    4[sp],r28
325         ld.w    8[sp],r27
326         ld.w    12[sp],r26
327         ld.w    16[sp],r25
328         ld.w    20[sp],r24
329         ld.w    24[sp],r23
330         ld.w    28[sp],r22
331         ld.w    32[sp],r21
332         ld.w    36[sp],r20
333         ld.w    40[sp],r2
334         addi    44,sp,sp
335 #endif
336         jmp     [r31]
337         .size   __return_r2_r29,.-__return_r2_r29
338 #endif /* L_save_2 */
340 #ifdef  L_save_20
341         .text
342         .align  2
343         .globl  __save_r20_r29
344         .type   __save_r20_r29,@function
345         /* Allocate space and save registers 20 .. 29 on the stack.  */
346         /* Called via:  jalr __save_r20_r29,r10.  */
347 __save_r20_r29:
348 #ifdef __EP__
349         mov     ep,r1
350         addi    -40,sp,sp
351         mov     sp,ep
352         sst.w   r29,0[ep]
353         sst.w   r28,4[ep]
354         sst.w   r27,8[ep]
355         sst.w   r26,12[ep]
356         sst.w   r25,16[ep]
357         sst.w   r24,20[ep]
358         sst.w   r23,24[ep]
359         sst.w   r22,28[ep]
360         sst.w   r21,32[ep]
361         sst.w   r20,36[ep]
362         mov     r1,ep
363 #else
364         addi    -40,sp,sp
365         st.w    r29,0[sp]
366         st.w    r28,4[sp]
367         st.w    r27,8[sp]
368         st.w    r26,12[sp]
369         st.w    r25,16[sp]
370         st.w    r24,20[sp]
371         st.w    r23,24[sp]
372         st.w    r22,28[sp]
373         st.w    r21,32[sp]
374         st.w    r20,36[sp]
375 #endif
376         jmp     [r10]
377         .size   __save_r20_r29,.-__save_r20_r29
379         /* Restore saved registers, deallocate stack and return to the user.  */
380         /* Called via:  jr __return_r20_r29.  */
381         .align  2
382         .globl  __return_r20_r29
383         .type   __return_r20_r29,@function
384 __return_r20_r29:
385 #ifdef __EP__
386         mov     ep,r1
387         mov     sp,ep
388         sld.w   0[ep],r29
389         sld.w   4[ep],r28
390         sld.w   8[ep],r27
391         sld.w   12[ep],r26
392         sld.w   16[ep],r25
393         sld.w   20[ep],r24
394         sld.w   24[ep],r23
395         sld.w   28[ep],r22
396         sld.w   32[ep],r21
397         sld.w   36[ep],r20
398         addi    40,sp,sp
399         mov     r1,ep
400 #else
401         ld.w    0[sp],r29
402         ld.w    4[sp],r28
403         ld.w    8[sp],r27
404         ld.w    12[sp],r26
405         ld.w    16[sp],r25
406         ld.w    20[sp],r24
407         ld.w    24[sp],r23
408         ld.w    28[sp],r22
409         ld.w    32[sp],r21
410         ld.w    36[sp],r20
411         addi    40,sp,sp
412 #endif
413         jmp     [r31]
414         .size   __return_r20_r29,.-__return_r20_r29
415 #endif /* L_save_20 */
417 #ifdef  L_save_21
418         .text
419         .align  2
420         .globl  __save_r21_r29
421         .type   __save_r21_r29,@function
422         /* Allocate space and save registers 21 .. 29 on the stack.  */
423         /* Called via:  jalr __save_r21_r29,r10.  */
424 __save_r21_r29:
425 #ifdef __EP__
426         mov     ep,r1
427         addi    -36,sp,sp
428         mov     sp,ep
429         sst.w   r29,0[ep]
430         sst.w   r28,4[ep]
431         sst.w   r27,8[ep]
432         sst.w   r26,12[ep]
433         sst.w   r25,16[ep]
434         sst.w   r24,20[ep]
435         sst.w   r23,24[ep]
436         sst.w   r22,28[ep]
437         sst.w   r21,32[ep]
438         mov     r1,ep
439 #else
440         addi    -36,sp,sp
441         st.w    r29,0[sp]
442         st.w    r28,4[sp]
443         st.w    r27,8[sp]
444         st.w    r26,12[sp]
445         st.w    r25,16[sp]
446         st.w    r24,20[sp]
447         st.w    r23,24[sp]
448         st.w    r22,28[sp]
449         st.w    r21,32[sp]
450 #endif
451         jmp     [r10]
452         .size   __save_r21_r29,.-__save_r21_r29
454         /* Restore saved registers, deallocate stack and return to the user.  */
455         /* Called via:  jr __return_r21_r29.  */
456         .align  2
457         .globl  __return_r21_r29
458         .type   __return_r21_r29,@function
459 __return_r21_r29:
460 #ifdef __EP__
461         mov     ep,r1
462         mov     sp,ep
463         sld.w   0[ep],r29
464         sld.w   4[ep],r28
465         sld.w   8[ep],r27
466         sld.w   12[ep],r26
467         sld.w   16[ep],r25
468         sld.w   20[ep],r24
469         sld.w   24[ep],r23
470         sld.w   28[ep],r22
471         sld.w   32[ep],r21
472         addi    36,sp,sp
473         mov     r1,ep
474 #else
475         ld.w    0[sp],r29
476         ld.w    4[sp],r28
477         ld.w    8[sp],r27
478         ld.w    12[sp],r26
479         ld.w    16[sp],r25
480         ld.w    20[sp],r24
481         ld.w    24[sp],r23
482         ld.w    28[sp],r22
483         ld.w    32[sp],r21
484         addi    36,sp,sp
485 #endif
486         jmp     [r31]
487         .size   __return_r21_r29,.-__return_r21_r29
488 #endif /* L_save_21 */
490 #ifdef  L_save_22
491         .text
492         .align  2
493         .globl  __save_r22_r29
494         .type   __save_r22_r29,@function
495         /* Allocate space and save registers 22 .. 29 on the stack.  */
496         /* Called via:  jalr __save_r22_r29,r10.  */
497 __save_r22_r29:
498 #ifdef __EP__
499         mov     ep,r1
500         addi    -32,sp,sp
501         mov     sp,ep
502         sst.w   r29,0[ep]
503         sst.w   r28,4[ep]
504         sst.w   r27,8[ep]
505         sst.w   r26,12[ep]
506         sst.w   r25,16[ep]
507         sst.w   r24,20[ep]
508         sst.w   r23,24[ep]
509         sst.w   r22,28[ep]
510         mov     r1,ep
511 #else
512         addi    -32,sp,sp
513         st.w    r29,0[sp]
514         st.w    r28,4[sp]
515         st.w    r27,8[sp]
516         st.w    r26,12[sp]
517         st.w    r25,16[sp]
518         st.w    r24,20[sp]
519         st.w    r23,24[sp]
520         st.w    r22,28[sp]
521 #endif
522         jmp     [r10]
523         .size   __save_r22_r29,.-__save_r22_r29
525         /* Restore saved registers, deallocate stack and return to the user.  */
526         /* Called via:  jr __return_r22_r29.  */
527         .align  2
528         .globl  __return_r22_r29
529         .type   __return_r22_r29,@function
530 __return_r22_r29:
531 #ifdef __EP__
532         mov     ep,r1
533         mov     sp,ep
534         sld.w   0[ep],r29
535         sld.w   4[ep],r28
536         sld.w   8[ep],r27
537         sld.w   12[ep],r26
538         sld.w   16[ep],r25
539         sld.w   20[ep],r24
540         sld.w   24[ep],r23
541         sld.w   28[ep],r22
542         addi    32,sp,sp
543         mov     r1,ep
544 #else
545         ld.w    0[sp],r29
546         ld.w    4[sp],r28
547         ld.w    8[sp],r27
548         ld.w    12[sp],r26
549         ld.w    16[sp],r25
550         ld.w    20[sp],r24
551         ld.w    24[sp],r23
552         ld.w    28[sp],r22
553         addi    32,sp,sp
554 #endif
555         jmp     [r31]
556         .size   __return_r22_r29,.-__return_r22_r29
557 #endif /* L_save_22 */
559 #ifdef  L_save_23
560         .text
561         .align  2
562         .globl  __save_r23_r29
563         .type   __save_r23_r29,@function
564         /* Allocate space and save registers 23 .. 29 on the stack.  */
565         /* Called via:  jalr __save_r23_r29,r10.  */
566 __save_r23_r29:
567 #ifdef __EP__
568         mov     ep,r1
569         addi    -28,sp,sp
570         mov     sp,ep
571         sst.w   r29,0[ep]
572         sst.w   r28,4[ep]
573         sst.w   r27,8[ep]
574         sst.w   r26,12[ep]
575         sst.w   r25,16[ep]
576         sst.w   r24,20[ep]
577         sst.w   r23,24[ep]
578         mov     r1,ep
579 #else
580         addi    -28,sp,sp
581         st.w    r29,0[sp]
582         st.w    r28,4[sp]
583         st.w    r27,8[sp]
584         st.w    r26,12[sp]
585         st.w    r25,16[sp]
586         st.w    r24,20[sp]
587         st.w    r23,24[sp]
588 #endif
589         jmp     [r10]
590         .size   __save_r23_r29,.-__save_r23_r29
592         /* Restore saved registers, deallocate stack and return to the user.  */
593         /* Called via:  jr __return_r23_r29.  */
594         .align  2
595         .globl  __return_r23_r29
596         .type   __return_r23_r29,@function
597 __return_r23_r29:
598 #ifdef __EP__
599         mov     ep,r1
600         mov     sp,ep
601         sld.w   0[ep],r29
602         sld.w   4[ep],r28
603         sld.w   8[ep],r27
604         sld.w   12[ep],r26
605         sld.w   16[ep],r25
606         sld.w   20[ep],r24
607         sld.w   24[ep],r23
608         addi    28,sp,sp
609         mov     r1,ep
610 #else
611         ld.w    0[sp],r29
612         ld.w    4[sp],r28
613         ld.w    8[sp],r27
614         ld.w    12[sp],r26
615         ld.w    16[sp],r25
616         ld.w    20[sp],r24
617         ld.w    24[sp],r23
618         addi    28,sp,sp
619 #endif
620         jmp     [r31]
621         .size   __return_r23_r29,.-__return_r23_r29
622 #endif /* L_save_23 */
624 #ifdef  L_save_24
625         .text
626         .align  2
627         .globl  __save_r24_r29
628         .type   __save_r24_r29,@function
629         /* Allocate space and save registers 24 .. 29 on the stack.  */
630         /* Called via:  jalr __save_r24_r29,r10.  */
631 __save_r24_r29:
632 #ifdef __EP__
633         mov     ep,r1
634         addi    -24,sp,sp
635         mov     sp,ep
636         sst.w   r29,0[ep]
637         sst.w   r28,4[ep]
638         sst.w   r27,8[ep]
639         sst.w   r26,12[ep]
640         sst.w   r25,16[ep]
641         sst.w   r24,20[ep]
642         mov     r1,ep
643 #else
644         addi    -24,sp,sp
645         st.w    r29,0[sp]
646         st.w    r28,4[sp]
647         st.w    r27,8[sp]
648         st.w    r26,12[sp]
649         st.w    r25,16[sp]
650         st.w    r24,20[sp]
651 #endif
652         jmp     [r10]
653         .size   __save_r24_r29,.-__save_r24_r29
655         /* Restore saved registers, deallocate stack and return to the user.  */
656         /* Called via:  jr __return_r24_r29.  */
657         .align  2
658         .globl  __return_r24_r29
659         .type   __return_r24_r29,@function
660 __return_r24_r29:
661 #ifdef __EP__
662         mov     ep,r1
663         mov     sp,ep
664         sld.w   0[ep],r29
665         sld.w   4[ep],r28
666         sld.w   8[ep],r27
667         sld.w   12[ep],r26
668         sld.w   16[ep],r25
669         sld.w   20[ep],r24
670         addi    24,sp,sp
671         mov     r1,ep
672 #else
673         ld.w    0[sp],r29
674         ld.w    4[sp],r28
675         ld.w    8[sp],r27
676         ld.w    12[sp],r26
677         ld.w    16[sp],r25
678         ld.w    20[sp],r24
679         addi    24,sp,sp
680 #endif
681         jmp     [r31]
682         .size   __return_r24_r29,.-__return_r24_r29
683 #endif /* L_save_24 */
685 #ifdef  L_save_25
686         .text
687         .align  2
688         .globl  __save_r25_r29
689         .type   __save_r25_r29,@function
690         /* Allocate space and save registers 25 .. 29 on the stack.  */
691         /* Called via:  jalr __save_r25_r29,r10.  */
692 __save_r25_r29:
693 #ifdef __EP__
694         mov     ep,r1
695         addi    -20,sp,sp
696         mov     sp,ep
697         sst.w   r29,0[ep]
698         sst.w   r28,4[ep]
699         sst.w   r27,8[ep]
700         sst.w   r26,12[ep]
701         sst.w   r25,16[ep]
702         mov     r1,ep
703 #else
704         addi    -20,sp,sp
705         st.w    r29,0[sp]
706         st.w    r28,4[sp]
707         st.w    r27,8[sp]
708         st.w    r26,12[sp]
709         st.w    r25,16[sp]
710 #endif
711         jmp     [r10]
712         .size   __save_r25_r29,.-__save_r25_r29
714         /* Restore saved registers, deallocate stack and return to the user.  */
715         /* Called via:  jr __return_r25_r29.  */
716         .align  2
717         .globl  __return_r25_r29
718         .type   __return_r25_r29,@function
719 __return_r25_r29:
720 #ifdef __EP__
721         mov     ep,r1
722         mov     sp,ep
723         sld.w   0[ep],r29
724         sld.w   4[ep],r28
725         sld.w   8[ep],r27
726         sld.w   12[ep],r26
727         sld.w   16[ep],r25
728         addi    20,sp,sp
729         mov     r1,ep
730 #else
731         ld.w    0[ep],r29
732         ld.w    4[ep],r28
733         ld.w    8[ep],r27
734         ld.w    12[ep],r26
735         ld.w    16[ep],r25
736         addi    20,sp,sp
737 #endif
738         jmp     [r31]
739         .size   __return_r25_r29,.-__return_r25_r29
740 #endif /* L_save_25 */
742 #ifdef  L_save_26
743         .text
744         .align  2
745         .globl  __save_r26_r29
746         .type   __save_r26_r29,@function
747         /* Allocate space and save registers 26 .. 29 on the stack.  */
748         /* Called via:  jalr __save_r26_r29,r10.  */
749 __save_r26_r29:
750 #ifdef __EP__
751         mov     ep,r1
752         add     -16,sp
753         mov     sp,ep
754         sst.w   r29,0[ep]
755         sst.w   r28,4[ep]
756         sst.w   r27,8[ep]
757         sst.w   r26,12[ep]
758         mov     r1,ep
759 #else
760         add     -16,sp
761         st.w    r29,0[sp]
762         st.w    r28,4[sp]
763         st.w    r27,8[sp]
764         st.w    r26,12[sp]
765 #endif
766         jmp     [r10]
767         .size   __save_r26_r29,.-__save_r26_r29
769         /* Restore saved registers, deallocate stack and return to the user.  */
770         /* Called via:  jr __return_r26_r29.  */
771         .align  2
772         .globl  __return_r26_r29
773         .type   __return_r26_r29,@function
774 __return_r26_r29:
775 #ifdef __EP__
776         mov     ep,r1
777         mov     sp,ep
778         sld.w   0[ep],r29
779         sld.w   4[ep],r28
780         sld.w   8[ep],r27
781         sld.w   12[ep],r26
782         addi    16,sp,sp
783         mov     r1,ep
784 #else
785         ld.w    0[sp],r29
786         ld.w    4[sp],r28
787         ld.w    8[sp],r27
788         ld.w    12[sp],r26
789         addi    16,sp,sp
790 #endif
791         jmp     [r31]
792         .size   __return_r26_r29,.-__return_r26_r29
793 #endif /* L_save_26 */
795 #ifdef  L_save_27
796         .text
797         .align  2
798         .globl  __save_r27_r29
799         .type   __save_r27_r29,@function
800         /* Allocate space and save registers 27 .. 29 on the stack.  */
801         /* Called via:  jalr __save_r27_r29,r10.  */
802 __save_r27_r29:
803         add     -12,sp
804         st.w    r29,0[sp]
805         st.w    r28,4[sp]
806         st.w    r27,8[sp]
807         jmp     [r10]
808         .size   __save_r27_r29,.-__save_r27_r29
810         /* Restore saved registers, deallocate stack and return to the user.  */
811         /* Called via:  jr __return_r27_r29.  */
812         .align  2
813         .globl  __return_r27_r29
814         .type   __return_r27_r29,@function
815 __return_r27_r29:
816         ld.w    0[sp],r29
817         ld.w    4[sp],r28
818         ld.w    8[sp],r27
819         add     12,sp
820         jmp     [r31]
821         .size   __return_r27_r29,.-__return_r27_r29
822 #endif /* L_save_27 */
824 #ifdef  L_save_28
825         .text
826         .align  2
827         .globl  __save_r28_r29
828         .type   __save_r28_r29,@function
829         /* Allocate space and save registers 28,29 on the stack.  */
830         /* Called via:  jalr __save_r28_r29,r10.  */
831 __save_r28_r29:
832         add     -8,sp
833         st.w    r29,0[sp]
834         st.w    r28,4[sp]
835         jmp     [r10]
836         .size   __save_r28_r29,.-__save_r28_r29
838         /* Restore saved registers, deallocate stack and return to the user.  */
839         /* Called via:  jr __return_r28_r29.  */
840         .align  2
841         .globl  __return_r28_r29
842         .type   __return_r28_r29,@function
843 __return_r28_r29:
844         ld.w    0[sp],r29
845         ld.w    4[sp],r28
846         add     8,sp
847         jmp     [r31]
848         .size   __return_r28_r29,.-__return_r28_r29
849 #endif /* L_save_28 */
851 #ifdef  L_save_29
852         .text
853         .align  2
854         .globl  __save_r29
855         .type   __save_r29,@function
856         /* Allocate space and save register 29 on the stack.  */
857         /* Called via:  jalr __save_r29,r10.  */
858 __save_r29:
859         add     -4,sp
860         st.w    r29,0[sp]
861         jmp     [r10]
862         .size   __save_r29,.-__save_r29
864         /* Restore saved register 29, deallocate stack and return to the user.  */
865         /* Called via:  jr __return_r29.  */
866         .align  2
867         .globl  __return_r29
868         .type   __return_r29,@function
869 __return_r29:
870         ld.w    0[sp],r29
871         add     4,sp
872         jmp     [r31]
873         .size   __return_r29,.-__return_r29
874 #endif /* L_save_28 */
876 #ifdef  L_save_2c
877         .text
878         .align  2
879         .globl  __save_r2_r31
880         .type   __save_r2_r31,@function
881         /* Allocate space and save registers 20 .. 29, 31 on the stack.  */
882         /* Also allocate space for the argument save area.  */
883         /* Called via:  jalr __save_r2_r31,r10.  */
884 __save_r2_r31:
885 #ifdef __EP__
886         mov     ep,r1
887         addi    -48,sp,sp
888         mov     sp,ep
889         sst.w   r29,0[ep]
890         sst.w   r28,4[ep]
891         sst.w   r27,8[ep]
892         sst.w   r26,12[ep]
893         sst.w   r25,16[ep]
894         sst.w   r24,20[ep]
895         sst.w   r23,24[ep]
896         sst.w   r22,28[ep]
897         sst.w   r21,32[ep]
898         sst.w   r20,36[ep]
899         sst.w   r2,40[ep]
900         sst.w   r31,44[ep]
901         mov     r1,ep
902 #else
903         addi    -48,sp,sp
904         st.w    r29,0[sp]
905         st.w    r28,4[sp]
906         st.w    r27,8[sp]
907         st.w    r26,12[sp]
908         st.w    r25,16[sp]
909         st.w    r24,20[sp]
910         st.w    r23,24[sp]
911         st.w    r22,28[sp]
912         st.w    r21,32[sp]
913         st.w    r20,36[sp]
914         st.w    r2,40[sp]
915         st.w    r31,44[sp]
916 #endif
917         jmp     [r10]
918         .size   __save_r2_r31,.-__save_r2_r31
920         /* Restore saved registers, deallocate stack and return to the user.  */
921         /* Called via:  jr __return_r20_r31.  */
922         .align  2
923         .globl  __return_r2_r31
924         .type   __return_r2_r31,@function
925 __return_r2_r31:
926 #ifdef __EP__
927         mov     ep,r1
928         mov     sp,ep
929         sld.w   0[ep],r29
930         sld.w   4[ep],r28
931         sld.w   8[ep],r27
932         sld.w   12[ep],r26
933         sld.w   16[ep],r25
934         sld.w   20[ep],r24
935         sld.w   24[ep],r23
936         sld.w   28[ep],r22
937         sld.w   32[ep],r21
938         sld.w   36[ep],r20
939         sld.w   40[ep],r2
940         sld.w   44[ep],r31
941         addi    48,sp,sp
942         mov     r1,ep
943 #else
944         ld.w    44[sp],r29
945         ld.w    40[sp],r28
946         ld.w    36[sp],r27
947         ld.w    32[sp],r26
948         ld.w    28[sp],r25
949         ld.w    24[sp],r24
950         ld.w    20[sp],r23
951         ld.w    16[sp],r22
952         ld.w    12[sp],r21
953         ld.w    8[sp],r20
954         ld.w    4[sp],r2
955         ld.w    0[sp],r31
956         addi    48,sp,sp
957 #endif
958         jmp     [r31]
959         .size   __return_r2_r31,.-__return_r2_r31
960 #endif /* L_save_2c */
962 #ifdef  L_save_20c
963         .text
964         .align  2
965         .globl  __save_r20_r31
966         .type   __save_r20_r31,@function
967         /* Allocate space and save registers 20 .. 29, 31 on the stack.  */
968         /* Also allocate space for the argument save area.  */
969         /* Called via:  jalr __save_r20_r31,r10.  */
970 __save_r20_r31:
971 #ifdef __EP__
972         mov     ep,r1
973         addi    -44,sp,sp
974         mov     sp,ep
975         sst.w   r29,0[ep]
976         sst.w   r28,4[ep]
977         sst.w   r27,8[ep]
978         sst.w   r26,12[ep]
979         sst.w   r25,16[ep]
980         sst.w   r24,20[ep]
981         sst.w   r23,24[ep]
982         sst.w   r22,28[ep]
983         sst.w   r21,32[ep]
984         sst.w   r20,36[ep]
985         sst.w   r31,40[ep]
986         mov     r1,ep
987 #else
988         addi    -44,sp,sp
989         st.w    r29,0[sp]
990         st.w    r28,4[sp]
991         st.w    r27,8[sp]
992         st.w    r26,12[sp]
993         st.w    r25,16[sp]
994         st.w    r24,20[sp]
995         st.w    r23,24[sp]
996         st.w    r22,28[sp]
997         st.w    r21,32[sp]
998         st.w    r20,36[sp]
999         st.w    r31,40[sp]
1000 #endif
1001         jmp     [r10]
1002         .size   __save_r20_r31,.-__save_r20_r31
1004         /* Restore saved registers, deallocate stack and return to the user.  */
1005         /* Called via:  jr __return_r20_r31.  */
1006         .align  2
1007         .globl  __return_r20_r31
1008         .type   __return_r20_r31,@function
1009 __return_r20_r31:
1010 #ifdef __EP__
1011         mov     ep,r1
1012         mov     sp,ep
1013         sld.w   0[ep],r29
1014         sld.w   4[ep],r28
1015         sld.w   8[ep],r27
1016         sld.w   12[ep],r26
1017         sld.w   16[ep],r25
1018         sld.w   20[ep],r24
1019         sld.w   24[ep],r23
1020         sld.w   28[ep],r22
1021         sld.w   32[ep],r21
1022         sld.w   36[ep],r20
1023         sld.w   40[ep],r31
1024         addi    44,sp,sp
1025         mov     r1,ep
1026 #else
1027         ld.w    0[sp],r29
1028         ld.w    4[sp],r28
1029         ld.w    8[sp],r27
1030         ld.w    12[sp],r26
1031         ld.w    16[sp],r25
1032         ld.w    20[sp],r24
1033         ld.w    24[sp],r23
1034         ld.w    28[sp],r22
1035         ld.w    32[sp],r21
1036         ld.w    36[sp],r20
1037         ld.w    40[sp],r31
1038         addi    44,sp,sp
1039 #endif
1040         jmp     [r31]
1041         .size   __return_r20_r31,.-__return_r20_r31
1042 #endif /* L_save_20c */
1044 #ifdef  L_save_21c
1045         .text
1046         .align  2
1047         .globl  __save_r21_r31
1048         .type   __save_r21_r31,@function
1049         /* Allocate space and save registers 21 .. 29, 31 on the stack.  */
1050         /* Also allocate space for the argument save area.  */
1051         /* Called via:  jalr __save_r21_r31,r10.  */
1052 __save_r21_r31:
1053 #ifdef __EP__   
1054         mov     ep,r1
1055         addi    -40,sp,sp
1056         mov     sp,ep
1057         sst.w   r29,0[ep]
1058         sst.w   r28,4[ep]
1059         sst.w   r27,8[ep]
1060         sst.w   r26,12[ep]
1061         sst.w   r25,16[ep]
1062         sst.w   r24,20[ep]
1063         sst.w   r23,24[ep]
1064         sst.w   r22,28[ep]
1065         sst.w   r21,32[ep]
1066         sst.w   r31,36[ep]
1067         mov     r1,ep
1068         jmp     [r10]
1069 #else   
1070         addi    -40,sp,sp
1071         st.w    r29,0[sp]
1072         st.w    r28,4[sp]
1073         st.w    r27,8[sp]
1074         st.w    r26,12[sp]
1075         st.w    r25,16[sp]
1076         st.w    r24,20[sp]
1077         st.w    r23,24[sp]
1078         st.w    r22,28[sp]
1079         st.w    r21,32[sp]
1080         st.w    r31,36[sp]
1081         jmp     [r10]
1082 #endif  
1083         .size   __save_r21_r31,.-__save_r21_r31
1085         /* Restore saved registers, deallocate stack and return to the user.  */
1086         /* Called via:  jr __return_r21_r31.  */
1087         .align  2
1088         .globl  __return_r21_r31
1089         .type   __return_r21_r31,@function
1090 __return_r21_r31:
1091 #ifdef __EP__
1092         mov     ep,r1
1093         mov     sp,ep
1094         sld.w   0[ep],r29
1095         sld.w   4[ep],r28
1096         sld.w   8[ep],r27
1097         sld.w   12[ep],r26
1098         sld.w   16[ep],r25
1099         sld.w   20[ep],r24
1100         sld.w   24[ep],r23
1101         sld.w   28[ep],r22
1102         sld.w   32[ep],r21
1103         sld.w   36[ep],r31
1104         addi    40,sp,sp
1105         mov     r1,ep
1106 #else
1107         ld.w    0[sp],r29
1108         ld.w    4[sp],r28
1109         ld.w    8[sp],r27
1110         ld.w    12[sp],r26
1111         ld.w    16[sp],r25
1112         ld.w    20[sp],r24
1113         ld.w    24[sp],r23
1114         ld.w    28[sp],r22
1115         ld.w    32[sp],r21
1116         ld.w    36[sp],r31
1117         addi    40,sp,sp
1118 #endif
1119         jmp     [r31]
1120         .size   __return_r21_r31,.-__return_r21_r31
1121 #endif /* L_save_21c */
1123 #ifdef  L_save_22c
1124         .text
1125         .align  2
1126         .globl  __save_r22_r31
1127         .type   __save_r22_r31,@function
1128         /* Allocate space and save registers 22 .. 29, 31 on the stack.  */
1129         /* Also allocate space for the argument save area.  */
1130         /* Called via:  jalr __save_r22_r31,r10.  */
1131 __save_r22_r31:
1132 #ifdef __EP__
1133         mov     ep,r1
1134         addi    -36,sp,sp
1135         mov     sp,ep
1136         sst.w   r29,0[ep]
1137         sst.w   r28,4[ep]
1138         sst.w   r27,8[ep]
1139         sst.w   r26,12[ep]
1140         sst.w   r25,16[ep]
1141         sst.w   r24,20[ep]
1142         sst.w   r23,24[ep]
1143         sst.w   r22,28[ep]
1144         sst.w   r31,32[ep]
1145         mov     r1,ep
1146 #else
1147         addi    -36,sp,sp
1148         st.w    r29,0[sp]
1149         st.w    r28,4[sp]
1150         st.w    r27,8[sp]
1151         st.w    r26,12[sp]
1152         st.w    r25,16[sp]
1153         st.w    r24,20[sp]
1154         st.w    r23,24[sp]
1155         st.w    r22,28[sp]
1156         st.w    r31,32[sp]
1157 #endif
1158         jmp     [r10]
1159         .size   __save_r22_r31,.-__save_r22_r31
1161         /* Restore saved registers, deallocate stack and return to the user.  */
1162         /* Called via:  jr __return_r22_r31.  */
1163         .align  2
1164         .globl  __return_r22_r31
1165         .type   __return_r22_r31,@function
1166 __return_r22_r31:
1167 #ifdef __EP__
1168         mov     ep,r1
1169         mov     sp,ep
1170         sld.w   0[ep],r29
1171         sld.w   4[ep],r28
1172         sld.w   8[ep],r27
1173         sld.w   12[ep],r26
1174         sld.w   16[ep],r25
1175         sld.w   20[ep],r24
1176         sld.w   24[ep],r23
1177         sld.w   28[ep],r22
1178         sld.w   32[ep],r31
1179         addi    36,sp,sp
1180         mov     r1,ep
1181 #else
1182         ld.w    0[sp],r29
1183         ld.w    4[sp],r28
1184         ld.w    8[sp],r27
1185         ld.w    12[sp],r26
1186         ld.w    16[sp],r25
1187         ld.w    20[sp],r24
1188         ld.w    24[sp],r23
1189         ld.w    28[sp],r22
1190         ld.w    32[sp],r31
1191         addi    36,sp,sp
1192 #endif
1193         jmp     [r31]
1194         .size   __return_r22_r31,.-__return_r22_r31
1195 #endif /* L_save_22c */
1197 #ifdef  L_save_23c
1198         .text
1199         .align  2
1200         .globl  __save_r23_r31
1201         .type   __save_r23_r31,@function
1202         /* Allocate space and save registers 23 .. 29, 31 on the stack.  */
1203         /* Also allocate space for the argument save area.  */
1204         /* Called via:  jalr __save_r23_r31,r10.  */
1205 __save_r23_r31:
1206 #ifdef __EP__
1207         mov     ep,r1
1208         addi    -32,sp,sp
1209         mov     sp,ep
1210         sst.w   r29,0[ep]
1211         sst.w   r28,4[ep]
1212         sst.w   r27,8[ep]
1213         sst.w   r26,12[ep]
1214         sst.w   r25,16[ep]
1215         sst.w   r24,20[ep]
1216         sst.w   r23,24[ep]
1217         sst.w   r31,28[ep]
1218         mov     r1,ep
1219 #else
1220         addi    -32,sp,sp
1221         st.w    r29,0[sp]
1222         st.w    r28,4[sp]
1223         st.w    r27,8[sp]
1224         st.w    r26,12[sp]
1225         st.w    r25,16[sp]
1226         st.w    r24,20[sp]
1227         st.w    r23,24[sp]
1228         st.w    r31,28[sp]
1229 #endif
1230         jmp     [r10]
1231         .size   __save_r23_r31,.-__save_r23_r31
1233         /* Restore saved registers, deallocate stack and return to the user.  */
1234         /* Called via:  jr __return_r23_r31.  */
1235         .align  2
1236         .globl  __return_r23_r31
1237         .type   __return_r23_r31,@function
1238 __return_r23_r31:
1239 #ifdef __EP__
1240         mov     ep,r1
1241         mov     sp,ep
1242         sld.w   0[ep],r29
1243         sld.w   4[ep],r28
1244         sld.w   8[ep],r27
1245         sld.w   12[ep],r26
1246         sld.w   16[ep],r25
1247         sld.w   20[ep],r24
1248         sld.w   24[ep],r23
1249         sld.w   28[ep],r31
1250         addi    32,sp,sp
1251         mov     r1,ep
1252 #else
1253         ld.w    0[sp],r29
1254         ld.w    4[sp],r28
1255         ld.w    8[sp],r27
1256         ld.w    12[sp],r26
1257         ld.w    16[sp],r25
1258         ld.w    20[sp],r24
1259         ld.w    24[sp],r23
1260         ld.w    28[sp],r31
1261         addi    32,sp,sp
1262 #endif
1263         jmp     [r31]
1264         .size   __return_r23_r31,.-__return_r23_r31
1265 #endif /* L_save_23c */
1267 #ifdef  L_save_24c
1268         .text
1269         .align  2
1270         .globl  __save_r24_r31
1271         .type   __save_r24_r31,@function
1272         /* Allocate space and save registers 24 .. 29, 31 on the stack.  */
1273         /* Also allocate space for the argument save area.  */
1274         /* Called via:  jalr __save_r24_r31,r10.  */
1275 __save_r24_r31:
1276 #ifdef __EP__
1277         mov     ep,r1
1278         addi    -28,sp,sp
1279         mov     sp,ep
1280         sst.w   r29,0[ep]
1281         sst.w   r28,4[ep]
1282         sst.w   r27,8[ep]
1283         sst.w   r26,12[ep]
1284         sst.w   r25,16[ep]
1285         sst.w   r24,20[ep]
1286         sst.w   r31,24[ep]
1287         mov     r1,ep
1288 #else
1289         addi    -28,sp,sp
1290         st.w    r29,0[sp]
1291         st.w    r28,4[sp]
1292         st.w    r27,8[sp]
1293         st.w    r26,12[sp]
1294         st.w    r25,16[sp]
1295         st.w    r24,20[sp]
1296         st.w    r31,24[sp]
1297 #endif
1298         jmp     [r10]
1299         .size   __save_r24_r31,.-__save_r24_r31
1301         /* Restore saved registers, deallocate stack and return to the user.  */
1302         /* Called via:  jr __return_r24_r31.  */
1303         .align  2
1304         .globl  __return_r24_r31
1305         .type   __return_r24_r31,@function
1306 __return_r24_r31:
1307 #ifdef __EP__
1308         mov     ep,r1
1309         mov     sp,ep
1310         sld.w   0[ep],r29
1311         sld.w   4[ep],r28
1312         sld.w   8[ep],r27
1313         sld.w   12[ep],r26
1314         sld.w   16[ep],r25
1315         sld.w   20[ep],r24
1316         sld.w   24[ep],r31
1317         addi    28,sp,sp
1318         mov     r1,ep
1319 #else
1320         ld.w    0[sp],r29
1321         ld.w    4[sp],r28
1322         ld.w    8[sp],r27
1323         ld.w    12[sp],r26
1324         ld.w    16[sp],r25
1325         ld.w    20[sp],r24
1326         ld.w    24[sp],r31
1327         addi    28,sp,sp
1328 #endif
1329         jmp     [r31]
1330         .size   __return_r24_r31,.-__return_r24_r31
1331 #endif /* L_save_24c */
1333 #ifdef  L_save_25c
1334         .text
1335         .align  2
1336         .globl  __save_r25_r31
1337         .type   __save_r25_r31,@function
1338         /* Allocate space and save registers 25 .. 29, 31 on the stack.  */
1339         /* Also allocate space for the argument save area.  */
1340         /* Called via:  jalr __save_r25_r31,r10.  */
1341 __save_r25_r31:
1342 #ifdef __EP__
1343         mov     ep,r1
1344         addi    -24,sp,sp
1345         mov     sp,ep
1346         sst.w   r29,0[ep]
1347         sst.w   r28,4[ep]
1348         sst.w   r27,8[ep]
1349         sst.w   r26,12[ep]
1350         sst.w   r25,16[ep]
1351         sst.w   r31,20[ep]
1352         mov     r1,ep
1353 #else
1354         addi    -24,sp,sp
1355         st.w    r29,0[sp]
1356         st.w    r28,4[sp]
1357         st.w    r27,8[sp]
1358         st.w    r26,12[sp]
1359         st.w    r25,16[sp]
1360         st.w    r31,20[sp]
1361 #endif
1362         jmp     [r10]
1363         .size   __save_r25_r31,.-__save_r25_r31
1365         /* Restore saved registers, deallocate stack and return to the user.  */
1366         /* Called via:  jr __return_r25_r31.  */
1367         .align  2
1368         .globl  __return_r25_r31
1369         .type   __return_r25_r31,@function
1370 __return_r25_r31:
1371 #ifdef __EP__
1372         mov     ep,r1
1373         mov     sp,ep
1374         sld.w   0[ep],r29
1375         sld.w   4[ep],r28
1376         sld.w   8[ep],r27
1377         sld.w   12[ep],r26
1378         sld.w   16[ep],r25
1379         sld.w   20[ep],r31
1380         addi    24,sp,sp
1381         mov     r1,ep
1382 #else
1383         ld.w    0[sp],r29
1384         ld.w    4[sp],r28
1385         ld.w    8[sp],r27
1386         ld.w    12[sp],r26
1387         ld.w    16[sp],r25
1388         ld.w    20[sp],r31
1389         addi    24,sp,sp
1390 #endif
1391         jmp     [r31]
1392         .size   __return_r25_r31,.-__return_r25_r31
1393 #endif /* L_save_25c */
1395 #ifdef  L_save_26c
1396         .text
1397         .align  2
1398         .globl  __save_r26_r31
1399         .type   __save_r26_r31,@function
1400         /* Allocate space and save registers 26 .. 29, 31 on the stack.  */
1401         /* Also allocate space for the argument save area.  */
1402         /* Called via:  jalr __save_r26_r31,r10.  */
1403 __save_r26_r31:
1404 #ifdef __EP__
1405         mov     ep,r1
1406         addi    -20,sp,sp
1407         mov     sp,ep
1408         sst.w   r29,0[ep]
1409         sst.w   r28,4[ep]
1410         sst.w   r27,8[ep]
1411         sst.w   r26,12[ep]
1412         sst.w   r31,16[ep]
1413         mov     r1,ep
1414 #else
1415         addi    -20,sp,sp
1416         st.w    r29,0[sp]
1417         st.w    r28,4[sp]
1418         st.w    r27,8[sp]
1419         st.w    r26,12[sp]
1420         st.w    r31,16[sp]
1421 #endif
1422         jmp     [r10]
1423         .size   __save_r26_r31,.-__save_r26_r31
1425         /* Restore saved registers, deallocate stack and return to the user.  */
1426         /* Called via:  jr __return_r26_r31.  */
1427         .align  2
1428         .globl  __return_r26_r31
1429         .type   __return_r26_r31,@function
1430 __return_r26_r31:
1431 #ifdef __EP__
1432         mov     ep,r1
1433         mov     sp,ep
1434         sld.w   0[ep],r29
1435         sld.w   4[ep],r28
1436         sld.w   8[ep],r27
1437         sld.w   12[ep],r26
1438         sld.w   16[ep],r31
1439         addi    20,sp,sp
1440         mov     r1,ep
1441 #else
1442         ld.w    0[sp],r29
1443         ld.w    4[sp],r28
1444         ld.w    8[sp],r27
1445         ld.w    12[sp],r26
1446         ld.w    16[sp],r31
1447         addi    20,sp,sp
1448 #endif
1449         jmp     [r31]
1450         .size   __return_r26_r31,.-__return_r26_r31
1451 #endif /* L_save_26c */
1453 #ifdef  L_save_27c
1454         .text
1455         .align  2
1456         .globl  __save_r27_r31
1457         .type   __save_r27_r31,@function
1458         /* Allocate space and save registers 27 .. 29, 31 on the stack.  */
1459         /* Also allocate space for the argument save area.  */
1460         /* Called via:  jalr __save_r27_r31,r10.  */
1461 __save_r27_r31:
1462 #ifdef __EP__
1463         mov     ep,r1
1464         addi    -16,sp,sp
1465         mov     sp,ep
1466         sst.w   r29,0[ep]
1467         sst.w   r28,4[ep]
1468         sst.w   r27,8[ep]
1469         sst.w   r31,12[ep]
1470         mov     r1,ep
1471 #else
1472         addi    -16,sp,sp
1473         st.w    r29,0[sp]
1474         st.w    r28,4[sp]
1475         st.w    r27,8[sp]
1476         st.w    r31,12[sp]
1477 #endif
1478         jmp     [r10]
1479         .size   __save_r27_r31,.-__save_r27_r31
1481         /* Restore saved registers, deallocate stack and return to the user.  */
1482         /* Called via:  jr __return_r27_r31.  */
1483         .align  2
1484         .globl  __return_r27_r31
1485         .type   __return_r27_r31,@function
1486 __return_r27_r31:
1487 #ifdef __EP__
1488         mov     ep,r1
1489         mov     sp,ep
1490         sld.w   0[ep],r29
1491         sld.w   4[ep],r28
1492         sld.w   8[ep],r27
1493         sld.w   12[ep],r31
1494         addi    16,sp,sp
1495         mov     r1,ep
1496 #else
1497         ld.w    0[sp],r29
1498         ld.w    4[sp],r28
1499         ld.w    8[sp],r27
1500         ld.w    12[sp],r31
1501         addi    16,sp,sp
1502 #endif
1503         jmp     [r31]
1504         .size   __return_r27_r31,.-__return_r27_r31
1505 #endif /* L_save_27c */
1507 #ifdef  L_save_28c
1508         .text
1509         .align  2
1510         .globl  __save_r28_r31
1511         .type   __save_r28_r31,@function
1512         /* Allocate space and save registers 28 .. 29, 31 on the stack.  */
1513         /* Also allocate space for the argument save area.  */
1514         /* Called via:  jalr __save_r28_r31,r10.  */
1515 __save_r28_r31:
1516         addi    -12,sp,sp
1517         st.w    r29,0[sp]
1518         st.w    r28,4[sp]
1519         st.w    r31,8[sp]
1520         jmp     [r10]
1521         .size   __save_r28_r31,.-__save_r28_r31
1523         /* Restore saved registers, deallocate stack and return to the user.  */
1524         /* Called via:  jr __return_r28_r31.  */
1525         .align  2
1526         .globl  __return_r28_r31
1527         .type   __return_r28_r31,@function
1528 __return_r28_r31:
1529         ld.w    0[sp],r29
1530         ld.w    4[sp],r28
1531         ld.w    8[sp],r31
1532         addi    12,sp,sp
1533         jmp     [r31]
1534         .size   __return_r28_r31,.-__return_r28_r31
1535 #endif /* L_save_28c */
1537 #ifdef  L_save_29c
1538         .text
1539         .align  2
1540         .globl  __save_r29_r31
1541         .type   __save_r29_r31,@function
1542         /* Allocate space and save registers 29 & 31 on the stack.  */
1543         /* Also allocate space for the argument save area.  */
1544         /* Called via:  jalr __save_r29_r31,r10.  */
1545 __save_r29_r31:
1546         addi    -8,sp,sp
1547         st.w    r29,0[sp]
1548         st.w    r31,4[sp]
1549         jmp     [r10]
1550         .size   __save_r29_r31,.-__save_r29_r31
1552         /* Restore saved registers, deallocate stack and return to the user.  */
1553         /* Called via:  jr __return_r29_r31.  */
1554         .align  2
1555         .globl  __return_r29_r31
1556         .type   __return_r29_r31,@function
1557 __return_r29_r31:
1558         ld.w    0[sp],r29
1559         ld.w    4[sp],r31
1560         addi    8,sp,sp
1561         jmp     [r31]
1562         .size   __return_r29_r31,.-__return_r29_r31
1563 #endif /* L_save_29c */
1565 #ifdef  L_save_31c
1566         .text
1567         .align  2
1568         .globl  __save_r31
1569         .type   __save_r31,@function
1570         /* Allocate space and save register 31 on the stack.  */
1571         /* Also allocate space for the argument save area.  */
1572         /* Called via:  jalr __save_r31,r10.  */
1573 __save_r31:
1574         addi    -4,sp,sp
1575         st.w    r31,0[sp]
1576         jmp     [r10]
1577         .size   __save_r31,.-__save_r31
1579         /* Restore saved registers, deallocate stack and return to the user.  */
1580         /* Called via:  jr __return_r31.  */
1581         .align  2
1582         .globl  __return_r31
1583         .type   __return_r31,@function
1584 __return_r31:
1585         ld.w    0[sp],r31
1586         addi    4,sp,sp
1587         jmp     [r31]
1588         .size   __return_r31,.-__return_r31
1589 #endif /* L_save_31c */
1591 #ifdef  L_save_interrupt
1592         .text
1593         .align  2
1594         .globl  __save_interrupt
1595         .type   __save_interrupt,@function
1596         /* Save registers r1, r4 on stack and load up with expected values.  */
1597         /* Note, 20 bytes of stack have already been allocated.  */
1598         /* Called via:  jalr __save_interrupt,r10.  */
1599 __save_interrupt:
1600        /* add -20,sp ; st.w r11,16[sp] ; st.w r10,12[sp] ; */
1601         st.w    ep,0[sp]
1602         st.w    gp,4[sp]
1603         st.w    r1,8[sp]
1604         movhi   hi(__ep),r0,ep
1605         movea   lo(__ep),ep,ep
1606         movhi   hi(__gp),r0,gp
1607         movea   lo(__gp),gp,gp
1608         jmp     [r10]
1609         .size   __save_interrupt,.-__save_interrupt
1611         /* Restore saved registers, deallocate stack and return from the interrupt.  */
1612         /* Called via:  jr __return_interrupt.  */
1613         .align  2
1614         .globl  __return_interrupt
1615         .type   __return_interrupt,@function
1616 __return_interrupt:
1617         ld.w    0[sp],ep
1618         ld.w    4[sp],gp
1619         ld.w    8[sp],r1
1620         ld.w    12[sp],r10
1621         ld.w    16[sp],r11
1622         addi    20,sp,sp
1623         reti
1624         .size   __return_interrupt,.-__return_interrupt
1625 #endif /* L_save_interrupt */
1627 #ifdef L_save_all_interrupt
1628         .text
1629         .align  2
1630         .globl  __save_all_interrupt
1631         .type   __save_all_interrupt,@function
1632         /* Save all registers except for those saved in __save_interrupt.  */
1633         /* Allocate enough stack for all of the registers & 16 bytes of space.  */
1634         /* Called via:  jalr __save_all_interrupt,r10.  */
1635 __save_all_interrupt:
1636         addi    -104,sp,sp
1637 #ifdef __EP__
1638         mov     ep,r1
1639         mov     sp,ep
1640         sst.w   r31,100[ep]
1641         sst.w   r2,96[ep]
1642         sst.w   gp,92[ep]
1643         sst.w   r6,88[ep]
1644         sst.w   r7,84[ep]
1645         sst.w   r8,80[ep]
1646         sst.w   r9,76[ep]
1647         sst.w   r11,72[ep]
1648         sst.w   r12,68[ep]
1649         sst.w   r13,64[ep]
1650         sst.w   r14,60[ep]
1651         sst.w   r15,56[ep]
1652         sst.w   r16,52[ep]
1653         sst.w   r17,48[ep]
1654         sst.w   r18,44[ep]
1655         sst.w   r19,40[ep]
1656         sst.w   r20,36[ep]
1657         sst.w   r21,32[ep]
1658         sst.w   r22,28[ep]
1659         sst.w   r23,24[ep]
1660         sst.w   r24,20[ep]
1661         sst.w   r25,16[ep]
1662         sst.w   r26,12[ep]
1663         sst.w   r27,8[ep]
1664         sst.w   r28,4[ep]
1665         sst.w   r29,0[ep]
1666         mov     r1,ep
1667 #else
1668         st.w    r31,100[sp]
1669         st.w    r2,96[sp]
1670         st.w    gp,92[sp]
1671         st.w    r6,88[sp]
1672         st.w    r7,84[sp]
1673         st.w    r8,80[sp]
1674         st.w    r9,76[sp]
1675         st.w    r11,72[sp]
1676         st.w    r12,68[sp]
1677         st.w    r13,64[sp]
1678         st.w    r14,60[sp]
1679         st.w    r15,56[sp]
1680         st.w    r16,52[sp]
1681         st.w    r17,48[sp]
1682         st.w    r18,44[sp]
1683         st.w    r19,40[sp]
1684         st.w    r20,36[sp]
1685         st.w    r21,32[sp]
1686         st.w    r22,28[sp]
1687         st.w    r23,24[sp]
1688         st.w    r24,20[sp]
1689         st.w    r25,16[sp]
1690         st.w    r26,12[sp]
1691         st.w    r27,8[sp]
1692         st.w    r28,4[sp]
1693         st.w    r29,0[sp]
1694 #endif
1695         jmp     [r10]
1696         .size   __save_all_interrupt,.-__save_all_interrupt
1698         .globl  __restore_all_interrupt
1699         .type   __restore_all_interrupt,@function
1700         /* Restore all registers saved in __save_all_interrupt and
1701            deallocate the stack space.  */
1702         /* Called via:  jalr __restore_all_interrupt,r10.  */
1703 __restore_all_interrupt:
1704 #ifdef __EP__
1705         mov     ep,r1
1706         mov     sp,ep
1707         sld.w   100[ep],r31
1708         sld.w   96[ep],r2
1709         sld.w   92[ep],gp
1710         sld.w   88[ep],r6
1711         sld.w   84[ep],r7
1712         sld.w   80[ep],r8
1713         sld.w   76[ep],r9
1714         sld.w   72[ep],r11
1715         sld.w   68[ep],r12
1716         sld.w   64[ep],r13
1717         sld.w   60[ep],r14
1718         sld.w   56[ep],r15
1719         sld.w   52[ep],r16
1720         sld.w   48[ep],r17
1721         sld.w   44[ep],r18
1722         sld.w   40[ep],r19
1723         sld.w   36[ep],r20
1724         sld.w   32[ep],r21
1725         sld.w   28[ep],r22
1726         sld.w   24[ep],r23
1727         sld.w   20[ep],r24
1728         sld.w   16[ep],r25
1729         sld.w   12[ep],r26
1730         sld.w   8[ep],r27
1731         sld.w   4[ep],r28
1732         sld.w   0[ep],r29
1733         mov     r1,ep
1734 #else
1735         ld.w    100[sp],r31
1736         ld.w    96[sp],r2
1737         ld.w    92[sp],gp
1738         ld.w    88[sp],r6
1739         ld.w    84[sp],r7
1740         ld.w    80[sp],r8
1741         ld.w    76[sp],r9
1742         ld.w    72[sp],r11
1743         ld.w    68[sp],r12
1744         ld.w    64[sp],r13
1745         ld.w    60[sp],r14
1746         ld.w    56[sp],r15
1747         ld.w    52[sp],r16
1748         ld.w    48[sp],r17
1749         ld.w    44[sp],r18
1750         ld.w    40[sp],r19
1751         ld.w    36[sp],r20
1752         ld.w    32[sp],r21
1753         ld.w    28[sp],r22
1754         ld.w    24[sp],r23
1755         ld.w    20[sp],r24
1756         ld.w    16[sp],r25
1757         ld.w    12[sp],r26
1758         ld.w    8[sp],r27
1759         ld.w    4[sp],r28
1760         ld.w    0[sp],r29
1761 #endif
1762         addi    104,sp,sp       
1763         jmp     [r10]
1764         .size   __restore_all_interrupt,.-__restore_all_interrupt
1765 #endif /* L_save_all_interrupt */
1766         
1767 #if defined __V850_CALLT__
1768 #if defined(__v850e__) || defined(__v850e1__) || defined(__v850e2__) || defined(__v850e2v3__)
1769 #ifdef  L_callt_save_r2_r29
1770         /* Put these functions into the call table area.  */
1771         .call_table_text
1772         
1773         /* Allocate space and save registers 2, 20 .. 29 on the stack.  */
1774         /* Called via:  callt ctoff(__callt_save_r2_r29).  */
1775         .align  2
1776 .L_save_r2_r29:
1777         add     -4, sp
1778         st.w    r2, 0[sp]
1779         prepare {r20 - r29}, 0
1780         ctret
1782         /* Restore saved registers, deallocate stack and return to the user.  */
1783         /* Called via:  callt ctoff(__callt_return_r2_r29).  */
1784         .align  2
1785 .L_return_r2_r29:
1786         dispose 0, {r20-r29}
1787         ld.w    0[sp], r2
1788         add     4, sp
1789         jmp     [r31]
1791         /* Place the offsets of the start of these routines into the call table.  */
1792         .call_table_data
1794         .global __callt_save_r2_r29
1795         .type   __callt_save_r2_r29,@function
1796 __callt_save_r2_r29:    .short ctoff(.L_save_r2_r29)
1797         
1798         .global __callt_return_r2_r29
1799         .type   __callt_return_r2_r29,@function
1800 __callt_return_r2_r29:  .short ctoff(.L_return_r2_r29)
1801         
1802 #endif /* L_callt_save_r2_r29.  */
1804 #ifdef  L_callt_save_r2_r31
1805         /* Put these functions into the call table area.  */
1806         .call_table_text
1807         
1808         /* Allocate space and save registers 2 and 20 .. 29, 31 on the stack.  */
1809         /* Also allocate space for the argument save area.  */
1810         /* Called via:  callt ctoff(__callt_save_r2_r31).  */
1811         .align  2
1812 .L_save_r2_r31:
1813         add     -4, sp
1814         st.w    r2, 0[sp]
1815         prepare {r20 - r29, r31}, 0
1816         ctret
1818         /* Restore saved registers, deallocate stack and return to the user.  */
1819         /* Called via:  callt ctoff(__callt_return_r2_r31).  */
1820         .align  2
1821 .L_return_r2_r31:
1822         dispose 0, {r20 - r29, r31}
1823         ld.w    0[sp], r2
1824         addi    4, sp, sp
1825         jmp     [r31]
1827         /* Place the offsets of the start of these routines into the call table.  */
1828         .call_table_data
1830         .global __callt_save_r2_r31
1831         .type   __callt_save_r2_r31,@function
1832 __callt_save_r2_r31:    .short ctoff(.L_save_r2_r31)
1833         
1834         .global __callt_return_r2_r31
1835         .type   __callt_return_r2_r31,@function
1836 __callt_return_r2_r31:  .short ctoff(.L_return_r2_r31)
1837         
1838 #endif /* L_callt_save_r2_r31 */
1840 #ifdef  L_callt_save_interrupt
1841         /* Put these functions into the call table area.  */
1842         .call_table_text
1843         
1844         /* Save registers r1, ep, gp, r10 on stack and load up with expected values.  */
1845         /* Called via:  callt ctoff(__callt_save_interrupt).  */
1846         .align  2
1847 .L_save_interrupt:
1848         /* SP has already been moved before callt ctoff(_save_interrupt).  */
1849         /* R1,R10,R11,ctpc,ctpsw has alread been saved bofore callt ctoff(_save_interrupt).  */
1850         /* addi -28, sp, sp  */
1851         /* st.w r1,    24[sp] */
1852         /* st.w r10,   12[sp] */
1853         /* st.w r11,   16[sp] */
1854         /* stsr ctpc,  r10    */
1855         /* st.w r10,   20[sp] */
1856         /* stsr ctpsw, r10    */
1857         /* st.w r10,   24[sp] */
1858         st.w    ep,  0[sp]
1859         st.w    gp,  4[sp]
1860         st.w    r1,  8[sp]
1861         mov     hilo(__ep),ep
1862         mov     hilo(__gp),gp
1863         ctret
1865         .call_table_text
1866         /* Restore saved registers, deallocate stack and return from the interrupt.  */
1867         /* Called via:  callt ctoff(__callt_restore_interrupt).  */
1868         .align  2
1869         .globl  __return_interrupt
1870         .type   __return_interrupt,@function
1871 .L_return_interrupt:
1872         ld.w    24[sp], r1
1873         ldsr    r1,     ctpsw
1874         ld.w    20[sp], r1
1875         ldsr    r1,     ctpc
1876         ld.w    16[sp], r11
1877         ld.w    12[sp], r10
1878         ld.w     8[sp], r1
1879         ld.w     4[sp], gp
1880         ld.w     0[sp], ep
1881         addi    28, sp, sp
1882         reti
1884         /* Place the offsets of the start of these routines into the call table.  */
1885         .call_table_data
1887         .global __callt_save_interrupt
1888         .type   __callt_save_interrupt,@function
1889 __callt_save_interrupt:         .short ctoff(.L_save_interrupt)
1891         .global __callt_return_interrupt
1892         .type   __callt_return_interrupt,@function
1893 __callt_return_interrupt:       .short ctoff(.L_return_interrupt)
1894         
1895 #endif /* L_callt_save_interrupt */
1897 #ifdef L_callt_save_all_interrupt
1898         /* Put these functions into the call table area.  */
1899         .call_table_text
1900         
1901         /* Save all registers except for those saved in __save_interrupt.  */
1902         /* Allocate enough stack for all of the registers & 16 bytes of space.  */
1903         /* Called via:  callt ctoff(__callt_save_all_interrupt).  */
1904         .align  2
1905 .L_save_all_interrupt:
1906         addi    -60, sp, sp
1907 #ifdef __EP__
1908         mov     ep,  r1
1909         mov     sp,  ep
1910         sst.w   r2,  56[ep]
1911         sst.w   r5,  52[ep]
1912         sst.w   r6,  48[ep]
1913         sst.w   r7,  44[ep]
1914         sst.w   r8,  40[ep]
1915         sst.w   r9,  36[ep]
1916         sst.w   r11, 32[ep]
1917         sst.w   r12, 28[ep]
1918         sst.w   r13, 24[ep]
1919         sst.w   r14, 20[ep]
1920         sst.w   r15, 16[ep]
1921         sst.w   r16, 12[ep]
1922         sst.w   r17, 8[ep]
1923         sst.w   r18, 4[ep]
1924         sst.w   r19, 0[ep]
1925         mov     r1,  ep
1926 #else
1927         st.w    r2,  56[sp]
1928         st.w    r5,  52[sp]
1929         st.w    r6,  48[sp]
1930         st.w    r7,  44[sp]
1931         st.w    r8,  40[sp]
1932         st.w    r9,  36[sp]
1933         st.w    r11, 32[sp]
1934         st.w    r12, 28[sp]
1935         st.w    r13, 24[sp]
1936         st.w    r14, 20[sp]
1937         st.w    r15, 16[sp]
1938         st.w    r16, 12[sp]
1939         st.w    r17, 8[sp]
1940         st.w    r18, 4[sp]
1941         st.w    r19, 0[sp]
1942 #endif
1943         prepare {r20 - r29, r31}, 0
1944         ctret   
1946         /* Restore all registers saved in __save_all_interrupt
1947            deallocate the stack space.  */
1948         /* Called via:  callt ctoff(__callt_restore_all_interrupt).  */
1949         .align 2
1950 .L_restore_all_interrupt:
1951         dispose 0, {r20 - r29, r31}
1952 #ifdef __EP__
1953         mov     ep, r1
1954         mov     sp, ep
1955         sld.w   0 [ep], r19
1956         sld.w   4 [ep], r18
1957         sld.w   8 [ep], r17
1958         sld.w   12[ep], r16
1959         sld.w   16[ep], r15
1960         sld.w   20[ep], r14
1961         sld.w   24[ep], r13
1962         sld.w   28[ep], r12
1963         sld.w   32[ep], r11
1964         sld.w   36[ep], r9
1965         sld.w   40[ep], r8
1966         sld.w   44[ep], r7
1967         sld.w   48[ep], r6
1968         sld.w   52[ep], r5
1969         sld.w   56[ep], r2
1970         mov     r1, ep
1971 #else
1972         ld.w    0 [sp], r19
1973         ld.w    4 [sp], r18
1974         ld.w    8 [sp], r17
1975         ld.w    12[sp], r16
1976         ld.w    16[sp], r15
1977         ld.w    20[sp], r14
1978         ld.w    24[sp], r13
1979         ld.w    28[sp], r12
1980         ld.w    32[sp], r11
1981         ld.w    36[sp], r9
1982         ld.w    40[sp], r8
1983         ld.w    44[sp], r7
1984         ld.w    48[sp], r6
1985         ld.w    52[sp], r5
1986         ld.w    56[sp], r2
1987 #endif
1988         addi    60, sp, sp
1989         ctret
1991         /* Place the offsets of the start of these routines into the call table.  */
1992         .call_table_data
1994         .global __callt_save_all_interrupt
1995         .type   __callt_save_all_interrupt,@function
1996 __callt_save_all_interrupt:     .short ctoff(.L_save_all_interrupt)
1997         
1998         .global __callt_restore_all_interrupt
1999         .type   __callt_restore_all_interrupt,@function
2000 __callt_restore_all_interrupt:  .short ctoff(.L_restore_all_interrupt)
2001         
2002 #endif /* L_callt_save_all_interrupt */
2005 #define MAKE_CALLT_FUNCS( START )                                               \
2006         .call_table_text                                                        ;\
2007         .align  2                                                               ;\
2008         /* Allocate space and save registers START .. r29 on the stack.  */     ;\
2009         /* Called via:  callt ctoff(__callt_save_START_r29).  */                ;\
2010 .L_save_##START##_r29:                                                          ;\
2011         prepare { START - r29 }, 0                                              ;\
2012         ctret                                                                   ;\
2013                                                                                 ;\
2014         /* Restore saved registers, deallocate stack and return.  */            ;\
2015         /* Called via:  callt ctoff(__return_START_r29).  */                    ;\
2016         .align  2                                                               ;\
2017 .L_return_##START##_r29:                                                        ;\
2018         dispose 0, { START - r29 }, r31                                         ;\
2019                                                                                 ;\
2020         /* Place the offsets of the start of these funcs into the call table.  */;\
2021         .call_table_data                                                        ;\
2022                                                                                 ;\
2023         .global __callt_save_##START##_r29                                      ;\
2024         .type   __callt_save_##START##_r29,@function                            ;\
2025 __callt_save_##START##_r29:     .short ctoff(.L_save_##START##_r29 )            ;\
2026                                                                                 ;\
2027         .global __callt_return_##START##_r29                                    ;\
2028         .type   __callt_return_##START##_r29,@function                          ;\
2029 __callt_return_##START##_r29:   .short ctoff(.L_return_##START##_r29 )  
2032 #define MAKE_CALLT_CFUNCS( START )                                              \
2033         .call_table_text                                                        ;\
2034         .align  2                                                               ;\
2035         /* Allocate space and save registers START .. r31 on the stack.  */     ;\
2036         /* Called via:  callt ctoff(__callt_save_START_r31c).  */               ;\
2037 .L_save_##START##_r31c:                                                         ;\
2038         prepare { START - r29, r31}, 0                                          ;\
2039         ctret                                                                   ;\
2040                                                                                 ;\
2041         /* Restore saved registers, deallocate stack and return.  */            ;\
2042         /* Called via:  callt ctoff(__return_START_r31c).  */                   ;\
2043         .align  2                                                               ;\
2044 .L_return_##START##_r31c:                                                       ;\
2045         dispose 0, { START - r29, r31}, r31                                     ;\
2046                                                                                 ;\
2047         /* Place the offsets of the start of these funcs into the call table.  */;\
2048         .call_table_data                                                        ;\
2049                                                                                 ;\
2050         .global __callt_save_##START##_r31c                                     ;\
2051         .type   __callt_save_##START##_r31c,@function                           ;\
2052 __callt_save_##START##_r31c:    .short ctoff(.L_save_##START##_r31c )           ;\
2053                                                                                 ;\
2054         .global __callt_return_##START##_r31c                                   ;\
2055         .type   __callt_return_##START##_r31c,@function                         ;\
2056 __callt_return_##START##_r31c:  .short ctoff(.L_return_##START##_r31c ) 
2058         
2059 #ifdef  L_callt_save_20
2060         MAKE_CALLT_FUNCS (r20)
2061 #endif
2062 #ifdef  L_callt_save_21
2063         MAKE_CALLT_FUNCS (r21)
2064 #endif
2065 #ifdef  L_callt_save_22
2066         MAKE_CALLT_FUNCS (r22)
2067 #endif
2068 #ifdef  L_callt_save_23
2069         MAKE_CALLT_FUNCS (r23)
2070 #endif
2071 #ifdef  L_callt_save_24
2072         MAKE_CALLT_FUNCS (r24)
2073 #endif
2074 #ifdef  L_callt_save_25
2075         MAKE_CALLT_FUNCS (r25)
2076 #endif
2077 #ifdef  L_callt_save_26
2078         MAKE_CALLT_FUNCS (r26)
2079 #endif
2080 #ifdef  L_callt_save_27
2081         MAKE_CALLT_FUNCS (r27)
2082 #endif
2083 #ifdef  L_callt_save_28
2084         MAKE_CALLT_FUNCS (r28)
2085 #endif
2086 #ifdef  L_callt_save_29
2087         MAKE_CALLT_FUNCS (r29)
2088 #endif
2090 #ifdef  L_callt_save_20c
2091         MAKE_CALLT_CFUNCS (r20)
2092 #endif
2093 #ifdef  L_callt_save_21c
2094         MAKE_CALLT_CFUNCS (r21)
2095 #endif
2096 #ifdef  L_callt_save_22c
2097         MAKE_CALLT_CFUNCS (r22)
2098 #endif
2099 #ifdef  L_callt_save_23c
2100         MAKE_CALLT_CFUNCS (r23)
2101 #endif
2102 #ifdef  L_callt_save_24c
2103         MAKE_CALLT_CFUNCS (r24)
2104 #endif
2105 #ifdef  L_callt_save_25c
2106         MAKE_CALLT_CFUNCS (r25)
2107 #endif
2108 #ifdef  L_callt_save_26c
2109         MAKE_CALLT_CFUNCS (r26)
2110 #endif
2111 #ifdef  L_callt_save_27c
2112         MAKE_CALLT_CFUNCS (r27)
2113 #endif
2114 #ifdef  L_callt_save_28c
2115         MAKE_CALLT_CFUNCS (r28)
2116 #endif
2117 #ifdef  L_callt_save_29c
2118         MAKE_CALLT_CFUNCS (r29)
2119 #endif
2121         
2122 #ifdef  L_callt_save_31c
2123         .call_table_text
2124         .align  2
2125         /* Allocate space and save register r31 on the stack.  */
2126         /* Called via:  callt ctoff(__callt_save_r31c).  */
2127 .L_callt_save_r31c:
2128         prepare {r31}, 0
2129         ctret
2131         /* Restore saved registers, deallocate stack and return.  */
2132         /* Called via:  callt ctoff(__return_r31c).  */
2133         .align  2
2134 .L_callt_return_r31c:
2135         dispose 0, {r31}, r31
2136         
2137         /* Place the offsets of the start of these funcs into the call table.  */
2138         .call_table_data
2140         .global __callt_save_r31c
2141         .type   __callt_save_r31c,@function
2142 __callt_save_r31c:      .short ctoff(.L_callt_save_r31c)
2144         .global __callt_return_r31c
2145         .type   __callt_return_r31c,@function
2146 __callt_return_r31c:    .short ctoff(.L_callt_return_r31c)              
2147 #endif
2149 #endif /* __v850e__ */
2150 #endif /* __V850_CALLT__ */
2152 /*  libgcc2 routines for NEC V850.  */
2153 /*  Double Integer Arithmetical Operation.  */
2155 #ifdef L_negdi2
2156         .text
2157         .global ___negdi2
2158         .type   ___negdi2, @function
2159 ___negdi2:
2160         not     r6, r10
2161         add     1,  r10
2162         setf    l,  r6
2163         not     r7, r11
2164         add     r6, r11
2165         jmp     [lp]
2167         .size ___negdi2,.-___negdi2
2168 #endif
2170 #ifdef L_cmpdi2
2171         .text
2172         .global ___cmpdi2
2173         .type   ___cmpdi2,@function
2174 ___cmpdi2:
2175         # Signed comparison bitween each high word.
2176         cmp     r9, r7
2177         be      .L_cmpdi_cmp_low
2178         setf    ge, r10
2179         setf    gt, r6
2180         add     r6, r10
2181         jmp     [lp]
2182 .L_cmpdi_cmp_low:
2183         # Unsigned comparigon bitween each low word.
2184         cmp     r8, r6
2185         setf    nl, r10
2186         setf    h,  r6
2187         add     r6, r10
2188         jmp     [lp]    
2189         .size ___cmpdi2, . - ___cmpdi2  
2190 #endif
2192 #ifdef L_ucmpdi2
2193         .text
2194         .global ___ucmpdi2
2195         .type   ___ucmpdi2,@function
2196 ___ucmpdi2:
2197         cmp     r9, r7  # Check if each high word are same.
2198         bne     .L_ucmpdi_check_psw
2199         cmp     r8, r6  # Compare the word.
2200 .L_ucmpdi_check_psw:
2201         setf    nl, r10 # 
2202         setf    h,  r6  # 
2203         add     r6, r10 # Add the result of comparison NL and comparison H.
2204         jmp     [lp]    
2205         .size ___ucmpdi2, . - ___ucmpdi2
2206 #endif
2208 #ifdef L_muldi3
2209         .text
2210         .global ___muldi3
2211         .type   ___muldi3,@function
2212 ___muldi3:
2213 #ifdef __v850__
2214         jarl  __save_r26_r31, r10
2215         addi  16,  sp, sp
2216         mov   r6,  r28
2217         shr   15,  r28
2218         movea lo(32767), r0, r14
2219         and   r14, r28
2220         mov   r8,  r10
2221         shr   15,  r10
2222         and   r14, r10
2223         mov   r6,  r19
2224         shr   30,  r19
2225         mov   r7,  r12
2226         shl   2,   r12
2227         or    r12, r19
2228         and   r14, r19
2229         mov   r8,  r13
2230         shr   30,  r13
2231         mov   r9,  r12
2232         shl   2,   r12
2233         or    r12, r13
2234         and   r14, r13
2235         mov   r7,  r11
2236         shr   13,  r11
2237         and   r14, r11
2238         mov   r9,  r31
2239         shr   13,  r31
2240         and   r14, r31
2241         mov   r7,  r29
2242         shr   28,  r29
2243         and   r14, r29
2244         mov   r9,  r12
2245         shr   28,  r12
2246         and   r14, r12
2247         and   r14, r6
2248         and   r14, r8
2249         mov   r6,  r14
2250         mulh  r8,  r14
2251         mov   r6,  r16
2252         mulh  r10, r16
2253         mov   r6,  r18
2254         mulh  r13, r18
2255         mov   r6,  r15
2256         mulh  r31, r15
2257         mulh  r12, r6
2258         mov   r28,  r17
2259         mulh  r10, r17
2260         add   -16, sp
2261         mov   r28,  r12
2262         mulh  r8,  r12
2263         add   r17, r18
2264         mov   r28,  r17
2265         mulh  r31, r17
2266         add   r12, r16
2267         mov   r28,  r12
2268         mulh  r13, r12
2269         add   r17, r6
2270         mov   r19, r17
2271         add   r12, r15
2272         mov   r19, r12
2273         mulh  r8,  r12
2274         mulh  r10, r17
2275         add   r12, r18
2276         mov   r19, r12
2277         mulh  r13, r12
2278         add   r17, r15
2279         mov   r11, r13
2280         mulh  r8,  r13
2281         add   r12, r6
2282         mov   r11, r12
2283         mulh  r10, r12
2284         add   r13, r15
2285         mulh  r29, r8
2286         add   r12, r6
2287         mov   r16, r13
2288         shl   15,  r13
2289         add   r14, r13
2290         mov   r18, r12
2291         shl   30,  r12
2292         mov   r13, r26
2293         add   r12, r26
2294         shr   15,  r14
2295         movhi hi(131071), r0,  r12
2296         movea lo(131071), r12, r13
2297         and   r13, r14
2298         mov   r16, r12
2299         and   r13, r12
2300         add   r12, r14
2301         mov   r18, r12
2302         shl   15,  r12
2303         and   r13, r12
2304         add   r12, r14
2305         shr   17,  r14
2306         shr   17,  r16
2307         add   r14, r16
2308         shl   13,  r15
2309         shr   2,   r18
2310         add   r18, r15
2311         add   r15, r16
2312         mov   r16, r27
2313         add   r8,  r6
2314         shl   28,  r6
2315         add   r6,  r27
2316         mov   r26, r10
2317         mov   r27, r11
2318         jr    __return_r26_r31
2319 #else /* defined(__v850e__) */
2320         /*  (Ahi << 32 + Alo) * (Bhi << 32 + Blo) */
2321         /*   r7           r6      r9         r8   */
2322         mov  r8, r10
2323         mulu r7, r8,  r0                /* Ahi * Blo */
2324         mulu r6, r9,  r0                /* Alo * Bhi */
2325         mulu r6, r10, r11               /* Alo * Blo */
2326         add  r8, r11
2327         add  r9, r11
2328         jmp  [r31]
2329 #endif /* defined(__v850e__) */
2330         .size ___muldi3, . - ___muldi3
2331 #endif