73 строки
1.0 KiB
ArmAsm
73 строки
1.0 KiB
ArmAsm
#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
|