on master help sign in
encodeUtf8: squeeze out a little more fast path performance

If we're about to drop from the fast to the slow path, try to cut our losses by pushing out a few more bytes before we give up.

commit12677f25326dce692f702e4dc95e88b80b5bf960 authorBryan O'Sullivan <bos@serpentine.com> dateThu 9 Jan 2014, 15:13 (13 years ago) parentdf38ae8
1 file changed+14−1
cbits/cbits.c+14−1
cbits/cbits.c+14−1
@@ -245,8 +245,21 @@ _hs_text_encode_utf8(uint8_t **destp, const uint16_t *src, size_t srcoff,
245245 while (srcend - src >= 4) {
246246 uint64_t w = *((uint64_t *) src);
247247
248− if (w & 0xFF80FF80FF80FF80ULL)
248+ if (w & 0xFF80FF80FF80FF80ULL) {
249+ if (!(w & 0x000000000000FF80ULL)) {
250+ *dest++ = w & 0xFFFF;
251+ src++;
252+ if (!(w & 0x00000000FF800000ULL)) {
253+ *dest++ = (w >> 16) & 0xFFFF;
254+ src++;
255+ if (!(w & 0x0000FF8000000000ULL)) {
256+ *dest++ = (w >> 32) & 0xFFFF;
257+ src++;
258+ }
259+ }
260+ }
249261 break;
262+ }
250263 *dest++ = w & 0xFFFF;
251264 *dest++ = (w >> 16) & 0xFFFF;
252265 *dest++ = (w >> 32) & 0xFFFF;