Julius Werner submitted this change.

View Change



2 is the latest approved patch-set.
No files were changed between the latest approved patch-set and the submitted one.

Approvals: build bot (Jenkins): Verified Arthur Heymans: Looks good to me, approved Yidi Lin: Looks good to me, approved
commonlib: Add assembly optimization for ipchksum() on arm64

This patch adds a bit of optimized assembly code to the ipchksum()
algorithm for arm64 targets in order to take advantage of larger load
sizes and the add-with-carry instruction. This improves execution speed
on a Cortex-A75 by more than 20x.

Change-Id: I9c7bbc9d7a1cd083ced62fe9222592243a796077
Signed-off-by: Julius Werner <jwerner@chromium.org>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/80254
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
Reviewed-by: Yidi Lin <yidilin@google.com>
---
M src/commonlib/bsd/ipchksum.c
1 file changed, 25 insertions(+), 0 deletions(-)

diff --git a/src/commonlib/bsd/ipchksum.c b/src/commonlib/bsd/ipchksum.c
index a40b86c..89d261f 100644
--- a/src/commonlib/bsd/ipchksum.c
+++ b/src/commonlib/bsd/ipchksum.c
@@ -11,6 +11,31 @@
uint32_t sum = 0;
size_t i = 0;

+#if defined(__aarch64__)
+ size_t size16 = size / 16;
+ const uint64_t *p8 = data;
+ if (size16) {
+ unsigned long tmp1, tmp2;
+ i = size16 * 16;
+ asm (
+ "adds xzr, xzr, xzr\n\t" /* init carry flag for addition */
+ "1:\n\t"
+ "ldp %[v1], %[v2], [%[p8]], #16\n\t"
+ "adcs %[wsum], %[wsum], %[v1]\n\t"
+ "adcs %[wsum], %[wsum], %[v2]\n\t"
+ "sub %[size16], %[size16], #1\n\t"
+ "cbnz %[size16], 1b\n\t"
+ "adcs %[wsum], %[wsum], xzr\n\t" /* use up last carry */
+ : [v1] "=r" (tmp1),
+ [v2] "=r" (tmp2),
+ [wsum] "+r" (wide_sum),
+ [p8] "+r" (p8),
+ [size16] "+r" (size16)
+ :: "cc"
+ );
+ }
+#endif
+
while (wide_sum) {
sum += wide_sum & 0xFFFF;
wide_sum >>= 16;

To view, visit change 80254. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: coreboot
Gerrit-Branch: main
Gerrit-Change-Id: I9c7bbc9d7a1cd083ced62fe9222592243a796077
Gerrit-Change-Number: 80254
Gerrit-PatchSet: 4
Gerrit-Owner: Julius Werner <jwerner@chromium.org>
Gerrit-Reviewer: Arthur Heymans <arthur@aheymans.xyz>
Gerrit-Reviewer: Julius Werner <jwerner@chromium.org>
Gerrit-Reviewer: Yidi Lin <yidilin@google.com>
Gerrit-Reviewer: build bot (Jenkins) <no-reply@coreboot.org>
Gerrit-CC: Paul Menzel <paulepanter@mailbox.org>
Gerrit-MessageType: merged