1*7dd7cddfSDavid du ColombierQ = 0 2*7dd7cddfSDavid du ColombierN = 1 3*7dd7cddfSDavid du ColombierD = 2 4*7dd7cddfSDavid du ColombierCC = 3 5*7dd7cddfSDavid du ColombierTMP = 11 6*7dd7cddfSDavid du Colombier 7*7dd7cddfSDavid du ColombierTEXT save<>(SB), 1, $0 8*7dd7cddfSDavid du Colombier MOVW R(Q), 0(FP) 9*7dd7cddfSDavid du Colombier MOVW R(N), 4(FP) 10*7dd7cddfSDavid du Colombier MOVW R(D), 8(FP) 11*7dd7cddfSDavid du Colombier MOVW R(CC), 12(FP) 12*7dd7cddfSDavid du Colombier 13*7dd7cddfSDavid du Colombier MOVW R(TMP), R(Q) /* numerator */ 14*7dd7cddfSDavid du Colombier MOVW 20(FP), R(D) /* denominator */ 15*7dd7cddfSDavid du Colombier CMP $0, R(D) 16*7dd7cddfSDavid du Colombier BNE s1 17*7dd7cddfSDavid du Colombier MOVW -1(R(D)), R(TMP) /* divide by zero fault */ 18*7dd7cddfSDavid du Colombiers1: RET 19*7dd7cddfSDavid du Colombier 20*7dd7cddfSDavid du ColombierTEXT rest<>(SB), 1, $0 21*7dd7cddfSDavid du Colombier MOVW 0(FP), R(Q) 22*7dd7cddfSDavid du Colombier MOVW 4(FP), R(N) 23*7dd7cddfSDavid du Colombier MOVW 8(FP), R(D) 24*7dd7cddfSDavid du Colombier MOVW 12(FP), R(CC) 25*7dd7cddfSDavid du Colombier/* 26*7dd7cddfSDavid du Colombier * return to caller 27*7dd7cddfSDavid du Colombier * of rest<> 28*7dd7cddfSDavid du Colombier */ 29*7dd7cddfSDavid du Colombier MOVW 0(R13), R14 30*7dd7cddfSDavid du Colombier ADD $20, R13 31*7dd7cddfSDavid du Colombier B (R14) 32*7dd7cddfSDavid du Colombier 33*7dd7cddfSDavid du ColombierTEXT div<>(SB), 1, $0 34*7dd7cddfSDavid du Colombier MOVW $32, R(CC) 35*7dd7cddfSDavid du Colombier/* 36*7dd7cddfSDavid du Colombier * skip zeros 8-at-a-time 37*7dd7cddfSDavid du Colombier */ 38*7dd7cddfSDavid du Colombiere1: 39*7dd7cddfSDavid du Colombier AND.S $(0xff<<24),R(Q), R(N) 40*7dd7cddfSDavid du Colombier BNE e2 41*7dd7cddfSDavid du Colombier SLL $8, R(Q) 42*7dd7cddfSDavid du Colombier SUB.S $8, R(CC) 43*7dd7cddfSDavid du Colombier BNE e1 44*7dd7cddfSDavid du Colombier RET 45*7dd7cddfSDavid du Colombiere2: 46*7dd7cddfSDavid du Colombier MOVW $0, R(N) 47*7dd7cddfSDavid du Colombier 48*7dd7cddfSDavid du Colombierloop: 49*7dd7cddfSDavid du Colombier/* 50*7dd7cddfSDavid du Colombier * shift R(N||Q) left one 51*7dd7cddfSDavid du Colombier */ 52*7dd7cddfSDavid du Colombier SLL $1, R(N) 53*7dd7cddfSDavid du Colombier CMP $0, R(Q) 54*7dd7cddfSDavid du Colombier ORR.LT $1, R(N) 55*7dd7cddfSDavid du Colombier SLL $1, R(Q) 56*7dd7cddfSDavid du Colombier 57*7dd7cddfSDavid du Colombier/* 58*7dd7cddfSDavid du Colombier * compare numerator to denominator 59*7dd7cddfSDavid du Colombier * if less, subtract and set quotent bit 60*7dd7cddfSDavid du Colombier */ 61*7dd7cddfSDavid du Colombier CMP R(D), R(N) 62*7dd7cddfSDavid du Colombier ORR.HS $1, R(Q) 63*7dd7cddfSDavid du Colombier SUB.HS R(D), R(N) 64*7dd7cddfSDavid du Colombier SUB.S $1, R(CC) 65*7dd7cddfSDavid du Colombier BNE loop 66*7dd7cddfSDavid du Colombier RET 67*7dd7cddfSDavid du Colombier 68*7dd7cddfSDavid du ColombierTEXT _div(SB), 1, $16 69*7dd7cddfSDavid du Colombier BL save<>(SB) 70*7dd7cddfSDavid du Colombier CMP $0, R(Q) 71*7dd7cddfSDavid du Colombier BGE d1 72*7dd7cddfSDavid du Colombier RSB $0, R(Q), R(Q) 73*7dd7cddfSDavid du Colombier CMP $0, R(D) 74*7dd7cddfSDavid du Colombier BGE d2 75*7dd7cddfSDavid du Colombier RSB $0, R(D), R(D) 76*7dd7cddfSDavid du Colombierd0: 77*7dd7cddfSDavid du Colombier BL div<>(SB) /* none/both neg */ 78*7dd7cddfSDavid du Colombier MOVW R(Q), R(TMP) 79*7dd7cddfSDavid du Colombier B out 80*7dd7cddfSDavid du Colombierd1: 81*7dd7cddfSDavid du Colombier CMP $0, R(D) 82*7dd7cddfSDavid du Colombier BGE d0 83*7dd7cddfSDavid du Colombier RSB $0, R(D), R(D) 84*7dd7cddfSDavid du Colombierd2: 85*7dd7cddfSDavid du Colombier BL div<>(SB) /* one neg */ 86*7dd7cddfSDavid du Colombier RSB $0, R(Q), R(TMP) 87*7dd7cddfSDavid du Colombier B out 88*7dd7cddfSDavid du Colombier 89*7dd7cddfSDavid du ColombierTEXT _mod(SB), 1, $16 90*7dd7cddfSDavid du Colombier BL save<>(SB) 91*7dd7cddfSDavid du Colombier CMP $0, R(D) 92*7dd7cddfSDavid du Colombier RSB.LT $0, R(D), R(D) 93*7dd7cddfSDavid du Colombier CMP $0, R(Q) 94*7dd7cddfSDavid du Colombier BGE m1 95*7dd7cddfSDavid du Colombier RSB $0, R(Q), R(Q) 96*7dd7cddfSDavid du Colombier BL div<>(SB) /* neg numerator */ 97*7dd7cddfSDavid du Colombier RSB $0, R(N), R(TMP) 98*7dd7cddfSDavid du Colombier B out 99*7dd7cddfSDavid du Colombierm1: 100*7dd7cddfSDavid du Colombier BL div<>(SB) /* pos numerator */ 101*7dd7cddfSDavid du Colombier MOVW R(N), R(TMP) 102*7dd7cddfSDavid du Colombier B out 103*7dd7cddfSDavid du Colombier 104*7dd7cddfSDavid du ColombierTEXT _divu(SB), 1, $16 105*7dd7cddfSDavid du Colombier BL save<>(SB) 106*7dd7cddfSDavid du Colombier BL div<>(SB) 107*7dd7cddfSDavid du Colombier MOVW R(Q), R(TMP) 108*7dd7cddfSDavid du Colombier B out 109*7dd7cddfSDavid du Colombier 110*7dd7cddfSDavid du ColombierTEXT _modu(SB), 1, $16 111*7dd7cddfSDavid du Colombier BL save<>(SB) 112*7dd7cddfSDavid du Colombier BL div<>(SB) 113*7dd7cddfSDavid du Colombier MOVW R(N), R(TMP) 114*7dd7cddfSDavid du Colombier B out 115*7dd7cddfSDavid du Colombier 116*7dd7cddfSDavid du Colombierout: 117*7dd7cddfSDavid du Colombier BL rest<>(SB) 118*7dd7cddfSDavid du Colombier B out 119