| 2478 | } |
| 2479 | |
| 2480 | private void multiply256(long hh, long hl, long lh, long ll) { |
| 2481 | // Perform 256-bit × 256-bit multiplication |
| 2482 | // Result is at most 512 bits, but we keep only the lower 256 bits |
| 2483 | |
| 2484 | // Split this into eight 32-bit parts |
| 2485 | long a7 = this.hh >>> 32; |
| 2486 | long a6 = this.hh & 0xFFFFFFFFL; |
| 2487 | long a5 = this.hl >>> 32; |
| 2488 | long a4 = this.hl & 0xFFFFFFFFL; |
| 2489 | long a3 = this.lh >>> 32; |
| 2490 | long a2 = this.lh & 0xFFFFFFFFL; |
| 2491 | long a1 = this.ll >>> 32; |
| 2492 | long a0 = this.ll & 0xFFFFFFFFL; |
| 2493 | |
| 2494 | long b7 = hh >>> 32; |
| 2495 | long b6 = hh & 0xFFFFFFFFL; |
| 2496 | long b5 = hl >>> 32; |
| 2497 | long b4 = hl & 0xFFFFFFFFL; |
| 2498 | long b3 = lh >>> 32; |
| 2499 | long b2 = lh & 0xFFFFFFFFL; |
| 2500 | long b1 = ll >>> 32; |
| 2501 | long b0 = ll & 0xFFFFFFFFL; |
| 2502 | |
| 2503 | // Compute all partial products |
| 2504 | long p00 = a0 * b0; |
| 2505 | long p01 = a0 * b1; |
| 2506 | long p02 = a0 * b2; |
| 2507 | long p03 = a0 * b3; |
| 2508 | long p04 = a0 * b4; |
| 2509 | long p05 = a0 * b5; |
| 2510 | long p06 = a0 * b6; |
| 2511 | long p07 = a0 * b7; |
| 2512 | long p10 = a1 * b0; |
| 2513 | long p11 = a1 * b1; |
| 2514 | long p12 = a1 * b2; |
| 2515 | long p13 = a1 * b3; |
| 2516 | long p14 = a1 * b4; |
| 2517 | long p15 = a1 * b5; |
| 2518 | long p16 = a1 * b6; |
| 2519 | long p17 = a1 * b7; |
| 2520 | long p20 = a2 * b0; |
| 2521 | long p21 = a2 * b1; |
| 2522 | long p22 = a2 * b2; |
| 2523 | long p23 = a2 * b3; |
| 2524 | long p24 = a2 * b4; |
| 2525 | long p25 = a2 * b5; |
| 2526 | long p26 = a2 * b6; |
| 2527 | long p27 = a2 * b7; |
| 2528 | long p30 = a3 * b0; |
| 2529 | long p31 = a3 * b1; |
| 2530 | long p32 = a3 * b2; |
| 2531 | long p33 = a3 * b3; |
| 2532 | long p34 = a3 * b4; |
| 2533 | long p35 = a3 * b5; |
| 2534 | long p36 = a3 * b6; |
| 2535 | long p37 = a3 * b7; |
| 2536 | long p40 = a4 * b0; |
| 2537 | long p41 = a4 * b1; |