Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/sparc64/sparc64 Add an optimized assembly in_cksum(...
details: https://anonhg.NetBSD.org/src/rev/56b859fab2d7
branches: trunk
changeset: 513690:56b859fab2d7
user: eeh <eeh%NetBSD.org@localhost>
date: Wed Aug 08 00:12:37 2001 +0000
description:
Add an optimized assembly in_cksum(). (Why did I do this?)
diffstat:
sys/arch/sparc64/sparc64/in_cksum.S | 193 ++++++++++++++++++++++++++++++++++++
1 files changed, 193 insertions(+), 0 deletions(-)
diffs (197 lines):
diff -r bbcda529b755 -r 56b859fab2d7 sys/arch/sparc64/sparc64/in_cksum.S
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/sparc64/sparc64/in_cksum.S Wed Aug 08 00:12:37 2001 +0000
@@ -0,0 +1,193 @@
+/* $NetBSD: in_cksum.S,v 1.1 2001/08/08 00:12:37 eeh Exp $ */
+
+/*
+ * Copyright (c) 2001 Eduardo Horvath
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Eduardo Horvath.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "assym.h"
+#include <machine/asm.h>
+
+/*
+ * int in_cksum(struct mbuf *m, int len)
+ *
+ * The only fields of the mbuf we really care about
+ * is m_next and m_len and m_data.
+ *
+ *
+ * Register usage:
+ *
+ * %o0 - mbuf
+ * %o1 - len
+ * %o2 - mlen
+ * %o3 - mdata
+ * %o4 - temp
+ * %o5 - sum
+ * %g1 - swapped
+ * %g4 - temp
+ * %g5 - temp
+ */
+
+#define IALIGN .align 32
+
+ENTRY(in_cksum)
+ brz %o0, Lfinish ! for (; m && len > 0; m->m_next) {
+ clr %o5 ! sum = 0;
+ brlez %o1, Lfinish
+ clr %g1 ! swapped = 0;
+ ba,a,pt %icc, Lloop
+ nop
+
+ IALIGN
+Lloop:
+ lduw [%o0 + M_LEN], %o2
+ sethi %hi(0xffff), %g5
+ ldx [%o0 + M_DATA], %o3
+ or %g5, %lo(0xffff), %g5
+ brz %o2, Lnext ! if (m->m_len == 0) continue;
+
+ cmp %o1, %o2 ! if (len < mlen)
+ movl %icc, %o1, %o2 ! mlen = len;
+
+ btst 3, %o3 ! if (!(*w & 3)) {
+ bz Lint_aligned
+ sub %o1, %o2, %o1 ! len -= mlen
+
+ srlx %o5, 16, %o4 ! REDUCE {sum = (sum & 0xffff) + (sum >> 16);}
+ and %o5, %g5, %o5
+
+ add %o5, %o4, %o5
+ btst 1, %o3 ! if (!(*w & 3) &&
+ bz Lshort_aligned
+ nop
+
+ deccc %o2
+ bl,a,pn %icc, Lfinish ! mlen >= 1) {
+ inc %o2
+ ldub [%o3], %o4 ! ADDBYTE {ROL; sum += *w; byte_swapped ^= 1;}
+ sllx %o5, 8, %o5 ! ROL { sum = sum << 8; }
+ inc %o3 ! }
+ add %o5, %o4, %o5
+ xor %g1, 1, %g1 ! Flip byte_swapped
+
+Lshort_aligned:
+ btst 2, %o3 ! if (!(*w & 3) &&
+ bz Lint_aligned
+ nop
+
+ deccc 2, %o2 ! mlen >= 1) {
+ bl,a,pn %icc, Lfinish_byte
+ inc 2, %o2
+ lduh [%o3], %o4 ! ADDSHORT {sum += *(u_short *)w;}
+ inc 2, %o3 ! }
+ add %o5, %o4, %o5 ! }
+Lint_aligned:
+ deccc 0xc, %o2 ! while (mlen >= 12) {
+ ble,pn %icc, Ltoofar
+ clr %g5
+ ba,pt %icc, 0f
+ clr %g4
+ IALIGN
+0:
+ lduw [%o3 + 0x00], %o4
+ add %o5, %g4, %o5
+ deccc 0xc, %o2
+ lduw [%o3 + 0x04], %g4
+ add %o5, %g5, %o5
+ lduw [%o3 + 0x08], %g5
+ inc 0xc, %o3 ! ADVANCE(12) }
+ bg,pt %icc, 0b
+ add %o5, %o4, %o5
+ add %o5, %g4, %o5
+ add %o5, %g5, %o5
+Ltoofar:
+ inc 0xc, %o2
+
+Ldo_int:
+ deccc 4, %o2
+ bl,pn %icc, Lfinish_short
+ nop
+0:
+ lduw [%o3], %o4
+ inc 4, %o3
+ deccc 4, %o2
+ bge,pt %icc, 0b
+ add %o5, %o4, %o5
+
+Lfinish_short:
+ btst 2, %o2
+ bz Lfinish_byte
+ nop
+ lduh [%o3], %o4
+ inc 2, %o3
+ add %o5, %o4, %o5
+
+Lfinish_byte:
+ btst 1, %o2
+ bz Lnext
+ nop
+ ldub [%o3], %o4
+ sllx %o5, 8, %o5 ! ROL { sum = sum << 8; }
+ add %o5, %o4, %o5
+ inc %o3
+ xor %g1, 1, %g1 ! Flip byte_swapped
+
+Lnext:
+ ldx [%o0 + M_NEXT], %o0
+ brnz,pn %o0, Lloop ! In general there is only one mbuf
+ nop
+ brnz,pt %o1, Lloop ! But usually all need to be fully checksummed
+ nop
+Lfinish:
+ srlx %o5, 32, %o4 ! REDUCE
+ sethi %hi(0x0000ffff), %o3 ! data ptr not needed any more
+
+ srl %o5, 0, %o5 ! Clear top 64 bits
+ or %o3, %lo(0x0000ffff), %o3
+
+ add %o4, %o5, %o5
+
+ srl %o5, 16, %o4
+ and %o5, %o3, %o5
+
+ add %o5, %o4, %o5
+ brz,pt %g1, 0f ! if (byte_swapped) {
+ nop
+
+ sllx %o5, 8, %o5 ! ROL
+
+ srl %o5, 16, %o4 ! REDUCE
+ and %o5, %o3, %o5
+
+ add %o5, %o4, %o5
+0:
+ subcc %o5, %o3, %o4 ! if (sum > 0xffff)
+ movg %icc, %o4, %o5 ! sum -= 0xffff;
+
+ clr %g4 ! In case we are using EMBEDANY (ick)
+ retl
+ xor %o5, %o3, %o0 ! return (0xffff ^ sum);
Home |
Main Index |
Thread Index |
Old Index