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