Optimize libc for generic armv7/armv8 neon cores
If (2nd) arch is "arm", (2nd) arch variant is "armv7-a-neon" or
"armv8-a", and (2nd) cpu variant is "generic", current Android.bp only
uses generic ARM assmebly or C code, even though they all have NEON.
This change use functions optimized for cortex-a15 (for these generic
cores), which are a reasonable balance for most ARM cores with Neon.
Also build script for specific armv7/armv8 cores are refactored to
take advantage of the common part (mostly cortex-a15 code), so more
than 150 repeated lines are removed.
Bug: 66064745
Test: For armv7-a-neon/armv8-a "generic" core
- boot with GSI on sailfish
- related cortex-a15 function are built and linked.
All libc.a/libc.so built are identical for the following cores:
- cortex-a7, cortex-a8, cortex-a9, cortex-a15, krait
- cortex-a53, cortex-a53.a57, cortex-a73, denver, kryo
$ lunch aosp_arm64 # with TARGET_2ND_CPU_VARIANT unset
# For each $core listed above
$ TARGET_2ND_CPU_VARIANT=$core m -e -j libc
Change-Id: Ia565d3ea09e034adcd014e7467a5b791cff908cb
diff --git a/libc/Android.bp b/libc/Android.bp
index d126f2f..dd4f33f 100644
--- a/libc/Android.bp
+++ b/libc/Android.bp
@@ -581,70 +581,7 @@
exclude_srcs: [
"upstream-openbsd/lib/libc/string/strcpy.c",
],
- cortex_a7: {
- exclude_srcs: [
- "upstream-openbsd/lib/libc/string/memmove.c",
- "upstream-openbsd/lib/libc/string/stpcpy.c",
- "upstream-openbsd/lib/libc/string/strcat.c",
- ],
- },
- cortex_a53: {
- exclude_srcs: [
- "upstream-openbsd/lib/libc/string/memmove.c",
- "upstream-openbsd/lib/libc/string/stpcpy.c",
- "upstream-openbsd/lib/libc/string/strcat.c",
- ],
- },
- cortex_a53_a57: {
- exclude_srcs: [
- "upstream-openbsd/lib/libc/string/memmove.c",
- "upstream-openbsd/lib/libc/string/stpcpy.c",
- "upstream-openbsd/lib/libc/string/strcat.c",
- ],
- },
- cortex_a8: {
- exclude_srcs: [
- "upstream-openbsd/lib/libc/string/memmove.c",
- "upstream-openbsd/lib/libc/string/stpcpy.c",
- "upstream-openbsd/lib/libc/string/strcat.c",
- ],
- },
- cortex_a9: {
- exclude_srcs: [
- "upstream-openbsd/lib/libc/string/memmove.c",
- "upstream-openbsd/lib/libc/string/stpcpy.c",
- "upstream-openbsd/lib/libc/string/strcat.c",
- ],
- },
- cortex_a15: {
- exclude_srcs: [
- "upstream-openbsd/lib/libc/string/memmove.c",
- "upstream-openbsd/lib/libc/string/stpcpy.c",
- "upstream-openbsd/lib/libc/string/strcat.c",
- ],
- },
- cortex_a73: {
- exclude_srcs: [
- "upstream-openbsd/lib/libc/string/memmove.c",
- "upstream-openbsd/lib/libc/string/stpcpy.c",
- "upstream-openbsd/lib/libc/string/strcat.c",
- ],
- },
- denver: {
- exclude_srcs: [
- "upstream-openbsd/lib/libc/string/memmove.c",
- "upstream-openbsd/lib/libc/string/stpcpy.c",
- "upstream-openbsd/lib/libc/string/strcat.c",
- ],
- },
- krait: {
- exclude_srcs: [
- "upstream-openbsd/lib/libc/string/memmove.c",
- "upstream-openbsd/lib/libc/string/stpcpy.c",
- "upstream-openbsd/lib/libc/string/strcat.c",
- ],
- },
- kryo: {
+ neon: {
exclude_srcs: [
"upstream-openbsd/lib/libc/string/memmove.c",
"upstream-openbsd/lib/libc/string/stpcpy.c",
@@ -799,74 +736,81 @@
srcs: [
"arch-arm/generic/bionic/__memcpy_chk.S",
],
- cortex_a7: {
- cflags: ["-DNO___STRCAT_CHK", "-DNO___STRCPY_CHK"],
- srcs: [
- "arch-arm/cortex-a7/bionic/__strcat_chk.S",
- "arch-arm/cortex-a7/bionic/__strcpy_chk.S",
- ],
- },
- cortex_a53: {
- cflags: ["-DNO___STRCAT_CHK", "-DNO___STRCPY_CHK"],
- srcs: [
- "arch-arm/cortex-a53/bionic/__strcat_chk.S",
- "arch-arm/cortex-a53/bionic/__strcpy_chk.S",
- ],
- },
- cortex_a53_a57: {
+ neon: {
cflags: ["-DNO___STRCAT_CHK", "-DNO___STRCPY_CHK"],
srcs: [
"arch-arm/cortex-a15/bionic/__strcat_chk.S",
"arch-arm/cortex-a15/bionic/__strcpy_chk.S",
],
},
- cortex_a8: {
- cflags: ["-DNO___STRCAT_CHK", "-DNO___STRCPY_CHK"],
+ cortex_a7: {
srcs: [
+ "arch-arm/cortex-a7/bionic/__strcat_chk.S",
+ "arch-arm/cortex-a7/bionic/__strcpy_chk.S",
+ ],
+ exclude_srcs: [
"arch-arm/cortex-a15/bionic/__strcat_chk.S",
"arch-arm/cortex-a15/bionic/__strcpy_chk.S",
],
},
cortex_a9: {
- cflags: ["-DNO___STRCAT_CHK", "-DNO___STRCPY_CHK"],
srcs: [
"arch-arm/cortex-a9/bionic/__strcat_chk.S",
"arch-arm/cortex-a9/bionic/__strcpy_chk.S",
],
+ exclude_srcs: [
+ "arch-arm/cortex-a15/bionic/__strcat_chk.S",
+ "arch-arm/cortex-a15/bionic/__strcpy_chk.S",
+ ],
},
- cortex_a15: {
- cflags: ["-DNO___STRCAT_CHK", "-DNO___STRCPY_CHK"],
+ krait: {
srcs: [
+ "arch-arm/krait/bionic/__strcat_chk.S",
+ "arch-arm/krait/bionic/__strcpy_chk.S",
+ ],
+ exclude_srcs: [
+ "arch-arm/cortex-a15/bionic/__strcat_chk.S",
+ "arch-arm/cortex-a15/bionic/__strcpy_chk.S",
+ ],
+ },
+ cortex_a53: {
+ srcs: [
+ "arch-arm/cortex-a53/bionic/__strcat_chk.S",
+ "arch-arm/cortex-a53/bionic/__strcpy_chk.S",
+ ],
+ exclude_srcs: [
"arch-arm/cortex-a15/bionic/__strcat_chk.S",
"arch-arm/cortex-a15/bionic/__strcpy_chk.S",
],
},
cortex_a73: {
- cflags: ["-DNO___STRCAT_CHK", "-DNO___STRCPY_CHK"],
srcs: [
"arch-arm/denver/bionic/__strcat_chk.S",
"arch-arm/denver/bionic/__strcpy_chk.S",
],
+ exclude_srcs: [
+ "arch-arm/cortex-a15/bionic/__strcat_chk.S",
+ "arch-arm/cortex-a15/bionic/__strcpy_chk.S",
+ ],
},
denver: {
- cflags: ["-DNO___STRCAT_CHK", "-DNO___STRCPY_CHK"],
srcs: [
"arch-arm/denver/bionic/__strcat_chk.S",
"arch-arm/denver/bionic/__strcpy_chk.S",
],
+ exclude_srcs: [
+ "arch-arm/cortex-a15/bionic/__strcat_chk.S",
+ "arch-arm/cortex-a15/bionic/__strcpy_chk.S",
+ ],
},
- krait: {
- cflags: ["-DNO___STRCAT_CHK", "-DNO___STRCPY_CHK"],
+ kryo: {
srcs: [
"arch-arm/krait/bionic/__strcat_chk.S",
"arch-arm/krait/bionic/__strcpy_chk.S",
],
- },
- kryo: {
- cflags: ["-DNO___STRCAT_CHK", "-DNO___STRCPY_CHK"],
- srcs: [
- "arch-arm/krait/bionic/__strcat_chk.S",
- "arch-arm/krait/bionic/__strcpy_chk.S",
+ exclude_srcs: [
+ "arch-arm/cortex-a15/bionic/__strcat_chk.S",
+ "arch-arm/cortex-a15/bionic/__strcpy_chk.S",
],
},
},
@@ -937,199 +881,104 @@
srcs: [
"arch-arm/cortex-a7/bionic/memset.S",
"arch-arm/cortex-a7/bionic/memcpy.S",
-
- "arch-arm/cortex-a15/bionic/stpcpy.S",
- "arch-arm/cortex-a15/bionic/strcat.S",
- "arch-arm/cortex-a15/bionic/strcmp.S",
- "arch-arm/cortex-a15/bionic/strcpy.S",
- "arch-arm/cortex-a15/bionic/strlen.S",
-
- "arch-arm/denver/bionic/memmove.S",
],
exclude_srcs: [
- "arch-arm/generic/bionic/memcpy.S",
- "arch-arm/generic/bionic/memset.S",
- "arch-arm/generic/bionic/strcmp.S",
- "arch-arm/generic/bionic/strcpy.S",
- "arch-arm/generic/bionic/strlen.c",
- ],
- },
- cortex_a53: {
- srcs: [
- "arch-arm/cortex-a53/bionic/memcpy.S",
-
- "arch-arm/cortex-a7/bionic/memset.S",
-
- "arch-arm/cortex-a15/bionic/stpcpy.S",
- "arch-arm/cortex-a15/bionic/strcat.S",
- "arch-arm/cortex-a15/bionic/strcmp.S",
- "arch-arm/cortex-a15/bionic/strcpy.S",
- "arch-arm/cortex-a15/bionic/strlen.S",
-
- "arch-arm/denver/bionic/memmove.S",
- ],
- exclude_srcs: [
- "arch-arm/generic/bionic/memcpy.S",
- "arch-arm/generic/bionic/memset.S",
- "arch-arm/generic/bionic/strcmp.S",
- "arch-arm/generic/bionic/strcpy.S",
- "arch-arm/generic/bionic/strlen.c",
- ],
- },
- cortex_a53_a57: {
- srcs: [
"arch-arm/cortex-a15/bionic/memcpy.S",
"arch-arm/cortex-a15/bionic/memset.S",
- "arch-arm/cortex-a15/bionic/stpcpy.S",
- "arch-arm/cortex-a15/bionic/strcat.S",
- "arch-arm/cortex-a15/bionic/strcmp.S",
- "arch-arm/cortex-a15/bionic/strcpy.S",
- "arch-arm/cortex-a15/bionic/strlen.S",
-
- "arch-arm/denver/bionic/memmove.S",
- ],
- exclude_srcs: [
- "arch-arm/generic/bionic/memcpy.S",
- "arch-arm/generic/bionic/memset.S",
- "arch-arm/generic/bionic/strcmp.S",
- "arch-arm/generic/bionic/strcpy.S",
- "arch-arm/generic/bionic/strlen.c",
- ],
- },
- cortex_a8: {
- srcs: [
- "arch-arm/cortex-a15/bionic/memcpy.S",
- "arch-arm/cortex-a15/bionic/memset.S",
- "arch-arm/cortex-a15/bionic/stpcpy.S",
- "arch-arm/cortex-a15/bionic/strcat.S",
- "arch-arm/cortex-a15/bionic/strcmp.S",
- "arch-arm/cortex-a15/bionic/strcpy.S",
- "arch-arm/cortex-a15/bionic/strlen.S",
-
- "arch-arm/denver/bionic/memmove.S",
- ],
- exclude_srcs: [
- "arch-arm/generic/bionic/memcpy.S",
- "arch-arm/generic/bionic/memset.S",
- "arch-arm/generic/bionic/strcmp.S",
- "arch-arm/generic/bionic/strcpy.S",
- "arch-arm/generic/bionic/strlen.c",
],
},
cortex_a9: {
srcs: [
"arch-arm/cortex-a9/bionic/memcpy.S",
"arch-arm/cortex-a9/bionic/memset.S",
+
"arch-arm/cortex-a9/bionic/stpcpy.S",
"arch-arm/cortex-a9/bionic/strcat.S",
"arch-arm/cortex-a9/bionic/strcmp.S",
"arch-arm/cortex-a9/bionic/strcpy.S",
"arch-arm/cortex-a9/bionic/strlen.S",
-
- "arch-arm/denver/bionic/memmove.S",
],
exclude_srcs: [
- "arch-arm/generic/bionic/memcpy.S",
- "arch-arm/generic/bionic/memset.S",
- "arch-arm/generic/bionic/strcmp.S",
- "arch-arm/generic/bionic/strcpy.S",
- "arch-arm/generic/bionic/strlen.c",
- ],
- },
- cortex_a15: {
- srcs: [
- "arch-arm/cortex-a15/bionic/memcpy.S",
"arch-arm/cortex-a15/bionic/memset.S",
+ "arch-arm/cortex-a15/bionic/memcpy.S",
+
"arch-arm/cortex-a15/bionic/stpcpy.S",
"arch-arm/cortex-a15/bionic/strcat.S",
"arch-arm/cortex-a15/bionic/strcmp.S",
"arch-arm/cortex-a15/bionic/strcpy.S",
"arch-arm/cortex-a15/bionic/strlen.S",
-
- "arch-arm/denver/bionic/memmove.S",
- ],
- exclude_srcs: [
- "arch-arm/generic/bionic/memcpy.S",
- "arch-arm/generic/bionic/memset.S",
- "arch-arm/generic/bionic/strcmp.S",
- "arch-arm/generic/bionic/strcpy.S",
- "arch-arm/generic/bionic/strlen.c",
- ],
- },
- cortex_a73: {
- srcs: [
- "arch-arm/cortex-a7/bionic/memset.S",
-
- "arch-arm/denver/bionic/memcpy.S",
- "arch-arm/denver/bionic/memmove.S",
-
- "arch-arm/krait/bionic/strcmp.S",
-
- "arch-arm/cortex-a15/bionic/stpcpy.S",
- "arch-arm/cortex-a15/bionic/strcat.S",
- "arch-arm/cortex-a15/bionic/strcpy.S",
- "arch-arm/cortex-a15/bionic/strlen.S",
- ],
- exclude_srcs: [
- "arch-arm/generic/bionic/memcpy.S",
- "arch-arm/generic/bionic/memset.S",
- "arch-arm/generic/bionic/strcmp.S",
- "arch-arm/generic/bionic/strcpy.S",
- "arch-arm/generic/bionic/strlen.c",
- ],
- },
- denver: {
- srcs: [
- "arch-arm/denver/bionic/memcpy.S",
- "arch-arm/denver/bionic/memmove.S",
- "arch-arm/denver/bionic/memset.S",
-
- // Use cortex-a15 versions of strcat/strcpy/strlen.
- "arch-arm/cortex-a15/bionic/stpcpy.S",
- "arch-arm/cortex-a15/bionic/strcat.S",
- "arch-arm/cortex-a15/bionic/strcmp.S",
- "arch-arm/cortex-a15/bionic/strcpy.S",
- "arch-arm/cortex-a15/bionic/strlen.S",
- ],
- exclude_srcs: [
- "arch-arm/generic/bionic/memcpy.S",
- "arch-arm/generic/bionic/memset.S",
- "arch-arm/generic/bionic/strcmp.S",
- "arch-arm/generic/bionic/strcpy.S",
- "arch-arm/generic/bionic/strlen.c",
],
},
krait: {
srcs: [
"arch-arm/krait/bionic/memcpy.S",
"arch-arm/krait/bionic/memset.S",
+
"arch-arm/krait/bionic/strcmp.S",
-
- // Use cortex-a15 versions of strcat/strcpy/strlen.
- "arch-arm/cortex-a15/bionic/stpcpy.S",
- "arch-arm/cortex-a15/bionic/strcat.S",
- "arch-arm/cortex-a15/bionic/strcpy.S",
- "arch-arm/cortex-a15/bionic/strlen.S",
-
- "arch-arm/denver/bionic/memmove.S",
],
exclude_srcs: [
- "arch-arm/generic/bionic/memcpy.S",
- "arch-arm/generic/bionic/memset.S",
- "arch-arm/generic/bionic/strcmp.S",
- "arch-arm/generic/bionic/strcpy.S",
- "arch-arm/generic/bionic/strlen.c",
+ "arch-arm/cortex-a15/bionic/memset.S",
+ "arch-arm/cortex-a15/bionic/memcpy.S",
+
+ "arch-arm/cortex-a15/bionic/strcmp.S",
+ ],
+ },
+ cortex_a53: {
+ srcs: [
+ "arch-arm/cortex-a53/bionic/memcpy.S",
+ "arch-arm/cortex-a7/bionic/memset.S",
+ ],
+ exclude_srcs: [
+ "arch-arm/cortex-a15/bionic/memset.S",
+ "arch-arm/cortex-a15/bionic/memcpy.S",
+ ],
+ },
+ cortex_a73: {
+ srcs: [
+ "arch-arm/cortex-a7/bionic/memset.S",
+ "arch-arm/denver/bionic/memcpy.S",
+
+ "arch-arm/krait/bionic/strcmp.S",
+ ],
+ exclude_srcs: [
+ "arch-arm/cortex-a15/bionic/memset.S",
+ "arch-arm/cortex-a15/bionic/memcpy.S",
+ "arch-arm/cortex-a15/bionic/strcmp.S",
+ ],
+ },
+ denver: {
+ srcs: [
+ "arch-arm/denver/bionic/memcpy.S",
+ "arch-arm/denver/bionic/memset.S",
+ ],
+ exclude_srcs: [
+ "arch-arm/cortex-a15/bionic/memset.S",
+ "arch-arm/cortex-a15/bionic/memcpy.S",
],
},
kryo: {
srcs: [
"arch-arm/kryo/bionic/memcpy.S",
"arch-arm/cortex-a7/bionic/memset.S",
- "arch-arm/krait/bionic/strcmp.S",
- // Use cortex-a15 versions of strcat/strcpy/strlen.
+ "arch-arm/krait/bionic/strcmp.S",
+ ],
+ exclude_srcs: [
+ "arch-arm/cortex-a15/bionic/memset.S",
+ "arch-arm/cortex-a15/bionic/memcpy.S",
+ "arch-arm/cortex-a15/bionic/strcmp.S",
+ ],
+ },
+ // Cores not listed above (like cortex-a8, cortex-a15) or
+ // "generic" core will use the following implementation.
+ neon: {
+ srcs: [
+ "arch-arm/cortex-a15/bionic/memcpy.S",
+ "arch-arm/cortex-a15/bionic/memset.S",
+
"arch-arm/cortex-a15/bionic/stpcpy.S",
"arch-arm/cortex-a15/bionic/strcat.S",
+ "arch-arm/cortex-a15/bionic/strcmp.S",
"arch-arm/cortex-a15/bionic/strcpy.S",
"arch-arm/cortex-a15/bionic/strlen.S",
@@ -1927,7 +1776,7 @@
],
name: "libstdc++",
system_shared_libs: ["libc"],
- static_libs: ["libasync_safe"],
+ static_libs: ["libasync_safe"],
//TODO (dimitry): This is to work around b/24465209. Remove after root cause is fixed
arch: {