summaryrefslogtreecommitdiff
path: root/adler32.c
diff options
context:
space:
mode:
authorNoel Gordon <noel@chromium.org>2018-02-07 09:33:01 +0000
committerCommit Bot <commit-bot@chromium.org>2018-02-07 09:33:01 +0000
commit4676581bd099757054c3075af4fc5fd315fe164d (patch)
treece379f0e70046e4d48ea5c80f560ccb5368b531c /adler32.c
parente31b50314a69ef0eb461fc988982268146a3a5d7 (diff)
downloadzlib-4676581bd099757054c3075af4fc5fd315fe164d.tar.gz
Remove x86_check_features() from inflate
adler32 can be freely called like crc32, per the "zlib.h" docs so move the x86 feature check there, which allows us to remove x86_check_features() from zlib inflate. Note inflate() calls adler32(0, Z_NULL, 0); (once only) before using the zlib adler32() routine. A reading from third_party/libpng png.c 2324: /* Now calculate the adler32 if not done already. */ 2327: adler = adler32(0, NULL, 0); 2328: adler = adler32(adler, profile, length); suggests they also conform to the "zlib.h" doc rules about use of the adler32 routine. Bug: 762564 Change-Id: Id84da0eb52bc10edb541a284eab9aef652ba2c72 Reviewed-on: https://chromium-review.googlesource.com/901043 Commit-Queue: Noel Gordon <noel@chromium.org> Reviewed-by: Mike Klein <mtklein@chromium.org> Cr-Original-Commit-Position: refs/heads/master@{#534964} Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src Cr-Mirrored-Commit: c376937e3709ddef4b97621a58039a21b67faa6e
Diffstat (limited to 'adler32.c')
-rw-r--r--adler32.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/adler32.c b/adler32.c
index 03491b9..a42f35f 100644
--- a/adler32.c
+++ b/adler32.c
@@ -98,9 +98,24 @@ uLong ZEXPORT adler32_z(adler, buf, len)
return adler | (sum2 << 16);
}
+#if defined(ADLER32_SIMD_SSSE3)
+ /*
+ * Use SSSE3 to compute the adler32. Since this routine can be
+ * freely used, check CPU features here. zlib convention is to
+ * call adler32(0, NULL, 0), before making calls to adler32().
+ * So this is a good early (and infrequent) place to cache CPU
+ * features for those later, more interesting adler32() calls.
+ */
+ if (buf == Z_NULL) {
+ if (!len) /* Assume user is calling adler32(0, NULL, 0); */
+ x86_check_features();
+ return 1L;
+ }
+#else
/* initial Adler-32 value (deferred check for len == 1 speed) */
if (buf == Z_NULL)
return 1L;
+#endif
/* in case short lengths are provided, keep it somewhat fast */
if (len < 16) {