| /* 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 |