• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM)
2.text
3
4
5.p2align	5
6_aesni_ctr32_ghash_6x:
7	vmovdqu	32(%r11),%xmm2
8	subq	$6,%rdx
9	vpxor	%xmm4,%xmm4,%xmm4
10	vmovdqu	0-128(%rcx),%xmm15
11	vpaddb	%xmm2,%xmm1,%xmm10
12	vpaddb	%xmm2,%xmm10,%xmm11
13	vpaddb	%xmm2,%xmm11,%xmm12
14	vpaddb	%xmm2,%xmm12,%xmm13
15	vpaddb	%xmm2,%xmm13,%xmm14
16	vpxor	%xmm15,%xmm1,%xmm9
17	vmovdqu	%xmm4,16+8(%rsp)
18	jmp	L$oop6x
19
20.p2align	5
21L$oop6x:
22	addl	$100663296,%ebx
23	jc	L$handle_ctr32
24	vmovdqu	0-32(%r9),%xmm3
25	vpaddb	%xmm2,%xmm14,%xmm1
26	vpxor	%xmm15,%xmm10,%xmm10
27	vpxor	%xmm15,%xmm11,%xmm11
28
29L$resume_ctr32:
30	vmovdqu	%xmm1,(%r8)
31	vpclmulqdq	$0x10,%xmm3,%xmm7,%xmm5
32	vpxor	%xmm15,%xmm12,%xmm12
33	vmovups	16-128(%rcx),%xmm2
34	vpclmulqdq	$0x01,%xmm3,%xmm7,%xmm6
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52	xorq	%r12,%r12
53	cmpq	%r14,%r15
54
55	vaesenc	%xmm2,%xmm9,%xmm9
56	vmovdqu	48+8(%rsp),%xmm0
57	vpxor	%xmm15,%xmm13,%xmm13
58	vpclmulqdq	$0x00,%xmm3,%xmm7,%xmm1
59	vaesenc	%xmm2,%xmm10,%xmm10
60	vpxor	%xmm15,%xmm14,%xmm14
61	setnc	%r12b
62	vpclmulqdq	$0x11,%xmm3,%xmm7,%xmm7
63	vaesenc	%xmm2,%xmm11,%xmm11
64	vmovdqu	16-32(%r9),%xmm3
65	negq	%r12
66	vaesenc	%xmm2,%xmm12,%xmm12
67	vpxor	%xmm5,%xmm6,%xmm6
68	vpclmulqdq	$0x00,%xmm3,%xmm0,%xmm5
69	vpxor	%xmm4,%xmm8,%xmm8
70	vaesenc	%xmm2,%xmm13,%xmm13
71	vpxor	%xmm5,%xmm1,%xmm4
72	andq	$0x60,%r12
73	vmovups	32-128(%rcx),%xmm15
74	vpclmulqdq	$0x10,%xmm3,%xmm0,%xmm1
75	vaesenc	%xmm2,%xmm14,%xmm14
76
77	vpclmulqdq	$0x01,%xmm3,%xmm0,%xmm2
78	leaq	(%r14,%r12,1),%r14
79	vaesenc	%xmm15,%xmm9,%xmm9
80	vpxor	16+8(%rsp),%xmm8,%xmm8
81	vpclmulqdq	$0x11,%xmm3,%xmm0,%xmm3
82	vmovdqu	64+8(%rsp),%xmm0
83	vaesenc	%xmm15,%xmm10,%xmm10
84	movbeq	88(%r14),%r13
85	vaesenc	%xmm15,%xmm11,%xmm11
86	movbeq	80(%r14),%r12
87	vaesenc	%xmm15,%xmm12,%xmm12
88	movq	%r13,32+8(%rsp)
89	vaesenc	%xmm15,%xmm13,%xmm13
90	movq	%r12,40+8(%rsp)
91	vmovdqu	48-32(%r9),%xmm5
92	vaesenc	%xmm15,%xmm14,%xmm14
93
94	vmovups	48-128(%rcx),%xmm15
95	vpxor	%xmm1,%xmm6,%xmm6
96	vpclmulqdq	$0x00,%xmm5,%xmm0,%xmm1
97	vaesenc	%xmm15,%xmm9,%xmm9
98	vpxor	%xmm2,%xmm6,%xmm6
99	vpclmulqdq	$0x10,%xmm5,%xmm0,%xmm2
100	vaesenc	%xmm15,%xmm10,%xmm10
101	vpxor	%xmm3,%xmm7,%xmm7
102	vpclmulqdq	$0x01,%xmm5,%xmm0,%xmm3
103	vaesenc	%xmm15,%xmm11,%xmm11
104	vpclmulqdq	$0x11,%xmm5,%xmm0,%xmm5
105	vmovdqu	80+8(%rsp),%xmm0
106	vaesenc	%xmm15,%xmm12,%xmm12
107	vaesenc	%xmm15,%xmm13,%xmm13
108	vpxor	%xmm1,%xmm4,%xmm4
109	vmovdqu	64-32(%r9),%xmm1
110	vaesenc	%xmm15,%xmm14,%xmm14
111
112	vmovups	64-128(%rcx),%xmm15
113	vpxor	%xmm2,%xmm6,%xmm6
114	vpclmulqdq	$0x00,%xmm1,%xmm0,%xmm2
115	vaesenc	%xmm15,%xmm9,%xmm9
116	vpxor	%xmm3,%xmm6,%xmm6
117	vpclmulqdq	$0x10,%xmm1,%xmm0,%xmm3
118	vaesenc	%xmm15,%xmm10,%xmm10
119	movbeq	72(%r14),%r13
120	vpxor	%xmm5,%xmm7,%xmm7
121	vpclmulqdq	$0x01,%xmm1,%xmm0,%xmm5
122	vaesenc	%xmm15,%xmm11,%xmm11
123	movbeq	64(%r14),%r12
124	vpclmulqdq	$0x11,%xmm1,%xmm0,%xmm1
125	vmovdqu	96+8(%rsp),%xmm0
126	vaesenc	%xmm15,%xmm12,%xmm12
127	movq	%r13,48+8(%rsp)
128	vaesenc	%xmm15,%xmm13,%xmm13
129	movq	%r12,56+8(%rsp)
130	vpxor	%xmm2,%xmm4,%xmm4
131	vmovdqu	96-32(%r9),%xmm2
132	vaesenc	%xmm15,%xmm14,%xmm14
133
134	vmovups	80-128(%rcx),%xmm15
135	vpxor	%xmm3,%xmm6,%xmm6
136	vpclmulqdq	$0x00,%xmm2,%xmm0,%xmm3
137	vaesenc	%xmm15,%xmm9,%xmm9
138	vpxor	%xmm5,%xmm6,%xmm6
139	vpclmulqdq	$0x10,%xmm2,%xmm0,%xmm5
140	vaesenc	%xmm15,%xmm10,%xmm10
141	movbeq	56(%r14),%r13
142	vpxor	%xmm1,%xmm7,%xmm7
143	vpclmulqdq	$0x01,%xmm2,%xmm0,%xmm1
144	vpxor	112+8(%rsp),%xmm8,%xmm8
145	vaesenc	%xmm15,%xmm11,%xmm11
146	movbeq	48(%r14),%r12
147	vpclmulqdq	$0x11,%xmm2,%xmm0,%xmm2
148	vaesenc	%xmm15,%xmm12,%xmm12
149	movq	%r13,64+8(%rsp)
150	vaesenc	%xmm15,%xmm13,%xmm13
151	movq	%r12,72+8(%rsp)
152	vpxor	%xmm3,%xmm4,%xmm4
153	vmovdqu	112-32(%r9),%xmm3
154	vaesenc	%xmm15,%xmm14,%xmm14
155
156	vmovups	96-128(%rcx),%xmm15
157	vpxor	%xmm5,%xmm6,%xmm6
158	vpclmulqdq	$0x10,%xmm3,%xmm8,%xmm5
159	vaesenc	%xmm15,%xmm9,%xmm9
160	vpxor	%xmm1,%xmm6,%xmm6
161	vpclmulqdq	$0x01,%xmm3,%xmm8,%xmm1
162	vaesenc	%xmm15,%xmm10,%xmm10
163	movbeq	40(%r14),%r13
164	vpxor	%xmm2,%xmm7,%xmm7
165	vpclmulqdq	$0x00,%xmm3,%xmm8,%xmm2
166	vaesenc	%xmm15,%xmm11,%xmm11
167	movbeq	32(%r14),%r12
168	vpclmulqdq	$0x11,%xmm3,%xmm8,%xmm8
169	vaesenc	%xmm15,%xmm12,%xmm12
170	movq	%r13,80+8(%rsp)
171	vaesenc	%xmm15,%xmm13,%xmm13
172	movq	%r12,88+8(%rsp)
173	vpxor	%xmm5,%xmm6,%xmm6
174	vaesenc	%xmm15,%xmm14,%xmm14
175	vpxor	%xmm1,%xmm6,%xmm6
176
177	vmovups	112-128(%rcx),%xmm15
178	vpslldq	$8,%xmm6,%xmm5
179	vpxor	%xmm2,%xmm4,%xmm4
180	vmovdqu	16(%r11),%xmm3
181
182	vaesenc	%xmm15,%xmm9,%xmm9
183	vpxor	%xmm8,%xmm7,%xmm7
184	vaesenc	%xmm15,%xmm10,%xmm10
185	vpxor	%xmm5,%xmm4,%xmm4
186	movbeq	24(%r14),%r13
187	vaesenc	%xmm15,%xmm11,%xmm11
188	movbeq	16(%r14),%r12
189	vpalignr	$8,%xmm4,%xmm4,%xmm0
190	vpclmulqdq	$0x10,%xmm3,%xmm4,%xmm4
191	movq	%r13,96+8(%rsp)
192	vaesenc	%xmm15,%xmm12,%xmm12
193	movq	%r12,104+8(%rsp)
194	vaesenc	%xmm15,%xmm13,%xmm13
195	vmovups	128-128(%rcx),%xmm1
196	vaesenc	%xmm15,%xmm14,%xmm14
197
198	vaesenc	%xmm1,%xmm9,%xmm9
199	vmovups	144-128(%rcx),%xmm15
200	vaesenc	%xmm1,%xmm10,%xmm10
201	vpsrldq	$8,%xmm6,%xmm6
202	vaesenc	%xmm1,%xmm11,%xmm11
203	vpxor	%xmm6,%xmm7,%xmm7
204	vaesenc	%xmm1,%xmm12,%xmm12
205	vpxor	%xmm0,%xmm4,%xmm4
206	movbeq	8(%r14),%r13
207	vaesenc	%xmm1,%xmm13,%xmm13
208	movbeq	0(%r14),%r12
209	vaesenc	%xmm1,%xmm14,%xmm14
210	vmovups	160-128(%rcx),%xmm1
211	cmpl	$11,%ebp
212	jb	L$enc_tail
213
214	vaesenc	%xmm15,%xmm9,%xmm9
215	vaesenc	%xmm15,%xmm10,%xmm10
216	vaesenc	%xmm15,%xmm11,%xmm11
217	vaesenc	%xmm15,%xmm12,%xmm12
218	vaesenc	%xmm15,%xmm13,%xmm13
219	vaesenc	%xmm15,%xmm14,%xmm14
220
221	vaesenc	%xmm1,%xmm9,%xmm9
222	vaesenc	%xmm1,%xmm10,%xmm10
223	vaesenc	%xmm1,%xmm11,%xmm11
224	vaesenc	%xmm1,%xmm12,%xmm12
225	vaesenc	%xmm1,%xmm13,%xmm13
226	vmovups	176-128(%rcx),%xmm15
227	vaesenc	%xmm1,%xmm14,%xmm14
228	vmovups	192-128(%rcx),%xmm1
229	je	L$enc_tail
230
231	vaesenc	%xmm15,%xmm9,%xmm9
232	vaesenc	%xmm15,%xmm10,%xmm10
233	vaesenc	%xmm15,%xmm11,%xmm11
234	vaesenc	%xmm15,%xmm12,%xmm12
235	vaesenc	%xmm15,%xmm13,%xmm13
236	vaesenc	%xmm15,%xmm14,%xmm14
237
238	vaesenc	%xmm1,%xmm9,%xmm9
239	vaesenc	%xmm1,%xmm10,%xmm10
240	vaesenc	%xmm1,%xmm11,%xmm11
241	vaesenc	%xmm1,%xmm12,%xmm12
242	vaesenc	%xmm1,%xmm13,%xmm13
243	vmovups	208-128(%rcx),%xmm15
244	vaesenc	%xmm1,%xmm14,%xmm14
245	vmovups	224-128(%rcx),%xmm1
246	jmp	L$enc_tail
247
248.p2align	5
249L$handle_ctr32:
250	vmovdqu	(%r11),%xmm0
251	vpshufb	%xmm0,%xmm1,%xmm6
252	vmovdqu	48(%r11),%xmm5
253	vpaddd	64(%r11),%xmm6,%xmm10
254	vpaddd	%xmm5,%xmm6,%xmm11
255	vmovdqu	0-32(%r9),%xmm3
256	vpaddd	%xmm5,%xmm10,%xmm12
257	vpshufb	%xmm0,%xmm10,%xmm10
258	vpaddd	%xmm5,%xmm11,%xmm13
259	vpshufb	%xmm0,%xmm11,%xmm11
260	vpxor	%xmm15,%xmm10,%xmm10
261	vpaddd	%xmm5,%xmm12,%xmm14
262	vpshufb	%xmm0,%xmm12,%xmm12
263	vpxor	%xmm15,%xmm11,%xmm11
264	vpaddd	%xmm5,%xmm13,%xmm1
265	vpshufb	%xmm0,%xmm13,%xmm13
266	vpshufb	%xmm0,%xmm14,%xmm14
267	vpshufb	%xmm0,%xmm1,%xmm1
268	jmp	L$resume_ctr32
269
270.p2align	5
271L$enc_tail:
272	vaesenc	%xmm15,%xmm9,%xmm9
273	vmovdqu	%xmm7,16+8(%rsp)
274	vpalignr	$8,%xmm4,%xmm4,%xmm8
275	vaesenc	%xmm15,%xmm10,%xmm10
276	vpclmulqdq	$0x10,%xmm3,%xmm4,%xmm4
277	vpxor	0(%rdi),%xmm1,%xmm2
278	vaesenc	%xmm15,%xmm11,%xmm11
279	vpxor	16(%rdi),%xmm1,%xmm0
280	vaesenc	%xmm15,%xmm12,%xmm12
281	vpxor	32(%rdi),%xmm1,%xmm5
282	vaesenc	%xmm15,%xmm13,%xmm13
283	vpxor	48(%rdi),%xmm1,%xmm6
284	vaesenc	%xmm15,%xmm14,%xmm14
285	vpxor	64(%rdi),%xmm1,%xmm7
286	vpxor	80(%rdi),%xmm1,%xmm3
287	vmovdqu	(%r8),%xmm1
288
289	vaesenclast	%xmm2,%xmm9,%xmm9
290	vmovdqu	32(%r11),%xmm2
291	vaesenclast	%xmm0,%xmm10,%xmm10
292	vpaddb	%xmm2,%xmm1,%xmm0
293	movq	%r13,112+8(%rsp)
294	leaq	96(%rdi),%rdi
295	vaesenclast	%xmm5,%xmm11,%xmm11
296	vpaddb	%xmm2,%xmm0,%xmm5
297	movq	%r12,120+8(%rsp)
298	leaq	96(%rsi),%rsi
299	vmovdqu	0-128(%rcx),%xmm15
300	vaesenclast	%xmm6,%xmm12,%xmm12
301	vpaddb	%xmm2,%xmm5,%xmm6
302	vaesenclast	%xmm7,%xmm13,%xmm13
303	vpaddb	%xmm2,%xmm6,%xmm7
304	vaesenclast	%xmm3,%xmm14,%xmm14
305	vpaddb	%xmm2,%xmm7,%xmm3
306
307	addq	$0x60,%r10
308	subq	$0x6,%rdx
309	jc	L$6x_done
310
311	vmovups	%xmm9,-96(%rsi)
312	vpxor	%xmm15,%xmm1,%xmm9
313	vmovups	%xmm10,-80(%rsi)
314	vmovdqa	%xmm0,%xmm10
315	vmovups	%xmm11,-64(%rsi)
316	vmovdqa	%xmm5,%xmm11
317	vmovups	%xmm12,-48(%rsi)
318	vmovdqa	%xmm6,%xmm12
319	vmovups	%xmm13,-32(%rsi)
320	vmovdqa	%xmm7,%xmm13
321	vmovups	%xmm14,-16(%rsi)
322	vmovdqa	%xmm3,%xmm14
323	vmovdqu	32+8(%rsp),%xmm7
324	jmp	L$oop6x
325
326L$6x_done:
327	vpxor	16+8(%rsp),%xmm8,%xmm8
328	vpxor	%xmm4,%xmm8,%xmm8
329
330	.byte	0xf3,0xc3
331
332.globl	_aesni_gcm_decrypt
333.private_extern _aesni_gcm_decrypt
334
335.p2align	5
336_aesni_gcm_decrypt:
337	xorq	%r10,%r10
338
339
340
341	cmpq	$0x60,%rdx
342	jb	L$gcm_dec_abort
343
344	leaq	(%rsp),%rax
345	pushq	%rbx
346	pushq	%rbp
347	pushq	%r12
348	pushq	%r13
349	pushq	%r14
350	pushq	%r15
351	vzeroupper
352
353	vmovdqu	(%r8),%xmm1
354	addq	$-128,%rsp
355	movl	12(%r8),%ebx
356	leaq	L$bswap_mask(%rip),%r11
357	leaq	-128(%rcx),%r14
358	movq	$0xf80,%r15
359	vmovdqu	(%r9),%xmm8
360	andq	$-128,%rsp
361	vmovdqu	(%r11),%xmm0
362	leaq	128(%rcx),%rcx
363	leaq	32+32(%r9),%r9
364	movl	240-128(%rcx),%ebp
365	vpshufb	%xmm0,%xmm8,%xmm8
366
367	andq	%r15,%r14
368	andq	%rsp,%r15
369	subq	%r14,%r15
370	jc	L$dec_no_key_aliasing
371	cmpq	$768,%r15
372	jnc	L$dec_no_key_aliasing
373	subq	%r15,%rsp
374L$dec_no_key_aliasing:
375
376	vmovdqu	80(%rdi),%xmm7
377	leaq	(%rdi),%r14
378	vmovdqu	64(%rdi),%xmm4
379
380
381
382
383
384
385
386	leaq	-192(%rdi,%rdx,1),%r15
387
388	vmovdqu	48(%rdi),%xmm5
389	shrq	$4,%rdx
390	xorq	%r10,%r10
391	vmovdqu	32(%rdi),%xmm6
392	vpshufb	%xmm0,%xmm7,%xmm7
393	vmovdqu	16(%rdi),%xmm2
394	vpshufb	%xmm0,%xmm4,%xmm4
395	vmovdqu	(%rdi),%xmm3
396	vpshufb	%xmm0,%xmm5,%xmm5
397	vmovdqu	%xmm4,48(%rsp)
398	vpshufb	%xmm0,%xmm6,%xmm6
399	vmovdqu	%xmm5,64(%rsp)
400	vpshufb	%xmm0,%xmm2,%xmm2
401	vmovdqu	%xmm6,80(%rsp)
402	vpshufb	%xmm0,%xmm3,%xmm3
403	vmovdqu	%xmm2,96(%rsp)
404	vmovdqu	%xmm3,112(%rsp)
405
406	call	_aesni_ctr32_ghash_6x
407
408	vmovups	%xmm9,-96(%rsi)
409	vmovups	%xmm10,-80(%rsi)
410	vmovups	%xmm11,-64(%rsi)
411	vmovups	%xmm12,-48(%rsi)
412	vmovups	%xmm13,-32(%rsi)
413	vmovups	%xmm14,-16(%rsi)
414
415	vpshufb	(%r11),%xmm8,%xmm8
416	vmovdqu	%xmm8,-64(%r9)
417
418	vzeroupper
419	movq	-48(%rax),%r15
420	movq	-40(%rax),%r14
421	movq	-32(%rax),%r13
422	movq	-24(%rax),%r12
423	movq	-16(%rax),%rbp
424	movq	-8(%rax),%rbx
425	leaq	(%rax),%rsp
426L$gcm_dec_abort:
427	movq	%r10,%rax
428	.byte	0xf3,0xc3
429
430
431.p2align	5
432_aesni_ctr32_6x:
433	vmovdqu	0-128(%rcx),%xmm4
434	vmovdqu	32(%r11),%xmm2
435	leaq	-1(%rbp),%r13
436	vmovups	16-128(%rcx),%xmm15
437	leaq	32-128(%rcx),%r12
438	vpxor	%xmm4,%xmm1,%xmm9
439	addl	$100663296,%ebx
440	jc	L$handle_ctr32_2
441	vpaddb	%xmm2,%xmm1,%xmm10
442	vpaddb	%xmm2,%xmm10,%xmm11
443	vpxor	%xmm4,%xmm10,%xmm10
444	vpaddb	%xmm2,%xmm11,%xmm12
445	vpxor	%xmm4,%xmm11,%xmm11
446	vpaddb	%xmm2,%xmm12,%xmm13
447	vpxor	%xmm4,%xmm12,%xmm12
448	vpaddb	%xmm2,%xmm13,%xmm14
449	vpxor	%xmm4,%xmm13,%xmm13
450	vpaddb	%xmm2,%xmm14,%xmm1
451	vpxor	%xmm4,%xmm14,%xmm14
452	jmp	L$oop_ctr32
453
454.p2align	4
455L$oop_ctr32:
456	vaesenc	%xmm15,%xmm9,%xmm9
457	vaesenc	%xmm15,%xmm10,%xmm10
458	vaesenc	%xmm15,%xmm11,%xmm11
459	vaesenc	%xmm15,%xmm12,%xmm12
460	vaesenc	%xmm15,%xmm13,%xmm13
461	vaesenc	%xmm15,%xmm14,%xmm14
462	vmovups	(%r12),%xmm15
463	leaq	16(%r12),%r12
464	decl	%r13d
465	jnz	L$oop_ctr32
466
467	vmovdqu	(%r12),%xmm3
468	vaesenc	%xmm15,%xmm9,%xmm9
469	vpxor	0(%rdi),%xmm3,%xmm4
470	vaesenc	%xmm15,%xmm10,%xmm10
471	vpxor	16(%rdi),%xmm3,%xmm5
472	vaesenc	%xmm15,%xmm11,%xmm11
473	vpxor	32(%rdi),%xmm3,%xmm6
474	vaesenc	%xmm15,%xmm12,%xmm12
475	vpxor	48(%rdi),%xmm3,%xmm8
476	vaesenc	%xmm15,%xmm13,%xmm13
477	vpxor	64(%rdi),%xmm3,%xmm2
478	vaesenc	%xmm15,%xmm14,%xmm14
479	vpxor	80(%rdi),%xmm3,%xmm3
480	leaq	96(%rdi),%rdi
481
482	vaesenclast	%xmm4,%xmm9,%xmm9
483	vaesenclast	%xmm5,%xmm10,%xmm10
484	vaesenclast	%xmm6,%xmm11,%xmm11
485	vaesenclast	%xmm8,%xmm12,%xmm12
486	vaesenclast	%xmm2,%xmm13,%xmm13
487	vaesenclast	%xmm3,%xmm14,%xmm14
488	vmovups	%xmm9,0(%rsi)
489	vmovups	%xmm10,16(%rsi)
490	vmovups	%xmm11,32(%rsi)
491	vmovups	%xmm12,48(%rsi)
492	vmovups	%xmm13,64(%rsi)
493	vmovups	%xmm14,80(%rsi)
494	leaq	96(%rsi),%rsi
495
496	.byte	0xf3,0xc3
497.p2align	5
498L$handle_ctr32_2:
499	vpshufb	%xmm0,%xmm1,%xmm6
500	vmovdqu	48(%r11),%xmm5
501	vpaddd	64(%r11),%xmm6,%xmm10
502	vpaddd	%xmm5,%xmm6,%xmm11
503	vpaddd	%xmm5,%xmm10,%xmm12
504	vpshufb	%xmm0,%xmm10,%xmm10
505	vpaddd	%xmm5,%xmm11,%xmm13
506	vpshufb	%xmm0,%xmm11,%xmm11
507	vpxor	%xmm4,%xmm10,%xmm10
508	vpaddd	%xmm5,%xmm12,%xmm14
509	vpshufb	%xmm0,%xmm12,%xmm12
510	vpxor	%xmm4,%xmm11,%xmm11
511	vpaddd	%xmm5,%xmm13,%xmm1
512	vpshufb	%xmm0,%xmm13,%xmm13
513	vpxor	%xmm4,%xmm12,%xmm12
514	vpshufb	%xmm0,%xmm14,%xmm14
515	vpxor	%xmm4,%xmm13,%xmm13
516	vpshufb	%xmm0,%xmm1,%xmm1
517	vpxor	%xmm4,%xmm14,%xmm14
518	jmp	L$oop_ctr32
519
520
521.globl	_aesni_gcm_encrypt
522.private_extern _aesni_gcm_encrypt
523
524.p2align	5
525_aesni_gcm_encrypt:
526	xorq	%r10,%r10
527
528
529
530
531	cmpq	$288,%rdx
532	jb	L$gcm_enc_abort
533
534	leaq	(%rsp),%rax
535	pushq	%rbx
536	pushq	%rbp
537	pushq	%r12
538	pushq	%r13
539	pushq	%r14
540	pushq	%r15
541	vzeroupper
542
543	vmovdqu	(%r8),%xmm1
544	addq	$-128,%rsp
545	movl	12(%r8),%ebx
546	leaq	L$bswap_mask(%rip),%r11
547	leaq	-128(%rcx),%r14
548	movq	$0xf80,%r15
549	leaq	128(%rcx),%rcx
550	vmovdqu	(%r11),%xmm0
551	andq	$-128,%rsp
552	movl	240-128(%rcx),%ebp
553
554	andq	%r15,%r14
555	andq	%rsp,%r15
556	subq	%r14,%r15
557	jc	L$enc_no_key_aliasing
558	cmpq	$768,%r15
559	jnc	L$enc_no_key_aliasing
560	subq	%r15,%rsp
561L$enc_no_key_aliasing:
562
563	leaq	(%rsi),%r14
564
565
566
567
568
569
570
571
572	leaq	-192(%rsi,%rdx,1),%r15
573
574	shrq	$4,%rdx
575
576	call	_aesni_ctr32_6x
577	vpshufb	%xmm0,%xmm9,%xmm8
578	vpshufb	%xmm0,%xmm10,%xmm2
579	vmovdqu	%xmm8,112(%rsp)
580	vpshufb	%xmm0,%xmm11,%xmm4
581	vmovdqu	%xmm2,96(%rsp)
582	vpshufb	%xmm0,%xmm12,%xmm5
583	vmovdqu	%xmm4,80(%rsp)
584	vpshufb	%xmm0,%xmm13,%xmm6
585	vmovdqu	%xmm5,64(%rsp)
586	vpshufb	%xmm0,%xmm14,%xmm7
587	vmovdqu	%xmm6,48(%rsp)
588
589	call	_aesni_ctr32_6x
590
591	vmovdqu	(%r9),%xmm8
592	leaq	32+32(%r9),%r9
593	subq	$12,%rdx
594	movq	$192,%r10
595	vpshufb	%xmm0,%xmm8,%xmm8
596
597	call	_aesni_ctr32_ghash_6x
598	vmovdqu	32(%rsp),%xmm7
599	vmovdqu	(%r11),%xmm0
600	vmovdqu	0-32(%r9),%xmm3
601	vpunpckhqdq	%xmm7,%xmm7,%xmm1
602	vmovdqu	32-32(%r9),%xmm15
603	vmovups	%xmm9,-96(%rsi)
604	vpshufb	%xmm0,%xmm9,%xmm9
605	vpxor	%xmm7,%xmm1,%xmm1
606	vmovups	%xmm10,-80(%rsi)
607	vpshufb	%xmm0,%xmm10,%xmm10
608	vmovups	%xmm11,-64(%rsi)
609	vpshufb	%xmm0,%xmm11,%xmm11
610	vmovups	%xmm12,-48(%rsi)
611	vpshufb	%xmm0,%xmm12,%xmm12
612	vmovups	%xmm13,-32(%rsi)
613	vpshufb	%xmm0,%xmm13,%xmm13
614	vmovups	%xmm14,-16(%rsi)
615	vpshufb	%xmm0,%xmm14,%xmm14
616	vmovdqu	%xmm9,16(%rsp)
617	vmovdqu	48(%rsp),%xmm6
618	vmovdqu	16-32(%r9),%xmm0
619	vpunpckhqdq	%xmm6,%xmm6,%xmm2
620	vpclmulqdq	$0x00,%xmm3,%xmm7,%xmm5
621	vpxor	%xmm6,%xmm2,%xmm2
622	vpclmulqdq	$0x11,%xmm3,%xmm7,%xmm7
623	vpclmulqdq	$0x00,%xmm15,%xmm1,%xmm1
624
625	vmovdqu	64(%rsp),%xmm9
626	vpclmulqdq	$0x00,%xmm0,%xmm6,%xmm4
627	vmovdqu	48-32(%r9),%xmm3
628	vpxor	%xmm5,%xmm4,%xmm4
629	vpunpckhqdq	%xmm9,%xmm9,%xmm5
630	vpclmulqdq	$0x11,%xmm0,%xmm6,%xmm6
631	vpxor	%xmm9,%xmm5,%xmm5
632	vpxor	%xmm7,%xmm6,%xmm6
633	vpclmulqdq	$0x10,%xmm15,%xmm2,%xmm2
634	vmovdqu	80-32(%r9),%xmm15
635	vpxor	%xmm1,%xmm2,%xmm2
636
637	vmovdqu	80(%rsp),%xmm1
638	vpclmulqdq	$0x00,%xmm3,%xmm9,%xmm7
639	vmovdqu	64-32(%r9),%xmm0
640	vpxor	%xmm4,%xmm7,%xmm7
641	vpunpckhqdq	%xmm1,%xmm1,%xmm4
642	vpclmulqdq	$0x11,%xmm3,%xmm9,%xmm9
643	vpxor	%xmm1,%xmm4,%xmm4
644	vpxor	%xmm6,%xmm9,%xmm9
645	vpclmulqdq	$0x00,%xmm15,%xmm5,%xmm5
646	vpxor	%xmm2,%xmm5,%xmm5
647
648	vmovdqu	96(%rsp),%xmm2
649	vpclmulqdq	$0x00,%xmm0,%xmm1,%xmm6
650	vmovdqu	96-32(%r9),%xmm3
651	vpxor	%xmm7,%xmm6,%xmm6
652	vpunpckhqdq	%xmm2,%xmm2,%xmm7
653	vpclmulqdq	$0x11,%xmm0,%xmm1,%xmm1
654	vpxor	%xmm2,%xmm7,%xmm7
655	vpxor	%xmm9,%xmm1,%xmm1
656	vpclmulqdq	$0x10,%xmm15,%xmm4,%xmm4
657	vmovdqu	128-32(%r9),%xmm15
658	vpxor	%xmm5,%xmm4,%xmm4
659
660	vpxor	112(%rsp),%xmm8,%xmm8
661	vpclmulqdq	$0x00,%xmm3,%xmm2,%xmm5
662	vmovdqu	112-32(%r9),%xmm0
663	vpunpckhqdq	%xmm8,%xmm8,%xmm9
664	vpxor	%xmm6,%xmm5,%xmm5
665	vpclmulqdq	$0x11,%xmm3,%xmm2,%xmm2
666	vpxor	%xmm8,%xmm9,%xmm9
667	vpxor	%xmm1,%xmm2,%xmm2
668	vpclmulqdq	$0x00,%xmm15,%xmm7,%xmm7
669	vpxor	%xmm4,%xmm7,%xmm4
670
671	vpclmulqdq	$0x00,%xmm0,%xmm8,%xmm6
672	vmovdqu	0-32(%r9),%xmm3
673	vpunpckhqdq	%xmm14,%xmm14,%xmm1
674	vpclmulqdq	$0x11,%xmm0,%xmm8,%xmm8
675	vpxor	%xmm14,%xmm1,%xmm1
676	vpxor	%xmm5,%xmm6,%xmm5
677	vpclmulqdq	$0x10,%xmm15,%xmm9,%xmm9
678	vmovdqu	32-32(%r9),%xmm15
679	vpxor	%xmm2,%xmm8,%xmm7
680	vpxor	%xmm4,%xmm9,%xmm6
681
682	vmovdqu	16-32(%r9),%xmm0
683	vpxor	%xmm5,%xmm7,%xmm9
684	vpclmulqdq	$0x00,%xmm3,%xmm14,%xmm4
685	vpxor	%xmm9,%xmm6,%xmm6
686	vpunpckhqdq	%xmm13,%xmm13,%xmm2
687	vpclmulqdq	$0x11,%xmm3,%xmm14,%xmm14
688	vpxor	%xmm13,%xmm2,%xmm2
689	vpslldq	$8,%xmm6,%xmm9
690	vpclmulqdq	$0x00,%xmm15,%xmm1,%xmm1
691	vpxor	%xmm9,%xmm5,%xmm8
692	vpsrldq	$8,%xmm6,%xmm6
693	vpxor	%xmm6,%xmm7,%xmm7
694
695	vpclmulqdq	$0x00,%xmm0,%xmm13,%xmm5
696	vmovdqu	48-32(%r9),%xmm3
697	vpxor	%xmm4,%xmm5,%xmm5
698	vpunpckhqdq	%xmm12,%xmm12,%xmm9
699	vpclmulqdq	$0x11,%xmm0,%xmm13,%xmm13
700	vpxor	%xmm12,%xmm9,%xmm9
701	vpxor	%xmm14,%xmm13,%xmm13
702	vpalignr	$8,%xmm8,%xmm8,%xmm14
703	vpclmulqdq	$0x10,%xmm15,%xmm2,%xmm2
704	vmovdqu	80-32(%r9),%xmm15
705	vpxor	%xmm1,%xmm2,%xmm2
706
707	vpclmulqdq	$0x00,%xmm3,%xmm12,%xmm4
708	vmovdqu	64-32(%r9),%xmm0
709	vpxor	%xmm5,%xmm4,%xmm4
710	vpunpckhqdq	%xmm11,%xmm11,%xmm1
711	vpclmulqdq	$0x11,%xmm3,%xmm12,%xmm12
712	vpxor	%xmm11,%xmm1,%xmm1
713	vpxor	%xmm13,%xmm12,%xmm12
714	vxorps	16(%rsp),%xmm7,%xmm7
715	vpclmulqdq	$0x00,%xmm15,%xmm9,%xmm9
716	vpxor	%xmm2,%xmm9,%xmm9
717
718	vpclmulqdq	$0x10,16(%r11),%xmm8,%xmm8
719	vxorps	%xmm14,%xmm8,%xmm8
720
721	vpclmulqdq	$0x00,%xmm0,%xmm11,%xmm5
722	vmovdqu	96-32(%r9),%xmm3
723	vpxor	%xmm4,%xmm5,%xmm5
724	vpunpckhqdq	%xmm10,%xmm10,%xmm2
725	vpclmulqdq	$0x11,%xmm0,%xmm11,%xmm11
726	vpxor	%xmm10,%xmm2,%xmm2
727	vpalignr	$8,%xmm8,%xmm8,%xmm14
728	vpxor	%xmm12,%xmm11,%xmm11
729	vpclmulqdq	$0x10,%xmm15,%xmm1,%xmm1
730	vmovdqu	128-32(%r9),%xmm15
731	vpxor	%xmm9,%xmm1,%xmm1
732
733	vxorps	%xmm7,%xmm14,%xmm14
734	vpclmulqdq	$0x10,16(%r11),%xmm8,%xmm8
735	vxorps	%xmm14,%xmm8,%xmm8
736
737	vpclmulqdq	$0x00,%xmm3,%xmm10,%xmm4
738	vmovdqu	112-32(%r9),%xmm0
739	vpxor	%xmm5,%xmm4,%xmm4
740	vpunpckhqdq	%xmm8,%xmm8,%xmm9
741	vpclmulqdq	$0x11,%xmm3,%xmm10,%xmm10
742	vpxor	%xmm8,%xmm9,%xmm9
743	vpxor	%xmm11,%xmm10,%xmm10
744	vpclmulqdq	$0x00,%xmm15,%xmm2,%xmm2
745	vpxor	%xmm1,%xmm2,%xmm2
746
747	vpclmulqdq	$0x00,%xmm0,%xmm8,%xmm5
748	vpclmulqdq	$0x11,%xmm0,%xmm8,%xmm7
749	vpxor	%xmm4,%xmm5,%xmm5
750	vpclmulqdq	$0x10,%xmm15,%xmm9,%xmm6
751	vpxor	%xmm10,%xmm7,%xmm7
752	vpxor	%xmm2,%xmm6,%xmm6
753
754	vpxor	%xmm5,%xmm7,%xmm4
755	vpxor	%xmm4,%xmm6,%xmm6
756	vpslldq	$8,%xmm6,%xmm1
757	vmovdqu	16(%r11),%xmm3
758	vpsrldq	$8,%xmm6,%xmm6
759	vpxor	%xmm1,%xmm5,%xmm8
760	vpxor	%xmm6,%xmm7,%xmm7
761
762	vpalignr	$8,%xmm8,%xmm8,%xmm2
763	vpclmulqdq	$0x10,%xmm3,%xmm8,%xmm8
764	vpxor	%xmm2,%xmm8,%xmm8
765
766	vpalignr	$8,%xmm8,%xmm8,%xmm2
767	vpclmulqdq	$0x10,%xmm3,%xmm8,%xmm8
768	vpxor	%xmm7,%xmm2,%xmm2
769	vpxor	%xmm2,%xmm8,%xmm8
770	vpshufb	(%r11),%xmm8,%xmm8
771	vmovdqu	%xmm8,-64(%r9)
772
773	vzeroupper
774	movq	-48(%rax),%r15
775	movq	-40(%rax),%r14
776	movq	-32(%rax),%r13
777	movq	-24(%rax),%r12
778	movq	-16(%rax),%rbp
779	movq	-8(%rax),%rbx
780	leaq	(%rax),%rsp
781L$gcm_enc_abort:
782	movq	%r10,%rax
783	.byte	0xf3,0xc3
784
785.p2align	6
786L$bswap_mask:
787.byte	15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
788L$poly:
789.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2
790L$one_msb:
791.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
792L$two_lsb:
793.byte	2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
794L$one_lsb:
795.byte	1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
796.byte	65,69,83,45,78,73,32,71,67,77,32,109,111,100,117,108,101,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
797.p2align	6
798#endif
799