]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libsec/386/sha1block.s
games/mines: bikeshedding
[plan9front.git] / sys / src / libsec / 386 / sha1block.s
1         TEXT    _sha1block+0(SB),$352
2
3 /* x = (wp[off-f] ^ wp[off-8] ^ wp[off-14] ^ wp[off-16]) <<< 1;
4  * wp[off] = x;
5  * x += A <<< 5;
6  * E += 0xca62c1d6 + x;
7  * x = FN(B,C,D);
8  * E += x;
9  * B >>> 2
10  */
11 #define BSWAPDI BYTE $0x0f; BYTE $0xcf;
12
13 #define BODY(off,FN,V,A,B,C,D,E)\
14         MOVL (off-64)(BP),DI;\
15         XORL (off-56)(BP),DI;\
16         XORL (off-32)(BP),DI;\
17         XORL (off-12)(BP),DI;\
18         ROLL $1,DI;\
19         MOVL DI,off(BP);\
20         LEAL V(DI)(E*1),E;\
21         MOVL A,DI;\
22         ROLL $5,DI;\
23         ADDL DI,E;\
24         FN(B,C,D)\
25         ADDL DI,E;\
26         RORL $2,B;\
27
28 #define BODY0(off,FN,V,A,B,C,D,E)\
29         MOVL off(BX),DI;\
30         BSWAPDI;\
31         MOVL DI,off(BP);\
32         LEAL V(DI)(E*1),E;\
33         MOVL A,DI;\
34         ROLL $5,DI;\
35         ADDL DI,E;\
36         FN(B,C,D)\
37         ADDL DI,E;\
38         RORL $2,B;\
39
40 /*
41  * fn1 = (((C^D)&B)^D);
42  */
43 #define FN1(B,C,D)\
44         MOVL C,DI;\
45         XORL D,DI;\
46         ANDL B,DI;\
47         XORL D,DI;\
48
49 /*
50  * fn24 = B ^ C ^ D
51  */
52 #define FN24(B,C,D)\
53         MOVL B,DI;\
54         XORL C,DI;\
55         XORL D,DI;\
56
57 /*
58  * fn3 = ((B ^ C) & (D ^= B)) ^ B
59  * D ^= B to restore D
60  */
61 #define FN3(B,C,D)\
62         MOVL B,DI;\
63         XORL C,DI;\
64         XORL B,D;\
65         ANDL D,DI;\
66         XORL B,DI;\
67         XORL B,D;\
68
69 /*
70  * stack offsets
71  * void sha1block(uchar *DATA, int LEN, ulong *STATE)
72  */
73 #define DATA    0
74 #define LEN     4
75 #define STATE   8
76
77 /*
78  * stack offsets for locals
79  * ulong w[80];
80  * uchar *edata;
81  * ulong *w15, *w40, *w60, *w80;
82  * register local
83  * ulong *wp = BP
84  * ulong a = eax, b = ebx, c = ecx, d = edx, e = esi
85  * ulong tmp = edi
86  */
87 #define WARRAY  (-4-(80*4))
88 #define TMP1    (-8-(80*4))
89 #define TMP2    (-12-(80*4))
90 #define W15     (-16-(80*4))
91 #define W40     (-20-(80*4))
92 #define W60     (-24-(80*4))
93 #define W80     (-28-(80*4))
94 #define EDATA   (-32-(80*4))
95
96         MOVL data+DATA(FP),AX
97         ADDL len+LEN(FP),AX
98         MOVL AX,edata+EDATA(SP)
99
100         LEAL aw15+(WARRAY+15*4)(SP),DI
101         MOVL DI,w15+W15(SP)
102         LEAL aw40+(WARRAY+40*4)(SP),DX
103         MOVL DX,w40+W40(SP)
104         LEAL aw60+(WARRAY+60*4)(SP),CX
105         MOVL CX,w60+W60(SP)
106         LEAL aw80+(WARRAY+80*4)(SP),DI
107         MOVL DI,w80+W80(SP)
108
109 mainloop:
110         LEAL warray+WARRAY(SP),BP
111
112         MOVL state+STATE(FP),DI
113         MOVL (DI),AX
114         MOVL 4(DI),BX
115         MOVL BX,tmp1+TMP1(SP)
116         MOVL 8(DI),CX
117         MOVL 12(DI),DX
118         MOVL 16(DI),SI
119
120         MOVL data+DATA(FP),BX
121
122 loop1:
123         BODY0(0,FN1,0x5a827999,AX,tmp1+TMP1(SP),CX,DX,SI)
124         MOVL SI,tmp2+TMP2(SP)
125         BODY0(4,FN1,0x5a827999,SI,AX,tmp1+TMP1(SP),CX,DX)
126         MOVL tmp1+TMP1(SP),SI
127         BODY0(8,FN1,0x5a827999,DX,tmp2+TMP2(SP),AX,SI,CX)
128         BODY0(12,FN1,0x5a827999,CX,DX,tmp2+TMP2(SP),AX,SI)
129         MOVL SI,tmp1+TMP1(SP)
130         BODY0(16,FN1,0x5a827999,SI,CX,DX,tmp2+TMP2(SP),AX)
131         MOVL tmp2+TMP2(SP),SI
132
133         ADDL $20,BX
134         ADDL $20,BP
135         CMPL BP,w15+W15(SP)
136         JCS loop1
137
138         BODY0(0,FN1,0x5a827999,AX,tmp1+TMP1(SP),CX,DX,SI)
139         ADDL $4,BX
140         MOVL BX,data+DATA(FP)
141         MOVL tmp1+TMP1(SP),BX
142
143         BODY(4,FN1,0x5a827999,SI,AX,BX,CX,DX)
144         BODY(8,FN1,0x5a827999,DX,SI,AX,BX,CX)
145         BODY(12,FN1,0x5a827999,CX,DX,SI,AX,BX)
146         BODY(16,FN1,0x5a827999,BX,CX,DX,SI,AX)
147
148         ADDL $20,BP
149
150 loop2:
151         BODY(0,FN24,0x6ed9eba1,AX,BX,CX,DX,SI)
152         BODY(4,FN24,0x6ed9eba1,SI,AX,BX,CX,DX)
153         BODY(8,FN24,0x6ed9eba1,DX,SI,AX,BX,CX)
154         BODY(12,FN24,0x6ed9eba1,CX,DX,SI,AX,BX)
155         BODY(16,FN24,0x6ed9eba1,BX,CX,DX,SI,AX)
156
157         ADDL $20,BP
158         CMPL BP,w40+W40(SP)
159         JCS loop2
160
161 loop3:
162         BODY(0,FN3,0x8f1bbcdc,AX,BX,CX,DX,SI)
163         BODY(4,FN3,0x8f1bbcdc,SI,AX,BX,CX,DX)
164         BODY(8,FN3,0x8f1bbcdc,DX,SI,AX,BX,CX)
165         BODY(12,FN3,0x8f1bbcdc,CX,DX,SI,AX,BX)
166         BODY(16,FN3,0x8f1bbcdc,BX,CX,DX,SI,AX)
167
168         ADDL $20,BP
169         CMPL BP,w60+W60(SP)
170         JCS loop3
171
172 loop4:
173         BODY(0,FN24,0xca62c1d6,AX,BX,CX,DX,SI)
174         BODY(4,FN24,0xca62c1d6,SI,AX,BX,CX,DX)
175         BODY(8,FN24,0xca62c1d6,DX,SI,AX,BX,CX)
176         BODY(12,FN24,0xca62c1d6,CX,DX,SI,AX,BX)
177         BODY(16,FN24,0xca62c1d6,BX,CX,DX,SI,AX)
178
179         ADDL $20,BP
180         CMPL BP,w80+W80(SP)
181         JCS loop4
182
183         MOVL state+STATE(FP),DI
184         ADDL AX,0(DI)
185         ADDL BX,4(DI)
186         ADDL CX,8(DI)
187         ADDL DX,12(DI)
188         ADDL SI,16(DI)
189
190         MOVL edata+EDATA(SP),DI
191         CMPL data+DATA(FP),DI
192         JCS mainloop
193
194         RET
195         END