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