/* 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:16 mov.l er3,er0 rts .global __divsi3 __divsi3: PUSHP S2P bsr divnorm bsr __udivsi3:16 ; 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