| 2057 | // B[N] --- multiplicant |
| 2058 | |
| 2059 | void RecursiveMultiply(word *R, word *T, const word *A, const word *B, size_t N) |
| 2060 | { |
| 2061 | assert(N>=2 && N%2==0); |
| 2062 | |
| 2063 | if (N <= s_recursionLimit) |
| 2064 | s_pMul[N/4](R, A, B); |
| 2065 | else |
| 2066 | { |
| 2067 | const size_t N2 = N/2; |
| 2068 | |
| 2069 | size_t AN2 = Compare(A0, A1, N2) > 0 ? 0 : N2; |
| 2070 | Subtract(R0, A + AN2, A + (N2 ^ AN2), N2); |
| 2071 | |
| 2072 | size_t BN2 = Compare(B0, B1, N2) > 0 ? 0 : N2; |
| 2073 | Subtract(R1, B + BN2, B + (N2 ^ BN2), N2); |
| 2074 | |
| 2075 | RecursiveMultiply(R2, T2, A1, B1, N2); |
| 2076 | RecursiveMultiply(T0, T2, R0, R1, N2); |
| 2077 | RecursiveMultiply(R0, T2, A0, B0, N2); |
| 2078 | |
| 2079 | // now T[01] holds (A1-A0)*(B0-B1), R[01] holds A0*B0, R[23] holds A1*B1 |
| 2080 | |
| 2081 | int c2 = Add(R2, R2, R1, N2); |
| 2082 | int c3 = c2; |
| 2083 | c2 += Add(R1, R2, R0, N2); |
| 2084 | c3 += Add(R2, R2, R3, N2); |
| 2085 | |
| 2086 | if (AN2 == BN2) |
| 2087 | c3 -= Subtract(R1, R1, T0, N); |
| 2088 | else |
| 2089 | c3 += Add(R1, R1, T0, N); |
| 2090 | |
| 2091 | c3 += Increment(R2, N2, c2); |
| 2092 | assert (c3 >= 0 && c3 <= 2); |
| 2093 | Increment(R3, N2, c3); |
| 2094 | } |
| 2095 | } |
| 2096 | |
| 2097 | // R[2*N] - result = A*A |
| 2098 | // T[2*N] - temporary work space |
no test coverage detected