Roll src/third_party/skia 26fc1bf:f559de4
[chromium-blink-merge.git] / third_party / boringssl / win-x86 / crypto / rc4 / rc4-586.asm
blob08cd9f6d70a7569421e45398fd59ff99e94ecc56
1 %ifidn __OUTPUT_FORMAT__,obj
2 section code use32 class=code align=64
3 %elifidn __OUTPUT_FORMAT__,win32
4 %ifdef __YASM_VERSION_ID__
5 %if __YASM_VERSION_ID__ < 01010000h
6 %error yasm version 1.1.0 or later needed.
7 %endif
8 ; Yasm automatically includes .00 and complains about redefining it.
9 ; https://www.tortall.net/projects/yasm/manual/html/objfmt-win32-safeseh.html
10 %else
11 $@feat.00 equ 1
12 %endif
13 section .text code align=64
14 %else
15 section .text code
16 %endif
17 ;extern _OPENSSL_ia32cap_P
18 global _asm_RC4
19 align 16
20 _asm_RC4:
21 L$_asm_RC4_begin:
22 push ebp
23 push ebx
24 push esi
25 push edi
26 mov edi,DWORD [20+esp]
27 mov edx,DWORD [24+esp]
28 mov esi,DWORD [28+esp]
29 mov ebp,DWORD [32+esp]
30 xor eax,eax
31 xor ebx,ebx
32 cmp edx,0
33 je NEAR L$000abort
34 mov al,BYTE [edi]
35 mov bl,BYTE [4+edi]
36 add edi,8
37 lea ecx,[edx*1+esi]
38 sub ebp,esi
39 mov DWORD [24+esp],ecx
40 inc al
41 cmp DWORD [256+edi],-1
42 je NEAR L$001RC4_CHAR
43 mov ecx,DWORD [eax*4+edi]
44 and edx,-4
45 jz NEAR L$002loop1
46 mov DWORD [32+esp],ebp
47 test edx,-8
48 jz NEAR L$003go4loop4
49 lea ebp,[_OPENSSL_ia32cap_P]
50 bt DWORD [ebp],26
51 jnc NEAR L$003go4loop4
52 mov ebp,DWORD [32+esp]
53 and edx,-8
54 lea edx,[edx*1+esi-8]
55 mov DWORD [edi-4],edx
56 add bl,cl
57 mov edx,DWORD [ebx*4+edi]
58 mov DWORD [ebx*4+edi],ecx
59 mov DWORD [eax*4+edi],edx
60 inc eax
61 add edx,ecx
62 movzx eax,al
63 movzx edx,dl
64 movq mm0,[esi]
65 mov ecx,DWORD [eax*4+edi]
66 movd mm2,DWORD [edx*4+edi]
67 jmp NEAR L$004loop_mmx_enter
68 align 16
69 L$005loop_mmx:
70 add bl,cl
71 psllq mm1,56
72 mov edx,DWORD [ebx*4+edi]
73 mov DWORD [ebx*4+edi],ecx
74 mov DWORD [eax*4+edi],edx
75 inc eax
76 add edx,ecx
77 movzx eax,al
78 movzx edx,dl
79 pxor mm2,mm1
80 movq mm0,[esi]
81 movq [esi*1+ebp-8],mm2
82 mov ecx,DWORD [eax*4+edi]
83 movd mm2,DWORD [edx*4+edi]
84 L$004loop_mmx_enter:
85 add bl,cl
86 mov edx,DWORD [ebx*4+edi]
87 mov DWORD [ebx*4+edi],ecx
88 mov DWORD [eax*4+edi],edx
89 inc eax
90 add edx,ecx
91 movzx eax,al
92 movzx edx,dl
93 pxor mm2,mm0
94 mov ecx,DWORD [eax*4+edi]
95 movd mm1,DWORD [edx*4+edi]
96 add bl,cl
97 psllq mm1,8
98 mov edx,DWORD [ebx*4+edi]
99 mov DWORD [ebx*4+edi],ecx
100 mov DWORD [eax*4+edi],edx
101 inc eax
102 add edx,ecx
103 movzx eax,al
104 movzx edx,dl
105 pxor mm2,mm1
106 mov ecx,DWORD [eax*4+edi]
107 movd mm1,DWORD [edx*4+edi]
108 add bl,cl
109 psllq mm1,16
110 mov edx,DWORD [ebx*4+edi]
111 mov DWORD [ebx*4+edi],ecx
112 mov DWORD [eax*4+edi],edx
113 inc eax
114 add edx,ecx
115 movzx eax,al
116 movzx edx,dl
117 pxor mm2,mm1
118 mov ecx,DWORD [eax*4+edi]
119 movd mm1,DWORD [edx*4+edi]
120 add bl,cl
121 psllq mm1,24
122 mov edx,DWORD [ebx*4+edi]
123 mov DWORD [ebx*4+edi],ecx
124 mov DWORD [eax*4+edi],edx
125 inc eax
126 add edx,ecx
127 movzx eax,al
128 movzx edx,dl
129 pxor mm2,mm1
130 mov ecx,DWORD [eax*4+edi]
131 movd mm1,DWORD [edx*4+edi]
132 add bl,cl
133 psllq mm1,32
134 mov edx,DWORD [ebx*4+edi]
135 mov DWORD [ebx*4+edi],ecx
136 mov DWORD [eax*4+edi],edx
137 inc eax
138 add edx,ecx
139 movzx eax,al
140 movzx edx,dl
141 pxor mm2,mm1
142 mov ecx,DWORD [eax*4+edi]
143 movd mm1,DWORD [edx*4+edi]
144 add bl,cl
145 psllq mm1,40
146 mov edx,DWORD [ebx*4+edi]
147 mov DWORD [ebx*4+edi],ecx
148 mov DWORD [eax*4+edi],edx
149 inc eax
150 add edx,ecx
151 movzx eax,al
152 movzx edx,dl
153 pxor mm2,mm1
154 mov ecx,DWORD [eax*4+edi]
155 movd mm1,DWORD [edx*4+edi]
156 add bl,cl
157 psllq mm1,48
158 mov edx,DWORD [ebx*4+edi]
159 mov DWORD [ebx*4+edi],ecx
160 mov DWORD [eax*4+edi],edx
161 inc eax
162 add edx,ecx
163 movzx eax,al
164 movzx edx,dl
165 pxor mm2,mm1
166 mov ecx,DWORD [eax*4+edi]
167 movd mm1,DWORD [edx*4+edi]
168 mov edx,ebx
169 xor ebx,ebx
170 mov bl,dl
171 cmp esi,DWORD [edi-4]
172 lea esi,[8+esi]
173 jb NEAR L$005loop_mmx
174 psllq mm1,56
175 pxor mm2,mm1
176 movq [esi*1+ebp-8],mm2
177 emms
178 cmp esi,DWORD [24+esp]
179 je NEAR L$006done
180 jmp NEAR L$002loop1
181 align 16
182 L$003go4loop4:
183 lea edx,[edx*1+esi-4]
184 mov DWORD [28+esp],edx
185 L$007loop4:
186 add bl,cl
187 mov edx,DWORD [ebx*4+edi]
188 mov DWORD [ebx*4+edi],ecx
189 mov DWORD [eax*4+edi],edx
190 add edx,ecx
191 inc al
192 and edx,255
193 mov ecx,DWORD [eax*4+edi]
194 mov ebp,DWORD [edx*4+edi]
195 add bl,cl
196 mov edx,DWORD [ebx*4+edi]
197 mov DWORD [ebx*4+edi],ecx
198 mov DWORD [eax*4+edi],edx
199 add edx,ecx
200 inc al
201 and edx,255
202 ror ebp,8
203 mov ecx,DWORD [eax*4+edi]
204 or ebp,DWORD [edx*4+edi]
205 add bl,cl
206 mov edx,DWORD [ebx*4+edi]
207 mov DWORD [ebx*4+edi],ecx
208 mov DWORD [eax*4+edi],edx
209 add edx,ecx
210 inc al
211 and edx,255
212 ror ebp,8
213 mov ecx,DWORD [eax*4+edi]
214 or ebp,DWORD [edx*4+edi]
215 add bl,cl
216 mov edx,DWORD [ebx*4+edi]
217 mov DWORD [ebx*4+edi],ecx
218 mov DWORD [eax*4+edi],edx
219 add edx,ecx
220 inc al
221 and edx,255
222 ror ebp,8
223 mov ecx,DWORD [32+esp]
224 or ebp,DWORD [edx*4+edi]
225 ror ebp,8
226 xor ebp,DWORD [esi]
227 cmp esi,DWORD [28+esp]
228 mov DWORD [esi*1+ecx],ebp
229 lea esi,[4+esi]
230 mov ecx,DWORD [eax*4+edi]
231 jb NEAR L$007loop4
232 cmp esi,DWORD [24+esp]
233 je NEAR L$006done
234 mov ebp,DWORD [32+esp]
235 align 16
236 L$002loop1:
237 add bl,cl
238 mov edx,DWORD [ebx*4+edi]
239 mov DWORD [ebx*4+edi],ecx
240 mov DWORD [eax*4+edi],edx
241 add edx,ecx
242 inc al
243 and edx,255
244 mov edx,DWORD [edx*4+edi]
245 xor dl,BYTE [esi]
246 lea esi,[1+esi]
247 mov ecx,DWORD [eax*4+edi]
248 cmp esi,DWORD [24+esp]
249 mov BYTE [esi*1+ebp-1],dl
250 jb NEAR L$002loop1
251 jmp NEAR L$006done
252 align 16
253 L$001RC4_CHAR:
254 movzx ecx,BYTE [eax*1+edi]
255 L$008cloop1:
256 add bl,cl
257 movzx edx,BYTE [ebx*1+edi]
258 mov BYTE [ebx*1+edi],cl
259 mov BYTE [eax*1+edi],dl
260 add dl,cl
261 movzx edx,BYTE [edx*1+edi]
262 add al,1
263 xor dl,BYTE [esi]
264 lea esi,[1+esi]
265 movzx ecx,BYTE [eax*1+edi]
266 cmp esi,DWORD [24+esp]
267 mov BYTE [esi*1+ebp-1],dl
268 jb NEAR L$008cloop1
269 L$006done:
270 dec al
271 mov DWORD [edi-4],ebx
272 mov BYTE [edi-8],al
273 L$000abort:
274 pop edi
275 pop esi
276 pop ebx
277 pop ebp
279 global _asm_RC4_set_key
280 align 16
281 _asm_RC4_set_key:
282 L$_asm_RC4_set_key_begin:
283 push ebp
284 push ebx
285 push esi
286 push edi
287 mov edi,DWORD [20+esp]
288 mov ebp,DWORD [24+esp]
289 mov esi,DWORD [28+esp]
290 lea edx,[_OPENSSL_ia32cap_P]
291 lea edi,[8+edi]
292 lea esi,[ebp*1+esi]
293 neg ebp
294 xor eax,eax
295 mov DWORD [edi-4],ebp
296 bt DWORD [edx],20
297 jc NEAR L$009c1stloop
298 align 16
299 L$010w1stloop:
300 mov DWORD [eax*4+edi],eax
301 add al,1
302 jnc NEAR L$010w1stloop
303 xor ecx,ecx
304 xor edx,edx
305 align 16
306 L$011w2ndloop:
307 mov eax,DWORD [ecx*4+edi]
308 add dl,BYTE [ebp*1+esi]
309 add dl,al
310 add ebp,1
311 mov ebx,DWORD [edx*4+edi]
312 jnz NEAR L$012wnowrap
313 mov ebp,DWORD [edi-4]
314 L$012wnowrap:
315 mov DWORD [edx*4+edi],eax
316 mov DWORD [ecx*4+edi],ebx
317 add cl,1
318 jnc NEAR L$011w2ndloop
319 jmp NEAR L$013exit
320 align 16
321 L$009c1stloop:
322 mov BYTE [eax*1+edi],al
323 add al,1
324 jnc NEAR L$009c1stloop
325 xor ecx,ecx
326 xor edx,edx
327 xor ebx,ebx
328 align 16
329 L$014c2ndloop:
330 mov al,BYTE [ecx*1+edi]
331 add dl,BYTE [ebp*1+esi]
332 add dl,al
333 add ebp,1
334 mov bl,BYTE [edx*1+edi]
335 jnz NEAR L$015cnowrap
336 mov ebp,DWORD [edi-4]
337 L$015cnowrap:
338 mov BYTE [edx*1+edi],al
339 mov BYTE [ecx*1+edi],bl
340 add cl,1
341 jnc NEAR L$014c2ndloop
342 mov DWORD [256+edi],-1
343 L$013exit:
344 xor eax,eax
345 mov DWORD [edi-8],eax
346 mov DWORD [edi-4],eax
347 pop edi
348 pop esi
349 pop ebx
350 pop ebp
352 global _RC4_options
353 align 16
354 _RC4_options:
355 L$_RC4_options_begin:
356 call L$016pic_point
357 L$016pic_point:
358 pop eax
359 lea eax,[(L$017opts-L$016pic_point)+eax]
360 lea edx,[_OPENSSL_ia32cap_P]
361 mov edx,DWORD [edx]
362 bt edx,20
363 jc NEAR L$0181xchar
364 bt edx,26
365 jnc NEAR L$019ret
366 add eax,25
368 L$0181xchar:
369 add eax,12
370 L$019ret:
372 align 64
373 L$017opts:
374 db 114,99,52,40,52,120,44,105,110,116,41,0
375 db 114,99,52,40,49,120,44,99,104,97,114,41,0
376 db 114,99,52,40,56,120,44,109,109,120,41,0
377 db 82,67,52,32,102,111,114,32,120,56,54,44,32,67,82,89
378 db 80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114
379 db 111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
380 align 64
381 segment .bss
382 common _OPENSSL_ia32cap_P 16