Merge "Reland (again) "Enable the various chrome zlib optimizations.""
diff --git a/Android.bp b/Android.bp
index c665c49..940e2a8 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1,9 +1,63 @@
+srcs_opt = [
+ "adler32_simd.c",
+ // See https://chromium-review.googlesource.com/749732.
+// TODO: causes `atest org.apache.harmony.tests.java.util.zip.DeflaterTest` failures.
+// "contrib/optimizations/inffast_chunk.c",
+// "contrib/optimizations/inflate.c",
+ // This file doesn't build for non-neon, so it can't be in the main srcs.
+ "cpu_features.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",
+ // 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",
+]
+cflags_arm_neon = [
+ // We no longer support non-Neon platform builds, but the NDK just has one libz.
+ "-DADLER32_SIMD_NEON",
+// TODO: causes `atest org.apache.harmony.tests.java.util.zip.DeflaterTest` failures.
+// "-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",
+]
+cflags_arm64 = cflags_arm + cflags_arm_neon
+
+cflags_x86 = [
+ // See ARMV8_OS_LINUX above.
+ "-DX86_NOT_WINDOWS",
+ // Android's x86/x86-64 ABI includes SSE2 and SSSE3.
+ "-DADLER32_SIMD_SSSE3",
+// TODO: see arm above.
+// "-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",
+] + 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",
@@ -15,7 +69,6 @@
srcs: [
"adler32.c",
"compress.c",
- "cpu_features.c",
"crc32.c",
"deflate.c",
"gzclose.c",
@@ -23,9 +76,9 @@
"gzread.c",
"gzwrite.c",
"infback.c",
+ "inffast.c",
"inflate.c",
"inftrees.c",
- "inffast.c",
"trees.c",
"uncompr.c",
"zutil.c",
@@ -33,15 +86,28 @@
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,
+ neon: {
+ cflags: cflags_arm_neon,
+ srcs: srcs_opt,
+ }
+ },
+ arm64: {
+ cflags: cflags_arm64 + cflags_64,
+ srcs: srcs_opt,
+ },
+ x86: {
+ cflags: cflags_x86,
+ srcs: srcs_x86,
+ },
+ x86_64: {
+ cflags: cflags_x86 + cflags_64,
+ srcs: srcs_x86,
},
},
}
@@ -73,6 +139,8 @@
},
}
+// 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 +161,12 @@
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