#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 |