Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/arm/arm Add ldrd support (one additional instructio...
details: https://anonhg.NetBSD.org/src/rev/41cd1a31685c
branches: trunk
changeset: 783392:41cd1a31685c
user: matt <matt%NetBSD.org@localhost>
date: Tue Dec 18 14:08:25 2012 +0000
description:
Add ldrd support (one additional instruction over 5 ldrs) but two of them
won't be executed resulting in 2 less loads which should save a few cyles.
diffstat:
sys/arch/arm/arm/cpu_in_cksum_v4hdr.S | 24 ++++++++++++++++++------
1 files changed, 18 insertions(+), 6 deletions(-)
diffs (48 lines):
diff -r 93336e7cf975 -r 41cd1a31685c sys/arch/arm/arm/cpu_in_cksum_v4hdr.S
--- a/sys/arch/arm/arm/cpu_in_cksum_v4hdr.S Tue Dec 18 13:41:42 2012 +0000
+++ b/sys/arch/arm/arm/cpu_in_cksum_v4hdr.S Tue Dec 18 14:08:25 2012 +0000
@@ -29,18 +29,30 @@
#include <machine/asm.h>
-RCSID("$NetBSD: cpu_in_cksum_v4hdr.S,v 1.1 2012/12/18 13:41:42 matt Exp $")
+RCSID("$NetBSD: cpu_in_cksum_v4hdr.S,v 1.2 2012/12/18 14:08:25 matt Exp $")
ENTRY(cpu_in_cksum_v4hdr)
+#ifdef _ARM_ARCH_DWORD_OK
+ tst r0, #4 /* 64-bit aligned? */
+ ldreqd r2, [r0], #8 /* load 1st/2nd words */
+ ldrne ip, [r0], #4 /* load 1st word */
+ ldreq ip, [r0, #8] /* load 5th word */
+ ldrned r2, [r0, #8] /* load 4th/5th words */
+#else
ldr ip, [r0] /* load 1st word */
ldr r3, [r0, #4] /* load 2nd word */
- adds r3, r3, ip /* add 1st to 2nd */
ldr r2, [r0, #8] /* load 3rd word */
- adcs r2, r2, r3 /* add sum to 3rd */
+#endif
+ adds r3, r3, ip /* accumulate */
+ adcs r2, r2, r3 /* accumulate */
+#ifdef _ARM_ARCH_DWORD_OK
+ ldrd r0, [r0] /* load remaining words */
+#else
ldr r1, [r0, #12] /* load 4th word */
- adcs r1, r1, r2 /* add sum to 4th */
ldr r0, [r0, #16] /* load 5th word */
- adcs r0, r0, r1 /* add sum to 5th */
+#endif
+ adcs r1, r1, r2 /* accumulate */
+ adcs r0, r0, r1 /* accumulate */
/*
* We now have a 33-bit (r0 + carry) sum which needs to resolved to a
* 16-bit sum.
@@ -62,7 +74,7 @@
movw r1, #0xffff /* load 0xffff */
#else
mov r1, #0x10000 /* load 0x10000 */
- sub r1, r1, #1 /* subtract 1 to get 0xffff */
+ sub r1, r1, #1 /* subtract by 1 to get 0xffff */
#endif
subge r0, r0, r1 /* subtract 0xffff */
eor r0, r0, r1 /* complement lower halfword */
Home |
Main Index |
Thread Index |
Old Index