[zlib][asop] Complete USE_ZLIB_RABIN_KARP_ROLLING_HASH feature

If USE_ZLIB_RABIN_KARP_ROLLING_HASH build-time option is defined, use
the Rabin-Karp hash. This disables CRC SIMD hashing on ARM and Intel,
which will degrade compression speed.

However, the compressed output matches canonical zlib output, for the
same input, and that should resolve ASOP OTA issue 1316541.

To ensure the Rabin-Karp hash is used correctly in chromium zlib, the
first step is to go back to using canonical fill_window(). To do this
combine the ARM NEON and Intel SSE2 slide_hash() routines in a common
framework called slide_hash_simd(). Remove fill_window_sse.c and undo
deflate_read_buf() rename: name it back to canonical read_buf().

Change insert_string(): by default it uses CRC32C hashes on all ports
(ARM, Intel) so add code comments to state that. If Rabin-Karp hashes
are enabled, disable CRC32C hashes.

Add a new deflate internal state variable chromium_zlib_hash, used to
detect which type of hashing is enabled (Rabin-Karp, CRC32C). Set the
state variable in deflateInit2_ after cpu_check_features() detection,
with #ifdef guards matching the #ifdef logic of insert_string().

Change canonical fill_window() to insert hashes into {hash,prev} hash
chains based on hash type (Rabin-Karp, CRC32C). Prior to this change,
the ARM port was inserting Rabin-Karp hashes into hash chains even if
CRC32 hashing was active when s->insert was > 0.

Change longest_match() and deflate_fast(): update them to use the new
deflate state variable chromium_zlib_hash.

Compression performance degrades when Rabin-Karp hashing is used, but
is unchanged when CRC32C hashing is enabled (chromium zlib default).

Compat: if Rabin-Karp hashing is enabled, zlib-bench --check built as normal and against canonical zlib 1.2.11, produce the same compressed output for the snappy corpora for gzip,zlib,raw types and compression levels 1..9.

Bug: 1316541
Change-Id: I0d5ee6240f0b7eac4653d60a29d459d994c3871f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3596671
Reviewed-by: Chris Blume <cblume@chromium.org>
Commit-Queue: Noel Gordon <noel@chromium.org>
Reviewed-by: Adenilson Cavalcanti <cavalcantii@chromium.org>
Cr-Commit-Position: refs/heads/main@{#998062}
7 files changed
tree: e788d7b1e9b7b99d1ae7b6bb3a99c31a9a2f8cbf
  1. android_webview/
  2. apps/
  3. ash/
  4. base/
  5. build/
  6. build_overrides/
  7. buildtools/
  8. cc/
  9. chrome/
  10. chromecast/
  11. chromeos/
  12. codelabs/
  13. components/
  14. content/
  15. courgette/
  16. crypto/
  17. dbus/
  18. device/
  19. docs/
  20. extensions/
  21. fuchsia/
  22. gin/
  23. google_apis/
  24. google_update/
  25. gpu/
  26. headless/
  27. infra/
  28. ios/
  29. ipc/
  30. media/
  31. mojo/
  32. native_client_sdk/
  33. net/
  34. pdf/
  35. ppapi/
  36. printing/
  37. remoting/
  38. rlz/
  39. sandbox/
  40. services/
  41. skia/
  42. sql/
  43. storage/
  44. styleguide/
  45. testing/
  46. third_party/
  47. tools/
  48. ui/
  49. url/
  50. weblayer/
  51. .clang-format
  52. .clang-tidy
  53. .eslintrc.js
  54. .git-blame-ignore-revs
  55. .gitattributes
  56. .gitignore
  57. .gn
  58. .mailmap
  59. .rustfmt.toml
  60. .vpython
  61. .vpython3
  62. .yapfignore
  63. AUTHORS
  64. BUILD.gn
  65. CODE_OF_CONDUCT.md
  66. codereview.settings
  67. DEPS
  68. DIR_METADATA
  69. ENG_REVIEW_OWNERS
  70. LICENSE
  71. LICENSE.chromium_os
  72. OWNERS
  73. PRESUBMIT.py
  74. PRESUBMIT_test.py
  75. PRESUBMIT_test_mocks.py
  76. README.md
  77. WATCHLISTS
README.md

Logo Chromium

Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.

The project's web site is https://www.chromium.org.

To check out the source code locally, don't use git clone! Instead, follow the instructions on how to get the code.

Documentation in the source is rooted in docs/README.md.

Learn how to Get Around the Chromium Source Code Directory Structure .

For historical reasons, there are some small top level directories. Now the guidance is that new top level directories are for product (e.g. Chrome, Android WebView, Ash). Even if these products have multiple executables, the code should be in subdirectories of the product.

If you found a bug, please file it at https://crbug.com/new.