|
|
1.1 root 1: .text
2: /*
3: * Compute a 16-bit checksum
4: *
5: * vecadd(w, len, sum)
6: * unsigned long *w;
7: * int len;
8: * unsigned sum;
9: */
10: .globl _vecadd
11: _vecadd:
12: movl d2,sp@-
13: movl sp@(8),a0
14: movl sp@(12),d0
15: movl sp@(16),d1
16: movl d0,d2
17: lsrl #2,d0
18: lsll #2,d0
19: subl d0,d2
20: lsrl #2,d0
21: movw #0,cc
22: jra L_2
23: L_1:
24: addl a0@+,d1
25: L_2:
26: dbcs d0,L_1
27: jcc L_3
28: addql #1,d1
29: jra L_2
30: L_3:
31: btst #1,d2 | if there is another short add it in
32: jeq L_4
33: moveq #0,d0
34: movw a0@+,d0
35: addl d0,d1
36: jcc L_4
37: addql #1,d1
38: L_4:
39: btst #0,d2 | if there is another byte add it in
40: jeq L_5
41: moveq #0,d0
42: movb a0@+,d0
43: lsll #8,d0
44: addl d0,d1
45: jcc L_5
46: addql #1,d1
47: L_5:
48: movl d1,d0 | fold the 32 bits into 16
49: lsrl #16,d0
50: andl #0xFFFF,d1
51: addw d1,d0
52: jcc L_6
53: addql #1,d0
54: L_6:
55: movl sp@+,d2
56: rts
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.