# HG changeset patch # User reimar # Date 1170263773 0 # Node ID b8b844ae593778356f7429e2ce86ba146e8b29d1 # Parent fc9a42d0e848fbe735e0901ad787402a8fb0693e Optimize LZO copy operations diff -r fc9a42d0e848 -r b8b844ae5937 lzo.c --- a/lzo.c Wed Jan 31 11:19:48 2007 +0000 +++ b/lzo.c Wed Jan 31 17:16:13 2007 +0000 @@ -66,6 +66,19 @@ return cnt; } +//#define UNALIGNED_LOADSTORE +#define BUILTIN_MEMCPY +#ifdef UNALIGNED_LOADSTORE +#define COPY2(d, s) *(uint16_t *)(d) = *(uint16_t *)(s); +#define COPY4(d, s) *(uint32_t *)(d) = *(uint32_t *)(s); +#elif defined(BUILTIN_MEMCPY) +#define COPY2(d, s) memcpy(d, s, 2); +#define COPY4(d, s) memcpy(d, s, 4); +#else +#define COPY2(d, s) (d)[0] = (s)[0]; (d)[1] = (s)[1]; +#define COPY4(d, s) (d)[0] = (s)[0]; (d)[1] = (s)[1]; (d)[2] = (s)[2]; (d)[3] = (s)[3]; +#endif + /** * \brief copy bytes from input to output buffer with checking * \param cnt number of bytes to copy, must be > 0 @@ -82,10 +95,7 @@ c->error |= LZO_OUTPUT_FULL; } #if defined(INBUF_PADDED) && defined(OUTBUF_PADDED) - dst[0] = src[0]; - dst[1] = src[1]; - dst[2] = src[2]; - dst[3] = src[3]; + COPY4(dst, src); src += 4; dst += 4; cnt -= 4; @@ -120,22 +130,16 @@ dst += cnt; } else { #ifdef OUTBUF_PADDED - dst[0] = src[0]; - dst[1] = src[1]; - dst[2] = src[2]; - dst[3] = src[3]; + COPY2(dst, src); + COPY2(dst + 2, src + 2); src += 4; dst += 4; cnt -= 4; if (cnt > 0) { - dst[0] = src[0]; - dst[1] = src[1]; - dst[2] = src[2]; - dst[3] = src[3]; - dst[4] = src[4]; - dst[5] = src[5]; - dst[6] = src[6]; - dst[7] = src[7]; + COPY2(dst, src); + COPY2(dst + 2, src + 2); + COPY2(dst + 4, src + 4); + COPY2(dst + 6, src + 6); src += 8; dst += 8; cnt -= 8;