mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 07:14:30 +02:00
8188046: java.lang.Math.mutliplyHigh does not run in constant time
Reviewed-by: rriggs, darcy
This commit is contained in:
parent
ca4bea4665
commit
cb795893be
1 changed files with 14 additions and 25 deletions
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue