1/* SPDX-License-Identifier: GPL-2.0 */
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
27exitdiv:
28	btst	#3,S2L
29	beq	reti
30
31	; should be -ve
32	neg.l	A0P
33
34reti:
35	POPP	S2P
36	rts
37
38divnorm:
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
45postive:
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
52postive2:
53	rts
54
55;; Basically the same, except that the sign of the divisor determines
56;; the sign.
57modnorm:
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
64mpostive:
65	mov.l	A1P,A1P		; is the denominator -ve
66	bge	mpostive2
67
68	neg.l	A1P		; negate arg
69
70mpostive2:
71	rts
72
73	.end
74