SCCS-vsn: sys/vax/vax/in_cksum.c 1.4
-/* in_cksum.c 1.3 81/10/18 */
+/* in_cksum.c 1.4 81/10/20 */
#include <sys/types.h>
#include "../bbnnet/net.h"
#include <sys/types.h>
#include "../bbnnet/net.h"
register struct mbuf *m;
register int len;
{
register struct mbuf *m;
register int len;
{
- register u_short *w; /* known to be r9 */
+ register long *l; /* known to be r9 */
register int sum = 0; /* known to be r8 */
register int sum = 0; /* known to be r8 */
+ register u_short *w; /* known to be r7 */
register int mlen = 0;
COUNT(CKSUM);
register int mlen = 0;
COUNT(CKSUM);
if (len < mlen)
mlen = len;
len -= mlen;
if (len < mlen)
mlen = len;
len -= mlen;
while ((mlen -= 32) >= 0) {
while ((mlen -= 32) >= 0) {
-#define ADD asm("movzwl (r9)+,r0; addl2 r0,r8");
- ADD; ADD; ADD; ADD; ADD; ADD; ADD; ADD;
+ asm("clrl r0"); /* clears carry */
+#undef ADD
+#define ADD asm("adwc (r9)+,r8;");
ADD; ADD; ADD; ADD; ADD; ADD; ADD; ADD;
ADD; ADD; ADD; ADD; ADD; ADD; ADD; ADD;
}
mlen += 32;
while ((mlen -= 8) >= 0) {
}
mlen += 32;
while ((mlen -= 8) >= 0) {
+ asm("clrl r0");
+ ADD; ADD;
+ asm("adwc $0,r8");
+ sum = ((sum >> 16) & 0xffff) + (sum & 0xffff);
+ w = (u_short *)l;
while ((mlen -= 2) >= 0) {
while ((mlen -= 2) >= 0) {
+ asm("movzwl (r7)+,r0; addl2 r0,r8");
}
if (mlen == -1)
sum += *(u_char *)w;
}
if (mlen == -1)
sum += *(u_char *)w;
done:
return(~(sum + (sum >> 16)) & 0xffff);
}
done:
return(~(sum + (sum >> 16)) & 0xffff);
}
-
-/*
- * These routines are implemented as inline expansions
- * and are mentioned here for reference only
- *
- * htons and ntohs do byte reverse of a 16 bit integer
- * htonl and ntohl do byte reverse of a 32 bit integer
- */