xref: /linux/arch/x86/crypto/aesni-intel_asm.S (revision e0bf6c5ca2d3281f231c5f0c9bf145e9513644de)
1/*
2 * Implement AES algorithm in Intel AES-NI instructions.
3 *
4 * The white paper of AES-NI instructions can be downloaded from:
5 *   http://softwarecommunity.intel.com/isn/downloads/intelavx/AES-Instructions-Set_WP.pdf
6 *
7 * Copyright (C) 2008, Intel Corp.
8 *    Author: Huang Ying <ying.huang@intel.com>
9 *            Vinodh Gopal <vinodh.gopal@intel.com>
10 *            Kahraman Akdemir
11 *
12 * Added RFC4106 AES-GCM support for 128-bit keys under the AEAD
13 * interface for 64-bit kernels.
14 *    Authors: Erdinc Ozturk (erdinc.ozturk@intel.com)
15 *             Aidan O'Mahony (aidan.o.mahony@intel.com)
16 *             Adrian Hoban <adrian.hoban@intel.com>
17 *             James Guilford (james.guilford@intel.com)
18 *             Gabriele Paoloni <gabriele.paoloni@intel.com>
19 *             Tadeusz Struk (tadeusz.struk@intel.com)
20 *             Wajdi Feghali (wajdi.k.feghali@intel.com)
21 *    Copyright (c) 2010, Intel Corporation.
22 *
23 * Ported x86_64 version to x86:
24 *    Author: Mathias Krause <minipli@googlemail.com>
25 *
26 * This program is free software; you can redistribute it and/or modify
27 * it under the terms of the GNU General Public License as published by
28 * the Free Software Foundation; either version 2 of the License, or
29 * (at your option) any later version.
30 */
31
32#include <linux/linkage.h>
33#include <asm/inst.h>
34
35/*
36 * The following macros are used to move an (un)aligned 16 byte value to/from
37 * an XMM register.  This can done for either FP or integer values, for FP use
38 * movaps (move aligned packed single) or integer use movdqa (move double quad
39 * aligned).  It doesn't make a performance difference which instruction is used
40 * since Nehalem (original Core i7) was released.  However, the movaps is a byte
41 * shorter, so that is the one we'll use for now. (same for unaligned).
42 */
43#define MOVADQ	movaps
44#define MOVUDQ	movups
45
46#ifdef __x86_64__
47
48.data
49.align 16
50.Lgf128mul_x_ble_mask:
51	.octa 0x00000000000000010000000000000087
52POLY:   .octa 0xC2000000000000000000000000000001
53TWOONE: .octa 0x00000001000000000000000000000001
54
55# order of these constants should not change.
56# more specifically, ALL_F should follow SHIFT_MASK,
57# and ZERO should follow ALL_F
58
59SHUF_MASK:  .octa 0x000102030405060708090A0B0C0D0E0F
60MASK1:      .octa 0x0000000000000000ffffffffffffffff
61MASK2:      .octa 0xffffffffffffffff0000000000000000
62SHIFT_MASK: .octa 0x0f0e0d0c0b0a09080706050403020100
63ALL_F:      .octa 0xffffffffffffffffffffffffffffffff
64ZERO:       .octa 0x00000000000000000000000000000000
65ONE:        .octa 0x00000000000000000000000000000001
66F_MIN_MASK: .octa 0xf1f2f3f4f5f6f7f8f9fafbfcfdfeff0
67dec:        .octa 0x1
68enc:        .octa 0x2
69
70
71.text
72
73
74#define	STACK_OFFSET    8*3
75#define	HashKey		16*0	// store HashKey <<1 mod poly here
76#define	HashKey_2	16*1	// store HashKey^2 <<1 mod poly here
77#define	HashKey_3	16*2	// store HashKey^3 <<1 mod poly here
78#define	HashKey_4	16*3	// store HashKey^4 <<1 mod poly here
79#define	HashKey_k	16*4	// store XOR of High 64 bits and Low 64
80				// bits of  HashKey <<1 mod poly here
81				//(for Karatsuba purposes)
82#define	HashKey_2_k	16*5	// store XOR of High 64 bits and Low 64
83				// bits of  HashKey^2 <<1 mod poly here
84				// (for Karatsuba purposes)
85#define	HashKey_3_k	16*6	// store XOR of High 64 bits and Low 64
86				// bits of  HashKey^3 <<1 mod poly here
87				// (for Karatsuba purposes)
88#define	HashKey_4_k	16*7	// store XOR of High 64 bits and Low 64
89				// bits of  HashKey^4 <<1 mod poly here
90				// (for Karatsuba purposes)
91#define	VARIABLE_OFFSET	16*8
92
93#define arg1 rdi
94#define arg2 rsi
95#define arg3 rdx
96#define arg4 rcx
97#define arg5 r8
98#define arg6 r9
99#define arg7 STACK_OFFSET+8(%r14)
100#define arg8 STACK_OFFSET+16(%r14)
101#define arg9 STACK_OFFSET+24(%r14)
102#define arg10 STACK_OFFSET+32(%r14)
103#define keysize 2*15*16(%arg1)
104#endif
105
106
107#define STATE1	%xmm0
108#define STATE2	%xmm4
109#define STATE3	%xmm5
110#define STATE4	%xmm6
111#define STATE	STATE1
112#define IN1	%xmm1
113#define IN2	%xmm7
114#define IN3	%xmm8
115#define IN4	%xmm9
116#define IN	IN1
117#define KEY	%xmm2
118#define IV	%xmm3
119
120#define BSWAP_MASK %xmm10
121#define CTR	%xmm11
122#define INC	%xmm12
123
124#define GF128MUL_MASK %xmm10
125
126#ifdef __x86_64__
127#define AREG	%rax
128#define KEYP	%rdi
129#define OUTP	%rsi
130#define UKEYP	OUTP
131#define INP	%rdx
132#define LEN	%rcx
133#define IVP	%r8
134#define KLEN	%r9d
135#define T1	%r10
136#define TKEYP	T1
137#define T2	%r11
138#define TCTR_LOW T2
139#else
140#define AREG	%eax
141#define KEYP	%edi
142#define OUTP	AREG
143#define UKEYP	OUTP
144#define INP	%edx
145#define LEN	%esi
146#define IVP	%ebp
147#define KLEN	%ebx
148#define T1	%ecx
149#define TKEYP	T1
150#endif
151
152
153#ifdef __x86_64__
154/* GHASH_MUL MACRO to implement: Data*HashKey mod (128,127,126,121,0)
155*
156*
157* Input: A and B (128-bits each, bit-reflected)
158* Output: C = A*B*x mod poly, (i.e. >>1 )
159* To compute GH = GH*HashKey mod poly, give HK = HashKey<<1 mod poly as input
160* GH = GH * HK * x mod poly which is equivalent to GH*HashKey mod poly.
161*
162*/
163.macro GHASH_MUL GH HK TMP1 TMP2 TMP3 TMP4 TMP5
164	movdqa	  \GH, \TMP1
165	pshufd	  $78, \GH, \TMP2
166	pshufd	  $78, \HK, \TMP3
167	pxor	  \GH, \TMP2            # TMP2 = a1+a0
168	pxor	  \HK, \TMP3            # TMP3 = b1+b0
169	PCLMULQDQ 0x11, \HK, \TMP1     # TMP1 = a1*b1
170	PCLMULQDQ 0x00, \HK, \GH       # GH = a0*b0
171	PCLMULQDQ 0x00, \TMP3, \TMP2   # TMP2 = (a0+a1)*(b1+b0)
172	pxor	  \GH, \TMP2
173	pxor	  \TMP1, \TMP2          # TMP2 = (a0*b0)+(a1*b0)
174	movdqa	  \TMP2, \TMP3
175	pslldq	  $8, \TMP3             # left shift TMP3 2 DWs
176	psrldq	  $8, \TMP2             # right shift TMP2 2 DWs
177	pxor	  \TMP3, \GH
178	pxor	  \TMP2, \TMP1          # TMP2:GH holds the result of GH*HK
179
180        # first phase of the reduction
181
182	movdqa    \GH, \TMP2
183	movdqa    \GH, \TMP3
184	movdqa    \GH, \TMP4            # copy GH into TMP2,TMP3 and TMP4
185					# in in order to perform
186					# independent shifts
187	pslld     $31, \TMP2            # packed right shift <<31
188	pslld     $30, \TMP3            # packed right shift <<30
189	pslld     $25, \TMP4            # packed right shift <<25
190	pxor      \TMP3, \TMP2          # xor the shifted versions
191	pxor      \TMP4, \TMP2
192	movdqa    \TMP2, \TMP5
193	psrldq    $4, \TMP5             # right shift TMP5 1 DW
194	pslldq    $12, \TMP2            # left shift TMP2 3 DWs
195	pxor      \TMP2, \GH
196
197        # second phase of the reduction
198
199	movdqa    \GH,\TMP2             # copy GH into TMP2,TMP3 and TMP4
200					# in in order to perform
201					# independent shifts
202	movdqa    \GH,\TMP3
203	movdqa    \GH,\TMP4
204	psrld     $1,\TMP2              # packed left shift >>1
205	psrld     $2,\TMP3              # packed left shift >>2
206	psrld     $7,\TMP4              # packed left shift >>7
207	pxor      \TMP3,\TMP2		# xor the shifted versions
208	pxor      \TMP4,\TMP2
209	pxor      \TMP5, \TMP2
210	pxor      \TMP2, \GH
211	pxor      \TMP1, \GH            # result is in TMP1
212.endm
213
214/*
215* if a = number of total plaintext bytes
216* b = floor(a/16)
217* num_initial_blocks = b mod 4
218* encrypt the initial num_initial_blocks blocks and apply ghash on
219* the ciphertext
220* %r10, %r11, %r12, %rax, %xmm5, %xmm6, %xmm7, %xmm8, %xmm9 registers
221* are clobbered
222* arg1, %arg2, %arg3, %r14 are used as a pointer only, not modified
223*/
224
225
226.macro INITIAL_BLOCKS_DEC num_initial_blocks TMP1 TMP2 TMP3 TMP4 TMP5 XMM0 XMM1 \
227XMM2 XMM3 XMM4 XMMDst TMP6 TMP7 i i_seq operation
228        MOVADQ     SHUF_MASK(%rip), %xmm14
229	mov	   arg7, %r10           # %r10 = AAD
230	mov	   arg8, %r12           # %r12 = aadLen
231	mov	   %r12, %r11
232	pxor	   %xmm\i, %xmm\i
233
234_get_AAD_loop\num_initial_blocks\operation:
235	movd	   (%r10), \TMP1
236	pslldq	   $12, \TMP1
237	psrldq	   $4, %xmm\i
238	pxor	   \TMP1, %xmm\i
239	add	   $4, %r10
240	sub	   $4, %r12
241	jne	   _get_AAD_loop\num_initial_blocks\operation
242
243	cmp	   $16, %r11
244	je	   _get_AAD_loop2_done\num_initial_blocks\operation
245
246	mov	   $16, %r12
247_get_AAD_loop2\num_initial_blocks\operation:
248	psrldq	   $4, %xmm\i
249	sub	   $4, %r12
250	cmp	   %r11, %r12
251	jne	   _get_AAD_loop2\num_initial_blocks\operation
252
253_get_AAD_loop2_done\num_initial_blocks\operation:
254	PSHUFB_XMM   %xmm14, %xmm\i # byte-reflect the AAD data
255
256	xor	   %r11, %r11 # initialise the data pointer offset as zero
257
258        # start AES for num_initial_blocks blocks
259
260	mov	   %arg5, %rax                      # %rax = *Y0
261	movdqu	   (%rax), \XMM0                    # XMM0 = Y0
262	PSHUFB_XMM   %xmm14, \XMM0
263
264.if (\i == 5) || (\i == 6) || (\i == 7)
265	MOVADQ		ONE(%RIP),\TMP1
266	MOVADQ		(%arg1),\TMP2
267.irpc index, \i_seq
268	paddd	   \TMP1, \XMM0                 # INCR Y0
269	movdqa	   \XMM0, %xmm\index
270	PSHUFB_XMM   %xmm14, %xmm\index      # perform a 16 byte swap
271	pxor	   \TMP2, %xmm\index
272.endr
273	lea	0x10(%arg1),%r10
274	mov	keysize,%eax
275	shr	$2,%eax				# 128->4, 192->6, 256->8
276	add	$5,%eax			      # 128->9, 192->11, 256->13
277
278aes_loop_initial_dec\num_initial_blocks:
279	MOVADQ	(%r10),\TMP1
280.irpc	index, \i_seq
281	AESENC	\TMP1, %xmm\index
282.endr
283	add	$16,%r10
284	sub	$1,%eax
285	jnz	aes_loop_initial_dec\num_initial_blocks
286
287	MOVADQ	(%r10), \TMP1
288.irpc index, \i_seq
289	AESENCLAST \TMP1, %xmm\index         # Last Round
290.endr
291.irpc index, \i_seq
292	movdqu	   (%arg3 , %r11, 1), \TMP1
293	pxor	   \TMP1, %xmm\index
294	movdqu	   %xmm\index, (%arg2 , %r11, 1)
295	# write back plaintext/ciphertext for num_initial_blocks
296	add	   $16, %r11
297
298	movdqa     \TMP1, %xmm\index
299	PSHUFB_XMM	   %xmm14, %xmm\index
300                # prepare plaintext/ciphertext for GHASH computation
301.endr
302.endif
303	GHASH_MUL  %xmm\i, \TMP3, \TMP1, \TMP2, \TMP4, \TMP5, \XMM1
304        # apply GHASH on num_initial_blocks blocks
305
306.if \i == 5
307        pxor       %xmm5, %xmm6
308	GHASH_MUL  %xmm6, \TMP3, \TMP1, \TMP2, \TMP4, \TMP5, \XMM1
309        pxor       %xmm6, %xmm7
310	GHASH_MUL  %xmm7, \TMP3, \TMP1, \TMP2, \TMP4, \TMP5, \XMM1
311        pxor       %xmm7, %xmm8
312	GHASH_MUL  %xmm8, \TMP3, \TMP1, \TMP2, \TMP4, \TMP5, \XMM1
313.elseif \i == 6
314        pxor       %xmm6, %xmm7
315	GHASH_MUL  %xmm7, \TMP3, \TMP1, \TMP2, \TMP4, \TMP5, \XMM1
316        pxor       %xmm7, %xmm8
317	GHASH_MUL  %xmm8, \TMP3, \TMP1, \TMP2, \TMP4, \TMP5, \XMM1
318.elseif \i == 7
319        pxor       %xmm7, %xmm8
320	GHASH_MUL  %xmm8, \TMP3, \TMP1, \TMP2, \TMP4, \TMP5, \XMM1
321.endif
322	cmp	   $64, %r13
323	jl	_initial_blocks_done\num_initial_blocks\operation
324	# no need for precomputed values
325/*
326*
327* Precomputations for HashKey parallel with encryption of first 4 blocks.
328* Haskey_i_k holds XORed values of the low and high parts of the Haskey_i
329*/
330	MOVADQ	   ONE(%rip), \TMP1
331	paddd	   \TMP1, \XMM0              # INCR Y0
332	MOVADQ	   \XMM0, \XMM1
333	PSHUFB_XMM  %xmm14, \XMM1        # perform a 16 byte swap
334
335	paddd	   \TMP1, \XMM0              # INCR Y0
336	MOVADQ	   \XMM0, \XMM2
337	PSHUFB_XMM  %xmm14, \XMM2        # perform a 16 byte swap
338
339	paddd	   \TMP1, \XMM0              # INCR Y0
340	MOVADQ	   \XMM0, \XMM3
341	PSHUFB_XMM %xmm14, \XMM3        # perform a 16 byte swap
342
343	paddd	   \TMP1, \XMM0              # INCR Y0
344	MOVADQ	   \XMM0, \XMM4
345	PSHUFB_XMM %xmm14, \XMM4        # perform a 16 byte swap
346
347	MOVADQ	   0(%arg1),\TMP1
348	pxor	   \TMP1, \XMM1
349	pxor	   \TMP1, \XMM2
350	pxor	   \TMP1, \XMM3
351	pxor	   \TMP1, \XMM4
352	movdqa	   \TMP3, \TMP5
353	pshufd	   $78, \TMP3, \TMP1
354	pxor	   \TMP3, \TMP1
355	movdqa	   \TMP1, HashKey_k(%rsp)
356	GHASH_MUL  \TMP5, \TMP3, \TMP1, \TMP2, \TMP4, \TMP6, \TMP7
357# TMP5 = HashKey^2<<1 (mod poly)
358	movdqa	   \TMP5, HashKey_2(%rsp)
359# HashKey_2 = HashKey^2<<1 (mod poly)
360	pshufd	   $78, \TMP5, \TMP1
361	pxor	   \TMP5, \TMP1
362	movdqa	   \TMP1, HashKey_2_k(%rsp)
363.irpc index, 1234 # do 4 rounds
364	movaps 0x10*\index(%arg1), \TMP1
365	AESENC	   \TMP1, \XMM1
366	AESENC	   \TMP1, \XMM2
367	AESENC	   \TMP1, \XMM3
368	AESENC	   \TMP1, \XMM4
369.endr
370	GHASH_MUL  \TMP5, \TMP3, \TMP1, \TMP2, \TMP4, \TMP6, \TMP7
371# TMP5 = HashKey^3<<1 (mod poly)
372	movdqa	   \TMP5, HashKey_3(%rsp)
373	pshufd	   $78, \TMP5, \TMP1
374	pxor	   \TMP5, \TMP1
375	movdqa	   \TMP1, HashKey_3_k(%rsp)
376.irpc index, 56789 # do next 5 rounds
377	movaps 0x10*\index(%arg1), \TMP1
378	AESENC	   \TMP1, \XMM1
379	AESENC	   \TMP1, \XMM2
380	AESENC	   \TMP1, \XMM3
381	AESENC	   \TMP1, \XMM4
382.endr
383	GHASH_MUL  \TMP5, \TMP3, \TMP1, \TMP2, \TMP4, \TMP6, \TMP7
384# TMP5 = HashKey^3<<1 (mod poly)
385	movdqa	   \TMP5, HashKey_4(%rsp)
386	pshufd	   $78, \TMP5, \TMP1
387	pxor	   \TMP5, \TMP1
388	movdqa	   \TMP1, HashKey_4_k(%rsp)
389	lea	   0xa0(%arg1),%r10
390	mov	   keysize,%eax
391	shr	   $2,%eax			# 128->4, 192->6, 256->8
392	sub	   $4,%eax			# 128->0, 192->2, 256->4
393	jz	   aes_loop_pre_dec_done\num_initial_blocks
394
395aes_loop_pre_dec\num_initial_blocks:
396	MOVADQ	   (%r10),\TMP2
397.irpc	index, 1234
398	AESENC	   \TMP2, %xmm\index
399.endr
400	add	   $16,%r10
401	sub	   $1,%eax
402	jnz	   aes_loop_pre_dec\num_initial_blocks
403
404aes_loop_pre_dec_done\num_initial_blocks:
405	MOVADQ	   (%r10), \TMP2
406	AESENCLAST \TMP2, \XMM1
407	AESENCLAST \TMP2, \XMM2
408	AESENCLAST \TMP2, \XMM3
409	AESENCLAST \TMP2, \XMM4
410	movdqu	   16*0(%arg3 , %r11 , 1), \TMP1
411	pxor	   \TMP1, \XMM1
412	movdqu	   \XMM1, 16*0(%arg2 , %r11 , 1)
413	movdqa     \TMP1, \XMM1
414	movdqu	   16*1(%arg3 , %r11 , 1), \TMP1
415	pxor	   \TMP1, \XMM2
416	movdqu	   \XMM2, 16*1(%arg2 , %r11 , 1)
417	movdqa     \TMP1, \XMM2
418	movdqu	   16*2(%arg3 , %r11 , 1), \TMP1
419	pxor	   \TMP1, \XMM3
420	movdqu	   \XMM3, 16*2(%arg2 , %r11 , 1)
421	movdqa     \TMP1, \XMM3
422	movdqu	   16*3(%arg3 , %r11 , 1), \TMP1
423	pxor	   \TMP1, \XMM4
424	movdqu	   \XMM4, 16*3(%arg2 , %r11 , 1)
425	movdqa     \TMP1, \XMM4
426	add	   $64, %r11
427	PSHUFB_XMM %xmm14, \XMM1 # perform a 16 byte swap
428	pxor	   \XMMDst, \XMM1
429# combine GHASHed value with the corresponding ciphertext
430	PSHUFB_XMM %xmm14, \XMM2 # perform a 16 byte swap
431	PSHUFB_XMM %xmm14, \XMM3 # perform a 16 byte swap
432	PSHUFB_XMM %xmm14, \XMM4 # perform a 16 byte swap
433
434_initial_blocks_done\num_initial_blocks\operation:
435
436.endm
437
438
439/*
440* if a = number of total plaintext bytes
441* b = floor(a/16)
442* num_initial_blocks = b mod 4
443* encrypt the initial num_initial_blocks blocks and apply ghash on
444* the ciphertext
445* %r10, %r11, %r12, %rax, %xmm5, %xmm6, %xmm7, %xmm8, %xmm9 registers
446* are clobbered
447* arg1, %arg2, %arg3, %r14 are used as a pointer only, not modified
448*/
449
450
451.macro INITIAL_BLOCKS_ENC num_initial_blocks TMP1 TMP2 TMP3 TMP4 TMP5 XMM0 XMM1 \
452XMM2 XMM3 XMM4 XMMDst TMP6 TMP7 i i_seq operation
453        MOVADQ     SHUF_MASK(%rip), %xmm14
454	mov	   arg7, %r10           # %r10 = AAD
455	mov	   arg8, %r12           # %r12 = aadLen
456	mov	   %r12, %r11
457	pxor	   %xmm\i, %xmm\i
458_get_AAD_loop\num_initial_blocks\operation:
459	movd	   (%r10), \TMP1
460	pslldq	   $12, \TMP1
461	psrldq	   $4, %xmm\i
462	pxor	   \TMP1, %xmm\i
463	add	   $4, %r10
464	sub	   $4, %r12
465	jne	   _get_AAD_loop\num_initial_blocks\operation
466	cmp	   $16, %r11
467	je	   _get_AAD_loop2_done\num_initial_blocks\operation
468	mov	   $16, %r12
469_get_AAD_loop2\num_initial_blocks\operation:
470	psrldq	   $4, %xmm\i
471	sub	   $4, %r12
472	cmp	   %r11, %r12
473	jne	   _get_AAD_loop2\num_initial_blocks\operation
474_get_AAD_loop2_done\num_initial_blocks\operation:
475	PSHUFB_XMM   %xmm14, %xmm\i # byte-reflect the AAD data
476
477	xor	   %r11, %r11 # initialise the data pointer offset as zero
478
479        # start AES for num_initial_blocks blocks
480
481	mov	   %arg5, %rax                      # %rax = *Y0
482	movdqu	   (%rax), \XMM0                    # XMM0 = Y0
483	PSHUFB_XMM   %xmm14, \XMM0
484
485.if (\i == 5) || (\i == 6) || (\i == 7)
486
487	MOVADQ		ONE(%RIP),\TMP1
488	MOVADQ		0(%arg1),\TMP2
489.irpc index, \i_seq
490	paddd		\TMP1, \XMM0                 # INCR Y0
491	MOVADQ		\XMM0, %xmm\index
492	PSHUFB_XMM	%xmm14, %xmm\index      # perform a 16 byte swap
493	pxor		\TMP2, %xmm\index
494.endr
495	lea	0x10(%arg1),%r10
496	mov	keysize,%eax
497	shr	$2,%eax				# 128->4, 192->6, 256->8
498	add	$5,%eax			      # 128->9, 192->11, 256->13
499
500aes_loop_initial_enc\num_initial_blocks:
501	MOVADQ	(%r10),\TMP1
502.irpc	index, \i_seq
503	AESENC	\TMP1, %xmm\index
504.endr
505	add	$16,%r10
506	sub	$1,%eax
507	jnz	aes_loop_initial_enc\num_initial_blocks
508
509	MOVADQ	(%r10), \TMP1
510.irpc index, \i_seq
511	AESENCLAST \TMP1, %xmm\index         # Last Round
512.endr
513.irpc index, \i_seq
514	movdqu	   (%arg3 , %r11, 1), \TMP1
515	pxor	   \TMP1, %xmm\index
516	movdqu	   %xmm\index, (%arg2 , %r11, 1)
517	# write back plaintext/ciphertext for num_initial_blocks
518	add	   $16, %r11
519	PSHUFB_XMM	   %xmm14, %xmm\index
520
521		# prepare plaintext/ciphertext for GHASH computation
522.endr
523.endif
524	GHASH_MUL  %xmm\i, \TMP3, \TMP1, \TMP2, \TMP4, \TMP5, \XMM1
525        # apply GHASH on num_initial_blocks blocks
526
527.if \i == 5
528        pxor       %xmm5, %xmm6
529	GHASH_MUL  %xmm6, \TMP3, \TMP1, \TMP2, \TMP4, \TMP5, \XMM1
530        pxor       %xmm6, %xmm7
531	GHASH_MUL  %xmm7, \TMP3, \TMP1, \TMP2, \TMP4, \TMP5, \XMM1
532        pxor       %xmm7, %xmm8
533	GHASH_MUL  %xmm8, \TMP3, \TMP1, \TMP2, \TMP4, \TMP5, \XMM1
534.elseif \i == 6
535        pxor       %xmm6, %xmm7
536	GHASH_MUL  %xmm7, \TMP3, \TMP1, \TMP2, \TMP4, \TMP5, \XMM1
537        pxor       %xmm7, %xmm8
538	GHASH_MUL  %xmm8, \TMP3, \TMP1, \TMP2, \TMP4, \TMP5, \XMM1
539.elseif \i == 7
540        pxor       %xmm7, %xmm8
541	GHASH_MUL  %xmm8, \TMP3, \TMP1, \TMP2, \TMP4, \TMP5, \XMM1
542.endif
543	cmp	   $64, %r13
544	jl	_initial_blocks_done\num_initial_blocks\operation
545	# no need for precomputed values
546/*
547*
548* Precomputations for HashKey parallel with encryption of first 4 blocks.
549* Haskey_i_k holds XORed values of the low and high parts of the Haskey_i
550*/
551	MOVADQ	   ONE(%RIP),\TMP1
552	paddd	   \TMP1, \XMM0              # INCR Y0
553	MOVADQ	   \XMM0, \XMM1
554	PSHUFB_XMM  %xmm14, \XMM1        # perform a 16 byte swap
555
556	paddd	   \TMP1, \XMM0              # INCR Y0
557	MOVADQ	   \XMM0, \XMM2
558	PSHUFB_XMM  %xmm14, \XMM2        # perform a 16 byte swap
559
560	paddd	   \TMP1, \XMM0              # INCR Y0
561	MOVADQ	   \XMM0, \XMM3
562	PSHUFB_XMM %xmm14, \XMM3        # perform a 16 byte swap
563
564	paddd	   \TMP1, \XMM0              # INCR Y0
565	MOVADQ	   \XMM0, \XMM4
566	PSHUFB_XMM %xmm14, \XMM4        # perform a 16 byte swap
567
568	MOVADQ	   0(%arg1),\TMP1
569	pxor	   \TMP1, \XMM1
570	pxor	   \TMP1, \XMM2
571	pxor	   \TMP1, \XMM3
572	pxor	   \TMP1, \XMM4
573	movdqa	   \TMP3, \TMP5
574	pshufd	   $78, \TMP3, \TMP1
575	pxor	   \TMP3, \TMP1
576	movdqa	   \TMP1, HashKey_k(%rsp)
577	GHASH_MUL  \TMP5, \TMP3, \TMP1, \TMP2, \TMP4, \TMP6, \TMP7
578# TMP5 = HashKey^2<<1 (mod poly)
579	movdqa	   \TMP5, HashKey_2(%rsp)
580# HashKey_2 = HashKey^2<<1 (mod poly)
581	pshufd	   $78, \TMP5, \TMP1
582	pxor	   \TMP5, \TMP1
583	movdqa	   \TMP1, HashKey_2_k(%rsp)
584.irpc index, 1234 # do 4 rounds
585	movaps 0x10*\index(%arg1), \TMP1
586	AESENC	   \TMP1, \XMM1
587	AESENC	   \TMP1, \XMM2
588	AESENC	   \TMP1, \XMM3
589	AESENC	   \TMP1, \XMM4
590.endr
591	GHASH_MUL  \TMP5, \TMP3, \TMP1, \TMP2, \TMP4, \TMP6, \TMP7
592# TMP5 = HashKey^3<<1 (mod poly)
593	movdqa	   \TMP5, HashKey_3(%rsp)
594	pshufd	   $78, \TMP5, \TMP1
595	pxor	   \TMP5, \TMP1
596	movdqa	   \TMP1, HashKey_3_k(%rsp)
597.irpc index, 56789 # do next 5 rounds
598	movaps 0x10*\index(%arg1), \TMP1
599	AESENC	   \TMP1, \XMM1
600	AESENC	   \TMP1, \XMM2
601	AESENC	   \TMP1, \XMM3
602	AESENC	   \TMP1, \XMM4
603.endr
604	GHASH_MUL  \TMP5, \TMP3, \TMP1, \TMP2, \TMP4, \TMP6, \TMP7
605# TMP5 = HashKey^3<<1 (mod poly)
606	movdqa	   \TMP5, HashKey_4(%rsp)
607	pshufd	   $78, \TMP5, \TMP1
608	pxor	   \TMP5, \TMP1
609	movdqa	   \TMP1, HashKey_4_k(%rsp)
610	lea	   0xa0(%arg1),%r10
611	mov	   keysize,%eax
612	shr	   $2,%eax			# 128->4, 192->6, 256->8
613	sub	   $4,%eax			# 128->0, 192->2, 256->4
614	jz	   aes_loop_pre_enc_done\num_initial_blocks
615
616aes_loop_pre_enc\num_initial_blocks:
617	MOVADQ	   (%r10),\TMP2
618.irpc	index, 1234
619	AESENC	   \TMP2, %xmm\index
620.endr
621	add	   $16,%r10
622	sub	   $1,%eax
623	jnz	   aes_loop_pre_enc\num_initial_blocks
624
625aes_loop_pre_enc_done\num_initial_blocks:
626	MOVADQ	   (%r10), \TMP2
627	AESENCLAST \TMP2, \XMM1
628	AESENCLAST \TMP2, \XMM2
629	AESENCLAST \TMP2, \XMM3
630	AESENCLAST \TMP2, \XMM4
631	movdqu	   16*0(%arg3 , %r11 , 1), \TMP1
632	pxor	   \TMP1, \XMM1
633	movdqu	   16*1(%arg3 , %r11 , 1), \TMP1
634	pxor	   \TMP1, \XMM2
635	movdqu	   16*2(%arg3 , %r11 , 1), \TMP1
636	pxor	   \TMP1, \XMM3
637	movdqu	   16*3(%arg3 , %r11 , 1), \TMP1
638	pxor	   \TMP1, \XMM4
639	movdqu     \XMM1, 16*0(%arg2 , %r11 , 1)
640	movdqu     \XMM2, 16*1(%arg2 , %r11 , 1)
641	movdqu     \XMM3, 16*2(%arg2 , %r11 , 1)
642	movdqu     \XMM4, 16*3(%arg2 , %r11 , 1)
643
644	add	   $64, %r11
645	PSHUFB_XMM %xmm14, \XMM1 # perform a 16 byte swap
646	pxor	   \XMMDst, \XMM1
647# combine GHASHed value with the corresponding ciphertext
648	PSHUFB_XMM %xmm14, \XMM2 # perform a 16 byte swap
649	PSHUFB_XMM %xmm14, \XMM3 # perform a 16 byte swap
650	PSHUFB_XMM %xmm14, \XMM4 # perform a 16 byte swap
651
652_initial_blocks_done\num_initial_blocks\operation:
653
654.endm
655
656/*
657* encrypt 4 blocks at a time
658* ghash the 4 previously encrypted ciphertext blocks
659* arg1, %arg2, %arg3 are used as pointers only, not modified
660* %r11 is the data offset value
661*/
662.macro GHASH_4_ENCRYPT_4_PARALLEL_ENC TMP1 TMP2 TMP3 TMP4 TMP5 \
663TMP6 XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7 XMM8 operation
664
665	movdqa	  \XMM1, \XMM5
666	movdqa	  \XMM2, \XMM6
667	movdqa	  \XMM3, \XMM7
668	movdqa	  \XMM4, \XMM8
669
670        movdqa    SHUF_MASK(%rip), %xmm15
671        # multiply TMP5 * HashKey using karatsuba
672
673	movdqa	  \XMM5, \TMP4
674	pshufd	  $78, \XMM5, \TMP6
675	pxor	  \XMM5, \TMP6
676	paddd     ONE(%rip), \XMM0		# INCR CNT
677	movdqa	  HashKey_4(%rsp), \TMP5
678	PCLMULQDQ 0x11, \TMP5, \TMP4           # TMP4 = a1*b1
679	movdqa    \XMM0, \XMM1
680	paddd     ONE(%rip), \XMM0		# INCR CNT
681	movdqa    \XMM0, \XMM2
682	paddd     ONE(%rip), \XMM0		# INCR CNT
683	movdqa    \XMM0, \XMM3
684	paddd     ONE(%rip), \XMM0		# INCR CNT
685	movdqa    \XMM0, \XMM4
686	PSHUFB_XMM %xmm15, \XMM1	# perform a 16 byte swap
687	PCLMULQDQ 0x00, \TMP5, \XMM5           # XMM5 = a0*b0
688	PSHUFB_XMM %xmm15, \XMM2	# perform a 16 byte swap
689	PSHUFB_XMM %xmm15, \XMM3	# perform a 16 byte swap
690	PSHUFB_XMM %xmm15, \XMM4	# perform a 16 byte swap
691
692	pxor	  (%arg1), \XMM1
693	pxor	  (%arg1), \XMM2
694	pxor	  (%arg1), \XMM3
695	pxor	  (%arg1), \XMM4
696	movdqa	  HashKey_4_k(%rsp), \TMP5
697	PCLMULQDQ 0x00, \TMP5, \TMP6           # TMP6 = (a1+a0)*(b1+b0)
698	movaps 0x10(%arg1), \TMP1
699	AESENC	  \TMP1, \XMM1              # Round 1
700	AESENC	  \TMP1, \XMM2
701	AESENC	  \TMP1, \XMM3
702	AESENC	  \TMP1, \XMM4
703	movaps 0x20(%arg1), \TMP1
704	AESENC	  \TMP1, \XMM1              # Round 2
705	AESENC	  \TMP1, \XMM2
706	AESENC	  \TMP1, \XMM3
707	AESENC	  \TMP1, \XMM4
708	movdqa	  \XMM6, \TMP1
709	pshufd	  $78, \XMM6, \TMP2
710	pxor	  \XMM6, \TMP2
711	movdqa	  HashKey_3(%rsp), \TMP5
712	PCLMULQDQ 0x11, \TMP5, \TMP1           # TMP1 = a1 * b1
713	movaps 0x30(%arg1), \TMP3
714	AESENC    \TMP3, \XMM1              # Round 3
715	AESENC    \TMP3, \XMM2
716	AESENC    \TMP3, \XMM3
717	AESENC    \TMP3, \XMM4
718	PCLMULQDQ 0x00, \TMP5, \XMM6           # XMM6 = a0*b0
719	movaps 0x40(%arg1), \TMP3
720	AESENC	  \TMP3, \XMM1              # Round 4
721	AESENC	  \TMP3, \XMM2
722	AESENC	  \TMP3, \XMM3
723	AESENC	  \TMP3, \XMM4
724	movdqa	  HashKey_3_k(%rsp), \TMP5
725	PCLMULQDQ 0x00, \TMP5, \TMP2           # TMP2 = (a1+a0)*(b1+b0)
726	movaps 0x50(%arg1), \TMP3
727	AESENC	  \TMP3, \XMM1              # Round 5
728	AESENC	  \TMP3, \XMM2
729	AESENC	  \TMP3, \XMM3
730	AESENC	  \TMP3, \XMM4
731	pxor	  \TMP1, \TMP4
732# accumulate the results in TMP4:XMM5, TMP6 holds the middle part
733	pxor	  \XMM6, \XMM5
734	pxor	  \TMP2, \TMP6
735	movdqa	  \XMM7, \TMP1
736	pshufd	  $78, \XMM7, \TMP2
737	pxor	  \XMM7, \TMP2
738	movdqa	  HashKey_2(%rsp ), \TMP5
739
740        # Multiply TMP5 * HashKey using karatsuba
741
742	PCLMULQDQ 0x11, \TMP5, \TMP1           # TMP1 = a1*b1
743	movaps 0x60(%arg1), \TMP3
744	AESENC	  \TMP3, \XMM1              # Round 6
745	AESENC	  \TMP3, \XMM2
746	AESENC	  \TMP3, \XMM3
747	AESENC	  \TMP3, \XMM4
748	PCLMULQDQ 0x00, \TMP5, \XMM7           # XMM7 = a0*b0
749	movaps 0x70(%arg1), \TMP3
750	AESENC	  \TMP3, \XMM1             # Round 7
751	AESENC	  \TMP3, \XMM2
752	AESENC	  \TMP3, \XMM3
753	AESENC	  \TMP3, \XMM4
754	movdqa	  HashKey_2_k(%rsp), \TMP5
755	PCLMULQDQ 0x00, \TMP5, \TMP2           # TMP2 = (a1+a0)*(b1+b0)
756	movaps 0x80(%arg1), \TMP3
757	AESENC	  \TMP3, \XMM1             # Round 8
758	AESENC	  \TMP3, \XMM2
759	AESENC	  \TMP3, \XMM3
760	AESENC	  \TMP3, \XMM4
761	pxor	  \TMP1, \TMP4
762# accumulate the results in TMP4:XMM5, TMP6 holds the middle part
763	pxor	  \XMM7, \XMM5
764	pxor	  \TMP2, \TMP6
765
766        # Multiply XMM8 * HashKey
767        # XMM8 and TMP5 hold the values for the two operands
768
769	movdqa	  \XMM8, \TMP1
770	pshufd	  $78, \XMM8, \TMP2
771	pxor	  \XMM8, \TMP2
772	movdqa	  HashKey(%rsp), \TMP5
773	PCLMULQDQ 0x11, \TMP5, \TMP1          # TMP1 = a1*b1
774	movaps 0x90(%arg1), \TMP3
775	AESENC	  \TMP3, \XMM1            # Round 9
776	AESENC	  \TMP3, \XMM2
777	AESENC	  \TMP3, \XMM3
778	AESENC	  \TMP3, \XMM4
779	PCLMULQDQ 0x00, \TMP5, \XMM8          # XMM8 = a0*b0
780	lea	  0xa0(%arg1),%r10
781	mov	  keysize,%eax
782	shr	  $2,%eax			# 128->4, 192->6, 256->8
783	sub	  $4,%eax			# 128->0, 192->2, 256->4
784	jz	  aes_loop_par_enc_done
785
786aes_loop_par_enc:
787	MOVADQ	  (%r10),\TMP3
788.irpc	index, 1234
789	AESENC	  \TMP3, %xmm\index
790.endr
791	add	  $16,%r10
792	sub	  $1,%eax
793	jnz	  aes_loop_par_enc
794
795aes_loop_par_enc_done:
796	MOVADQ	  (%r10), \TMP3
797	AESENCLAST \TMP3, \XMM1           # Round 10
798	AESENCLAST \TMP3, \XMM2
799	AESENCLAST \TMP3, \XMM3
800	AESENCLAST \TMP3, \XMM4
801	movdqa    HashKey_k(%rsp), \TMP5
802	PCLMULQDQ 0x00, \TMP5, \TMP2          # TMP2 = (a1+a0)*(b1+b0)
803	movdqu	  (%arg3,%r11,1), \TMP3
804	pxor	  \TMP3, \XMM1                 # Ciphertext/Plaintext XOR EK
805	movdqu	  16(%arg3,%r11,1), \TMP3
806	pxor	  \TMP3, \XMM2                 # Ciphertext/Plaintext XOR EK
807	movdqu	  32(%arg3,%r11,1), \TMP3
808	pxor	  \TMP3, \XMM3                 # Ciphertext/Plaintext XOR EK
809	movdqu	  48(%arg3,%r11,1), \TMP3
810	pxor	  \TMP3, \XMM4                 # Ciphertext/Plaintext XOR EK
811        movdqu    \XMM1, (%arg2,%r11,1)        # Write to the ciphertext buffer
812        movdqu    \XMM2, 16(%arg2,%r11,1)      # Write to the ciphertext buffer
813        movdqu    \XMM3, 32(%arg2,%r11,1)      # Write to the ciphertext buffer
814        movdqu    \XMM4, 48(%arg2,%r11,1)      # Write to the ciphertext buffer
815	PSHUFB_XMM %xmm15, \XMM1        # perform a 16 byte swap
816	PSHUFB_XMM %xmm15, \XMM2	# perform a 16 byte swap
817	PSHUFB_XMM %xmm15, \XMM3	# perform a 16 byte swap
818	PSHUFB_XMM %xmm15, \XMM4	# perform a 16 byte swap
819
820	pxor	  \TMP4, \TMP1
821	pxor	  \XMM8, \XMM5
822	pxor	  \TMP6, \TMP2
823	pxor	  \TMP1, \TMP2
824	pxor	  \XMM5, \TMP2
825	movdqa	  \TMP2, \TMP3
826	pslldq	  $8, \TMP3                    # left shift TMP3 2 DWs
827	psrldq	  $8, \TMP2                    # right shift TMP2 2 DWs
828	pxor	  \TMP3, \XMM5
829	pxor	  \TMP2, \TMP1	  # accumulate the results in TMP1:XMM5
830
831        # first phase of reduction
832
833	movdqa    \XMM5, \TMP2
834	movdqa    \XMM5, \TMP3
835	movdqa    \XMM5, \TMP4
836# move XMM5 into TMP2, TMP3, TMP4 in order to perform shifts independently
837	pslld     $31, \TMP2                   # packed right shift << 31
838	pslld     $30, \TMP3                   # packed right shift << 30
839	pslld     $25, \TMP4                   # packed right shift << 25
840	pxor      \TMP3, \TMP2	               # xor the shifted versions
841	pxor      \TMP4, \TMP2
842	movdqa    \TMP2, \TMP5
843	psrldq    $4, \TMP5                    # right shift T5 1 DW
844	pslldq    $12, \TMP2                   # left shift T2 3 DWs
845	pxor      \TMP2, \XMM5
846
847        # second phase of reduction
848
849	movdqa    \XMM5,\TMP2 # make 3 copies of XMM5 into TMP2, TMP3, TMP4
850	movdqa    \XMM5,\TMP3
851	movdqa    \XMM5,\TMP4
852	psrld     $1, \TMP2                    # packed left shift >>1
853	psrld     $2, \TMP3                    # packed left shift >>2
854	psrld     $7, \TMP4                    # packed left shift >>7
855	pxor      \TMP3,\TMP2		       # xor the shifted versions
856	pxor      \TMP4,\TMP2
857	pxor      \TMP5, \TMP2
858	pxor      \TMP2, \XMM5
859	pxor      \TMP1, \XMM5                 # result is in TMP1
860
861	pxor	  \XMM5, \XMM1
862.endm
863
864/*
865* decrypt 4 blocks at a time
866* ghash the 4 previously decrypted ciphertext blocks
867* arg1, %arg2, %arg3 are used as pointers only, not modified
868* %r11 is the data offset value
869*/
870.macro GHASH_4_ENCRYPT_4_PARALLEL_DEC TMP1 TMP2 TMP3 TMP4 TMP5 \
871TMP6 XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7 XMM8 operation
872
873	movdqa	  \XMM1, \XMM5
874	movdqa	  \XMM2, \XMM6
875	movdqa	  \XMM3, \XMM7
876	movdqa	  \XMM4, \XMM8
877
878        movdqa    SHUF_MASK(%rip), %xmm15
879        # multiply TMP5 * HashKey using karatsuba
880
881	movdqa	  \XMM5, \TMP4
882	pshufd	  $78, \XMM5, \TMP6
883	pxor	  \XMM5, \TMP6
884	paddd     ONE(%rip), \XMM0		# INCR CNT
885	movdqa	  HashKey_4(%rsp), \TMP5
886	PCLMULQDQ 0x11, \TMP5, \TMP4           # TMP4 = a1*b1
887	movdqa    \XMM0, \XMM1
888	paddd     ONE(%rip), \XMM0		# INCR CNT
889	movdqa    \XMM0, \XMM2
890	paddd     ONE(%rip), \XMM0		# INCR CNT
891	movdqa    \XMM0, \XMM3
892	paddd     ONE(%rip), \XMM0		# INCR CNT
893	movdqa    \XMM0, \XMM4
894	PSHUFB_XMM %xmm15, \XMM1	# perform a 16 byte swap
895	PCLMULQDQ 0x00, \TMP5, \XMM5           # XMM5 = a0*b0
896	PSHUFB_XMM %xmm15, \XMM2	# perform a 16 byte swap
897	PSHUFB_XMM %xmm15, \XMM3	# perform a 16 byte swap
898	PSHUFB_XMM %xmm15, \XMM4	# perform a 16 byte swap
899
900	pxor	  (%arg1), \XMM1
901	pxor	  (%arg1), \XMM2
902	pxor	  (%arg1), \XMM3
903	pxor	  (%arg1), \XMM4
904	movdqa	  HashKey_4_k(%rsp), \TMP5
905	PCLMULQDQ 0x00, \TMP5, \TMP6           # TMP6 = (a1+a0)*(b1+b0)
906	movaps 0x10(%arg1), \TMP1
907	AESENC	  \TMP1, \XMM1              # Round 1
908	AESENC	  \TMP1, \XMM2
909	AESENC	  \TMP1, \XMM3
910	AESENC	  \TMP1, \XMM4
911	movaps 0x20(%arg1), \TMP1
912	AESENC	  \TMP1, \XMM1              # Round 2
913	AESENC	  \TMP1, \XMM2
914	AESENC	  \TMP1, \XMM3
915	AESENC	  \TMP1, \XMM4
916	movdqa	  \XMM6, \TMP1
917	pshufd	  $78, \XMM6, \TMP2
918	pxor	  \XMM6, \TMP2
919	movdqa	  HashKey_3(%rsp), \TMP5
920	PCLMULQDQ 0x11, \TMP5, \TMP1           # TMP1 = a1 * b1
921	movaps 0x30(%arg1), \TMP3
922	AESENC    \TMP3, \XMM1              # Round 3
923	AESENC    \TMP3, \XMM2
924	AESENC    \TMP3, \XMM3
925	AESENC    \TMP3, \XMM4
926	PCLMULQDQ 0x00, \TMP5, \XMM6           # XMM6 = a0*b0
927	movaps 0x40(%arg1), \TMP3
928	AESENC	  \TMP3, \XMM1              # Round 4
929	AESENC	  \TMP3, \XMM2
930	AESENC	  \TMP3, \XMM3
931	AESENC	  \TMP3, \XMM4
932	movdqa	  HashKey_3_k(%rsp), \TMP5
933	PCLMULQDQ 0x00, \TMP5, \TMP2           # TMP2 = (a1+a0)*(b1+b0)
934	movaps 0x50(%arg1), \TMP3
935	AESENC	  \TMP3, \XMM1              # Round 5
936	AESENC	  \TMP3, \XMM2
937	AESENC	  \TMP3, \XMM3
938	AESENC	  \TMP3, \XMM4
939	pxor	  \TMP1, \TMP4
940# accumulate the results in TMP4:XMM5, TMP6 holds the middle part
941	pxor	  \XMM6, \XMM5
942	pxor	  \TMP2, \TMP6
943	movdqa	  \XMM7, \TMP1
944	pshufd	  $78, \XMM7, \TMP2
945	pxor	  \XMM7, \TMP2
946	movdqa	  HashKey_2(%rsp ), \TMP5
947
948        # Multiply TMP5 * HashKey using karatsuba
949
950	PCLMULQDQ 0x11, \TMP5, \TMP1           # TMP1 = a1*b1
951	movaps 0x60(%arg1), \TMP3
952	AESENC	  \TMP3, \XMM1              # Round 6
953	AESENC	  \TMP3, \XMM2
954	AESENC	  \TMP3, \XMM3
955	AESENC	  \TMP3, \XMM4
956	PCLMULQDQ 0x00, \TMP5, \XMM7           # XMM7 = a0*b0
957	movaps 0x70(%arg1), \TMP3
958	AESENC	  \TMP3, \XMM1             # Round 7
959	AESENC	  \TMP3, \XMM2
960	AESENC	  \TMP3, \XMM3
961	AESENC	  \TMP3, \XMM4
962	movdqa	  HashKey_2_k(%rsp), \TMP5
963	PCLMULQDQ 0x00, \TMP5, \TMP2           # TMP2 = (a1+a0)*(b1+b0)
964	movaps 0x80(%arg1), \TMP3
965	AESENC	  \TMP3, \XMM1             # Round 8
966	AESENC	  \TMP3, \XMM2
967	AESENC	  \TMP3, \XMM3
968	AESENC	  \TMP3, \XMM4
969	pxor	  \TMP1, \TMP4
970# accumulate the results in TMP4:XMM5, TMP6 holds the middle part
971	pxor	  \XMM7, \XMM5
972	pxor	  \TMP2, \TMP6
973
974        # Multiply XMM8 * HashKey
975        # XMM8 and TMP5 hold the values for the two operands
976
977	movdqa	  \XMM8, \TMP1
978	pshufd	  $78, \XMM8, \TMP2
979	pxor	  \XMM8, \TMP2
980	movdqa	  HashKey(%rsp), \TMP5
981	PCLMULQDQ 0x11, \TMP5, \TMP1          # TMP1 = a1*b1
982	movaps 0x90(%arg1), \TMP3
983	AESENC	  \TMP3, \XMM1            # Round 9
984	AESENC	  \TMP3, \XMM2
985	AESENC	  \TMP3, \XMM3
986	AESENC	  \TMP3, \XMM4
987	PCLMULQDQ 0x00, \TMP5, \XMM8          # XMM8 = a0*b0
988	lea	  0xa0(%arg1),%r10
989	mov	  keysize,%eax
990	shr	  $2,%eax		        # 128->4, 192->6, 256->8
991	sub	  $4,%eax			# 128->0, 192->2, 256->4
992	jz	  aes_loop_par_dec_done
993
994aes_loop_par_dec:
995	MOVADQ	  (%r10),\TMP3
996.irpc	index, 1234
997	AESENC	  \TMP3, %xmm\index
998.endr
999	add	  $16,%r10
1000	sub	  $1,%eax
1001	jnz	  aes_loop_par_dec
1002
1003aes_loop_par_dec_done:
1004	MOVADQ	  (%r10), \TMP3
1005	AESENCLAST \TMP3, \XMM1           # last round
1006	AESENCLAST \TMP3, \XMM2
1007	AESENCLAST \TMP3, \XMM3
1008	AESENCLAST \TMP3, \XMM4
1009	movdqa    HashKey_k(%rsp), \TMP5
1010	PCLMULQDQ 0x00, \TMP5, \TMP2          # TMP2 = (a1+a0)*(b1+b0)
1011	movdqu	  (%arg3,%r11,1), \TMP3
1012	pxor	  \TMP3, \XMM1                 # Ciphertext/Plaintext XOR EK
1013	movdqu	  \XMM1, (%arg2,%r11,1)        # Write to plaintext buffer
1014	movdqa    \TMP3, \XMM1
1015	movdqu	  16(%arg3,%r11,1), \TMP3
1016	pxor	  \TMP3, \XMM2                 # Ciphertext/Plaintext XOR EK
1017	movdqu	  \XMM2, 16(%arg2,%r11,1)      # Write to plaintext buffer
1018	movdqa    \TMP3, \XMM2
1019	movdqu	  32(%arg3,%r11,1), \TMP3
1020	pxor	  \TMP3, \XMM3                 # Ciphertext/Plaintext XOR EK
1021	movdqu	  \XMM3, 32(%arg2,%r11,1)      # Write to plaintext buffer
1022	movdqa    \TMP3, \XMM3
1023	movdqu	  48(%arg3,%r11,1), \TMP3
1024	pxor	  \TMP3, \XMM4                 # Ciphertext/Plaintext XOR EK
1025	movdqu	  \XMM4, 48(%arg2,%r11,1)      # Write to plaintext buffer
1026	movdqa    \TMP3, \XMM4
1027	PSHUFB_XMM %xmm15, \XMM1        # perform a 16 byte swap
1028	PSHUFB_XMM %xmm15, \XMM2	# perform a 16 byte swap
1029	PSHUFB_XMM %xmm15, \XMM3	# perform a 16 byte swap
1030	PSHUFB_XMM %xmm15, \XMM4	# perform a 16 byte swap
1031
1032	pxor	  \TMP4, \TMP1
1033	pxor	  \XMM8, \XMM5
1034	pxor	  \TMP6, \TMP2
1035	pxor	  \TMP1, \TMP2
1036	pxor	  \XMM5, \TMP2
1037	movdqa	  \TMP2, \TMP3
1038	pslldq	  $8, \TMP3                    # left shift TMP3 2 DWs
1039	psrldq	  $8, \TMP2                    # right shift TMP2 2 DWs
1040	pxor	  \TMP3, \XMM5
1041	pxor	  \TMP2, \TMP1	  # accumulate the results in TMP1:XMM5
1042
1043        # first phase of reduction
1044
1045	movdqa    \XMM5, \TMP2
1046	movdqa    \XMM5, \TMP3
1047	movdqa    \XMM5, \TMP4
1048# move XMM5 into TMP2, TMP3, TMP4 in order to perform shifts independently
1049	pslld     $31, \TMP2                   # packed right shift << 31
1050	pslld     $30, \TMP3                   # packed right shift << 30
1051	pslld     $25, \TMP4                   # packed right shift << 25
1052	pxor      \TMP3, \TMP2	               # xor the shifted versions
1053	pxor      \TMP4, \TMP2
1054	movdqa    \TMP2, \TMP5
1055	psrldq    $4, \TMP5                    # right shift T5 1 DW
1056	pslldq    $12, \TMP2                   # left shift T2 3 DWs
1057	pxor      \TMP2, \XMM5
1058
1059        # second phase of reduction
1060
1061	movdqa    \XMM5,\TMP2 # make 3 copies of XMM5 into TMP2, TMP3, TMP4
1062	movdqa    \XMM5,\TMP3
1063	movdqa    \XMM5,\TMP4
1064	psrld     $1, \TMP2                    # packed left shift >>1
1065	psrld     $2, \TMP3                    # packed left shift >>2
1066	psrld     $7, \TMP4                    # packed left shift >>7
1067	pxor      \TMP3,\TMP2		       # xor the shifted versions
1068	pxor      \TMP4,\TMP2
1069	pxor      \TMP5, \TMP2
1070	pxor      \TMP2, \XMM5
1071	pxor      \TMP1, \XMM5                 # result is in TMP1
1072
1073	pxor	  \XMM5, \XMM1
1074.endm
1075
1076/* GHASH the last 4 ciphertext blocks. */
1077.macro	GHASH_LAST_4 TMP1 TMP2 TMP3 TMP4 TMP5 TMP6 \
1078TMP7 XMM1 XMM2 XMM3 XMM4 XMMDst
1079
1080        # Multiply TMP6 * HashKey (using Karatsuba)
1081
1082	movdqa	  \XMM1, \TMP6
1083	pshufd	  $78, \XMM1, \TMP2
1084	pxor	  \XMM1, \TMP2
1085	movdqa	  HashKey_4(%rsp), \TMP5
1086	PCLMULQDQ 0x11, \TMP5, \TMP6       # TMP6 = a1*b1
1087	PCLMULQDQ 0x00, \TMP5, \XMM1       # XMM1 = a0*b0
1088	movdqa	  HashKey_4_k(%rsp), \TMP4
1089	PCLMULQDQ 0x00, \TMP4, \TMP2       # TMP2 = (a1+a0)*(b1+b0)
1090	movdqa	  \XMM1, \XMMDst
1091	movdqa	  \TMP2, \XMM1              # result in TMP6, XMMDst, XMM1
1092
1093        # Multiply TMP1 * HashKey (using Karatsuba)
1094
1095	movdqa	  \XMM2, \TMP1
1096	pshufd	  $78, \XMM2, \TMP2
1097	pxor	  \XMM2, \TMP2
1098	movdqa	  HashKey_3(%rsp), \TMP5
1099	PCLMULQDQ 0x11, \TMP5, \TMP1       # TMP1 = a1*b1
1100	PCLMULQDQ 0x00, \TMP5, \XMM2       # XMM2 = a0*b0
1101	movdqa	  HashKey_3_k(%rsp), \TMP4
1102	PCLMULQDQ 0x00, \TMP4, \TMP2       # TMP2 = (a1+a0)*(b1+b0)
1103	pxor	  \TMP1, \TMP6
1104	pxor	  \XMM2, \XMMDst
1105	pxor	  \TMP2, \XMM1
1106# results accumulated in TMP6, XMMDst, XMM1
1107
1108        # Multiply TMP1 * HashKey (using Karatsuba)
1109
1110	movdqa	  \XMM3, \TMP1
1111	pshufd	  $78, \XMM3, \TMP2
1112	pxor	  \XMM3, \TMP2
1113	movdqa	  HashKey_2(%rsp), \TMP5
1114	PCLMULQDQ 0x11, \TMP5, \TMP1       # TMP1 = a1*b1
1115	PCLMULQDQ 0x00, \TMP5, \XMM3       # XMM3 = a0*b0
1116	movdqa	  HashKey_2_k(%rsp), \TMP4
1117	PCLMULQDQ 0x00, \TMP4, \TMP2       # TMP2 = (a1+a0)*(b1+b0)
1118	pxor	  \TMP1, \TMP6
1119	pxor	  \XMM3, \XMMDst
1120	pxor	  \TMP2, \XMM1   # results accumulated in TMP6, XMMDst, XMM1
1121
1122        # Multiply TMP1 * HashKey (using Karatsuba)
1123	movdqa	  \XMM4, \TMP1
1124	pshufd	  $78, \XMM4, \TMP2
1125	pxor	  \XMM4, \TMP2
1126	movdqa	  HashKey(%rsp), \TMP5
1127	PCLMULQDQ 0x11, \TMP5, \TMP1	    # TMP1 = a1*b1
1128	PCLMULQDQ 0x00, \TMP5, \XMM4       # XMM4 = a0*b0
1129	movdqa	  HashKey_k(%rsp), \TMP4
1130	PCLMULQDQ 0x00, \TMP4, \TMP2       # TMP2 = (a1+a0)*(b1+b0)
1131	pxor	  \TMP1, \TMP6
1132	pxor	  \XMM4, \XMMDst
1133	pxor	  \XMM1, \TMP2
1134	pxor	  \TMP6, \TMP2
1135	pxor	  \XMMDst, \TMP2
1136	# middle section of the temp results combined as in karatsuba algorithm
1137	movdqa	  \TMP2, \TMP4
1138	pslldq	  $8, \TMP4                 # left shift TMP4 2 DWs
1139	psrldq	  $8, \TMP2                 # right shift TMP2 2 DWs
1140	pxor	  \TMP4, \XMMDst
1141	pxor	  \TMP2, \TMP6
1142# TMP6:XMMDst holds the result of the accumulated carry-less multiplications
1143	# first phase of the reduction
1144	movdqa    \XMMDst, \TMP2
1145	movdqa    \XMMDst, \TMP3
1146	movdqa    \XMMDst, \TMP4
1147# move XMMDst into TMP2, TMP3, TMP4 in order to perform 3 shifts independently
1148	pslld     $31, \TMP2                # packed right shifting << 31
1149	pslld     $30, \TMP3                # packed right shifting << 30
1150	pslld     $25, \TMP4                # packed right shifting << 25
1151	pxor      \TMP3, \TMP2              # xor the shifted versions
1152	pxor      \TMP4, \TMP2
1153	movdqa    \TMP2, \TMP7
1154	psrldq    $4, \TMP7                 # right shift TMP7 1 DW
1155	pslldq    $12, \TMP2                # left shift TMP2 3 DWs
1156	pxor      \TMP2, \XMMDst
1157
1158        # second phase of the reduction
1159	movdqa    \XMMDst, \TMP2
1160	# make 3 copies of XMMDst for doing 3 shift operations
1161	movdqa    \XMMDst, \TMP3
1162	movdqa    \XMMDst, \TMP4
1163	psrld     $1, \TMP2                 # packed left shift >> 1
1164	psrld     $2, \TMP3                 # packed left shift >> 2
1165	psrld     $7, \TMP4                 # packed left shift >> 7
1166	pxor      \TMP3, \TMP2              # xor the shifted versions
1167	pxor      \TMP4, \TMP2
1168	pxor      \TMP7, \TMP2
1169	pxor      \TMP2, \XMMDst
1170	pxor      \TMP6, \XMMDst            # reduced result is in XMMDst
1171.endm
1172
1173
1174/* Encryption of a single block
1175* uses eax & r10
1176*/
1177
1178.macro ENCRYPT_SINGLE_BLOCK XMM0 TMP1
1179
1180	pxor		(%arg1), \XMM0
1181	mov		keysize,%eax
1182	shr		$2,%eax			# 128->4, 192->6, 256->8
1183	add		$5,%eax			# 128->9, 192->11, 256->13
1184	lea		16(%arg1), %r10	  # get first expanded key address
1185
1186_esb_loop_\@:
1187	MOVADQ		(%r10),\TMP1
1188	AESENC		\TMP1,\XMM0
1189	add		$16,%r10
1190	sub		$1,%eax
1191	jnz		_esb_loop_\@
1192
1193	MOVADQ		(%r10),\TMP1
1194	AESENCLAST	\TMP1,\XMM0
1195.endm
1196/*****************************************************************************
1197* void aesni_gcm_dec(void *aes_ctx,    // AES Key schedule. Starts on a 16 byte boundary.
1198*                   u8 *out,           // Plaintext output. Encrypt in-place is allowed.
1199*                   const u8 *in,      // Ciphertext input
1200*                   u64 plaintext_len, // Length of data in bytes for decryption.
1201*                   u8 *iv,            // Pre-counter block j0: 4 byte salt (from Security Association)
1202*                                      // concatenated with 8 byte Initialisation Vector (from IPSec ESP Payload)
1203*                                      // concatenated with 0x00000001. 16-byte aligned pointer.
1204*                   u8 *hash_subkey,   // H, the Hash sub key input. Data starts on a 16-byte boundary.
1205*                   const u8 *aad,     // Additional Authentication Data (AAD)
1206*                   u64 aad_len,       // Length of AAD in bytes. With RFC4106 this is going to be 8 or 12 bytes
1207*                   u8  *auth_tag,     // Authenticated Tag output. The driver will compare this to the
1208*                                      // given authentication tag and only return the plaintext if they match.
1209*                   u64 auth_tag_len); // Authenticated Tag Length in bytes. Valid values are 16
1210*                                      // (most likely), 12 or 8.
1211*
1212* Assumptions:
1213*
1214* keys:
1215*       keys are pre-expanded and aligned to 16 bytes. we are using the first
1216*       set of 11 keys in the data structure void *aes_ctx
1217*
1218* iv:
1219*       0                   1                   2                   3
1220*       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1221*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1222*       |                             Salt  (From the SA)               |
1223*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1224*       |                     Initialization Vector                     |
1225*       |         (This is the sequence number from IPSec header)       |
1226*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1227*       |                              0x1                              |
1228*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1229*
1230*
1231*
1232* AAD:
1233*       AAD padded to 128 bits with 0
1234*       for example, assume AAD is a u32 vector
1235*
1236*       if AAD is 8 bytes:
1237*       AAD[3] = {A0, A1};
1238*       padded AAD in xmm register = {A1 A0 0 0}
1239*
1240*       0                   1                   2                   3
1241*       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1242*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1243*       |                               SPI (A1)                        |
1244*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1245*       |                     32-bit Sequence Number (A0)               |
1246*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1247*       |                              0x0                              |
1248*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1249*
1250*                                       AAD Format with 32-bit Sequence Number
1251*
1252*       if AAD is 12 bytes:
1253*       AAD[3] = {A0, A1, A2};
1254*       padded AAD in xmm register = {A2 A1 A0 0}
1255*
1256*       0                   1                   2                   3
1257*       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1258*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1259*       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1260*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1261*       |                               SPI (A2)                        |
1262*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1263*       |                 64-bit Extended Sequence Number {A1,A0}       |
1264*       |                                                               |
1265*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1266*       |                              0x0                              |
1267*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1268*
1269*                        AAD Format with 64-bit Extended Sequence Number
1270*
1271* aadLen:
1272*       from the definition of the spec, aadLen can only be 8 or 12 bytes.
1273*       The code supports 16 too but for other sizes, the code will fail.
1274*
1275* TLen:
1276*       from the definition of the spec, TLen can only be 8, 12 or 16 bytes.
1277*       For other sizes, the code will fail.
1278*
1279* poly = x^128 + x^127 + x^126 + x^121 + 1
1280*
1281*****************************************************************************/
1282ENTRY(aesni_gcm_dec)
1283	push	%r12
1284	push	%r13
1285	push	%r14
1286	mov	%rsp, %r14
1287/*
1288* states of %xmm registers %xmm6:%xmm15 not saved
1289* all %xmm registers are clobbered
1290*/
1291	sub	$VARIABLE_OFFSET, %rsp
1292	and	$~63, %rsp                        # align rsp to 64 bytes
1293	mov	%arg6, %r12
1294	movdqu	(%r12), %xmm13			  # %xmm13 = HashKey
1295        movdqa  SHUF_MASK(%rip), %xmm2
1296	PSHUFB_XMM %xmm2, %xmm13
1297
1298
1299# Precompute HashKey<<1 (mod poly) from the hash key (required for GHASH)
1300
1301	movdqa	%xmm13, %xmm2
1302	psllq	$1, %xmm13
1303	psrlq	$63, %xmm2
1304	movdqa	%xmm2, %xmm1
1305	pslldq	$8, %xmm2
1306	psrldq	$8, %xmm1
1307	por	%xmm2, %xmm13
1308
1309        # Reduction
1310
1311	pshufd	$0x24, %xmm1, %xmm2
1312	pcmpeqd TWOONE(%rip), %xmm2
1313	pand	POLY(%rip), %xmm2
1314	pxor	%xmm2, %xmm13     # %xmm13 holds the HashKey<<1 (mod poly)
1315
1316
1317        # Decrypt first few blocks
1318
1319	movdqa %xmm13, HashKey(%rsp)           # store HashKey<<1 (mod poly)
1320	mov %arg4, %r13    # save the number of bytes of plaintext/ciphertext
1321	and $-16, %r13                      # %r13 = %r13 - (%r13 mod 16)
1322	mov %r13, %r12
1323	and $(3<<4), %r12
1324	jz _initial_num_blocks_is_0_decrypt
1325	cmp $(2<<4), %r12
1326	jb _initial_num_blocks_is_1_decrypt
1327	je _initial_num_blocks_is_2_decrypt
1328_initial_num_blocks_is_3_decrypt:
1329	INITIAL_BLOCKS_DEC 3, %xmm9, %xmm10, %xmm13, %xmm11, %xmm12, %xmm0, \
1330%xmm1, %xmm2, %xmm3, %xmm4, %xmm8, %xmm5, %xmm6, 5, 678, dec
1331	sub	$48, %r13
1332	jmp	_initial_blocks_decrypted
1333_initial_num_blocks_is_2_decrypt:
1334	INITIAL_BLOCKS_DEC	2, %xmm9, %xmm10, %xmm13, %xmm11, %xmm12, %xmm0, \
1335%xmm1, %xmm2, %xmm3, %xmm4, %xmm8, %xmm5, %xmm6, 6, 78, dec
1336	sub	$32, %r13
1337	jmp	_initial_blocks_decrypted
1338_initial_num_blocks_is_1_decrypt:
1339	INITIAL_BLOCKS_DEC	1, %xmm9, %xmm10, %xmm13, %xmm11, %xmm12, %xmm0, \
1340%xmm1, %xmm2, %xmm3, %xmm4, %xmm8, %xmm5, %xmm6, 7, 8, dec
1341	sub	$16, %r13
1342	jmp	_initial_blocks_decrypted
1343_initial_num_blocks_is_0_decrypt:
1344	INITIAL_BLOCKS_DEC	0, %xmm9, %xmm10, %xmm13, %xmm11, %xmm12, %xmm0, \
1345%xmm1, %xmm2, %xmm3, %xmm4, %xmm8, %xmm5, %xmm6, 8, 0, dec
1346_initial_blocks_decrypted:
1347	cmp	$0, %r13
1348	je	_zero_cipher_left_decrypt
1349	sub	$64, %r13
1350	je	_four_cipher_left_decrypt
1351_decrypt_by_4:
1352	GHASH_4_ENCRYPT_4_PARALLEL_DEC	%xmm9, %xmm10, %xmm11, %xmm12, %xmm13, \
1353%xmm14, %xmm0, %xmm1, %xmm2, %xmm3, %xmm4, %xmm5, %xmm6, %xmm7, %xmm8, dec
1354	add	$64, %r11
1355	sub	$64, %r13
1356	jne	_decrypt_by_4
1357_four_cipher_left_decrypt:
1358	GHASH_LAST_4	%xmm9, %xmm10, %xmm11, %xmm12, %xmm13, %xmm14, \
1359%xmm15, %xmm1, %xmm2, %xmm3, %xmm4, %xmm8
1360_zero_cipher_left_decrypt:
1361	mov	%arg4, %r13
1362	and	$15, %r13				# %r13 = arg4 (mod 16)
1363	je	_multiple_of_16_bytes_decrypt
1364
1365        # Handle the last <16 byte block separately
1366
1367	paddd ONE(%rip), %xmm0         # increment CNT to get Yn
1368        movdqa SHUF_MASK(%rip), %xmm10
1369	PSHUFB_XMM %xmm10, %xmm0
1370
1371	ENCRYPT_SINGLE_BLOCK  %xmm0, %xmm1    # E(K, Yn)
1372	sub $16, %r11
1373	add %r13, %r11
1374	movdqu (%arg3,%r11,1), %xmm1   # receive the last <16 byte block
1375	lea SHIFT_MASK+16(%rip), %r12
1376	sub %r13, %r12
1377# adjust the shuffle mask pointer to be able to shift 16-%r13 bytes
1378# (%r13 is the number of bytes in plaintext mod 16)
1379	movdqu (%r12), %xmm2           # get the appropriate shuffle mask
1380	PSHUFB_XMM %xmm2, %xmm1            # right shift 16-%r13 butes
1381
1382	movdqa  %xmm1, %xmm2
1383	pxor %xmm1, %xmm0            # Ciphertext XOR E(K, Yn)
1384	movdqu ALL_F-SHIFT_MASK(%r12), %xmm1
1385	# get the appropriate mask to mask out top 16-%r13 bytes of %xmm0
1386	pand %xmm1, %xmm0            # mask out top 16-%r13 bytes of %xmm0
1387	pand    %xmm1, %xmm2
1388        movdqa SHUF_MASK(%rip), %xmm10
1389	PSHUFB_XMM %xmm10 ,%xmm2
1390
1391	pxor %xmm2, %xmm8
1392	GHASH_MUL %xmm8, %xmm13, %xmm9, %xmm10, %xmm11, %xmm5, %xmm6
1393	          # GHASH computation for the last <16 byte block
1394	sub %r13, %r11
1395	add $16, %r11
1396
1397        # output %r13 bytes
1398	MOVQ_R64_XMM	%xmm0, %rax
1399	cmp	$8, %r13
1400	jle	_less_than_8_bytes_left_decrypt
1401	mov	%rax, (%arg2 , %r11, 1)
1402	add	$8, %r11
1403	psrldq	$8, %xmm0
1404	MOVQ_R64_XMM	%xmm0, %rax
1405	sub	$8, %r13
1406_less_than_8_bytes_left_decrypt:
1407	mov	%al,  (%arg2, %r11, 1)
1408	add	$1, %r11
1409	shr	$8, %rax
1410	sub	$1, %r13
1411	jne	_less_than_8_bytes_left_decrypt
1412_multiple_of_16_bytes_decrypt:
1413	mov	arg8, %r12		  # %r13 = aadLen (number of bytes)
1414	shl	$3, %r12		  # convert into number of bits
1415	movd	%r12d, %xmm15		  # len(A) in %xmm15
1416	shl	$3, %arg4		  # len(C) in bits (*128)
1417	MOVQ_R64_XMM	%arg4, %xmm1
1418	pslldq	$8, %xmm15		  # %xmm15 = len(A)||0x0000000000000000
1419	pxor	%xmm1, %xmm15		  # %xmm15 = len(A)||len(C)
1420	pxor	%xmm15, %xmm8
1421	GHASH_MUL	%xmm8, %xmm13, %xmm9, %xmm10, %xmm11, %xmm5, %xmm6
1422	         # final GHASH computation
1423        movdqa SHUF_MASK(%rip), %xmm10
1424	PSHUFB_XMM %xmm10, %xmm8
1425
1426	mov	%arg5, %rax		  # %rax = *Y0
1427	movdqu	(%rax), %xmm0		  # %xmm0 = Y0
1428	ENCRYPT_SINGLE_BLOCK	%xmm0,  %xmm1	  # E(K, Y0)
1429	pxor	%xmm8, %xmm0
1430_return_T_decrypt:
1431	mov	arg9, %r10                # %r10 = authTag
1432	mov	arg10, %r11               # %r11 = auth_tag_len
1433	cmp	$16, %r11
1434	je	_T_16_decrypt
1435	cmp	$12, %r11
1436	je	_T_12_decrypt
1437_T_8_decrypt:
1438	MOVQ_R64_XMM	%xmm0, %rax
1439	mov	%rax, (%r10)
1440	jmp	_return_T_done_decrypt
1441_T_12_decrypt:
1442	MOVQ_R64_XMM	%xmm0, %rax
1443	mov	%rax, (%r10)
1444	psrldq	$8, %xmm0
1445	movd	%xmm0, %eax
1446	mov	%eax, 8(%r10)
1447	jmp	_return_T_done_decrypt
1448_T_16_decrypt:
1449	movdqu	%xmm0, (%r10)
1450_return_T_done_decrypt:
1451	mov	%r14, %rsp
1452	pop	%r14
1453	pop	%r13
1454	pop	%r12
1455	ret
1456ENDPROC(aesni_gcm_dec)
1457
1458
1459/*****************************************************************************
1460* void aesni_gcm_enc(void *aes_ctx,      // AES Key schedule. Starts on a 16 byte boundary.
1461*                    u8 *out,            // Ciphertext output. Encrypt in-place is allowed.
1462*                    const u8 *in,       // Plaintext input
1463*                    u64 plaintext_len,  // Length of data in bytes for encryption.
1464*                    u8 *iv,             // Pre-counter block j0: 4 byte salt (from Security Association)
1465*                                        // concatenated with 8 byte Initialisation Vector (from IPSec ESP Payload)
1466*                                        // concatenated with 0x00000001. 16-byte aligned pointer.
1467*                    u8 *hash_subkey,    // H, the Hash sub key input. Data starts on a 16-byte boundary.
1468*                    const u8 *aad,      // Additional Authentication Data (AAD)
1469*                    u64 aad_len,        // Length of AAD in bytes. With RFC4106 this is going to be 8 or 12 bytes
1470*                    u8 *auth_tag,       // Authenticated Tag output.
1471*                    u64 auth_tag_len);  // Authenticated Tag Length in bytes. Valid values are 16 (most likely),
1472*                                        // 12 or 8.
1473*
1474* Assumptions:
1475*
1476* keys:
1477*       keys are pre-expanded and aligned to 16 bytes. we are using the
1478*       first set of 11 keys in the data structure void *aes_ctx
1479*
1480*
1481* iv:
1482*       0                   1                   2                   3
1483*       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1484*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1485*       |                             Salt  (From the SA)               |
1486*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1487*       |                     Initialization Vector                     |
1488*       |         (This is the sequence number from IPSec header)       |
1489*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1490*       |                              0x1                              |
1491*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1492*
1493*
1494*
1495* AAD:
1496*       AAD padded to 128 bits with 0
1497*       for example, assume AAD is a u32 vector
1498*
1499*       if AAD is 8 bytes:
1500*       AAD[3] = {A0, A1};
1501*       padded AAD in xmm register = {A1 A0 0 0}
1502*
1503*       0                   1                   2                   3
1504*       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1505*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1506*       |                               SPI (A1)                        |
1507*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1508*       |                     32-bit Sequence Number (A0)               |
1509*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1510*       |                              0x0                              |
1511*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1512*
1513*                                 AAD Format with 32-bit Sequence Number
1514*
1515*       if AAD is 12 bytes:
1516*       AAD[3] = {A0, A1, A2};
1517*       padded AAD in xmm register = {A2 A1 A0 0}
1518*
1519*       0                   1                   2                   3
1520*       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1521*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1522*       |                               SPI (A2)                        |
1523*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1524*       |                 64-bit Extended Sequence Number {A1,A0}       |
1525*       |                                                               |
1526*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1527*       |                              0x0                              |
1528*       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1529*
1530*                         AAD Format with 64-bit Extended Sequence Number
1531*
1532* aadLen:
1533*       from the definition of the spec, aadLen can only be 8 or 12 bytes.
1534*       The code supports 16 too but for other sizes, the code will fail.
1535*
1536* TLen:
1537*       from the definition of the spec, TLen can only be 8, 12 or 16 bytes.
1538*       For other sizes, the code will fail.
1539*
1540* poly = x^128 + x^127 + x^126 + x^121 + 1
1541***************************************************************************/
1542ENTRY(aesni_gcm_enc)
1543	push	%r12
1544	push	%r13
1545	push	%r14
1546	mov	%rsp, %r14
1547#
1548# states of %xmm registers %xmm6:%xmm15 not saved
1549# all %xmm registers are clobbered
1550#
1551	sub	$VARIABLE_OFFSET, %rsp
1552	and	$~63, %rsp
1553	mov	%arg6, %r12
1554	movdqu	(%r12), %xmm13
1555        movdqa  SHUF_MASK(%rip), %xmm2
1556	PSHUFB_XMM %xmm2, %xmm13
1557
1558
1559# precompute HashKey<<1 mod poly from the HashKey (required for GHASH)
1560
1561	movdqa	%xmm13, %xmm2
1562	psllq	$1, %xmm13
1563	psrlq	$63, %xmm2
1564	movdqa	%xmm2, %xmm1
1565	pslldq	$8, %xmm2
1566	psrldq	$8, %xmm1
1567	por	%xmm2, %xmm13
1568
1569        # reduce HashKey<<1
1570
1571	pshufd	$0x24, %xmm1, %xmm2
1572	pcmpeqd TWOONE(%rip), %xmm2
1573	pand	POLY(%rip), %xmm2
1574	pxor	%xmm2, %xmm13
1575	movdqa	%xmm13, HashKey(%rsp)
1576	mov	%arg4, %r13            # %xmm13 holds HashKey<<1 (mod poly)
1577	and	$-16, %r13
1578	mov	%r13, %r12
1579
1580        # Encrypt first few blocks
1581
1582	and	$(3<<4), %r12
1583	jz	_initial_num_blocks_is_0_encrypt
1584	cmp	$(2<<4), %r12
1585	jb	_initial_num_blocks_is_1_encrypt
1586	je	_initial_num_blocks_is_2_encrypt
1587_initial_num_blocks_is_3_encrypt:
1588	INITIAL_BLOCKS_ENC	3, %xmm9, %xmm10, %xmm13, %xmm11, %xmm12, %xmm0, \
1589%xmm1, %xmm2, %xmm3, %xmm4, %xmm8, %xmm5, %xmm6, 5, 678, enc
1590	sub	$48, %r13
1591	jmp	_initial_blocks_encrypted
1592_initial_num_blocks_is_2_encrypt:
1593	INITIAL_BLOCKS_ENC	2, %xmm9, %xmm10, %xmm13, %xmm11, %xmm12, %xmm0, \
1594%xmm1, %xmm2, %xmm3, %xmm4, %xmm8, %xmm5, %xmm6, 6, 78, enc
1595	sub	$32, %r13
1596	jmp	_initial_blocks_encrypted
1597_initial_num_blocks_is_1_encrypt:
1598	INITIAL_BLOCKS_ENC	1, %xmm9, %xmm10, %xmm13, %xmm11, %xmm12, %xmm0, \
1599%xmm1, %xmm2, %xmm3, %xmm4, %xmm8, %xmm5, %xmm6, 7, 8, enc
1600	sub	$16, %r13
1601	jmp	_initial_blocks_encrypted
1602_initial_num_blocks_is_0_encrypt:
1603	INITIAL_BLOCKS_ENC	0, %xmm9, %xmm10, %xmm13, %xmm11, %xmm12, %xmm0, \
1604%xmm1, %xmm2, %xmm3, %xmm4, %xmm8, %xmm5, %xmm6, 8, 0, enc
1605_initial_blocks_encrypted:
1606
1607        # Main loop - Encrypt remaining blocks
1608
1609	cmp	$0, %r13
1610	je	_zero_cipher_left_encrypt
1611	sub	$64, %r13
1612	je	_four_cipher_left_encrypt
1613_encrypt_by_4_encrypt:
1614	GHASH_4_ENCRYPT_4_PARALLEL_ENC	%xmm9, %xmm10, %xmm11, %xmm12, %xmm13, \
1615%xmm14, %xmm0, %xmm1, %xmm2, %xmm3, %xmm4, %xmm5, %xmm6, %xmm7, %xmm8, enc
1616	add	$64, %r11
1617	sub	$64, %r13
1618	jne	_encrypt_by_4_encrypt
1619_four_cipher_left_encrypt:
1620	GHASH_LAST_4	%xmm9, %xmm10, %xmm11, %xmm12, %xmm13, %xmm14, \
1621%xmm15, %xmm1, %xmm2, %xmm3, %xmm4, %xmm8
1622_zero_cipher_left_encrypt:
1623	mov	%arg4, %r13
1624	and	$15, %r13			# %r13 = arg4 (mod 16)
1625	je	_multiple_of_16_bytes_encrypt
1626
1627         # Handle the last <16 Byte block separately
1628	paddd ONE(%rip), %xmm0                # INCR CNT to get Yn
1629        movdqa SHUF_MASK(%rip), %xmm10
1630	PSHUFB_XMM %xmm10, %xmm0
1631
1632
1633	ENCRYPT_SINGLE_BLOCK	%xmm0, %xmm1        # Encrypt(K, Yn)
1634	sub $16, %r11
1635	add %r13, %r11
1636	movdqu (%arg3,%r11,1), %xmm1     # receive the last <16 byte blocks
1637	lea SHIFT_MASK+16(%rip), %r12
1638	sub %r13, %r12
1639	# adjust the shuffle mask pointer to be able to shift 16-r13 bytes
1640	# (%r13 is the number of bytes in plaintext mod 16)
1641	movdqu	(%r12), %xmm2           # get the appropriate shuffle mask
1642	PSHUFB_XMM	%xmm2, %xmm1            # shift right 16-r13 byte
1643	pxor	%xmm1, %xmm0            # Plaintext XOR Encrypt(K, Yn)
1644	movdqu	ALL_F-SHIFT_MASK(%r12), %xmm1
1645	# get the appropriate mask to mask out top 16-r13 bytes of xmm0
1646	pand	%xmm1, %xmm0            # mask out top 16-r13 bytes of xmm0
1647        movdqa SHUF_MASK(%rip), %xmm10
1648	PSHUFB_XMM %xmm10,%xmm0
1649
1650	pxor	%xmm0, %xmm8
1651	GHASH_MUL %xmm8, %xmm13, %xmm9, %xmm10, %xmm11, %xmm5, %xmm6
1652	# GHASH computation for the last <16 byte block
1653	sub	%r13, %r11
1654	add	$16, %r11
1655
1656	movdqa SHUF_MASK(%rip), %xmm10
1657	PSHUFB_XMM %xmm10, %xmm0
1658
1659	# shuffle xmm0 back to output as ciphertext
1660
1661        # Output %r13 bytes
1662	MOVQ_R64_XMM %xmm0, %rax
1663	cmp $8, %r13
1664	jle _less_than_8_bytes_left_encrypt
1665	mov %rax, (%arg2 , %r11, 1)
1666	add $8, %r11
1667	psrldq $8, %xmm0
1668	MOVQ_R64_XMM %xmm0, %rax
1669	sub $8, %r13
1670_less_than_8_bytes_left_encrypt:
1671	mov %al,  (%arg2, %r11, 1)
1672	add $1, %r11
1673	shr $8, %rax
1674	sub $1, %r13
1675	jne _less_than_8_bytes_left_encrypt
1676_multiple_of_16_bytes_encrypt:
1677	mov	arg8, %r12    # %r12 = addLen (number of bytes)
1678	shl	$3, %r12
1679	movd	%r12d, %xmm15       # len(A) in %xmm15
1680	shl	$3, %arg4               # len(C) in bits (*128)
1681	MOVQ_R64_XMM	%arg4, %xmm1
1682	pslldq	$8, %xmm15          # %xmm15 = len(A)||0x0000000000000000
1683	pxor	%xmm1, %xmm15       # %xmm15 = len(A)||len(C)
1684	pxor	%xmm15, %xmm8
1685	GHASH_MUL	%xmm8, %xmm13, %xmm9, %xmm10, %xmm11, %xmm5, %xmm6
1686	# final GHASH computation
1687        movdqa SHUF_MASK(%rip), %xmm10
1688	PSHUFB_XMM %xmm10, %xmm8         # perform a 16 byte swap
1689
1690	mov	%arg5, %rax		       # %rax  = *Y0
1691	movdqu	(%rax), %xmm0		       # %xmm0 = Y0
1692	ENCRYPT_SINGLE_BLOCK	%xmm0, %xmm15         # Encrypt(K, Y0)
1693	pxor	%xmm8, %xmm0
1694_return_T_encrypt:
1695	mov	arg9, %r10                     # %r10 = authTag
1696	mov	arg10, %r11                    # %r11 = auth_tag_len
1697	cmp	$16, %r11
1698	je	_T_16_encrypt
1699	cmp	$12, %r11
1700	je	_T_12_encrypt
1701_T_8_encrypt:
1702	MOVQ_R64_XMM	%xmm0, %rax
1703	mov	%rax, (%r10)
1704	jmp	_return_T_done_encrypt
1705_T_12_encrypt:
1706	MOVQ_R64_XMM	%xmm0, %rax
1707	mov	%rax, (%r10)
1708	psrldq	$8, %xmm0
1709	movd	%xmm0, %eax
1710	mov	%eax, 8(%r10)
1711	jmp	_return_T_done_encrypt
1712_T_16_encrypt:
1713	movdqu	%xmm0, (%r10)
1714_return_T_done_encrypt:
1715	mov	%r14, %rsp
1716	pop	%r14
1717	pop	%r13
1718	pop	%r12
1719	ret
1720ENDPROC(aesni_gcm_enc)
1721
1722#endif
1723
1724
1725.align 4
1726_key_expansion_128:
1727_key_expansion_256a:
1728	pshufd $0b11111111, %xmm1, %xmm1
1729	shufps $0b00010000, %xmm0, %xmm4
1730	pxor %xmm4, %xmm0
1731	shufps $0b10001100, %xmm0, %xmm4
1732	pxor %xmm4, %xmm0
1733	pxor %xmm1, %xmm0
1734	movaps %xmm0, (TKEYP)
1735	add $0x10, TKEYP
1736	ret
1737ENDPROC(_key_expansion_128)
1738ENDPROC(_key_expansion_256a)
1739
1740.align 4
1741_key_expansion_192a:
1742	pshufd $0b01010101, %xmm1, %xmm1
1743	shufps $0b00010000, %xmm0, %xmm4
1744	pxor %xmm4, %xmm0
1745	shufps $0b10001100, %xmm0, %xmm4
1746	pxor %xmm4, %xmm0
1747	pxor %xmm1, %xmm0
1748
1749	movaps %xmm2, %xmm5
1750	movaps %xmm2, %xmm6
1751	pslldq $4, %xmm5
1752	pshufd $0b11111111, %xmm0, %xmm3
1753	pxor %xmm3, %xmm2
1754	pxor %xmm5, %xmm2
1755
1756	movaps %xmm0, %xmm1
1757	shufps $0b01000100, %xmm0, %xmm6
1758	movaps %xmm6, (TKEYP)
1759	shufps $0b01001110, %xmm2, %xmm1
1760	movaps %xmm1, 0x10(TKEYP)
1761	add $0x20, TKEYP
1762	ret
1763ENDPROC(_key_expansion_192a)
1764
1765.align 4
1766_key_expansion_192b:
1767	pshufd $0b01010101, %xmm1, %xmm1
1768	shufps $0b00010000, %xmm0, %xmm4
1769	pxor %xmm4, %xmm0
1770	shufps $0b10001100, %xmm0, %xmm4
1771	pxor %xmm4, %xmm0
1772	pxor %xmm1, %xmm0
1773
1774	movaps %xmm2, %xmm5
1775	pslldq $4, %xmm5
1776	pshufd $0b11111111, %xmm0, %xmm3
1777	pxor %xmm3, %xmm2
1778	pxor %xmm5, %xmm2
1779
1780	movaps %xmm0, (TKEYP)
1781	add $0x10, TKEYP
1782	ret
1783ENDPROC(_key_expansion_192b)
1784
1785.align 4
1786_key_expansion_256b:
1787	pshufd $0b10101010, %xmm1, %xmm1
1788	shufps $0b00010000, %xmm2, %xmm4
1789	pxor %xmm4, %xmm2
1790	shufps $0b10001100, %xmm2, %xmm4
1791	pxor %xmm4, %xmm2
1792	pxor %xmm1, %xmm2
1793	movaps %xmm2, (TKEYP)
1794	add $0x10, TKEYP
1795	ret
1796ENDPROC(_key_expansion_256b)
1797
1798/*
1799 * int aesni_set_key(struct crypto_aes_ctx *ctx, const u8 *in_key,
1800 *                   unsigned int key_len)
1801 */
1802ENTRY(aesni_set_key)
1803#ifndef __x86_64__
1804	pushl KEYP
1805	movl 8(%esp), KEYP		# ctx
1806	movl 12(%esp), UKEYP		# in_key
1807	movl 16(%esp), %edx		# key_len
1808#endif
1809	movups (UKEYP), %xmm0		# user key (first 16 bytes)
1810	movaps %xmm0, (KEYP)
1811	lea 0x10(KEYP), TKEYP		# key addr
1812	movl %edx, 480(KEYP)
1813	pxor %xmm4, %xmm4		# xmm4 is assumed 0 in _key_expansion_x
1814	cmp $24, %dl
1815	jb .Lenc_key128
1816	je .Lenc_key192
1817	movups 0x10(UKEYP), %xmm2	# other user key
1818	movaps %xmm2, (TKEYP)
1819	add $0x10, TKEYP
1820	AESKEYGENASSIST 0x1 %xmm2 %xmm1		# round 1
1821	call _key_expansion_256a
1822	AESKEYGENASSIST 0x1 %xmm0 %xmm1
1823	call _key_expansion_256b
1824	AESKEYGENASSIST 0x2 %xmm2 %xmm1		# round 2
1825	call _key_expansion_256a
1826	AESKEYGENASSIST 0x2 %xmm0 %xmm1
1827	call _key_expansion_256b
1828	AESKEYGENASSIST 0x4 %xmm2 %xmm1		# round 3
1829	call _key_expansion_256a
1830	AESKEYGENASSIST 0x4 %xmm0 %xmm1
1831	call _key_expansion_256b
1832	AESKEYGENASSIST 0x8 %xmm2 %xmm1		# round 4
1833	call _key_expansion_256a
1834	AESKEYGENASSIST 0x8 %xmm0 %xmm1
1835	call _key_expansion_256b
1836	AESKEYGENASSIST 0x10 %xmm2 %xmm1	# round 5
1837	call _key_expansion_256a
1838	AESKEYGENASSIST 0x10 %xmm0 %xmm1
1839	call _key_expansion_256b
1840	AESKEYGENASSIST 0x20 %xmm2 %xmm1	# round 6
1841	call _key_expansion_256a
1842	AESKEYGENASSIST 0x20 %xmm0 %xmm1
1843	call _key_expansion_256b
1844	AESKEYGENASSIST 0x40 %xmm2 %xmm1	# round 7
1845	call _key_expansion_256a
1846	jmp .Ldec_key
1847.Lenc_key192:
1848	movq 0x10(UKEYP), %xmm2		# other user key
1849	AESKEYGENASSIST 0x1 %xmm2 %xmm1		# round 1
1850	call _key_expansion_192a
1851	AESKEYGENASSIST 0x2 %xmm2 %xmm1		# round 2
1852	call _key_expansion_192b
1853	AESKEYGENASSIST 0x4 %xmm2 %xmm1		# round 3
1854	call _key_expansion_192a
1855	AESKEYGENASSIST 0x8 %xmm2 %xmm1		# round 4
1856	call _key_expansion_192b
1857	AESKEYGENASSIST 0x10 %xmm2 %xmm1	# round 5
1858	call _key_expansion_192a
1859	AESKEYGENASSIST 0x20 %xmm2 %xmm1	# round 6
1860	call _key_expansion_192b
1861	AESKEYGENASSIST 0x40 %xmm2 %xmm1	# round 7
1862	call _key_expansion_192a
1863	AESKEYGENASSIST 0x80 %xmm2 %xmm1	# round 8
1864	call _key_expansion_192b
1865	jmp .Ldec_key
1866.Lenc_key128:
1867	AESKEYGENASSIST 0x1 %xmm0 %xmm1		# round 1
1868	call _key_expansion_128
1869	AESKEYGENASSIST 0x2 %xmm0 %xmm1		# round 2
1870	call _key_expansion_128
1871	AESKEYGENASSIST 0x4 %xmm0 %xmm1		# round 3
1872	call _key_expansion_128
1873	AESKEYGENASSIST 0x8 %xmm0 %xmm1		# round 4
1874	call _key_expansion_128
1875	AESKEYGENASSIST 0x10 %xmm0 %xmm1	# round 5
1876	call _key_expansion_128
1877	AESKEYGENASSIST 0x20 %xmm0 %xmm1	# round 6
1878	call _key_expansion_128
1879	AESKEYGENASSIST 0x40 %xmm0 %xmm1	# round 7
1880	call _key_expansion_128
1881	AESKEYGENASSIST 0x80 %xmm0 %xmm1	# round 8
1882	call _key_expansion_128
1883	AESKEYGENASSIST 0x1b %xmm0 %xmm1	# round 9
1884	call _key_expansion_128
1885	AESKEYGENASSIST 0x36 %xmm0 %xmm1	# round 10
1886	call _key_expansion_128
1887.Ldec_key:
1888	sub $0x10, TKEYP
1889	movaps (KEYP), %xmm0
1890	movaps (TKEYP), %xmm1
1891	movaps %xmm0, 240(TKEYP)
1892	movaps %xmm1, 240(KEYP)
1893	add $0x10, KEYP
1894	lea 240-16(TKEYP), UKEYP
1895.align 4
1896.Ldec_key_loop:
1897	movaps (KEYP), %xmm0
1898	AESIMC %xmm0 %xmm1
1899	movaps %xmm1, (UKEYP)
1900	add $0x10, KEYP
1901	sub $0x10, UKEYP
1902	cmp TKEYP, KEYP
1903	jb .Ldec_key_loop
1904	xor AREG, AREG
1905#ifndef __x86_64__
1906	popl KEYP
1907#endif
1908	ret
1909ENDPROC(aesni_set_key)
1910
1911/*
1912 * void aesni_enc(struct crypto_aes_ctx *ctx, u8 *dst, const u8 *src)
1913 */
1914ENTRY(aesni_enc)
1915#ifndef __x86_64__
1916	pushl KEYP
1917	pushl KLEN
1918	movl 12(%esp), KEYP
1919	movl 16(%esp), OUTP
1920	movl 20(%esp), INP
1921#endif
1922	movl 480(KEYP), KLEN		# key length
1923	movups (INP), STATE		# input
1924	call _aesni_enc1
1925	movups STATE, (OUTP)		# output
1926#ifndef __x86_64__
1927	popl KLEN
1928	popl KEYP
1929#endif
1930	ret
1931ENDPROC(aesni_enc)
1932
1933/*
1934 * _aesni_enc1:		internal ABI
1935 * input:
1936 *	KEYP:		key struct pointer
1937 *	KLEN:		round count
1938 *	STATE:		initial state (input)
1939 * output:
1940 *	STATE:		finial state (output)
1941 * changed:
1942 *	KEY
1943 *	TKEYP (T1)
1944 */
1945.align 4
1946_aesni_enc1:
1947	movaps (KEYP), KEY		# key
1948	mov KEYP, TKEYP
1949	pxor KEY, STATE		# round 0
1950	add $0x30, TKEYP
1951	cmp $24, KLEN
1952	jb .Lenc128
1953	lea 0x20(TKEYP), TKEYP
1954	je .Lenc192
1955	add $0x20, TKEYP
1956	movaps -0x60(TKEYP), KEY
1957	AESENC KEY STATE
1958	movaps -0x50(TKEYP), KEY
1959	AESENC KEY STATE
1960.align 4
1961.Lenc192:
1962	movaps -0x40(TKEYP), KEY
1963	AESENC KEY STATE
1964	movaps -0x30(TKEYP), KEY
1965	AESENC KEY STATE
1966.align 4
1967.Lenc128:
1968	movaps -0x20(TKEYP), KEY
1969	AESENC KEY STATE
1970	movaps -0x10(TKEYP), KEY
1971	AESENC KEY STATE
1972	movaps (TKEYP), KEY
1973	AESENC KEY STATE
1974	movaps 0x10(TKEYP), KEY
1975	AESENC KEY STATE
1976	movaps 0x20(TKEYP), KEY
1977	AESENC KEY STATE
1978	movaps 0x30(TKEYP), KEY
1979	AESENC KEY STATE
1980	movaps 0x40(TKEYP), KEY
1981	AESENC KEY STATE
1982	movaps 0x50(TKEYP), KEY
1983	AESENC KEY STATE
1984	movaps 0x60(TKEYP), KEY
1985	AESENC KEY STATE
1986	movaps 0x70(TKEYP), KEY
1987	AESENCLAST KEY STATE
1988	ret
1989ENDPROC(_aesni_enc1)
1990
1991/*
1992 * _aesni_enc4:	internal ABI
1993 * input:
1994 *	KEYP:		key struct pointer
1995 *	KLEN:		round count
1996 *	STATE1:		initial state (input)
1997 *	STATE2
1998 *	STATE3
1999 *	STATE4
2000 * output:
2001 *	STATE1:		finial state (output)
2002 *	STATE2
2003 *	STATE3
2004 *	STATE4
2005 * changed:
2006 *	KEY
2007 *	TKEYP (T1)
2008 */
2009.align 4
2010_aesni_enc4:
2011	movaps (KEYP), KEY		# key
2012	mov KEYP, TKEYP
2013	pxor KEY, STATE1		# round 0
2014	pxor KEY, STATE2
2015	pxor KEY, STATE3
2016	pxor KEY, STATE4
2017	add $0x30, TKEYP
2018	cmp $24, KLEN
2019	jb .L4enc128
2020	lea 0x20(TKEYP), TKEYP
2021	je .L4enc192
2022	add $0x20, TKEYP
2023	movaps -0x60(TKEYP), KEY
2024	AESENC KEY STATE1
2025	AESENC KEY STATE2
2026	AESENC KEY STATE3
2027	AESENC KEY STATE4
2028	movaps -0x50(TKEYP), KEY
2029	AESENC KEY STATE1
2030	AESENC KEY STATE2
2031	AESENC KEY STATE3
2032	AESENC KEY STATE4
2033#.align 4
2034.L4enc192:
2035	movaps -0x40(TKEYP), KEY
2036	AESENC KEY STATE1
2037	AESENC KEY STATE2
2038	AESENC KEY STATE3
2039	AESENC KEY STATE4
2040	movaps -0x30(TKEYP), KEY
2041	AESENC KEY STATE1
2042	AESENC KEY STATE2
2043	AESENC KEY STATE3
2044	AESENC KEY STATE4
2045#.align 4
2046.L4enc128:
2047	movaps -0x20(TKEYP), KEY
2048	AESENC KEY STATE1
2049	AESENC KEY STATE2
2050	AESENC KEY STATE3
2051	AESENC KEY STATE4
2052	movaps -0x10(TKEYP), KEY
2053	AESENC KEY STATE1
2054	AESENC KEY STATE2
2055	AESENC KEY STATE3
2056	AESENC KEY STATE4
2057	movaps (TKEYP), KEY
2058	AESENC KEY STATE1
2059	AESENC KEY STATE2
2060	AESENC KEY STATE3
2061	AESENC KEY STATE4
2062	movaps 0x10(TKEYP), KEY
2063	AESENC KEY STATE1
2064	AESENC KEY STATE2
2065	AESENC KEY STATE3
2066	AESENC KEY STATE4
2067	movaps 0x20(TKEYP), KEY
2068	AESENC KEY STATE1
2069	AESENC KEY STATE2
2070	AESENC KEY STATE3
2071	AESENC KEY STATE4
2072	movaps 0x30(TKEYP), KEY
2073	AESENC KEY STATE1
2074	AESENC KEY STATE2
2075	AESENC KEY STATE3
2076	AESENC KEY STATE4
2077	movaps 0x40(TKEYP), KEY
2078	AESENC KEY STATE1
2079	AESENC KEY STATE2
2080	AESENC KEY STATE3
2081	AESENC KEY STATE4
2082	movaps 0x50(TKEYP), KEY
2083	AESENC KEY STATE1
2084	AESENC KEY STATE2
2085	AESENC KEY STATE3
2086	AESENC KEY STATE4
2087	movaps 0x60(TKEYP), KEY
2088	AESENC KEY STATE1
2089	AESENC KEY STATE2
2090	AESENC KEY STATE3
2091	AESENC KEY STATE4
2092	movaps 0x70(TKEYP), KEY
2093	AESENCLAST KEY STATE1		# last round
2094	AESENCLAST KEY STATE2
2095	AESENCLAST KEY STATE3
2096	AESENCLAST KEY STATE4
2097	ret
2098ENDPROC(_aesni_enc4)
2099
2100/*
2101 * void aesni_dec (struct crypto_aes_ctx *ctx, u8 *dst, const u8 *src)
2102 */
2103ENTRY(aesni_dec)
2104#ifndef __x86_64__
2105	pushl KEYP
2106	pushl KLEN
2107	movl 12(%esp), KEYP
2108	movl 16(%esp), OUTP
2109	movl 20(%esp), INP
2110#endif
2111	mov 480(KEYP), KLEN		# key length
2112	add $240, KEYP
2113	movups (INP), STATE		# input
2114	call _aesni_dec1
2115	movups STATE, (OUTP)		#output
2116#ifndef __x86_64__
2117	popl KLEN
2118	popl KEYP
2119#endif
2120	ret
2121ENDPROC(aesni_dec)
2122
2123/*
2124 * _aesni_dec1:		internal ABI
2125 * input:
2126 *	KEYP:		key struct pointer
2127 *	KLEN:		key length
2128 *	STATE:		initial state (input)
2129 * output:
2130 *	STATE:		finial state (output)
2131 * changed:
2132 *	KEY
2133 *	TKEYP (T1)
2134 */
2135.align 4
2136_aesni_dec1:
2137	movaps (KEYP), KEY		# key
2138	mov KEYP, TKEYP
2139	pxor KEY, STATE		# round 0
2140	add $0x30, TKEYP
2141	cmp $24, KLEN
2142	jb .Ldec128
2143	lea 0x20(TKEYP), TKEYP
2144	je .Ldec192
2145	add $0x20, TKEYP
2146	movaps -0x60(TKEYP), KEY
2147	AESDEC KEY STATE
2148	movaps -0x50(TKEYP), KEY
2149	AESDEC KEY STATE
2150.align 4
2151.Ldec192:
2152	movaps -0x40(TKEYP), KEY
2153	AESDEC KEY STATE
2154	movaps -0x30(TKEYP), KEY
2155	AESDEC KEY STATE
2156.align 4
2157.Ldec128:
2158	movaps -0x20(TKEYP), KEY
2159	AESDEC KEY STATE
2160	movaps -0x10(TKEYP), KEY
2161	AESDEC KEY STATE
2162	movaps (TKEYP), KEY
2163	AESDEC KEY STATE
2164	movaps 0x10(TKEYP), KEY
2165	AESDEC KEY STATE
2166	movaps 0x20(TKEYP), KEY
2167	AESDEC KEY STATE
2168	movaps 0x30(TKEYP), KEY
2169	AESDEC KEY STATE
2170	movaps 0x40(TKEYP), KEY
2171	AESDEC KEY STATE
2172	movaps 0x50(TKEYP), KEY
2173	AESDEC KEY STATE
2174	movaps 0x60(TKEYP), KEY
2175	AESDEC KEY STATE
2176	movaps 0x70(TKEYP), KEY
2177	AESDECLAST KEY STATE
2178	ret
2179ENDPROC(_aesni_dec1)
2180
2181/*
2182 * _aesni_dec4:	internal ABI
2183 * input:
2184 *	KEYP:		key struct pointer
2185 *	KLEN:		key length
2186 *	STATE1:		initial state (input)
2187 *	STATE2
2188 *	STATE3
2189 *	STATE4
2190 * output:
2191 *	STATE1:		finial state (output)
2192 *	STATE2
2193 *	STATE3
2194 *	STATE4
2195 * changed:
2196 *	KEY
2197 *	TKEYP (T1)
2198 */
2199.align 4
2200_aesni_dec4:
2201	movaps (KEYP), KEY		# key
2202	mov KEYP, TKEYP
2203	pxor KEY, STATE1		# round 0
2204	pxor KEY, STATE2
2205	pxor KEY, STATE3
2206	pxor KEY, STATE4
2207	add $0x30, TKEYP
2208	cmp $24, KLEN
2209	jb .L4dec128
2210	lea 0x20(TKEYP), TKEYP
2211	je .L4dec192
2212	add $0x20, TKEYP
2213	movaps -0x60(TKEYP), KEY
2214	AESDEC KEY STATE1
2215	AESDEC KEY STATE2
2216	AESDEC KEY STATE3
2217	AESDEC KEY STATE4
2218	movaps -0x50(TKEYP), KEY
2219	AESDEC KEY STATE1
2220	AESDEC KEY STATE2
2221	AESDEC KEY STATE3
2222	AESDEC KEY STATE4
2223.align 4
2224.L4dec192:
2225	movaps -0x40(TKEYP), KEY
2226	AESDEC KEY STATE1
2227	AESDEC KEY STATE2
2228	AESDEC KEY STATE3
2229	AESDEC KEY STATE4
2230	movaps -0x30(TKEYP), KEY
2231	AESDEC KEY STATE1
2232	AESDEC KEY STATE2
2233	AESDEC KEY STATE3
2234	AESDEC KEY STATE4
2235.align 4
2236.L4dec128:
2237	movaps -0x20(TKEYP), KEY
2238	AESDEC KEY STATE1
2239	AESDEC KEY STATE2
2240	AESDEC KEY STATE3
2241	AESDEC KEY STATE4
2242	movaps -0x10(TKEYP), KEY
2243	AESDEC KEY STATE1
2244	AESDEC KEY STATE2
2245	AESDEC KEY STATE3
2246	AESDEC KEY STATE4
2247	movaps (TKEYP), KEY
2248	AESDEC KEY STATE1
2249	AESDEC KEY STATE2
2250	AESDEC KEY STATE3
2251	AESDEC KEY STATE4
2252	movaps 0x10(TKEYP), KEY
2253	AESDEC KEY STATE1
2254	AESDEC KEY STATE2
2255	AESDEC KEY STATE3
2256	AESDEC KEY STATE4
2257	movaps 0x20(TKEYP), KEY
2258	AESDEC KEY STATE1
2259	AESDEC KEY STATE2
2260	AESDEC KEY STATE3
2261	AESDEC KEY STATE4
2262	movaps 0x30(TKEYP), KEY
2263	AESDEC KEY STATE1
2264	AESDEC KEY STATE2
2265	AESDEC KEY STATE3
2266	AESDEC KEY STATE4
2267	movaps 0x40(TKEYP), KEY
2268	AESDEC KEY STATE1
2269	AESDEC KEY STATE2
2270	AESDEC KEY STATE3
2271	AESDEC KEY STATE4
2272	movaps 0x50(TKEYP), KEY
2273	AESDEC KEY STATE1
2274	AESDEC KEY STATE2
2275	AESDEC KEY STATE3
2276	AESDEC KEY STATE4
2277	movaps 0x60(TKEYP), KEY
2278	AESDEC KEY STATE1
2279	AESDEC KEY STATE2
2280	AESDEC KEY STATE3
2281	AESDEC KEY STATE4
2282	movaps 0x70(TKEYP), KEY
2283	AESDECLAST KEY STATE1		# last round
2284	AESDECLAST KEY STATE2
2285	AESDECLAST KEY STATE3
2286	AESDECLAST KEY STATE4
2287	ret
2288ENDPROC(_aesni_dec4)
2289
2290/*
2291 * void aesni_ecb_enc(struct crypto_aes_ctx *ctx, const u8 *dst, u8 *src,
2292 *		      size_t len)
2293 */
2294ENTRY(aesni_ecb_enc)
2295#ifndef __x86_64__
2296	pushl LEN
2297	pushl KEYP
2298	pushl KLEN
2299	movl 16(%esp), KEYP
2300	movl 20(%esp), OUTP
2301	movl 24(%esp), INP
2302	movl 28(%esp), LEN
2303#endif
2304	test LEN, LEN		# check length
2305	jz .Lecb_enc_ret
2306	mov 480(KEYP), KLEN
2307	cmp $16, LEN
2308	jb .Lecb_enc_ret
2309	cmp $64, LEN
2310	jb .Lecb_enc_loop1
2311.align 4
2312.Lecb_enc_loop4:
2313	movups (INP), STATE1
2314	movups 0x10(INP), STATE2
2315	movups 0x20(INP), STATE3
2316	movups 0x30(INP), STATE4
2317	call _aesni_enc4
2318	movups STATE1, (OUTP)
2319	movups STATE2, 0x10(OUTP)
2320	movups STATE3, 0x20(OUTP)
2321	movups STATE4, 0x30(OUTP)
2322	sub $64, LEN
2323	add $64, INP
2324	add $64, OUTP
2325	cmp $64, LEN
2326	jge .Lecb_enc_loop4
2327	cmp $16, LEN
2328	jb .Lecb_enc_ret
2329.align 4
2330.Lecb_enc_loop1:
2331	movups (INP), STATE1
2332	call _aesni_enc1
2333	movups STATE1, (OUTP)
2334	sub $16, LEN
2335	add $16, INP
2336	add $16, OUTP
2337	cmp $16, LEN
2338	jge .Lecb_enc_loop1
2339.Lecb_enc_ret:
2340#ifndef __x86_64__
2341	popl KLEN
2342	popl KEYP
2343	popl LEN
2344#endif
2345	ret
2346ENDPROC(aesni_ecb_enc)
2347
2348/*
2349 * void aesni_ecb_dec(struct crypto_aes_ctx *ctx, const u8 *dst, u8 *src,
2350 *		      size_t len);
2351 */
2352ENTRY(aesni_ecb_dec)
2353#ifndef __x86_64__
2354	pushl LEN
2355	pushl KEYP
2356	pushl KLEN
2357	movl 16(%esp), KEYP
2358	movl 20(%esp), OUTP
2359	movl 24(%esp), INP
2360	movl 28(%esp), LEN
2361#endif
2362	test LEN, LEN
2363	jz .Lecb_dec_ret
2364	mov 480(KEYP), KLEN
2365	add $240, KEYP
2366	cmp $16, LEN
2367	jb .Lecb_dec_ret
2368	cmp $64, LEN
2369	jb .Lecb_dec_loop1
2370.align 4
2371.Lecb_dec_loop4:
2372	movups (INP), STATE1
2373	movups 0x10(INP), STATE2
2374	movups 0x20(INP), STATE3
2375	movups 0x30(INP), STATE4
2376	call _aesni_dec4
2377	movups STATE1, (OUTP)
2378	movups STATE2, 0x10(OUTP)
2379	movups STATE3, 0x20(OUTP)
2380	movups STATE4, 0x30(OUTP)
2381	sub $64, LEN
2382	add $64, INP
2383	add $64, OUTP
2384	cmp $64, LEN
2385	jge .Lecb_dec_loop4
2386	cmp $16, LEN
2387	jb .Lecb_dec_ret
2388.align 4
2389.Lecb_dec_loop1:
2390	movups (INP), STATE1
2391	call _aesni_dec1
2392	movups STATE1, (OUTP)
2393	sub $16, LEN
2394	add $16, INP
2395	add $16, OUTP
2396	cmp $16, LEN
2397	jge .Lecb_dec_loop1
2398.Lecb_dec_ret:
2399#ifndef __x86_64__
2400	popl KLEN
2401	popl KEYP
2402	popl LEN
2403#endif
2404	ret
2405ENDPROC(aesni_ecb_dec)
2406
2407/*
2408 * void aesni_cbc_enc(struct crypto_aes_ctx *ctx, const u8 *dst, u8 *src,
2409 *		      size_t len, u8 *iv)
2410 */
2411ENTRY(aesni_cbc_enc)
2412#ifndef __x86_64__
2413	pushl IVP
2414	pushl LEN
2415	pushl KEYP
2416	pushl KLEN
2417	movl 20(%esp), KEYP
2418	movl 24(%esp), OUTP
2419	movl 28(%esp), INP
2420	movl 32(%esp), LEN
2421	movl 36(%esp), IVP
2422#endif
2423	cmp $16, LEN
2424	jb .Lcbc_enc_ret
2425	mov 480(KEYP), KLEN
2426	movups (IVP), STATE	# load iv as initial state
2427.align 4
2428.Lcbc_enc_loop:
2429	movups (INP), IN	# load input
2430	pxor IN, STATE
2431	call _aesni_enc1
2432	movups STATE, (OUTP)	# store output
2433	sub $16, LEN
2434	add $16, INP
2435	add $16, OUTP
2436	cmp $16, LEN
2437	jge .Lcbc_enc_loop
2438	movups STATE, (IVP)
2439.Lcbc_enc_ret:
2440#ifndef __x86_64__
2441	popl KLEN
2442	popl KEYP
2443	popl LEN
2444	popl IVP
2445#endif
2446	ret
2447ENDPROC(aesni_cbc_enc)
2448
2449/*
2450 * void aesni_cbc_dec(struct crypto_aes_ctx *ctx, const u8 *dst, u8 *src,
2451 *		      size_t len, u8 *iv)
2452 */
2453ENTRY(aesni_cbc_dec)
2454#ifndef __x86_64__
2455	pushl IVP
2456	pushl LEN
2457	pushl KEYP
2458	pushl KLEN
2459	movl 20(%esp), KEYP
2460	movl 24(%esp), OUTP
2461	movl 28(%esp), INP
2462	movl 32(%esp), LEN
2463	movl 36(%esp), IVP
2464#endif
2465	cmp $16, LEN
2466	jb .Lcbc_dec_just_ret
2467	mov 480(KEYP), KLEN
2468	add $240, KEYP
2469	movups (IVP), IV
2470	cmp $64, LEN
2471	jb .Lcbc_dec_loop1
2472.align 4
2473.Lcbc_dec_loop4:
2474	movups (INP), IN1
2475	movaps IN1, STATE1
2476	movups 0x10(INP), IN2
2477	movaps IN2, STATE2
2478#ifdef __x86_64__
2479	movups 0x20(INP), IN3
2480	movaps IN3, STATE3
2481	movups 0x30(INP), IN4
2482	movaps IN4, STATE4
2483#else
2484	movups 0x20(INP), IN1
2485	movaps IN1, STATE3
2486	movups 0x30(INP), IN2
2487	movaps IN2, STATE4
2488#endif
2489	call _aesni_dec4
2490	pxor IV, STATE1
2491#ifdef __x86_64__
2492	pxor IN1, STATE2
2493	pxor IN2, STATE3
2494	pxor IN3, STATE4
2495	movaps IN4, IV
2496#else
2497	pxor IN1, STATE4
2498	movaps IN2, IV
2499	movups (INP), IN1
2500	pxor IN1, STATE2
2501	movups 0x10(INP), IN2
2502	pxor IN2, STATE3
2503#endif
2504	movups STATE1, (OUTP)
2505	movups STATE2, 0x10(OUTP)
2506	movups STATE3, 0x20(OUTP)
2507	movups STATE4, 0x30(OUTP)
2508	sub $64, LEN
2509	add $64, INP
2510	add $64, OUTP
2511	cmp $64, LEN
2512	jge .Lcbc_dec_loop4
2513	cmp $16, LEN
2514	jb .Lcbc_dec_ret
2515.align 4
2516.Lcbc_dec_loop1:
2517	movups (INP), IN
2518	movaps IN, STATE
2519	call _aesni_dec1
2520	pxor IV, STATE
2521	movups STATE, (OUTP)
2522	movaps IN, IV
2523	sub $16, LEN
2524	add $16, INP
2525	add $16, OUTP
2526	cmp $16, LEN
2527	jge .Lcbc_dec_loop1
2528.Lcbc_dec_ret:
2529	movups IV, (IVP)
2530.Lcbc_dec_just_ret:
2531#ifndef __x86_64__
2532	popl KLEN
2533	popl KEYP
2534	popl LEN
2535	popl IVP
2536#endif
2537	ret
2538ENDPROC(aesni_cbc_dec)
2539
2540#ifdef __x86_64__
2541.align 16
2542.Lbswap_mask:
2543	.byte 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
2544
2545/*
2546 * _aesni_inc_init:	internal ABI
2547 *	setup registers used by _aesni_inc
2548 * input:
2549 *	IV
2550 * output:
2551 *	CTR:	== IV, in little endian
2552 *	TCTR_LOW: == lower qword of CTR
2553 *	INC:	== 1, in little endian
2554 *	BSWAP_MASK == endian swapping mask
2555 */
2556.align 4
2557_aesni_inc_init:
2558	movaps .Lbswap_mask, BSWAP_MASK
2559	movaps IV, CTR
2560	PSHUFB_XMM BSWAP_MASK CTR
2561	mov $1, TCTR_LOW
2562	MOVQ_R64_XMM TCTR_LOW INC
2563	MOVQ_R64_XMM CTR TCTR_LOW
2564	ret
2565ENDPROC(_aesni_inc_init)
2566
2567/*
2568 * _aesni_inc:		internal ABI
2569 *	Increase IV by 1, IV is in big endian
2570 * input:
2571 *	IV
2572 *	CTR:	== IV, in little endian
2573 *	TCTR_LOW: == lower qword of CTR
2574 *	INC:	== 1, in little endian
2575 *	BSWAP_MASK == endian swapping mask
2576 * output:
2577 *	IV:	Increase by 1
2578 * changed:
2579 *	CTR:	== output IV, in little endian
2580 *	TCTR_LOW: == lower qword of CTR
2581 */
2582.align 4
2583_aesni_inc:
2584	paddq INC, CTR
2585	add $1, TCTR_LOW
2586	jnc .Linc_low
2587	pslldq $8, INC
2588	paddq INC, CTR
2589	psrldq $8, INC
2590.Linc_low:
2591	movaps CTR, IV
2592	PSHUFB_XMM BSWAP_MASK IV
2593	ret
2594ENDPROC(_aesni_inc)
2595
2596/*
2597 * void aesni_ctr_enc(struct crypto_aes_ctx *ctx, const u8 *dst, u8 *src,
2598 *		      size_t len, u8 *iv)
2599 */
2600ENTRY(aesni_ctr_enc)
2601	cmp $16, LEN
2602	jb .Lctr_enc_just_ret
2603	mov 480(KEYP), KLEN
2604	movups (IVP), IV
2605	call _aesni_inc_init
2606	cmp $64, LEN
2607	jb .Lctr_enc_loop1
2608.align 4
2609.Lctr_enc_loop4:
2610	movaps IV, STATE1
2611	call _aesni_inc
2612	movups (INP), IN1
2613	movaps IV, STATE2
2614	call _aesni_inc
2615	movups 0x10(INP), IN2
2616	movaps IV, STATE3
2617	call _aesni_inc
2618	movups 0x20(INP), IN3
2619	movaps IV, STATE4
2620	call _aesni_inc
2621	movups 0x30(INP), IN4
2622	call _aesni_enc4
2623	pxor IN1, STATE1
2624	movups STATE1, (OUTP)
2625	pxor IN2, STATE2
2626	movups STATE2, 0x10(OUTP)
2627	pxor IN3, STATE3
2628	movups STATE3, 0x20(OUTP)
2629	pxor IN4, STATE4
2630	movups STATE4, 0x30(OUTP)
2631	sub $64, LEN
2632	add $64, INP
2633	add $64, OUTP
2634	cmp $64, LEN
2635	jge .Lctr_enc_loop4
2636	cmp $16, LEN
2637	jb .Lctr_enc_ret
2638.align 4
2639.Lctr_enc_loop1:
2640	movaps IV, STATE
2641	call _aesni_inc
2642	movups (INP), IN
2643	call _aesni_enc1
2644	pxor IN, STATE
2645	movups STATE, (OUTP)
2646	sub $16, LEN
2647	add $16, INP
2648	add $16, OUTP
2649	cmp $16, LEN
2650	jge .Lctr_enc_loop1
2651.Lctr_enc_ret:
2652	movups IV, (IVP)
2653.Lctr_enc_just_ret:
2654	ret
2655ENDPROC(aesni_ctr_enc)
2656
2657/*
2658 * _aesni_gf128mul_x_ble:		internal ABI
2659 *	Multiply in GF(2^128) for XTS IVs
2660 * input:
2661 *	IV:	current IV
2662 *	GF128MUL_MASK == mask with 0x87 and 0x01
2663 * output:
2664 *	IV:	next IV
2665 * changed:
2666 *	CTR:	== temporary value
2667 */
2668#define _aesni_gf128mul_x_ble() \
2669	pshufd $0x13, IV, CTR; \
2670	paddq IV, IV; \
2671	psrad $31, CTR; \
2672	pand GF128MUL_MASK, CTR; \
2673	pxor CTR, IV;
2674
2675/*
2676 * void aesni_xts_crypt8(struct crypto_aes_ctx *ctx, const u8 *dst, u8 *src,
2677 *			 bool enc, u8 *iv)
2678 */
2679ENTRY(aesni_xts_crypt8)
2680	cmpb $0, %cl
2681	movl $0, %ecx
2682	movl $240, %r10d
2683	leaq _aesni_enc4, %r11
2684	leaq _aesni_dec4, %rax
2685	cmovel %r10d, %ecx
2686	cmoveq %rax, %r11
2687
2688	movdqa .Lgf128mul_x_ble_mask, GF128MUL_MASK
2689	movups (IVP), IV
2690
2691	mov 480(KEYP), KLEN
2692	addq %rcx, KEYP
2693
2694	movdqa IV, STATE1
2695	movdqu 0x00(INP), INC
2696	pxor INC, STATE1
2697	movdqu IV, 0x00(OUTP)
2698
2699	_aesni_gf128mul_x_ble()
2700	movdqa IV, STATE2
2701	movdqu 0x10(INP), INC
2702	pxor INC, STATE2
2703	movdqu IV, 0x10(OUTP)
2704
2705	_aesni_gf128mul_x_ble()
2706	movdqa IV, STATE3
2707	movdqu 0x20(INP), INC
2708	pxor INC, STATE3
2709	movdqu IV, 0x20(OUTP)
2710
2711	_aesni_gf128mul_x_ble()
2712	movdqa IV, STATE4
2713	movdqu 0x30(INP), INC
2714	pxor INC, STATE4
2715	movdqu IV, 0x30(OUTP)
2716
2717	call *%r11
2718
2719	movdqu 0x00(OUTP), INC
2720	pxor INC, STATE1
2721	movdqu STATE1, 0x00(OUTP)
2722
2723	_aesni_gf128mul_x_ble()
2724	movdqa IV, STATE1
2725	movdqu 0x40(INP), INC
2726	pxor INC, STATE1
2727	movdqu IV, 0x40(OUTP)
2728
2729	movdqu 0x10(OUTP), INC
2730	pxor INC, STATE2
2731	movdqu STATE2, 0x10(OUTP)
2732
2733	_aesni_gf128mul_x_ble()
2734	movdqa IV, STATE2
2735	movdqu 0x50(INP), INC
2736	pxor INC, STATE2
2737	movdqu IV, 0x50(OUTP)
2738
2739	movdqu 0x20(OUTP), INC
2740	pxor INC, STATE3
2741	movdqu STATE3, 0x20(OUTP)
2742
2743	_aesni_gf128mul_x_ble()
2744	movdqa IV, STATE3
2745	movdqu 0x60(INP), INC
2746	pxor INC, STATE3
2747	movdqu IV, 0x60(OUTP)
2748
2749	movdqu 0x30(OUTP), INC
2750	pxor INC, STATE4
2751	movdqu STATE4, 0x30(OUTP)
2752
2753	_aesni_gf128mul_x_ble()
2754	movdqa IV, STATE4
2755	movdqu 0x70(INP), INC
2756	pxor INC, STATE4
2757	movdqu IV, 0x70(OUTP)
2758
2759	_aesni_gf128mul_x_ble()
2760	movups IV, (IVP)
2761
2762	call *%r11
2763
2764	movdqu 0x40(OUTP), INC
2765	pxor INC, STATE1
2766	movdqu STATE1, 0x40(OUTP)
2767
2768	movdqu 0x50(OUTP), INC
2769	pxor INC, STATE2
2770	movdqu STATE2, 0x50(OUTP)
2771
2772	movdqu 0x60(OUTP), INC
2773	pxor INC, STATE3
2774	movdqu STATE3, 0x60(OUTP)
2775
2776	movdqu 0x70(OUTP), INC
2777	pxor INC, STATE4
2778	movdqu STATE4, 0x70(OUTP)
2779
2780	ret
2781ENDPROC(aesni_xts_crypt8)
2782
2783#endif
2784