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