@@ -1617,7 +1617,7 @@ final class JsonWriter private[jsoniter_scala](
1617
1617
pos += digitCount(q)
1618
1618
count = pos
1619
1619
} 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
1621
1621
q = q1.toInt
1622
1622
pos += digitCount(q)
1623
1623
count = write8Digits((exp - q1 * 100000000 ).toInt, pos, buf, ds)
@@ -2209,7 +2209,7 @@ final class JsonWriter private[jsoniter_scala](
2209
2209
private [this ] def write18Digits (x : Long , pos : Int , buf : Array [Byte ], ds : Array [Short ]): Int = {
2210
2210
val q1 = x / 100000000
2211
2211
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
2213
2213
write8Digits((q1 - q2 * 100000000 ).toInt, write2Digits(q2.toInt, pos, buf, ds), buf, ds)
2214
2214
}, buf, ds)
2215
2215
}
@@ -2291,7 +2291,7 @@ final class JsonWriter private[jsoniter_scala](
2291
2291
lastPos += digitCount(q)
2292
2292
pos = lastPos
2293
2293
} 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
2295
2295
q = q2.toInt
2296
2296
lastPos += digitCount(q)
2297
2297
pos = write8Digits((q1 - q2 * 100000000 ).toInt, lastPos, buf, ds)
@@ -2434,12 +2434,12 @@ final class JsonWriter private[jsoniter_scala](
2434
2434
pos += 3
2435
2435
} else {
2436
2436
val bits = java.lang.Double .doubleToLongBits(x)
2437
- var e2 = ((bits >> 52 ).toInt & 0x7FF ) - 1075
2437
+ var e2 = ((bits >>> 52 ).toInt & 0x7FF ) - 1075
2438
2438
var m2 = bits & 0xFFFFFFFFFFFFFL | 0x10000000000000L
2439
2439
var m10 = 0L
2440
2440
var e10 = 0
2441
2441
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
2443
2443
else {
2444
2444
var e10Corr, e2Corr = 0
2445
2445
var cblCorr = 2
@@ -2466,15 +2466,26 @@ final class JsonWriter private[jsoniter_scala](
2466
2466
val vb = rop(g1, g0, cbh)
2467
2467
val vbl = rop(g1, g0, cbh - (cblCorr << h))
2468
2468
val vbr = rop(g1, g0, cbh + (2 << h))
2469
+ val m10i = vb >>> 2
2469
2470
var diff = 0
2470
2471
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
2473
2480
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
2475
2486
}) {
2476
- m10 = vb >> 2
2477
- val vb4 = m10 << 2
2487
+ m10 = m10i
2488
+ val vb4 = vb & 0xFFFFFFFFFFFFFFFCL
2478
2489
diff = (vbl - vb4).toInt + vbCorr
2479
2490
if (((vb4 - vbr).toInt + vbCorr + 4 ^ diff) >= 0 ) diff = (vb.toInt & 0x3 ) + (m10.toInt & 0x1 ) - 3
2480
2491
} else e10Corr = - 1
0 commit comments