summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2019-07-12 16:32:50 -0700
committerElliott Hughes <enh@google.com>2020-01-14 09:57:20 -0800
commitf026d93d15e62bed8c2ae419a91ad9ee40ee7401 (patch)
tree2f67320a3fb750ec709cef7669a0cf0f747a7662
parent763b7acb2983498dfdc0fda3364f12c9be9d560b (diff)
downloadzlib-f026d93d15e62bed8c2ae419a91ad9ee40ee7401.tar.gz
Enable the various chrome zlib optimizations.
This is for arm/arm64 only, because there are test failures for x86/x86-64 that we haven't understood yet. Bug: https://issuetracker.google.com/115695768 Bug: https://issuetracker.google.com/135889247 Bug: http://b/135038583 Test: boots Test: zlib_bench scores 2x or more faster on arm/arm64 Change-Id: I1f991cb71338bc99885edbebc964f2ad3b14234a
-rw-r--r--Android.bp87
1 files changed, 78 insertions, 9 deletions
diff --git a/Android.bp b/Android.bp
index 2937ca3..3e060b0 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1,9 +1,62 @@
+srcs_opt = [
+ "adler32_simd.c",
+ // See https://chromium-review.googlesource.com/749732.
+ "contrib/optimizations/inffast_chunk.c",
+ "contrib/optimizations/inflate.c",
+ "crc32_simd.c",
+]
+
+cflags_arm = [
+ // Since we're building for the platform, we claim to be Linux rather than
+ // Android so we use getauxval() directly instead of the NDK
+ // android_getCpuFeatures which isn't available to us anyway.
+ "-DARMV8_OS_LINUX",
+ // We no longer support non-Neon platform builds.
+ "-DADLER32_SIMD_NEON",
+ "-DINFLATE_CHUNK_SIMD_NEON",
+ // HWCAP_CRC32 is checked at runtime, so it's okay to turn crc32
+ // acceleration on for both 32- and 64-bit.
+ "-DCRC32_ARMV8_CRC32",
+ // Testing with zlib_bench shows -O3 is a win for ARM but a bit of a wash
+ // for x86, so match the BUILD file in only enabling this for ARM.
+ "-O3",
+]
+srcs_arm = [
+ "arm_features.c",
+] + srcs_opt
+
+cflags_x86 = []
+srcs_x86 = ["inflate.c"]
+
+/* TODO: this should work, but fails some tests on cuttlefish.
+cflags_x86 = [
+ // Android's x86/x86-64 ABI includes SSE2 and SSSE3.
+ "-DADLER32_SIMD_SSSE3",
+ "-DINFLATE_CHUNK_SIMD_SSE2",
+ // TODO: ...but the host build system defaults don't match our official ABI.
+ "-mssse3",
+ // PCLMUL isn't in the ABI, but it won't actually be used unless CPUID
+ // reports that the processor really does have the instruction.
+ "-mpclmul",
+ "-DCRC32_SIMD_SSE42_PCLMUL",
+]
+srcs_x86 = [
+ "crc_folding.c",
+ "fill_window_sse.c",
+ "x86.c",
+] + srcs_opt
+*/
+
+// This optimization is applicable to arm64 and x86-64.
+cflags_64 = ["-DINFLATE_CHUNK_READ_64LE"]
+
cc_defaults {
name: "libz_defaults",
cflags: [
- "-O3",
+ // We do support hidden visibility, so turn that on.
"-DHAVE_HIDDEN",
+ // We do support const, so turn that on.
"-DZLIB_CONST",
"-Wall",
"-Werror",
@@ -22,27 +75,35 @@ cc_defaults {
"gzread.c",
"gzwrite.c",
"infback.c",
- "inflate.c",
"inftrees.c",
"inffast.c",
+ "simd_stub.c",
"trees.c",
"uncompr.c",
"zutil.c",
-
- "simd_stub.c",
],
arch: {
arm: {
- // measurements show that the ARM version of ZLib is about x1.17 faster
- // than the thumb one...
- // TODO: re-test with zlib_bench after SIMD is enabled.
- instruction_set: "arm",
-
// TODO: This is to work around b/24465209. Remove after root cause
// is fixed.
pack_relocations: false,
ldflags: ["-Wl,--hash-style=both"],
+
+ cflags: cflags_arm,
+ srcs: srcs_arm,
+ },
+ arm64: {
+ cflags: cflags_arm + cflags_64,
+ srcs: srcs_arm,
+ },
+ x86: {
+ cflags: cflags_x86,
+ srcs: srcs_x86,
+ },
+ x86_64: {
+ cflags: cflags_x86 + cflags_64,
+ srcs: srcs_x86,
},
},
}
@@ -73,6 +134,8 @@ cc_library {
},
}
+// libz_current allows modules building against the NDK to have access to zlib
+// API that's not available from the NDK libz.
cc_library_static {
name: "libz_current",
defaults: ["libz_defaults"],
@@ -93,6 +156,12 @@ cc_binary {
cflags: ["-Wall", "-Werror"],
host_supported: true,
shared_libs: ["libz"],
+ // We build zlib_bench32 and zlib_bench64 so it's easy to test LP32.
+ compile_multilib: "both",
+ multilib: {
+ lib32: { suffix: "32", },
+ lib64: { suffix: "64", },
+ },
}
// This module is defined in development/ndk/Android.bp. Updating these headers