]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/pc/ptclbsum386.s
etheriwl: implement 4965 firmware bootstrap (untested)
[plan9front.git] / sys / src / 9 / 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