From f026d93d15e62bed8c2ae419a91ad9ee40ee7401 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Fri, 12 Jul 2019 16:32:50 -0700 Subject: 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 --- Android.bp | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file 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 -- cgit v1.2.3