1/* SPDX-License-Identifier: GPL-2.0 */ 2#include "libgcc.h" 3 4; numerator in A0/A1 5; denominator in A2/A3 6 .global __modsi3 7__modsi3: 8 PUSHP S2P 9 bsr modnorm 10 bsr __divsi3 11 mov.l er3,er0 12 bra exitdiv 13 14 .global __umodsi3 15__umodsi3: 16 bsr __udivsi3:16 17 mov.l er3,er0 18 rts 19 20 .global __divsi3 21__divsi3: 22 PUSHP S2P 23 bsr divnorm 24 bsr __udivsi3:16 25 26 ; examine what the sign should be 27exitdiv: 28 btst #3,S2L 29 beq reti 30 31 ; should be -ve 32 neg.l A0P 33 34reti: 35 POPP S2P 36 rts 37 38divnorm: 39 mov.l A0P,A0P ; is the numerator -ve 40 stc ccr,S2L ; keep the sign in bit 3 of S2L 41 bge postive 42 43 neg.l A0P ; negate arg 44 45postive: 46 mov.l A1P,A1P ; is the denominator -ve 47 bge postive2 48 49 neg.l A1P ; negate arg 50 xor.b #0x08,S2L ; toggle the result sign 51 52postive2: 53 rts 54 55;; Basically the same, except that the sign of the divisor determines 56;; the sign. 57modnorm: 58 mov.l A0P,A0P ; is the numerator -ve 59 stc ccr,S2L ; keep the sign in bit 3 of S2L 60 bge mpostive 61 62 neg.l A0P ; negate arg 63 64mpostive: 65 mov.l A1P,A1P ; is the denominator -ve 66 bge mpostive2 67 68 neg.l A1P ; negate arg 69 70mpostive2: 71 rts 72 73 .end 74