Added Mike Hamburg's SSSE3 AES implementation.
[gnutls:gnutls.git] / lib / accelerated / x86 / macosx / aesni-x86_64.s
1 # Copyright (c) 2011-2013, Andy Polyakov <appro@openssl.org>
2 # All rights reserved.
3 #
4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions
6 # are met:
7
8 #     * Redistributions of source code must retain copyright notices,
9 #      this list of conditions and the following disclaimer.
10 #
11 #     * Redistributions in binary form must reproduce the above
12 #      copyright notice, this list of conditions and the following
13 #      disclaimer in the documentation and/or other materials
14 #      provided with the distribution.
15 #
16 #     * Neither the name of the Andy Polyakov nor the names of its
17 #      copyright holder and contributors may be used to endorse or
18 #      promote products derived from this software without specific
19 #      prior written permission.
20 #
21 # ALTERNATIVELY, provided that this notice is retained in full, this
22 # product may be distributed under the terms of the GNU General Public
23 # License (GPL), in which case the provisions of the GPL apply INSTEAD OF
24 # those given above.
25 #
26 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS
27 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 #
38 # *** This file is auto-generated ***
39 #
40 .text   
41 .globl  _aesni_encrypt
42
43 .p2align        4
44 _aesni_encrypt:
45         movups  (%rdi),%xmm2
46         movl    240(%rdx),%eax
47         movups  (%rdx),%xmm0
48         movups  16(%rdx),%xmm1
49         leaq    32(%rdx),%rdx
50         xorps   %xmm0,%xmm2
51 L$oop_enc1_1:
52 .byte   102,15,56,220,209
53         decl    %eax
54         movups  (%rdx),%xmm1
55         leaq    16(%rdx),%rdx
56         jnz     L$oop_enc1_1    
57 .byte   102,15,56,221,209
58         movups  %xmm2,(%rsi)
59         .byte   0xf3,0xc3
60
61
62 .globl  _aesni_decrypt
63
64 .p2align        4
65 _aesni_decrypt:
66         movups  (%rdi),%xmm2
67         movl    240(%rdx),%eax
68         movups  (%rdx),%xmm0
69         movups  16(%rdx),%xmm1
70         leaq    32(%rdx),%rdx
71         xorps   %xmm0,%xmm2
72 L$oop_dec1_2:
73 .byte   102,15,56,222,209
74         decl    %eax
75         movups  (%rdx),%xmm1
76         leaq    16(%rdx),%rdx
77         jnz     L$oop_dec1_2    
78 .byte   102,15,56,223,209
79         movups  %xmm2,(%rsi)
80         .byte   0xf3,0xc3
81
82
83 .p2align        4
84 _aesni_encrypt3:
85         movups  (%rcx),%xmm0
86         shrl    $1,%eax
87         movups  16(%rcx),%xmm1
88         leaq    32(%rcx),%rcx
89         xorps   %xmm0,%xmm2
90         xorps   %xmm0,%xmm3
91         xorps   %xmm0,%xmm4
92         movups  (%rcx),%xmm0
93
94 L$enc_loop3:
95 .byte   102,15,56,220,209
96 .byte   102,15,56,220,217
97         decl    %eax
98 .byte   102,15,56,220,225
99         movups  16(%rcx),%xmm1
100 .byte   102,15,56,220,208
101 .byte   102,15,56,220,216
102         leaq    32(%rcx),%rcx
103 .byte   102,15,56,220,224
104         movups  (%rcx),%xmm0
105         jnz     L$enc_loop3
106
107 .byte   102,15,56,220,209
108 .byte   102,15,56,220,217
109 .byte   102,15,56,220,225
110 .byte   102,15,56,221,208
111 .byte   102,15,56,221,216
112 .byte   102,15,56,221,224
113         .byte   0xf3,0xc3
114
115
116 .p2align        4
117 _aesni_decrypt3:
118         movups  (%rcx),%xmm0
119         shrl    $1,%eax
120         movups  16(%rcx),%xmm1
121         leaq    32(%rcx),%rcx
122         xorps   %xmm0,%xmm2
123         xorps   %xmm0,%xmm3
124         xorps   %xmm0,%xmm4
125         movups  (%rcx),%xmm0
126
127 L$dec_loop3:
128 .byte   102,15,56,222,209
129 .byte   102,15,56,222,217
130         decl    %eax
131 .byte   102,15,56,222,225
132         movups  16(%rcx),%xmm1
133 .byte   102,15,56,222,208
134 .byte   102,15,56,222,216
135         leaq    32(%rcx),%rcx
136 .byte   102,15,56,222,224
137         movups  (%rcx),%xmm0
138         jnz     L$dec_loop3
139
140 .byte   102,15,56,222,209
141 .byte   102,15,56,222,217
142 .byte   102,15,56,222,225
143 .byte   102,15,56,223,208
144 .byte   102,15,56,223,216
145 .byte   102,15,56,223,224
146         .byte   0xf3,0xc3
147
148
149 .p2align        4
150 _aesni_encrypt4:
151         movups  (%rcx),%xmm0
152         shrl    $1,%eax
153         movups  16(%rcx),%xmm1
154         leaq    32(%rcx),%rcx
155         xorps   %xmm0,%xmm2
156         xorps   %xmm0,%xmm3
157         xorps   %xmm0,%xmm4
158         xorps   %xmm0,%xmm5
159         movups  (%rcx),%xmm0
160
161 L$enc_loop4:
162 .byte   102,15,56,220,209
163 .byte   102,15,56,220,217
164         decl    %eax
165 .byte   102,15,56,220,225
166 .byte   102,15,56,220,233
167         movups  16(%rcx),%xmm1
168 .byte   102,15,56,220,208
169 .byte   102,15,56,220,216
170         leaq    32(%rcx),%rcx
171 .byte   102,15,56,220,224
172 .byte   102,15,56,220,232
173         movups  (%rcx),%xmm0
174         jnz     L$enc_loop4
175
176 .byte   102,15,56,220,209
177 .byte   102,15,56,220,217
178 .byte   102,15,56,220,225
179 .byte   102,15,56,220,233
180 .byte   102,15,56,221,208
181 .byte   102,15,56,221,216
182 .byte   102,15,56,221,224
183 .byte   102,15,56,221,232
184         .byte   0xf3,0xc3
185
186
187 .p2align        4
188 _aesni_decrypt4:
189         movups  (%rcx),%xmm0
190         shrl    $1,%eax
191         movups  16(%rcx),%xmm1
192         leaq    32(%rcx),%rcx
193         xorps   %xmm0,%xmm2
194         xorps   %xmm0,%xmm3
195         xorps   %xmm0,%xmm4
196         xorps   %xmm0,%xmm5
197         movups  (%rcx),%xmm0
198
199 L$dec_loop4:
200 .byte   102,15,56,222,209
201 .byte   102,15,56,222,217
202         decl    %eax
203 .byte   102,15,56,222,225
204 .byte   102,15,56,222,233
205         movups  16(%rcx),%xmm1
206 .byte   102,15,56,222,208
207 .byte   102,15,56,222,216
208         leaq    32(%rcx),%rcx
209 .byte   102,15,56,222,224
210 .byte   102,15,56,222,232
211         movups  (%rcx),%xmm0
212         jnz     L$dec_loop4
213
214 .byte   102,15,56,222,209
215 .byte   102,15,56,222,217
216 .byte   102,15,56,222,225
217 .byte   102,15,56,222,233
218 .byte   102,15,56,223,208
219 .byte   102,15,56,223,216
220 .byte   102,15,56,223,224
221 .byte   102,15,56,223,232
222         .byte   0xf3,0xc3
223
224
225 .p2align        4
226 _aesni_encrypt6:
227         movups  (%rcx),%xmm0
228         shrl    $1,%eax
229         movups  16(%rcx),%xmm1
230         leaq    32(%rcx),%rcx
231         xorps   %xmm0,%xmm2
232         pxor    %xmm0,%xmm3
233 .byte   102,15,56,220,209
234         pxor    %xmm0,%xmm4
235 .byte   102,15,56,220,217
236         pxor    %xmm0,%xmm5
237 .byte   102,15,56,220,225
238         pxor    %xmm0,%xmm6
239 .byte   102,15,56,220,233
240         pxor    %xmm0,%xmm7
241         decl    %eax
242 .byte   102,15,56,220,241
243         movups  (%rcx),%xmm0
244 .byte   102,15,56,220,249
245         jmp     L$enc_loop6_enter
246 .p2align        4
247 L$enc_loop6:
248 .byte   102,15,56,220,209
249 .byte   102,15,56,220,217
250         decl    %eax
251 .byte   102,15,56,220,225
252 .byte   102,15,56,220,233
253 .byte   102,15,56,220,241
254 .byte   102,15,56,220,249
255 L$enc_loop6_enter:
256         movups  16(%rcx),%xmm1
257 .byte   102,15,56,220,208
258 .byte   102,15,56,220,216
259         leaq    32(%rcx),%rcx
260 .byte   102,15,56,220,224
261 .byte   102,15,56,220,232
262 .byte   102,15,56,220,240
263 .byte   102,15,56,220,248
264         movups  (%rcx),%xmm0
265         jnz     L$enc_loop6
266
267 .byte   102,15,56,220,209
268 .byte   102,15,56,220,217
269 .byte   102,15,56,220,225
270 .byte   102,15,56,220,233
271 .byte   102,15,56,220,241
272 .byte   102,15,56,220,249
273 .byte   102,15,56,221,208
274 .byte   102,15,56,221,216
275 .byte   102,15,56,221,224
276 .byte   102,15,56,221,232
277 .byte   102,15,56,221,240
278 .byte   102,15,56,221,248
279         .byte   0xf3,0xc3
280
281
282 .p2align        4
283 _aesni_decrypt6:
284         movups  (%rcx),%xmm0
285         shrl    $1,%eax
286         movups  16(%rcx),%xmm1
287         leaq    32(%rcx),%rcx
288         xorps   %xmm0,%xmm2
289         pxor    %xmm0,%xmm3
290 .byte   102,15,56,222,209
291         pxor    %xmm0,%xmm4
292 .byte   102,15,56,222,217
293         pxor    %xmm0,%xmm5
294 .byte   102,15,56,222,225
295         pxor    %xmm0,%xmm6
296 .byte   102,15,56,222,233
297         pxor    %xmm0,%xmm7
298         decl    %eax
299 .byte   102,15,56,222,241
300         movups  (%rcx),%xmm0
301 .byte   102,15,56,222,249
302         jmp     L$dec_loop6_enter
303 .p2align        4
304 L$dec_loop6:
305 .byte   102,15,56,222,209
306 .byte   102,15,56,222,217
307         decl    %eax
308 .byte   102,15,56,222,225
309 .byte   102,15,56,222,233
310 .byte   102,15,56,222,241
311 .byte   102,15,56,222,249
312 L$dec_loop6_enter:
313         movups  16(%rcx),%xmm1
314 .byte   102,15,56,222,208
315 .byte   102,15,56,222,216
316         leaq    32(%rcx),%rcx
317 .byte   102,15,56,222,224
318 .byte   102,15,56,222,232
319 .byte   102,15,56,222,240
320 .byte   102,15,56,222,248
321         movups  (%rcx),%xmm0
322         jnz     L$dec_loop6
323
324 .byte   102,15,56,222,209
325 .byte   102,15,56,222,217
326 .byte   102,15,56,222,225
327 .byte   102,15,56,222,233
328 .byte   102,15,56,222,241
329 .byte   102,15,56,222,249
330 .byte   102,15,56,223,208
331 .byte   102,15,56,223,216
332 .byte   102,15,56,223,224
333 .byte   102,15,56,223,232
334 .byte   102,15,56,223,240
335 .byte   102,15,56,223,248
336         .byte   0xf3,0xc3
337
338
339 .p2align        4
340 _aesni_encrypt8:
341         movups  (%rcx),%xmm0
342         shrl    $1,%eax
343         movups  16(%rcx),%xmm1
344         leaq    32(%rcx),%rcx
345         xorps   %xmm0,%xmm2
346         xorps   %xmm0,%xmm3
347 .byte   102,15,56,220,209
348         pxor    %xmm0,%xmm4
349 .byte   102,15,56,220,217
350         pxor    %xmm0,%xmm5
351 .byte   102,15,56,220,225
352         pxor    %xmm0,%xmm6
353 .byte   102,15,56,220,233
354         pxor    %xmm0,%xmm7
355         decl    %eax
356 .byte   102,15,56,220,241
357         pxor    %xmm0,%xmm8
358 .byte   102,15,56,220,249
359         pxor    %xmm0,%xmm9
360         movups  (%rcx),%xmm0
361 .byte   102,68,15,56,220,193
362 .byte   102,68,15,56,220,201
363         movups  16(%rcx),%xmm1
364         jmp     L$enc_loop8_enter
365 .p2align        4
366 L$enc_loop8:
367 .byte   102,15,56,220,209
368 .byte   102,15,56,220,217
369         decl    %eax
370 .byte   102,15,56,220,225
371 .byte   102,15,56,220,233
372 .byte   102,15,56,220,241
373 .byte   102,15,56,220,249
374 .byte   102,68,15,56,220,193
375 .byte   102,68,15,56,220,201
376         movups  16(%rcx),%xmm1
377 L$enc_loop8_enter:
378 .byte   102,15,56,220,208
379 .byte   102,15,56,220,216
380         leaq    32(%rcx),%rcx
381 .byte   102,15,56,220,224
382 .byte   102,15,56,220,232
383 .byte   102,15,56,220,240
384 .byte   102,15,56,220,248
385 .byte   102,68,15,56,220,192
386 .byte   102,68,15,56,220,200
387         movups  (%rcx),%xmm0
388         jnz     L$enc_loop8
389
390 .byte   102,15,56,220,209
391 .byte   102,15,56,220,217
392 .byte   102,15,56,220,225
393 .byte   102,15,56,220,233
394 .byte   102,15,56,220,241
395 .byte   102,15,56,220,249
396 .byte   102,68,15,56,220,193
397 .byte   102,68,15,56,220,201
398 .byte   102,15,56,221,208
399 .byte   102,15,56,221,216
400 .byte   102,15,56,221,224
401 .byte   102,15,56,221,232
402 .byte   102,15,56,221,240
403 .byte   102,15,56,221,248
404 .byte   102,68,15,56,221,192
405 .byte   102,68,15,56,221,200
406         .byte   0xf3,0xc3
407
408
409 .p2align        4
410 _aesni_decrypt8:
411         movups  (%rcx),%xmm0
412         shrl    $1,%eax
413         movups  16(%rcx),%xmm1
414         leaq    32(%rcx),%rcx
415         xorps   %xmm0,%xmm2
416         xorps   %xmm0,%xmm3
417 .byte   102,15,56,222,209
418         pxor    %xmm0,%xmm4
419 .byte   102,15,56,222,217
420         pxor    %xmm0,%xmm5
421 .byte   102,15,56,222,225
422         pxor    %xmm0,%xmm6
423 .byte   102,15,56,222,233
424         pxor    %xmm0,%xmm7
425         decl    %eax
426 .byte   102,15,56,222,241
427         pxor    %xmm0,%xmm8
428 .byte   102,15,56,222,249
429         pxor    %xmm0,%xmm9
430         movups  (%rcx),%xmm0
431 .byte   102,68,15,56,222,193
432 .byte   102,68,15,56,222,201
433         movups  16(%rcx),%xmm1
434         jmp     L$dec_loop8_enter
435 .p2align        4
436 L$dec_loop8:
437 .byte   102,15,56,222,209
438 .byte   102,15,56,222,217
439         decl    %eax
440 .byte   102,15,56,222,225
441 .byte   102,15,56,222,233
442 .byte   102,15,56,222,241
443 .byte   102,15,56,222,249
444 .byte   102,68,15,56,222,193
445 .byte   102,68,15,56,222,201
446         movups  16(%rcx),%xmm1
447 L$dec_loop8_enter:
448 .byte   102,15,56,222,208
449 .byte   102,15,56,222,216
450         leaq    32(%rcx),%rcx
451 .byte   102,15,56,222,224
452 .byte   102,15,56,222,232
453 .byte   102,15,56,222,240
454 .byte   102,15,56,222,248
455 .byte   102,68,15,56,222,192
456 .byte   102,68,15,56,222,200
457         movups  (%rcx),%xmm0
458         jnz     L$dec_loop8
459
460 .byte   102,15,56,222,209
461 .byte   102,15,56,222,217
462 .byte   102,15,56,222,225
463 .byte   102,15,56,222,233
464 .byte   102,15,56,222,241
465 .byte   102,15,56,222,249
466 .byte   102,68,15,56,222,193
467 .byte   102,68,15,56,222,201
468 .byte   102,15,56,223,208
469 .byte   102,15,56,223,216
470 .byte   102,15,56,223,224
471 .byte   102,15,56,223,232
472 .byte   102,15,56,223,240
473 .byte   102,15,56,223,248
474 .byte   102,68,15,56,223,192
475 .byte   102,68,15,56,223,200
476         .byte   0xf3,0xc3
477
478 .globl  _aesni_ecb_encrypt
479
480 .p2align        4
481 _aesni_ecb_encrypt:
482         andq    $-16,%rdx
483         jz      L$ecb_ret
484
485         movl    240(%rcx),%eax
486         movups  (%rcx),%xmm0
487         movq    %rcx,%r11
488         movl    %eax,%r10d
489         testl   %r8d,%r8d
490         jz      L$ecb_decrypt
491
492         cmpq    $128,%rdx
493         jb      L$ecb_enc_tail
494
495         movdqu  (%rdi),%xmm2
496         movdqu  16(%rdi),%xmm3
497         movdqu  32(%rdi),%xmm4
498         movdqu  48(%rdi),%xmm5
499         movdqu  64(%rdi),%xmm6
500         movdqu  80(%rdi),%xmm7
501         movdqu  96(%rdi),%xmm8
502         movdqu  112(%rdi),%xmm9
503         leaq    128(%rdi),%rdi
504         subq    $128,%rdx
505         jmp     L$ecb_enc_loop8_enter
506 .p2align        4
507 L$ecb_enc_loop8:
508         movups  %xmm2,(%rsi)
509         movq    %r11,%rcx
510         movdqu  (%rdi),%xmm2
511         movl    %r10d,%eax
512         movups  %xmm3,16(%rsi)
513         movdqu  16(%rdi),%xmm3
514         movups  %xmm4,32(%rsi)
515         movdqu  32(%rdi),%xmm4
516         movups  %xmm5,48(%rsi)
517         movdqu  48(%rdi),%xmm5
518         movups  %xmm6,64(%rsi)
519         movdqu  64(%rdi),%xmm6
520         movups  %xmm7,80(%rsi)
521         movdqu  80(%rdi),%xmm7
522         movups  %xmm8,96(%rsi)
523         movdqu  96(%rdi),%xmm8
524         movups  %xmm9,112(%rsi)
525         leaq    128(%rsi),%rsi
526         movdqu  112(%rdi),%xmm9
527         leaq    128(%rdi),%rdi
528 L$ecb_enc_loop8_enter:
529
530         call    _aesni_encrypt8
531
532         subq    $128,%rdx
533         jnc     L$ecb_enc_loop8
534
535         movups  %xmm2,(%rsi)
536         movq    %r11,%rcx
537         movups  %xmm3,16(%rsi)
538         movl    %r10d,%eax
539         movups  %xmm4,32(%rsi)
540         movups  %xmm5,48(%rsi)
541         movups  %xmm6,64(%rsi)
542         movups  %xmm7,80(%rsi)
543         movups  %xmm8,96(%rsi)
544         movups  %xmm9,112(%rsi)
545         leaq    128(%rsi),%rsi
546         addq    $128,%rdx
547         jz      L$ecb_ret
548
549 L$ecb_enc_tail:
550         movups  (%rdi),%xmm2
551         cmpq    $32,%rdx
552         jb      L$ecb_enc_one
553         movups  16(%rdi),%xmm3
554         je      L$ecb_enc_two
555         movups  32(%rdi),%xmm4
556         cmpq    $64,%rdx
557         jb      L$ecb_enc_three
558         movups  48(%rdi),%xmm5
559         je      L$ecb_enc_four
560         movups  64(%rdi),%xmm6
561         cmpq    $96,%rdx
562         jb      L$ecb_enc_five
563         movups  80(%rdi),%xmm7
564         je      L$ecb_enc_six
565         movdqu  96(%rdi),%xmm8
566         call    _aesni_encrypt8
567         movups  %xmm2,(%rsi)
568         movups  %xmm3,16(%rsi)
569         movups  %xmm4,32(%rsi)
570         movups  %xmm5,48(%rsi)
571         movups  %xmm6,64(%rsi)
572         movups  %xmm7,80(%rsi)
573         movups  %xmm8,96(%rsi)
574         jmp     L$ecb_ret
575 .p2align        4
576 L$ecb_enc_one:
577         movups  (%rcx),%xmm0
578         movups  16(%rcx),%xmm1
579         leaq    32(%rcx),%rcx
580         xorps   %xmm0,%xmm2
581 L$oop_enc1_3:
582 .byte   102,15,56,220,209
583         decl    %eax
584         movups  (%rcx),%xmm1
585         leaq    16(%rcx),%rcx
586         jnz     L$oop_enc1_3    
587 .byte   102,15,56,221,209
588         movups  %xmm2,(%rsi)
589         jmp     L$ecb_ret
590 .p2align        4
591 L$ecb_enc_two:
592         xorps   %xmm4,%xmm4
593         call    _aesni_encrypt3
594         movups  %xmm2,(%rsi)
595         movups  %xmm3,16(%rsi)
596         jmp     L$ecb_ret
597 .p2align        4
598 L$ecb_enc_three:
599         call    _aesni_encrypt3
600         movups  %xmm2,(%rsi)
601         movups  %xmm3,16(%rsi)
602         movups  %xmm4,32(%rsi)
603         jmp     L$ecb_ret
604 .p2align        4
605 L$ecb_enc_four:
606         call    _aesni_encrypt4
607         movups  %xmm2,(%rsi)
608         movups  %xmm3,16(%rsi)
609         movups  %xmm4,32(%rsi)
610         movups  %xmm5,48(%rsi)
611         jmp     L$ecb_ret
612 .p2align        4
613 L$ecb_enc_five:
614         xorps   %xmm7,%xmm7
615         call    _aesni_encrypt6
616         movups  %xmm2,(%rsi)
617         movups  %xmm3,16(%rsi)
618         movups  %xmm4,32(%rsi)
619         movups  %xmm5,48(%rsi)
620         movups  %xmm6,64(%rsi)
621         jmp     L$ecb_ret
622 .p2align        4
623 L$ecb_enc_six:
624         call    _aesni_encrypt6
625         movups  %xmm2,(%rsi)
626         movups  %xmm3,16(%rsi)
627         movups  %xmm4,32(%rsi)
628         movups  %xmm5,48(%rsi)
629         movups  %xmm6,64(%rsi)
630         movups  %xmm7,80(%rsi)
631         jmp     L$ecb_ret
632
633 .p2align        4
634 L$ecb_decrypt:
635         cmpq    $128,%rdx
636         jb      L$ecb_dec_tail
637
638         movdqu  (%rdi),%xmm2
639         movdqu  16(%rdi),%xmm3
640         movdqu  32(%rdi),%xmm4
641         movdqu  48(%rdi),%xmm5
642         movdqu  64(%rdi),%xmm6
643         movdqu  80(%rdi),%xmm7
644         movdqu  96(%rdi),%xmm8
645         movdqu  112(%rdi),%xmm9
646         leaq    128(%rdi),%rdi
647         subq    $128,%rdx
648         jmp     L$ecb_dec_loop8_enter
649 .p2align        4
650 L$ecb_dec_loop8:
651         movups  %xmm2,(%rsi)
652         movq    %r11,%rcx
653         movdqu  (%rdi),%xmm2
654         movl    %r10d,%eax
655         movups  %xmm3,16(%rsi)
656         movdqu  16(%rdi),%xmm3
657         movups  %xmm4,32(%rsi)
658         movdqu  32(%rdi),%xmm4
659         movups  %xmm5,48(%rsi)
660         movdqu  48(%rdi),%xmm5
661         movups  %xmm6,64(%rsi)
662         movdqu  64(%rdi),%xmm6
663         movups  %xmm7,80(%rsi)
664         movdqu  80(%rdi),%xmm7
665         movups  %xmm8,96(%rsi)
666         movdqu  96(%rdi),%xmm8
667         movups  %xmm9,112(%rsi)
668         leaq    128(%rsi),%rsi
669         movdqu  112(%rdi),%xmm9
670         leaq    128(%rdi),%rdi
671 L$ecb_dec_loop8_enter:
672
673         call    _aesni_decrypt8
674
675         movups  (%r11),%xmm0
676         subq    $128,%rdx
677         jnc     L$ecb_dec_loop8
678
679         movups  %xmm2,(%rsi)
680         movq    %r11,%rcx
681         movups  %xmm3,16(%rsi)
682         movl    %r10d,%eax
683         movups  %xmm4,32(%rsi)
684         movups  %xmm5,48(%rsi)
685         movups  %xmm6,64(%rsi)
686         movups  %xmm7,80(%rsi)
687         movups  %xmm8,96(%rsi)
688         movups  %xmm9,112(%rsi)
689         leaq    128(%rsi),%rsi
690         addq    $128,%rdx
691         jz      L$ecb_ret
692
693 L$ecb_dec_tail:
694         movups  (%rdi),%xmm2
695         cmpq    $32,%rdx
696         jb      L$ecb_dec_one
697         movups  16(%rdi),%xmm3
698         je      L$ecb_dec_two
699         movups  32(%rdi),%xmm4
700         cmpq    $64,%rdx
701         jb      L$ecb_dec_three
702         movups  48(%rdi),%xmm5
703         je      L$ecb_dec_four
704         movups  64(%rdi),%xmm6
705         cmpq    $96,%rdx
706         jb      L$ecb_dec_five
707         movups  80(%rdi),%xmm7
708         je      L$ecb_dec_six
709         movups  96(%rdi),%xmm8
710         movups  (%rcx),%xmm0
711         call    _aesni_decrypt8
712         movups  %xmm2,(%rsi)
713         movups  %xmm3,16(%rsi)
714         movups  %xmm4,32(%rsi)
715         movups  %xmm5,48(%rsi)
716         movups  %xmm6,64(%rsi)
717         movups  %xmm7,80(%rsi)
718         movups  %xmm8,96(%rsi)
719         jmp     L$ecb_ret
720 .p2align        4
721 L$ecb_dec_one:
722         movups  (%rcx),%xmm0
723         movups  16(%rcx),%xmm1
724         leaq    32(%rcx),%rcx
725         xorps   %xmm0,%xmm2
726 L$oop_dec1_4:
727 .byte   102,15,56,222,209
728         decl    %eax
729         movups  (%rcx),%xmm1
730         leaq    16(%rcx),%rcx
731         jnz     L$oop_dec1_4    
732 .byte   102,15,56,223,209
733         movups  %xmm2,(%rsi)
734         jmp     L$ecb_ret
735 .p2align        4
736 L$ecb_dec_two:
737         xorps   %xmm4,%xmm4
738         call    _aesni_decrypt3
739         movups  %xmm2,(%rsi)
740         movups  %xmm3,16(%rsi)
741         jmp     L$ecb_ret
742 .p2align        4
743 L$ecb_dec_three:
744         call    _aesni_decrypt3
745         movups  %xmm2,(%rsi)
746         movups  %xmm3,16(%rsi)
747         movups  %xmm4,32(%rsi)
748         jmp     L$ecb_ret
749 .p2align        4
750 L$ecb_dec_four:
751         call    _aesni_decrypt4
752         movups  %xmm2,(%rsi)
753         movups  %xmm3,16(%rsi)
754         movups  %xmm4,32(%rsi)
755         movups  %xmm5,48(%rsi)
756         jmp     L$ecb_ret
757 .p2align        4
758 L$ecb_dec_five:
759         xorps   %xmm7,%xmm7
760         call    _aesni_decrypt6
761         movups  %xmm2,(%rsi)
762         movups  %xmm3,16(%rsi)
763         movups  %xmm4,32(%rsi)
764         movups  %xmm5,48(%rsi)
765         movups  %xmm6,64(%rsi)
766         jmp     L$ecb_ret
767 .p2align        4
768 L$ecb_dec_six:
769         call    _aesni_decrypt6
770         movups  %xmm2,(%rsi)
771         movups  %xmm3,16(%rsi)
772         movups  %xmm4,32(%rsi)
773         movups  %xmm5,48(%rsi)
774         movups  %xmm6,64(%rsi)
775         movups  %xmm7,80(%rsi)
776
777 L$ecb_ret:
778         .byte   0xf3,0xc3
779
780 .globl  _aesni_ccm64_encrypt_blocks
781
782 .p2align        4
783 _aesni_ccm64_encrypt_blocks:
784         movl    240(%rcx),%eax
785         movdqu  (%r8),%xmm9
786         movdqa  L$increment64(%rip),%xmm6
787         movdqa  L$bswap_mask(%rip),%xmm7
788
789         shrl    $1,%eax
790         leaq    0(%rcx),%r11
791         movdqu  (%r9),%xmm3
792         movdqa  %xmm9,%xmm2
793         movl    %eax,%r10d
794 .byte   102,68,15,56,0,207
795         jmp     L$ccm64_enc_outer
796 .p2align        4
797 L$ccm64_enc_outer:
798         movups  (%r11),%xmm0
799         movl    %r10d,%eax
800         movups  (%rdi),%xmm8
801
802         xorps   %xmm0,%xmm2
803         movups  16(%r11),%xmm1
804         xorps   %xmm8,%xmm0
805         leaq    32(%r11),%rcx
806         xorps   %xmm0,%xmm3
807         movups  (%rcx),%xmm0
808
809 L$ccm64_enc2_loop:
810 .byte   102,15,56,220,209
811         decl    %eax
812 .byte   102,15,56,220,217
813         movups  16(%rcx),%xmm1
814 .byte   102,15,56,220,208
815         leaq    32(%rcx),%rcx
816 .byte   102,15,56,220,216
817         movups  0(%rcx),%xmm0
818         jnz     L$ccm64_enc2_loop
819 .byte   102,15,56,220,209
820 .byte   102,15,56,220,217
821         paddq   %xmm6,%xmm9
822 .byte   102,15,56,221,208
823 .byte   102,15,56,221,216
824
825         decq    %rdx
826         leaq    16(%rdi),%rdi
827         xorps   %xmm2,%xmm8
828         movdqa  %xmm9,%xmm2
829         movups  %xmm8,(%rsi)
830         leaq    16(%rsi),%rsi
831 .byte   102,15,56,0,215
832         jnz     L$ccm64_enc_outer
833
834         movups  %xmm3,(%r9)
835         .byte   0xf3,0xc3
836
837 .globl  _aesni_ccm64_decrypt_blocks
838
839 .p2align        4
840 _aesni_ccm64_decrypt_blocks:
841         movl    240(%rcx),%eax
842         movups  (%r8),%xmm9
843         movdqu  (%r9),%xmm3
844         movdqa  L$increment64(%rip),%xmm6
845         movdqa  L$bswap_mask(%rip),%xmm7
846
847         movaps  %xmm9,%xmm2
848         movl    %eax,%r10d
849         movq    %rcx,%r11
850 .byte   102,68,15,56,0,207
851         movups  (%rcx),%xmm0
852         movups  16(%rcx),%xmm1
853         leaq    32(%rcx),%rcx
854         xorps   %xmm0,%xmm2
855 L$oop_enc1_5:
856 .byte   102,15,56,220,209
857         decl    %eax
858         movups  (%rcx),%xmm1
859         leaq    16(%rcx),%rcx
860         jnz     L$oop_enc1_5    
861 .byte   102,15,56,221,209
862         movups  (%rdi),%xmm8
863         paddq   %xmm6,%xmm9
864         leaq    16(%rdi),%rdi
865         jmp     L$ccm64_dec_outer
866 .p2align        4
867 L$ccm64_dec_outer:
868         xorps   %xmm2,%xmm8
869         movdqa  %xmm9,%xmm2
870         movl    %r10d,%eax
871         movups  %xmm8,(%rsi)
872         leaq    16(%rsi),%rsi
873 .byte   102,15,56,0,215
874
875         subq    $1,%rdx
876         jz      L$ccm64_dec_break
877
878         movups  (%r11),%xmm0
879         shrl    $1,%eax
880         movups  16(%r11),%xmm1
881         xorps   %xmm0,%xmm8
882         leaq    32(%r11),%rcx
883         xorps   %xmm0,%xmm2
884         xorps   %xmm8,%xmm3
885         movups  (%rcx),%xmm0
886
887 L$ccm64_dec2_loop:
888 .byte   102,15,56,220,209
889         decl    %eax
890 .byte   102,15,56,220,217
891         movups  16(%rcx),%xmm1
892 .byte   102,15,56,220,208
893         leaq    32(%rcx),%rcx
894 .byte   102,15,56,220,216
895         movups  0(%rcx),%xmm0
896         jnz     L$ccm64_dec2_loop
897         movups  (%rdi),%xmm8
898         paddq   %xmm6,%xmm9
899 .byte   102,15,56,220,209
900 .byte   102,15,56,220,217
901         leaq    16(%rdi),%rdi
902 .byte   102,15,56,221,208
903 .byte   102,15,56,221,216
904         jmp     L$ccm64_dec_outer
905
906 .p2align        4
907 L$ccm64_dec_break:
908
909         movups  (%r11),%xmm0
910         movups  16(%r11),%xmm1
911         xorps   %xmm0,%xmm8
912         leaq    32(%r11),%r11
913         xorps   %xmm8,%xmm3
914 L$oop_enc1_6:
915 .byte   102,15,56,220,217
916         decl    %eax
917         movups  (%r11),%xmm1
918         leaq    16(%r11),%r11
919         jnz     L$oop_enc1_6    
920 .byte   102,15,56,221,217
921         movups  %xmm3,(%r9)
922         .byte   0xf3,0xc3
923
924 .globl  _aesni_ctr32_encrypt_blocks
925
926 .p2align        4
927 _aesni_ctr32_encrypt_blocks:
928         leaq    (%rsp),%rax
929         pushq   %rbp
930         subq    $128,%rsp
931         andq    $-16,%rsp
932         leaq    -8(%rax),%rbp
933
934         cmpq    $1,%rdx
935         je      L$ctr32_one_shortcut
936
937         movdqu  (%r8),%xmm2
938         movdqu  (%rcx),%xmm0
939         movl    12(%r8),%r8d
940         pxor    %xmm0,%xmm2
941         movl    12(%rcx),%r11d
942         movdqa  %xmm2,0(%rsp)
943         bswapl  %r8d
944         movdqa  %xmm2,%xmm3
945         movdqa  %xmm2,%xmm4
946         movdqa  %xmm2,%xmm5
947         movdqa  %xmm2,64(%rsp)
948         movdqa  %xmm2,80(%rsp)
949         movdqa  %xmm2,96(%rsp)
950         movdqa  %xmm2,112(%rsp)
951
952         movl    240(%rcx),%eax
953
954         leaq    1(%r8),%r9
955         leaq    2(%r8),%r10
956         bswapl  %r9d
957         bswapl  %r10d
958         xorl    %r11d,%r9d
959         xorl    %r11d,%r10d
960 .byte   102,65,15,58,34,217,3
961         leaq    3(%r8),%r9
962         movdqa  %xmm3,16(%rsp)
963 .byte   102,65,15,58,34,226,3
964         bswapl  %r9d
965         leaq    4(%r8),%r10
966         movdqa  %xmm4,32(%rsp)
967         xorl    %r11d,%r9d
968         bswapl  %r10d
969 .byte   102,65,15,58,34,233,3
970         xorl    %r11d,%r10d
971         movdqa  %xmm5,48(%rsp)
972         leaq    5(%r8),%r9
973         movl    %r10d,64+12(%rsp)
974         bswapl  %r9d
975         leaq    6(%r8),%r10
976         xorl    %r11d,%r9d
977         bswapl  %r10d
978         movl    %r9d,80+12(%rsp)
979         xorl    %r11d,%r10d
980         leaq    7(%r8),%r9
981         movl    %r10d,96+12(%rsp)
982         bswapl  %r9d
983         xorl    %r11d,%r9d
984         movl    %r9d,112+12(%rsp)
985
986         movups  16(%rcx),%xmm1
987
988         movdqa  64(%rsp),%xmm6
989         movdqa  80(%rsp),%xmm7
990
991         cmpq    $8,%rdx
992         jb      L$ctr32_tail
993
994         leaq    128(%rcx),%rcx
995         subq    $8,%rdx
996         jmp     L$ctr32_loop8
997
998 .p2align        5
999 L$ctr32_loop8:
1000         addl    $8,%r8d
1001         movdqa  96(%rsp),%xmm8
1002 .byte   102,15,56,220,209
1003         movl    %r8d,%r9d
1004         movdqa  112(%rsp),%xmm9
1005 .byte   102,15,56,220,217
1006         bswapl  %r9d
1007         movups  32-128(%rcx),%xmm0
1008 .byte   102,15,56,220,225
1009         xorl    %r11d,%r9d
1010 .byte   102,15,56,220,233
1011         movl    %r9d,0+12(%rsp)
1012         leaq    1(%r8),%r9
1013 .byte   102,15,56,220,241
1014 .byte   102,15,56,220,249
1015 .byte   102,68,15,56,220,193
1016 .byte   102,68,15,56,220,201
1017         movups  48-128(%rcx),%xmm1
1018 .byte   102,15,56,220,208
1019 .byte   102,15,56,220,216
1020         bswapl  %r9d
1021 .byte   102,15,56,220,224
1022         xorl    %r11d,%r9d
1023 .byte   102,15,56,220,232
1024         movl    %r9d,16+12(%rsp)
1025         leaq    2(%r8),%r9
1026 .byte   102,15,56,220,240
1027 .byte   102,15,56,220,248
1028 .byte   102,68,15,56,220,192
1029 .byte   102,68,15,56,220,200
1030         movups  64-128(%rcx),%xmm0
1031 .byte   102,15,56,220,209
1032 .byte   102,15,56,220,217
1033         bswapl  %r9d
1034 .byte   102,15,56,220,225
1035         xorl    %r11d,%r9d
1036 .byte   102,15,56,220,233
1037         movl    %r9d,32+12(%rsp)
1038         leaq    3(%r8),%r9
1039 .byte   102,15,56,220,241
1040 .byte   102,15,56,220,249
1041 .byte   102,68,15,56,220,193
1042 .byte   102,68,15,56,220,201
1043         movups  80-128(%rcx),%xmm1
1044 .byte   102,15,56,220,208
1045 .byte   102,15,56,220,216
1046         bswapl  %r9d
1047 .byte   102,15,56,220,224
1048         xorl    %r11d,%r9d
1049 .byte   102,15,56,220,232
1050         movl    %r9d,48+12(%rsp)
1051         leaq    4(%r8),%r9
1052 .byte   102,15,56,220,240
1053 .byte   102,15,56,220,248
1054 .byte   102,68,15,56,220,192
1055 .byte   102,68,15,56,220,200
1056         movups  96-128(%rcx),%xmm0
1057 .byte   102,15,56,220,209
1058 .byte   102,15,56,220,217
1059         bswapl  %r9d
1060 .byte   102,15,56,220,225
1061         xorl    %r11d,%r9d
1062 .byte   102,15,56,220,233
1063         movl    %r9d,64+12(%rsp)
1064         leaq    5(%r8),%r9
1065 .byte   102,15,56,220,241
1066 .byte   102,15,56,220,249
1067 .byte   102,68,15,56,220,193
1068 .byte   102,68,15,56,220,201
1069         movups  112-128(%rcx),%xmm1
1070 .byte   102,15,56,220,208
1071 .byte   102,15,56,220,216
1072         bswapl  %r9d
1073 .byte   102,15,56,220,224
1074         xorl    %r11d,%r9d
1075 .byte   102,15,56,220,232
1076         movl    %r9d,80+12(%rsp)
1077         leaq    6(%r8),%r9
1078 .byte   102,15,56,220,240
1079 .byte   102,15,56,220,248
1080 .byte   102,68,15,56,220,192
1081 .byte   102,68,15,56,220,200
1082         movups  128-128(%rcx),%xmm0
1083 .byte   102,15,56,220,209
1084 .byte   102,15,56,220,217
1085         bswapl  %r9d
1086 .byte   102,15,56,220,225
1087         xorl    %r11d,%r9d
1088 .byte   102,15,56,220,233
1089         movl    %r9d,96+12(%rsp)
1090         leaq    7(%r8),%r9
1091 .byte   102,15,56,220,241
1092 .byte   102,15,56,220,249
1093 .byte   102,68,15,56,220,193
1094 .byte   102,68,15,56,220,201
1095         movups  144-128(%rcx),%xmm1
1096 .byte   102,15,56,220,208
1097 .byte   102,15,56,220,216
1098         bswapl  %r9d
1099 .byte   102,15,56,220,224
1100         xorl    %r11d,%r9d
1101 .byte   102,15,56,220,232
1102         movl    %r9d,112+12(%rsp)
1103 .byte   102,15,56,220,240
1104 .byte   102,15,56,220,248
1105 .byte   102,68,15,56,220,192
1106         movdqu  0(%rdi),%xmm10
1107 .byte   102,68,15,56,220,200
1108         movups  160-128(%rcx),%xmm0
1109
1110         cmpl    $11,%eax
1111         jb      L$ctr32_enc_done
1112
1113 .byte   102,15,56,220,209
1114 .byte   102,15,56,220,217
1115 .byte   102,15,56,220,225
1116 .byte   102,15,56,220,233
1117 .byte   102,15,56,220,241
1118 .byte   102,15,56,220,249
1119 .byte   102,68,15,56,220,193
1120 .byte   102,68,15,56,220,201
1121         movups  176-128(%rcx),%xmm1
1122
1123 .byte   102,15,56,220,208
1124 .byte   102,15,56,220,216
1125 .byte   102,15,56,220,224
1126 .byte   102,15,56,220,232
1127 .byte   102,15,56,220,240
1128 .byte   102,15,56,220,248
1129 .byte   102,68,15,56,220,192
1130 .byte   102,68,15,56,220,200
1131         movups  192-128(%rcx),%xmm0
1132         je      L$ctr32_enc_done
1133
1134 .byte   102,15,56,220,209
1135 .byte   102,15,56,220,217
1136 .byte   102,15,56,220,225
1137 .byte   102,15,56,220,233
1138 .byte   102,15,56,220,241
1139 .byte   102,15,56,220,249
1140 .byte   102,68,15,56,220,193
1141 .byte   102,68,15,56,220,201
1142         movups  208-128(%rcx),%xmm1
1143
1144 .byte   102,15,56,220,208
1145 .byte   102,15,56,220,216
1146 .byte   102,15,56,220,224
1147 .byte   102,15,56,220,232
1148 .byte   102,15,56,220,240
1149 .byte   102,15,56,220,248
1150 .byte   102,68,15,56,220,192
1151 .byte   102,68,15,56,220,200
1152         movups  224-128(%rcx),%xmm0
1153
1154 L$ctr32_enc_done:
1155         movdqu  16(%rdi),%xmm11
1156         pxor    %xmm0,%xmm10
1157         movdqu  32(%rdi),%xmm12
1158         pxor    %xmm0,%xmm11
1159         movdqu  48(%rdi),%xmm13
1160         pxor    %xmm0,%xmm12
1161         movdqu  64(%rdi),%xmm14
1162         pxor    %xmm0,%xmm13
1163         movdqu  80(%rdi),%xmm15
1164         pxor    %xmm0,%xmm14
1165 .byte   102,15,56,220,209
1166         pxor    %xmm0,%xmm15
1167 .byte   102,15,56,220,217
1168 .byte   102,15,56,220,225
1169 .byte   102,15,56,220,233
1170 .byte   102,15,56,220,241
1171 .byte   102,15,56,220,249
1172 .byte   102,68,15,56,220,193
1173 .byte   102,68,15,56,220,201
1174         movdqu  96(%rdi),%xmm1
1175
1176 .byte   102,65,15,56,221,210
1177         pxor    %xmm0,%xmm1
1178         movdqu  112(%rdi),%xmm10
1179         leaq    128(%rdi),%rdi
1180 .byte   102,65,15,56,221,219
1181         pxor    %xmm0,%xmm10
1182         movdqa  0(%rsp),%xmm11
1183 .byte   102,65,15,56,221,228
1184         movdqa  16(%rsp),%xmm12
1185 .byte   102,65,15,56,221,237
1186         movdqa  32(%rsp),%xmm13
1187 .byte   102,65,15,56,221,246
1188         movdqa  48(%rsp),%xmm14
1189 .byte   102,65,15,56,221,255
1190         movdqa  64(%rsp),%xmm15
1191 .byte   102,68,15,56,221,193
1192         movdqa  80(%rsp),%xmm0
1193 .byte   102,69,15,56,221,202
1194         movups  16-128(%rcx),%xmm1
1195
1196         movups  %xmm2,(%rsi)
1197         movdqa  %xmm11,%xmm2
1198         movups  %xmm3,16(%rsi)
1199         movdqa  %xmm12,%xmm3
1200         movups  %xmm4,32(%rsi)
1201         movdqa  %xmm13,%xmm4
1202         movups  %xmm5,48(%rsi)
1203         movdqa  %xmm14,%xmm5
1204         movups  %xmm6,64(%rsi)
1205         movdqa  %xmm15,%xmm6
1206         movups  %xmm7,80(%rsi)
1207         movdqa  %xmm0,%xmm7
1208         movups  %xmm8,96(%rsi)
1209         movups  %xmm9,112(%rsi)
1210         leaq    128(%rsi),%rsi
1211
1212         subq    $8,%rdx
1213         jnc     L$ctr32_loop8
1214
1215         addq    $8,%rdx
1216         jz      L$ctr32_done
1217         leaq    -128(%rcx),%rcx
1218
1219 L$ctr32_tail:
1220         leaq    16(%rcx),%rcx
1221         cmpq    $4,%rdx
1222         jb      L$ctr32_loop3
1223         je      L$ctr32_loop4
1224
1225         movdqa  96(%rsp),%xmm8
1226         pxor    %xmm9,%xmm9
1227
1228         movups  16(%rcx),%xmm0
1229 .byte   102,15,56,220,209
1230         leaq    16(%rcx),%rcx
1231 .byte   102,15,56,220,217
1232         shrl    $1,%eax
1233 .byte   102,15,56,220,225
1234         decl    %eax
1235 .byte   102,15,56,220,233
1236         movups  (%rdi),%xmm10
1237 .byte   102,15,56,220,241
1238         movups  16(%rdi),%xmm11
1239 .byte   102,15,56,220,249
1240         movups  32(%rdi),%xmm12
1241 .byte   102,68,15,56,220,193
1242         movups  16(%rcx),%xmm1
1243
1244         call    L$enc_loop8_enter
1245
1246         movdqu  48(%rdi),%xmm13
1247         pxor    %xmm10,%xmm2
1248         movdqu  64(%rdi),%xmm10
1249         pxor    %xmm11,%xmm3
1250         movdqu  %xmm2,(%rsi)
1251         pxor    %xmm12,%xmm4
1252         movdqu  %xmm3,16(%rsi)
1253         pxor    %xmm13,%xmm5
1254         movdqu  %xmm4,32(%rsi)
1255         pxor    %xmm10,%xmm6
1256         movdqu  %xmm5,48(%rsi)
1257         movdqu  %xmm6,64(%rsi)
1258         cmpq    $6,%rdx
1259         jb      L$ctr32_done
1260
1261         movups  80(%rdi),%xmm11
1262         xorps   %xmm11,%xmm7
1263         movups  %xmm7,80(%rsi)
1264         je      L$ctr32_done
1265
1266         movups  96(%rdi),%xmm12
1267         xorps   %xmm12,%xmm8
1268         movups  %xmm8,96(%rsi)
1269         jmp     L$ctr32_done
1270
1271 .p2align        5
1272 L$ctr32_loop4:
1273 .byte   102,15,56,220,209
1274         leaq    16(%rcx),%rcx
1275 .byte   102,15,56,220,217
1276 .byte   102,15,56,220,225
1277 .byte   102,15,56,220,233
1278         movups  (%rcx),%xmm1
1279         decl    %eax
1280         jnz     L$ctr32_loop4
1281 .byte   102,15,56,221,209
1282         movups  (%rdi),%xmm10
1283 .byte   102,15,56,221,217
1284         movups  16(%rdi),%xmm11
1285 .byte   102,15,56,221,225
1286         movups  32(%rdi),%xmm12
1287 .byte   102,15,56,221,233
1288         movups  48(%rdi),%xmm13
1289
1290         xorps   %xmm10,%xmm2
1291         movups  %xmm2,(%rsi)
1292         xorps   %xmm11,%xmm3
1293         movups  %xmm3,16(%rsi)
1294         pxor    %xmm12,%xmm4
1295         movdqu  %xmm4,32(%rsi)
1296         pxor    %xmm13,%xmm5
1297         movdqu  %xmm5,48(%rsi)
1298         jmp     L$ctr32_done
1299
1300 .p2align        5
1301 L$ctr32_loop3:
1302 .byte   102,15,56,220,209
1303         leaq    16(%rcx),%rcx
1304 .byte   102,15,56,220,217
1305 .byte   102,15,56,220,225
1306         movups  (%rcx),%xmm1
1307         decl    %eax
1308         jnz     L$ctr32_loop3
1309 .byte   102,15,56,221,209
1310 .byte   102,15,56,221,217
1311 .byte   102,15,56,221,225
1312
1313         movups  (%rdi),%xmm10
1314         xorps   %xmm10,%xmm2
1315         movups  %xmm2,(%rsi)
1316         cmpq    $2,%rdx
1317         jb      L$ctr32_done
1318
1319         movups  16(%rdi),%xmm11
1320         xorps   %xmm11,%xmm3
1321         movups  %xmm3,16(%rsi)
1322         je      L$ctr32_done
1323
1324         movups  32(%rdi),%xmm12
1325         xorps   %xmm12,%xmm4
1326         movups  %xmm4,32(%rsi)
1327         jmp     L$ctr32_done
1328
1329 .p2align        4
1330 L$ctr32_one_shortcut:
1331         movups  (%r8),%xmm2
1332         movups  (%rdi),%xmm10
1333         movl    240(%rcx),%eax
1334         movups  (%rcx),%xmm0
1335         movups  16(%rcx),%xmm1
1336         leaq    32(%rcx),%rcx
1337         xorps   %xmm0,%xmm2
1338 L$oop_enc1_7:
1339 .byte   102,15,56,220,209
1340         decl    %eax
1341         movups  (%rcx),%xmm1
1342         leaq    16(%rcx),%rcx
1343         jnz     L$oop_enc1_7    
1344 .byte   102,15,56,221,209
1345         xorps   %xmm10,%xmm2
1346         movups  %xmm2,(%rsi)
1347         jmp     L$ctr32_done
1348
1349 .p2align        4
1350 L$ctr32_done:
1351         leaq    (%rbp),%rsp
1352         popq    %rbp
1353 L$ctr32_epilogue:
1354         .byte   0xf3,0xc3
1355
1356 .globl  _aesni_xts_encrypt
1357
1358 .p2align        4
1359 _aesni_xts_encrypt:
1360         leaq    (%rsp),%rax
1361         pushq   %rbp
1362         subq    $112,%rsp
1363         andq    $-16,%rsp
1364         leaq    -8(%rax),%rbp
1365         movups  (%r9),%xmm15
1366         movl    240(%r8),%eax
1367         movl    240(%rcx),%r10d
1368         movups  (%r8),%xmm0
1369         movups  16(%r8),%xmm1
1370         leaq    32(%r8),%r8
1371         xorps   %xmm0,%xmm15
1372 L$oop_enc1_8:
1373 .byte   102,68,15,56,220,249
1374         decl    %eax
1375         movups  (%r8),%xmm1
1376         leaq    16(%r8),%r8
1377         jnz     L$oop_enc1_8    
1378 .byte   102,68,15,56,221,249
1379         movups  (%rcx),%xmm0
1380         movq    %rcx,%r11
1381         movl    %r10d,%eax
1382         shll    $4,%r10d
1383         movq    %rdx,%r9
1384         andq    $-16,%rdx
1385
1386         movups  16(%rcx,%r10,1),%xmm1
1387         movl    %eax,%r10d
1388
1389         movdqa  L$xts_magic(%rip),%xmm8
1390         pshufd  $95,%xmm15,%xmm9
1391         pxor    %xmm0,%xmm1
1392         movdqa  %xmm9,%xmm14
1393         paddd   %xmm9,%xmm9
1394         movdqa  %xmm15,%xmm10
1395         psrad   $31,%xmm14
1396         paddq   %xmm15,%xmm15
1397         pand    %xmm8,%xmm14
1398         pxor    %xmm0,%xmm10
1399         pxor    %xmm14,%xmm15
1400         movdqa  %xmm9,%xmm14
1401         paddd   %xmm9,%xmm9
1402         movdqa  %xmm15,%xmm11
1403         psrad   $31,%xmm14
1404         paddq   %xmm15,%xmm15
1405         pand    %xmm8,%xmm14
1406         pxor    %xmm0,%xmm11
1407         pxor    %xmm14,%xmm15
1408         movdqa  %xmm9,%xmm14
1409         paddd   %xmm9,%xmm9
1410         movdqa  %xmm15,%xmm12
1411         psrad   $31,%xmm14
1412         paddq   %xmm15,%xmm15
1413         pand    %xmm8,%xmm14
1414         pxor    %xmm0,%xmm12
1415         pxor    %xmm14,%xmm15
1416         movdqa  %xmm9,%xmm14
1417         paddd   %xmm9,%xmm9
1418         movdqa  %xmm15,%xmm13
1419         psrad   $31,%xmm14
1420         paddq   %xmm15,%xmm15
1421         pand    %xmm8,%xmm14
1422         pxor    %xmm0,%xmm13
1423         pxor    %xmm14,%xmm15
1424         movdqa  %xmm15,%xmm14
1425         psrad   $31,%xmm9
1426         paddq   %xmm15,%xmm15
1427         pand    %xmm8,%xmm9
1428         pxor    %xmm0,%xmm14
1429         pxor    %xmm9,%xmm15
1430         movaps  %xmm1,96(%rsp)
1431
1432         subq    $96,%rdx
1433         jc      L$xts_enc_short
1434
1435         shrl    $1,%eax
1436         subl    $3,%eax
1437         movups  16(%r11),%xmm1
1438         movl    %eax,%r10d
1439         leaq    L$xts_magic(%rip),%r8
1440         jmp     L$xts_enc_grandloop
1441
1442 .p2align        5
1443 L$xts_enc_grandloop:
1444         movdqu  0(%rdi),%xmm2
1445         movdqa  %xmm0,%xmm8
1446         movdqu  16(%rdi),%xmm3
1447         pxor    %xmm10,%xmm2
1448         movdqu  32(%rdi),%xmm4
1449         pxor    %xmm11,%xmm3
1450 .byte   102,15,56,220,209
1451         movdqu  48(%rdi),%xmm5
1452         pxor    %xmm12,%xmm4
1453 .byte   102,15,56,220,217
1454         movdqu  64(%rdi),%xmm6
1455         pxor    %xmm13,%xmm5
1456 .byte   102,15,56,220,225
1457         movdqu  80(%rdi),%xmm7
1458         pxor    %xmm15,%xmm8
1459         movdqa  96(%rsp),%xmm9
1460         pxor    %xmm14,%xmm6
1461 .byte   102,15,56,220,233
1462         movups  32(%r11),%xmm0
1463         leaq    96(%rdi),%rdi
1464         pxor    %xmm8,%xmm7
1465
1466         pxor    %xmm9,%xmm10
1467 .byte   102,15,56,220,241
1468         pxor    %xmm9,%xmm11
1469         movdqa  %xmm10,0(%rsp)
1470 .byte   102,15,56,220,249
1471         movups  48(%r11),%xmm1
1472
1473 .byte   102,15,56,220,208
1474         pxor    %xmm9,%xmm12
1475         movdqa  %xmm11,16(%rsp)
1476 .byte   102,15,56,220,216
1477         pxor    %xmm9,%xmm13
1478         movdqa  %xmm12,32(%rsp)
1479 .byte   102,15,56,220,224
1480         pxor    %xmm9,%xmm14
1481 .byte   102,15,56,220,232
1482         pxor    %xmm9,%xmm8
1483         movdqa  %xmm14,64(%rsp)
1484 .byte   102,15,56,220,240
1485         movdqa  %xmm8,80(%rsp)
1486 .byte   102,15,56,220,248
1487         movups  64(%r11),%xmm0
1488         leaq    64(%r11),%rcx
1489         pshufd  $95,%xmm15,%xmm9
1490         jmp     L$xts_enc_loop6
1491 .p2align        5
1492 L$xts_enc_loop6:
1493 .byte   102,15,56,220,209
1494 .byte   102,15,56,220,217
1495 .byte   102,15,56,220,225
1496 .byte   102,15,56,220,233
1497 .byte   102,15,56,220,241
1498 .byte   102,15,56,220,249
1499         movups  16(%rcx),%xmm1
1500         leaq    32(%rcx),%rcx
1501
1502 .byte   102,15,56,220,208
1503 .byte   102,15,56,220,216
1504 .byte   102,15,56,220,224
1505 .byte   102,15,56,220,232
1506 .byte   102,15,56,220,240
1507 .byte   102,15,56,220,248
1508         movups  (%rcx),%xmm0
1509         decl    %eax
1510         jnz     L$xts_enc_loop6
1511
1512         movdqa  (%r8),%xmm8
1513         movdqa  %xmm9,%xmm14
1514         paddd   %xmm9,%xmm9
1515 .byte   102,15,56,220,209
1516         paddq   %xmm15,%xmm15
1517         psrad   $31,%xmm14
1518 .byte   102,15,56,220,217
1519         pand    %xmm8,%xmm14
1520         movups  (%r11),%xmm10
1521 .byte   102,15,56,220,225
1522 .byte   102,15,56,220,233
1523         pxor    %xmm14,%xmm15
1524 .byte   102,15,56,220,241
1525         movaps  %xmm10,%xmm11
1526 .byte   102,15,56,220,249
1527         movups  16(%rcx),%xmm1
1528
1529         movdqa  %xmm9,%xmm14
1530         paddd   %xmm9,%xmm9
1531 .byte   102,15,56,220,208
1532         pxor    %xmm15,%xmm10
1533         psrad   $31,%xmm14
1534 .byte   102,15,56,220,216
1535         paddq   %xmm15,%xmm15
1536         pand    %xmm8,%xmm14
1537 .byte   102,15,56,220,224
1538 .byte   102,15,56,220,232
1539         pxor    %xmm14,%xmm15
1540 .byte   102,15,56,220,240
1541         movaps  %xmm11,%xmm12
1542 .byte   102,15,56,220,248
1543         movups  32(%rcx),%xmm0
1544
1545         movdqa  %xmm9,%xmm14
1546         paddd   %xmm9,%xmm9
1547 .byte   102,15,56,220,209
1548         pxor    %xmm15,%xmm11
1549         psrad   $31,%xmm14
1550 .byte   102,15,56,220,217
1551         paddq   %xmm15,%xmm15
1552         pand    %xmm8,%xmm14
1553 .byte   102,15,56,220,225
1554         movdqa  %xmm13,48(%rsp)
1555 .byte   102,15,56,220,233
1556         pxor    %xmm14,%xmm15
1557 .byte   102,15,56,220,241
1558         movaps  %xmm12,%xmm13
1559 .byte   102,15,56,220,249
1560         movups  48(%rcx),%xmm1
1561
1562         movdqa  %xmm9,%xmm14
1563         paddd   %xmm9,%xmm9
1564 .byte   102,15,56,220,208
1565         pxor    %xmm15,%xmm12
1566         psrad   $31,%xmm14
1567 .byte   102,15,56,220,216
1568         paddq   %xmm15,%xmm15
1569         pand    %xmm8,%xmm14
1570 .byte   102,15,56,220,224
1571 .byte   102,15,56,220,232
1572         pxor    %xmm14,%xmm15
1573 .byte   102,15,56,220,240
1574         movaps  %xmm13,%xmm14
1575 .byte   102,15,56,220,248
1576
1577         movdqa  %xmm9,%xmm0
1578         paddd   %xmm9,%xmm9
1579 .byte   102,15,56,220,209
1580         pxor    %xmm15,%xmm13
1581         psrad   $31,%xmm0
1582 .byte   102,15,56,220,217
1583         paddq   %xmm15,%xmm15
1584         pand    %xmm8,%xmm0
1585 .byte   102,15,56,220,225
1586 .byte   102,15,56,220,233
1587         pxor    %xmm0,%xmm15
1588         movups  (%r11),%xmm0
1589 .byte   102,15,56,220,241
1590 .byte   102,15,56,220,249
1591         movups  16(%r11),%xmm1
1592
1593         pxor    %xmm15,%xmm14
1594         psrad   $31,%xmm9
1595 .byte   102,15,56,221,84,36,0
1596         paddq   %xmm15,%xmm15
1597         pand    %xmm8,%xmm9
1598 .byte   102,15,56,221,92,36,16
1599 .byte   102,15,56,221,100,36,32
1600         pxor    %xmm9,%xmm15
1601 .byte   102,15,56,221,108,36,48
1602 .byte   102,15,56,221,116,36,64
1603 .byte   102,15,56,221,124,36,80
1604         movl    %r10d,%eax
1605
1606         leaq    96(%rsi),%rsi
1607         movups  %xmm2,-96(%rsi)
1608         movups  %xmm3,-80(%rsi)
1609         movups  %xmm4,-64(%rsi)
1610         movups  %xmm5,-48(%rsi)
1611         movups  %xmm6,-32(%rsi)
1612         movups  %xmm7,-16(%rsi)
1613         subq    $96,%rdx
1614         jnc     L$xts_enc_grandloop
1615
1616         leal    7(%rax,%rax,1),%eax
1617         movq    %r11,%rcx
1618         movl    %eax,%r10d
1619
1620 L$xts_enc_short:
1621         pxor    %xmm0,%xmm10
1622         addq    $96,%rdx
1623         jz      L$xts_enc_done
1624
1625         pxor    %xmm0,%xmm11
1626         cmpq    $32,%rdx
1627         jb      L$xts_enc_one
1628         pxor    %xmm0,%xmm12
1629         je      L$xts_enc_two
1630
1631         pxor    %xmm0,%xmm13
1632         cmpq    $64,%rdx
1633         jb      L$xts_enc_three
1634         pxor    %xmm0,%xmm14
1635         je      L$xts_enc_four
1636
1637         movdqu  (%rdi),%xmm2
1638         movdqu  16(%rdi),%xmm3
1639         movdqu  32(%rdi),%xmm4
1640         pxor    %xmm10,%xmm2
1641         movdqu  48(%rdi),%xmm5
1642         pxor    %xmm11,%xmm3
1643         movdqu  64(%rdi),%xmm6
1644         leaq    80(%rdi),%rdi
1645         pxor    %xmm12,%xmm4
1646         pxor    %xmm13,%xmm5
1647         pxor    %xmm14,%xmm6
1648
1649         call    _aesni_encrypt6
1650
1651         xorps   %xmm10,%xmm2
1652         movdqa  %xmm15,%xmm10
1653         xorps   %xmm11,%xmm3
1654         xorps   %xmm12,%xmm4
1655         movdqu  %xmm2,(%rsi)
1656         xorps   %xmm13,%xmm5
1657         movdqu  %xmm3,16(%rsi)
1658         xorps   %xmm14,%xmm6
1659         movdqu  %xmm4,32(%rsi)
1660         movdqu  %xmm5,48(%rsi)
1661         movdqu  %xmm6,64(%rsi)
1662         leaq    80(%rsi),%rsi
1663         jmp     L$xts_enc_done
1664
1665 .p2align        4
1666 L$xts_enc_one:
1667         movups  (%rdi),%xmm2
1668         leaq    16(%rdi),%rdi
1669         xorps   %xmm10,%xmm2
1670         movups  (%rcx),%xmm0
1671         movups  16(%rcx),%xmm1
1672         leaq    32(%rcx),%rcx
1673         xorps   %xmm0,%xmm2
1674 L$oop_enc1_9:
1675 .byte   102,15,56,220,209
1676         decl    %eax
1677         movups  (%rcx),%xmm1
1678         leaq    16(%rcx),%rcx
1679         jnz     L$oop_enc1_9    
1680 .byte   102,15,56,221,209
1681         xorps   %xmm10,%xmm2
1682         movdqa  %xmm11,%xmm10
1683         movups  %xmm2,(%rsi)
1684         leaq    16(%rsi),%rsi
1685         jmp     L$xts_enc_done
1686
1687 .p2align        4
1688 L$xts_enc_two:
1689         movups  (%rdi),%xmm2
1690         movups  16(%rdi),%xmm3
1691         leaq    32(%rdi),%rdi
1692         xorps   %xmm10,%xmm2
1693         xorps   %xmm11,%xmm3
1694
1695         call    _aesni_encrypt3
1696
1697         xorps   %xmm10,%xmm2
1698         movdqa  %xmm12,%xmm10
1699         xorps   %xmm11,%xmm3
1700         movups  %xmm2,(%rsi)
1701         movups  %xmm3,16(%rsi)
1702         leaq    32(%rsi),%rsi
1703         jmp     L$xts_enc_done
1704
1705 .p2align        4
1706 L$xts_enc_three:
1707         movups  (%rdi),%xmm2
1708         movups  16(%rdi),%xmm3
1709         movups  32(%rdi),%xmm4
1710         leaq    48(%rdi),%rdi
1711         xorps   %xmm10,%xmm2
1712         xorps   %xmm11,%xmm3
1713         xorps   %xmm12,%xmm4
1714
1715         call    _aesni_encrypt3
1716
1717         xorps   %xmm10,%xmm2
1718         movdqa  %xmm13,%xmm10
1719         xorps   %xmm11,%xmm3
1720         xorps   %xmm12,%xmm4
1721         movups  %xmm2,(%rsi)
1722         movups  %xmm3,16(%rsi)
1723         movups  %xmm4,32(%rsi)
1724         leaq    48(%rsi),%rsi
1725         jmp     L$xts_enc_done
1726
1727 .p2align        4
1728 L$xts_enc_four:
1729         movups  (%rdi),%xmm2
1730         movups  16(%rdi),%xmm3
1731         movups  32(%rdi),%xmm4
1732         xorps   %xmm10,%xmm2
1733         movups  48(%rdi),%xmm5
1734         leaq    64(%rdi),%rdi
1735         xorps   %xmm11,%xmm3
1736         xorps   %xmm12,%xmm4
1737         xorps   %xmm13,%xmm5
1738
1739         call    _aesni_encrypt4
1740
1741         pxor    %xmm10,%xmm2
1742         movdqa  %xmm14,%xmm10
1743         pxor    %xmm11,%xmm3
1744         pxor    %xmm12,%xmm4
1745         movdqu  %xmm2,(%rsi)
1746         pxor    %xmm13,%xmm5
1747         movdqu  %xmm3,16(%rsi)
1748         movdqu  %xmm4,32(%rsi)
1749         movdqu  %xmm5,48(%rsi)
1750         leaq    64(%rsi),%rsi
1751         jmp     L$xts_enc_done
1752
1753 .p2align        4
1754 L$xts_enc_done:
1755         andq    $15,%r9
1756         jz      L$xts_enc_ret
1757         movq    %r9,%rdx
1758
1759 L$xts_enc_steal:
1760         movzbl  (%rdi),%eax
1761         movzbl  -16(%rsi),%ecx
1762         leaq    1(%rdi),%rdi
1763         movb    %al,-16(%rsi)
1764         movb    %cl,0(%rsi)
1765         leaq    1(%rsi),%rsi
1766         subq    $1,%rdx
1767         jnz     L$xts_enc_steal
1768
1769         subq    %r9,%rsi
1770         movq    %r11,%rcx
1771         movl    %r10d,%eax
1772
1773         movups  -16(%rsi),%xmm2
1774         xorps   %xmm10,%xmm2
1775         movups  (%rcx),%xmm0
1776         movups  16(%rcx),%xmm1
1777         leaq    32(%rcx),%rcx
1778         xorps   %xmm0,%xmm2
1779 L$oop_enc1_10:
1780 .byte   102,15,56,220,209
1781         decl    %eax
1782         movups  (%rcx),%xmm1
1783         leaq    16(%rcx),%rcx
1784         jnz     L$oop_enc1_10   
1785 .byte   102,15,56,221,209
1786         xorps   %xmm10,%xmm2
1787         movups  %xmm2,-16(%rsi)
1788
1789 L$xts_enc_ret:
1790         leaq    (%rbp),%rsp
1791         popq    %rbp
1792 L$xts_enc_epilogue:
1793         .byte   0xf3,0xc3
1794
1795 .globl  _aesni_xts_decrypt
1796
1797 .p2align        4
1798 _aesni_xts_decrypt:
1799         leaq    (%rsp),%rax
1800         pushq   %rbp
1801         subq    $112,%rsp
1802         andq    $-16,%rsp
1803         leaq    -8(%rax),%rbp
1804         movups  (%r9),%xmm15
1805         movl    240(%r8),%eax
1806         movl    240(%rcx),%r10d
1807         movups  (%r8),%xmm0
1808         movups  16(%r8),%xmm1
1809         leaq    32(%r8),%r8
1810         xorps   %xmm0,%xmm15
1811 L$oop_enc1_11:
1812 .byte   102,68,15,56,220,249
1813         decl    %eax
1814         movups  (%r8),%xmm1
1815         leaq    16(%r8),%r8
1816         jnz     L$oop_enc1_11   
1817 .byte   102,68,15,56,221,249
1818         xorl    %eax,%eax
1819         testq   $15,%rdx
1820         setnz   %al
1821         shlq    $4,%rax
1822         subq    %rax,%rdx
1823
1824         movups  (%rcx),%xmm0
1825         movq    %rcx,%r11
1826         movl    %r10d,%eax
1827         shll    $4,%r10d
1828         movq    %rdx,%r9
1829         andq    $-16,%rdx
1830
1831         movups  16(%rcx,%r10,1),%xmm1
1832         movl    %eax,%r10d
1833
1834         movdqa  L$xts_magic(%rip),%xmm8
1835         pshufd  $95,%xmm15,%xmm9
1836         pxor    %xmm0,%xmm1
1837         movdqa  %xmm9,%xmm14
1838         paddd   %xmm9,%xmm9
1839         movdqa  %xmm15,%xmm10
1840         psrad   $31,%xmm14
1841         paddq   %xmm15,%xmm15
1842         pand    %xmm8,%xmm14
1843         pxor    %xmm0,%xmm10
1844         pxor    %xmm14,%xmm15
1845         movdqa  %xmm9,%xmm14
1846         paddd   %xmm9,%xmm9
1847         movdqa  %xmm15,%xmm11
1848         psrad   $31,%xmm14
1849         paddq   %xmm15,%xmm15
1850         pand    %xmm8,%xmm14
1851         pxor    %xmm0,%xmm11
1852         pxor    %xmm14,%xmm15
1853         movdqa  %xmm9,%xmm14
1854         paddd   %xmm9,%xmm9
1855         movdqa  %xmm15,%xmm12
1856         psrad   $31,%xmm14
1857         paddq   %xmm15,%xmm15
1858         pand    %xmm8,%xmm14
1859         pxor    %xmm0,%xmm12
1860         pxor    %xmm14,%xmm15
1861         movdqa  %xmm9,%xmm14
1862         paddd   %xmm9,%xmm9
1863         movdqa  %xmm15,%xmm13
1864         psrad   $31,%xmm14
1865         paddq   %xmm15,%xmm15
1866         pand    %xmm8,%xmm14
1867         pxor    %xmm0,%xmm13
1868         pxor    %xmm14,%xmm15
1869         movdqa  %xmm15,%xmm14
1870         psrad   $31,%xmm9
1871         paddq   %xmm15,%xmm15
1872         pand    %xmm8,%xmm9
1873         pxor    %xmm0,%xmm14
1874         pxor    %xmm9,%xmm15
1875         movaps  %xmm1,96(%rsp)
1876
1877         subq    $96,%rdx
1878         jc      L$xts_dec_short
1879
1880         shrl    $1,%eax
1881         subl    $3,%eax
1882         movups  16(%r11),%xmm1
1883         movl    %eax,%r10d
1884         leaq    L$xts_magic(%rip),%r8
1885         jmp     L$xts_dec_grandloop
1886
1887 .p2align        5
1888 L$xts_dec_grandloop:
1889         movdqu  0(%rdi),%xmm2
1890         movdqa  %xmm0,%xmm8
1891         movdqu  16(%rdi),%xmm3
1892         pxor    %xmm10,%xmm2
1893         movdqu  32(%rdi),%xmm4
1894         pxor    %xmm11,%xmm3
1895 .byte   102,15,56,222,209
1896         movdqu  48(%rdi),%xmm5
1897         pxor    %xmm12,%xmm4
1898 .byte   102,15,56,222,217
1899         movdqu  64(%rdi),%xmm6
1900         pxor    %xmm13,%xmm5
1901 .byte   102,15,56,222,225
1902         movdqu  80(%rdi),%xmm7
1903         pxor    %xmm15,%xmm8
1904         movdqa  96(%rsp),%xmm9
1905         pxor    %xmm14,%xmm6
1906 .byte   102,15,56,222,233
1907         movups  32(%r11),%xmm0
1908         leaq    96(%rdi),%rdi
1909         pxor    %xmm8,%xmm7
1910
1911         pxor    %xmm9,%xmm10
1912 .byte   102,15,56,222,241
1913         pxor    %xmm9,%xmm11
1914         movdqa  %xmm10,0(%rsp)
1915 .byte   102,15,56,222,249
1916         movups  48(%r11),%xmm1
1917
1918 .byte   102,15,56,222,208
1919         pxor    %xmm9,%xmm12
1920         movdqa  %xmm11,16(%rsp)
1921 .byte   102,15,56,222,216
1922         pxor    %xmm9,%xmm13
1923         movdqa  %xmm12,32(%rsp)
1924 .byte   102,15,56,222,224
1925         pxor    %xmm9,%xmm14
1926 .byte   102,15,56,222,232
1927         pxor    %xmm9,%xmm8
1928         movdqa  %xmm14,64(%rsp)
1929 .byte   102,15,56,222,240
1930         movdqa  %xmm8,80(%rsp)
1931 .byte   102,15,56,222,248
1932         movups  64(%r11),%xmm0
1933         leaq    64(%r11),%rcx
1934         pshufd  $95,%xmm15,%xmm9
1935         jmp     L$xts_dec_loop6
1936 .p2align        5
1937 L$xts_dec_loop6:
1938 .byte   102,15,56,222,209
1939 .byte   102,15,56,222,217
1940 .byte   102,15,56,222,225
1941 .byte   102,15,56,222,233
1942 .byte   102,15,56,222,241
1943 .byte   102,15,56,222,249
1944         movups  16(%rcx),%xmm1
1945         leaq    32(%rcx),%rcx
1946
1947 .byte   102,15,56,222,208
1948 .byte   102,15,56,222,216
1949 .byte   102,15,56,222,224
1950 .byte   102,15,56,222,232
1951 .byte   102,15,56,222,240
1952 .byte   102,15,56,222,248
1953         movups  (%rcx),%xmm0
1954         decl    %eax
1955         jnz     L$xts_dec_loop6
1956
1957         movdqa  (%r8),%xmm8
1958         movdqa  %xmm9,%xmm14
1959         paddd   %xmm9,%xmm9
1960 .byte   102,15,56,222,209
1961         paddq   %xmm15,%xmm15
1962         psrad   $31,%xmm14
1963 .byte   102,15,56,222,217
1964         pand    %xmm8,%xmm14
1965         movups  (%r11),%xmm10
1966 .byte   102,15,56,222,225
1967 .byte   102,15,56,222,233
1968         pxor    %xmm14,%xmm15
1969 .byte   102,15,56,222,241
1970         movaps  %xmm10,%xmm11
1971 .byte   102,15,56,222,249
1972         movups  16(%rcx),%xmm1
1973
1974         movdqa  %xmm9,%xmm14
1975         paddd   %xmm9,%xmm9
1976 .byte   102,15,56,222,208
1977         pxor    %xmm15,%xmm10
1978         psrad   $31,%xmm14
1979 .byte   102,15,56,222,216
1980         paddq   %xmm15,%xmm15
1981         pand    %xmm8,%xmm14
1982 .byte   102,15,56,222,224
1983 .byte   102,15,56,222,232
1984         pxor    %xmm14,%xmm15
1985 .byte   102,15,56,222,240
1986         movaps  %xmm11,%xmm12
1987 .byte   102,15,56,222,248
1988         movups  32(%rcx),%xmm0
1989
1990         movdqa  %xmm9,%xmm14
1991         paddd   %xmm9,%xmm9
1992 .byte   102,15,56,222,209
1993         pxor    %xmm15,%xmm11
1994         psrad   $31,%xmm14
1995 .byte   102,15,56,222,217
1996         paddq   %xmm15,%xmm15
1997         pand    %xmm8,%xmm14
1998 .byte   102,15,56,222,225
1999         movdqa  %xmm13,48(%rsp)
2000 .byte   102,15,56,222,233
2001         pxor    %xmm14,%xmm15
2002 .byte   102,15,56,222,241
2003         movaps  %xmm12,%xmm13
2004 .byte   102,15,56,222,249
2005         movups  48(%rcx),%xmm1
2006
2007         movdqa  %xmm9,%xmm14
2008         paddd   %xmm9,%xmm9
2009 .byte   102,15,56,222,208
2010         pxor    %xmm15,%xmm12
2011         psrad   $31,%xmm14
2012 .byte   102,15,56,222,216
2013         paddq   %xmm15,%xmm15
2014         pand    %xmm8,%xmm14
2015 .byte   102,15,56,222,224
2016 .byte   102,15,56,222,232
2017         pxor    %xmm14,%xmm15
2018 .byte   102,15,56,222,240
2019         movaps  %xmm13,%xmm14
2020 .byte   102,15,56,222,248
2021
2022         movdqa  %xmm9,%xmm0
2023         paddd   %xmm9,%xmm9
2024 .byte   102,15,56,222,209
2025         pxor    %xmm15,%xmm13
2026         psrad   $31,%xmm0
2027 .byte   102,15,56,222,217
2028         paddq   %xmm15,%xmm15
2029         pand    %xmm8,%xmm0
2030 .byte   102,15,56,222,225
2031 .byte   102,15,56,222,233
2032         pxor    %xmm0,%xmm15
2033         movups  (%r11),%xmm0
2034 .byte   102,15,56,222,241
2035 .byte   102,15,56,222,249
2036         movups  16(%r11),%xmm1
2037
2038         pxor    %xmm15,%xmm14
2039         psrad   $31,%xmm9
2040 .byte   102,15,56,223,84,36,0
2041         paddq   %xmm15,%xmm15
2042         pand    %xmm8,%xmm9
2043 .byte   102,15,56,223,92,36,16
2044 .byte   102,15,56,223,100,36,32
2045         pxor    %xmm9,%xmm15
2046 .byte   102,15,56,223,108,36,48
2047 .byte   102,15,56,223,116,36,64
2048 .byte   102,15,56,223,124,36,80
2049         movl    %r10d,%eax
2050
2051         leaq    96(%rsi),%rsi
2052         movups  %xmm2,-96(%rsi)
2053         movups  %xmm3,-80(%rsi)
2054         movups  %xmm4,-64(%rsi)
2055         movups  %xmm5,-48(%rsi)
2056         movups  %xmm6,-32(%rsi)
2057         movups  %xmm7,-16(%rsi)
2058         subq    $96,%rdx
2059         jnc     L$xts_dec_grandloop
2060
2061         leal    7(%rax,%rax,1),%eax
2062         movq    %r11,%rcx
2063         movl    %eax,%r10d
2064
2065 L$xts_dec_short:
2066         pxor    %xmm0,%xmm10
2067         pxor    %xmm0,%xmm11
2068         addq    $96,%rdx
2069         jz      L$xts_dec_done
2070
2071         pxor    %xmm0,%xmm12
2072         cmpq    $32,%rdx
2073         jb      L$xts_dec_one
2074         pxor    %xmm0,%xmm13
2075         je      L$xts_dec_two
2076
2077         pxor    %xmm0,%xmm14
2078         cmpq    $64,%rdx
2079         jb      L$xts_dec_three
2080         je      L$xts_dec_four
2081
2082         movdqu  (%rdi),%xmm2
2083         movdqu  16(%rdi),%xmm3
2084         movdqu  32(%rdi),%xmm4
2085         pxor    %xmm10,%xmm2
2086         movdqu  48(%rdi),%xmm5
2087         pxor    %xmm11,%xmm3
2088         movdqu  64(%rdi),%xmm6
2089         leaq    80(%rdi),%rdi
2090         pxor    %xmm12,%xmm4
2091         pxor    %xmm13,%xmm5
2092         pxor    %xmm14,%xmm6
2093
2094         call    _aesni_decrypt6
2095
2096         xorps   %xmm10,%xmm2
2097         xorps   %xmm11,%xmm3
2098         xorps   %xmm12,%xmm4
2099         movdqu  %xmm2,(%rsi)
2100         xorps   %xmm13,%xmm5
2101         movdqu  %xmm3,16(%rsi)
2102         xorps   %xmm14,%xmm6
2103         movdqu  %xmm4,32(%rsi)
2104         pxor    %xmm14,%xmm14
2105         movdqu  %xmm5,48(%rsi)
2106         pcmpgtd %xmm15,%xmm14
2107         movdqu  %xmm6,64(%rsi)
2108         leaq    80(%rsi),%rsi
2109         pshufd  $19,%xmm14,%xmm11
2110         andq    $15,%r9
2111         jz      L$xts_dec_ret
2112
2113         movdqa  %xmm15,%xmm10
2114         paddq   %xmm15,%xmm15
2115         pand    %xmm8,%xmm11
2116         pxor    %xmm15,%xmm11
2117         jmp     L$xts_dec_done2
2118
2119 .p2align        4
2120 L$xts_dec_one:
2121         movups  (%rdi),%xmm2
2122         leaq    16(%rdi),%rdi
2123         xorps   %xmm10,%xmm2
2124         movups  (%rcx),%xmm0
2125         movups  16(%rcx),%xmm1
2126         leaq    32(%rcx),%rcx
2127         xorps   %xmm0,%xmm2
2128 L$oop_dec1_12:
2129 .byte   102,15,56,222,209
2130         decl    %eax
2131         movups  (%rcx),%xmm1
2132         leaq    16(%rcx),%rcx
2133         jnz     L$oop_dec1_12   
2134 .byte   102,15,56,223,209
2135         xorps   %xmm10,%xmm2
2136         movdqa  %xmm11,%xmm10
2137         movups  %xmm2,(%rsi)
2138         movdqa  %xmm12,%xmm11
2139         leaq    16(%rsi),%rsi
2140         jmp     L$xts_dec_done
2141
2142 .p2align        4
2143 L$xts_dec_two:
2144         movups  (%rdi),%xmm2
2145         movups  16(%rdi),%xmm3
2146         leaq    32(%rdi),%rdi
2147         xorps   %xmm10,%xmm2
2148         xorps   %xmm11,%xmm3
2149
2150         call    _aesni_decrypt3
2151
2152         xorps   %xmm10,%xmm2
2153         movdqa  %xmm12,%xmm10
2154         xorps   %xmm11,%xmm3
2155         movdqa  %xmm13,%xmm11
2156         movups  %xmm2,(%rsi)
2157         movups  %xmm3,16(%rsi)
2158         leaq    32(%rsi),%rsi
2159         jmp     L$xts_dec_done
2160
2161 .p2align        4
2162 L$xts_dec_three:
2163         movups  (%rdi),%xmm2
2164         movups  16(%rdi),%xmm3
2165         movups  32(%rdi),%xmm4
2166         leaq    48(%rdi),%rdi
2167         xorps   %xmm10,%xmm2
2168         xorps   %xmm11,%xmm3
2169         xorps   %xmm12,%xmm4
2170
2171         call    _aesni_decrypt3
2172
2173         xorps   %xmm10,%xmm2
2174         movdqa  %xmm13,%xmm10
2175         xorps   %xmm11,%xmm3
2176         movdqa  %xmm14,%xmm11
2177         xorps   %xmm12,%xmm4
2178         movups  %xmm2,(%rsi)
2179         movups  %xmm3,16(%rsi)
2180         movups  %xmm4,32(%rsi)
2181         leaq    48(%rsi),%rsi
2182         jmp     L$xts_dec_done
2183
2184 .p2align        4
2185 L$xts_dec_four:
2186         movups  (%rdi),%xmm2
2187         movups  16(%rdi),%xmm3
2188         movups  32(%rdi),%xmm4
2189         xorps   %xmm10,%xmm2
2190         movups  48(%rdi),%xmm5
2191         leaq    64(%rdi),%rdi
2192         xorps   %xmm11,%xmm3
2193         xorps   %xmm12,%xmm4
2194         xorps   %xmm13,%xmm5
2195
2196         call    _aesni_decrypt4
2197
2198         pxor    %xmm10,%xmm2
2199         movdqa  %xmm14,%xmm10
2200         pxor    %xmm11,%xmm3
2201         movdqa  %xmm15,%xmm11
2202         pxor    %xmm12,%xmm4
2203         movdqu  %xmm2,(%rsi)
2204         pxor    %xmm13,%xmm5
2205         movdqu  %xmm3,16(%rsi)
2206         movdqu  %xmm4,32(%rsi)
2207         movdqu  %xmm5,48(%rsi)
2208         leaq    64(%rsi),%rsi
2209         jmp     L$xts_dec_done
2210
2211 .p2align        4
2212 L$xts_dec_done:
2213         andq    $15,%r9
2214         jz      L$xts_dec_ret
2215 L$xts_dec_done2:
2216         movq    %r9,%rdx
2217         movq    %r11,%rcx
2218         movl    %r10d,%eax
2219
2220         movups  (%rdi),%xmm2
2221         xorps   %xmm11,%xmm2
2222         movups  (%rcx),%xmm0
2223         movups  16(%rcx),%xmm1
2224         leaq    32(%rcx),%rcx
2225         xorps   %xmm0,%xmm2
2226 L$oop_dec1_13:
2227 .byte   102,15,56,222,209
2228         decl    %eax
2229         movups  (%rcx),%xmm1
2230         leaq    16(%rcx),%rcx
2231         jnz     L$oop_dec1_13   
2232 .byte   102,15,56,223,209
2233         xorps   %xmm11,%xmm2
2234         movups  %xmm2,(%rsi)
2235
2236 L$xts_dec_steal:
2237         movzbl  16(%rdi),%eax
2238         movzbl  (%rsi),%ecx
2239         leaq    1(%rdi),%rdi
2240         movb    %al,(%rsi)
2241         movb    %cl,16(%rsi)
2242         leaq    1(%rsi),%rsi
2243         subq    $1,%rdx
2244         jnz     L$xts_dec_steal
2245
2246         subq    %r9,%rsi
2247         movq    %r11,%rcx
2248         movl    %r10d,%eax
2249
2250         movups  (%rsi),%xmm2
2251         xorps   %xmm10,%xmm2
2252         movups  (%rcx),%xmm0
2253         movups  16(%rcx),%xmm1
2254         leaq    32(%rcx),%rcx
2255         xorps   %xmm0,%xmm2
2256 L$oop_dec1_14:
2257 .byte   102,15,56,222,209
2258         decl    %eax
2259         movups  (%rcx),%xmm1
2260         leaq    16(%rcx),%rcx
2261         jnz     L$oop_dec1_14   
2262 .byte   102,15,56,223,209
2263         xorps   %xmm10,%xmm2
2264         movups  %xmm2,(%rsi)
2265
2266 L$xts_dec_ret:
2267         leaq    (%rbp),%rsp
2268         popq    %rbp
2269 L$xts_dec_epilogue:
2270         .byte   0xf3,0xc3
2271
2272 .globl  _aesni_cbc_encrypt
2273
2274 .p2align        4
2275 _aesni_cbc_encrypt:
2276         testq   %rdx,%rdx
2277         jz      L$cbc_ret
2278
2279         movl    240(%rcx),%r10d
2280         movq    %rcx,%r11
2281         testl   %r9d,%r9d
2282         jz      L$cbc_decrypt
2283
2284         movups  (%r8),%xmm2
2285         movl    %r10d,%eax
2286         cmpq    $16,%rdx
2287         jb      L$cbc_enc_tail
2288         subq    $16,%rdx
2289         jmp     L$cbc_enc_loop
2290 .p2align        4
2291 L$cbc_enc_loop:
2292         movups  (%rdi),%xmm3
2293         leaq    16(%rdi),%rdi
2294
2295         movups  (%rcx),%xmm0
2296         movups  16(%rcx),%xmm1
2297         xorps   %xmm0,%xmm3
2298         leaq    32(%rcx),%rcx
2299         xorps   %xmm3,%xmm2
2300 L$oop_enc1_15:
2301 .byte   102,15,56,220,209
2302         decl    %eax
2303         movups  (%rcx),%xmm1
2304         leaq    16(%rcx),%rcx
2305         jnz     L$oop_enc1_15   
2306 .byte   102,15,56,221,209
2307         movl    %r10d,%eax
2308         movq    %r11,%rcx
2309         movups  %xmm2,0(%rsi)
2310         leaq    16(%rsi),%rsi
2311         subq    $16,%rdx
2312         jnc     L$cbc_enc_loop
2313         addq    $16,%rdx
2314         jnz     L$cbc_enc_tail
2315         movups  %xmm2,(%r8)
2316         jmp     L$cbc_ret
2317
2318 L$cbc_enc_tail:
2319         movq    %rdx,%rcx
2320         xchgq   %rdi,%rsi
2321 .long   0x9066A4F3      
2322         movl    $16,%ecx
2323         subq    %rdx,%rcx
2324         xorl    %eax,%eax
2325 .long   0x9066AAF3      
2326         leaq    -16(%rdi),%rdi
2327         movl    %r10d,%eax
2328         movq    %rdi,%rsi
2329         movq    %r11,%rcx
2330         xorq    %rdx,%rdx
2331         jmp     L$cbc_enc_loop  
2332
2333 .p2align        4
2334 L$cbc_decrypt:
2335         leaq    (%rsp),%rax
2336         pushq   %rbp
2337         subq    $16,%rsp
2338         andq    $-16,%rsp
2339         leaq    -8(%rax),%rbp
2340         movups  (%r8),%xmm10
2341         movl    %r10d,%eax
2342         cmpq    $80,%rdx
2343         jbe     L$cbc_dec_tail
2344
2345         movups  (%rcx),%xmm0
2346         movdqu  0(%rdi),%xmm2
2347         movdqu  16(%rdi),%xmm3
2348         movdqa  %xmm2,%xmm11
2349         movdqu  32(%rdi),%xmm4
2350         movdqa  %xmm3,%xmm12
2351         movdqu  48(%rdi),%xmm5
2352         movdqa  %xmm4,%xmm13
2353         movdqu  64(%rdi),%xmm6
2354         movdqa  %xmm5,%xmm14
2355         movdqu  80(%rdi),%xmm7
2356         movdqa  %xmm6,%xmm15
2357         cmpq    $112,%rdx
2358         jbe     L$cbc_dec_six_or_seven
2359
2360         subq    $112,%rdx
2361         leaq    112(%rcx),%rcx
2362         jmp     L$cbc_dec_loop8_enter
2363 .p2align        4
2364 L$cbc_dec_loop8:
2365         movups  %xmm9,(%rsi)
2366         leaq    16(%rsi),%rsi
2367 L$cbc_dec_loop8_enter:
2368         movdqu  96(%rdi),%xmm8
2369         pxor    %xmm0,%xmm2
2370         movdqu  112(%rdi),%xmm9
2371         pxor    %xmm0,%xmm3
2372         movups  16-112(%rcx),%xmm1
2373         pxor    %xmm0,%xmm4
2374         xorq    %r11,%r11
2375         cmpq    $112,%rdx
2376         pxor    %xmm0,%xmm5
2377         pxor    %xmm0,%xmm6
2378         pxor    %xmm0,%xmm7
2379         pxor    %xmm0,%xmm8
2380
2381 .byte   102,15,56,222,209
2382         pxor    %xmm0,%xmm9
2383         movups  32-112(%rcx),%xmm0
2384 .byte   102,15,56,222,217
2385 .byte   102,15,56,222,225
2386 .byte   102,15,56,222,233
2387 .byte   102,15,56,222,241
2388 .byte   102,15,56,222,249
2389         setnc   %r11b
2390 .byte   102,68,15,56,222,193
2391         shlq    $7,%r11
2392 .byte   102,68,15,56,222,201
2393         addq    %rdi,%r11
2394         movups  48-112(%rcx),%xmm1
2395 .byte   102,15,56,222,208
2396 .byte   102,15,56,222,216
2397 .byte   102,15,56,222,224
2398 .byte   102,15,56,222,232
2399 .byte   102,15,56,222,240
2400 .byte   102,15,56,222,248
2401 .byte   102,68,15,56,222,192
2402 .byte   102,68,15,56,222,200
2403         movups  64-112(%rcx),%xmm0
2404 .byte   102,15,56,222,209
2405 .byte   102,15,56,222,217
2406 .byte   102,15,56,222,225
2407 .byte   102,15,56,222,233
2408 .byte   102,15,56,222,241
2409 .byte   102,15,56,222,249
2410 .byte   102,68,15,56,222,193
2411 .byte   102,68,15,56,222,201
2412         movups  80-112(%rcx),%xmm1
2413 .byte   102,15,56,222,208
2414 .byte   102,15,56,222,216
2415 .byte   102,15,56,222,224
2416 .byte   102,15,56,222,232
2417 .byte   102,15,56,222,240
2418 .byte   102,15,56,222,248
2419 .byte   102,68,15,56,222,192
2420 .byte   102,68,15,56,222,200
2421         movups  96-112(%rcx),%xmm0
2422 .byte   102,15,56,222,209
2423 .byte   102,15,56,222,217
2424 .byte   102,15,56,222,225
2425 .byte   102,15,56,222,233
2426 .byte   102,15,56,222,241
2427 .byte   102,15,56,222,249
2428 .byte   102,68,15,56,222,193
2429 .byte   102,68,15,56,222,201
2430         movups  112-112(%rcx),%xmm1
2431 .byte   102,15,56,222,208
2432 .byte   102,15,56,222,216
2433 .byte   102,15,56,222,224
2434 .byte   102,15,56,222,232
2435 .byte   102,15,56,222,240
2436 .byte   102,15,56,222,248
2437 .byte   102,68,15,56,222,192
2438 .byte   102,68,15,56,222,200
2439         movups  128-112(%rcx),%xmm0
2440 .byte   102,15,56,222,209
2441 .byte   102,15,56,222,217
2442 .byte   102,15,56,222,225
2443 .byte   102,15,56,222,233
2444 .byte   102,15,56,222,241
2445 .byte   102,15,56,222,249
2446 .byte   102,68,15,56,222,193
2447 .byte   102,68,15,56,222,201
2448         movups  144-112(%rcx),%xmm1
2449 .byte   102,15,56,222,208
2450 .byte   102,15,56,222,216
2451 .byte   102,15,56,222,224
2452 .byte   102,15,56,222,232
2453 .byte   102,15,56,222,240
2454 .byte   102,15,56,222,248
2455 .byte   102,68,15,56,222,192
2456 .byte   102,68,15,56,222,200
2457         movups  160-112(%rcx),%xmm0
2458         cmpl    $11,%eax
2459         jb      L$cbc_dec_done
2460 .byte   102,15,56,222,209
2461 .byte   102,15,56,222,217
2462 .byte   102,15,56,222,225
2463 .byte   102,15,56,222,233
2464 .byte   102,15,56,222,241
2465 .byte   102,15,56,222,249
2466 .byte   102,68,15,56,222,193
2467 .byte   102,68,15,56,222,201
2468         movups  176-112(%rcx),%xmm1
2469 .byte   102,15,56,222,208
2470 .byte   102,15,56,222,216
2471 .byte   102,15,56,222,224
2472 .byte   102,15,56,222,232
2473 .byte   102,15,56,222,240
2474 .byte   102,15,56,222,248
2475 .byte   102,68,15,56,222,192
2476 .byte   102,68,15,56,222,200
2477         movups  192-112(%rcx),%xmm0
2478         je      L$cbc_dec_done
2479 .byte   102,15,56,222,209
2480 .byte   102,15,56,222,217
2481 .byte   102,15,56,222,225
2482 .byte   102,15,56,222,233
2483 .byte   102,15,56,222,241
2484 .byte   102,15,56,222,249
2485 .byte   102,68,15,56,222,193
2486 .byte   102,68,15,56,222,201
2487         movups  208-112(%rcx),%xmm1
2488 .byte   102,15,56,222,208
2489 .byte   102,15,56,222,216
2490 .byte   102,15,56,222,224
2491 .byte   102,15,56,222,232
2492 .byte   102,15,56,222,240
2493 .byte   102,15,56,222,248
2494 .byte   102,68,15,56,222,192
2495 .byte   102,68,15,56,222,200
2496         movups  224-112(%rcx),%xmm0
2497 L$cbc_dec_done:
2498 .byte   102,15,56,222,209
2499         pxor    %xmm0,%xmm10
2500 .byte   102,15,56,222,217
2501         pxor    %xmm0,%xmm11
2502 .byte   102,15,56,222,225
2503         pxor    %xmm0,%xmm12
2504 .byte   102,15,56,222,233
2505         pxor    %xmm0,%xmm13
2506 .byte   102,15,56,222,241
2507         pxor    %xmm0,%xmm14
2508 .byte   102,15,56,222,249
2509         pxor    %xmm0,%xmm15
2510 .byte   102,68,15,56,222,193
2511 .byte   102,68,15,56,222,201
2512         movdqu  80(%rdi),%xmm1
2513
2514 .byte   102,65,15,56,223,210
2515         movdqu  96(%rdi),%xmm10
2516         pxor    %xmm0,%xmm1
2517 .byte   102,65,15,56,223,219
2518         pxor    %xmm0,%xmm10
2519         movdqu  112(%rdi),%xmm0
2520         leaq    128(%rdi),%rdi
2521 .byte   102,65,15,56,223,228
2522         movdqu  0(%r11),%xmm11
2523 .byte   102,65,15,56,223,237
2524         movdqu  16(%r11),%xmm12
2525 .byte   102,65,15,56,223,246
2526         movdqu  32(%r11),%xmm13
2527 .byte   102,65,15,56,223,255
2528         movdqu  48(%r11),%xmm14
2529 .byte   102,68,15,56,223,193
2530         movdqu  64(%r11),%xmm15
2531 .byte   102,69,15,56,223,202
2532         movdqa  %xmm0,%xmm10
2533         movdqu  80(%r11),%xmm1
2534         movups  -112(%rcx),%xmm0
2535
2536         movups  %xmm2,(%rsi)
2537         movdqa  %xmm11,%xmm2
2538         movups  %xmm3,16(%rsi)
2539         movdqa  %xmm12,%xmm3
2540         movups  %xmm4,32(%rsi)
2541         movdqa  %xmm13,%xmm4
2542         movups  %xmm5,48(%rsi)
2543         movdqa  %xmm14,%xmm5
2544         movups  %xmm6,64(%rsi)
2545         movdqa  %xmm15,%xmm6
2546         movups  %xmm7,80(%rsi)
2547         movdqa  %xmm1,%xmm7
2548         movups  %xmm8,96(%rsi)
2549         leaq    112(%rsi),%rsi
2550
2551         subq    $128,%rdx
2552         ja      L$cbc_dec_loop8
2553
2554         movaps  %xmm9,%xmm2
2555         leaq    -112(%rcx),%rcx
2556         addq    $112,%rdx
2557         jle     L$cbc_dec_tail_collected
2558         movups  %xmm9,(%rsi)
2559         leaq    16(%rsi),%rsi
2560         cmpq    $80,%rdx
2561         jbe     L$cbc_dec_tail
2562
2563         movaps  %xmm11,%xmm2
2564 L$cbc_dec_six_or_seven:
2565         cmpq    $96,%rdx
2566         ja      L$cbc_dec_seven
2567
2568         movaps  %xmm7,%xmm8
2569         call    _aesni_decrypt6
2570         pxor    %xmm10,%xmm2
2571         movaps  %xmm8,%xmm10
2572         pxor    %xmm11,%xmm3
2573         movdqu  %xmm2,(%rsi)
2574         pxor    %xmm12,%xmm4
2575         movdqu  %xmm3,16(%rsi)
2576         pxor    %xmm13,%xmm5
2577         movdqu  %xmm4,32(%rsi)
2578         pxor    %xmm14,%xmm6
2579         movdqu  %xmm5,48(%rsi)
2580         pxor    %xmm15,%xmm7
2581         movdqu  %xmm6,64(%rsi)
2582         leaq    80(%rsi),%rsi
2583         movdqa  %xmm7,%xmm2
2584         jmp     L$cbc_dec_tail_collected
2585
2586 .p2align        4
2587 L$cbc_dec_seven:
2588         movups  96(%rdi),%xmm8
2589         xorps   %xmm9,%xmm9
2590         call    _aesni_decrypt8
2591         movups  80(%rdi),%xmm9
2592         pxor    %xmm10,%xmm2
2593         movups  96(%rdi),%xmm10
2594         pxor    %xmm11,%xmm3
2595         movdqu  %xmm2,(%rsi)
2596         pxor    %xmm12,%xmm4
2597         movdqu  %xmm3,16(%rsi)
2598         pxor    %xmm13,%xmm5
2599         movdqu  %xmm4,32(%rsi)
2600         pxor    %xmm14,%xmm6
2601         movdqu  %xmm5,48(%rsi)
2602         pxor    %xmm15,%xmm7
2603         movdqu  %xmm6,64(%rsi)
2604         pxor    %xmm9,%xmm8
2605         movdqu  %xmm7,80(%rsi)
2606         leaq    96(%rsi),%rsi
2607         movdqa  %xmm8,%xmm2
2608         jmp     L$cbc_dec_tail_collected
2609
2610 L$cbc_dec_tail:
2611         movups  (%rdi),%xmm2
2612         subq    $16,%rdx
2613         jbe     L$cbc_dec_one
2614
2615         movups  16(%rdi),%xmm3
2616         movaps  %xmm2,%xmm11
2617         subq    $16,%rdx
2618         jbe     L$cbc_dec_two
2619
2620         movups  32(%rdi),%xmm4
2621         movaps  %xmm3,%xmm12
2622         subq    $16,%rdx
2623         jbe     L$cbc_dec_three
2624
2625         movups  48(%rdi),%xmm5
2626         movaps  %xmm4,%xmm13
2627         subq    $16,%rdx
2628         jbe     L$cbc_dec_four
2629
2630         movups  64(%rdi),%xmm6
2631         movaps  %xmm5,%xmm14
2632         movaps  %xmm6,%xmm15
2633         xorps   %xmm7,%xmm7
2634         call    _aesni_decrypt6
2635         pxor    %xmm10,%xmm2
2636         movaps  %xmm15,%xmm10
2637         pxor    %xmm11,%xmm3
2638         movdqu  %xmm2,(%rsi)
2639         pxor    %xmm12,%xmm4
2640         movdqu  %xmm3,16(%rsi)
2641         pxor    %xmm13,%xmm5
2642         movdqu  %xmm4,32(%rsi)
2643         pxor    %xmm14,%xmm6
2644         movdqu  %xmm5,48(%rsi)
2645         leaq    64(%rsi),%rsi
2646         movdqa  %xmm6,%xmm2
2647         subq    $16,%rdx
2648         jmp     L$cbc_dec_tail_collected
2649
2650 .p2align        4
2651 L$cbc_dec_one:
2652         movaps  %xmm2,%xmm11
2653         movups  (%rcx),%xmm0
2654         movups  16(%rcx),%xmm1
2655         leaq    32(%rcx),%rcx
2656         xorps   %xmm0,%xmm2
2657 L$oop_dec1_16:
2658 .byte   102,15,56,222,209
2659         decl    %eax
2660         movups  (%rcx),%xmm1
2661         leaq    16(%rcx),%rcx
2662         jnz     L$oop_dec1_16   
2663 .byte   102,15,56,223,209
2664         xorps   %xmm10,%xmm2
2665         movaps  %xmm11,%xmm10
2666         jmp     L$cbc_dec_tail_collected
2667 .p2align        4
2668 L$cbc_dec_two:
2669         movaps  %xmm3,%xmm12
2670         xorps   %xmm4,%xmm4
2671         call    _aesni_decrypt3
2672         pxor    %xmm10,%xmm2
2673         movaps  %xmm12,%xmm10
2674         pxor    %xmm11,%xmm3
2675         movdqu  %xmm2,(%rsi)
2676         movdqa  %xmm3,%xmm2
2677         leaq    16(%rsi),%rsi
2678         jmp     L$cbc_dec_tail_collected
2679 .p2align        4
2680 L$cbc_dec_three:
2681         movaps  %xmm4,%xmm13
2682         call    _aesni_decrypt3
2683         pxor    %xmm10,%xmm2
2684         movaps  %xmm13,%xmm10
2685         pxor    %xmm11,%xmm3
2686         movdqu  %xmm2,(%rsi)
2687         pxor    %xmm12,%xmm4
2688         movdqu  %xmm3,16(%rsi)
2689         movdqa  %xmm4,%xmm2
2690         leaq    32(%rsi),%rsi
2691         jmp     L$cbc_dec_tail_collected
2692 .p2align        4
2693 L$cbc_dec_four:
2694         movaps  %xmm5,%xmm14
2695         call    _aesni_decrypt4
2696         pxor    %xmm10,%xmm2
2697         movaps  %xmm14,%xmm10
2698         pxor    %xmm11,%xmm3
2699         movdqu  %xmm2,(%rsi)
2700         pxor    %xmm12,%xmm4
2701         movdqu  %xmm3,16(%rsi)
2702         pxor    %xmm13,%xmm5
2703         movdqu  %xmm4,32(%rsi)
2704         movdqa  %xmm5,%xmm2
2705         leaq    48(%rsi),%rsi
2706         jmp     L$cbc_dec_tail_collected
2707
2708 .p2align        4
2709 L$cbc_dec_tail_collected:
2710         movups  %xmm10,(%r8)
2711         andq    $15,%rdx
2712         jnz     L$cbc_dec_tail_partial
2713         movups  %xmm2,(%rsi)
2714         jmp     L$cbc_dec_ret
2715 .p2align        4
2716 L$cbc_dec_tail_partial:
2717         movaps  %xmm2,(%rsp)
2718         movq    $16,%rcx
2719         movq    %rsi,%rdi
2720         subq    %rdx,%rcx
2721         leaq    (%rsp),%rsi
2722 .long   0x9066A4F3      
2723
2724 L$cbc_dec_ret:
2725         leaq    (%rbp),%rsp
2726         popq    %rbp
2727 L$cbc_ret:
2728         .byte   0xf3,0xc3
2729
2730 .globl  _aesni_set_decrypt_key
2731
2732 .p2align        4
2733 _aesni_set_decrypt_key:
2734 .byte   0x48,0x83,0xEC,0x08     
2735         call    __aesni_set_encrypt_key
2736         shll    $4,%esi
2737         testl   %eax,%eax
2738         jnz     L$dec_key_ret
2739         leaq    16(%rdx,%rsi,1),%rdi
2740
2741         movups  (%rdx),%xmm0
2742         movups  (%rdi),%xmm1
2743         movups  %xmm0,(%rdi)
2744         movups  %xmm1,(%rdx)
2745         leaq    16(%rdx),%rdx
2746         leaq    -16(%rdi),%rdi
2747
2748 L$dec_key_inverse:
2749         movups  (%rdx),%xmm0
2750         movups  (%rdi),%xmm1
2751 .byte   102,15,56,219,192
2752 .byte   102,15,56,219,201
2753         leaq    16(%rdx),%rdx
2754         leaq    -16(%rdi),%rdi
2755         movups  %xmm0,16(%rdi)
2756         movups  %xmm1,-16(%rdx)
2757         cmpq    %rdx,%rdi
2758         ja      L$dec_key_inverse
2759
2760         movups  (%rdx),%xmm0
2761 .byte   102,15,56,219,192
2762         movups  %xmm0,(%rdi)
2763 L$dec_key_ret:
2764         addq    $8,%rsp
2765         .byte   0xf3,0xc3
2766 L$SEH_end_set_decrypt_key:
2767
2768 .globl  _aesni_set_encrypt_key
2769
2770 .p2align        4
2771 _aesni_set_encrypt_key:
2772 __aesni_set_encrypt_key:
2773 .byte   0x48,0x83,0xEC,0x08     
2774         movq    $-1,%rax
2775         testq   %rdi,%rdi
2776         jz      L$enc_key_ret
2777         testq   %rdx,%rdx
2778         jz      L$enc_key_ret
2779
2780         movups  (%rdi),%xmm0
2781         xorps   %xmm4,%xmm4
2782         leaq    16(%rdx),%rax
2783         cmpl    $256,%esi
2784         je      L$14rounds
2785         cmpl    $192,%esi
2786         je      L$12rounds
2787         cmpl    $128,%esi
2788         jne     L$bad_keybits
2789
2790 L$10rounds:
2791         movl    $9,%esi
2792         movups  %xmm0,(%rdx)
2793 .byte   102,15,58,223,200,1
2794         call    L$key_expansion_128_cold
2795 .byte   102,15,58,223,200,2
2796         call    L$key_expansion_128
2797 .byte   102,15,58,223,200,4
2798         call    L$key_expansion_128
2799 .byte   102,15,58,223,200,8
2800         call    L$key_expansion_128
2801 .byte   102,15,58,223,200,16
2802         call    L$key_expansion_128
2803 .byte   102,15,58,223,200,32
2804         call    L$key_expansion_128
2805 .byte   102,15,58,223,200,64
2806         call    L$key_expansion_128
2807 .byte   102,15,58,223,200,128
2808         call    L$key_expansion_128
2809 .byte   102,15,58,223,200,27
2810         call    L$key_expansion_128
2811 .byte   102,15,58,223,200,54
2812         call    L$key_expansion_128
2813         movups  %xmm0,(%rax)
2814         movl    %esi,80(%rax)
2815         xorl    %eax,%eax
2816         jmp     L$enc_key_ret
2817
2818 .p2align        4
2819 L$12rounds:
2820         movq    16(%rdi),%xmm2
2821         movl    $11,%esi
2822         movups  %xmm0,(%rdx)
2823 .byte   102,15,58,223,202,1
2824         call    L$key_expansion_192a_cold
2825 .byte   102,15,58,223,202,2
2826         call    L$key_expansion_192b
2827 .byte   102,15,58,223,202,4
2828         call    L$key_expansion_192a
2829 .byte   102,15,58,223,202,8
2830         call    L$key_expansion_192b
2831 .byte   102,15,58,223,202,16
2832         call    L$key_expansion_192a
2833 .byte   102,15,58,223,202,32
2834         call    L$key_expansion_192b
2835 .byte   102,15,58,223,202,64
2836         call    L$key_expansion_192a
2837 .byte   102,15,58,223,202,128
2838         call    L$key_expansion_192b
2839         movups  %xmm0,(%rax)
2840         movl    %esi,48(%rax)
2841         xorq    %rax,%rax
2842         jmp     L$enc_key_ret
2843
2844 .p2align        4
2845 L$14rounds:
2846         movups  16(%rdi),%xmm2
2847         movl    $13,%esi
2848         leaq    16(%rax),%rax
2849         movups  %xmm0,(%rdx)
2850         movups  %xmm2,16(%rdx)
2851 .byte   102,15,58,223,202,1
2852         call    L$key_expansion_256a_cold
2853 .byte   102,15,58,223,200,1
2854         call    L$key_expansion_256b
2855 .byte   102,15,58,223,202,2
2856         call    L$key_expansion_256a
2857 .byte   102,15,58,223,200,2
2858         call    L$key_expansion_256b
2859 .byte   102,15,58,223,202,4
2860         call    L$key_expansion_256a
2861 .byte   102,15,58,223,200,4
2862         call    L$key_expansion_256b
2863 .byte   102,15,58,223,202,8
2864         call    L$key_expansion_256a
2865 .byte   102,15,58,223,200,8
2866         call    L$key_expansion_256b
2867 .byte   102,15,58,223,202,16
2868         call    L$key_expansion_256a
2869 .byte   102,15,58,223,200,16
2870         call    L$key_expansion_256b
2871 .byte   102,15,58,223,202,32
2872         call    L$key_expansion_256a
2873 .byte   102,15,58,223,200,32
2874         call    L$key_expansion_256b
2875 .byte   102,15,58,223,202,64
2876         call    L$key_expansion_256a
2877         movups  %xmm0,(%rax)
2878         movl    %esi,16(%rax)
2879         xorq    %rax,%rax
2880         jmp     L$enc_key_ret
2881
2882 .p2align        4
2883 L$bad_keybits:
2884         movq    $-2,%rax
2885 L$enc_key_ret:
2886         addq    $8,%rsp
2887         .byte   0xf3,0xc3
2888 L$SEH_end_set_encrypt_key:
2889
2890 .p2align        4
2891 L$key_expansion_128:
2892         movups  %xmm0,(%rax)
2893         leaq    16(%rax),%rax
2894 L$key_expansion_128_cold:
2895         shufps  $16,%xmm0,%xmm4
2896         xorps   %xmm4,%xmm0
2897         shufps  $140,%xmm0,%xmm4