]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - arch/x86/crypto/serpent-avx-x86_64-asm_64.S
Merge tag 'for-linus-v3.10-rc1' of git://oss.sgi.com/xfs/xfs
[karo-tx-linux.git] / arch / x86 / crypto / serpent-avx-x86_64-asm_64.S
1 /*
2  * Serpent Cipher 8-way parallel algorithm (x86_64/AVX)
3  *
4  * Copyright (C) 2012 Johannes Goetzfried
5  *     <Johannes.Goetzfried@informatik.stud.uni-erlangen.de>
6  *
7  * Based on arch/x86/crypto/serpent-sse2-x86_64-asm_64.S by
8  *  Copyright (C) 2011 Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
23  * USA
24  *
25  */
26
27 #include <linux/linkage.h>
28 #include "glue_helper-asm-avx.S"
29
30 .file "serpent-avx-x86_64-asm_64.S"
31
32 .data
33 .align 16
34
35 .Lbswap128_mask:
36         .byte 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
37
38 .text
39
40 #define CTX %rdi
41
42 /**********************************************************************
43   8-way AVX serpent
44  **********************************************************************/
45 #define RA1 %xmm0
46 #define RB1 %xmm1
47 #define RC1 %xmm2
48 #define RD1 %xmm3
49 #define RE1 %xmm4
50
51 #define tp  %xmm5
52
53 #define RA2 %xmm6
54 #define RB2 %xmm7
55 #define RC2 %xmm8
56 #define RD2 %xmm9
57 #define RE2 %xmm10
58
59 #define RNOT %xmm11
60
61 #define RK0 %xmm12
62 #define RK1 %xmm13
63 #define RK2 %xmm14
64 #define RK3 %xmm15
65
66
67 #define S0_1(x0, x1, x2, x3, x4)      \
68         vpor            x0,   x3, tp; \
69         vpxor           x3,   x0, x0; \
70         vpxor           x2,   x3, x4; \
71         vpxor           RNOT, x4, x4; \
72         vpxor           x1,   tp, x3; \
73         vpand           x0,   x1, x1; \
74         vpxor           x4,   x1, x1; \
75         vpxor           x0,   x2, x2;
76 #define S0_2(x0, x1, x2, x3, x4)      \
77         vpxor           x3,   x0, x0; \
78         vpor            x0,   x4, x4; \
79         vpxor           x2,   x0, x0; \
80         vpand           x1,   x2, x2; \
81         vpxor           x2,   x3, x3; \
82         vpxor           RNOT, x1, x1; \
83         vpxor           x4,   x2, x2; \
84         vpxor           x2,   x1, x1;
85
86 #define S1_1(x0, x1, x2, x3, x4)      \
87         vpxor           x0,   x1, tp; \
88         vpxor           x3,   x0, x0; \
89         vpxor           RNOT, x3, x3; \
90         vpand           tp,   x1, x4; \
91         vpor            tp,   x0, x0; \
92         vpxor           x2,   x3, x3; \
93         vpxor           x3,   x0, x0; \
94         vpxor           x3,   tp, x1;
95 #define S1_2(x0, x1, x2, x3, x4)      \
96         vpxor           x4,   x3, x3; \
97         vpor            x4,   x1, x1; \
98         vpxor           x2,   x4, x4; \
99         vpand           x0,   x2, x2; \
100         vpxor           x1,   x2, x2; \
101         vpor            x0,   x1, x1; \
102         vpxor           RNOT, x0, x0; \
103         vpxor           x2,   x0, x0; \
104         vpxor           x1,   x4, x4;
105
106 #define S2_1(x0, x1, x2, x3, x4)      \
107         vpxor           RNOT, x3, x3; \
108         vpxor           x0,   x1, x1; \
109         vpand           x2,   x0, tp; \
110         vpxor           x3,   tp, tp; \
111         vpor            x0,   x3, x3; \
112         vpxor           x1,   x2, x2; \
113         vpxor           x1,   x3, x3; \
114         vpand           tp,   x1, x1;
115 #define S2_2(x0, x1, x2, x3, x4)      \
116         vpxor           x2,   tp, tp; \
117         vpand           x3,   x2, x2; \
118         vpor            x1,   x3, x3; \
119         vpxor           RNOT, tp, tp; \
120         vpxor           tp,   x3, x3; \
121         vpxor           tp,   x0, x4; \
122         vpxor           x2,   tp, x0; \
123         vpor            x2,   x1, x1;
124
125 #define S3_1(x0, x1, x2, x3, x4)      \
126         vpxor           x3,   x1, tp; \
127         vpor            x0,   x3, x3; \
128         vpand           x0,   x1, x4; \
129         vpxor           x2,   x0, x0; \
130         vpxor           tp,   x2, x2; \
131         vpand           x3,   tp, x1; \
132         vpxor           x3,   x2, x2; \
133         vpor            x4,   x0, x0; \
134         vpxor           x3,   x4, x4;
135 #define S3_2(x0, x1, x2, x3, x4)      \
136         vpxor           x0,   x1, x1; \
137         vpand           x3,   x0, x0; \
138         vpand           x4,   x3, x3; \
139         vpxor           x2,   x3, x3; \
140         vpor            x1,   x4, x4; \
141         vpand           x1,   x2, x2; \
142         vpxor           x3,   x4, x4; \
143         vpxor           x3,   x0, x0; \
144         vpxor           x2,   x3, x3;
145
146 #define S4_1(x0, x1, x2, x3, x4)      \
147         vpand           x0,   x3, tp; \
148         vpxor           x3,   x0, x0; \
149         vpxor           x2,   tp, tp; \
150         vpor            x3,   x2, x2; \
151         vpxor           x1,   x0, x0; \
152         vpxor           tp,   x3, x4; \
153         vpor            x0,   x2, x2; \
154         vpxor           x1,   x2, x2;
155 #define S4_2(x0, x1, x2, x3, x4)      \
156         vpand           x0,   x1, x1; \
157         vpxor           x4,   x1, x1; \
158         vpand           x2,   x4, x4; \
159         vpxor           tp,   x2, x2; \
160         vpxor           x0,   x4, x4; \
161         vpor            x1,   tp, x3; \
162         vpxor           RNOT, x1, x1; \
163         vpxor           x0,   x3, x3;
164
165 #define S5_1(x0, x1, x2, x3, x4)      \
166         vpor            x0,   x1, tp; \
167         vpxor           tp,   x2, x2; \
168         vpxor           RNOT, x3, x3; \
169         vpxor           x0,   x1, x4; \
170         vpxor           x2,   x0, x0; \
171         vpand           x4,   tp, x1; \
172         vpor            x3,   x4, x4; \
173         vpxor           x0,   x4, x4;
174 #define S5_2(x0, x1, x2, x3, x4)      \
175         vpand           x3,   x0, x0; \
176         vpxor           x3,   x1, x1; \
177         vpxor           x2,   x3, x3; \
178         vpxor           x1,   x0, x0; \
179         vpand           x4,   x2, x2; \
180         vpxor           x2,   x1, x1; \
181         vpand           x0,   x2, x2; \
182         vpxor           x2,   x3, x3;
183
184 #define S6_1(x0, x1, x2, x3, x4)      \
185         vpxor           x0,   x3, x3; \
186         vpxor           x2,   x1, tp; \
187         vpxor           x0,   x2, x2; \
188         vpand           x3,   x0, x0; \
189         vpor            x3,   tp, tp; \
190         vpxor           RNOT, x1, x4; \
191         vpxor           tp,   x0, x0; \
192         vpxor           x2,   tp, x1;
193 #define S6_2(x0, x1, x2, x3, x4)      \
194         vpxor           x4,   x3, x3; \
195         vpxor           x0,   x4, x4; \
196         vpand           x0,   x2, x2; \
197         vpxor           x1,   x4, x4; \
198         vpxor           x3,   x2, x2; \
199         vpand           x1,   x3, x3; \
200         vpxor           x0,   x3, x3; \
201         vpxor           x2,   x1, x1;
202
203 #define S7_1(x0, x1, x2, x3, x4)      \
204         vpxor           RNOT, x1, tp; \
205         vpxor           RNOT, x0, x0; \
206         vpand           x2,   tp, x1; \
207         vpxor           x3,   x1, x1; \
208         vpor            tp,   x3, x3; \
209         vpxor           x2,   tp, x4; \
210         vpxor           x3,   x2, x2; \
211         vpxor           x0,   x3, x3; \
212         vpor            x1,   x0, x0;
213 #define S7_2(x0, x1, x2, x3, x4)      \
214         vpand           x0,   x2, x2; \
215         vpxor           x4,   x0, x0; \
216         vpxor           x3,   x4, x4; \
217         vpand           x0,   x3, x3; \
218         vpxor           x1,   x4, x4; \
219         vpxor           x4,   x2, x2; \
220         vpxor           x1,   x3, x3; \
221         vpor            x0,   x4, x4; \
222         vpxor           x1,   x4, x4;
223
224 #define SI0_1(x0, x1, x2, x3, x4)     \
225         vpxor           x0,   x1, x1; \
226         vpor            x1,   x3, tp; \
227         vpxor           x1,   x3, x4; \
228         vpxor           RNOT, x0, x0; \
229         vpxor           tp,   x2, x2; \
230         vpxor           x0,   tp, x3; \
231         vpand           x1,   x0, x0; \
232         vpxor           x2,   x0, x0;
233 #define SI0_2(x0, x1, x2, x3, x4)     \
234         vpand           x3,   x2, x2; \
235         vpxor           x4,   x3, x3; \
236         vpxor           x3,   x2, x2; \
237         vpxor           x3,   x1, x1; \
238         vpand           x0,   x3, x3; \
239         vpxor           x0,   x1, x1; \
240         vpxor           x2,   x0, x0; \
241         vpxor           x3,   x4, x4;
242
243 #define SI1_1(x0, x1, x2, x3, x4)     \
244         vpxor           x3,   x1, x1; \
245         vpxor           x2,   x0, tp; \
246         vpxor           RNOT, x2, x2; \
247         vpor            x1,   x0, x4; \
248         vpxor           x3,   x4, x4; \
249         vpand           x1,   x3, x3; \
250         vpxor           x2,   x1, x1; \
251         vpand           x4,   x2, x2;
252 #define SI1_2(x0, x1, x2, x3, x4)     \
253         vpxor           x1,   x4, x4; \
254         vpor            x3,   x1, x1; \
255         vpxor           tp,   x3, x3; \
256         vpxor           tp,   x2, x2; \
257         vpor            x4,   tp, x0; \
258         vpxor           x4,   x2, x2; \
259         vpxor           x0,   x1, x1; \
260         vpxor           x1,   x4, x4;
261
262 #define SI2_1(x0, x1, x2, x3, x4)     \
263         vpxor           x1,   x2, x2; \
264         vpxor           RNOT, x3, tp; \
265         vpor            x2,   tp, tp; \
266         vpxor           x3,   x2, x2; \
267         vpxor           x0,   x3, x4; \
268         vpxor           x1,   tp, x3; \
269         vpor            x2,   x1, x1; \
270         vpxor           x0,   x2, x2;
271 #define SI2_2(x0, x1, x2, x3, x4)     \
272         vpxor           x4,   x1, x1; \
273         vpor            x3,   x4, x4; \
274         vpxor           x3,   x2, x2; \
275         vpxor           x2,   x4, x4; \
276         vpand           x1,   x2, x2; \
277         vpxor           x3,   x2, x2; \
278         vpxor           x4,   x3, x3; \
279         vpxor           x0,   x4, x4;
280
281 #define SI3_1(x0, x1, x2, x3, x4)     \
282         vpxor           x1,   x2, x2; \
283         vpand           x2,   x1, tp; \
284         vpxor           x0,   tp, tp; \
285         vpor            x1,   x0, x0; \
286         vpxor           x3,   x1, x4; \
287         vpxor           x3,   x0, x0; \
288         vpor            tp,   x3, x3; \
289         vpxor           x2,   tp, x1;
290 #define SI3_2(x0, x1, x2, x3, x4)     \
291         vpxor           x3,   x1, x1; \
292         vpxor           x2,   x0, x0; \
293         vpxor           x3,   x2, x2; \
294         vpand           x1,   x3, x3; \
295         vpxor           x0,   x1, x1; \
296         vpand           x2,   x0, x0; \
297         vpxor           x3,   x4, x4; \
298         vpxor           x0,   x3, x3; \
299         vpxor           x1,   x0, x0;
300
301 #define SI4_1(x0, x1, x2, x3, x4)     \
302         vpxor           x3,   x2, x2; \
303         vpand           x1,   x0, tp; \
304         vpxor           x2,   tp, tp; \
305         vpor            x3,   x2, x2; \
306         vpxor           RNOT, x0, x4; \
307         vpxor           tp,   x1, x1; \
308         vpxor           x2,   tp, x0; \
309         vpand           x4,   x2, x2;
310 #define SI4_2(x0, x1, x2, x3, x4)     \
311         vpxor           x0,   x2, x2; \
312         vpor            x4,   x0, x0; \
313         vpxor           x3,   x0, x0; \
314         vpand           x2,   x3, x3; \
315         vpxor           x3,   x4, x4; \
316         vpxor           x1,   x3, x3; \
317         vpand           x0,   x1, x1; \
318         vpxor           x1,   x4, x4; \
319         vpxor           x3,   x0, x0;
320
321 #define SI5_1(x0, x1, x2, x3, x4)     \
322         vpor            x2,   x1, tp; \
323         vpxor           x1,   x2, x2; \
324         vpxor           x3,   tp, tp; \
325         vpand           x1,   x3, x3; \
326         vpxor           x3,   x2, x2; \
327         vpor            x0,   x3, x3; \
328         vpxor           RNOT, x0, x0; \
329         vpxor           x2,   x3, x3; \
330         vpor            x0,   x2, x2;
331 #define SI5_2(x0, x1, x2, x3, x4)     \
332         vpxor           tp,   x1, x4; \
333         vpxor           x4,   x2, x2; \
334         vpand           x0,   x4, x4; \
335         vpxor           tp,   x0, x0; \
336         vpxor           x3,   tp, x1; \
337         vpand           x2,   x0, x0; \
338         vpxor           x3,   x2, x2; \
339         vpxor           x2,   x0, x0; \
340         vpxor           x4,   x2, x2; \
341         vpxor           x3,   x4, x4;
342
343 #define SI6_1(x0, x1, x2, x3, x4)     \
344         vpxor           x2,   x0, x0; \
345         vpand           x3,   x0, tp; \
346         vpxor           x3,   x2, x2; \
347         vpxor           x2,   tp, tp; \
348         vpxor           x1,   x3, x3; \
349         vpor            x0,   x2, x2; \
350         vpxor           x3,   x2, x2; \
351         vpand           tp,   x3, x3;
352 #define SI6_2(x0, x1, x2, x3, x4)     \
353         vpxor           RNOT, tp, tp; \
354         vpxor           x1,   x3, x3; \
355         vpand           x2,   x1, x1; \
356         vpxor           tp,   x0, x4; \
357         vpxor           x4,   x3, x3; \
358         vpxor           x2,   x4, x4; \
359         vpxor           x1,   tp, x0; \
360         vpxor           x0,   x2, x2;
361
362 #define SI7_1(x0, x1, x2, x3, x4)     \
363         vpand           x0,   x3, tp; \
364         vpxor           x2,   x0, x0; \
365         vpor            x3,   x2, x2; \
366         vpxor           x1,   x3, x4; \
367         vpxor           RNOT, x0, x0; \
368         vpor            tp,   x1, x1; \
369         vpxor           x0,   x4, x4; \
370         vpand           x2,   x0, x0; \
371         vpxor           x1,   x0, x0;
372 #define SI7_2(x0, x1, x2, x3, x4)     \
373         vpand           x2,   x1, x1; \
374         vpxor           x2,   tp, x3; \
375         vpxor           x3,   x4, x4; \
376         vpand           x3,   x2, x2; \
377         vpor            x0,   x3, x3; \
378         vpxor           x4,   x1, x1; \
379         vpxor           x4,   x3, x3; \
380         vpand           x0,   x4, x4; \
381         vpxor           x2,   x4, x4;
382
383 #define get_key(i, j, t) \
384         vbroadcastss (4*(i)+(j))*4(CTX), t;
385
386 #define K2(x0, x1, x2, x3, x4, i) \
387         get_key(i, 0, RK0); \
388         get_key(i, 1, RK1); \
389         get_key(i, 2, RK2); \
390         get_key(i, 3, RK3); \
391         vpxor RK0,      x0 ## 1, x0 ## 1; \
392         vpxor RK1,      x1 ## 1, x1 ## 1; \
393         vpxor RK2,      x2 ## 1, x2 ## 1; \
394         vpxor RK3,      x3 ## 1, x3 ## 1; \
395                 vpxor RK0,      x0 ## 2, x0 ## 2; \
396                 vpxor RK1,      x1 ## 2, x1 ## 2; \
397                 vpxor RK2,      x2 ## 2, x2 ## 2; \
398                 vpxor RK3,      x3 ## 2, x3 ## 2;
399
400 #define LK2(x0, x1, x2, x3, x4, i) \
401         vpslld $13,             x0 ## 1, x4 ## 1;          \
402         vpsrld $(32 - 13),      x0 ## 1, x0 ## 1;          \
403         vpor                    x4 ## 1, x0 ## 1, x0 ## 1; \
404         vpxor                   x0 ## 1, x1 ## 1, x1 ## 1; \
405         vpslld $3,              x2 ## 1, x4 ## 1;          \
406         vpsrld $(32 - 3),       x2 ## 1, x2 ## 1;          \
407         vpor                    x4 ## 1, x2 ## 1, x2 ## 1; \
408         vpxor                   x2 ## 1, x1 ## 1, x1 ## 1; \
409                 vpslld $13,             x0 ## 2, x4 ## 2;          \
410                 vpsrld $(32 - 13),      x0 ## 2, x0 ## 2;          \
411                 vpor                    x4 ## 2, x0 ## 2, x0 ## 2; \
412                 vpxor                   x0 ## 2, x1 ## 2, x1 ## 2; \
413                 vpslld $3,              x2 ## 2, x4 ## 2;          \
414                 vpsrld $(32 - 3),       x2 ## 2, x2 ## 2;          \
415                 vpor                    x4 ## 2, x2 ## 2, x2 ## 2; \
416                 vpxor                   x2 ## 2, x1 ## 2, x1 ## 2; \
417         vpslld $1,              x1 ## 1, x4 ## 1;          \
418         vpsrld $(32 - 1),       x1 ## 1, x1 ## 1;          \
419         vpor                    x4 ## 1, x1 ## 1, x1 ## 1; \
420         vpslld $3,              x0 ## 1, x4 ## 1;          \
421         vpxor                   x2 ## 1, x3 ## 1, x3 ## 1; \
422         vpxor                   x4 ## 1, x3 ## 1, x3 ## 1; \
423         get_key(i, 1, RK1); \
424                 vpslld $1,              x1 ## 2, x4 ## 2;          \
425                 vpsrld $(32 - 1),       x1 ## 2, x1 ## 2;          \
426                 vpor                    x4 ## 2, x1 ## 2, x1 ## 2; \
427                 vpslld $3,              x0 ## 2, x4 ## 2;          \
428                 vpxor                   x2 ## 2, x3 ## 2, x3 ## 2; \
429                 vpxor                   x4 ## 2, x3 ## 2, x3 ## 2; \
430                 get_key(i, 3, RK3); \
431         vpslld $7,              x3 ## 1, x4 ## 1;          \
432         vpsrld $(32 - 7),       x3 ## 1, x3 ## 1;          \
433         vpor                    x4 ## 1, x3 ## 1, x3 ## 1; \
434         vpslld $7,              x1 ## 1, x4 ## 1;          \
435         vpxor                   x1 ## 1, x0 ## 1, x0 ## 1; \
436         vpxor                   x3 ## 1, x0 ## 1, x0 ## 1; \
437         vpxor                   x3 ## 1, x2 ## 1, x2 ## 1; \
438         vpxor                   x4 ## 1, x2 ## 1, x2 ## 1; \
439         get_key(i, 0, RK0); \
440                 vpslld $7,              x3 ## 2, x4 ## 2;          \
441                 vpsrld $(32 - 7),       x3 ## 2, x3 ## 2;          \
442                 vpor                    x4 ## 2, x3 ## 2, x3 ## 2; \
443                 vpslld $7,              x1 ## 2, x4 ## 2;          \
444                 vpxor                   x1 ## 2, x0 ## 2, x0 ## 2; \
445                 vpxor                   x3 ## 2, x0 ## 2, x0 ## 2; \
446                 vpxor                   x3 ## 2, x2 ## 2, x2 ## 2; \
447                 vpxor                   x4 ## 2, x2 ## 2, x2 ## 2; \
448                 get_key(i, 2, RK2); \
449         vpxor                   RK1, x1 ## 1, x1 ## 1;     \
450         vpxor                   RK3, x3 ## 1, x3 ## 1;     \
451         vpslld $5,              x0 ## 1, x4 ## 1;          \
452         vpsrld $(32 - 5),       x0 ## 1, x0 ## 1;          \
453         vpor                    x4 ## 1, x0 ## 1, x0 ## 1; \
454         vpslld $22,             x2 ## 1, x4 ## 1;          \
455         vpsrld $(32 - 22),      x2 ## 1, x2 ## 1;          \
456         vpor                    x4 ## 1, x2 ## 1, x2 ## 1; \
457         vpxor                   RK0, x0 ## 1, x0 ## 1;     \
458         vpxor                   RK2, x2 ## 1, x2 ## 1;     \
459                 vpxor                   RK1, x1 ## 2, x1 ## 2;     \
460                 vpxor                   RK3, x3 ## 2, x3 ## 2;     \
461                 vpslld $5,              x0 ## 2, x4 ## 2;          \
462                 vpsrld $(32 - 5),       x0 ## 2, x0 ## 2;          \
463                 vpor                    x4 ## 2, x0 ## 2, x0 ## 2; \
464                 vpslld $22,             x2 ## 2, x4 ## 2;          \
465                 vpsrld $(32 - 22),      x2 ## 2, x2 ## 2;          \
466                 vpor                    x4 ## 2, x2 ## 2, x2 ## 2; \
467                 vpxor                   RK0, x0 ## 2, x0 ## 2;     \
468                 vpxor                   RK2, x2 ## 2, x2 ## 2;
469
470 #define KL2(x0, x1, x2, x3, x4, i) \
471         vpxor                   RK0, x0 ## 1, x0 ## 1;     \
472         vpxor                   RK2, x2 ## 1, x2 ## 1;     \
473         vpsrld $5,              x0 ## 1, x4 ## 1;          \
474         vpslld $(32 - 5),       x0 ## 1, x0 ## 1;          \
475         vpor                    x4 ## 1, x0 ## 1, x0 ## 1; \
476         vpxor                   RK3, x3 ## 1, x3 ## 1;     \
477         vpxor                   RK1, x1 ## 1, x1 ## 1;     \
478         vpsrld $22,             x2 ## 1, x4 ## 1;          \
479         vpslld $(32 - 22),      x2 ## 1, x2 ## 1;          \
480         vpor                    x4 ## 1, x2 ## 1, x2 ## 1; \
481         vpxor                   x3 ## 1, x2 ## 1, x2 ## 1; \
482                 vpxor                   RK0, x0 ## 2, x0 ## 2;     \
483                 vpxor                   RK2, x2 ## 2, x2 ## 2;     \
484                 vpsrld $5,              x0 ## 2, x4 ## 2;          \
485                 vpslld $(32 - 5),       x0 ## 2, x0 ## 2;          \
486                 vpor                    x4 ## 2, x0 ## 2, x0 ## 2; \
487                 vpxor                   RK3, x3 ## 2, x3 ## 2;     \
488                 vpxor                   RK1, x1 ## 2, x1 ## 2;     \
489                 vpsrld $22,             x2 ## 2, x4 ## 2;          \
490                 vpslld $(32 - 22),      x2 ## 2, x2 ## 2;          \
491                 vpor                    x4 ## 2, x2 ## 2, x2 ## 2; \
492                 vpxor                   x3 ## 2, x2 ## 2, x2 ## 2; \
493         vpxor                   x3 ## 1, x0 ## 1, x0 ## 1; \
494         vpslld $7,              x1 ## 1, x4 ## 1;          \
495         vpxor                   x1 ## 1, x0 ## 1, x0 ## 1; \
496         vpxor                   x4 ## 1, x2 ## 1, x2 ## 1; \
497         vpsrld $1,              x1 ## 1, x4 ## 1;          \
498         vpslld $(32 - 1),       x1 ## 1, x1 ## 1;          \
499         vpor                    x4 ## 1, x1 ## 1, x1 ## 1; \
500                 vpxor                   x3 ## 2, x0 ## 2, x0 ## 2; \
501                 vpslld $7,              x1 ## 2, x4 ## 2;          \
502                 vpxor                   x1 ## 2, x0 ## 2, x0 ## 2; \
503                 vpxor                   x4 ## 2, x2 ## 2, x2 ## 2; \
504                 vpsrld $1,              x1 ## 2, x4 ## 2;          \
505                 vpslld $(32 - 1),       x1 ## 2, x1 ## 2;          \
506                 vpor                    x4 ## 2, x1 ## 2, x1 ## 2; \
507         vpsrld $7,              x3 ## 1, x4 ## 1;          \
508         vpslld $(32 - 7),       x3 ## 1, x3 ## 1;          \
509         vpor                    x4 ## 1, x3 ## 1, x3 ## 1; \
510         vpxor                   x0 ## 1, x1 ## 1, x1 ## 1; \
511         vpslld $3,              x0 ## 1, x4 ## 1;          \
512         vpxor                   x4 ## 1, x3 ## 1, x3 ## 1; \
513                 vpsrld $7,              x3 ## 2, x4 ## 2;          \
514                 vpslld $(32 - 7),       x3 ## 2, x3 ## 2;          \
515                 vpor                    x4 ## 2, x3 ## 2, x3 ## 2; \
516                 vpxor                   x0 ## 2, x1 ## 2, x1 ## 2; \
517                 vpslld $3,              x0 ## 2, x4 ## 2;          \
518                 vpxor                   x4 ## 2, x3 ## 2, x3 ## 2; \
519         vpsrld $13,             x0 ## 1, x4 ## 1;          \
520         vpslld $(32 - 13),      x0 ## 1, x0 ## 1;          \
521         vpor                    x4 ## 1, x0 ## 1, x0 ## 1; \
522         vpxor                   x2 ## 1, x1 ## 1, x1 ## 1; \
523         vpxor                   x2 ## 1, x3 ## 1, x3 ## 1; \
524         vpsrld $3,              x2 ## 1, x4 ## 1;          \
525         vpslld $(32 - 3),       x2 ## 1, x2 ## 1;          \
526         vpor                    x4 ## 1, x2 ## 1, x2 ## 1; \
527                 vpsrld $13,             x0 ## 2, x4 ## 2;          \
528                 vpslld $(32 - 13),      x0 ## 2, x0 ## 2;          \
529                 vpor                    x4 ## 2, x0 ## 2, x0 ## 2; \
530                 vpxor                   x2 ## 2, x1 ## 2, x1 ## 2; \
531                 vpxor                   x2 ## 2, x3 ## 2, x3 ## 2; \
532                 vpsrld $3,              x2 ## 2, x4 ## 2;          \
533                 vpslld $(32 - 3),       x2 ## 2, x2 ## 2;          \
534                 vpor                    x4 ## 2, x2 ## 2, x2 ## 2;
535
536 #define S(SBOX, x0, x1, x2, x3, x4) \
537         SBOX ## _1(x0 ## 1, x1 ## 1, x2 ## 1, x3 ## 1, x4 ## 1); \
538         SBOX ## _2(x0 ## 1, x1 ## 1, x2 ## 1, x3 ## 1, x4 ## 1); \
539         SBOX ## _1(x0 ## 2, x1 ## 2, x2 ## 2, x3 ## 2, x4 ## 2); \
540         SBOX ## _2(x0 ## 2, x1 ## 2, x2 ## 2, x3 ## 2, x4 ## 2);
541
542 #define SP(SBOX, x0, x1, x2, x3, x4, i) \
543         get_key(i, 0, RK0); \
544         SBOX ## _1(x0 ## 1, x1 ## 1, x2 ## 1, x3 ## 1, x4 ## 1); \
545         get_key(i, 2, RK2); \
546         SBOX ## _2(x0 ## 1, x1 ## 1, x2 ## 1, x3 ## 1, x4 ## 1); \
547         get_key(i, 3, RK3); \
548         SBOX ## _1(x0 ## 2, x1 ## 2, x2 ## 2, x3 ## 2, x4 ## 2); \
549         get_key(i, 1, RK1); \
550         SBOX ## _2(x0 ## 2, x1 ## 2, x2 ## 2, x3 ## 2, x4 ## 2); \
551
552 #define transpose_4x4(x0, x1, x2, x3, t0, t1, t2) \
553         vpunpckldq              x1, x0, t0; \
554         vpunpckhdq              x1, x0, t2; \
555         vpunpckldq              x3, x2, t1; \
556         vpunpckhdq              x3, x2, x3; \
557         \
558         vpunpcklqdq             t1, t0, x0; \
559         vpunpckhqdq             t1, t0, x1; \
560         vpunpcklqdq             x3, t2, x2; \
561         vpunpckhqdq             x3, t2, x3;
562
563 #define read_blocks(x0, x1, x2, x3, t0, t1, t2) \
564         transpose_4x4(x0, x1, x2, x3, t0, t1, t2)
565
566 #define write_blocks(x0, x1, x2, x3, t0, t1, t2) \
567         transpose_4x4(x0, x1, x2, x3, t0, t1, t2)
568
569 .align 8
570 __serpent_enc_blk8_avx:
571         /* input:
572          *      %rdi: ctx, CTX
573          *      RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2: blocks
574          * output:
575          *      RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2: encrypted blocks
576          */
577
578         vpcmpeqd RNOT, RNOT, RNOT;
579
580         read_blocks(RA1, RB1, RC1, RD1, RK0, RK1, RK2);
581         read_blocks(RA2, RB2, RC2, RD2, RK0, RK1, RK2);
582
583                                                  K2(RA, RB, RC, RD, RE, 0);
584         S(S0, RA, RB, RC, RD, RE);              LK2(RC, RB, RD, RA, RE, 1);
585         S(S1, RC, RB, RD, RA, RE);              LK2(RE, RD, RA, RC, RB, 2);
586         S(S2, RE, RD, RA, RC, RB);              LK2(RB, RD, RE, RC, RA, 3);
587         S(S3, RB, RD, RE, RC, RA);              LK2(RC, RA, RD, RB, RE, 4);
588         S(S4, RC, RA, RD, RB, RE);              LK2(RA, RD, RB, RE, RC, 5);
589         S(S5, RA, RD, RB, RE, RC);              LK2(RC, RA, RD, RE, RB, 6);
590         S(S6, RC, RA, RD, RE, RB);              LK2(RD, RB, RA, RE, RC, 7);
591         S(S7, RD, RB, RA, RE, RC);              LK2(RC, RA, RE, RD, RB, 8);
592         S(S0, RC, RA, RE, RD, RB);              LK2(RE, RA, RD, RC, RB, 9);
593         S(S1, RE, RA, RD, RC, RB);              LK2(RB, RD, RC, RE, RA, 10);
594         S(S2, RB, RD, RC, RE, RA);              LK2(RA, RD, RB, RE, RC, 11);
595         S(S3, RA, RD, RB, RE, RC);              LK2(RE, RC, RD, RA, RB, 12);
596         S(S4, RE, RC, RD, RA, RB);              LK2(RC, RD, RA, RB, RE, 13);
597         S(S5, RC, RD, RA, RB, RE);              LK2(RE, RC, RD, RB, RA, 14);
598         S(S6, RE, RC, RD, RB, RA);              LK2(RD, RA, RC, RB, RE, 15);
599         S(S7, RD, RA, RC, RB, RE);              LK2(RE, RC, RB, RD, RA, 16);
600         S(S0, RE, RC, RB, RD, RA);              LK2(RB, RC, RD, RE, RA, 17);
601         S(S1, RB, RC, RD, RE, RA);              LK2(RA, RD, RE, RB, RC, 18);
602         S(S2, RA, RD, RE, RB, RC);              LK2(RC, RD, RA, RB, RE, 19);
603         S(S3, RC, RD, RA, RB, RE);              LK2(RB, RE, RD, RC, RA, 20);
604         S(S4, RB, RE, RD, RC, RA);              LK2(RE, RD, RC, RA, RB, 21);
605         S(S5, RE, RD, RC, RA, RB);              LK2(RB, RE, RD, RA, RC, 22);
606         S(S6, RB, RE, RD, RA, RC);              LK2(RD, RC, RE, RA, RB, 23);
607         S(S7, RD, RC, RE, RA, RB);              LK2(RB, RE, RA, RD, RC, 24);
608         S(S0, RB, RE, RA, RD, RC);              LK2(RA, RE, RD, RB, RC, 25);
609         S(S1, RA, RE, RD, RB, RC);              LK2(RC, RD, RB, RA, RE, 26);
610         S(S2, RC, RD, RB, RA, RE);              LK2(RE, RD, RC, RA, RB, 27);
611         S(S3, RE, RD, RC, RA, RB);              LK2(RA, RB, RD, RE, RC, 28);
612         S(S4, RA, RB, RD, RE, RC);              LK2(RB, RD, RE, RC, RA, 29);
613         S(S5, RB, RD, RE, RC, RA);              LK2(RA, RB, RD, RC, RE, 30);
614         S(S6, RA, RB, RD, RC, RE);              LK2(RD, RE, RB, RC, RA, 31);
615         S(S7, RD, RE, RB, RC, RA);               K2(RA, RB, RC, RD, RE, 32);
616
617         write_blocks(RA1, RB1, RC1, RD1, RK0, RK1, RK2);
618         write_blocks(RA2, RB2, RC2, RD2, RK0, RK1, RK2);
619
620         ret;
621 ENDPROC(__serpent_enc_blk8_avx)
622
623 .align 8
624 __serpent_dec_blk8_avx:
625         /* input:
626          *      %rdi: ctx, CTX
627          *      RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2: encrypted blocks
628          * output:
629          *      RC1, RD1, RB1, RE1, RC2, RD2, RB2, RE2: decrypted blocks
630          */
631
632         vpcmpeqd RNOT, RNOT, RNOT;
633
634         read_blocks(RA1, RB1, RC1, RD1, RK0, RK1, RK2);
635         read_blocks(RA2, RB2, RC2, RD2, RK0, RK1, RK2);
636
637                                                  K2(RA, RB, RC, RD, RE, 32);
638         SP(SI7, RA, RB, RC, RD, RE, 31);        KL2(RB, RD, RA, RE, RC, 31);
639         SP(SI6, RB, RD, RA, RE, RC, 30);        KL2(RA, RC, RE, RB, RD, 30);
640         SP(SI5, RA, RC, RE, RB, RD, 29);        KL2(RC, RD, RA, RE, RB, 29);
641         SP(SI4, RC, RD, RA, RE, RB, 28);        KL2(RC, RA, RB, RE, RD, 28);
642         SP(SI3, RC, RA, RB, RE, RD, 27);        KL2(RB, RC, RD, RE, RA, 27);
643         SP(SI2, RB, RC, RD, RE, RA, 26);        KL2(RC, RA, RE, RD, RB, 26);
644         SP(SI1, RC, RA, RE, RD, RB, 25);        KL2(RB, RA, RE, RD, RC, 25);
645         SP(SI0, RB, RA, RE, RD, RC, 24);        KL2(RE, RC, RA, RB, RD, 24);
646         SP(SI7, RE, RC, RA, RB, RD, 23);        KL2(RC, RB, RE, RD, RA, 23);
647         SP(SI6, RC, RB, RE, RD, RA, 22);        KL2(RE, RA, RD, RC, RB, 22);
648         SP(SI5, RE, RA, RD, RC, RB, 21);        KL2(RA, RB, RE, RD, RC, 21);
649         SP(SI4, RA, RB, RE, RD, RC, 20);        KL2(RA, RE, RC, RD, RB, 20);
650         SP(SI3, RA, RE, RC, RD, RB, 19);        KL2(RC, RA, RB, RD, RE, 19);
651         SP(SI2, RC, RA, RB, RD, RE, 18);        KL2(RA, RE, RD, RB, RC, 18);
652         SP(SI1, RA, RE, RD, RB, RC, 17);        KL2(RC, RE, RD, RB, RA, 17);
653         SP(SI0, RC, RE, RD, RB, RA, 16);        KL2(RD, RA, RE, RC, RB, 16);
654         SP(SI7, RD, RA, RE, RC, RB, 15);        KL2(RA, RC, RD, RB, RE, 15);
655         SP(SI6, RA, RC, RD, RB, RE, 14);        KL2(RD, RE, RB, RA, RC, 14);
656         SP(SI5, RD, RE, RB, RA, RC, 13);        KL2(RE, RC, RD, RB, RA, 13);
657         SP(SI4, RE, RC, RD, RB, RA, 12);        KL2(RE, RD, RA, RB, RC, 12);
658         SP(SI3, RE, RD, RA, RB, RC, 11);        KL2(RA, RE, RC, RB, RD, 11);
659         SP(SI2, RA, RE, RC, RB, RD, 10);        KL2(RE, RD, RB, RC, RA, 10);
660         SP(SI1, RE, RD, RB, RC, RA, 9);         KL2(RA, RD, RB, RC, RE, 9);
661         SP(SI0, RA, RD, RB, RC, RE, 8);         KL2(RB, RE, RD, RA, RC, 8);
662         SP(SI7, RB, RE, RD, RA, RC, 7);         KL2(RE, RA, RB, RC, RD, 7);
663         SP(SI6, RE, RA, RB, RC, RD, 6);         KL2(RB, RD, RC, RE, RA, 6);
664         SP(SI5, RB, RD, RC, RE, RA, 5);         KL2(RD, RA, RB, RC, RE, 5);
665         SP(SI4, RD, RA, RB, RC, RE, 4);         KL2(RD, RB, RE, RC, RA, 4);
666         SP(SI3, RD, RB, RE, RC, RA, 3);         KL2(RE, RD, RA, RC, RB, 3);
667         SP(SI2, RE, RD, RA, RC, RB, 2);         KL2(RD, RB, RC, RA, RE, 2);
668         SP(SI1, RD, RB, RC, RA, RE, 1);         KL2(RE, RB, RC, RA, RD, 1);
669         S(SI0, RE, RB, RC, RA, RD);              K2(RC, RD, RB, RE, RA, 0);
670
671         write_blocks(RC1, RD1, RB1, RE1, RK0, RK1, RK2);
672         write_blocks(RC2, RD2, RB2, RE2, RK0, RK1, RK2);
673
674         ret;
675 ENDPROC(__serpent_dec_blk8_avx)
676
677 ENTRY(serpent_ecb_enc_8way_avx)
678         /* input:
679          *      %rdi: ctx, CTX
680          *      %rsi: dst
681          *      %rdx: src
682          */
683
684         load_8way(%rdx, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2);
685
686         call __serpent_enc_blk8_avx;
687
688         store_8way(%rsi, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2);
689
690         ret;
691 ENDPROC(serpent_ecb_enc_8way_avx)
692
693 ENTRY(serpent_ecb_dec_8way_avx)
694         /* input:
695          *      %rdi: ctx, CTX
696          *      %rsi: dst
697          *      %rdx: src
698          */
699
700         load_8way(%rdx, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2);
701
702         call __serpent_dec_blk8_avx;
703
704         store_8way(%rsi, RC1, RD1, RB1, RE1, RC2, RD2, RB2, RE2);
705
706         ret;
707 ENDPROC(serpent_ecb_dec_8way_avx)
708
709 ENTRY(serpent_cbc_dec_8way_avx)
710         /* input:
711          *      %rdi: ctx, CTX
712          *      %rsi: dst
713          *      %rdx: src
714          */
715
716         load_8way(%rdx, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2);
717
718         call __serpent_dec_blk8_avx;
719
720         store_cbc_8way(%rdx, %rsi, RC1, RD1, RB1, RE1, RC2, RD2, RB2, RE2);
721
722         ret;
723 ENDPROC(serpent_cbc_dec_8way_avx)
724
725 ENTRY(serpent_ctr_8way_avx)
726         /* input:
727          *      %rdi: ctx, CTX
728          *      %rsi: dst
729          *      %rdx: src
730          *      %rcx: iv (little endian, 128bit)
731          */
732
733         load_ctr_8way(%rcx, .Lbswap128_mask, RA1, RB1, RC1, RD1, RA2, RB2, RC2,
734                       RD2, RK0, RK1, RK2);
735
736         call __serpent_enc_blk8_avx;
737
738         store_ctr_8way(%rdx, %rsi, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2);
739
740         ret;
741 ENDPROC(serpent_ctr_8way_avx)