| /* SPDX-License-Identifier: GPL-2.0 */ | 
 | #include "libgcc.h" | 
 |  | 
 | ; numerator in A0/A1 | 
 | ; denominator in A2/A3 | 
 | 	.global	__modsi3 | 
 | __modsi3: | 
 | 	PUSHP	S2P | 
 | 	bsr	modnorm | 
 | 	bsr	__divsi3 | 
 | 	mov.l	er3,er0 | 
 | 	bra	exitdiv | 
 |  | 
 | 	.global	__umodsi3 | 
 | __umodsi3: | 
 | 	bsr	__udivsi3 | 
 | 	mov.l	er3,er0 | 
 | 	rts | 
 |  | 
 | 	.global	__divsi3 | 
 | __divsi3: | 
 | 	PUSHP	S2P | 
 | 	jsr	divnorm | 
 | 	bsr	__udivsi3 | 
 |  | 
 | 	; examine what the sign should be | 
 | exitdiv: | 
 | 	btst	#3,S2L | 
 | 	beq	reti | 
 |  | 
 | 	; should be -ve | 
 | 	neg.l	A0P | 
 |  | 
 | reti: | 
 | 	POPP	S2P | 
 | 	rts | 
 |  | 
 | divnorm: | 
 | 	mov.l	A0P,A0P		; is the numerator -ve | 
 | 	stc	ccr,S2L		; keep the sign in bit 3 of S2L | 
 | 	bge	postive | 
 |  | 
 | 	neg.l	A0P		; negate arg | 
 |  | 
 | postive: | 
 | 	mov.l	A1P,A1P		; is the denominator -ve | 
 | 	bge	postive2 | 
 |  | 
 | 	neg.l	A1P		; negate arg | 
 | 	xor.b	#0x08,S2L	; toggle the result sign | 
 |  | 
 | postive2: | 
 | 	rts | 
 |  | 
 | ;; Basically the same, except that the sign of the divisor determines | 
 | ;; the sign. | 
 | modnorm: | 
 | 	mov.l	A0P,A0P		; is the numerator -ve | 
 | 	stc	ccr,S2L		; keep the sign in bit 3 of S2L | 
 | 	bge	mpostive | 
 |  | 
 | 	neg.l	A0P		; negate arg | 
 |  | 
 | mpostive: | 
 | 	mov.l	A1P,A1P		; is the denominator -ve | 
 | 	bge	mpostive2 | 
 |  | 
 | 	neg.l	A1P		; negate arg | 
 |  | 
 | mpostive2: | 
 | 	rts | 
 |  | 
 | 	.end |