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