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