Added Mike Hamburg's SSSE3 AES implementation.
[gnutls:gnutls.git] / lib / accelerated / x86 / coff / aes-ssse3-x86.s
1 ######################################################################
2 ## Constant-time SSSE3 AES core implementation.
3 ## version 0.1
4 ##
5 ## By Mike Hamburg (Stanford University), 2009
6 ## Public domain.
7 ##
8 ## For details see http://shiftleft.org/papers/vector_aes/ and
9 ## http://crypto.stanford.edu/vpaes/.
10 #
11 # *** This file is auto-generated ***
12 #
13 .file   "vpaes-x86.s"
14 .text
15 .align  64
16 .L_vpaes_consts:
17 .long   218628480,235210255,168496130,67568393
18 .long   252381056,17041926,33884169,51187212
19 .long   252645135,252645135,252645135,252645135
20 .long   1512730624,3266504856,1377990664,3401244816
21 .long   830229760,1275146365,2969422977,3447763452
22 .long   3411033600,2979783055,338359620,2782886510
23 .long   4209124096,907596821,221174255,1006095553
24 .long   191964160,3799684038,3164090317,1589111125
25 .long   182528256,1777043520,2877432650,3265356744
26 .long   1874708224,3503451415,3305285752,363511674
27 .long   1606117888,3487855781,1093350906,2384367825
28 .long   197121,67569157,134941193,202313229
29 .long   67569157,134941193,202313229,197121
30 .long   134941193,202313229,197121,67569157
31 .long   202313229,197121,67569157,134941193
32 .long   33619971,100992007,168364043,235736079
33 .long   235736079,33619971,100992007,168364043
34 .long   168364043,235736079,33619971,100992007
35 .long   100992007,168364043,235736079,33619971
36 .long   50462976,117835012,185207048,252579084
37 .long   252314880,51251460,117574920,184942860
38 .long   184682752,252054788,50987272,118359308
39 .long   118099200,185467140,251790600,50727180
40 .long   2946363062,528716217,1300004225,1881839624
41 .long   1532713819,1532713819,1532713819,1532713819
42 .long   3602276352,4288629033,3737020424,4153884961
43 .long   1354558464,32357713,2958822624,3775749553
44 .long   1201988352,132424512,1572796698,503232858
45 .long   2213177600,1597421020,4103937655,675398315
46 .long   2749646592,4273543773,1511898873,121693092
47 .long   3040248576,1103263732,2871565598,1608280554
48 .long   2236667136,2588920351,482954393,64377734
49 .long   3069987328,291237287,2117370568,3650299247
50 .long   533321216,3573750986,2572112006,1401264716
51 .long   1339849704,2721158661,548607111,3445553514
52 .long   2128193280,3054596040,2183486460,1257083700
53 .long   655635200,1165381986,3923443150,2344132524
54 .long   190078720,256924420,290342170,357187870
55 .long   1610966272,2263057382,4103205268,309794674
56 .long   2592527872,2233205587,1335446729,3402964816
57 .long   3973531904,3225098121,3002836325,1918774430
58 .long   3870401024,2102906079,2284471353,4117666579
59 .long   617007872,1021508343,366931923,691083277
60 .long   2528395776,3491914898,2968704004,1613121270
61 .long   3445188352,3247741094,844474987,4093578302
62 .long   651481088,1190302358,1689581232,574775300
63 .long   4289380608,206939853,2555985458,2489840491
64 .long   2130264064,327674451,3566485037,3349835193
65 .long   2470714624,316102159,3636825756,3393945945
66 .byte   86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105
67 .byte   111,110,32,65,69,83,32,102,111,114,32,120,56,54,47,83
68 .byte   83,83,69,51,44,32,77,105,107,101,32,72,97,109,98,117
69 .byte   114,103,32,40,83,116,97,110,102,111,114,100,32,85,110,105
70 .byte   118,101,114,115,105,116,121,41,0
71 .align  64
72 .def    __vpaes_preheat;        .scl    3;      .type   32;     .endef
73 .align  16
74 __vpaes_preheat:
75         addl    (%esp),%ebp
76         movdqa  -48(%ebp),%xmm7
77         movdqa  -16(%ebp),%xmm6
78         ret
79 .def    __vpaes_encrypt_core;   .scl    3;      .type   32;     .endef
80 .align  16
81 __vpaes_encrypt_core:
82         movl    $16,%ecx
83         movl    240(%edx),%eax
84         movdqa  %xmm6,%xmm1
85         movdqa  (%ebp),%xmm2
86         pandn   %xmm0,%xmm1
87         pand    %xmm6,%xmm0
88         movdqu  (%edx),%xmm5
89 .byte   102,15,56,0,208
90         movdqa  16(%ebp),%xmm0
91         pxor    %xmm5,%xmm2
92         psrld   $4,%xmm1
93         addl    $16,%edx
94 .byte   102,15,56,0,193
95         leal    192(%ebp),%ebx
96         pxor    %xmm2,%xmm0
97         jmp     .L000enc_entry
98 .align  16
99 .L001enc_loop:
100         movdqa  32(%ebp),%xmm4
101         movdqa  48(%ebp),%xmm0
102 .byte   102,15,56,0,226
103 .byte   102,15,56,0,195
104         pxor    %xmm5,%xmm4
105         movdqa  64(%ebp),%xmm5
106         pxor    %xmm4,%xmm0
107         movdqa  -64(%ebx,%ecx,1),%xmm1
108 .byte   102,15,56,0,234
109         movdqa  80(%ebp),%xmm2
110         movdqa  (%ebx,%ecx,1),%xmm4
111 .byte   102,15,56,0,211
112         movdqa  %xmm0,%xmm3
113         pxor    %xmm5,%xmm2
114 .byte   102,15,56,0,193
115         addl    $16,%edx
116         pxor    %xmm2,%xmm0
117 .byte   102,15,56,0,220
118         addl    $16,%ecx
119         pxor    %xmm0,%xmm3
120 .byte   102,15,56,0,193
121         andl    $48,%ecx
122         subl    $1,%eax
123         pxor    %xmm3,%xmm0
124 .L000enc_entry:
125         movdqa  %xmm6,%xmm1
126         movdqa  -32(%ebp),%xmm5
127         pandn   %xmm0,%xmm1
128         psrld   $4,%xmm1
129         pand    %xmm6,%xmm0
130 .byte   102,15,56,0,232
131         movdqa  %xmm7,%xmm3
132         pxor    %xmm1,%xmm0
133 .byte   102,15,56,0,217
134         movdqa  %xmm7,%xmm4
135         pxor    %xmm5,%xmm3
136 .byte   102,15,56,0,224
137         movdqa  %xmm7,%xmm2
138         pxor    %xmm5,%xmm4
139 .byte   102,15,56,0,211
140         movdqa  %xmm7,%xmm3
141         pxor    %xmm0,%xmm2
142 .byte   102,15,56,0,220
143         movdqu  (%edx),%xmm5
144         pxor    %xmm1,%xmm3
145         jnz     .L001enc_loop
146         movdqa  96(%ebp),%xmm4
147         movdqa  112(%ebp),%xmm0
148 .byte   102,15,56,0,226
149         pxor    %xmm5,%xmm4
150 .byte   102,15,56,0,195
151         movdqa  64(%ebx,%ecx,1),%xmm1
152         pxor    %xmm4,%xmm0
153 .byte   102,15,56,0,193
154         ret
155 .def    __vpaes_decrypt_core;   .scl    3;      .type   32;     .endef
156 .align  16
157 __vpaes_decrypt_core:
158         leal    608(%ebp),%ebx
159         movl    240(%edx),%eax
160         movdqa  %xmm6,%xmm1
161         movdqa  -64(%ebx),%xmm2
162         pandn   %xmm0,%xmm1
163         movl    %eax,%ecx
164         psrld   $4,%xmm1
165         movdqu  (%edx),%xmm5
166         shll    $4,%ecx
167         pand    %xmm6,%xmm0
168 .byte   102,15,56,0,208
169         movdqa  -48(%ebx),%xmm0
170         xorl    $48,%ecx
171 .byte   102,15,56,0,193
172         andl    $48,%ecx
173         pxor    %xmm5,%xmm2
174         movdqa  176(%ebp),%xmm5
175         pxor    %xmm2,%xmm0
176         addl    $16,%edx
177         leal    -352(%ebx,%ecx,1),%ecx
178         jmp     .L002dec_entry
179 .align  16
180 .L003dec_loop:
181         movdqa  -32(%ebx),%xmm4
182         movdqa  -16(%ebx),%xmm1
183 .byte   102,15,56,0,226
184 .byte   102,15,56,0,203
185         pxor    %xmm4,%xmm0
186         movdqa  (%ebx),%xmm4
187         pxor    %xmm1,%xmm0
188         movdqa  16(%ebx),%xmm1
189 .byte   102,15,56,0,226
190 .byte   102,15,56,0,197
191 .byte   102,15,56,0,203
192         pxor    %xmm4,%xmm0
193         movdqa  32(%ebx),%xmm4
194         pxor    %xmm1,%xmm0
195         movdqa  48(%ebx),%xmm1
196 .byte   102,15,56,0,226
197 .byte   102,15,56,0,197
198 .byte   102,15,56,0,203
199         pxor    %xmm4,%xmm0
200         movdqa  64(%ebx),%xmm4
201         pxor    %xmm1,%xmm0
202         movdqa  80(%ebx),%xmm1
203 .byte   102,15,56,0,226
204 .byte   102,15,56,0,197
205 .byte   102,15,56,0,203
206         pxor    %xmm4,%xmm0
207         addl    $16,%edx
208 .byte   102,15,58,15,237,12
209         pxor    %xmm1,%xmm0
210         subl    $1,%eax
211 .L002dec_entry:
212         movdqa  %xmm6,%xmm1
213         movdqa  -32(%ebp),%xmm2
214         pandn   %xmm0,%xmm1
215         pand    %xmm6,%xmm0
216         psrld   $4,%xmm1
217 .byte   102,15,56,0,208
218         movdqa  %xmm7,%xmm3
219         pxor    %xmm1,%xmm0
220 .byte   102,15,56,0,217
221         movdqa  %xmm7,%xmm4
222         pxor    %xmm2,%xmm3
223 .byte   102,15,56,0,224
224         pxor    %xmm2,%xmm4
225         movdqa  %xmm7,%xmm2
226 .byte   102,15,56,0,211
227         movdqa  %xmm7,%xmm3
228         pxor    %xmm0,%xmm2
229 .byte   102,15,56,0,220
230         movdqu  (%edx),%xmm0
231         pxor    %xmm1,%xmm3
232         jnz     .L003dec_loop
233         movdqa  96(%ebx),%xmm4
234 .byte   102,15,56,0,226
235         pxor    %xmm0,%xmm4
236         movdqa  112(%ebx),%xmm0
237         movdqa  (%ecx),%xmm2
238 .byte   102,15,56,0,195
239         pxor    %xmm4,%xmm0
240 .byte   102,15,56,0,194
241         ret
242 .def    __vpaes_schedule_core;  .scl    3;      .type   32;     .endef
243 .align  16
244 __vpaes_schedule_core:
245         addl    (%esp),%ebp
246         movdqu  (%esi),%xmm0
247         movdqa  320(%ebp),%xmm2
248         movdqa  %xmm0,%xmm3
249         leal    (%ebp),%ebx
250         movdqa  %xmm2,4(%esp)
251         call    __vpaes_schedule_transform
252         movdqa  %xmm0,%xmm7
253         testl   %edi,%edi
254         jnz     .L004schedule_am_decrypting
255         movdqu  %xmm0,(%edx)
256         jmp     .L005schedule_go
257 .L004schedule_am_decrypting:
258         movdqa  256(%ebp,%ecx,1),%xmm1
259 .byte   102,15,56,0,217
260         movdqu  %xmm3,(%edx)
261         xorl    $48,%ecx
262 .L005schedule_go:
263         cmpl    $192,%eax
264         ja      .L006schedule_256
265         je      .L007schedule_192
266 .L008schedule_128:
267         movl    $10,%eax
268 .L009loop_schedule_128:
269         call    __vpaes_schedule_round
270         decl    %eax
271         jz      .L010schedule_mangle_last
272         call    __vpaes_schedule_mangle
273         jmp     .L009loop_schedule_128
274 .align  16
275 .L007schedule_192:
276         movdqu  8(%esi),%xmm0
277         call    __vpaes_schedule_transform
278         movdqa  %xmm0,%xmm6
279         pxor    %xmm4,%xmm4
280         movhlps %xmm4,%xmm6
281         movl    $4,%eax
282 .L011loop_schedule_192:
283         call    __vpaes_schedule_round
284 .byte   102,15,58,15,198,8
285         call    __vpaes_schedule_mangle
286         call    __vpaes_schedule_192_smear
287         call    __vpaes_schedule_mangle
288         call    __vpaes_schedule_round
289         decl    %eax
290         jz      .L010schedule_mangle_last
291         call    __vpaes_schedule_mangle
292         call    __vpaes_schedule_192_smear
293         jmp     .L011loop_schedule_192
294 .align  16
295 .L006schedule_256:
296         movdqu  16(%esi),%xmm0
297         call    __vpaes_schedule_transform
298         movl    $7,%eax
299 .L012loop_schedule_256:
300         call    __vpaes_schedule_mangle
301         movdqa  %xmm0,%xmm6
302         call    __vpaes_schedule_round
303         decl    %eax
304         jz      .L010schedule_mangle_last
305         call    __vpaes_schedule_mangle
306         pshufd  $255,%xmm0,%xmm0
307         movdqa  %xmm7,20(%esp)
308         movdqa  %xmm6,%xmm7
309         call    .L_vpaes_schedule_low_round
310         movdqa  20(%esp),%xmm7
311         jmp     .L012loop_schedule_256
312 .align  16
313 .L010schedule_mangle_last:
314         leal    384(%ebp),%ebx
315         testl   %edi,%edi
316         jnz     .L013schedule_mangle_last_dec
317         movdqa  256(%ebp,%ecx,1),%xmm1
318 .byte   102,15,56,0,193
319         leal    352(%ebp),%ebx
320         addl    $32,%edx
321 .L013schedule_mangle_last_dec:
322         addl    $-16,%edx
323         pxor    336(%ebp),%xmm0
324         call    __vpaes_schedule_transform
325         movdqu  %xmm0,(%edx)
326         pxor    %xmm0,%xmm0
327         pxor    %xmm1,%xmm1
328         pxor    %xmm2,%xmm2
329         pxor    %xmm3,%xmm3
330         pxor    %xmm4,%xmm4
331         pxor    %xmm5,%xmm5
332         pxor    %xmm6,%xmm6
333         pxor    %xmm7,%xmm7
334         ret
335 .def    __vpaes_schedule_192_smear;     .scl    3;      .type   32;     .endef
336 .align  16
337 __vpaes_schedule_192_smear:
338         pshufd  $128,%xmm6,%xmm1
339         pshufd  $254,%xmm7,%xmm0
340         pxor    %xmm1,%xmm6
341         pxor    %xmm1,%xmm1
342         pxor    %xmm0,%xmm6
343         movdqa  %xmm6,%xmm0
344         movhlps %xmm1,%xmm6
345         ret
346 .def    __vpaes_schedule_round; .scl    3;      .type   32;     .endef
347 .align  16
348 __vpaes_schedule_round:
349         movdqa  8(%esp),%xmm2
350         pxor    %xmm1,%xmm1
351 .byte   102,15,58,15,202,15
352 .byte   102,15,58,15,210,15
353         pxor    %xmm1,%xmm7
354         pshufd  $255,%xmm0,%xmm0
355 .byte   102,15,58,15,192,1
356         movdqa  %xmm2,8(%esp)
357 .L_vpaes_schedule_low_round:
358         movdqa  %xmm7,%xmm1
359         pslldq  $4,%xmm7
360         pxor    %xmm1,%xmm7
361         movdqa  %xmm7,%xmm1
362         pslldq  $8,%xmm7
363         pxor    %xmm1,%xmm7
364         pxor    336(%ebp),%xmm7
365         movdqa  -16(%ebp),%xmm4
366         movdqa  -48(%ebp),%xmm5
367         movdqa  %xmm4,%xmm1
368         pandn   %xmm0,%xmm1
369         psrld   $4,%xmm1
370         pand    %xmm4,%xmm0
371         movdqa  -32(%ebp),%xmm2
372 .byte   102,15,56,0,208
373         pxor    %xmm1,%xmm0
374         movdqa  %xmm5,%xmm3
375 .byte   102,15,56,0,217
376         pxor    %xmm2,%xmm3
377         movdqa  %xmm5,%xmm4
378 .byte   102,15,56,0,224
379         pxor    %xmm2,%xmm4
380         movdqa  %xmm5,%xmm2
381 .byte   102,15,56,0,211
382         pxor    %xmm0,%xmm2
383         movdqa  %xmm5,%xmm3
384 .byte   102,15,56,0,220
385         pxor    %xmm1,%xmm3
386         movdqa  32(%ebp),%xmm4
387 .byte   102,15,56,0,226
388         movdqa  48(%ebp),%xmm0
389 .byte   102,15,56,0,195
390         pxor    %xmm4,%xmm0
391         pxor    %xmm7,%xmm0
392         movdqa  %xmm0,%xmm7
393         ret
394 .def    __vpaes_schedule_transform;     .scl    3;      .type   32;     .endef
395 .align  16
396 __vpaes_schedule_transform:
397         movdqa  -16(%ebp),%xmm2
398         movdqa  %xmm2,%xmm1
399         pandn   %xmm0,%xmm1
400         psrld   $4,%xmm1
401         pand    %xmm2,%xmm0
402         movdqa  (%ebx),%xmm2
403 .byte   102,15,56,0,208
404         movdqa  16(%ebx),%xmm0
405 .byte   102,15,56,0,193
406         pxor    %xmm2,%xmm0
407         ret
408 .def    __vpaes_schedule_mangle;        .scl    3;      .type   32;     .endef
409 .align  16
410 __vpaes_schedule_mangle:
411         movdqa  %xmm0,%xmm4
412         movdqa  128(%ebp),%xmm5
413         testl   %edi,%edi
414         jnz     .L014schedule_mangle_dec
415         addl    $16,%edx
416         pxor    336(%ebp),%xmm4
417 .byte   102,15,56,0,229
418         movdqa  %xmm4,%xmm3
419 .byte   102,15,56,0,229
420         pxor    %xmm4,%xmm3
421 .byte   102,15,56,0,229
422         pxor    %xmm4,%xmm3
423         jmp     .L015schedule_mangle_both
424 .align  16
425 .L014schedule_mangle_dec:
426         movdqa  -16(%ebp),%xmm2
427         leal    416(%ebp),%esi
428         movdqa  %xmm2,%xmm1
429         pandn   %xmm4,%xmm1
430         psrld   $4,%xmm1
431         pand    %xmm2,%xmm4
432         movdqa  (%esi),%xmm2
433 .byte   102,15,56,0,212
434         movdqa  16(%esi),%xmm3
435 .byte   102,15,56,0,217
436         pxor    %xmm2,%xmm3
437 .byte   102,15,56,0,221
438         movdqa  32(%esi),%xmm2
439 .byte   102,15,56,0,212
440         pxor    %xmm3,%xmm2
441         movdqa  48(%esi),%xmm3
442 .byte   102,15,56,0,217
443         pxor    %xmm2,%xmm3
444 .byte   102,15,56,0,221
445         movdqa  64(%esi),%xmm2
446 .byte   102,15,56,0,212
447         pxor    %xmm3,%xmm2
448         movdqa  80(%esi),%xmm3
449 .byte   102,15,56,0,217
450         pxor    %xmm2,%xmm3
451 .byte   102,15,56,0,221
452         movdqa  96(%esi),%xmm2
453 .byte   102,15,56,0,212
454         pxor    %xmm3,%xmm2
455         movdqa  112(%esi),%xmm3
456 .byte   102,15,56,0,217
457         pxor    %xmm2,%xmm3
458         addl    $-16,%edx
459 .L015schedule_mangle_both:
460         movdqa  256(%ebp,%ecx,1),%xmm1
461 .byte   102,15,56,0,217
462         addl    $-16,%ecx
463         andl    $48,%ecx
464         movdqu  %xmm3,(%edx)
465         ret
466 .globl  _vpaes_set_encrypt_key
467 .def    _vpaes_set_encrypt_key; .scl    2;      .type   32;     .endef
468 .align  16
469 _vpaes_set_encrypt_key:
470 .L_vpaes_set_encrypt_key_begin:
471         pushl   %ebp
472         pushl   %ebx
473         pushl   %esi
474         pushl   %edi
475         movl    20(%esp),%esi
476         leal    -56(%esp),%ebx
477         movl    24(%esp),%eax
478         andl    $-16,%ebx
479         movl    28(%esp),%edx
480         xchgl   %esp,%ebx
481         movl    %ebx,48(%esp)
482         movl    %eax,%ebx
483         shrl    $5,%ebx
484         addl    $5,%ebx
485         movl    %ebx,240(%edx)
486         movl    $48,%ecx
487         movl    $0,%edi
488         leal    .L_vpaes_consts+0x30-.L016pic_point,%ebp
489         call    __vpaes_schedule_core
490 .L016pic_point:
491         movl    48(%esp),%esp
492         xorl    %eax,%eax
493         popl    %edi
494         popl    %esi
495         popl    %ebx
496         popl    %ebp
497         ret
498 .globl  _vpaes_set_decrypt_key
499 .def    _vpaes_set_decrypt_key; .scl    2;      .type   32;     .endef
500 .align  16
501 _vpaes_set_decrypt_key:
502 .L_vpaes_set_decrypt_key_begin:
503         pushl   %ebp
504         pushl   %ebx
505         pushl   %esi
506         pushl   %edi
507         movl    20(%esp),%esi
508         leal    -56(%esp),%ebx
509         movl    24(%esp),%eax
510         andl    $-16,%ebx
511         movl    28(%esp),%edx
512         xchgl   %esp,%ebx
513         movl    %ebx,48(%esp)
514         movl    %eax,%ebx
515         shrl    $5,%ebx
516         addl    $5,%ebx
517         movl    %ebx,240(%edx)
518         shll    $4,%ebx
519         leal    16(%edx,%ebx,1),%edx
520         movl    $1,%edi
521         movl    %eax,%ecx
522         shrl    $1,%ecx
523         andl    $32,%ecx
524         xorl    $32,%ecx
525         leal    .L_vpaes_consts+0x30-.L017pic_point,%ebp
526         call    __vpaes_schedule_core
527 .L017pic_point:
528         movl    48(%esp),%esp
529         xorl    %eax,%eax
530         popl    %edi
531         popl    %esi
532         popl    %ebx
533         popl    %ebp
534         ret
535 .globl  _vpaes_encrypt
536 .def    _vpaes_encrypt; .scl    2;      .type   32;     .endef
537 .align  16
538 _vpaes_encrypt:
539 .L_vpaes_encrypt_begin:
540         pushl   %ebp
541         pushl   %ebx
542         pushl   %esi
543         pushl   %edi
544         leal    .L_vpaes_consts+0x30-.L018pic_point,%ebp
545         call    __vpaes_preheat
546 .L018pic_point:
547         movl    20(%esp),%esi
548         leal    -56(%esp),%ebx
549         movl    24(%esp),%edi
550         andl    $-16,%ebx
551         movl    28(%esp),%edx
552         xchgl   %esp,%ebx
553         movl    %ebx,48(%esp)
554         movdqu  (%esi),%xmm0
555         call    __vpaes_encrypt_core
556         movdqu  %xmm0,(%edi)
557         movl    48(%esp),%esp
558         popl    %edi
559         popl    %esi
560         popl    %ebx
561         popl    %ebp
562         ret
563 .globl  _vpaes_decrypt
564 .def    _vpaes_decrypt; .scl    2;      .type   32;     .endef
565 .align  16
566 _vpaes_decrypt:
567 .L_vpaes_decrypt_begin:
568         pushl   %ebp
569         pushl   %ebx
570         pushl   %esi
571         pushl   %edi
572         leal    .L_vpaes_consts+0x30-.L019pic_point,%ebp
573         call    __vpaes_preheat
574 .L019pic_point:
575         movl    20(%esp),%esi
576         leal    -56(%esp),%ebx
577         movl    24(%esp),%edi
578         andl    $-16,%ebx
579         movl    28(%esp),%edx
580         xchgl   %esp,%ebx
581         movl    %ebx,48(%esp)
582         movdqu  (%esi),%xmm0
583         call    __vpaes_decrypt_core
584         movdqu  %xmm0,(%edi)
585         movl    48(%esp),%esp
586         popl    %edi
587         popl    %esi
588         popl    %ebx
589         popl    %ebp
590         ret
591 .globl  _vpaes_cbc_encrypt
592 .def    _vpaes_cbc_encrypt;     .scl    2;      .type   32;     .endef
593 .align  16
594 _vpaes_cbc_encrypt:
595 .L_vpaes_cbc_encrypt_begin:
596         pushl   %ebp
597         pushl   %ebx
598         pushl   %esi
599         pushl   %edi
600         movl    20(%esp),%esi
601         movl    24(%esp),%edi
602         movl    28(%esp),%eax
603         movl    32(%esp),%edx
604         subl    $16,%eax
605         jc      .L020cbc_abort
606         leal    -56(%esp),%ebx
607         movl    36(%esp),%ebp
608         andl    $-16,%ebx
609         movl    40(%esp),%ecx
610         xchgl   %esp,%ebx
611         movdqu  (%ebp),%xmm1
612         subl    %esi,%edi
613         movl    %ebx,48(%esp)
614         movl    %edi,(%esp)
615         movl    %edx,4(%esp)
616         movl    %ebp,8(%esp)
617         movl    %eax,%edi
618         leal    .L_vpaes_consts+0x30-.L021pic_point,%ebp
619         call    __vpaes_preheat
620 .L021pic_point:
621         cmpl    $0,%ecx
622         je      .L022cbc_dec_loop
623         jmp     .L023cbc_enc_loop
624 .align  16
625 .L023cbc_enc_loop:
626         movdqu  (%esi),%xmm0
627         pxor    %xmm1,%xmm0
628         call    __vpaes_encrypt_core
629         movl    (%esp),%ebx
630         movl    4(%esp),%edx
631         movdqa  %xmm0,%xmm1
632         movdqu  %xmm0,(%ebx,%esi,1)
633         leal    16(%esi),%esi
634         subl    $16,%edi
635         jnc     .L023cbc_enc_loop
636         jmp     .L024cbc_done
637 .align  16
638 .L022cbc_dec_loop:
639         movdqu  (%esi),%xmm0
640         movdqa  %xmm1,16(%esp)
641         movdqa  %xmm0,32(%esp)
642         call    __vpaes_decrypt_core
643         movl    (%esp),%ebx
644         movl    4(%esp),%edx
645         pxor    16(%esp),%xmm0
646         movdqa  32(%esp),%xmm1
647         movdqu  %xmm0,(%ebx,%esi,1)
648         leal    16(%esi),%esi
649         subl    $16,%edi
650         jnc     .L022cbc_dec_loop
651 .L024cbc_done:
652         movl    8(%esp),%ebx
653         movl    48(%esp),%esp
654         movdqu  %xmm1,(%ebx)
655 .L020cbc_abort:
656         popl    %edi
657         popl    %esi
658         popl    %ebx
659         popl    %ebp
660         ret
661
662 .section .note.GNU-stack,"",%progbits