patch-2.4.0-test12 linux/arch/alpha/lib/checksum.c
Next file: linux/arch/alpha/lib/csum_partial_copy.c
Previous file: linux/arch/alpha/lib/Makefile
Back to the patch index
Back to the overall index
- Lines: 46
- Date:
Mon Dec 11 13:46:26 2000
- Orig file:
v2.4.0-test11/linux/arch/alpha/lib/checksum.c
- Orig date:
Tue Apr 28 22:28:10 1998
diff -u --recursive --new-file v2.4.0-test11/linux/arch/alpha/lib/checksum.c linux/arch/alpha/lib/checksum.c
@@ -3,6 +3,10 @@
*
* This file contains network checksum routines that are better done
* in an architecture-specific manner due to speed..
+ * Comments in other versions indicate that the algorithms are from RFC1071
+ *
+ * accellerated versions (and 21264 assembly versions ) contributed by
+ * Rick Gorton <rick.gorton@alpha-processor.com>
*/
#include <linux/string.h>
@@ -11,15 +15,25 @@
static inline unsigned short from64to16(unsigned long x)
{
- /* add up 32-bit words for 33 bits */
- x = (x & 0xffffffff) + (x >> 32);
- /* add up 16-bit and 17-bit words for 17+c bits */
- x = (x & 0xffff) + (x >> 16);
- /* add up 16-bit and 2-bit for 16+c bit */
- x = (x & 0xffff) + (x >> 16);
- /* add up carry.. */
- x = (x & 0xffff) + (x >> 16);
- return x;
+ /* Using extract instructions is a bit more efficient
+ than the original shift/bitmask version. */
+
+ union {
+ unsigned long ul;
+ unsigned int ui[2];
+ unsigned short us[4];
+ } in_v, tmp_v, out_v;
+
+ in_v.ul = x;
+ tmp_v.ul = (unsigned long) in_v.ui[0] + (unsigned long) in_v.ui[1];
+
+ /* Since the bits of tmp_v.sh[3] are going to always be zero,
+ we don't have to bother to add that in. */
+ out_v.ul = (unsigned long) tmp_v.us[0] + (unsigned long) tmp_v.us[1]
+ + (unsigned long) tmp_v.us[2];
+
+ /* Similarly, out_v.us[2] is always zero for the final add. */
+ return out_v.us[0] + out_v.us[1];
}
/*
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)