@@ -71,6 +71,30 @@ _hs_text_decode_latin1(uint16_t *dest, const uint8_t const *src,
71 const uint8_t const *srcend)
71 const uint8_t const *srcend)
73 const uint8_t *p = src;
73 const uint8_t *p = src;
75+#if defined(__i386__) || defined(__x86_64__)
76+ /* This optimization works on a little-endian systems by using
77+ (aligned) 32-bit loads instead of 8-bit loads
80+ /* consume unaligned prefix */
81+ while (p != srcend && (uintptr_t)p & 0x3)
84+ /* iterate over 32-bit aligned loads */
85+ while (p < srcend - 3) {
86+ const uint32_t w = *((const uint32_t *)p);
89+ *dest++ = (w >> 8) & 0xff;
90+ *dest++ = (w >> 16) & 0xff;
91+ *dest++ = (w >> 24) & 0xff;
97+ /* handle unaligned suffix */
74 while (p != srcend)
98 while (p != srcend)
75 *dest++ = *p++;
99 *dest++ = *p++;