Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / third_party / boringssl / linux-x86_64 / crypto / rc4 / rc4-x86_64.S
blobc4d10024ade7dfdb72a0fbcf16f7a1561c86ed86
1 #if defined(__x86_64__)
2 .text   
3 .extern OPENSSL_ia32cap_P
4 .hidden OPENSSL_ia32cap_P
6 .globl  asm_RC4
7 .hidden asm_RC4
8 .type   asm_RC4,@function
9 .align  16
10 asm_RC4:
11         orq     %rsi,%rsi
12         jne     .Lentry
13         .byte   0xf3,0xc3
14 .Lentry:
15         pushq   %rbx
16         pushq   %r12
17         pushq   %r13
18 .Lprologue:
19         movq    %rsi,%r11
20         movq    %rdx,%r12
21         movq    %rcx,%r13
22         xorq    %r10,%r10
23         xorq    %rcx,%rcx
25         leaq    8(%rdi),%rdi
26         movb    -8(%rdi),%r10b
27         movb    -4(%rdi),%cl
28         cmpl    $-1,256(%rdi)
29         je      .LRC4_CHAR
30         movl    OPENSSL_ia32cap_P(%rip),%r8d
31         xorq    %rbx,%rbx
32         incb    %r10b
33         subq    %r10,%rbx
34         subq    %r12,%r13
35         movl    (%rdi,%r10,4),%eax
36         testq   $-16,%r11
37         jz      .Lloop1
38         btl     $30,%r8d
39         jc      .Lintel
40         andq    $7,%rbx
41         leaq    1(%r10),%rsi
42         jz      .Loop8
43         subq    %rbx,%r11
44 .Loop8_warmup:
45         addb    %al,%cl
46         movl    (%rdi,%rcx,4),%edx
47         movl    %eax,(%rdi,%rcx,4)
48         movl    %edx,(%rdi,%r10,4)
49         addb    %dl,%al
50         incb    %r10b
51         movl    (%rdi,%rax,4),%edx
52         movl    (%rdi,%r10,4),%eax
53         xorb    (%r12),%dl
54         movb    %dl,(%r12,%r13,1)
55         leaq    1(%r12),%r12
56         decq    %rbx
57         jnz     .Loop8_warmup
59         leaq    1(%r10),%rsi
60         jmp     .Loop8
61 .align  16
62 .Loop8:
63         addb    %al,%cl
64         movl    (%rdi,%rcx,4),%edx
65         movl    %eax,(%rdi,%rcx,4)
66         movl    0(%rdi,%rsi,4),%ebx
67         rorq    $8,%r8
68         movl    %edx,0(%rdi,%r10,4)
69         addb    %al,%dl
70         movb    (%rdi,%rdx,4),%r8b
71         addb    %bl,%cl
72         movl    (%rdi,%rcx,4),%edx
73         movl    %ebx,(%rdi,%rcx,4)
74         movl    4(%rdi,%rsi,4),%eax
75         rorq    $8,%r8
76         movl    %edx,4(%rdi,%r10,4)
77         addb    %bl,%dl
78         movb    (%rdi,%rdx,4),%r8b
79         addb    %al,%cl
80         movl    (%rdi,%rcx,4),%edx
81         movl    %eax,(%rdi,%rcx,4)
82         movl    8(%rdi,%rsi,4),%ebx
83         rorq    $8,%r8
84         movl    %edx,8(%rdi,%r10,4)
85         addb    %al,%dl
86         movb    (%rdi,%rdx,4),%r8b
87         addb    %bl,%cl
88         movl    (%rdi,%rcx,4),%edx
89         movl    %ebx,(%rdi,%rcx,4)
90         movl    12(%rdi,%rsi,4),%eax
91         rorq    $8,%r8
92         movl    %edx,12(%rdi,%r10,4)
93         addb    %bl,%dl
94         movb    (%rdi,%rdx,4),%r8b
95         addb    %al,%cl
96         movl    (%rdi,%rcx,4),%edx
97         movl    %eax,(%rdi,%rcx,4)
98         movl    16(%rdi,%rsi,4),%ebx
99         rorq    $8,%r8
100         movl    %edx,16(%rdi,%r10,4)
101         addb    %al,%dl
102         movb    (%rdi,%rdx,4),%r8b
103         addb    %bl,%cl
104         movl    (%rdi,%rcx,4),%edx
105         movl    %ebx,(%rdi,%rcx,4)
106         movl    20(%rdi,%rsi,4),%eax
107         rorq    $8,%r8
108         movl    %edx,20(%rdi,%r10,4)
109         addb    %bl,%dl
110         movb    (%rdi,%rdx,4),%r8b
111         addb    %al,%cl
112         movl    (%rdi,%rcx,4),%edx
113         movl    %eax,(%rdi,%rcx,4)
114         movl    24(%rdi,%rsi,4),%ebx
115         rorq    $8,%r8
116         movl    %edx,24(%rdi,%r10,4)
117         addb    %al,%dl
118         movb    (%rdi,%rdx,4),%r8b
119         addb    $8,%sil
120         addb    %bl,%cl
121         movl    (%rdi,%rcx,4),%edx
122         movl    %ebx,(%rdi,%rcx,4)
123         movl    -4(%rdi,%rsi,4),%eax
124         rorq    $8,%r8
125         movl    %edx,28(%rdi,%r10,4)
126         addb    %bl,%dl
127         movb    (%rdi,%rdx,4),%r8b
128         addb    $8,%r10b
129         rorq    $8,%r8
130         subq    $8,%r11
132         xorq    (%r12),%r8
133         movq    %r8,(%r12,%r13,1)
134         leaq    8(%r12),%r12
136         testq   $-8,%r11
137         jnz     .Loop8
138         cmpq    $0,%r11
139         jne     .Lloop1
140         jmp     .Lexit
142 .align  16
143 .Lintel:
144         testq   $-32,%r11
145         jz      .Lloop1
146         andq    $15,%rbx
147         jz      .Loop16_is_hot
148         subq    %rbx,%r11
149 .Loop16_warmup:
150         addb    %al,%cl
151         movl    (%rdi,%rcx,4),%edx
152         movl    %eax,(%rdi,%rcx,4)
153         movl    %edx,(%rdi,%r10,4)
154         addb    %dl,%al
155         incb    %r10b
156         movl    (%rdi,%rax,4),%edx
157         movl    (%rdi,%r10,4),%eax
158         xorb    (%r12),%dl
159         movb    %dl,(%r12,%r13,1)
160         leaq    1(%r12),%r12
161         decq    %rbx
162         jnz     .Loop16_warmup
164         movq    %rcx,%rbx
165         xorq    %rcx,%rcx
166         movb    %bl,%cl
168 .Loop16_is_hot:
169         leaq    (%rdi,%r10,4),%rsi
170         addb    %al,%cl
171         movl    (%rdi,%rcx,4),%edx
172         pxor    %xmm0,%xmm0
173         movl    %eax,(%rdi,%rcx,4)
174         addb    %dl,%al
175         movl    4(%rsi),%ebx
176         movzbl  %al,%eax
177         movl    %edx,0(%rsi)
178         addb    %bl,%cl
179         pinsrw  $0,(%rdi,%rax,4),%xmm0
180         jmp     .Loop16_enter
181 .align  16
182 .Loop16:
183         addb    %al,%cl
184         movl    (%rdi,%rcx,4),%edx
185         pxor    %xmm0,%xmm2
186         psllq   $8,%xmm1
187         pxor    %xmm0,%xmm0
188         movl    %eax,(%rdi,%rcx,4)
189         addb    %dl,%al
190         movl    4(%rsi),%ebx
191         movzbl  %al,%eax
192         movl    %edx,0(%rsi)
193         pxor    %xmm1,%xmm2
194         addb    %bl,%cl
195         pinsrw  $0,(%rdi,%rax,4),%xmm0
196         movdqu  %xmm2,(%r12,%r13,1)
197         leaq    16(%r12),%r12
198 .Loop16_enter:
199         movl    (%rdi,%rcx,4),%edx
200         pxor    %xmm1,%xmm1
201         movl    %ebx,(%rdi,%rcx,4)
202         addb    %dl,%bl
203         movl    8(%rsi),%eax
204         movzbl  %bl,%ebx
205         movl    %edx,4(%rsi)
206         addb    %al,%cl
207         pinsrw  $0,(%rdi,%rbx,4),%xmm1
208         movl    (%rdi,%rcx,4),%edx
209         movl    %eax,(%rdi,%rcx,4)
210         addb    %dl,%al
211         movl    12(%rsi),%ebx
212         movzbl  %al,%eax
213         movl    %edx,8(%rsi)
214         addb    %bl,%cl
215         pinsrw  $1,(%rdi,%rax,4),%xmm0
216         movl    (%rdi,%rcx,4),%edx
217         movl    %ebx,(%rdi,%rcx,4)
218         addb    %dl,%bl
219         movl    16(%rsi),%eax
220         movzbl  %bl,%ebx
221         movl    %edx,12(%rsi)
222         addb    %al,%cl
223         pinsrw  $1,(%rdi,%rbx,4),%xmm1
224         movl    (%rdi,%rcx,4),%edx
225         movl    %eax,(%rdi,%rcx,4)
226         addb    %dl,%al
227         movl    20(%rsi),%ebx
228         movzbl  %al,%eax
229         movl    %edx,16(%rsi)
230         addb    %bl,%cl
231         pinsrw  $2,(%rdi,%rax,4),%xmm0
232         movl    (%rdi,%rcx,4),%edx
233         movl    %ebx,(%rdi,%rcx,4)
234         addb    %dl,%bl
235         movl    24(%rsi),%eax
236         movzbl  %bl,%ebx
237         movl    %edx,20(%rsi)
238         addb    %al,%cl
239         pinsrw  $2,(%rdi,%rbx,4),%xmm1
240         movl    (%rdi,%rcx,4),%edx
241         movl    %eax,(%rdi,%rcx,4)
242         addb    %dl,%al
243         movl    28(%rsi),%ebx
244         movzbl  %al,%eax
245         movl    %edx,24(%rsi)
246         addb    %bl,%cl
247         pinsrw  $3,(%rdi,%rax,4),%xmm0
248         movl    (%rdi,%rcx,4),%edx
249         movl    %ebx,(%rdi,%rcx,4)
250         addb    %dl,%bl
251         movl    32(%rsi),%eax
252         movzbl  %bl,%ebx
253         movl    %edx,28(%rsi)
254         addb    %al,%cl
255         pinsrw  $3,(%rdi,%rbx,4),%xmm1
256         movl    (%rdi,%rcx,4),%edx
257         movl    %eax,(%rdi,%rcx,4)
258         addb    %dl,%al
259         movl    36(%rsi),%ebx
260         movzbl  %al,%eax
261         movl    %edx,32(%rsi)
262         addb    %bl,%cl
263         pinsrw  $4,(%rdi,%rax,4),%xmm0
264         movl    (%rdi,%rcx,4),%edx
265         movl    %ebx,(%rdi,%rcx,4)
266         addb    %dl,%bl
267         movl    40(%rsi),%eax
268         movzbl  %bl,%ebx
269         movl    %edx,36(%rsi)
270         addb    %al,%cl
271         pinsrw  $4,(%rdi,%rbx,4),%xmm1
272         movl    (%rdi,%rcx,4),%edx
273         movl    %eax,(%rdi,%rcx,4)
274         addb    %dl,%al
275         movl    44(%rsi),%ebx
276         movzbl  %al,%eax
277         movl    %edx,40(%rsi)
278         addb    %bl,%cl
279         pinsrw  $5,(%rdi,%rax,4),%xmm0
280         movl    (%rdi,%rcx,4),%edx
281         movl    %ebx,(%rdi,%rcx,4)
282         addb    %dl,%bl
283         movl    48(%rsi),%eax
284         movzbl  %bl,%ebx
285         movl    %edx,44(%rsi)
286         addb    %al,%cl
287         pinsrw  $5,(%rdi,%rbx,4),%xmm1
288         movl    (%rdi,%rcx,4),%edx
289         movl    %eax,(%rdi,%rcx,4)
290         addb    %dl,%al
291         movl    52(%rsi),%ebx
292         movzbl  %al,%eax
293         movl    %edx,48(%rsi)
294         addb    %bl,%cl
295         pinsrw  $6,(%rdi,%rax,4),%xmm0
296         movl    (%rdi,%rcx,4),%edx
297         movl    %ebx,(%rdi,%rcx,4)
298         addb    %dl,%bl
299         movl    56(%rsi),%eax
300         movzbl  %bl,%ebx
301         movl    %edx,52(%rsi)
302         addb    %al,%cl
303         pinsrw  $6,(%rdi,%rbx,4),%xmm1
304         movl    (%rdi,%rcx,4),%edx
305         movl    %eax,(%rdi,%rcx,4)
306         addb    %dl,%al
307         movl    60(%rsi),%ebx
308         movzbl  %al,%eax
309         movl    %edx,56(%rsi)
310         addb    %bl,%cl
311         pinsrw  $7,(%rdi,%rax,4),%xmm0
312         addb    $16,%r10b
313         movdqu  (%r12),%xmm2
314         movl    (%rdi,%rcx,4),%edx
315         movl    %ebx,(%rdi,%rcx,4)
316         addb    %dl,%bl
317         movzbl  %bl,%ebx
318         movl    %edx,60(%rsi)
319         leaq    (%rdi,%r10,4),%rsi
320         pinsrw  $7,(%rdi,%rbx,4),%xmm1
321         movl    (%rsi),%eax
322         movq    %rcx,%rbx
323         xorq    %rcx,%rcx
324         subq    $16,%r11
325         movb    %bl,%cl
326         testq   $-16,%r11
327         jnz     .Loop16
329         psllq   $8,%xmm1
330         pxor    %xmm0,%xmm2
331         pxor    %xmm1,%xmm2
332         movdqu  %xmm2,(%r12,%r13,1)
333         leaq    16(%r12),%r12
335         cmpq    $0,%r11
336         jne     .Lloop1
337         jmp     .Lexit
339 .align  16
340 .Lloop1:
341         addb    %al,%cl
342         movl    (%rdi,%rcx,4),%edx
343         movl    %eax,(%rdi,%rcx,4)
344         movl    %edx,(%rdi,%r10,4)
345         addb    %dl,%al
346         incb    %r10b
347         movl    (%rdi,%rax,4),%edx
348         movl    (%rdi,%r10,4),%eax
349         xorb    (%r12),%dl
350         movb    %dl,(%r12,%r13,1)
351         leaq    1(%r12),%r12
352         decq    %r11
353         jnz     .Lloop1
354         jmp     .Lexit
356 .align  16
357 .LRC4_CHAR:
358         addb    $1,%r10b
359         movzbl  (%rdi,%r10,1),%eax
360         testq   $-8,%r11
361         jz      .Lcloop1
362         jmp     .Lcloop8
363 .align  16
364 .Lcloop8:
365         movl    (%r12),%r8d
366         movl    4(%r12),%r9d
367         addb    %al,%cl
368         leaq    1(%r10),%rsi
369         movzbl  (%rdi,%rcx,1),%edx
370         movzbl  %sil,%esi
371         movzbl  (%rdi,%rsi,1),%ebx
372         movb    %al,(%rdi,%rcx,1)
373         cmpq    %rsi,%rcx
374         movb    %dl,(%rdi,%r10,1)
375         jne     .Lcmov0
376         movq    %rax,%rbx
377 .Lcmov0:
378         addb    %al,%dl
379         xorb    (%rdi,%rdx,1),%r8b
380         rorl    $8,%r8d
381         addb    %bl,%cl
382         leaq    1(%rsi),%r10
383         movzbl  (%rdi,%rcx,1),%edx
384         movzbl  %r10b,%r10d
385         movzbl  (%rdi,%r10,1),%eax
386         movb    %bl,(%rdi,%rcx,1)
387         cmpq    %r10,%rcx
388         movb    %dl,(%rdi,%rsi,1)
389         jne     .Lcmov1
390         movq    %rbx,%rax
391 .Lcmov1:
392         addb    %bl,%dl
393         xorb    (%rdi,%rdx,1),%r8b
394         rorl    $8,%r8d
395         addb    %al,%cl
396         leaq    1(%r10),%rsi
397         movzbl  (%rdi,%rcx,1),%edx
398         movzbl  %sil,%esi
399         movzbl  (%rdi,%rsi,1),%ebx
400         movb    %al,(%rdi,%rcx,1)
401         cmpq    %rsi,%rcx
402         movb    %dl,(%rdi,%r10,1)
403         jne     .Lcmov2
404         movq    %rax,%rbx
405 .Lcmov2:
406         addb    %al,%dl
407         xorb    (%rdi,%rdx,1),%r8b
408         rorl    $8,%r8d
409         addb    %bl,%cl
410         leaq    1(%rsi),%r10
411         movzbl  (%rdi,%rcx,1),%edx
412         movzbl  %r10b,%r10d
413         movzbl  (%rdi,%r10,1),%eax
414         movb    %bl,(%rdi,%rcx,1)
415         cmpq    %r10,%rcx
416         movb    %dl,(%rdi,%rsi,1)
417         jne     .Lcmov3
418         movq    %rbx,%rax
419 .Lcmov3:
420         addb    %bl,%dl
421         xorb    (%rdi,%rdx,1),%r8b
422         rorl    $8,%r8d
423         addb    %al,%cl
424         leaq    1(%r10),%rsi
425         movzbl  (%rdi,%rcx,1),%edx
426         movzbl  %sil,%esi
427         movzbl  (%rdi,%rsi,1),%ebx
428         movb    %al,(%rdi,%rcx,1)
429         cmpq    %rsi,%rcx
430         movb    %dl,(%rdi,%r10,1)
431         jne     .Lcmov4
432         movq    %rax,%rbx
433 .Lcmov4:
434         addb    %al,%dl
435         xorb    (%rdi,%rdx,1),%r9b
436         rorl    $8,%r9d
437         addb    %bl,%cl
438         leaq    1(%rsi),%r10
439         movzbl  (%rdi,%rcx,1),%edx
440         movzbl  %r10b,%r10d
441         movzbl  (%rdi,%r10,1),%eax
442         movb    %bl,(%rdi,%rcx,1)
443         cmpq    %r10,%rcx
444         movb    %dl,(%rdi,%rsi,1)
445         jne     .Lcmov5
446         movq    %rbx,%rax
447 .Lcmov5:
448         addb    %bl,%dl
449         xorb    (%rdi,%rdx,1),%r9b
450         rorl    $8,%r9d
451         addb    %al,%cl
452         leaq    1(%r10),%rsi
453         movzbl  (%rdi,%rcx,1),%edx
454         movzbl  %sil,%esi
455         movzbl  (%rdi,%rsi,1),%ebx
456         movb    %al,(%rdi,%rcx,1)
457         cmpq    %rsi,%rcx
458         movb    %dl,(%rdi,%r10,1)
459         jne     .Lcmov6
460         movq    %rax,%rbx
461 .Lcmov6:
462         addb    %al,%dl
463         xorb    (%rdi,%rdx,1),%r9b
464         rorl    $8,%r9d
465         addb    %bl,%cl
466         leaq    1(%rsi),%r10
467         movzbl  (%rdi,%rcx,1),%edx
468         movzbl  %r10b,%r10d
469         movzbl  (%rdi,%r10,1),%eax
470         movb    %bl,(%rdi,%rcx,1)
471         cmpq    %r10,%rcx
472         movb    %dl,(%rdi,%rsi,1)
473         jne     .Lcmov7
474         movq    %rbx,%rax
475 .Lcmov7:
476         addb    %bl,%dl
477         xorb    (%rdi,%rdx,1),%r9b
478         rorl    $8,%r9d
479         leaq    -8(%r11),%r11
480         movl    %r8d,(%r13)
481         leaq    8(%r12),%r12
482         movl    %r9d,4(%r13)
483         leaq    8(%r13),%r13
485         testq   $-8,%r11
486         jnz     .Lcloop8
487         cmpq    $0,%r11
488         jne     .Lcloop1
489         jmp     .Lexit
490 .align  16
491 .Lcloop1:
492         addb    %al,%cl
493         movzbl  %cl,%ecx
494         movzbl  (%rdi,%rcx,1),%edx
495         movb    %al,(%rdi,%rcx,1)
496         movb    %dl,(%rdi,%r10,1)
497         addb    %al,%dl
498         addb    $1,%r10b
499         movzbl  %dl,%edx
500         movzbl  %r10b,%r10d
501         movzbl  (%rdi,%rdx,1),%edx
502         movzbl  (%rdi,%r10,1),%eax
503         xorb    (%r12),%dl
504         leaq    1(%r12),%r12
505         movb    %dl,(%r13)
506         leaq    1(%r13),%r13
507         subq    $1,%r11
508         jnz     .Lcloop1
509         jmp     .Lexit
511 .align  16
512 .Lexit:
513         subb    $1,%r10b
514         movl    %r10d,-8(%rdi)
515         movl    %ecx,-4(%rdi)
517         movq    (%rsp),%r13
518         movq    8(%rsp),%r12
519         movq    16(%rsp),%rbx
520         addq    $24,%rsp
521 .Lepilogue:
522         .byte   0xf3,0xc3
523 .size   asm_RC4,.-asm_RC4
524 .globl  asm_RC4_set_key
525 .hidden asm_RC4_set_key
526 .type   asm_RC4_set_key,@function
527 .align  16
528 asm_RC4_set_key:
529         leaq    8(%rdi),%rdi
530         leaq    (%rdx,%rsi,1),%rdx
531         negq    %rsi
532         movq    %rsi,%rcx
533         xorl    %eax,%eax
534         xorq    %r9,%r9
535         xorq    %r10,%r10
536         xorq    %r11,%r11
538         movl    OPENSSL_ia32cap_P(%rip),%r8d
539         btl     $20,%r8d
540         jc      .Lc1stloop
541         jmp     .Lw1stloop
543 .align  16
544 .Lw1stloop:
545         movl    %eax,(%rdi,%rax,4)
546         addb    $1,%al
547         jnc     .Lw1stloop
549         xorq    %r9,%r9
550         xorq    %r8,%r8
551 .align  16
552 .Lw2ndloop:
553         movl    (%rdi,%r9,4),%r10d
554         addb    (%rdx,%rsi,1),%r8b
555         addb    %r10b,%r8b
556         addq    $1,%rsi
557         movl    (%rdi,%r8,4),%r11d
558         cmovzq  %rcx,%rsi
559         movl    %r10d,(%rdi,%r8,4)
560         movl    %r11d,(%rdi,%r9,4)
561         addb    $1,%r9b
562         jnc     .Lw2ndloop
563         jmp     .Lexit_key
565 .align  16
566 .Lc1stloop:
567         movb    %al,(%rdi,%rax,1)
568         addb    $1,%al
569         jnc     .Lc1stloop
571         xorq    %r9,%r9
572         xorq    %r8,%r8
573 .align  16
574 .Lc2ndloop:
575         movb    (%rdi,%r9,1),%r10b
576         addb    (%rdx,%rsi,1),%r8b
577         addb    %r10b,%r8b
578         addq    $1,%rsi
579         movb    (%rdi,%r8,1),%r11b
580         jnz     .Lcnowrap
581         movq    %rcx,%rsi
582 .Lcnowrap:
583         movb    %r10b,(%rdi,%r8,1)
584         movb    %r11b,(%rdi,%r9,1)
585         addb    $1,%r9b
586         jnc     .Lc2ndloop
587         movl    $-1,256(%rdi)
589 .align  16
590 .Lexit_key:
591         xorl    %eax,%eax
592         movl    %eax,-8(%rdi)
593         movl    %eax,-4(%rdi)
594         .byte   0xf3,0xc3
595 .size   asm_RC4_set_key,.-asm_RC4_set_key
596 #endif