74 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /* 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
 | 
