removed some verbose messages
[minix3.git] / lib / i86 / misc / oneC_sum.s
blobe5a6e443486f9647fdd88872e5390f6e6ca0983c
1 ! oneC_sum() - One complement`s checksum Author: Kees J. Bot
2 ! 23 May 1998
3 ! See RFC 1071, "Computing the Internet checksum"
4 ! See also the C version of this code.
6 .text
8 .define _oneC_sum
9 .align 4
10 _oneC_sum:
11 push bp
12 mov bp, sp
13 push si
14 push di
15 mov ax, 4(bp) ! Checksum of previous block
16 mov si, 6(bp) ! Data to compute checksum over
17 mov di, 8(bp) ! Number of bytes
19 xor dx, dx
20 xorb cl, cl
21 align: test si, #1 ! Is the data aligned?
22 jz aligned
23 test di, di
24 jz 0f
25 movb dh, (si) ! First unaligned byte in high half of
26 dec di ! the dx register, i.e. rotate 8 bits
27 0: inc si
28 movb cl, #8 ! Number of bits "rotated"
29 ror ax, cl ! Rotate the checksum likewise
30 aligned:add ax, dx ! Summate the unaligned byte
31 adc ax, #0 ! Add carry back in for one`s complement
33 jmp add6test
34 .align 4
35 add6: add ax, (si) ! Six times unrolled loop, see below
36 adc ax, 2(si)
37 adc ax, 4(si)
38 adc ax, 6(si)
39 adc ax, 8(si)
40 adc ax, 10(si)
41 adc ax, #0
42 add si, #12
43 add6test:
44 sub di, #12
45 jae add6
46 add di, #12
48 jmp add1test
49 .align 4
50 add1: add ax, (si) ! while ((di -= 2) >= 0)
51 adc ax, #0 ! ax += *si++;
52 add si, #2 ! di += 2;
53 add1test:
54 sub di, #2
55 jae add1
56 add di, #2
58 jz done ! Is there an extra byte?
59 movb dl, (si) ! Load extra byte in word
60 xorb dh, dh
61 add ax, dx ! Add in the last bits
62 adc ax, #0
63 done:
64 rol ax, cl ! Undo the rotation at the beginning
65 pop di
66 pop si
67 pop bp
68 ret