]> git.ipfire.org Git - thirdparty/zlib-ng.git/commitdiff
Add preprocessor define to tune Adler32 loop unrolling.
authorJim Kukunas <james.t.kukunas@linux.intel.com>
Wed, 17 Jul 2013 17:34:56 +0000 (10:34 -0700)
committerJim Kukunas <james.t.kukunas@linux.intel.com>
Fri, 17 Jan 2014 21:12:47 +0000 (13:12 -0800)
Excessive loop unrolling is detrimental to performance. This patch
adds a preprocessor define, ADLER32_UNROLL_LESS, to reduce unrolling
factor from 16 to 8.

Updates configure script to set as default on x86

adler32.c
configure

index a868f073d8a0e35dcb3ec812b41b1d3f0acdd84d..1007e38aff535b2171889b6d3d11b9647f9e013e 100644 (file)
--- a/adler32.c
+++ b/adler32.c
@@ -104,10 +104,19 @@ uLong ZEXPORT adler32(adler, buf, len)
     /* do length NMAX blocks -- requires just one modulo operation */
     while (len >= NMAX) {
         len -= NMAX;
+#ifndef ADLER32_UNROLL_LESS
         n = NMAX / 16;          /* NMAX is divisible by 16 */
+#else
+        n = NMAX / 8;           /* NMAX is divisible by 8 */
+#endif
         do {
+#ifndef ADLER32_UNROLL_LESS
             DO16(buf);          /* 16 sums unrolled */
             buf += 16;
+#else
+            DO8(buf,0);         /* 8 sums unrolled */
+            buf += 8;
+#endif
         } while (--n);
         MOD(adler);
         MOD(sum2);
@@ -115,10 +124,17 @@ uLong ZEXPORT adler32(adler, buf, len)
 
     /* do remaining bytes (less than NMAX, still just one modulo) */
     if (len) {                  /* avoid modulos if none remaining */
+#ifndef ADLER32_UNROLL_LESS
         while (len >= 16) {
             len -= 16;
             DO16(buf);
             buf += 16;
+#else
+        while (len >= 8) {
+            len -= 8;
+            DO8(buf, 0);
+            buf += 8;
+#endif
         }
         while (len--) {
             adler += *buf++;
index b1c5a7eb6eaf930fbca2985e17f1e1270101db16..d6f790bae72eafea52068597830a38f16bfaf3c5 100755 (executable)
--- a/configure
+++ b/configure
@@ -771,6 +771,9 @@ case "${ARCH}" in
 
         CFLAGS="${CFLAGS} -DUNALIGNED_OK"
         SFLAGS="${SFLAGS} -DUNALIGNED_OK"
+
+        CFLAGS="${CFLAGS} -DADLER32_UNROLL_LESS"
+        SFLAGS="${SFLAGS} -DADLER32_UNROLL_LESS"
     ;;
     i386 | i486 | i586 | i686)
         OBJC="${OBJC} x86.o"
@@ -781,6 +784,9 @@ case "${ARCH}" in
 
         CFLAGS="${CFLAGS} -DUNALIGNED_OK"
         SFLAGS="${SFLAGS} -DUNALIGNED_OK"
+
+        CFLAGS="${CFLAGS} -DADLER32_UNROLL_LESS"
+        SFLAGS="${SFLAGS} -DADLER32_UNROLL_LESS"
     ;;
 esac