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