diff options
author | Noel Gordon <noel@chromium.org> | 2018-02-07 09:33:01 +0000 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2018-02-07 09:33:01 +0000 |
commit | 4676581bd099757054c3075af4fc5fd315fe164d (patch) | |
tree | ce379f0e70046e4d48ea5c80f560ccb5368b531c /adler32.c | |
parent | e31b50314a69ef0eb461fc988982268146a3a5d7 (diff) | |
download | zlib-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.c | 15 |
1 files changed, 15 insertions, 0 deletions
@@ -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) { |