]> git.saurik.com Git - apple/xnu.git/blobdiff - libkern/zlib/adler32.c
xnu-1699.22.73.tar.gz
[apple/xnu.git] / libkern / zlib / adler32.c
index bf0d9723ac2e275dee4a669d6b521b33184c6049..00214cd2e351f19131c2286132a64575a833edd6 100644 (file)
@@ -32,8 +32,6 @@
 
 /* @(#) $Id$ */
 
-#include <stdint.h> // For uintptr_t.
-
 
 #define ZLIB_INTERNAL
 #if KERNEL
@@ -42,8 +40,9 @@
     #include "zlib.h"
 #endif /* KERNEL */
 
-#if defined _ARM_ARCH_6
-       extern uLong adler32_vec(uLong adler, uLong sum2, const Bytef *buf, uInt len);
+#if defined __x86_64__ || defined __i386__ || defined _ARM_ARCH_6
+#include <stdint.h> // For uintptr_t.
+    extern uLong adler32_vec(uLong adler, uLong sum2, const Bytef *buf, uInt len);
 #endif
 
 #define BASE 65521UL    /* largest prime smaller than 65536 */
@@ -98,9 +97,7 @@ uLong ZEXPORT adler32(adler, buf, len)
     uInt len;
 {
     unsigned long sum2;
-#if !defined _ARM_ARCH_6
     unsigned n;
-#endif
 
     /* split Adler-32 into component sums */
     sum2 = (adler >> 16) & 0xffff;
@@ -133,8 +130,10 @@ uLong ZEXPORT adler32(adler, buf, len)
         return adler | (sum2 << 16);
     }
 
-#if defined _ARM_ARCH_6
-    /* align buf to 16-byte boundary */
+#if defined __x86_64__ || defined __i386__ || defined _ARM_ARCH_6
+
+       if (len>=32000) {       /* use vector code only if len is sufficiently large to compensate registers save/restore */
+       /* align buf to 16-byte boundary */
     while (((uintptr_t)buf)&15) { /* not on a 16-byte boundary */
         len--;
         adler += *buf++;
@@ -143,9 +142,10 @@ uLong ZEXPORT adler32(adler, buf, len)
         MOD4(sum2);             /* only added so many BASE's */
     }
 
-    return adler32_vec(adler, sum2, buf, len);      // armv7 neon vectorized implementation
+    return adler32_vec(adler, sum2, buf, len);      // x86_64 or i386 (up to SSE3) or armv6 or up
+       }
 
-#else   //  _ARM_ARCH_6
+#endif // defined __x86_64__ || defined __i386__ || defined _ARM_ARCH_6
 
     /* do length NMAX blocks -- requires just one modulo operation */
     while (len >= NMAX) {
@@ -176,8 +176,6 @@ uLong ZEXPORT adler32(adler, buf, len)
 
     /* return recombined sums */
     return adler | (sum2 << 16);
-
-#endif  // _ARM_ARCH_6
 }
 
 /* ========================================================================= */