Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/sh5/sh5 - Fix REDUCE16 to ignore the upper 32-bits ...



details:   https://anonhg.NetBSD.org/src/rev/d0f0af6ae16b
branches:  trunk
changeset: 538539:d0f0af6ae16b
user:      scw <scw%NetBSD.org@localhost>
date:      Tue Oct 22 12:22:43 2002 +0000

description:
- Fix REDUCE16 to ignore the upper 32-bits of the input operand.
- Shift a leading misaligned quad to compensate for the implicit shift
  in the "ldlo.q" instruction. (And remove the "XXX:" comment which correctly
  hinted that this might be necessary).
- Clean up some comments.

diffstat:

 sys/arch/sh5/sh5/in_cksum.S |  36 ++++++++++++++++--------------------
 1 files changed, 16 insertions(+), 20 deletions(-)

diffs (110 lines):

diff -r 37b500fbaece -r d0f0af6ae16b sys/arch/sh5/sh5/in_cksum.S
--- a/sys/arch/sh5/sh5/in_cksum.S       Tue Oct 22 12:10:32 2002 +0000
+++ b/sys/arch/sh5/sh5/in_cksum.S       Tue Oct 22 12:22:43 2002 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: in_cksum.S,v 1.2 2002/10/19 13:17:33 scw Exp $ */
+/*     $NetBSD: in_cksum.S,v 1.3 2002/10/22 12:22:43 scw Exp $ */
 
 /*
  * Copyright 2002 Wasabi Systems, Inc.
@@ -82,12 +82,15 @@
 #define        REDUCE16(i, result)              \
        mshflo.w i, r63, r0             ;\
        shlri   i, 16, i                ;\
-       add     r0, i, i                ;\
+       addz.l  r0, i, i                ;\
        mshflo.w i, r63, r0             ;\
        shlri   i, 16, i                ;\
        add     r0, i, result
 
+
 /*
+ * The main in*_cksum() workhorse...
+ *
  * Entry parameters:
  *
  *     r3      Buffer length
@@ -97,14 +100,14 @@
  *
  * Returns:
  *
- *     r7      Accumulated sum as two pairs of "carry:sum" words.
+ *     r7      Accumulated 64-bit sum
  *
  * Trashes:
  *     r0, r1, r3, r4, r19, r20, r21, r22
  *     tr0, tr1, tr2
  */
 
-Lcksumdata:
+ASENTRY(cksumdata)
        movi    0, r7
        ld.b    r4, 0, r63              /* Pre-fetch the start of the buffer */
        ptabs/u r18, tr0
@@ -112,21 +115,19 @@
 
        /*
         * We first have to quad-align the buffer.
-        *
-        * XXX: We may have to shift the result of the following "ldlo.q"
-        * depending on the buffer alignment, particularly for odd addresses,
-        * in the same way as we do for the "ldhi.q" in Lend_game.
         */
        pta/u   Lalready_aligned, tr2
-       xori    r4, 0x7, r0
-       andi    r0, 0x7, r0
+       andi    r4, 0x7, r1
+       xori    r1, 0x7, r0
        beqi/u  r0, 0x7, tr2            /* Jump if already quad aligned */
        addi    r0, 1, r0               /* r0 == # bytes to next quad */
        bgtu/u  r0, r3, tr1             /* Not enough bytes left to make it */
-       ldlo.q  r4, 0, r19              /* Fetch 1 to 4 words */
+       ldlo.q  r4, 0, r19              /* Fetch 1 to 7 bytes */
+       shlli   r1, 3, r1
        add     r4, r0, r4              /* r4 is now quad-aligned */
        sub     r3, r0, r3              /* Update remaining length */
-       ADDC    (r19, r7, r7)           /* Accumulate the words we just read */
+       shlld   r19, r1, r19
+       ADDC    (r19, r7, r7)           /* Accumulate the bytes we just read */
        beq/u   r3, r63, tr0            /* Return to caller if done */
 
        /*
@@ -152,15 +153,10 @@
        /*
         * At this point:
         *
-        *  r0 == 0x00  Enter loop at 1st load.
-        *  r0 == 0x08  Enter loop at 2nd load.
-        *  r0 == 0x10  Enter loop at 3rd load.
-        *  r0 == 0x18  Enter loop at 4th load.
-        *
         *  r3 == # of bytes remaining, AFTER loop entry.
         *  r4 -> *next* 32-byte aligned chunk of buffer.
         *
-        * The "big_loop" checksums 16 words at a time.
+        * The "big_loop" checksums 32 bytes at a time.
         */
 
 Lbig_loop:
@@ -223,7 +219,6 @@
        ADDC    (r22, r7, r7)
        blink   tr0, r63
 
-
 /*
  * int in_cksum(struct mbuf *m, int len)
  */
@@ -243,7 +238,7 @@
         * r6  == len
         */
 Lcksum_top:
-       pta/u   Lcksumdata, tr4
+       pta/u   _ASM_LABEL(cksumdata), tr4
        pta/u   Lcksum_loop, tr3
        movi    0, r7
        movi    0, r8
@@ -363,3 +358,4 @@
 Lmbuf_msg:
        .asciz  "cksum: out of mbufs\n"
 #endif /* INET || INET6 */
+



Home | Main Index | Thread Index | Old Index