Skip to content

Commit

Permalink
More efficient serialization of double and float values
Browse files Browse the repository at this point in the history
  • Loading branch information
plokhotnyuk committed Jun 20, 2024
1 parent 1186a5c commit f15a6b8
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 72 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2353,23 +2353,20 @@ final class JsonWriter private[jsoniter_scala](
val vb = rop(g, cb << h)
val vbl = rop(g, cb - cblCorr << h) + vbCorr
val vbr = rop(g, cb + 2 << h) - vbCorr
var diff = 0
if (vb < 400 || {
m10 = vb / 40
val vb40 = m10 * 40
val diff = vbl - vb40
(vb40 - vbr + 40 ^ diff) >= 0 || {
m10 += ~diff >>> 31
e10 += 1
false
}
diff = vbl - vb40
(vb40 - vbr + 40 ^ diff) >= 0
}) {
m10 = vb >> 2
val vb4 = m10 << 2
var diff = vbl - vb4
diff = vbl - vb4
if ((vb4 - vbr + 4 ^ diff) >= 0) diff = (vb & 0x3) + (m10 & 0x1) - 3
m10 += ~diff >>> 31
e10 -= e10Corr
}
} else e10Corr = -1
m10 += ~diff >>> 31
e10 -= e10Corr
}
val ds = digits
val len = digitCount(m10)
Expand Down Expand Up @@ -2399,9 +2396,8 @@ final class JsonWriter private[jsoniter_scala](
buf(pos + 2) = '0'
buf(pos + 3) = '0'
pos -= e10
val lastPos = writeSignificantFractionDigits(m10, pos + len, pos, buf, ds)
pos = writeSignificantFractionDigits(m10, pos + len, pos, buf, ds)
buf(dotPos) = '.'
pos = lastPos
} else if (e10 < len - 1) {
val lastPos = writeSignificantFractionDigits(m10, pos + len, pos, buf, ds)
val beforeDotPos = pos + e10
Expand Down Expand Up @@ -2466,6 +2462,7 @@ final class JsonWriter private[jsoniter_scala](
cblCorr = 1
}
e10 = e2 * 315653 - e2Corr >> 20
val gs = JsonWriter.gs
val i = e10 + 324 << 1
val g1 = gs(i)
val g0 = gs(i + 1)
Expand All @@ -2475,23 +2472,20 @@ final class JsonWriter private[jsoniter_scala](
val vb = rop(g1, g0, cb << h)
val vbl = rop(g1, g0, cb - cblCorr << h) + vbCorr
val vbr = rop(g1, g0, cb + 2 << h) - vbCorr
var diff = 0
if (vb < 400 || {
m10 = vb / 40
val vb40 = m10 * 40
val diff = (vbl - vb40).toInt
((vb40 - vbr).toInt + 40 ^ diff) >= 0 || {
m10 += ~diff >>> 31
e10 += 1
false
}
diff = (vbl - vb40).toInt
((vb40 - vbr).toInt + 40 ^ diff) >= 0
}) {
m10 = vb >> 2
val vb4 = m10 << 2
var diff = (vbl - vb4).toInt
diff = (vbl - vb4).toInt
if (((vb4 - vbr).toInt + 4 ^ diff) >= 0) diff = (vb.toInt & 0x3) + (m10.toInt & 0x1) - 3
m10 += ~diff >>> 31
e10 -= e10Corr
}
} else e10Corr = -1
m10 += ~diff >>> 31
e10 -= e10Corr
}
val ds = digits
val len = digitCount(m10)
Expand Down Expand Up @@ -2522,9 +2516,8 @@ final class JsonWriter private[jsoniter_scala](
buf(pos + 2) = '0'
buf(pos + 3) = '0'
pos -= e10
val lastPos = writeSignificantFractionDigits(m10, pos + len, pos, buf, ds)
pos = writeSignificantFractionDigits(m10, pos + len, pos, buf, ds)
buf(dotPos) = '.'
pos = lastPos
} else if (e10 < len - 1) {
val lastPos = writeSignificantFractionDigits(m10, pos + len, pos, buf, ds)
val beforeDotPos = pos + e10
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2191,23 +2191,20 @@ final class JsonWriter private[jsoniter_scala](
val vb = rop(g, cb << h)
val vbl = rop(g, cb - cblCorr << h) + vbCorr
val vbr = rop(g, cb + 2 << h) - vbCorr
var diff = 0
if (vb < 400 || {
m10 = (vb * 107374183L >> 32).toInt // divide a positive int by 40
val vb40 = m10 * 40
val diff = vbl - vb40
(vb40 - vbr + 40 ^ diff) >= 0 || {
m10 += ~diff >>> 31
e10 += 1
false
}
diff = vbl - vb40
(vb40 - vbr + 40 ^ diff) >= 0
}) {
m10 = vb >> 2
val vb4 = m10 << 2
var diff = vbl - vb4
diff = vbl - vb4
if ((vb4 - vbr + 4 ^ diff) >= 0) diff = (vb & 0x3) + (m10 & 0x1) - 3
m10 += ~diff >>> 31
e10 -= e10Corr
}
} else e10Corr = -1
m10 += ~diff >>> 31
e10 -= e10Corr
}
val ds = digits
val len = digitCount(m10.toLong)
Expand All @@ -2233,9 +2230,8 @@ final class JsonWriter private[jsoniter_scala](
val dotPos = pos + 1
ByteArrayAccess.setInt(buf, pos, 0x30303030)
pos -= e10
val lastPos = writeSignificantFractionDigits(m10, pos + len, pos, buf, ds)
pos = writeSignificantFractionDigits(m10, pos + len, pos, buf, ds)
buf(dotPos) = '.'
pos = lastPos
} else if (e10 < len - 1) {
val lastPos = writeSignificantFractionDigits(m10, pos + len, pos, buf, ds)
val bs = ByteArrayAccess.getLong(buf, pos)
Expand Down Expand Up @@ -2298,6 +2294,7 @@ final class JsonWriter private[jsoniter_scala](
cblCorr = 1
}
e10 = e2 * 315653 - e2Corr >> 20
val gs = JsonWriter.gs
val i = e10 + 324 << 1
val g1 = gs(i)
val g0 = gs(i + 1)
Expand All @@ -2307,23 +2304,20 @@ final class JsonWriter private[jsoniter_scala](
val vb = rop(g1, g0, cb << h)
val vbl = rop(g1, g0, cb - cblCorr << h) + vbCorr
val vbr = rop(g1, g0, cb + 2 << h) - vbCorr
var diff = 0
if (vb < 400 || {
m10 = Math.multiplyHigh(vb, 461168601842738792L) // divide a positive long by 40
val vb40 = m10 * 40
val diff = (vbl - vb40).toInt
((vb40 - vbr).toInt + 40 ^ diff) >= 0 || {
m10 += ~diff >>> 31
e10 += 1
false
}
diff = (vbl - vb40).toInt
((vb40 - vbr).toInt + 40 ^ diff) >= 0
}) {
m10 = vb >> 2
val vb4 = m10 << 2
var diff = (vbl - vb4).toInt
diff = (vbl - vb4).toInt
if (((vb4 - vbr).toInt + 4 ^ diff) >= 0) diff = (vb.toInt & 0x3) + (m10.toInt & 0x1) - 3
m10 += ~diff >>> 31
e10 -= e10Corr
}
} else e10Corr = -1
m10 += ~diff >>> 31
e10 -= e10Corr
}
val ds = digits
val len = digitCount(m10)
Expand All @@ -2350,9 +2344,8 @@ final class JsonWriter private[jsoniter_scala](
val dotPos = pos + 1
ByteArrayAccess.setInt(buf, pos, 0x30303030)
pos -= e10
val lastPos = writeSignificantFractionDigits(m10, pos + len, pos, buf, ds)
pos = writeSignificantFractionDigits(m10, pos + len, pos, buf, ds)
buf(dotPos) = '.'
pos = lastPos
} else if (e10 < len - 1) {
val lastPos = writeSignificantFractionDigits(m10, pos + len, pos, buf, ds)
val bs = ByteArrayAccess.getLong(buf, pos)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2191,23 +2191,20 @@ final class JsonWriter private[jsoniter_scala](
val vb = rop(g, cb << h)
val vbl = rop(g, cb - cblCorr << h) + vbCorr
val vbr = rop(g, cb + 2 << h) - vbCorr
var diff = 0
if (vb < 400 || {
m10 = (vb * 107374183L >> 32).toInt // divide a positive int by 40
val vb40 = m10 * 40
val diff = vbl - vb40
(vb40 - vbr + 40 ^ diff) >= 0 || {
m10 += ~diff >>> 31
e10 += 1
false
}
diff = vbl - vb40
(vb40 - vbr + 40 ^ diff) >= 0
}) {
m10 = vb >> 2
val vb4 = m10 << 2
var diff = vbl - vb4
diff = vbl - vb4
if ((vb4 - vbr + 4 ^ diff) >= 0) diff = (vb & 0x3) + (m10 & 0x1) - 3
m10 += ~diff >>> 31
e10 -= e10Corr
}
} else e10Corr = -1
m10 += ~diff >>> 31
e10 -= e10Corr
}
val ds = digits
val len = digitCount(m10.toLong)
Expand All @@ -2233,9 +2230,8 @@ final class JsonWriter private[jsoniter_scala](
val dotPos = pos + 1
ByteArrayAccess.setInt(buf, pos, 0x30303030)
pos -= e10
val lastPos = writeSignificantFractionDigits(m10, pos + len, pos, buf, ds)
pos = writeSignificantFractionDigits(m10, pos + len, pos, buf, ds)
buf(dotPos) = '.'
pos = lastPos
} else if (e10 < len - 1) {
val lastPos = writeSignificantFractionDigits(m10, pos + len, pos, buf, ds)
val bs = ByteArrayAccess.getLong(buf, pos)
Expand Down Expand Up @@ -2298,6 +2294,7 @@ final class JsonWriter private[jsoniter_scala](
cblCorr = 1
}
e10 = e2 * 315653 - e2Corr >> 20
val gs = JsonWriter.gs
val i = e10 + 324 << 1
val g1 = gs(i)
val g0 = gs(i + 1)
Expand All @@ -2307,23 +2304,20 @@ final class JsonWriter private[jsoniter_scala](
val vb = rop(g1, g0, cb << h)
val vbl = rop(g1, g0, cb - cblCorr << h) + vbCorr
val vbr = rop(g1, g0, cb + 2 << h) - vbCorr
var diff = 0
if (vb < 400 || {
m10 = NativeMath.multiplyHigh(vb, 461168601842738792L) // divide a positive long by 40
val vb40 = m10 * 40
val diff = (vbl - vb40).toInt
((vb40 - vbr).toInt + 40 ^ diff) >= 0 || {
m10 += ~diff >>> 31
e10 += 1
false
}
diff = (vbl - vb40).toInt
((vb40 - vbr).toInt + 40 ^ diff) >= 0
}) {
m10 = vb >> 2
val vb4 = m10 << 2
var diff = (vbl - vb4).toInt
diff = (vbl - vb4).toInt
if (((vb4 - vbr).toInt + 4 ^ diff) >= 0) diff = (vb.toInt & 0x3) + (m10.toInt & 0x1) - 3
m10 += ~diff >>> 31
e10 -= e10Corr
}
} else e10Corr = -1
m10 += ~diff >>> 31
e10 -= e10Corr
}
val ds = digits
val len = digitCount(m10)
Expand All @@ -2350,9 +2344,8 @@ final class JsonWriter private[jsoniter_scala](
val dotPos = pos + 1
ByteArrayAccess.setInt(buf, pos, 0x30303030)
pos -= e10
val lastPos = writeSignificantFractionDigits(m10, pos + len, pos, buf, ds)
pos = writeSignificantFractionDigits(m10, pos + len, pos, buf, ds)
buf(dotPos) = '.'
pos = lastPos
} else if (e10 < len - 1) {
val lastPos = writeSignificantFractionDigits(m10, pos + len, pos, buf, ds)
val bs = ByteArrayAccess.getLong(buf, pos)
Expand Down

0 comments on commit f15a6b8

Please sign in to comment.