diff options
Diffstat (limited to 'deps/v8/src/base/numbers/diy-fp.h')
-rw-r--r-- | deps/v8/src/base/numbers/diy-fp.h | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/deps/v8/src/base/numbers/diy-fp.h b/deps/v8/src/base/numbers/diy-fp.h index d68e915585..205277e1fa 100644 --- a/deps/v8/src/base/numbers/diy-fp.h +++ b/deps/v8/src/base/numbers/diy-fp.h @@ -48,9 +48,18 @@ class DiyFp { // returns a * b; static DiyFp Times(const DiyFp& a, const DiyFp& b) { +#ifdef __SIZEOF_INT128__ + // If we have compiler-assisted 64x64 -> 128 muls (e.g. x86-64 and + // aarch64), we can use that for a faster, inlined implementation. + // This rounds the same way as Multiply(). + uint64_t hi = (a.f_ * static_cast<unsigned __int128>(b.f_)) >> 64; + uint64_t lo = (a.f_ * static_cast<unsigned __int128>(b.f_)); + return {hi + (lo >> 63), a.e_ + b.e_ + 64}; +#else DiyFp result = a; result.Multiply(b); return result; +#endif } void Normalize() { |