Skip to content

Commit 9960323

Browse files
committed
More efficient writing of doubles with Scala.js
1 parent bdb9dd7 commit 9960323

File tree

3 files changed

+22
-18
lines changed
  • jsoniter-scala-core

3 files changed

+22
-18
lines changed

jsoniter-scala-core/js/src/main/scala/com/github/plokhotnyuk/jsoniter_scala/core/JsonWriter.scala

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2682,7 +2682,7 @@ final class JsonWriter private[jsoniter_scala](
26822682
val vbr = rop(g1, g0, cbh + (2 << h))
26832683
val m10i = vb >>> 2
26842684
var diff = 0
2685-
if (vb < 400 || {
2685+
if (vb < 400L || {
26862686
m10 = (vb >>> 1) + m10i // Based upon the divu10() code from Hacker's Delight 2nd Edition by Henry Warren
26872687
m10 += m10 >>> 4
26882688
m10 += m10 >>> 8
@@ -2763,24 +2763,28 @@ final class JsonWriter private[jsoniter_scala](
27632763

27642764
@inline
27652765
private[this] def rop(g1: Long, g0: Long, cp: Long): Long = {
2766-
val x = multiplyHigh(g0, cp) + (g1 * cp >>> 1)
2767-
var y = multiplyHigh(g1, cp)
2768-
if (x < 0L) y += 1
2769-
if (-x != x) y |= 1
2766+
val cp2 = cp & 0xFFFFFFFFL
2767+
val cp1 = cp >>> 32
2768+
val cps = cp1 + cp2
2769+
val x = { // Math.multiplyHigh(g0, cp)
2770+
val g02 = g0 & 0xFFFFFFFFL
2771+
val g01 = g0 >>> 32
2772+
val b0 = g02 * cp2
2773+
val a0 = g01 * cp1
2774+
((g01 + g02) * cps + (b0 >>> 32) - (b0 + a0) >>> 32) + a0
2775+
} + (g1 * cp >>> 1)
2776+
var y = { // Math.multiplyHigh(g1, cp)
2777+
val g12 = g1 & 0xFFFFFFFFL
2778+
val g11 = g1 >>> 32
2779+
val b1 = g12 * cp2
2780+
val a1 = g11 * cp1
2781+
((g11 + g12) * cps + (b1 >>> 32) - (b1 + a1) >>> 32) + a1
2782+
}
2783+
if (x < 0L) y += 1L
2784+
if (x << 1 != 0L) y |= 1L
27702785
y
27712786
}
27722787

2773-
@inline
2774-
private[this] def multiplyHigh(x: Long, y: Long): Long = { // Karatsuba technique for two positive longs
2775-
val x2 = x & 0xFFFFFFFFL
2776-
val y2 = y & 0xFFFFFFFFL
2777-
val b = x2 * y2
2778-
val x1 = x >>> 32
2779-
val y1 = y >>> 32
2780-
val a = x1 * y1
2781-
((b >>> 32) + (x1 + x2) * (y1 + y2) - b - a >>> 32) + a
2782-
}
2783-
27842788
@inline
27852789
private[this] def digitCount(x: Long): Int =
27862790
if (x >= 1000000000000000L) {

jsoniter-scala-core/jvm/src/main/scala/com/github/plokhotnyuk/jsoniter_scala/core/JsonWriter.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2395,7 +2395,7 @@ final class JsonWriter private[jsoniter_scala](
23952395
val vbl = rop(g1, g0, cb - cblCorr << h) + vbCorr
23962396
val vbr = rop(g1, g0, cb + 2 << h) - vbCorr
23972397
var diff = 0
2398-
if (vb < 400 || {
2398+
if (vb < 400L || {
23992399
m10 = Math.multiplyHigh(vb, 461168601842738792L) // divide a positive long by 40
24002400
val vb40 = m10 * 40
24012401
diff = (vbl - vb40).toInt

jsoniter-scala-core/native/src/main/scala/com/github/plokhotnyuk/jsoniter_scala/core/JsonWriter.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2395,7 +2395,7 @@ final class JsonWriter private[jsoniter_scala](
23952395
val vbl = rop(g1, g0, cb - cblCorr << h) + vbCorr
23962396
val vbr = rop(g1, g0, cb + 2 << h) - vbCorr
23972397
var diff = 0
2398-
if (vb < 400 || {
2398+
if (vb < 400L || {
23992399
m10 = NativeMath.multiplyHigh(vb, 461168601842738792L) // divide a positive long by 40
24002400
val vb40 = m10 * 40
24012401
diff = (vbl - vb40).toInt

0 commit comments

Comments
 (0)