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"],
+        },
+    },
 }