]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
a71a29de YS |
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:16 | |
17 | mov.l er3,er0 | |
18 | rts | |
19 | ||
20 | .global __divsi3 | |
21 | __divsi3: | |
22 | PUSHP S2P | |
23 | bsr divnorm | |
24 | bsr __udivsi3:16 | |
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 |