@@ -1617,7 +1617,7 @@ final class JsonWriter private[jsoniter_scala](
16171617 pos += digitCount(q)
16181618 count = pos
16191619 } else {
1620- val q1 = (exp >> 8 ) * 1441151881 >> 49 // divide a small positive long by 100000000
1620+ val q1 = (exp >>> 8 ) * 1441151881 > >> 49 // divide a small positive long by 100000000
16211621 q = q1.toInt
16221622 pos += digitCount(q)
16231623 count = write8Digits((exp - q1 * 100000000 ).toInt, pos, buf, ds)
@@ -2209,7 +2209,7 @@ final class JsonWriter private[jsoniter_scala](
22092209 private [this ] def write18Digits (x : Long , pos : Int , buf : Array [Byte ], ds : Array [Short ]): Int = {
22102210 val q1 = x / 100000000
22112211 write8Digits((x - q1 * 100000000 ).toInt, {
2212- val q2 = (q1 >> 8 ) * 1441151881 >> 49 // divide a small positive long by 100000000
2212+ val q2 = (q1 >>> 8 ) * 1441151881 > >> 49 // divide a small positive long by 100000000
22132213 write8Digits((q1 - q2 * 100000000 ).toInt, write2Digits(q2.toInt, pos, buf, ds), buf, ds)
22142214 }, buf, ds)
22152215 }
@@ -2291,7 +2291,7 @@ final class JsonWriter private[jsoniter_scala](
22912291 lastPos += digitCount(q)
22922292 pos = lastPos
22932293 } else {
2294- val q2 = (q1 >> 8 ) * 1441151881 >> 49 // divide a small positive long by 100000000
2294+ val q2 = (q1 >>> 8 ) * 1441151881 > >> 49 // divide a small positive long by 100000000
22952295 q = q2.toInt
22962296 lastPos += digitCount(q)
22972297 pos = write8Digits((q1 - q2 * 100000000 ).toInt, lastPos, buf, ds)
@@ -2434,12 +2434,12 @@ final class JsonWriter private[jsoniter_scala](
24342434 pos += 3
24352435 } else {
24362436 val bits = java.lang.Double .doubleToLongBits(x)
2437- var e2 = ((bits >> 52 ).toInt & 0x7FF ) - 1075
2437+ var e2 = ((bits >>> 52 ).toInt & 0x7FF ) - 1075
24382438 var m2 = bits & 0xFFFFFFFFFFFFFL | 0x10000000000000L
24392439 var m10 = 0L
24402440 var e10 = 0
24412441 if (e2 == 0 ) m10 = m2
2442- else if ((e2 >= - 52 && e2 < 0 ) && m2 << e2 == 0 ) m10 = m2 >> - e2
2442+ else if ((e2 >= - 52 && e2 < 0 ) && m2 << e2 == 0 ) m10 = m2 >>> - e2
24432443 else {
24442444 var e10Corr, e2Corr = 0
24452445 var cblCorr = 2
@@ -2466,15 +2466,26 @@ final class JsonWriter private[jsoniter_scala](
24662466 val vb = rop(g1, g0, cbh)
24672467 val vbl = rop(g1, g0, cbh - (cblCorr << h))
24682468 val vbr = rop(g1, g0, cbh + (2 << h))
2469+ val m10i = vb >>> 2
24692470 var diff = 0
24702471 if (vb < 400 || {
2471- m10 = vb / 40
2472- val vb40 = (m10 << 5 ) + (m10 << 3 )
2472+ m10 = (vb >>> 1 ) + m10i // Based upon the divu10() code from Hacker's Delight 2nd Edition by Henry Warren
2473+ m10 += m10 >>> 4
2474+ m10 += m10 >>> 8
2475+ m10 += m10 >>> 16
2476+ m10 += m10 >>> 32
2477+ var vb40 = m10 & 0xFFFFFFFFFFFFFFE0L
2478+ m10 >>>= 5
2479+ vb40 += m10 << 3
24732480 diff = (vbl - vb40).toInt + vbCorr
2474- ((vb40 - vbr).toInt + vbCorr + 40 ^ diff) >= 0
2481+ ((if ((vb - vb40).toInt >= 40 ) {
2482+ m10 += 1
2483+ diff -= 40
2484+ 80
2485+ } else 40 ) + (vb40 - vbr).toInt + vbCorr ^ diff) >= 0
24752486 }) {
2476- m10 = vb >> 2
2477- val vb4 = m10 << 2
2487+ m10 = m10i
2488+ val vb4 = vb & 0xFFFFFFFFFFFFFFFCL
24782489 diff = (vbl - vb4).toInt + vbCorr
24792490 if (((vb4 - vbr).toInt + vbCorr + 4 ^ diff) >= 0 ) diff = (vb.toInt & 0x3 ) + (m10.toInt & 0x1 ) - 3
24802491 } else e10Corr = - 1
0 commit comments