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