xref: /kernel/linux/linux-5.10/arch/h8300/lib/modsi3.S (revision 8c2ecf20)
18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#include "libgcc.h"
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci; numerator in A0/A1
58c2ecf20Sopenharmony_ci; denominator in A2/A3
68c2ecf20Sopenharmony_ci	.global	__modsi3
78c2ecf20Sopenharmony_ci__modsi3:
88c2ecf20Sopenharmony_ci	PUSHP	S2P
98c2ecf20Sopenharmony_ci	bsr	modnorm
108c2ecf20Sopenharmony_ci	bsr	__divsi3
118c2ecf20Sopenharmony_ci	mov.l	er3,er0
128c2ecf20Sopenharmony_ci	bra	exitdiv
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci	.global	__umodsi3
158c2ecf20Sopenharmony_ci__umodsi3:
168c2ecf20Sopenharmony_ci	bsr	__udivsi3
178c2ecf20Sopenharmony_ci	mov.l	er3,er0
188c2ecf20Sopenharmony_ci	rts
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci	.global	__divsi3
218c2ecf20Sopenharmony_ci__divsi3:
228c2ecf20Sopenharmony_ci	PUSHP	S2P
238c2ecf20Sopenharmony_ci	jsr	divnorm
248c2ecf20Sopenharmony_ci	bsr	__udivsi3
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci	; examine what the sign should be
278c2ecf20Sopenharmony_ciexitdiv:
288c2ecf20Sopenharmony_ci	btst	#3,S2L
298c2ecf20Sopenharmony_ci	beq	reti
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci	; should be -ve
328c2ecf20Sopenharmony_ci	neg.l	A0P
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_cireti:
358c2ecf20Sopenharmony_ci	POPP	S2P
368c2ecf20Sopenharmony_ci	rts
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_cidivnorm:
398c2ecf20Sopenharmony_ci	mov.l	A0P,A0P		; is the numerator -ve
408c2ecf20Sopenharmony_ci	stc	ccr,S2L		; keep the sign in bit 3 of S2L
418c2ecf20Sopenharmony_ci	bge	postive
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci	neg.l	A0P		; negate arg
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_cipostive:
468c2ecf20Sopenharmony_ci	mov.l	A1P,A1P		; is the denominator -ve
478c2ecf20Sopenharmony_ci	bge	postive2
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci	neg.l	A1P		; negate arg
508c2ecf20Sopenharmony_ci	xor.b	#0x08,S2L	; toggle the result sign
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_cipostive2:
538c2ecf20Sopenharmony_ci	rts
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci;; Basically the same, except that the sign of the divisor determines
568c2ecf20Sopenharmony_ci;; the sign.
578c2ecf20Sopenharmony_cimodnorm:
588c2ecf20Sopenharmony_ci	mov.l	A0P,A0P		; is the numerator -ve
598c2ecf20Sopenharmony_ci	stc	ccr,S2L		; keep the sign in bit 3 of S2L
608c2ecf20Sopenharmony_ci	bge	mpostive
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ci	neg.l	A0P		; negate arg
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_cimpostive:
658c2ecf20Sopenharmony_ci	mov.l	A1P,A1P		; is the denominator -ve
668c2ecf20Sopenharmony_ci	bge	mpostive2
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci	neg.l	A1P		; negate arg
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_cimpostive2:
718c2ecf20Sopenharmony_ci	rts
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ci	.end
74