Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[sfrench/cifs-2.6.git] / arch / x86 / crypto / cast5-avx-x86_64-asm_64.S
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * Cast5 Cipher 16-way parallel algorithm (AVX/x86_64)
4  *
5  * Copyright (C) 2012 Johannes Goetzfried
6  *     <Johannes.Goetzfried@informatik.stud.uni-erlangen.de>
7  *
8  * Copyright © 2012 Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
9  */
10
11 #include <linux/linkage.h>
12 #include <asm/frame.h>
13
14 .file "cast5-avx-x86_64-asm_64.S"
15
16 .extern cast_s1
17 .extern cast_s2
18 .extern cast_s3
19 .extern cast_s4
20
21 /* structure of crypto context */
22 #define km      0
23 #define kr      (16*4)
24 #define rr      ((16*4)+16)
25
26 /* s-boxes */
27 #define s1      cast_s1
28 #define s2      cast_s2
29 #define s3      cast_s3
30 #define s4      cast_s4
31
32 /**********************************************************************
33   16-way AVX cast5
34  **********************************************************************/
35 #define CTX %r15
36
37 #define RL1 %xmm0
38 #define RR1 %xmm1
39 #define RL2 %xmm2
40 #define RR2 %xmm3
41 #define RL3 %xmm4
42 #define RR3 %xmm5
43 #define RL4 %xmm6
44 #define RR4 %xmm7
45
46 #define RX %xmm8
47
48 #define RKM  %xmm9
49 #define RKR  %xmm10
50 #define RKRF %xmm11
51 #define RKRR %xmm12
52
53 #define R32  %xmm13
54 #define R1ST %xmm14
55
56 #define RTMP %xmm15
57
58 #define RID1  %rdi
59 #define RID1d %edi
60 #define RID2  %rsi
61 #define RID2d %esi
62
63 #define RGI1   %rdx
64 #define RGI1bl %dl
65 #define RGI1bh %dh
66 #define RGI2   %rcx
67 #define RGI2bl %cl
68 #define RGI2bh %ch
69
70 #define RGI3   %rax
71 #define RGI3bl %al
72 #define RGI3bh %ah
73 #define RGI4   %rbx
74 #define RGI4bl %bl
75 #define RGI4bh %bh
76
77 #define RFS1  %r8
78 #define RFS1d %r8d
79 #define RFS2  %r9
80 #define RFS2d %r9d
81 #define RFS3  %r10
82 #define RFS3d %r10d
83
84
85 #define lookup_32bit(src, dst, op1, op2, op3, interleave_op, il_reg) \
86         movzbl          src ## bh,     RID1d;    \
87         movzbl          src ## bl,     RID2d;    \
88         shrq $16,       src;                     \
89         movl            s1(, RID1, 4), dst ## d; \
90         op1             s2(, RID2, 4), dst ## d; \
91         movzbl          src ## bh,     RID1d;    \
92         movzbl          src ## bl,     RID2d;    \
93         interleave_op(il_reg);                   \
94         op2             s3(, RID1, 4), dst ## d; \
95         op3             s4(, RID2, 4), dst ## d;
96
97 #define dummy(d) /* do nothing */
98
99 #define shr_next(reg) \
100         shrq $16,       reg;
101
102 #define F_head(a, x, gi1, gi2, op0) \
103         op0     a,      RKM,  x;                 \
104         vpslld  RKRF,   x,    RTMP;              \
105         vpsrld  RKRR,   x,    x;                 \
106         vpor    RTMP,   x,    x;                 \
107         \
108         vmovq           x,    gi1;               \
109         vpextrq $1,     x,    gi2;
110
111 #define F_tail(a, x, gi1, gi2, op1, op2, op3) \
112         lookup_32bit(##gi1, RFS1, op1, op2, op3, shr_next, ##gi1); \
113         lookup_32bit(##gi2, RFS3, op1, op2, op3, shr_next, ##gi2); \
114         \
115         lookup_32bit(##gi1, RFS2, op1, op2, op3, dummy, none);     \
116         shlq $32,       RFS2;                                      \
117         orq             RFS1, RFS2;                                \
118         lookup_32bit(##gi2, RFS1, op1, op2, op3, dummy, none);     \
119         shlq $32,       RFS1;                                      \
120         orq             RFS1, RFS3;                                \
121         \
122         vmovq           RFS2, x;                                   \
123         vpinsrq $1,     RFS3, x, x;
124
125 #define F_2(a1, b1, a2, b2, op0, op1, op2, op3) \
126         F_head(b1, RX, RGI1, RGI2, op0);              \
127         F_head(b2, RX, RGI3, RGI4, op0);              \
128         \
129         F_tail(b1, RX, RGI1, RGI2, op1, op2, op3);    \
130         F_tail(b2, RTMP, RGI3, RGI4, op1, op2, op3);  \
131         \
132         vpxor           a1, RX,   a1;                 \
133         vpxor           a2, RTMP, a2;
134
135 #define F1_2(a1, b1, a2, b2) \
136         F_2(a1, b1, a2, b2, vpaddd, xorl, subl, addl)
137 #define F2_2(a1, b1, a2, b2) \
138         F_2(a1, b1, a2, b2, vpxor, subl, addl, xorl)
139 #define F3_2(a1, b1, a2, b2) \
140         F_2(a1, b1, a2, b2, vpsubd, addl, xorl, subl)
141
142 #define subround(a1, b1, a2, b2, f) \
143         F ## f ## _2(a1, b1, a2, b2);
144
145 #define round(l, r, n, f) \
146         vbroadcastss    (km+(4*n))(CTX), RKM;        \
147         vpand           R1ST,            RKR,  RKRF; \
148         vpsubq          RKRF,            R32,  RKRR; \
149         vpsrldq $1,     RKR,             RKR;        \
150         subround(l ## 1, r ## 1, l ## 2, r ## 2, f); \
151         subround(l ## 3, r ## 3, l ## 4, r ## 4, f);
152
153 #define enc_preload_rkr() \
154         vbroadcastss    .L16_mask,                RKR;      \
155         /* add 16-bit rotation to key rotations (mod 32) */ \
156         vpxor           kr(CTX),                  RKR, RKR;
157
158 #define dec_preload_rkr() \
159         vbroadcastss    .L16_mask,                RKR;      \
160         /* add 16-bit rotation to key rotations (mod 32) */ \
161         vpxor           kr(CTX),                  RKR, RKR; \
162         vpshufb         .Lbswap128_mask,          RKR, RKR;
163
164 #define transpose_2x4(x0, x1, t0, t1) \
165         vpunpckldq              x1, x0, t0; \
166         vpunpckhdq              x1, x0, t1; \
167         \
168         vpunpcklqdq             t1, t0, x0; \
169         vpunpckhqdq             t1, t0, x1;
170
171 #define inpack_blocks(x0, x1, t0, t1, rmask) \
172         vpshufb rmask,  x0,     x0; \
173         vpshufb rmask,  x1,     x1; \
174         \
175         transpose_2x4(x0, x1, t0, t1)
176
177 #define outunpack_blocks(x0, x1, t0, t1, rmask) \
178         transpose_2x4(x0, x1, t0, t1) \
179         \
180         vpshufb rmask,  x0, x0;           \
181         vpshufb rmask,  x1, x1;
182
183 .section        .rodata.cst16.bswap_mask, "aM", @progbits, 16
184 .align 16
185 .Lbswap_mask:
186         .byte 3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12
187 .section        .rodata.cst16.bswap128_mask, "aM", @progbits, 16
188 .align 16
189 .Lbswap128_mask:
190         .byte 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
191 .section        .rodata.cst16.bswap_iv_mask, "aM", @progbits, 16
192 .align 16
193 .Lbswap_iv_mask:
194         .byte 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0
195
196 .section        .rodata.cst4.16_mask, "aM", @progbits, 4
197 .align 4
198 .L16_mask:
199         .byte 16, 16, 16, 16
200 .section        .rodata.cst4.32_mask, "aM", @progbits, 4
201 .align 4
202 .L32_mask:
203         .byte 32, 0, 0, 0
204 .section        .rodata.cst4.first_mask, "aM", @progbits, 4
205 .align 4
206 .Lfirst_mask:
207         .byte 0x1f, 0, 0, 0
208
209 .text
210
211 .align 16
212 __cast5_enc_blk16:
213         /* input:
214          *      %rdi: ctx
215          *      RL1: blocks 1 and 2
216          *      RR1: blocks 3 and 4
217          *      RL2: blocks 5 and 6
218          *      RR2: blocks 7 and 8
219          *      RL3: blocks 9 and 10
220          *      RR3: blocks 11 and 12
221          *      RL4: blocks 13 and 14
222          *      RR4: blocks 15 and 16
223          * output:
224          *      RL1: encrypted blocks 1 and 2
225          *      RR1: encrypted blocks 3 and 4
226          *      RL2: encrypted blocks 5 and 6
227          *      RR2: encrypted blocks 7 and 8
228          *      RL3: encrypted blocks 9 and 10
229          *      RR3: encrypted blocks 11 and 12
230          *      RL4: encrypted blocks 13 and 14
231          *      RR4: encrypted blocks 15 and 16
232          */
233
234         pushq %r15;
235         pushq %rbx;
236
237         movq %rdi, CTX;
238
239         vmovdqa .Lbswap_mask, RKM;
240         vmovd .Lfirst_mask, R1ST;
241         vmovd .L32_mask, R32;
242         enc_preload_rkr();
243
244         inpack_blocks(RL1, RR1, RTMP, RX, RKM);
245         inpack_blocks(RL2, RR2, RTMP, RX, RKM);
246         inpack_blocks(RL3, RR3, RTMP, RX, RKM);
247         inpack_blocks(RL4, RR4, RTMP, RX, RKM);
248
249         round(RL, RR, 0, 1);
250         round(RR, RL, 1, 2);
251         round(RL, RR, 2, 3);
252         round(RR, RL, 3, 1);
253         round(RL, RR, 4, 2);
254         round(RR, RL, 5, 3);
255         round(RL, RR, 6, 1);
256         round(RR, RL, 7, 2);
257         round(RL, RR, 8, 3);
258         round(RR, RL, 9, 1);
259         round(RL, RR, 10, 2);
260         round(RR, RL, 11, 3);
261
262         movzbl rr(CTX), %eax;
263         testl %eax, %eax;
264         jnz .L__skip_enc;
265
266         round(RL, RR, 12, 1);
267         round(RR, RL, 13, 2);
268         round(RL, RR, 14, 3);
269         round(RR, RL, 15, 1);
270
271 .L__skip_enc:
272         popq %rbx;
273         popq %r15;
274
275         vmovdqa .Lbswap_mask, RKM;
276
277         outunpack_blocks(RR1, RL1, RTMP, RX, RKM);
278         outunpack_blocks(RR2, RL2, RTMP, RX, RKM);
279         outunpack_blocks(RR3, RL3, RTMP, RX, RKM);
280         outunpack_blocks(RR4, RL4, RTMP, RX, RKM);
281
282         ret;
283 ENDPROC(__cast5_enc_blk16)
284
285 .align 16
286 __cast5_dec_blk16:
287         /* input:
288          *      %rdi: ctx
289          *      RL1: encrypted blocks 1 and 2
290          *      RR1: encrypted blocks 3 and 4
291          *      RL2: encrypted blocks 5 and 6
292          *      RR2: encrypted blocks 7 and 8
293          *      RL3: encrypted blocks 9 and 10
294          *      RR3: encrypted blocks 11 and 12
295          *      RL4: encrypted blocks 13 and 14
296          *      RR4: encrypted blocks 15 and 16
297          * output:
298          *      RL1: decrypted blocks 1 and 2
299          *      RR1: decrypted blocks 3 and 4
300          *      RL2: decrypted blocks 5 and 6
301          *      RR2: decrypted blocks 7 and 8
302          *      RL3: decrypted blocks 9 and 10
303          *      RR3: decrypted blocks 11 and 12
304          *      RL4: decrypted blocks 13 and 14
305          *      RR4: decrypted blocks 15 and 16
306          */
307
308         pushq %r15;
309         pushq %rbx;
310
311         movq %rdi, CTX;
312
313         vmovdqa .Lbswap_mask, RKM;
314         vmovd .Lfirst_mask, R1ST;
315         vmovd .L32_mask, R32;
316         dec_preload_rkr();
317
318         inpack_blocks(RL1, RR1, RTMP, RX, RKM);
319         inpack_blocks(RL2, RR2, RTMP, RX, RKM);
320         inpack_blocks(RL3, RR3, RTMP, RX, RKM);
321         inpack_blocks(RL4, RR4, RTMP, RX, RKM);
322
323         movzbl rr(CTX), %eax;
324         testl %eax, %eax;
325         jnz .L__skip_dec;
326
327         round(RL, RR, 15, 1);
328         round(RR, RL, 14, 3);
329         round(RL, RR, 13, 2);
330         round(RR, RL, 12, 1);
331
332 .L__dec_tail:
333         round(RL, RR, 11, 3);
334         round(RR, RL, 10, 2);
335         round(RL, RR, 9, 1);
336         round(RR, RL, 8, 3);
337         round(RL, RR, 7, 2);
338         round(RR, RL, 6, 1);
339         round(RL, RR, 5, 3);
340         round(RR, RL, 4, 2);
341         round(RL, RR, 3, 1);
342         round(RR, RL, 2, 3);
343         round(RL, RR, 1, 2);
344         round(RR, RL, 0, 1);
345
346         vmovdqa .Lbswap_mask, RKM;
347         popq %rbx;
348         popq %r15;
349
350         outunpack_blocks(RR1, RL1, RTMP, RX, RKM);
351         outunpack_blocks(RR2, RL2, RTMP, RX, RKM);
352         outunpack_blocks(RR3, RL3, RTMP, RX, RKM);
353         outunpack_blocks(RR4, RL4, RTMP, RX, RKM);
354
355         ret;
356
357 .L__skip_dec:
358         vpsrldq $4, RKR, RKR;
359         jmp .L__dec_tail;
360 ENDPROC(__cast5_dec_blk16)
361
362 ENTRY(cast5_ecb_enc_16way)
363         /* input:
364          *      %rdi: ctx
365          *      %rsi: dst
366          *      %rdx: src
367          */
368         FRAME_BEGIN
369         pushq %r15;
370
371         movq %rdi, CTX;
372         movq %rsi, %r11;
373
374         vmovdqu (0*4*4)(%rdx), RL1;
375         vmovdqu (1*4*4)(%rdx), RR1;
376         vmovdqu (2*4*4)(%rdx), RL2;
377         vmovdqu (3*4*4)(%rdx), RR2;
378         vmovdqu (4*4*4)(%rdx), RL3;
379         vmovdqu (5*4*4)(%rdx), RR3;
380         vmovdqu (6*4*4)(%rdx), RL4;
381         vmovdqu (7*4*4)(%rdx), RR4;
382
383         call __cast5_enc_blk16;
384
385         vmovdqu RR1, (0*4*4)(%r11);
386         vmovdqu RL1, (1*4*4)(%r11);
387         vmovdqu RR2, (2*4*4)(%r11);
388         vmovdqu RL2, (3*4*4)(%r11);
389         vmovdqu RR3, (4*4*4)(%r11);
390         vmovdqu RL3, (5*4*4)(%r11);
391         vmovdqu RR4, (6*4*4)(%r11);
392         vmovdqu RL4, (7*4*4)(%r11);
393
394         popq %r15;
395         FRAME_END
396         ret;
397 ENDPROC(cast5_ecb_enc_16way)
398
399 ENTRY(cast5_ecb_dec_16way)
400         /* input:
401          *      %rdi: ctx
402          *      %rsi: dst
403          *      %rdx: src
404          */
405
406         FRAME_BEGIN
407         pushq %r15;
408
409         movq %rdi, CTX;
410         movq %rsi, %r11;
411
412         vmovdqu (0*4*4)(%rdx), RL1;
413         vmovdqu (1*4*4)(%rdx), RR1;
414         vmovdqu (2*4*4)(%rdx), RL2;
415         vmovdqu (3*4*4)(%rdx), RR2;
416         vmovdqu (4*4*4)(%rdx), RL3;
417         vmovdqu (5*4*4)(%rdx), RR3;
418         vmovdqu (6*4*4)(%rdx), RL4;
419         vmovdqu (7*4*4)(%rdx), RR4;
420
421         call __cast5_dec_blk16;
422
423         vmovdqu RR1, (0*4*4)(%r11);
424         vmovdqu RL1, (1*4*4)(%r11);
425         vmovdqu RR2, (2*4*4)(%r11);
426         vmovdqu RL2, (3*4*4)(%r11);
427         vmovdqu RR3, (4*4*4)(%r11);
428         vmovdqu RL3, (5*4*4)(%r11);
429         vmovdqu RR4, (6*4*4)(%r11);
430         vmovdqu RL4, (7*4*4)(%r11);
431
432         popq %r15;
433         FRAME_END
434         ret;
435 ENDPROC(cast5_ecb_dec_16way)
436
437 ENTRY(cast5_cbc_dec_16way)
438         /* input:
439          *      %rdi: ctx
440          *      %rsi: dst
441          *      %rdx: src
442          */
443         FRAME_BEGIN
444         pushq %r12;
445         pushq %r15;
446
447         movq %rdi, CTX;
448         movq %rsi, %r11;
449         movq %rdx, %r12;
450
451         vmovdqu (0*16)(%rdx), RL1;
452         vmovdqu (1*16)(%rdx), RR1;
453         vmovdqu (2*16)(%rdx), RL2;
454         vmovdqu (3*16)(%rdx), RR2;
455         vmovdqu (4*16)(%rdx), RL3;
456         vmovdqu (5*16)(%rdx), RR3;
457         vmovdqu (6*16)(%rdx), RL4;
458         vmovdqu (7*16)(%rdx), RR4;
459
460         call __cast5_dec_blk16;
461
462         /* xor with src */
463         vmovq (%r12), RX;
464         vpshufd $0x4f, RX, RX;
465         vpxor RX, RR1, RR1;
466         vpxor 0*16+8(%r12), RL1, RL1;
467         vpxor 1*16+8(%r12), RR2, RR2;
468         vpxor 2*16+8(%r12), RL2, RL2;
469         vpxor 3*16+8(%r12), RR3, RR3;
470         vpxor 4*16+8(%r12), RL3, RL3;
471         vpxor 5*16+8(%r12), RR4, RR4;
472         vpxor 6*16+8(%r12), RL4, RL4;
473
474         vmovdqu RR1, (0*16)(%r11);
475         vmovdqu RL1, (1*16)(%r11);
476         vmovdqu RR2, (2*16)(%r11);
477         vmovdqu RL2, (3*16)(%r11);
478         vmovdqu RR3, (4*16)(%r11);
479         vmovdqu RL3, (5*16)(%r11);
480         vmovdqu RR4, (6*16)(%r11);
481         vmovdqu RL4, (7*16)(%r11);
482
483         popq %r15;
484         popq %r12;
485         FRAME_END
486         ret;
487 ENDPROC(cast5_cbc_dec_16way)
488
489 ENTRY(cast5_ctr_16way)
490         /* input:
491          *      %rdi: ctx
492          *      %rsi: dst
493          *      %rdx: src
494          *      %rcx: iv (big endian, 64bit)
495          */
496         FRAME_BEGIN
497         pushq %r12;
498         pushq %r15;
499
500         movq %rdi, CTX;
501         movq %rsi, %r11;
502         movq %rdx, %r12;
503
504         vpcmpeqd RTMP, RTMP, RTMP;
505         vpsrldq $8, RTMP, RTMP; /* low: -1, high: 0 */
506
507         vpcmpeqd RKR, RKR, RKR;
508         vpaddq RKR, RKR, RKR; /* low: -2, high: -2 */
509         vmovdqa .Lbswap_iv_mask, R1ST;
510         vmovdqa .Lbswap128_mask, RKM;
511
512         /* load IV and byteswap */
513         vmovq (%rcx), RX;
514         vpshufb R1ST, RX, RX;
515
516         /* construct IVs */
517         vpsubq RTMP, RX, RX;  /* le: IV1, IV0 */
518         vpshufb RKM, RX, RL1; /* be: IV0, IV1 */
519         vpsubq RKR, RX, RX;
520         vpshufb RKM, RX, RR1; /* be: IV2, IV3 */
521         vpsubq RKR, RX, RX;
522         vpshufb RKM, RX, RL2; /* be: IV4, IV5 */
523         vpsubq RKR, RX, RX;
524         vpshufb RKM, RX, RR2; /* be: IV6, IV7 */
525         vpsubq RKR, RX, RX;
526         vpshufb RKM, RX, RL3; /* be: IV8, IV9 */
527         vpsubq RKR, RX, RX;
528         vpshufb RKM, RX, RR3; /* be: IV10, IV11 */
529         vpsubq RKR, RX, RX;
530         vpshufb RKM, RX, RL4; /* be: IV12, IV13 */
531         vpsubq RKR, RX, RX;
532         vpshufb RKM, RX, RR4; /* be: IV14, IV15 */
533
534         /* store last IV */
535         vpsubq RTMP, RX, RX; /* le: IV16, IV14 */
536         vpshufb R1ST, RX, RX; /* be: IV16, IV16 */
537         vmovq RX, (%rcx);
538
539         call __cast5_enc_blk16;
540
541         /* dst = src ^ iv */
542         vpxor (0*16)(%r12), RR1, RR1;
543         vpxor (1*16)(%r12), RL1, RL1;
544         vpxor (2*16)(%r12), RR2, RR2;
545         vpxor (3*16)(%r12), RL2, RL2;
546         vpxor (4*16)(%r12), RR3, RR3;
547         vpxor (5*16)(%r12), RL3, RL3;
548         vpxor (6*16)(%r12), RR4, RR4;
549         vpxor (7*16)(%r12), RL4, RL4;
550         vmovdqu RR1, (0*16)(%r11);
551         vmovdqu RL1, (1*16)(%r11);
552         vmovdqu RR2, (2*16)(%r11);
553         vmovdqu RL2, (3*16)(%r11);
554         vmovdqu RR3, (4*16)(%r11);
555         vmovdqu RL3, (5*16)(%r11);
556         vmovdqu RR4, (6*16)(%r11);
557         vmovdqu RL4, (7*16)(%r11);
558
559         popq %r15;
560         popq %r12;
561         FRAME_END
562         ret;
563 ENDPROC(cast5_ctr_16way)