1
2 #include "libgcc.h"
3
4 ; numerator in A0/A1
5 ; denominator in A2/A3
6 .global __modsi3
7 __modsi3:
8 PUSHP S2P
9 bsr modnorm
10 bsr __divsi3
11 mov.l er3,er0
12 bra exitdiv
13
14 .global __umodsi3
15 __umodsi3:
16 bsr __udivsi3
17 mov.l er3,er0
18 rts
19
20 .global __divsi3
21 __divsi3:
22 PUSHP S2P
23 jsr divnorm
24 bsr __udivsi3
25
26 ; examine what the sign should be
27 exitdiv:
28 btst #3,S2L
29 beq reti
30
31 ; should be -ve
32 neg.l A0P
33
34 reti:
35 POPP S2P
36 rts
37
38 divnorm:
39 mov.l A0P,A0P ; is the numerator -ve
40 stc ccr,S2L ; keep the sign in bit 3 of S2L
41 bge postive
42
43 neg.l A0P ; negate arg
44
45 postive:
46 mov.l A1P,A1P ; is the denominator -ve
47 bge postive2
48
49 neg.l A1P ; negate arg
50 xor.b #0x08,S2L ; toggle the result sign
51
52 postive2:
53 rts
54
55 ;; Basically the same, except that the sign of the divisor determines
56 ;; the sign.
57 modnorm:
58 mov.l A0P,A0P ; is the numerator -ve
59 stc ccr,S2L ; keep the sign in bit 3 of S2L
60 bge mpostive
61
62 neg.l A0P ; negate arg
63
64 mpostive:
65 mov.l A1P,A1P ; is the denominator -ve
66 bge mpostive2
67
68 neg.l A1P ; negate arg
69
70 mpostive2:
71 rts
72
73 .end