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 17 mov.l er3,er0 18 rts 19 20 .global __divsi3 21 __divsi3: 22 PUSHP S2P 23 jsr divnorm 24 bsr __udivsi3 25 26 ; examine what the sign should be 27 exitdiv: 28 btst #3,S2L 29 beq reti 30 31 ; should be -ve 32 neg.l A0P 33 34 reti: 35 POPP S2P 36 rts 37 38 divnorm: 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 45 postive: 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 52 postive2: 53 rts 54 55 ;; Basically the same, except that the sign of the divisor determines 56 ;; the sign. 57 modnorm: 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 64 mpostive: 65 mov.l A1P,A1P ; is the denominator -ve 66 bge mpostive2 67 68 neg.l A1P ; negate arg 69 70 mpostive2: 71 rts 72 73 .end 74