| 550 | // B[N] - multiplicant |
| 551 | |
| 552 | void RecursiveMultiplyBottom(word *R, word *T, const word *A, const word *B, unsigned int N) |
| 553 | { |
| 554 | assert(N>=2 && N%2==0); |
| 555 | |
| 556 | if (N==2) |
| 557 | AtomicMultiplyBottom(R, A[0], A[1], B[0], B[1]); |
| 558 | else if (N==4) |
| 559 | { |
| 560 | AtomicMultiply(R, A[0], A[1], B[0], B[1]); |
| 561 | AtomicMultiplyBottomAdd(R+2, A[0], A[1], B[2], B[3]); |
| 562 | AtomicMultiplyBottomAdd(R+2, A[2], A[3], B[0], B[1]); |
| 563 | } |
| 564 | else |
| 565 | { |
| 566 | const unsigned int N2 = N/2; |
| 567 | |
| 568 | RecursiveMultiply(R, T, A0, B0, N2); |
| 569 | RecursiveMultiplyBottom(T0, T1, A1, B0, N2); |
| 570 | Add(R1, R1, T0, N2); |
| 571 | RecursiveMultiplyBottom(T0, T1, A0, B1, N2); |
| 572 | Add(R1, R1, T0, N2); |
| 573 | } |
| 574 | } |
| 575 | |
| 576 | // R[N] --- upper half of A*B |
| 577 | // T[2*N] - temporary work space |
no test coverage detected