Neon-optimized version of the GNU symbol calculation
On 64-bit walleye, improves the linker relocation benchmark from 71.9ms to
70.7ms (1.7% of the run-time).
On a 32-bit device, it improves the linker relocation benchmark from
205.5ms to 201.2ms (2.1% of the run-time).
$ adb shell taskset 10 /data/benchmarktest64/linker-benchmarks/linker-benchmarks --benchmark_repetitions=100 --benchmark_display_aggregates_only
--------------------------------------------------------------------
Benchmark Time CPU Iterations
--------------------------------------------------------------------
BM_gnu_hash_simple_mean 15232 ns 15212 ns 100
BM_gnu_hash_simple_median 15176 ns 15159 ns 100
BM_gnu_hash_simple_stddev 111 ns 110 ns 100
BM_gnu_hash_neon_mean 10265 ns 10252 ns 100
BM_gnu_hash_neon_median 10261 ns 10249 ns 100
BM_gnu_hash_neon_stddev 28.1 ns 23.9 ns 100
Bug: none
Test: linker-unit-tests
Test: linker-benchmarks
Change-Id: I3983bca1dddc9241bb70290ad3651d895f046660
diff --git a/linker/Android.bp b/linker/Android.bp
index e67fca8..55a8625 100644
--- a/linker/Android.bp
+++ b/linker/Android.bp
@@ -178,6 +178,7 @@
name: "linker_sources_arm",
srcs: [
"arch/arm/begin.S",
+ "arch/arm_neon/linker_gnu_hash_neon.cpp",
],
}
@@ -186,6 +187,7 @@
srcs: [
"arch/arm64/begin.S",
"arch/arm64/tlsdesc_resolver.S",
+ "arch/arm_neon/linker_gnu_hash_neon.cpp",
],
}
@@ -458,6 +460,7 @@
"linked_list_test.cpp",
"linker_sleb128_test.cpp",
"linker_utils_test.cpp",
+ "linker_gnu_hash_test.cpp",
// Parts of the linker that we're testing.
"linker_block_allocator.cpp",
@@ -472,4 +475,30 @@
"libbase",
"liblog",
],
+
+ arch: {
+ arm: {
+ srcs: ["arch/arm_neon/linker_gnu_hash_neon.cpp"],
+ },
+ arm64: {
+ srcs: ["arch/arm_neon/linker_gnu_hash_neon.cpp"],
+ },
+ },
+}
+
+cc_benchmark {
+ name: "linker-benchmarks",
+
+ srcs: [
+ "linker_gnu_hash_benchmark.cpp",
+ ],
+
+ arch: {
+ arm: {
+ srcs: ["arch/arm_neon/linker_gnu_hash_neon.cpp"],
+ },
+ arm64: {
+ srcs: ["arch/arm_neon/linker_gnu_hash_neon.cpp"],
+ },
+ },
}