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
 |