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