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
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
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.
*/
33 .
type ___mulsi3
,@function
37 * #define
MASK ((1 << SHIFT
) - 1)
39 * #define STEP
(i
, j
) \
41 * short a_part = (a >> (i)) & MASK; \
42 * short b_part = (b >> (j)) & MASK; \
43 * int res = (((int)a_part) * ((int)b_part)); \
48 * __mulsi3
(unsigned a
, unsigned b
)
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))
90 .
size ___mulsi3
,.
-___mulsi3
96 .
type ___udivsi3
,@function
102 movhi hi
(-2147483648),r0
,r13
129 .
size ___udivsi3
,.
-___udivsi3
135 .
type ___divsi3
,@function
160 .
size ___divsi3
,.
-___divsi3
166 .
type ___umodsi3
,@function
181 .
size ___umodsi3
,.
-___umodsi3
182 #endif
/* L_umodsi3
*/
187 .
type ___modsi3
,@function
202 .
size ___modsi3
,.
-___modsi3
203 #endif
/* L_modsi3
*/
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
*/
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
*/
234 .globl __return_r2_r29
235 .
type __return_r2_r29
,@function
253 .
size __return_r2_r29
,.
-__return_r2_r29
254 #endif
/* L_save_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
*/
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
*/
284 .globl __return_r20_r29
285 .
type __return_r20_r29
,@function
302 .
size __return_r20_r29
,.
-__return_r20_r29
303 #endif
/* L_save_20
*/
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
*/
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
*/
332 .globl __return_r21_r29
333 .
type __return_r21_r29
,@function
349 .
size __return_r21_r29
,.
-__return_r21_r29
350 #endif
/* L_save_21
*/
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
*/
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
*/
378 .globl __return_r22_r29
379 .
type __return_r22_r29
,@function
394 .
size __return_r22_r29
,.
-__return_r22_r29
395 #endif
/* L_save_22
*/
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
*/
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
*/
422 .globl __return_r23_r29
423 .
type __return_r23_r29
,@function
437 .
size __return_r23_r29
,.
-__return_r23_r29
438 #endif
/* L_save_23
*/
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
*/
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
*/
464 .globl __return_r24_r29
465 .
type __return_r24_r29
,@function
478 .
size __return_r24_r29
,.
-__return_r24_r29
479 #endif
/* L_save_24
*/
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
*/
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
*/
504 .globl __return_r25_r29
505 .
type __return_r25_r29
,@function
517 .
size __return_r25_r29
,.
-__return_r25_r29
518 #endif
/* L_save_25
*/
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
*/
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
*/
542 .globl __return_r26_r29
543 .
type __return_r26_r29
,@function
554 .
size __return_r26_r29
,.
-__return_r26_r29
555 #endif
/* L_save_26
*/
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
*/
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
*/
575 .globl __return_r27_r29
576 .
type __return_r27_r29
,@function
583 .
size __return_r27_r29
,.
-__return_r27_r29
584 #endif
/* L_save_27
*/
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
*/
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
*/
603 .globl __return_r28_r29
604 .
type __return_r28_r29
,@function
610 .
size __return_r28_r29
,.
-__return_r28_r29
611 #endif
/* L_save_28
*/
617 .
type __save_r29
,@function
618 /* Allocate space
and save register
29 on the stack
*/
619 /* Called
via: jalr __save_r29
,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
*/
630 .
type __return_r29
,@function
635 .
size __return_r29
,.
-__return_r29
636 #endif
/* L_save_28
*/
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
*/
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
*/
669 .globl __return_r2_r31
670 .
type __return_r2_r31
,@function
689 .
size __return_r2_r31
,.
-__return_r2_r31
690 #endif
/* L_save_2c
*/
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
*/
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
*/
722 .globl __return_r20_r31
723 .
type __return_r20_r31
,@function
741 .
size __return_r20_r31
,.
-__return_r20_r31
742 #endif
/* L_save_20c
*/
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
*/
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
*/
773 .globl __return_r21_r31
774 .
type __return_r21_r31
,@function
791 .
size __return_r21_r31
,.
-__return_r21_r31
792 #endif
/* L_save_21c
*/
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
*/
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
*/
822 .globl __return_r22_r31
823 .
type __return_r22_r31
,@function
839 .
size __return_r22_r31
,.
-__return_r22_r31
840 #endif
/* L_save_22c
*/
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
*/
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
*/
869 .globl __return_r23_r31
870 .
type __return_r23_r31
,@function
885 .
size __return_r23_r31
,.
-__return_r23_r31
886 #endif
/* L_save_23c
*/
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
*/
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
*/
914 .globl __return_r24_r31
915 .
type __return_r24_r31
,@function
929 .
size __return_r24_r31
,.
-__return_r24_r31
930 #endif
/* L_save_24c
*/
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
*/
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
*/
957 .globl __return_r25_r31
958 .
type __return_r25_r31
,@function
971 .
size __return_r25_r31
,.
-__return_r25_r31
972 #endif
/* L_save_25c
*/
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
*/
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
*/
998 .globl __return_r26_r31
999 .
type __return_r26_r31
,@function
1011 .
size __return_r26_r31
,.
-__return_r26_r31
1012 #endif
/* L_save_26c
*/
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
*/
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
*/
1037 .globl __return_r27_r31
1038 .
type __return_r27_r31
,@function
1049 .
size __return_r27_r31
,.
-__return_r27_r31
1050 #endif
/* L_save_27c
*/
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
*/
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
*/
1071 .globl __return_r28_r31
1072 .
type __return_r28_r31
,@function
1079 .
size __return_r28_r31
,.
-__return_r28_r31
1080 #endif
/* L_save_28c
*/
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
*/
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
*/
1100 .globl __return_r29_r31
1101 .
type __return_r29_r31
,@function
1107 .
size __return_r29_r31
,.
-__return_r29_r31
1108 #endif
/* L_save_29c
*/
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
*/
1122 .
size __save_r31
,.
-__save_r31
1124 /* Restore saved registers
, deallocate stack
and return to the user
*/
1125 /* Called
via: jr __return_r31
*/
1128 .
type __return_r31
,@function
1133 .
size __return_r29_r31
,.
-__return_r29_r31
1134 #endif
/* L_save_31c
*/
1136 #ifdef L_save_varargs
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
*/
1152 .
size __save_r6_r9
,.
-__save_r6_r9
1153 #endif
/* L_save_varargs
*/
1155 #ifdef L_save_interrupt
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
*/
1167 movhi hi
(__ep
),r0
,ep
1168 movea lo
(__ep
),ep
,ep
1169 movhi hi
(__gp
),r0
,gp
1170 movea lo
(__gp
),gp
,gp
1172 .
size __save_interrupt
,.
-__save_interrupt
1174 /* Restore saved registers
, deallocate stack
and return from the interrupt
*/
1175 /* Called
via: jr __return_interrupt
*/
1177 .globl __return_interrupt
1178 .
type __return_interrupt
,@function
1186 .
size __return_interrupt
,.
-__return_interrupt
1187 #endif
/* L_save_interrupt
*/
1189 #ifdef L_save_all_interrupt
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:
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:
1268 .
size __restore_all_interrupt
,.
-__restore_all_interrupt
1269 #endif
/* L_save_all_interrupt
*/