8188046: java.lang.Math.mutliplyHigh does not run in constant time

Reviewed-by: rriggs, darcy
This commit is contained in:
Brian Burkhalter 2021-07-02 18:21:39 +00:00
parent ca4bea4665
commit cb795893be

View file

@ -1161,31 +1161,20 @@ public final class Math {
*/ */
@IntrinsicCandidate @IntrinsicCandidate
public static long multiplyHigh(long x, long y) { public static long multiplyHigh(long x, long y) {
if (x < 0 || y < 0) { // Use technique from section 8-2 of Henry S. Warren, Jr.,
// Use technique from section 8-2 of Henry S. Warren, Jr., // Hacker's Delight (2nd ed.) (Addison Wesley, 2013), 173-174.
// Hacker's Delight (2nd ed.) (Addison Wesley, 2013), 173-174. long x1 = x >> 32;
long x1 = x >> 32; long x2 = x & 0xFFFFFFFFL;
long x2 = x & 0xFFFFFFFFL; long y1 = y >> 32;
long y1 = y >> 32; long y2 = y & 0xFFFFFFFFL;
long y2 = y & 0xFFFFFFFFL;
long z2 = x2 * y2; long z2 = x2 * y2;
long t = x1 * y2 + (z2 >>> 32); long t = x1 * y2 + (z2 >>> 32);
long z1 = t & 0xFFFFFFFFL; long z1 = t & 0xFFFFFFFFL;
long z0 = t >> 32; long z0 = t >> 32;
z1 += x2 * y1; z1 += x2 * y1;
return x1 * y1 + z0 + (z1 >> 32);
} else { return x1 * y1 + z0 + (z1 >> 32);
// 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;
}
} }
/** /**