treewide: remove redundant IS_ERR() before error code check
[linux/fpc-iii.git] / arch / h8300 / lib / modsi3.S
blobbdc8a002921df129a5ff9a584b87a96035cb483d
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
17         mov.l   er3,er0
18         rts
20         .global __divsi3
21 __divsi3:
22         PUSHP   S2P
23         jsr     divnorm
24         bsr     __udivsi3
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