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