[Git][ghc/ghc][master] JS: faster implementation for some numeric primitives (#23597)
Marge Bot (@marge-bot)
gitlab at gitlab.haskell.org
Wed Mar 6 02:45:37 UTC 2024
Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC
Commits:
a8c0e31b by Sylvain Henry at 2024-03-05T21:45:14-05:00
JS: faster implementation for some numeric primitives (#23597)
Use faster implementations for the following primitives in the JS
backend by not using JavaScript's BigInt:
- plusInt64
- minusInt64
- minusWord64
- timesWord64
- timesInt64
Co-authored-by: Josh Meredith <joshmeredith2008 at gmail.com>
- - - - -
1 changed file:
- rts/js/arith.js
Changes:
=====================================
rts/js/arith.js
=====================================
@@ -44,19 +44,23 @@ function h$hs_remWord64(h1,l1,h2,l2) {
}
function h$hs_timesWord64(h1,l1,h2,l2) {
- var a = W64(h1,l1);
- var b = W64(h2,l2);
- var r = BigInt.asUintN(64, a * b);
- TRACE_ARITH("Word64: " + a + " * " + b + " ==> " + r)
- RETURN_W64(r);
+ var rh = h$mul2Word32(l1,l2);
+ var rl = h$ret1;
+
+ rh += Math.imul(l1,h2)>>>0;
+ rh += Math.imul(l2,h1)>>>0;
+ rh >>>= 0;
+
+ TRACE_ARITH("Word64: " + (h1,l1) + " * " + (h2,l2) + " ==> " + (rh,rl))
+ RETURN_UBX_TUP2(rh,rl);
}
function h$hs_minusWord64(h1,l1,h2,l2) {
- var a = (BigInt(h1) << BigInt(32)) | BigInt(l1>>>0);
- var b = (BigInt(h2) << BigInt(32)) | BigInt(l2>>>0);
- var r = BigInt.asUintN(64, a - b);
- TRACE_ARITH("Word64: " + a + " - " + b + " ==> " + r)
- RETURN_W64(r);
+ var l = l1-l2;
+ var rl = l>>>0;
+ var rh = (h1-h2-(l!=rl?1:0))>>>0;
+ TRACE_ARITH("Word64: " + (h1,l1) + " - " + (h2,l2) + " ==> " + (rh,rl))
+ RETURN_UBX_TUP2(rh,rl);
}
function h$hs_plusWord64(h1,l1,h2,l2) {
@@ -68,11 +72,15 @@ function h$hs_plusWord64(h1,l1,h2,l2) {
}
function h$hs_timesInt64(h1,l1,h2,l2) {
- var a = I64(h1,l1);
- var b = I64(h2,l2);
- var r = BigInt.asIntN(64, a * b);
- TRACE_ARITH("Int64: " + a + " * " + b + " ==> " + r)
- RETURN_I64(r);
+ var rh = h$mul2Word32(l1,l2);
+ var rl = h$ret1;
+
+ rh += Math.imul(l1,h2)|0;
+ rh += Math.imul(l2,h1)|0;
+ rh |= 0;
+
+ TRACE_ARITH("Int64: " + (h1,l1) + " * " + (h2,l2) + " ==> " + (rh,rl))
+ RETURN_UBX_TUP2(rh,rl);
}
function h$hs_quotInt64(h1,l1,h2,l2) {
@@ -92,19 +100,19 @@ function h$hs_remInt64(h1,l1,h2,l2) {
}
function h$hs_plusInt64(h1,l1,h2,l2) {
- var a = I64(h1,l1);
- var b = I64(h2,l2);
- var r = BigInt.asIntN(64, a + b);
- TRACE_ARITH("Int64: " + a + " + " + b + " ==> " + r)
- RETURN_I64(r);
+ var l = l1+l2;
+ var rl = l>>>0;
+ var rh = (h1+h2+(l!=rl?1:0))|0;
+ TRACE_ARITH("Int64: " + (h1,l1) + " + " + (h2,l2) + " ==> " + (rh,rl))
+ RETURN_UBX_TUP2(rh,rl);
}
function h$hs_minusInt64(h1,l1,h2,l2) {
- var a = I64(h1,l1);
- var b = I64(h2,l2);
- var r = BigInt.asIntN(64, a - b);
- TRACE_ARITH("Int64: " + a + " - " + b + " ==> " + r)
- RETURN_I64(r);
+ var l = l1-l2;
+ var rl = l>>>0;
+ var rh = (h1-h2-(l!=rl?1:0))|0;
+ TRACE_ARITH("Int64: " + (h1,l1) + " - " + (h2,l2) + " ==> " + (rh,rl))
+ RETURN_UBX_TUP2(rh,rl);
}
function h$hs_uncheckedShiftLWord64(h,l,n) {
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/a8c0e31b203a912484e9faf9d903ab5b141d82f3
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/a8c0e31b203a912484e9faf9d903ab5b141d82f3
You're receiving this email because of your account on gitlab.haskell.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-commits/attachments/20240305/376a178e/attachment-0001.html>
More information about the ghc-commits
mailing list