Utilize the optimized SHA functions in Padlock HMAC.
[gnutls:gnutls.git] / lib / accelerated / x86 / macosx / padlock-x86-64-macosx.s
1 /*
2 # Copyright (c) 2011-2012, Andy Polyakov <appro@openssl.org>
3 # All rights reserved.
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
7 # are met:
8
9 #     * Redistributions of source code must retain copyright notices,
10 #      this list of conditions and the following disclaimer.
11 #
12 #     * Redistributions in binary form must reproduce the above
13 #      copyright notice, this list of conditions and the following
14 #      disclaimer in the documentation and/or other materials
15 #      provided with the distribution.
16 #
17 #     * Neither the name of the Andy Polyakov nor the names of its
18 #      copyright holder and contributors may be used to endorse or
19 #      promote products derived from this software without specific
20 #      prior written permission.
21 #
22 # ALTERNATIVELY, provided that this notice is retained in full, this
23 # product may be distributed under the terms of the GNU General Public
24 # License (GPL), in which case the provisions of the GPL apply INSTEAD OF
25 # those given above.
26 #
27 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS
28 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
29 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
30 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
31 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
32 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
33 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 #
39 # *** This file is auto-generated ***
40 #
41 */
42 .text   
43 .globl  _padlock_capability
44
45 .p2align        4
46 _padlock_capability:
47         movq    %rbx,%r8
48         xorl    %eax,%eax
49         cpuid
50         xorl    %eax,%eax
51         cmpl    $1953391939,%ebx
52         jne     L$noluck
53         cmpl    $1215460705,%edx
54         jne     L$noluck
55         cmpl    $1936487777,%ecx
56         jne     L$noluck
57         movl    $3221225472,%eax
58         cpuid
59         movl    %eax,%edx
60         xorl    %eax,%eax
61         cmpl    $3221225473,%edx
62         jb      L$noluck
63         movl    $3221225473,%eax
64         cpuid
65         movl    %edx,%eax
66         andl    $4294967279,%eax
67         orl     $16,%eax
68 L$noluck:
69         movq    %r8,%rbx
70         .byte   0xf3,0xc3
71
72
73 .globl  _padlock_key_bswap
74
75 .p2align        4
76 _padlock_key_bswap:
77         movl    240(%rdi),%edx
78 L$bswap_loop:
79         movl    (%rdi),%eax
80         bswapl  %eax
81         movl    %eax,(%rdi)
82         leaq    4(%rdi),%rdi
83         subl    $1,%edx
84         jnz     L$bswap_loop
85         .byte   0xf3,0xc3
86
87
88 .globl  _padlock_verify_context
89
90 .p2align        4
91 _padlock_verify_context:
92         movq    %rdi,%rdx
93         pushf
94         leaq    L$padlock_saved_context(%rip),%rax
95         call    _padlock_verify_ctx
96         leaq    8(%rsp),%rsp
97         .byte   0xf3,0xc3
98
99
100
101 .p2align        4
102 _padlock_verify_ctx:
103         movq    8(%rsp),%r8
104         btq     $30,%r8
105         jnc     L$verified
106         cmpq    (%rax),%rdx
107         je      L$verified
108         pushf
109         popf
110 L$verified:
111         movq    %rdx,(%rax)
112         .byte   0xf3,0xc3
113
114
115 .globl  _padlock_reload_key
116
117 .p2align        4
118 _padlock_reload_key:
119         pushf
120         popf
121         .byte   0xf3,0xc3
122
123
124 .globl  _padlock_aes_block
125
126 .p2align        4
127 _padlock_aes_block:
128         movq    %rbx,%r8
129         movq    $1,%rcx
130         leaq    32(%rdx),%rbx
131         leaq    16(%rdx),%rdx
132 .byte   0xf3,0x0f,0xa7,0xc8     
133         movq    %r8,%rbx
134         .byte   0xf3,0xc3
135
136
137 .globl  _padlock_xstore
138
139 .p2align        4
140 _padlock_xstore:
141         movl    %esi,%edx
142 .byte   0x0f,0xa7,0xc0          
143         .byte   0xf3,0xc3
144
145
146 .globl  _padlock_sha1_oneshot
147
148 .p2align        4
149 _padlock_sha1_oneshot:
150         movq    %rdx,%rcx
151         movq    %rdi,%rdx
152         movups  (%rdi),%xmm0
153         subq    $128+8,%rsp
154         movl    16(%rdi),%eax
155         movaps  %xmm0,(%rsp)
156         movq    %rsp,%rdi
157         movl    %eax,16(%rsp)
158         xorq    %rax,%rax
159 .byte   0xf3,0x0f,0xa6,0xc8     
160         movaps  (%rsp),%xmm0
161         movl    16(%rsp),%eax
162         addq    $128+8,%rsp
163         movups  %xmm0,(%rdx)
164         movl    %eax,16(%rdx)
165         .byte   0xf3,0xc3
166
167
168 .globl  _padlock_sha1_blocks
169
170 .p2align        4
171 _padlock_sha1_blocks:
172         movq    %rdx,%rcx
173         movq    %rdi,%rdx
174         movups  (%rdi),%xmm0
175         subq    $128+8,%rsp
176         movl    16(%rdi),%eax
177         movaps  %xmm0,(%rsp)
178         movq    %rsp,%rdi
179         movl    %eax,16(%rsp)
180         movq    $-1,%rax
181 .byte   0xf3,0x0f,0xa6,0xc8     
182         movaps  (%rsp),%xmm0
183         movl    16(%rsp),%eax
184         addq    $128+8,%rsp
185         movups  %xmm0,(%rdx)
186         movl    %eax,16(%rdx)
187         .byte   0xf3,0xc3
188
189
190 .globl  _padlock_sha256_oneshot
191
192 .p2align        4
193 _padlock_sha256_oneshot:
194         movq    %rdx,%rcx
195         movq    %rdi,%rdx
196         movups  (%rdi),%xmm0
197         subq    $128+8,%rsp
198         movups  16(%rdi),%xmm1
199         movaps  %xmm0,(%rsp)
200         movq    %rsp,%rdi
201         movaps  %xmm1,16(%rsp)
202         xorq    %rax,%rax
203 .byte   0xf3,0x0f,0xa6,0xd0     
204         movaps  (%rsp),%xmm0
205         movaps  16(%rsp),%xmm1
206         addq    $128+8,%rsp
207         movups  %xmm0,(%rdx)
208         movups  %xmm1,16(%rdx)
209         .byte   0xf3,0xc3
210
211
212 .globl  _padlock_sha256_blocks
213
214 .p2align        4
215 _padlock_sha256_blocks:
216         movq    %rdx,%rcx
217         movq    %rdi,%rdx
218         movups  (%rdi),%xmm0
219         subq    $128+8,%rsp
220         movups  16(%rdi),%xmm1
221         movaps  %xmm0,(%rsp)
222         movq    %rsp,%rdi
223         movaps  %xmm1,16(%rsp)
224         movq    $-1,%rax
225 .byte   0xf3,0x0f,0xa6,0xd0     
226         movaps  (%rsp),%xmm0
227         movaps  16(%rsp),%xmm1
228         addq    $128+8,%rsp
229         movups  %xmm0,(%rdx)
230         movups  %xmm1,16(%rdx)
231         .byte   0xf3,0xc3
232
233
234 .globl  _padlock_sha512_blocks
235
236 .p2align        4
237 _padlock_sha512_blocks:
238         movq    %rdx,%rcx
239         movq    %rdi,%rdx
240         movups  (%rdi),%xmm0
241         subq    $128+8,%rsp
242         movups  16(%rdi),%xmm1
243         movups  32(%rdi),%xmm2
244         movups  48(%rdi),%xmm3
245         movaps  %xmm0,(%rsp)
246         movq    %rsp,%rdi
247         movaps  %xmm1,16(%rsp)
248         movaps  %xmm2,32(%rsp)
249         movaps  %xmm3,48(%rsp)
250 .byte   0xf3,0x0f,0xa6,0xe0     
251         movaps  (%rsp),%xmm0
252         movaps  16(%rsp),%xmm1
253         movaps  32(%rsp),%xmm2
254         movaps  48(%rsp),%xmm3
255         addq    $128+8,%rsp
256         movups  %xmm0,(%rdx)
257         movups  %xmm1,16(%rdx)
258         movups  %xmm2,32(%rdx)
259         movups  %xmm3,48(%rdx)
260         .byte   0xf3,0xc3
261
262 .globl  _padlock_ecb_encrypt
263
264 .p2align        4
265 _padlock_ecb_encrypt:
266         pushq   %rbp
267         pushq   %rbx
268
269         xorl    %eax,%eax
270         testq   $15,%rdx
271         jnz     L$ecb_abort
272         testq   $15,%rcx
273         jnz     L$ecb_abort
274         leaq    L$padlock_saved_context(%rip),%rax
275         pushf
276         cld
277         call    _padlock_verify_ctx
278         leaq    16(%rdx),%rdx
279         xorl    %eax,%eax
280         xorl    %ebx,%ebx
281         testl   $32,(%rdx)
282         jnz     L$ecb_aligned
283         testq   $15,%rdi
284         setz    %al
285         testq   $15,%rsi
286         setz    %bl
287         testl   %ebx,%eax
288         jnz     L$ecb_aligned
289         negq    %rax
290         movq    $512,%rbx
291         notq    %rax
292         leaq    (%rsp),%rbp
293         cmpq    %rbx,%rcx
294         cmovcq  %rcx,%rbx
295         andq    %rbx,%rax
296         movq    %rcx,%rbx
297         negq    %rax
298         andq    $512-1,%rbx
299         leaq    (%rax,%rbp,1),%rsp
300         movq    $512,%rax
301         cmovzq  %rax,%rbx
302         cmpq    %rbx,%rcx
303         ja      L$ecb_loop
304         movq    %rsi,%rax
305         cmpq    %rsp,%rbp
306         cmoveq  %rdi,%rax
307         addq    %rcx,%rax
308         negq    %rax
309         andq    $4095,%rax
310         cmpq    $128,%rax
311         movq    $-128,%rax
312         cmovaeq %rbx,%rax
313         andq    %rax,%rbx
314         jz      L$ecb_unaligned_tail
315         jmp     L$ecb_loop
316 .p2align        4
317 L$ecb_loop:
318         cmpq    %rcx,%rbx
319         cmovaq  %rcx,%rbx
320         movq    %rdi,%r8
321         movq    %rsi,%r9
322         movq    %rcx,%r10
323         movq    %rbx,%rcx
324         movq    %rbx,%r11
325         testq   $15,%rdi
326         cmovnzq %rsp,%rdi
327         testq   $15,%rsi
328         jz      L$ecb_inp_aligned
329         shrq    $3,%rcx
330 .byte   0xf3,0x48,0xa5          
331         subq    %rbx,%rdi
332         movq    %rbx,%rcx
333         movq    %rdi,%rsi
334 L$ecb_inp_aligned:
335         leaq    -16(%rdx),%rax
336         leaq    16(%rdx),%rbx
337         shrq    $4,%rcx
338 .byte   0xf3,0x0f,0xa7,200      
339         movq    %r8,%rdi
340         movq    %r11,%rbx
341         testq   $15,%rdi
342         jz      L$ecb_out_aligned
343         movq    %rbx,%rcx
344         leaq    (%rsp),%rsi
345         shrq    $3,%rcx
346 .byte   0xf3,0x48,0xa5          
347         subq    %rbx,%rdi
348 L$ecb_out_aligned:
349         movq    %r9,%rsi
350         movq    %r10,%rcx
351         addq    %rbx,%rdi
352         addq    %rbx,%rsi
353         subq    %rbx,%rcx
354         movq    $512,%rbx
355         jz      L$ecb_break
356         cmpq    %rbx,%rcx
357         jae     L$ecb_loop
358 L$ecb_unaligned_tail:
359         xorl    %eax,%eax
360         cmpq    %rsp,%rbp
361         cmoveq  %rcx,%rax
362         movq    %rdi,%r8
363         movq    %rcx,%rbx
364         subq    %rax,%rsp
365         shrq    $3,%rcx
366         leaq    (%rsp),%rdi
367 .byte   0xf3,0x48,0xa5          
368         movq    %rsp,%rsi
369         movq    %r8,%rdi
370         movq    %rbx,%rcx
371         jmp     L$ecb_loop
372 .p2align        4
373 L$ecb_break:
374         cmpq    %rbp,%rsp
375         je      L$ecb_done
376
377         pxor    %xmm0,%xmm0
378         leaq    (%rsp),%rax
379 L$ecb_bzero:
380         movaps  %xmm0,(%rax)
381         leaq    16(%rax),%rax
382         cmpq    %rax,%rbp
383         ja      L$ecb_bzero
384
385 L$ecb_done:
386         leaq    (%rbp),%rsp
387         jmp     L$ecb_exit
388
389 .p2align        4
390 L$ecb_aligned:
391         leaq    (%rsi,%rcx,1),%rbp
392         negq    %rbp
393         andq    $4095,%rbp
394         xorl    %eax,%eax
395         cmpq    $128,%rbp
396         movq    $128-1,%rbp
397         cmovaeq %rax,%rbp
398         andq    %rcx,%rbp
399         subq    %rbp,%rcx
400         jz      L$ecb_aligned_tail
401         leaq    -16(%rdx),%rax
402         leaq    16(%rdx),%rbx
403         shrq    $4,%rcx
404 .byte   0xf3,0x0f,0xa7,200      
405         testq   %rbp,%rbp
406         jz      L$ecb_exit
407
408 L$ecb_aligned_tail:
409         movq    %rdi,%r8
410         movq    %rbp,%rbx
411         movq    %rbp,%rcx
412         leaq    (%rsp),%rbp
413         subq    %rcx,%rsp
414         shrq    $3,%rcx
415         leaq    (%rsp),%rdi
416 .byte   0xf3,0x48,0xa5          
417         leaq    (%r8),%rdi
418         leaq    (%rsp),%rsi
419         movq    %rbx,%rcx
420         jmp     L$ecb_loop
421 L$ecb_exit:
422         movl    $1,%eax
423         leaq    8(%rsp),%rsp
424 L$ecb_abort:
425         popq    %rbx
426         popq    %rbp
427         .byte   0xf3,0xc3
428
429 .globl  _padlock_cbc_encrypt
430
431 .p2align        4
432 _padlock_cbc_encrypt:
433         pushq   %rbp
434         pushq   %rbx
435
436         xorl    %eax,%eax
437         testq   $15,%rdx
438         jnz     L$cbc_abort
439         testq   $15,%rcx
440         jnz     L$cbc_abort
441         leaq    L$padlock_saved_context(%rip),%rax
442         pushf
443         cld
444         call    _padlock_verify_ctx
445         leaq    16(%rdx),%rdx
446         xorl    %eax,%eax
447         xorl    %ebx,%ebx
448         testl   $32,(%rdx)
449         jnz     L$cbc_aligned
450         testq   $15,%rdi
451         setz    %al
452         testq   $15,%rsi
453         setz    %bl
454         testl   %ebx,%eax
455         jnz     L$cbc_aligned
456         negq    %rax
457         movq    $512,%rbx
458         notq    %rax
459         leaq    (%rsp),%rbp
460         cmpq    %rbx,%rcx
461         cmovcq  %rcx,%rbx
462         andq    %rbx,%rax
463         movq    %rcx,%rbx
464         negq    %rax
465         andq    $512-1,%rbx
466         leaq    (%rax,%rbp,1),%rsp
467         movq    $512,%rax
468         cmovzq  %rax,%rbx
469         cmpq    %rbx,%rcx
470         ja      L$cbc_loop
471         movq    %rsi,%rax
472         cmpq    %rsp,%rbp
473         cmoveq  %rdi,%rax
474         addq    %rcx,%rax
475         negq    %rax
476         andq    $4095,%rax
477         cmpq    $64,%rax
478         movq    $-64,%rax
479         cmovaeq %rbx,%rax
480         andq    %rax,%rbx
481         jz      L$cbc_unaligned_tail
482         jmp     L$cbc_loop
483 .p2align        4
484 L$cbc_loop:
485         cmpq    %rcx,%rbx
486         cmovaq  %rcx,%rbx
487         movq    %rdi,%r8
488         movq    %rsi,%r9
489         movq    %rcx,%r10
490         movq    %rbx,%rcx
491         movq    %rbx,%r11
492         testq   $15,%rdi
493         cmovnzq %rsp,%rdi
494         testq   $15,%rsi
495         jz      L$cbc_inp_aligned
496         shrq    $3,%rcx
497 .byte   0xf3,0x48,0xa5          
498         subq    %rbx,%rdi
499         movq    %rbx,%rcx
500         movq    %rdi,%rsi
501 L$cbc_inp_aligned:
502         leaq    -16(%rdx),%rax
503         leaq    16(%rdx),%rbx
504         shrq    $4,%rcx
505 .byte   0xf3,0x0f,0xa7,208      
506         movdqa  (%rax),%xmm0
507         movdqa  %xmm0,-16(%rdx)
508         movq    %r8,%rdi
509         movq    %r11,%rbx
510         testq   $15,%rdi
511         jz      L$cbc_out_aligned
512         movq    %rbx,%rcx
513         leaq    (%rsp),%rsi
514         shrq    $3,%rcx
515 .byte   0xf3,0x48,0xa5          
516         subq    %rbx,%rdi
517 L$cbc_out_aligned:
518         movq    %r9,%rsi
519         movq    %r10,%rcx
520         addq    %rbx,%rdi
521         addq    %rbx,%rsi
522         subq    %rbx,%rcx
523         movq    $512,%rbx
524         jz      L$cbc_break
525         cmpq    %rbx,%rcx
526         jae     L$cbc_loop
527 L$cbc_unaligned_tail:
528         xorl    %eax,%eax
529         cmpq    %rsp,%rbp
530         cmoveq  %rcx,%rax
531         movq    %rdi,%r8
532         movq    %rcx,%rbx
533         subq    %rax,%rsp
534         shrq    $3,%rcx
535         leaq    (%rsp),%rdi
536 .byte   0xf3,0x48,0xa5          
537         movq    %rsp,%rsi
538         movq    %r8,%rdi
539         movq    %rbx,%rcx
540         jmp     L$cbc_loop
541 .p2align        4
542 L$cbc_break:
543         cmpq    %rbp,%rsp
544         je      L$cbc_done
545
546         pxor    %xmm0,%xmm0
547         leaq    (%rsp),%rax
548 L$cbc_bzero:
549         movaps  %xmm0,(%rax)
550         leaq    16(%rax),%rax
551         cmpq    %rax,%rbp
552         ja      L$cbc_bzero
553
554 L$cbc_done:
555         leaq    (%rbp),%rsp
556         jmp     L$cbc_exit
557
558 .p2align        4
559 L$cbc_aligned:
560         leaq    (%rsi,%rcx,1),%rbp
561         negq    %rbp
562         andq    $4095,%rbp
563         xorl    %eax,%eax
564         cmpq    $64,%rbp
565         movq    $64-1,%rbp
566         cmovaeq %rax,%rbp
567         andq    %rcx,%rbp
568         subq    %rbp,%rcx
569         jz      L$cbc_aligned_tail
570         leaq    -16(%rdx),%rax
571         leaq    16(%rdx),%rbx
572         shrq    $4,%rcx
573 .byte   0xf3,0x0f,0xa7,208      
574         movdqa  (%rax),%xmm0
575         movdqa  %xmm0,-16(%rdx)
576         testq   %rbp,%rbp
577         jz      L$cbc_exit
578
579 L$cbc_aligned_tail:
580         movq    %rdi,%r8
581         movq    %rbp,%rbx
582         movq    %rbp,%rcx
583         leaq    (%rsp),%rbp
584         subq    %rcx,%rsp
585         shrq    $3,%rcx
586         leaq    (%rsp),%rdi
587 .byte   0xf3,0x48,0xa5          
588         leaq    (%r8),%rdi
589         leaq    (%rsp),%rsi
590         movq    %rbx,%rcx
591         jmp     L$cbc_loop
592 L$cbc_exit:
593         movl    $1,%eax
594         leaq    8(%rsp),%rsp
595 L$cbc_abort:
596         popq    %rbx
597         popq    %rbp
598         .byte   0xf3,0xc3
599
600 .globl  _padlock_cfb_encrypt
601
602 .p2align        4
603 _padlock_cfb_encrypt:
604         pushq   %rbp
605         pushq   %rbx
606
607         xorl    %eax,%eax
608         testq   $15,%rdx
609         jnz     L$cfb_abort
610         testq   $15,%rcx
611         jnz     L$cfb_abort
612         leaq    L$padlock_saved_context(%rip),%rax
613         pushf
614         cld
615         call    _padlock_verify_ctx
616         leaq    16(%rdx),%rdx
617         xorl    %eax,%eax
618         xorl    %ebx,%ebx
619         testl   $32,(%rdx)
620         jnz     L$cfb_aligned
621         testq   $15,%rdi
622         setz    %al
623         testq   $15,%rsi
624         setz    %bl
625         testl   %ebx,%eax
626         jnz     L$cfb_aligned
627         negq    %rax
628         movq    $512,%rbx
629         notq    %rax
630         leaq    (%rsp),%rbp
631         cmpq    %rbx,%rcx
632         cmovcq  %rcx,%rbx
633         andq    %rbx,%rax
634         movq    %rcx,%rbx
635         negq    %rax
636         andq    $512-1,%rbx
637         leaq    (%rax,%rbp,1),%rsp
638         movq    $512,%rax
639         cmovzq  %rax,%rbx
640         jmp     L$cfb_loop
641 .p2align        4
642 L$cfb_loop:
643         cmpq    %rcx,%rbx
644         cmovaq  %rcx,%rbx
645         movq    %rdi,%r8
646         movq    %rsi,%r9
647         movq    %rcx,%r10
648         movq    %rbx,%rcx
649         movq    %rbx,%r11
650         testq   $15,%rdi
651         cmovnzq %rsp,%rdi
652         testq   $15,%rsi
653         jz      L$cfb_inp_aligned
654         shrq    $3,%rcx
655 .byte   0xf3,0x48,0xa5          
656         subq    %rbx,%rdi
657         movq    %rbx,%rcx
658         movq    %rdi,%rsi
659 L$cfb_inp_aligned:
660         leaq    -16(%rdx),%rax
661         leaq    16(%rdx),%rbx
662         shrq    $4,%rcx
663 .byte   0xf3,0x0f,0xa7,224      
664         movdqa  (%rax),%xmm0
665         movdqa  %xmm0,-16(%rdx)
666         movq    %r8,%rdi
667         movq    %r11,%rbx
668         testq   $15,%rdi
669         jz      L$cfb_out_aligned
670         movq    %rbx,%rcx
671         leaq    (%rsp),%rsi
672         shrq    $3,%rcx
673 .byte   0xf3,0x48,0xa5          
674         subq    %rbx,%rdi
675 L$cfb_out_aligned:
676         movq    %r9,%rsi
677         movq    %r10,%rcx
678         addq    %rbx,%rdi
679         addq    %rbx,%rsi
680         subq    %rbx,%rcx
681         movq    $512,%rbx
682         jnz     L$cfb_loop
683         cmpq    %rbp,%rsp
684         je      L$cfb_done
685
686         pxor    %xmm0,%xmm0
687         leaq    (%rsp),%rax
688 L$cfb_bzero:
689         movaps  %xmm0,(%rax)
690         leaq    16(%rax),%rax
691         cmpq    %rax,%rbp
692         ja      L$cfb_bzero
693
694 L$cfb_done:
695         leaq    (%rbp),%rsp
696         jmp     L$cfb_exit
697
698 .p2align        4
699 L$cfb_aligned:
700         leaq    -16(%rdx),%rax
701         leaq    16(%rdx),%rbx
702         shrq    $4,%rcx
703 .byte   0xf3,0x0f,0xa7,224      
704         movdqa  (%rax),%xmm0
705         movdqa  %xmm0,-16(%rdx)
706 L$cfb_exit:
707         movl    $1,%eax
708         leaq    8(%rsp),%rsp
709 L$cfb_abort:
710         popq    %rbx
711         popq    %rbp
712         .byte   0xf3,0xc3
713
714 .globl  _padlock_ofb_encrypt
715
716 .p2align        4
717 _padlock_ofb_encrypt:
718         pushq   %rbp
719         pushq   %rbx
720
721         xorl    %eax,%eax
722         testq   $15,%rdx
723         jnz     L$ofb_abort
724         testq   $15,%rcx
725         jnz     L$ofb_abort
726         leaq    L$padlock_saved_context(%rip),%rax
727         pushf
728         cld
729         call    _padlock_verify_ctx
730         leaq    16(%rdx),%rdx
731         xorl    %eax,%eax
732         xorl    %ebx,%ebx
733         testl   $32,(%rdx)
734         jnz     L$ofb_aligned
735         testq   $15,%rdi
736         setz    %al
737         testq   $15,%rsi
738         setz    %bl
739         testl   %ebx,%eax
740         jnz     L$ofb_aligned
741         negq    %rax
742         movq    $512,%rbx
743         notq    %rax
744         leaq    (%rsp),%rbp
745         cmpq    %rbx,%rcx
746         cmovcq  %rcx,%rbx
747         andq    %rbx,%rax
748         movq    %rcx,%rbx
749         negq    %rax
750         andq    $512-1,%rbx
751         leaq    (%rax,%rbp,1),%rsp
752         movq    $512,%rax
753         cmovzq  %rax,%rbx
754         jmp     L$ofb_loop
755 .p2align        4
756 L$ofb_loop:
757         cmpq    %rcx,%rbx
758         cmovaq  %rcx,%rbx
759         movq    %rdi,%r8
760         movq    %rsi,%r9
761         movq    %rcx,%r10
762         movq    %rbx,%rcx
763         movq    %rbx,%r11
764         testq   $15,%rdi
765         cmovnzq %rsp,%rdi
766         testq   $15,%rsi
767         jz      L$ofb_inp_aligned
768         shrq    $3,%rcx
769 .byte   0xf3,0x48,0xa5          
770         subq    %rbx,%rdi
771         movq    %rbx,%rcx
772         movq    %rdi,%rsi
773 L$ofb_inp_aligned:
774         leaq    -16(%rdx),%rax
775         leaq    16(%rdx),%rbx
776         shrq    $4,%rcx
777 .byte   0xf3,0x0f,0xa7,232      
778         movdqa  (%rax),%xmm0
779         movdqa  %xmm0,-16(%rdx)
780         movq    %r8,%rdi
781         movq    %r11,%rbx
782         testq   $15,%rdi
783         jz      L$ofb_out_aligned
784         movq    %rbx,%rcx
785         leaq    (%rsp),%rsi
786         shrq    $3,%rcx
787 .byte   0xf3,0x48,0xa5          
788         subq    %rbx,%rdi
789 L$ofb_out_aligned:
790         movq    %r9,%rsi
791         movq    %r10,%rcx
792         addq    %rbx,%rdi
793         addq    %rbx,%rsi
794         subq    %rbx,%rcx
795         movq    $512,%rbx
796         jnz     L$ofb_loop
797         cmpq    %rbp,%rsp
798         je      L$ofb_done
799
800         pxor    %xmm0,%xmm0
801         leaq    (%rsp),%rax
802 L$ofb_bzero:
803         movaps  %xmm0,(%rax)
804         leaq    16(%rax),%rax
805         cmpq    %rax,%rbp
806         ja      L$ofb_bzero
807
808 L$ofb_done:
809         leaq    (%rbp),%rsp
810         jmp     L$ofb_exit
811
812 .p2align        4
813 L$ofb_aligned:
814         leaq    -16(%rdx),%rax
815         leaq    16(%rdx),%rbx
816         shrq    $4,%rcx
817 .byte   0xf3,0x0f,0xa7,232      
818         movdqa  (%rax),%xmm0
819         movdqa  %xmm0,-16(%rdx)
820 L$ofb_exit:
821         movl    $1,%eax
822         leaq    8(%rsp),%rsp
823 L$ofb_abort:
824         popq    %rbx
825         popq    %rbp
826         .byte   0xf3,0xc3
827
828 .globl  _padlock_ctr32_encrypt
829
830 .p2align        4
831 _padlock_ctr32_encrypt:
832         pushq   %rbp
833         pushq   %rbx
834
835         xorl    %eax,%eax
836         testq   $15,%rdx
837         jnz     L$ctr32_abort
838         testq   $15,%rcx
839         jnz     L$ctr32_abort
840         leaq    L$padlock_saved_context(%rip),%rax
841         pushf
842         cld
843         call    _padlock_verify_ctx
844         leaq    16(%rdx),%rdx
845         xorl    %eax,%eax
846         xorl    %ebx,%ebx
847         testl   $32,(%rdx)
848         jnz     L$ctr32_aligned
849         testq   $15,%rdi
850         setz    %al
851         testq   $15,%rsi
852         setz    %bl
853         testl   %ebx,%eax
854         jnz     L$ctr32_aligned
855         negq    %rax
856         movq    $512,%rbx
857         notq    %rax
858         leaq    (%rsp),%rbp
859         cmpq    %rbx,%rcx
860         cmovcq  %rcx,%rbx
861         andq    %rbx,%rax
862         movq    %rcx,%rbx
863         negq    %rax
864         andq    $512-1,%rbx
865         leaq    (%rax,%rbp,1),%rsp
866         movq    $512,%rax
867         cmovzq  %rax,%rbx
868 L$ctr32_reenter:
869         movl    -4(%rdx),%eax
870         bswapl  %eax
871         negl    %eax
872         andl    $31,%eax
873         movq    $512,%rbx
874         shll    $4,%eax
875         cmovzq  %rbx,%rax
876         cmpq    %rax,%rcx
877         cmovaq  %rax,%rbx
878         cmovbeq %rcx,%rbx
879         cmpq    %rbx,%rcx
880         ja      L$ctr32_loop
881         movq    %rsi,%rax
882         cmpq    %rsp,%rbp
883         cmoveq  %rdi,%rax
884         addq    %rcx,%rax
885         negq    %rax
886         andq    $4095,%rax
887         cmpq    $32,%rax
888         movq    $-32,%rax
889         cmovaeq %rbx,%rax
890         andq    %rax,%rbx
891         jz      L$ctr32_unaligned_tail
892         jmp     L$ctr32_loop
893 .p2align        4
894 L$ctr32_loop:
895         cmpq    %rcx,%rbx
896         cmovaq  %rcx,%rbx
897         movq    %rdi,%r8
898         movq    %rsi,%r9
899         movq    %rcx,%r10
900         movq    %rbx,%rcx
901         movq    %rbx,%r11
902         testq   $15,%rdi
903         cmovnzq %rsp,%rdi
904         testq   $15,%rsi
905         jz      L$ctr32_inp_aligned
906         shrq    $3,%rcx
907 .byte   0xf3,0x48,0xa5          
908         subq    %rbx,%rdi
909         movq    %rbx,%rcx
910         movq    %rdi,%rsi
911 L$ctr32_inp_aligned:
912         leaq    -16(%rdx),%rax
913         leaq    16(%rdx),%rbx
914         shrq    $4,%rcx
915 .byte   0xf3,0x0f,0xa7,216      
916         movl    -4(%rdx),%eax
917         testl   $4294901760,%eax
918         jnz     L$ctr32_no_carry
919         bswapl  %eax
920         addl    $65536,%eax
921         bswapl  %eax
922         movl    %eax,-4(%rdx)
923 L$ctr32_no_carry:
924         movq    %r8,%rdi
925         movq    %r11,%rbx
926         testq   $15,%rdi
927         jz      L$ctr32_out_aligned
928         movq    %rbx,%rcx
929         leaq    (%rsp),%rsi
930         shrq    $3,%rcx
931 .byte   0xf3,0x48,0xa5          
932         subq    %rbx,%rdi
933 L$ctr32_out_aligned:
934         movq    %r9,%rsi
935         movq    %r10,%rcx
936         addq    %rbx,%rdi
937         addq    %rbx,%rsi
938         subq    %rbx,%rcx
939         movq    $512,%rbx
940         jz      L$ctr32_break
941         cmpq    %rbx,%rcx
942         jae     L$ctr32_loop
943         movq    %rcx,%rbx
944         movq    %rsi,%rax
945         cmpq    %rsp,%rbp
946         cmoveq  %rdi,%rax
947         addq    %rcx,%rax
948         negq    %rax
949         andq    $4095,%rax
950         cmpq    $32,%rax
951         movq    $-32,%rax
952         cmovaeq %rbx,%rax
953         andq    %rax,%rbx
954         jnz     L$ctr32_loop
955 L$ctr32_unaligned_tail:
956         xorl    %eax,%eax
957         cmpq    %rsp,%rbp
958         cmoveq  %rcx,%rax
959         movq    %rdi,%r8
960         movq    %rcx,%rbx
961         subq    %rax,%rsp
962         shrq    $3,%rcx
963         leaq    (%rsp),%rdi
964 .byte   0xf3,0x48,0xa5          
965         movq    %rsp,%rsi
966         movq    %r8,%rdi
967         movq    %rbx,%rcx
968         jmp     L$ctr32_loop
969 .p2align        4
970 L$ctr32_break:
971         cmpq    %rbp,%rsp
972         je      L$ctr32_done
973
974         pxor    %xmm0,%xmm0
975         leaq    (%rsp),%rax
976 L$ctr32_bzero:
977         movaps  %xmm0,(%rax)
978         leaq    16(%rax),%rax
979         cmpq    %rax,%rbp
980         ja      L$ctr32_bzero
981
982 L$ctr32_done:
983         leaq    (%rbp),%rsp
984         jmp     L$ctr32_exit
985
986 .p2align        4
987 L$ctr32_aligned:
988         movl    -4(%rdx),%eax
989         bswapl  %eax
990         negl    %eax
991         andl    $65535,%eax
992         movq    $1048576,%rbx
993         shll    $4,%eax
994         cmovzq  %rbx,%rax
995         cmpq    %rax,%rcx
996         cmovaq  %rax,%rbx
997         cmovbeq %rcx,%rbx
998         jbe     L$ctr32_aligned_skip
999
1000 L$ctr32_aligned_loop:
1001         movq    %rcx,%r10
1002         movq    %rbx,%rcx
1003         movq    %rbx,%r11
1004
1005         leaq    -16(%rdx),%rax
1006         leaq    16(%rdx),%rbx
1007         shrq    $4,%rcx
1008 .byte   0xf3,0x0f,0xa7,216      
1009
1010         movl    -4(%rdx),%eax
1011         bswapl  %eax
1012         addl    $65536,%eax
1013         bswapl  %eax
1014         movl    %eax,-4(%rdx)
1015
1016         movq    %r10,%rcx
1017         subq    %r11,%rcx
1018         movq    $1048576,%rbx
1019         jz      L$ctr32_exit
1020         cmpq    %rbx,%rcx
1021         jae     L$ctr32_aligned_loop
1022
1023 L$ctr32_aligned_skip:
1024         leaq    (%rsi,%rcx,1),%rbp
1025         negq    %rbp
1026         andq    $4095,%rbp
1027         xorl    %eax,%eax
1028         cmpq    $32,%rbp
1029         movq    $32-1,%rbp
1030         cmovaeq %rax,%rbp
1031         andq    %rcx,%rbp
1032         subq    %rbp,%rcx
1033         jz      L$ctr32_aligned_tail
1034         leaq    -16(%rdx),%rax
1035         leaq    16(%rdx),%rbx
1036         shrq    $4,%rcx
1037 .byte   0xf3,0x0f,0xa7,216      
1038         testq   %rbp,%rbp
1039         jz      L$ctr32_exit
1040
1041 L$ctr32_aligned_tail:
1042         movq    %rdi,%r8
1043         movq    %rbp,%rbx
1044         movq    %rbp,%rcx
1045         leaq    (%rsp),%rbp
1046         subq    %rcx,%rsp
1047         shrq    $3,%rcx
1048         leaq    (%rsp),%rdi
1049 .byte   0xf3,0x48,0xa5          
1050         leaq    (%r8),%rdi
1051         leaq    (%rsp),%rsi
1052         movq    %rbx,%rcx
1053         jmp     L$ctr32_loop
1054 L$ctr32_exit:
1055         movl    $1,%eax
1056         leaq    8(%rsp),%rsp
1057 L$ctr32_abort:
1058         popq    %rbx
1059         popq    %rbp
1060         .byte   0xf3,0xc3
1061
1062 .byte   86,73,65,32,80,97,100,108,111,99,107,32,120,56,54,95,54,52,32,109,111,100,117,108,101,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
1063 .p2align        4
1064 .data   
1065 .p2align        3
1066 L$padlock_saved_context:
1067 .quad   0