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