mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 14:54:52 +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
|
||||
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;
|
||||
}
|
||||
// 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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue