/* in_cksum.c 1.7 81/10/29 */
#include "../inet/inet.h"
#include "../inet/inet_systm.h"
* Network primitives; this file varies per-cpu,
* and the code here is for VAX only.
* Checksum routine for TCP/IP headers. This
* is very heavily used in the network
* code and should be rewritten for each CPU
* to be as fast as possible.
register long *l
; /* known to be r9 */
register int sum
= 0; /* known to be r8 */
register u_short
*w
; /* known to be r7 */
w
= (u_short
*)((int)m
+ m
->m_off
);
sum
+= *(u_char
*)w
<< 8;
w
= (u_short
*)((char *)w
+ 1);
while ((mlen
-= 32) >= 0) {
asm("clrl r0"); /* clears carry */
#define ADD asm("adwc (r9)+,r8;");
ADD
; ADD
; ADD
; ADD
; ADD
; ADD
; ADD
; ADD
;
while ((mlen
-= 8) >= 0) {
sum
= ((sum
>> 16) & 0xffff) + (sum
& 0xffff);
while ((mlen
-= 2) >= 0) {
asm("movzwl (r7)+,r0; addl2 r0,r8");
printf("cksum: out of data\n");
/* add together high and low parts of sum and carry to get cksum */
{ asm("ashl $-16,r8,r0; addw2 r0,r8; adwc $0,r8");
asm("mcoml r8,r8; movzwl r8,r8"); }