| 734 | } |
| 735 | |
| 736 | public static long umulHigh(long a, long b) { // for JDK8- |
| 737 | long a1 = a >> 32; |
| 738 | long a2 = a & 0xffff_ffffL; |
| 739 | long b1 = b >> 32; |
| 740 | long b2 = b & 0xffff_ffffL; |
| 741 | long c2 = a2 * b2; |
| 742 | long t = a1 * b2 + (c2 >>> 32); |
| 743 | long c1 = t & 0xffff_ffffL; |
| 744 | long c0 = t >> 32; |
| 745 | c1 += a2 * b1; |
| 746 | long mh = a1 * b1 + c0 + (c1 >> 32); |
| 747 | mh += (b & (a >> 63)); |
| 748 | mh += (a & (b >> 63)); |
| 749 | return mh; |
| 750 | } |
| 751 | |
| 752 | public static long umulHigh9(long a, long b) { // for JDK9+ |
| 753 | long r = Math.multiplyHigh(a, b); |