| 516 | // A[N] --- number to be squared |
| 517 | |
| 518 | void RecursiveSquare(word *R, word *T, const word *A, unsigned int N) |
| 519 | { |
| 520 | assert(N && N%2==0); |
| 521 | |
| 522 | if (N==2) |
| 523 | AtomicSquare(R, A[0], A[1]); |
| 524 | else if (N==4) |
| 525 | { |
| 526 | AtomicSquare(R, A[0], A[1]); |
| 527 | AtomicSquare(R+4, A[2], A[3]); |
| 528 | AtomicMultiply(T, A[0], A[1], A[2], A[3]); |
| 529 | word carry = Add(R+2, R+2, T, 4); |
| 530 | carry += Add(R+2, R+2, T, 4); |
| 531 | Increment(R+6, 2, carry); |
| 532 | } |
| 533 | else |
| 534 | { |
| 535 | const unsigned int N2 = N/2; |
| 536 | |
| 537 | RecursiveSquare(R0, T2, A0, N2); |
| 538 | RecursiveSquare(R2, T2, A1, N2); |
| 539 | RecursiveMultiply(T0, T2, A0, A1, N2); |
| 540 | |
| 541 | word carry = Add(R1, R1, T0, N); |
| 542 | carry += Add(R1, R1, T0, N); |
| 543 | Increment(R3, N2, carry); |
| 544 | } |
| 545 | } |
| 546 | |
| 547 | // R[N] - bottom half of A*B |
| 548 | // T[N] - temporary work space |
no test coverage detected