Merge tag 'sched-urgent-2020-12-27' of git://git.kernel.org/pub/scm/linux/kernel...
[linux/fpc-iii.git] / arch / h8300 / lib / moddivsi3.S
blob9e33ab0456c7501d89e9fedba025b50e1ed584ea
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #include "libgcc.h"
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
14         .global __umodsi3
15 __umodsi3:
16         bsr     __udivsi3:16
17         mov.l   er3,er0
18         rts
20         .global __divsi3
21 __divsi3:
22         PUSHP   S2P
23         bsr     divnorm
24         bsr     __udivsi3:16
26         ; examine what the sign should be
27 exitdiv:
28         btst    #3,S2L
29         beq     reti
31         ; should be -ve
32         neg.l   A0P
34 reti:
35         POPP    S2P
36         rts
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
43         neg.l   A0P             ; negate arg
45 postive:
46         mov.l   A1P,A1P         ; is the denominator -ve
47         bge     postive2
49         neg.l   A1P             ; negate arg
50         xor.b   #0x08,S2L       ; toggle the result sign
52 postive2:
53         rts
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
62         neg.l   A0P             ; negate arg
64 mpostive:
65         mov.l   A1P,A1P         ; is the denominator -ve
66         bge     mpostive2
68         neg.l   A1P             ; negate arg
70 mpostive2:
71         rts
73         .end