| 2249 | } |
| 2250 | |
| 2251 | private void multiply192(long h, long m, long l) { |
| 2252 | // Perform 256-bit × 192-bit multiplication |
| 2253 | // Result is at most 448 bits, but we keep only the lower 256 bits |
| 2254 | |
| 2255 | // Split this into eight 32-bit parts |
| 2256 | long a7 = hh >>> 32; |
| 2257 | long a6 = hh & 0xFFFFFFFFL; |
| 2258 | long a5 = hl >>> 32; |
| 2259 | long a4 = hl & 0xFFFFFFFFL; |
| 2260 | long a3 = lh >>> 32; |
| 2261 | long a2 = lh & 0xFFFFFFFFL; |
| 2262 | long a1 = ll >>> 32; |
| 2263 | long a0 = ll & 0xFFFFFFFFL; |
| 2264 | |
| 2265 | long b5 = h >>> 32; |
| 2266 | long b4 = h & 0xFFFFFFFFL; |
| 2267 | long b3 = m >>> 32; |
| 2268 | long b2 = m & 0xFFFFFFFFL; |
| 2269 | long b1 = l >>> 32; |
| 2270 | long b0 = l & 0xFFFFFFFFL; |
| 2271 | |
| 2272 | // Compute all partial products |
| 2273 | long p00 = a0 * b0; |
| 2274 | long p01 = a0 * b1; |
| 2275 | long p02 = a0 * b2; |
| 2276 | long p03 = a0 * b3; |
| 2277 | long p04 = a0 * b4; |
| 2278 | long p05 = a0 * b5; |
| 2279 | long p10 = a1 * b0; |
| 2280 | long p11 = a1 * b1; |
| 2281 | long p12 = a1 * b2; |
| 2282 | long p13 = a1 * b3; |
| 2283 | long p14 = a1 * b4; |
| 2284 | long p15 = a1 * b5; |
| 2285 | long p20 = a2 * b0; |
| 2286 | long p21 = a2 * b1; |
| 2287 | long p22 = a2 * b2; |
| 2288 | long p23 = a2 * b3; |
| 2289 | long p24 = a2 * b4; |
| 2290 | long p25 = a2 * b5; |
| 2291 | long p30 = a3 * b0; |
| 2292 | long p31 = a3 * b1; |
| 2293 | long p32 = a3 * b2; |
| 2294 | long p33 = a3 * b3; |
| 2295 | long p34 = a3 * b4; |
| 2296 | long p35 = a3 * b5; |
| 2297 | long p40 = a4 * b0; |
| 2298 | long p41 = a4 * b1; |
| 2299 | long p42 = a4 * b2; |
| 2300 | long p43 = a4 * b3; |
| 2301 | long p44 = a4 * b4; |
| 2302 | long p45 = a4 * b5; |
| 2303 | long p50 = a5 * b0; |
| 2304 | long p51 = a5 * b1; |
| 2305 | long p52 = a5 * b2; |
| 2306 | long p53 = a5 * b3; |
| 2307 | long p54 = a5 * b4; |
| 2308 | long p55 = a5 * b5; |