1/* aes_asm.S
2 *
3 * Copyright (C) 2006-2021 wolfSSL Inc.
4 *
5 * This file is part of wolfSSL.
6 *
7 * wolfSSL is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * wolfSSL is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
20 */
21
22
23
24/* This file is in at&t asm syntax, see .asm for intel syntax */
25
26/* See Intel Advanced Encryption Standard (AES) Instructions Set White Paper
27 * by Intel Mobility Group, Israel Development Center, Israel Shay Gueron
28 */
29
30
31/*
32AES_CBC_encrypt (const unsigned char *in,
33	unsigned char *out,
34	unsigned char ivec[16],
35	unsigned long length,
36	const unsigned char *KS,
37	int nr)
38*/
39#ifndef __APPLE__
40.globl AES_CBC_encrypt
41AES_CBC_encrypt:
42#else
43.globl _AES_CBC_encrypt
44_AES_CBC_encrypt:
45#endif
46# parameter 1: %rdi
47# parameter 2: %rsi
48# parameter 3: %rdx
49# parameter 4: %rcx
50# parameter 5: %r8
51# parameter 6: %r9d
52movq	%rcx, %r10
53shrq	$4, %rcx
54shlq	$60, %r10
55je	NO_PARTS
56addq	$1, %rcx
57NO_PARTS:
58subq	$16, %rsi
59movdqa	(%rdx), %xmm1
60LOOP:
61pxor	(%rdi), %xmm1
62pxor	(%r8), %xmm1
63addq	$16,%rsi
64addq	$16,%rdi
65cmpl	$12, %r9d
66aesenc	16(%r8),%xmm1
67aesenc	32(%r8),%xmm1
68aesenc	48(%r8),%xmm1
69aesenc	64(%r8),%xmm1
70aesenc	80(%r8),%xmm1
71aesenc	96(%r8),%xmm1
72aesenc	112(%r8),%xmm1
73aesenc	128(%r8),%xmm1
74aesenc	144(%r8),%xmm1
75movdqa	160(%r8),%xmm2
76jb	LAST
77cmpl	$14, %r9d
78
79aesenc	160(%r8),%xmm1
80aesenc	176(%r8),%xmm1
81movdqa	192(%r8),%xmm2
82jb	LAST
83aesenc	192(%r8),%xmm1
84aesenc	208(%r8),%xmm1
85movdqa	224(%r8),%xmm2
86LAST:
87decq	%rcx
88aesenclast %xmm2,%xmm1
89movdqu	%xmm1,(%rsi)
90jne	LOOP
91ret
92
93
94#if defined(WOLFSSL_AESNI_BY4)
95
96/*
97AES_CBC_decrypt_by4 (const unsigned char *in,
98  unsigned char *out,
99  unsigned char ivec[16],
100  unsigned long length,
101  const unsigned char *KS,
102  int nr)
103*/
104#ifndef __APPLE__
105.globl AES_CBC_decrypt_by4
106AES_CBC_decrypt_by4:
107#else
108.globl _AES_CBC_decrypt_by4
109_AES_CBC_decrypt_by4:
110#endif
111# parameter 1: %rdi
112# parameter 2: %rsi
113# parameter 3: %rdx
114# parameter 4: %rcx
115# parameter 5: %r8
116# parameter 6: %r9d
117
118        movq        %rcx, %r10
119        shrq        $4, %rcx
120        shlq        $60, %r10
121        je          DNO_PARTS_4
122        addq        $1, %rcx
123DNO_PARTS_4:
124        movq        %rcx, %r10
125        shlq        $62, %r10
126        shrq        $62, %r10
127        shrq        $2, %rcx
128        movdqu      (%rdx),%xmm5
129        je          DREMAINDER_4
130        subq        $64, %rsi
131DLOOP_4:
132        movdqu      (%rdi), %xmm1
133        movdqu      16(%rdi), %xmm2
134        movdqu      32(%rdi), %xmm3
135        movdqu      48(%rdi), %xmm4
136        movdqa      %xmm1, %xmm6
137        movdqa      %xmm2, %xmm7
138        movdqa      %xmm3, %xmm8
139        movdqa      %xmm4, %xmm15
140        movdqa      (%r8), %xmm9
141        movdqa      16(%r8), %xmm10
142        movdqa      32(%r8), %xmm11
143        movdqa      48(%r8), %xmm12
144        pxor        %xmm9, %xmm1
145        pxor        %xmm9, %xmm2
146        pxor        %xmm9, %xmm3
147        pxor        %xmm9, %xmm4
148        aesdec      %xmm10, %xmm1
149        aesdec      %xmm10, %xmm2
150        aesdec      %xmm10, %xmm3
151        aesdec      %xmm10, %xmm4
152        aesdec      %xmm11, %xmm1
153        aesdec      %xmm11, %xmm2
154        aesdec      %xmm11, %xmm3
155        aesdec      %xmm11, %xmm4
156        aesdec      %xmm12, %xmm1
157        aesdec      %xmm12, %xmm2
158        aesdec      %xmm12, %xmm3
159        aesdec      %xmm12, %xmm4
160        movdqa      64(%r8), %xmm9
161        movdqa      80(%r8), %xmm10
162        movdqa      96(%r8), %xmm11
163        movdqa      112(%r8), %xmm12
164        aesdec      %xmm9, %xmm1
165        aesdec      %xmm9, %xmm2
166        aesdec      %xmm9, %xmm3
167        aesdec      %xmm9, %xmm4
168        aesdec      %xmm10, %xmm1
169        aesdec      %xmm10, %xmm2
170        aesdec      %xmm10, %xmm3
171        aesdec      %xmm10, %xmm4
172        aesdec      %xmm11, %xmm1
173        aesdec      %xmm11, %xmm2
174        aesdec      %xmm11, %xmm3
175        aesdec      %xmm11, %xmm4
176        aesdec      %xmm12, %xmm1
177        aesdec      %xmm12, %xmm2
178        aesdec      %xmm12, %xmm3
179        aesdec      %xmm12, %xmm4
180        movdqa      128(%r8), %xmm9
181        movdqa      144(%r8), %xmm10
182        movdqa      160(%r8), %xmm11
183        cmpl        $12, %r9d
184        aesdec      %xmm9, %xmm1
185        aesdec      %xmm9, %xmm2
186        aesdec      %xmm9, %xmm3
187        aesdec      %xmm9, %xmm4
188        aesdec      %xmm10, %xmm1
189        aesdec      %xmm10, %xmm2
190        aesdec      %xmm10, %xmm3
191        aesdec      %xmm10, %xmm4
192        jb          DLAST_4
193        movdqa      160(%r8), %xmm9
194        movdqa      176(%r8), %xmm10
195        movdqa      192(%r8), %xmm11
196        cmpl        $14, %r9d
197        aesdec      %xmm9, %xmm1
198        aesdec      %xmm9, %xmm2
199        aesdec      %xmm9, %xmm3
200        aesdec      %xmm9, %xmm4
201        aesdec      %xmm10, %xmm1
202        aesdec      %xmm10, %xmm2
203        aesdec      %xmm10, %xmm3
204        aesdec      %xmm10, %xmm4
205        jb          DLAST_4
206        movdqa      192(%r8), %xmm9
207        movdqa      208(%r8), %xmm10
208        movdqa      224(%r8), %xmm11
209        aesdec      %xmm9, %xmm1
210        aesdec      %xmm9, %xmm2
211        aesdec      %xmm9, %xmm3
212        aesdec      %xmm9, %xmm4
213        aesdec      %xmm10, %xmm1
214        aesdec      %xmm10, %xmm2
215        aesdec      %xmm10, %xmm3
216        aesdec      %xmm10, %xmm4
217DLAST_4:
218        addq        $64, %rdi
219        addq        $64, %rsi
220        decq        %rcx
221        aesdeclast  %xmm11, %xmm1
222        aesdeclast  %xmm11, %xmm2
223        aesdeclast  %xmm11, %xmm3
224        aesdeclast  %xmm11, %xmm4
225        pxor        %xmm5, %xmm1
226        pxor        %xmm6, %xmm2
227        pxor        %xmm7, %xmm3
228        pxor        %xmm8, %xmm4
229        movdqu      %xmm1, (%rsi)
230        movdqu      %xmm2, 16(%rsi)
231        movdqu      %xmm3, 32(%rsi)
232        movdqu      %xmm4, 48(%rsi)
233        movdqa      %xmm15,%xmm5
234        jne         DLOOP_4
235        addq        $64, %rsi
236DREMAINDER_4:
237        cmpq        $0, %r10
238        je          DEND_4
239DLOOP_4_2:
240        movdqu      (%rdi), %xmm1
241        movdqa      %xmm1, %xmm15
242        addq        $16, %rdi
243        pxor        (%r8), %xmm1
244        movdqu      160(%r8), %xmm2
245        cmpl        $12, %r9d
246        aesdec      16(%r8), %xmm1
247        aesdec      32(%r8), %xmm1
248        aesdec      48(%r8), %xmm1
249        aesdec      64(%r8), %xmm1
250        aesdec      80(%r8), %xmm1
251        aesdec      96(%r8), %xmm1
252        aesdec      112(%r8), %xmm1
253        aesdec      128(%r8), %xmm1
254        aesdec      144(%r8), %xmm1
255        jb          DLAST_4_2
256        movdqu      192(%r8), %xmm2
257        cmpl        $14, %r9d
258        aesdec      160(%r8), %xmm1
259        aesdec      176(%r8), %xmm1
260        jb          DLAST_4_2
261        movdqu      224(%r8), %xmm2
262        aesdec      192(%r8), %xmm1
263        aesdec      208(%r8), %xmm1
264DLAST_4_2:
265        aesdeclast  %xmm2, %xmm1
266        pxor        %xmm5, %xmm1
267        movdqa      %xmm15, %xmm5
268        movdqu      %xmm1, (%rsi)
269        addq        $16, %rsi
270        decq        %r10
271        jne         DLOOP_4_2
272DEND_4:
273        ret
274
275#elif defined(WOLFSSL_AESNI_BY6)
276
277/*
278AES_CBC_decrypt_by6 (const unsigned char *in,
279  unsigned char *out,
280  unsigned char ivec[16],
281  unsigned long length,
282  const unsigned char *KS,
283  int nr)
284*/
285#ifndef __APPLE__
286.globl AES_CBC_decrypt_by6
287AES_CBC_decrypt_by6:
288#else
289.globl _AES_CBC_decrypt_by6
290_AES_CBC_decrypt_by6:
291#endif
292# parameter 1: %rdi - in
293# parameter 2: %rsi - out
294# parameter 3: %rdx - ivec
295# parameter 4: %rcx - length
296# parameter 5: %r8  - KS
297# parameter 6: %r9d - nr
298
299        movq        %rcx, %r10
300        shrq        $4, %rcx
301        shlq        $60, %r10
302        je          DNO_PARTS_6
303        addq        $1, %rcx
304DNO_PARTS_6:
305        movq        %rax, %r12
306        movq        %rdx, %r13
307        movq        %rbx, %r14
308        movq        $0, %rdx
309        movq        %rcx, %rax
310        movq        $6, %rbx
311        div         %rbx
312        movq        %rax, %rcx
313        movq        %rdx, %r10
314        movq        %r12, %rax
315        movq        %r13, %rdx
316        movq        %r14, %rbx
317        cmpq        $0, %rcx
318        movdqu      (%rdx), %xmm7
319        je          DREMAINDER_6
320        subq        $96, %rsi
321DLOOP_6:
322        movdqu      (%rdi), %xmm1
323        movdqu      16(%rdi), %xmm2
324        movdqu      32(%rdi), %xmm3
325        movdqu      48(%rdi), %xmm4
326        movdqu      64(%rdi), %xmm5
327        movdqu      80(%rdi), %xmm6
328        movdqa      (%r8), %xmm8
329        movdqa      16(%r8), %xmm9
330        movdqa      32(%r8), %xmm10
331        movdqa      48(%r8), %xmm11
332        pxor        %xmm8, %xmm1
333        pxor        %xmm8, %xmm2
334        pxor        %xmm8, %xmm3
335        pxor        %xmm8, %xmm4
336        pxor        %xmm8, %xmm5
337        pxor        %xmm8, %xmm6
338        aesdec      %xmm9, %xmm1
339        aesdec      %xmm9, %xmm2
340        aesdec      %xmm9, %xmm3
341        aesdec      %xmm9, %xmm4
342        aesdec      %xmm9, %xmm5
343        aesdec      %xmm9, %xmm6
344        aesdec      %xmm10, %xmm1
345        aesdec      %xmm10, %xmm2
346        aesdec      %xmm10, %xmm3
347        aesdec      %xmm10, %xmm4
348        aesdec      %xmm10, %xmm5
349        aesdec      %xmm10, %xmm6
350        aesdec      %xmm11, %xmm1
351        aesdec      %xmm11, %xmm2
352        aesdec      %xmm11, %xmm3
353        aesdec      %xmm11, %xmm4
354        aesdec      %xmm11, %xmm5
355        aesdec      %xmm11, %xmm6
356        movdqa      64(%r8), %xmm8
357        movdqa      80(%r8), %xmm9
358        movdqa      96(%r8), %xmm10
359        movdqa      112(%r8), %xmm11
360        aesdec      %xmm8, %xmm1
361        aesdec      %xmm8, %xmm2
362        aesdec      %xmm8, %xmm3
363        aesdec      %xmm8, %xmm4
364        aesdec      %xmm8, %xmm5
365        aesdec      %xmm8, %xmm6
366        aesdec      %xmm9, %xmm1
367        aesdec      %xmm9, %xmm2
368        aesdec      %xmm9, %xmm3
369        aesdec      %xmm9, %xmm4
370        aesdec      %xmm9, %xmm5
371        aesdec      %xmm9, %xmm6
372        aesdec      %xmm10, %xmm1
373        aesdec      %xmm10, %xmm2
374        aesdec      %xmm10, %xmm3
375        aesdec      %xmm10, %xmm4
376        aesdec      %xmm10, %xmm5
377        aesdec      %xmm10, %xmm6
378        aesdec      %xmm11, %xmm1
379        aesdec      %xmm11, %xmm2
380        aesdec      %xmm11, %xmm3
381        aesdec      %xmm11, %xmm4
382        aesdec      %xmm11, %xmm5
383        aesdec      %xmm11, %xmm6
384        movdqa      128(%r8), %xmm8
385        movdqa      144(%r8), %xmm9
386        movdqa      160(%r8), %xmm10
387        cmpl        $12, %r9d
388        aesdec      %xmm8, %xmm1
389        aesdec      %xmm8, %xmm2
390        aesdec      %xmm8, %xmm3
391        aesdec      %xmm8, %xmm4
392        aesdec      %xmm8, %xmm5
393        aesdec      %xmm8, %xmm6
394        aesdec      %xmm9, %xmm1
395        aesdec      %xmm9, %xmm2
396        aesdec      %xmm9, %xmm3
397        aesdec      %xmm9, %xmm4
398        aesdec      %xmm9, %xmm5
399        aesdec      %xmm9, %xmm6
400        jb          DLAST_6
401        movdqa      160(%r8), %xmm8
402        movdqa      176(%r8), %xmm9
403        movdqa      192(%r8), %xmm10
404        cmpl        $14, %r9d
405        aesdec      %xmm8, %xmm1
406        aesdec      %xmm8, %xmm2
407        aesdec      %xmm8, %xmm3
408        aesdec      %xmm8, %xmm4
409        aesdec      %xmm8, %xmm5
410        aesdec      %xmm8, %xmm6
411        aesdec      %xmm9, %xmm1
412        aesdec      %xmm9, %xmm2
413        aesdec      %xmm9, %xmm3
414        aesdec      %xmm9, %xmm4
415        aesdec      %xmm9, %xmm5
416        aesdec      %xmm9, %xmm6
417        jb          DLAST_6
418        movdqa      192(%r8), %xmm8
419        movdqa      208(%r8), %xmm9
420        movdqa      224(%r8), %xmm10
421        aesdec      %xmm8, %xmm1
422        aesdec      %xmm8, %xmm2
423        aesdec      %xmm8, %xmm3
424        aesdec      %xmm8, %xmm4
425        aesdec      %xmm8, %xmm5
426        aesdec      %xmm8, %xmm6
427        aesdec      %xmm9, %xmm1
428        aesdec      %xmm9, %xmm2
429        aesdec      %xmm9, %xmm3
430        aesdec      %xmm9, %xmm4
431        aesdec      %xmm9, %xmm5
432        aesdec      %xmm9, %xmm6
433DLAST_6:
434        addq        $96, %rsi
435        aesdeclast  %xmm10, %xmm1
436        aesdeclast  %xmm10, %xmm2
437        aesdeclast  %xmm10, %xmm3
438        aesdeclast  %xmm10, %xmm4
439        aesdeclast  %xmm10, %xmm5
440        aesdeclast  %xmm10, %xmm6
441        movdqu      (%rdi), %xmm8
442        movdqu      16(%rdi), %xmm9
443        movdqu      32(%rdi), %xmm10
444        movdqu      48(%rdi), %xmm11
445        movdqu      64(%rdi), %xmm12
446        movdqu      80(%rdi), %xmm13
447        pxor        %xmm7, %xmm1
448        pxor        %xmm8, %xmm2
449        pxor        %xmm9, %xmm3
450        pxor        %xmm10, %xmm4
451        pxor        %xmm11, %xmm5
452        pxor        %xmm12, %xmm6
453        movdqu      %xmm13, %xmm7
454        movdqu      %xmm1, (%rsi)
455        movdqu      %xmm2, 16(%rsi)
456        movdqu      %xmm3, 32(%rsi)
457        movdqu      %xmm4, 48(%rsi)
458        movdqu      %xmm5, 64(%rsi)
459        movdqu      %xmm6, 80(%rsi)
460        addq        $96, %rdi
461        decq        %rcx
462        jne         DLOOP_6
463        addq        $96, %rsi
464DREMAINDER_6:
465        cmpq        $0, %r10
466        je          DEND_6
467DLOOP_6_2:
468        movdqu      (%rdi), %xmm1
469        movdqa      %xmm1, %xmm10
470        addq        $16, %rdi
471        pxor        (%r8), %xmm1
472        movdqu      160(%r8), %xmm2
473        cmpl        $12, %r9d
474        aesdec      16(%r8), %xmm1
475        aesdec      32(%r8), %xmm1
476        aesdec      48(%r8), %xmm1
477        aesdec      64(%r8), %xmm1
478        aesdec      80(%r8), %xmm1
479        aesdec      96(%r8), %xmm1
480        aesdec      112(%r8), %xmm1
481        aesdec      128(%r8), %xmm1
482        aesdec      144(%r8), %xmm1
483        jb          DLAST_6_2
484        movdqu      192(%r8), %xmm2
485        cmpl        $14, %r9d
486        aesdec      160(%r8), %xmm1
487        aesdec      176(%r8), %xmm1
488        jb          DLAST_6_2
489        movdqu      224(%r8), %xmm2
490        aesdec      192(%r8), %xmm1
491        aesdec      208(%r8), %xmm1
492DLAST_6_2:
493        aesdeclast  %xmm2, %xmm1
494        pxor        %xmm7, %xmm1
495        movdqa      %xmm10, %xmm7
496        movdqu      %xmm1, (%rsi)
497        addq        $16, %rsi
498        decq        %r10
499        jne         DLOOP_6_2
500DEND_6:
501        ret
502
503#else /* WOLFSSL_AESNI_BYx */
504
505/*
506AES_CBC_decrypt_by8 (const unsigned char *in,
507  unsigned char *out,
508  unsigned char ivec[16],
509  unsigned long length,
510  const unsigned char *KS,
511  int nr)
512*/
513#ifndef __APPLE__
514.globl AES_CBC_decrypt_by8
515AES_CBC_decrypt_by8:
516#else
517.globl _AES_CBC_decrypt_by8
518_AES_CBC_decrypt_by8:
519#endif
520# parameter 1: %rdi - in
521# parameter 2: %rsi - out
522# parameter 3: %rdx - ivec
523# parameter 4: %rcx - length
524# parameter 5: %r8  - KS
525# parameter 6: %r9d - nr
526
527        movq        %rcx, %r10
528        shrq        $4, %rcx
529        shlq        $60, %r10
530        je          DNO_PARTS_8
531        addq        $1, %rcx
532DNO_PARTS_8:
533        movq        %rcx, %r10
534        shlq        $61, %r10
535        shrq        $61, %r10
536        shrq        $3, %rcx
537        movdqu      (%rdx), %xmm9
538        je          DREMAINDER_8
539        subq        $128, %rsi
540DLOOP_8:
541        movdqu      (%rdi), %xmm1
542        movdqu      16(%rdi), %xmm2
543        movdqu      32(%rdi), %xmm3
544        movdqu      48(%rdi), %xmm4
545        movdqu      64(%rdi), %xmm5
546        movdqu      80(%rdi), %xmm6
547        movdqu      96(%rdi), %xmm7
548        movdqu      112(%rdi), %xmm8
549        movdqa      (%r8), %xmm10
550        movdqa      16(%r8), %xmm11
551        movdqa      32(%r8), %xmm12
552        movdqa      48(%r8), %xmm13
553        pxor        %xmm10, %xmm1
554        pxor        %xmm10, %xmm2
555        pxor        %xmm10, %xmm3
556        pxor        %xmm10, %xmm4
557        pxor        %xmm10, %xmm5
558        pxor        %xmm10, %xmm6
559        pxor        %xmm10, %xmm7
560        pxor        %xmm10, %xmm8
561        aesdec      %xmm11, %xmm1
562        aesdec      %xmm11, %xmm2
563        aesdec      %xmm11, %xmm3
564        aesdec      %xmm11, %xmm4
565        aesdec      %xmm11, %xmm5
566        aesdec      %xmm11, %xmm6
567        aesdec      %xmm11, %xmm7
568        aesdec      %xmm11, %xmm8
569        aesdec      %xmm12, %xmm1
570        aesdec      %xmm12, %xmm2
571        aesdec      %xmm12, %xmm3
572        aesdec      %xmm12, %xmm4
573        aesdec      %xmm12, %xmm5
574        aesdec      %xmm12, %xmm6
575        aesdec      %xmm12, %xmm7
576        aesdec      %xmm12, %xmm8
577        aesdec      %xmm13, %xmm1
578        aesdec      %xmm13, %xmm2
579        aesdec      %xmm13, %xmm3
580        aesdec      %xmm13, %xmm4
581        aesdec      %xmm13, %xmm5
582        aesdec      %xmm13, %xmm6
583        aesdec      %xmm13, %xmm7
584        aesdec      %xmm13, %xmm8
585        movdqa      64(%r8), %xmm10
586        movdqa      80(%r8), %xmm11
587        movdqa      96(%r8), %xmm12
588        movdqa      112(%r8), %xmm13
589        aesdec      %xmm10, %xmm1
590        aesdec      %xmm10, %xmm2
591        aesdec      %xmm10, %xmm3
592        aesdec      %xmm10, %xmm4
593        aesdec      %xmm10, %xmm5
594        aesdec      %xmm10, %xmm6
595        aesdec      %xmm10, %xmm7
596        aesdec      %xmm10, %xmm8
597        aesdec      %xmm11, %xmm1
598        aesdec      %xmm11, %xmm2
599        aesdec      %xmm11, %xmm3
600        aesdec      %xmm11, %xmm4
601        aesdec      %xmm11, %xmm5
602        aesdec      %xmm11, %xmm6
603        aesdec      %xmm11, %xmm7
604        aesdec      %xmm11, %xmm8
605        aesdec      %xmm12, %xmm1
606        aesdec      %xmm12, %xmm2
607        aesdec      %xmm12, %xmm3
608        aesdec      %xmm12, %xmm4
609        aesdec      %xmm12, %xmm5
610        aesdec      %xmm12, %xmm6
611        aesdec      %xmm12, %xmm7
612        aesdec      %xmm12, %xmm8
613        aesdec      %xmm13, %xmm1
614        aesdec      %xmm13, %xmm2
615        aesdec      %xmm13, %xmm3
616        aesdec      %xmm13, %xmm4
617        aesdec      %xmm13, %xmm5
618        aesdec      %xmm13, %xmm6
619        aesdec      %xmm13, %xmm7
620        aesdec      %xmm13, %xmm8
621        movdqa      128(%r8), %xmm10
622        movdqa      144(%r8), %xmm11
623        movdqa      160(%r8), %xmm12
624        cmpl        $12, %r9d
625        aesdec      %xmm10, %xmm1
626        aesdec      %xmm10, %xmm2
627        aesdec      %xmm10, %xmm3
628        aesdec      %xmm10, %xmm4
629        aesdec      %xmm10, %xmm5
630        aesdec      %xmm10, %xmm6
631        aesdec      %xmm10, %xmm7
632        aesdec      %xmm10, %xmm8
633        aesdec      %xmm11, %xmm1
634        aesdec      %xmm11, %xmm2
635        aesdec      %xmm11, %xmm3
636        aesdec      %xmm11, %xmm4
637        aesdec      %xmm11, %xmm5
638        aesdec      %xmm11, %xmm6
639        aesdec      %xmm11, %xmm7
640        aesdec      %xmm11, %xmm8
641        jb          DLAST_8
642        movdqa      160(%r8), %xmm10
643        movdqa      176(%r8), %xmm11
644        movdqa      192(%r8), %xmm12
645        cmpl        $14, %r9d
646        aesdec      %xmm10, %xmm1
647        aesdec      %xmm10, %xmm2
648        aesdec      %xmm10, %xmm3
649        aesdec      %xmm10, %xmm4
650        aesdec      %xmm10, %xmm5
651        aesdec      %xmm10, %xmm6
652        aesdec      %xmm10, %xmm7
653        aesdec      %xmm10, %xmm8
654        aesdec      %xmm11, %xmm1
655        aesdec      %xmm11, %xmm2
656        aesdec      %xmm11, %xmm3
657        aesdec      %xmm11, %xmm4
658        aesdec      %xmm11, %xmm5
659        aesdec      %xmm11, %xmm6
660        aesdec      %xmm11, %xmm7
661        aesdec      %xmm11, %xmm8
662        jb          DLAST_8
663        movdqa      192(%r8), %xmm10
664        movdqa      208(%r8), %xmm11
665        movdqa      224(%r8), %xmm12
666        aesdec      %xmm10, %xmm1
667        aesdec      %xmm10, %xmm2
668        aesdec      %xmm10, %xmm3
669        aesdec      %xmm10, %xmm4
670        aesdec      %xmm10, %xmm5
671        aesdec      %xmm10, %xmm6
672        aesdec      %xmm10, %xmm7
673        aesdec      %xmm10, %xmm8
674        aesdec      %xmm11, %xmm1
675        aesdec      %xmm11, %xmm2
676        aesdec      %xmm11, %xmm3
677        aesdec      %xmm11, %xmm4
678        aesdec      %xmm11, %xmm5
679        aesdec      %xmm11, %xmm6
680        aesdec      %xmm11, %xmm7
681        aesdec      %xmm11, %xmm8
682DLAST_8:
683        addq        $128, %rsi
684        aesdeclast  %xmm12, %xmm1
685        aesdeclast  %xmm12, %xmm2
686        aesdeclast  %xmm12, %xmm3
687        aesdeclast  %xmm12, %xmm4
688        aesdeclast  %xmm12, %xmm5
689        aesdeclast  %xmm12, %xmm6
690        aesdeclast  %xmm12, %xmm7
691        aesdeclast  %xmm12, %xmm8
692        movdqu      (%rdi), %xmm10
693        movdqu      16(%rdi), %xmm11
694        movdqu      32(%rdi), %xmm12
695        movdqu      48(%rdi), %xmm13
696        pxor        %xmm9, %xmm1
697        pxor        %xmm10, %xmm2
698        pxor        %xmm11, %xmm3
699        pxor        %xmm12, %xmm4
700        pxor        %xmm13, %xmm5
701        movdqu      64(%rdi), %xmm10
702        movdqu      80(%rdi), %xmm11
703        movdqu      96(%rdi), %xmm12
704        movdqu      112(%rdi), %xmm9
705        pxor        %xmm10, %xmm6
706        pxor        %xmm11, %xmm7
707        pxor        %xmm12, %xmm8
708        movdqu      %xmm1, (%rsi)
709        movdqu      %xmm2, 16(%rsi)
710        movdqu      %xmm3, 32(%rsi)
711        movdqu      %xmm4, 48(%rsi)
712        movdqu      %xmm5, 64(%rsi)
713        movdqu      %xmm6, 80(%rsi)
714        movdqu      %xmm7, 96(%rsi)
715        movdqu      %xmm8, 112(%rsi)
716        addq        $128, %rdi
717        decq        %rcx
718        jne         DLOOP_8
719        addq        $128, %rsi
720DREMAINDER_8:
721        cmpq        $0, %r10
722        je          DEND_8
723DLOOP_8_2:
724        movdqu      (%rdi), %xmm1
725        movdqa      %xmm1, %xmm10
726        addq        $16, %rdi
727        pxor        (%r8), %xmm1
728        movdqu      160(%r8), %xmm2
729        cmpl        $12, %r9d
730        aesdec      16(%r8), %xmm1
731        aesdec      32(%r8), %xmm1
732        aesdec      48(%r8), %xmm1
733        aesdec      64(%r8), %xmm1
734        aesdec      80(%r8), %xmm1
735        aesdec      96(%r8), %xmm1
736        aesdec      112(%r8), %xmm1
737        aesdec      128(%r8), %xmm1
738        aesdec      144(%r8), %xmm1
739        jb          DLAST_8_2
740        movdqu      192(%r8), %xmm2
741        cmpl        $14, %r9d
742        aesdec      160(%r8), %xmm1
743        aesdec      176(%r8), %xmm1
744        jb          DLAST_8_2
745        movdqu      224(%r8), %xmm2
746        aesdec      192(%r8), %xmm1
747        aesdec      208(%r8), %xmm1
748DLAST_8_2:
749        aesdeclast  %xmm2, %xmm1
750        pxor        %xmm9, %xmm1
751        movdqa      %xmm10, %xmm9
752        movdqu      %xmm1, (%rsi)
753        addq        $16, %rsi
754        decq        %r10
755        jne         DLOOP_8_2
756DEND_8:
757        ret
758
759#endif /* WOLFSSL_AESNI_BYx */
760
761
762/*
763AES_ECB_encrypt (const unsigned char *in,
764	unsigned char *out,
765	unsigned long length,
766	const unsigned char *KS,
767	int nr)
768*/
769#ifndef __APPLE__
770.globl AES_ECB_encrypt
771AES_ECB_encrypt:
772#else
773.globl _AES_ECB_encrypt
774_AES_ECB_encrypt:
775#endif
776# parameter 1: %rdi
777# parameter 2: %rsi
778# parameter 3: %rdx
779# parameter 4: %rcx
780# parameter 5: %r8d
781        movq    %rdx, %r10
782        shrq    $4, %rdx
783        shlq    $60, %r10
784        je      EECB_NO_PARTS_4
785        addq    $1, %rdx
786EECB_NO_PARTS_4:
787        movq    %rdx, %r10
788        shlq    $62, %r10
789        shrq    $62, %r10
790        shrq    $2, %rdx
791        je      EECB_REMAINDER_4
792        subq    $64, %rsi
793EECB_LOOP_4:
794        movdqu  (%rdi), %xmm1
795        movdqu  16(%rdi), %xmm2
796        movdqu  32(%rdi), %xmm3
797        movdqu  48(%rdi), %xmm4
798        movdqa  (%rcx), %xmm9
799        movdqa  16(%rcx), %xmm10
800        movdqa  32(%rcx), %xmm11
801        movdqa  48(%rcx), %xmm12
802        pxor    %xmm9, %xmm1
803        pxor    %xmm9, %xmm2
804        pxor    %xmm9, %xmm3
805        pxor    %xmm9, %xmm4
806        aesenc  %xmm10, %xmm1
807        aesenc  %xmm10, %xmm2
808        aesenc  %xmm10, %xmm3
809        aesenc  %xmm10, %xmm4
810        aesenc  %xmm11, %xmm1
811        aesenc  %xmm11, %xmm2
812        aesenc  %xmm11, %xmm3
813        aesenc  %xmm11, %xmm4
814        aesenc  %xmm12, %xmm1
815        aesenc  %xmm12, %xmm2
816        aesenc  %xmm12, %xmm3
817        aesenc  %xmm12, %xmm4
818        movdqa  64(%rcx), %xmm9
819        movdqa  80(%rcx), %xmm10
820        movdqa  96(%rcx), %xmm11
821        movdqa  112(%rcx), %xmm12
822        aesenc  %xmm9, %xmm1
823        aesenc  %xmm9, %xmm2
824        aesenc  %xmm9, %xmm3
825        aesenc  %xmm9, %xmm4
826        aesenc  %xmm10, %xmm1
827        aesenc  %xmm10, %xmm2
828        aesenc  %xmm10, %xmm3
829        aesenc  %xmm10, %xmm4
830        aesenc  %xmm11, %xmm1
831        aesenc  %xmm11, %xmm2
832        aesenc  %xmm11, %xmm3
833        aesenc  %xmm11, %xmm4
834        aesenc  %xmm12, %xmm1
835        aesenc  %xmm12, %xmm2
836        aesenc  %xmm12, %xmm3
837        aesenc  %xmm12, %xmm4
838        movdqa  128(%rcx), %xmm9
839        movdqa  144(%rcx), %xmm10
840        movdqa  160(%rcx), %xmm11
841        cmpl    $12, %r8d
842        aesenc  %xmm9, %xmm1
843        aesenc  %xmm9, %xmm2
844        aesenc  %xmm9, %xmm3
845        aesenc  %xmm9, %xmm4
846        aesenc  %xmm10, %xmm1
847        aesenc  %xmm10, %xmm2
848        aesenc  %xmm10, %xmm3
849        aesenc  %xmm10, %xmm4
850        jb      EECB_LAST_4
851        movdqa  160(%rcx), %xmm9
852        movdqa  176(%rcx), %xmm10
853        movdqa  192(%rcx), %xmm11
854        cmpl    $14, %r8d
855        aesenc  %xmm9, %xmm1
856        aesenc  %xmm9, %xmm2
857        aesenc  %xmm9, %xmm3
858        aesenc  %xmm9, %xmm4
859        aesenc  %xmm10, %xmm1
860        aesenc  %xmm10, %xmm2
861        aesenc  %xmm10, %xmm3
862        aesenc  %xmm10, %xmm4
863        jb      EECB_LAST_4
864        movdqa  192(%rcx), %xmm9
865        movdqa  208(%rcx), %xmm10
866        movdqa  224(%rcx), %xmm11
867        aesenc  %xmm9, %xmm1
868        aesenc  %xmm9, %xmm2
869        aesenc  %xmm9, %xmm3
870        aesenc  %xmm9, %xmm4
871        aesenc  %xmm10, %xmm1
872        aesenc  %xmm10, %xmm2
873        aesenc  %xmm10, %xmm3
874        aesenc  %xmm10, %xmm4
875EECB_LAST_4:
876        addq    $64, %rdi
877        addq    $64, %rsi
878        decq    %rdx
879        aesenclast %xmm11, %xmm1
880        aesenclast %xmm11, %xmm2
881        aesenclast %xmm11, %xmm3
882        aesenclast %xmm11, %xmm4
883        movdqu  %xmm1, (%rsi)
884        movdqu  %xmm2, 16(%rsi)
885        movdqu  %xmm3, 32(%rsi)
886        movdqu  %xmm4, 48(%rsi)
887        jne     EECB_LOOP_4
888        addq    $64, %rsi
889EECB_REMAINDER_4:
890        cmpq    $0, %r10
891        je      EECB_END_4
892EECB_LOOP_4_2:
893        movdqu  (%rdi), %xmm1
894        addq    $16, %rdi
895        pxor    (%rcx), %xmm1
896        movdqu  160(%rcx), %xmm2
897        aesenc  16(%rcx), %xmm1
898        aesenc  32(%rcx), %xmm1
899        aesenc  48(%rcx), %xmm1
900        aesenc  64(%rcx), %xmm1
901        aesenc  80(%rcx), %xmm1
902        aesenc  96(%rcx), %xmm1
903        aesenc  112(%rcx), %xmm1
904        aesenc  128(%rcx), %xmm1
905        aesenc  144(%rcx), %xmm1
906        cmpl    $12, %r8d
907        jb      EECB_LAST_4_2
908        movdqu  192(%rcx), %xmm2
909        aesenc  160(%rcx), %xmm1
910        aesenc  176(%rcx), %xmm1
911        cmpl    $14, %r8d
912        jb      EECB_LAST_4_2
913        movdqu  224(%rcx), %xmm2
914        aesenc  192(%rcx), %xmm1
915        aesenc  208(%rcx), %xmm1
916EECB_LAST_4_2:
917        aesenclast %xmm2, %xmm1
918        movdqu  %xmm1, (%rsi)
919        addq    $16, %rsi
920        decq    %r10
921        jne     EECB_LOOP_4_2
922EECB_END_4:
923        ret
924
925
926/*
927AES_ECB_decrypt (const unsigned char *in,
928  unsigned char *out,
929  unsigned long length,
930  const unsigned char *KS,
931  int nr)
932*/
933#ifndef __APPLE__
934.globl AES_ECB_decrypt
935AES_ECB_decrypt:
936#else
937.globl _AES_ECB_decrypt
938_AES_ECB_decrypt:
939#endif
940# parameter 1: %rdi
941# parameter 2: %rsi
942# parameter 3: %rdx
943# parameter 4: %rcx
944# parameter 5: %r8d
945
946        movq    %rdx, %r10
947        shrq    $4, %rdx
948        shlq    $60, %r10
949        je      DECB_NO_PARTS_4
950        addq    $1, %rdx
951DECB_NO_PARTS_4:
952        movq    %rdx, %r10
953        shlq    $62, %r10
954        shrq    $62, %r10
955        shrq    $2, %rdx
956        je      DECB_REMAINDER_4
957        subq    $64, %rsi
958DECB_LOOP_4:
959        movdqu  (%rdi), %xmm1
960        movdqu  16(%rdi), %xmm2
961        movdqu  32(%rdi), %xmm3
962        movdqu  48(%rdi), %xmm4
963        movdqa  (%rcx), %xmm9
964        movdqa  16(%rcx), %xmm10
965        movdqa  32(%rcx), %xmm11
966        movdqa  48(%rcx), %xmm12
967        pxor    %xmm9, %xmm1
968        pxor    %xmm9, %xmm2
969        pxor    %xmm9, %xmm3
970        pxor    %xmm9, %xmm4
971        aesdec  %xmm10, %xmm1
972        aesdec  %xmm10, %xmm2
973        aesdec  %xmm10, %xmm3
974        aesdec  %xmm10, %xmm4
975        aesdec  %xmm11, %xmm1
976        aesdec  %xmm11, %xmm2
977        aesdec  %xmm11, %xmm3
978        aesdec  %xmm11, %xmm4
979        aesdec  %xmm12, %xmm1
980        aesdec  %xmm12, %xmm2
981        aesdec  %xmm12, %xmm3
982        aesdec  %xmm12, %xmm4
983        movdqa  64(%rcx), %xmm9
984        movdqa  80(%rcx), %xmm10
985        movdqa  96(%rcx), %xmm11
986        movdqa  112(%rcx), %xmm12
987        aesdec  %xmm9, %xmm1
988        aesdec  %xmm9, %xmm2
989        aesdec  %xmm9, %xmm3
990        aesdec  %xmm9, %xmm4
991        aesdec  %xmm10, %xmm1
992        aesdec  %xmm10, %xmm2
993        aesdec  %xmm10, %xmm3
994        aesdec  %xmm10, %xmm4
995        aesdec  %xmm11, %xmm1
996        aesdec  %xmm11, %xmm2
997        aesdec  %xmm11, %xmm3
998        aesdec  %xmm11, %xmm4
999        aesdec  %xmm12, %xmm1
1000        aesdec  %xmm12, %xmm2
1001        aesdec  %xmm12, %xmm3
1002        aesdec  %xmm12, %xmm4
1003        movdqa  128(%rcx), %xmm9
1004        movdqa  144(%rcx), %xmm10
1005        movdqa  160(%rcx), %xmm11
1006        cmpl    $12, %r8d
1007        aesdec  %xmm9, %xmm1
1008        aesdec  %xmm9, %xmm2
1009        aesdec  %xmm9, %xmm3
1010        aesdec  %xmm9, %xmm4
1011        aesdec  %xmm10, %xmm1
1012        aesdec  %xmm10, %xmm2
1013        aesdec  %xmm10, %xmm3
1014        aesdec  %xmm10, %xmm4
1015        jb      DECB_LAST_4
1016        movdqa  160(%rcx), %xmm9
1017        movdqa  176(%rcx), %xmm10
1018        movdqa  192(%rcx), %xmm11
1019        cmpl    $14, %r8d
1020        aesdec  %xmm9, %xmm1
1021        aesdec  %xmm9, %xmm2
1022        aesdec  %xmm9, %xmm3
1023        aesdec  %xmm9, %xmm4
1024        aesdec  %xmm10, %xmm1
1025        aesdec  %xmm10, %xmm2
1026        aesdec  %xmm10, %xmm3
1027        aesdec  %xmm10, %xmm4
1028        jb      DECB_LAST_4
1029        movdqa  192(%rcx), %xmm9
1030        movdqa  208(%rcx), %xmm10
1031        movdqa  224(%rcx), %xmm11
1032        aesdec  %xmm9, %xmm1
1033        aesdec  %xmm9, %xmm2
1034        aesdec  %xmm9, %xmm3
1035        aesdec  %xmm9, %xmm4
1036        aesdec  %xmm10, %xmm1
1037        aesdec  %xmm10, %xmm2
1038        aesdec  %xmm10, %xmm3
1039        aesdec  %xmm10, %xmm4
1040DECB_LAST_4:
1041        addq    $64, %rdi
1042        addq    $64, %rsi
1043        decq    %rdx
1044        aesdeclast %xmm11, %xmm1
1045        aesdeclast %xmm11, %xmm2
1046        aesdeclast %xmm11, %xmm3
1047        aesdeclast %xmm11, %xmm4
1048        movdqu  %xmm1, (%rsi)
1049        movdqu  %xmm2, 16(%rsi)
1050        movdqu  %xmm3, 32(%rsi)
1051        movdqu  %xmm4, 48(%rsi)
1052        jne     DECB_LOOP_4
1053        addq    $64, %rsi
1054DECB_REMAINDER_4:
1055        cmpq    $0, %r10
1056        je      DECB_END_4
1057DECB_LOOP_4_2:
1058        movdqu  (%rdi), %xmm1
1059        addq    $16, %rdi
1060        pxor    (%rcx), %xmm1
1061        movdqu  160(%rcx), %xmm2
1062        cmpl    $12, %r8d
1063        aesdec  16(%rcx), %xmm1
1064        aesdec  32(%rcx), %xmm1
1065        aesdec  48(%rcx), %xmm1
1066        aesdec  64(%rcx), %xmm1
1067        aesdec  80(%rcx), %xmm1
1068        aesdec  96(%rcx), %xmm1
1069        aesdec  112(%rcx), %xmm1
1070        aesdec  128(%rcx), %xmm1
1071        aesdec  144(%rcx), %xmm1
1072        jb      DECB_LAST_4_2
1073        cmpl    $14, %r8d
1074        movdqu  192(%rcx), %xmm2
1075        aesdec  160(%rcx), %xmm1
1076        aesdec  176(%rcx), %xmm1
1077        jb      DECB_LAST_4_2
1078        movdqu  224(%rcx), %xmm2
1079        aesdec  192(%rcx), %xmm1
1080        aesdec  208(%rcx), %xmm1
1081DECB_LAST_4_2:
1082        aesdeclast %xmm2, %xmm1
1083        movdqu  %xmm1, (%rsi)
1084        addq    $16, %rsi
1085        decq    %r10
1086        jne     DECB_LOOP_4_2
1087DECB_END_4:
1088        ret
1089
1090
1091
1092
1093/*
1094void AES_128_Key_Expansion(const unsigned char* userkey,
1095   unsigned char* key_schedule);
1096*/
1097.align  16,0x90
1098#ifndef __APPLE__
1099.globl AES_128_Key_Expansion
1100AES_128_Key_Expansion:
1101#else
1102.globl _AES_128_Key_Expansion
1103_AES_128_Key_Expansion:
1104#endif
1105# parameter 1: %rdi
1106# parameter 2: %rsi
1107movl    $10, 240(%rsi)
1108
1109movdqu  (%rdi), %xmm1
1110movdqa    %xmm1, (%rsi)
1111
1112
1113ASSISTS:
1114aeskeygenassist $1, %xmm1, %xmm2
1115call PREPARE_ROUNDKEY_128
1116movdqa %xmm1, 16(%rsi)
1117aeskeygenassist $2, %xmm1, %xmm2
1118call PREPARE_ROUNDKEY_128
1119movdqa %xmm1, 32(%rsi)
1120aeskeygenassist $4, %xmm1, %xmm2
1121call PREPARE_ROUNDKEY_128
1122movdqa %xmm1, 48(%rsi)
1123aeskeygenassist $8, %xmm1, %xmm2
1124call PREPARE_ROUNDKEY_128
1125movdqa %xmm1, 64(%rsi)
1126aeskeygenassist $16, %xmm1, %xmm2
1127call PREPARE_ROUNDKEY_128
1128movdqa %xmm1, 80(%rsi)
1129aeskeygenassist $32, %xmm1, %xmm2
1130call PREPARE_ROUNDKEY_128
1131movdqa %xmm1, 96(%rsi)
1132aeskeygenassist $64, %xmm1, %xmm2
1133call PREPARE_ROUNDKEY_128
1134movdqa %xmm1, 112(%rsi)
1135aeskeygenassist $0x80, %xmm1, %xmm2
1136call PREPARE_ROUNDKEY_128
1137movdqa %xmm1, 128(%rsi)
1138aeskeygenassist $0x1b, %xmm1, %xmm2
1139call PREPARE_ROUNDKEY_128
1140movdqa %xmm1, 144(%rsi)
1141aeskeygenassist $0x36, %xmm1, %xmm2
1142call PREPARE_ROUNDKEY_128
1143movdqa %xmm1, 160(%rsi)
1144ret
1145
1146PREPARE_ROUNDKEY_128:
1147pshufd $255, %xmm2, %xmm2
1148movdqa %xmm1, %xmm3
1149pslldq $4, %xmm3
1150pxor %xmm3, %xmm1
1151pslldq $4, %xmm3
1152pxor %xmm3, %xmm1
1153pslldq $4, %xmm3
1154pxor %xmm3, %xmm1
1155pxor %xmm2, %xmm1
1156ret
1157
1158
1159/*
1160void AES_192_Key_Expansion (const unsigned char *userkey,
1161  unsigned char *key)
1162*/
1163#ifndef __APPLE__
1164.globl AES_192_Key_Expansion
1165AES_192_Key_Expansion:
1166#else
1167.globl _AES_192_Key_Expansion
1168_AES_192_Key_Expansion:
1169#endif
1170# parameter 1: %rdi
1171# parameter 2: %rsi
1172
1173movdqu (%rdi), %xmm1
1174movq 16(%rdi), %xmm3
1175movdqa %xmm1, (%rsi)
1176movdqa %xmm3, %xmm5
1177
1178aeskeygenassist $0x1, %xmm3, %xmm2
1179call PREPARE_ROUNDKEY_192
1180shufpd $0, %xmm1, %xmm5
1181movdqa %xmm5, 16(%rsi)
1182movdqa %xmm1, %xmm6
1183shufpd $1, %xmm3, %xmm6
1184movdqa %xmm6, 32(%rsi)
1185
1186aeskeygenassist $0x2, %xmm3, %xmm2
1187call PREPARE_ROUNDKEY_192
1188movdqa %xmm1, 48(%rsi)
1189movdqa %xmm3, %xmm5
1190
1191aeskeygenassist $0x4, %xmm3, %xmm2
1192call PREPARE_ROUNDKEY_192
1193shufpd $0, %xmm1, %xmm5
1194movdqa %xmm5, 64(%rsi)
1195movdqa %xmm1, %xmm6
1196shufpd $1, %xmm3, %xmm6
1197movdqa %xmm6, 80(%rsi)
1198
1199aeskeygenassist $0x8, %xmm3, %xmm2
1200call PREPARE_ROUNDKEY_192
1201movdqa %xmm1, 96(%rsi)
1202movdqa %xmm3, %xmm5
1203
1204aeskeygenassist $0x10, %xmm3, %xmm2
1205call PREPARE_ROUNDKEY_192
1206shufpd $0, %xmm1, %xmm5
1207movdqa %xmm5, 112(%rsi)
1208movdqa %xmm1, %xmm6
1209shufpd $1, %xmm3, %xmm6
1210movdqa %xmm6, 128(%rsi)
1211
1212aeskeygenassist $0x20, %xmm3, %xmm2
1213call PREPARE_ROUNDKEY_192
1214movdqa %xmm1, 144(%rsi)
1215movdqa %xmm3, %xmm5
1216
1217aeskeygenassist $0x40, %xmm3, %xmm2
1218call PREPARE_ROUNDKEY_192
1219shufpd $0, %xmm1, %xmm5
1220movdqa %xmm5, 160(%rsi)
1221movdqa %xmm1, %xmm6
1222shufpd $1, %xmm3, %xmm6
1223movdqa %xmm6, 176(%rsi)
1224
1225aeskeygenassist $0x80, %xmm3, %xmm2
1226call PREPARE_ROUNDKEY_192
1227movdqa %xmm1, 192(%rsi)
1228movdqa %xmm3, 208(%rsi)
1229ret
1230
1231PREPARE_ROUNDKEY_192:
1232pshufd $0x55, %xmm2, %xmm2
1233movdqu %xmm1, %xmm4
1234pslldq $4, %xmm4
1235pxor   %xmm4, %xmm1
1236
1237pslldq $4, %xmm4
1238pxor   %xmm4, %xmm1
1239pslldq $4, %xmm4
1240pxor  %xmm4, %xmm1
1241pxor   %xmm2, %xmm1
1242pshufd $0xff, %xmm1, %xmm2
1243movdqu %xmm3, %xmm4
1244pslldq $4, %xmm4
1245pxor   %xmm4, %xmm3
1246pxor   %xmm2, %xmm3
1247ret
1248
1249
1250/*
1251void AES_256_Key_Expansion (const unsigned char *userkey,
1252  unsigned char *key)
1253*/
1254#ifndef __APPLE__
1255.globl AES_256_Key_Expansion
1256AES_256_Key_Expansion:
1257#else
1258.globl _AES_256_Key_Expansion
1259_AES_256_Key_Expansion:
1260#endif
1261# parameter 1: %rdi
1262# parameter 2: %rsi
1263
1264movdqu (%rdi), %xmm1
1265movdqu 16(%rdi), %xmm3
1266movdqa %xmm1, (%rsi)
1267movdqa %xmm3, 16(%rsi)
1268
1269aeskeygenassist $0x1, %xmm3, %xmm2
1270call MAKE_RK256_a
1271movdqa %xmm1, 32(%rsi)
1272aeskeygenassist $0x0, %xmm1, %xmm2
1273call MAKE_RK256_b
1274movdqa %xmm3, 48(%rsi)
1275aeskeygenassist $0x2, %xmm3, %xmm2
1276call MAKE_RK256_a
1277movdqa %xmm1, 64(%rsi)
1278aeskeygenassist $0x0, %xmm1, %xmm2
1279call MAKE_RK256_b
1280movdqa %xmm3, 80(%rsi)
1281aeskeygenassist $0x4, %xmm3, %xmm2
1282call MAKE_RK256_a
1283movdqa %xmm1, 96(%rsi)
1284aeskeygenassist $0x0, %xmm1, %xmm2
1285call MAKE_RK256_b
1286movdqa %xmm3, 112(%rsi)
1287aeskeygenassist $0x8, %xmm3, %xmm2
1288call MAKE_RK256_a
1289movdqa %xmm1, 128(%rsi)
1290aeskeygenassist $0x0, %xmm1, %xmm2
1291call MAKE_RK256_b
1292movdqa %xmm3, 144(%rsi)
1293aeskeygenassist $0x10, %xmm3, %xmm2
1294call MAKE_RK256_a
1295movdqa %xmm1, 160(%rsi)
1296aeskeygenassist $0x0, %xmm1, %xmm2
1297call MAKE_RK256_b
1298movdqa %xmm3, 176(%rsi)
1299aeskeygenassist $0x20, %xmm3, %xmm2
1300call MAKE_RK256_a
1301movdqa %xmm1, 192(%rsi)
1302
1303aeskeygenassist $0x0, %xmm1, %xmm2
1304call MAKE_RK256_b
1305movdqa %xmm3, 208(%rsi)
1306aeskeygenassist $0x40, %xmm3, %xmm2
1307call MAKE_RK256_a
1308movdqa %xmm1, 224(%rsi)
1309
1310ret
1311
1312MAKE_RK256_a:
1313pshufd $0xff, %xmm2, %xmm2
1314movdqa %xmm1, %xmm4
1315pslldq $4, %xmm4
1316pxor   %xmm4, %xmm1
1317pslldq $4, %xmm4
1318pxor  %xmm4, %xmm1
1319pslldq $4, %xmm4
1320pxor  %xmm4, %xmm1
1321pxor   %xmm2, %xmm1
1322ret
1323
1324MAKE_RK256_b:
1325pshufd $0xaa, %xmm2, %xmm2
1326movdqa %xmm3, %xmm4
1327pslldq $4, %xmm4
1328pxor   %xmm4, %xmm3
1329pslldq $4, %xmm4
1330pxor  %xmm4, %xmm3
1331pslldq $4, %xmm4
1332pxor  %xmm4, %xmm3
1333pxor   %xmm2, %xmm3
1334ret
1335
1336#if defined(__linux__) && defined(__ELF__)
1337    .section .note.GNU-stack,"",%progbits
1338#endif
1339