summaryrefslogtreecommitdiff
path: root/deps/v8/src/base/numbers/diy-fp.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/base/numbers/diy-fp.h')
-rw-r--r--deps/v8/src/base/numbers/diy-fp.h9
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() {