on master help sign in
encodeUtf8_2: drop parallel range checks

Once I noticed that I'd screwed up the range checking and fixed it, it became slow enough to not be worth it. All test cases are about 10% faster with this extra complexity removed, with the exception of pure Russian, which is about 50% slower.

commitb437bb7ecb46a1d85183ef4e2b68e7b8df062b59 authorBryan O'Sullivan <bos@serpentine.com> dateTue 7 Jan 2014, 23:21 (13 years ago) parent2ca9003
1 file changed+11−34
cbits/cbits.c+11−34
cbits/cbits.c+11−34
@@ -244,28 +244,13 @@ _hs_text_encode_utf8(uint8_t **destp, const uint16_t *src, size_t srcoff,
244244#if defined(__x86_64__)
245245 while (srcend - src >= 4) {
246246 uint64_t w = *((uint64_t *) src);
247− uint16_t a = w & 0xFFFF, b = (w >> 16) & 0xFFFF, c = (w >> 32) & 0xFFFF,
248− d = w >> 48;
249−
250− if ((w & 0xFF80FF80FF80FF80ULL) == 0) {
251− *dest++ = a;
252− *dest++ = b;
253− *dest++ = c;
254− *dest++ = d;
255− }
256− else if (!(w & 0xF800F800F800F800ULL) && (w & 0xFF80000000000000ULL) &&
257− (w & 0x0000FF8000000000ULL) && (w & 0x00000000FF800000ULL) &&
258− (w & 0x000000000000FF80ULL)) {
259− *dest++ = (a >> 6) | 0xC0;
260− *dest++ = (a & 0x3f) | 0x80;
261− *dest++ = (b >> 6) | 0xC0;
262− *dest++ = (b & 0x3f) | 0x80;
263− *dest++ = (c >> 6) | 0xC0;
264− *dest++ = (c & 0x3f) | 0x80;
265− *dest++ = (d >> 6) | 0xC0;
266− *dest++ = (d & 0x3f) | 0x80;
267− }
268− else break;
247+
248+ if (w & 0xFF80FF80FF80FF80ULL)
249+ break;
250+ *dest++ = w & 0xFFFF;
251+ *dest++ = (w >> 16) & 0xFFFF;
252+ *dest++ = (w >> 32) & 0xFFFF;
253+ *dest++ = w >> 48;
269254 src += 4;
270255 }
271256#endif
@@ -273,19 +258,11 @@ _hs_text_encode_utf8(uint8_t **destp, const uint16_t *src, size_t srcoff,
273258#if defined(__i386__)
274259 while (srcend - src >= 2) {
275260 uint32_t w = *((uint32_t *) src);
276− uint16_t a = w & 0xFFFF, b = w >> 16;
277261
278− if ((w & 0xFF80FF80) == 0) {
279− *dest++ = a;
280− *dest++ = b;
281− }
282− else if (!(w & 0xF800F800) && (w & 0xFF800000) && (w & 0x0000FF80)) {
283− *dest++ = (a >> 6) | 0xC0;
284− *dest++ = (a & 0x3f) | 0x80;
285− *dest++ = (b >> 6) | 0xC0;
286− *dest++ = (b & 0x3f) | 0x80;
287− }
288− else break;
262+ if (w & 0xFF80FF80)
263+ break;
264+ *dest++ = w & 0xFFFF;
265+ *dest++ = w >> 16;
289266 src += 2;
290267 }
291268#endif