1*219b2ee8SDavid du ColombierTEXT _mulv(SB), $0 2*219b2ee8SDavid du Colombier MOVW u1+8(FP), R8 3*219b2ee8SDavid du Colombier MOVW u2+16(FP), R13 4*219b2ee8SDavid du Colombier 5*219b2ee8SDavid du Colombier MOVW R13, R16 /* save low parts for later */ 6*219b2ee8SDavid du Colombier MOVW R8, R12 7*219b2ee8SDavid du Colombier 8*219b2ee8SDavid du Colombier /* 9*219b2ee8SDavid du Colombier * unsigned 32x32 => 64 multiply 10*219b2ee8SDavid du Colombier */ 11*219b2ee8SDavid du Colombier CMP R13, R8 12*219b2ee8SDavid du Colombier BLE mul1 13*219b2ee8SDavid du Colombier MOVW R12, R13 14*219b2ee8SDavid du Colombier MOVW R16, R8 15*219b2ee8SDavid du Colombiermul1: 16*219b2ee8SDavid du Colombier MOVW R13, Y 17*219b2ee8SDavid du Colombier ANDNCC $0xFFF, R13, R0 18*219b2ee8SDavid du Colombier BE mul_shortway 19*219b2ee8SDavid du Colombier ANDCC R0, R0, R9 /* zero partial product and clear N and V cond's */ 20*219b2ee8SDavid du Colombier 21*219b2ee8SDavid du Colombier /* long multiply */ 22*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 0 */ 23*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 1 */ 24*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 2 */ 25*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 3 */ 26*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 4 */ 27*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 5 */ 28*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 6 */ 29*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 7 */ 30*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 8 */ 31*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 9 */ 32*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 10 */ 33*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 11 */ 34*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 12 */ 35*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 13 */ 36*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 14 */ 37*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 15 */ 38*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 16 */ 39*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 17 */ 40*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 18 */ 41*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 19 */ 42*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 20 */ 43*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 21 */ 44*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 22 */ 45*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 23 */ 46*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 24 */ 47*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 25 */ 48*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 26 */ 49*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 27 */ 50*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 28 */ 51*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 29 */ 52*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 30 */ 53*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 31 */ 54*219b2ee8SDavid du Colombier MULSCC R0, R9, R9 /* 32; shift only; r9 is high part */ 55*219b2ee8SDavid du Colombier 56*219b2ee8SDavid du Colombier /* 57*219b2ee8SDavid du Colombier * need to correct top word if top bit set 58*219b2ee8SDavid du Colombier */ 59*219b2ee8SDavid du Colombier CMP R8, R0 60*219b2ee8SDavid du Colombier BGE mul_tstlow 61*219b2ee8SDavid du Colombier ADD R13, R9 /* adjust the high parts */ 62*219b2ee8SDavid du Colombier 63*219b2ee8SDavid du Colombiermul_tstlow: 64*219b2ee8SDavid du Colombier MOVW Y, R13 /* get low part */ 65*219b2ee8SDavid du Colombier BA mul_done 66*219b2ee8SDavid du Colombier 67*219b2ee8SDavid du Colombiermul_shortway: 68*219b2ee8SDavid du Colombier ANDCC R0, R0, R9 /* zero partial product and clear N and V cond's */ 69*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 0 */ 70*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 1 */ 71*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 2 */ 72*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 3 */ 73*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 4 */ 74*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 5 */ 75*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 6 */ 76*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 7 */ 77*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 8 */ 78*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 9 */ 79*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 10 */ 80*219b2ee8SDavid du Colombier MULSCC R8, R9, R9 /* 11 */ 81*219b2ee8SDavid du Colombier MULSCC R0, R9, R9 /* 12; shift only; r9 is high part */ 82*219b2ee8SDavid du Colombier 83*219b2ee8SDavid du Colombier MOVW Y, R8 /* make low part of partial low part & high part */ 84*219b2ee8SDavid du Colombier SLL $12, R9, R13 85*219b2ee8SDavid du Colombier SRL $20, R8 86*219b2ee8SDavid du Colombier OR R8, R13 87*219b2ee8SDavid du Colombier 88*219b2ee8SDavid du Colombier SRA $20, R9 /* high part */ 89*219b2ee8SDavid du Colombier 90*219b2ee8SDavid du Colombiermul_done: 91*219b2ee8SDavid du Colombier 92*219b2ee8SDavid du Colombier /* 93*219b2ee8SDavid du Colombier * mul by high halves if needed 94*219b2ee8SDavid du Colombier */ 95*219b2ee8SDavid du Colombier MOVW R13, 4(R7) 96*219b2ee8SDavid du Colombier MOVW u2+12(FP), R11 97*219b2ee8SDavid du Colombier CMP R11, R0 98*219b2ee8SDavid du Colombier BE nomul1 99*219b2ee8SDavid du Colombier MUL R11, R12 100*219b2ee8SDavid du Colombier ADD R12, R9 101*219b2ee8SDavid du Colombier 102*219b2ee8SDavid du Colombiernomul1: 103*219b2ee8SDavid du Colombier MOVW u1+4(FP), R11 104*219b2ee8SDavid du Colombier CMP R11, R0 105*219b2ee8SDavid du Colombier BE nomul2 106*219b2ee8SDavid du Colombier MUL R11, R16 107*219b2ee8SDavid du Colombier ADD R16, R9 108*219b2ee8SDavid du Colombier 109*219b2ee8SDavid du Colombiernomul2: 110*219b2ee8SDavid du Colombier 111*219b2ee8SDavid du Colombier MOVW R9, 0(R7) 112*219b2ee8SDavid du Colombier RETURN 113