--- a/jdk/src/java.base/share/classes/java/lang/Math.java Fri May 20 21:44:03 2016 +0100
+++ b/jdk/src/java.base/share/classes/java/lang/Math.java Fri May 20 14:41:41 2016 -0700
@@ -1060,6 +1060,53 @@
}
/**
+ * Returns the exact mathematical product of the arguments.
+ *
+ * @param x the first value
+ * @param y the second value
+ * @return the result
+ */
+ public static long multiplyFull(int x, int y) {
+ return (long)x * (long)y;
+ }
+
+ /**
+ * Returns as a {@code long} the most significant 64 bits of the 128-bit
+ * product of two 64-bit factors.
+ *
+ * @param x the first value
+ * @param y the second value
+ * @return the result
+ */
+ public static long multiplyHigh(long x, long y) {
+ if (x < 0 || y < 0) {
+ // Use technique from section 8-2 of Henry S. Warren, Jr.,
+ // Hacker's Delight (2nd ed.) (Addison Wesley, 2013), 173-174.
+ long x1 = x >> 32;
+ long x2 = x & 0xFFFFFFFFL;
+ long y1 = y >> 32;
+ long y2 = y & 0xFFFFFFFFL;
+ long z2 = x2 * y2;
+ long t = x1 * y2 + (z2 >>> 32);
+ long z1 = t & 0xFFFFFFFFL;
+ long z0 = t >> 32;
+ z1 += x2 * y1;
+ return x1 * y1 + z0 + (z1 >> 32);
+ } else {
+ // Use Karatsuba technique with two base 2^32 digits.
+ long x1 = x >>> 32;
+ long y1 = y >>> 32;
+ long x2 = x & 0xFFFFFFFFL;
+ long y2 = y & 0xFFFFFFFFL;
+ long A = x1 * y1;
+ long B = x2 * y2;
+ long C = (x1 + x2) * (y1 + y2);
+ long K = C - A - B;
+ return (((B >>> 32) + K) >>> 32) + A;
+ }
+ }
+
+ /**
* Returns the largest (closest to positive infinity)
* {@code int} value that is less than or equal to the algebraic quotient.
* There is one special case, if the dividend is the