FreeBSD/Linux Kernel Cross Reference
sys/pc/ptclbsum386.s
1 TEXT ptclbsum(SB), $0
2 MOVL addr+0(FP), SI
3 MOVL len+4(FP), CX
4
5 XORL AX, AX /* sum */
6
7 TESTL $1, SI /* byte aligned? */
8 MOVL SI, DI
9 JEQ _2align
10
11 DECL CX
12 JLT _return
13
14 MOVB 0x00(SI), AH
15 INCL SI
16
17 _2align:
18 TESTL $2, SI /* word aligned? */
19 JEQ _32loop
20
21 CMPL CX, $2 /* less than 2 bytes? */
22 JLT _1dreg
23 SUBL $2, CX
24
25 XORL BX, BX
26 MOVW 0x00(SI), BX
27 ADDL BX, AX
28 ADCL $0, AX
29 LEAL 2(SI), SI
30
31 _32loop:
32 CMPL CX, $0x20
33 JLT _8loop
34
35 MOVL CX, BP
36 SHRL $5, BP
37 ANDL $0x1F, CX
38
39 _32loopx:
40 MOVL 0x00(SI), BX
41 MOVL 0x1C(SI), DX
42 ADCL BX, AX
43 MOVL 0x04(SI), BX
44 ADCL DX, AX
45 MOVL 0x10(SI), DX
46 ADCL BX, AX
47 MOVL 0x08(SI), BX
48 ADCL DX, AX
49 MOVL 0x14(SI), DX
50 ADCL BX, AX
51 MOVL 0x0C(SI), BX
52 ADCL DX, AX
53 MOVL 0x18(SI), DX
54 ADCL BX, AX
55 LEAL 0x20(SI), SI
56 ADCL DX, AX
57
58 DECL BP
59 JNE _32loopx
60
61 ADCL $0, AX
62
63 _8loop:
64 CMPL CX, $0x08
65 JLT _2loop
66
67 MOVL CX, BP
68 SHRL $3, BP
69 ANDL $0x07, CX
70
71 _8loopx:
72 MOVL 0x00(SI), BX
73 ADCL BX, AX
74 MOVL 0x04(SI), DX
75 ADCL DX, AX
76
77 LEAL 0x08(SI), SI
78 DECL BP
79 JNE _8loopx
80
81 ADCL $0, AX
82
83 _2loop:
84 CMPL CX, $0x02
85 JLT _1dreg
86
87 MOVL CX, BP
88 SHRL $1, BP
89 ANDL $0x01, CX
90
91 _2loopx:
92 MOVWLZX 0x00(SI), BX
93 ADCL BX, AX
94
95 LEAL 0x02(SI), SI
96 DECL BP
97 JNE _2loopx
98
99 ADCL $0, AX
100
101 _1dreg:
102 TESTL $1, CX /* 1 byte left? */
103 JEQ _fold
104
105 XORL BX, BX
106 MOVB 0x00(SI), BX
107 ADDL BX, AX
108 ADCL $0, AX
109
110 _fold:
111 MOVL AX, BX
112 SHRL $16, BX
113 JEQ _swab
114
115 ANDL $0xFFFF, AX
116 ADDL BX, AX
117 JMP _fold
118
119 _swab:
120 TESTL $1, addr+0(FP)
121 /*TESTL $1, DI*/
122 JNE _return
123 XCHGB AH, AL
124
125 _return:
126 RET
Cache object: 41a55c14203d2be2a583d41ac12dd817
|