xref: /openbmc/linux/arch/x86/crypto/blake2s-core.S (revision ed0356ed)
1ed0356edSJason A. Donenfeld/* SPDX-License-Identifier: GPL-2.0 OR MIT */
2ed0356edSJason A. Donenfeld/*
3ed0356edSJason A. Donenfeld * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
4ed0356edSJason A. Donenfeld * Copyright (C) 2017-2019 Samuel Neves <sneves@dei.uc.pt>. All Rights Reserved.
5ed0356edSJason A. Donenfeld */
6ed0356edSJason A. Donenfeld
7ed0356edSJason A. Donenfeld#include <linux/linkage.h>
8ed0356edSJason A. Donenfeld
9ed0356edSJason A. Donenfeld.section .rodata.cst32.BLAKE2S_IV, "aM", @progbits, 32
10ed0356edSJason A. Donenfeld.align 32
11ed0356edSJason A. DonenfeldIV:	.octa 0xA54FF53A3C6EF372BB67AE856A09E667
12ed0356edSJason A. Donenfeld	.octa 0x5BE0CD191F83D9AB9B05688C510E527F
13ed0356edSJason A. Donenfeld.section .rodata.cst16.ROT16, "aM", @progbits, 16
14ed0356edSJason A. Donenfeld.align 16
15ed0356edSJason A. DonenfeldROT16:	.octa 0x0D0C0F0E09080B0A0504070601000302
16ed0356edSJason A. Donenfeld.section .rodata.cst16.ROR328, "aM", @progbits, 16
17ed0356edSJason A. Donenfeld.align 16
18ed0356edSJason A. DonenfeldROR328:	.octa 0x0C0F0E0D080B0A090407060500030201
19ed0356edSJason A. Donenfeld.section .rodata.cst64.BLAKE2S_SIGMA, "aM", @progbits, 160
20ed0356edSJason A. Donenfeld.align 64
21ed0356edSJason A. DonenfeldSIGMA:
22ed0356edSJason A. Donenfeld.byte  0,  2,  4,  6,  1,  3,  5,  7, 14,  8, 10, 12, 15,  9, 11, 13
23ed0356edSJason A. Donenfeld.byte 14,  4,  9, 13, 10,  8, 15,  6,  5,  1,  0, 11,  3, 12,  2,  7
24ed0356edSJason A. Donenfeld.byte 11, 12,  5, 15,  8,  0,  2, 13,  9, 10,  3,  7,  4, 14,  6,  1
25ed0356edSJason A. Donenfeld.byte  7,  3, 13, 11,  9,  1, 12, 14, 15,  2,  5,  4,  8,  6, 10,  0
26ed0356edSJason A. Donenfeld.byte  9,  5,  2, 10,  0,  7,  4, 15,  3, 14, 11,  6, 13,  1, 12,  8
27ed0356edSJason A. Donenfeld.byte  2,  6,  0,  8, 12, 10, 11,  3,  1,  4,  7, 15,  9, 13,  5, 14
28ed0356edSJason A. Donenfeld.byte 12,  1, 14,  4,  5, 15, 13, 10,  8,  0,  6,  9, 11,  7,  3,  2
29ed0356edSJason A. Donenfeld.byte 13,  7, 12,  3, 11, 14,  1,  9,  2,  5, 15,  8, 10,  0,  4,  6
30ed0356edSJason A. Donenfeld.byte  6, 14, 11,  0, 15,  9,  3,  8, 10, 12, 13,  1,  5,  2,  7,  4
31ed0356edSJason A. Donenfeld.byte 10,  8,  7,  1,  2,  4,  6,  5, 13, 15,  9,  3,  0, 11, 14, 12
32ed0356edSJason A. Donenfeld#ifdef CONFIG_AS_AVX512
33ed0356edSJason A. Donenfeld.section .rodata.cst64.BLAKE2S_SIGMA2, "aM", @progbits, 640
34ed0356edSJason A. Donenfeld.align 64
35ed0356edSJason A. DonenfeldSIGMA2:
36ed0356edSJason A. Donenfeld.long  0,  2,  4,  6,  1,  3,  5,  7, 14,  8, 10, 12, 15,  9, 11, 13
37ed0356edSJason A. Donenfeld.long  8,  2, 13, 15, 10,  9, 12,  3,  6,  4,  0, 14,  5, 11,  1,  7
38ed0356edSJason A. Donenfeld.long 11, 13,  8,  6,  5, 10, 14,  3,  2,  4, 12, 15,  1,  0,  7,  9
39ed0356edSJason A. Donenfeld.long 11, 10,  7,  0,  8, 15,  1, 13,  3,  6,  2, 12,  4, 14,  9,  5
40ed0356edSJason A. Donenfeld.long  4, 10,  9, 14, 15,  0, 11,  8,  1,  7,  3, 13,  2,  5,  6, 12
41ed0356edSJason A. Donenfeld.long  2, 11,  4, 15, 14,  3, 10,  8, 13,  6,  5,  7,  0, 12,  1,  9
42ed0356edSJason A. Donenfeld.long  4,  8, 15,  9, 14, 11, 13,  5,  3,  2,  1, 12,  6, 10,  7,  0
43ed0356edSJason A. Donenfeld.long  6, 13,  0, 14, 12,  2,  1, 11, 15,  4,  5,  8,  7,  9,  3, 10
44ed0356edSJason A. Donenfeld.long 15,  5,  4, 13, 10,  7,  3, 11, 12,  2,  0,  6,  9,  8,  1, 14
45ed0356edSJason A. Donenfeld.long  8,  7, 14, 11, 13, 15,  0, 12, 10,  4,  5,  6,  3,  2,  1,  9
46ed0356edSJason A. Donenfeld#endif /* CONFIG_AS_AVX512 */
47ed0356edSJason A. Donenfeld
48ed0356edSJason A. Donenfeld.text
49ed0356edSJason A. Donenfeld#ifdef CONFIG_AS_SSSE3
50ed0356edSJason A. DonenfeldENTRY(blake2s_compress_ssse3)
51ed0356edSJason A. Donenfeld	testq		%rdx,%rdx
52ed0356edSJason A. Donenfeld	je		.Lendofloop
53ed0356edSJason A. Donenfeld	movdqu		(%rdi),%xmm0
54ed0356edSJason A. Donenfeld	movdqu		0x10(%rdi),%xmm1
55ed0356edSJason A. Donenfeld	movdqa		ROT16(%rip),%xmm12
56ed0356edSJason A. Donenfeld	movdqa		ROR328(%rip),%xmm13
57ed0356edSJason A. Donenfeld	movdqu		0x20(%rdi),%xmm14
58ed0356edSJason A. Donenfeld	movq		%rcx,%xmm15
59ed0356edSJason A. Donenfeld	leaq		SIGMA+0xa0(%rip),%r8
60ed0356edSJason A. Donenfeld	jmp		.Lbeginofloop
61ed0356edSJason A. Donenfeld	.align		32
62ed0356edSJason A. Donenfeld.Lbeginofloop:
63ed0356edSJason A. Donenfeld	movdqa		%xmm0,%xmm10
64ed0356edSJason A. Donenfeld	movdqa		%xmm1,%xmm11
65ed0356edSJason A. Donenfeld	paddq		%xmm15,%xmm14
66ed0356edSJason A. Donenfeld	movdqa		IV(%rip),%xmm2
67ed0356edSJason A. Donenfeld	movdqa		%xmm14,%xmm3
68ed0356edSJason A. Donenfeld	pxor		IV+0x10(%rip),%xmm3
69ed0356edSJason A. Donenfeld	leaq		SIGMA(%rip),%rcx
70ed0356edSJason A. Donenfeld.Lroundloop:
71ed0356edSJason A. Donenfeld	movzbl		(%rcx),%eax
72ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm4
73ed0356edSJason A. Donenfeld	movzbl		0x1(%rcx),%eax
74ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm5
75ed0356edSJason A. Donenfeld	movzbl		0x2(%rcx),%eax
76ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm6
77ed0356edSJason A. Donenfeld	movzbl		0x3(%rcx),%eax
78ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm7
79ed0356edSJason A. Donenfeld	punpckldq	%xmm5,%xmm4
80ed0356edSJason A. Donenfeld	punpckldq	%xmm7,%xmm6
81ed0356edSJason A. Donenfeld	punpcklqdq	%xmm6,%xmm4
82ed0356edSJason A. Donenfeld	paddd		%xmm4,%xmm0
83ed0356edSJason A. Donenfeld	paddd		%xmm1,%xmm0
84ed0356edSJason A. Donenfeld	pxor		%xmm0,%xmm3
85ed0356edSJason A. Donenfeld	pshufb		%xmm12,%xmm3
86ed0356edSJason A. Donenfeld	paddd		%xmm3,%xmm2
87ed0356edSJason A. Donenfeld	pxor		%xmm2,%xmm1
88ed0356edSJason A. Donenfeld	movdqa		%xmm1,%xmm8
89ed0356edSJason A. Donenfeld	psrld		$0xc,%xmm1
90ed0356edSJason A. Donenfeld	pslld		$0x14,%xmm8
91ed0356edSJason A. Donenfeld	por		%xmm8,%xmm1
92ed0356edSJason A. Donenfeld	movzbl		0x4(%rcx),%eax
93ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm5
94ed0356edSJason A. Donenfeld	movzbl		0x5(%rcx),%eax
95ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm6
96ed0356edSJason A. Donenfeld	movzbl		0x6(%rcx),%eax
97ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm7
98ed0356edSJason A. Donenfeld	movzbl		0x7(%rcx),%eax
99ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm4
100ed0356edSJason A. Donenfeld	punpckldq	%xmm6,%xmm5
101ed0356edSJason A. Donenfeld	punpckldq	%xmm4,%xmm7
102ed0356edSJason A. Donenfeld	punpcklqdq	%xmm7,%xmm5
103ed0356edSJason A. Donenfeld	paddd		%xmm5,%xmm0
104ed0356edSJason A. Donenfeld	paddd		%xmm1,%xmm0
105ed0356edSJason A. Donenfeld	pxor		%xmm0,%xmm3
106ed0356edSJason A. Donenfeld	pshufb		%xmm13,%xmm3
107ed0356edSJason A. Donenfeld	paddd		%xmm3,%xmm2
108ed0356edSJason A. Donenfeld	pxor		%xmm2,%xmm1
109ed0356edSJason A. Donenfeld	movdqa		%xmm1,%xmm8
110ed0356edSJason A. Donenfeld	psrld		$0x7,%xmm1
111ed0356edSJason A. Donenfeld	pslld		$0x19,%xmm8
112ed0356edSJason A. Donenfeld	por		%xmm8,%xmm1
113ed0356edSJason A. Donenfeld	pshufd		$0x93,%xmm0,%xmm0
114ed0356edSJason A. Donenfeld	pshufd		$0x4e,%xmm3,%xmm3
115ed0356edSJason A. Donenfeld	pshufd		$0x39,%xmm2,%xmm2
116ed0356edSJason A. Donenfeld	movzbl		0x8(%rcx),%eax
117ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm6
118ed0356edSJason A. Donenfeld	movzbl		0x9(%rcx),%eax
119ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm7
120ed0356edSJason A. Donenfeld	movzbl		0xa(%rcx),%eax
121ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm4
122ed0356edSJason A. Donenfeld	movzbl		0xb(%rcx),%eax
123ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm5
124ed0356edSJason A. Donenfeld	punpckldq	%xmm7,%xmm6
125ed0356edSJason A. Donenfeld	punpckldq	%xmm5,%xmm4
126ed0356edSJason A. Donenfeld	punpcklqdq	%xmm4,%xmm6
127ed0356edSJason A. Donenfeld	paddd		%xmm6,%xmm0
128ed0356edSJason A. Donenfeld	paddd		%xmm1,%xmm0
129ed0356edSJason A. Donenfeld	pxor		%xmm0,%xmm3
130ed0356edSJason A. Donenfeld	pshufb		%xmm12,%xmm3
131ed0356edSJason A. Donenfeld	paddd		%xmm3,%xmm2
132ed0356edSJason A. Donenfeld	pxor		%xmm2,%xmm1
133ed0356edSJason A. Donenfeld	movdqa		%xmm1,%xmm8
134ed0356edSJason A. Donenfeld	psrld		$0xc,%xmm1
135ed0356edSJason A. Donenfeld	pslld		$0x14,%xmm8
136ed0356edSJason A. Donenfeld	por		%xmm8,%xmm1
137ed0356edSJason A. Donenfeld	movzbl		0xc(%rcx),%eax
138ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm7
139ed0356edSJason A. Donenfeld	movzbl		0xd(%rcx),%eax
140ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm4
141ed0356edSJason A. Donenfeld	movzbl		0xe(%rcx),%eax
142ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm5
143ed0356edSJason A. Donenfeld	movzbl		0xf(%rcx),%eax
144ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm6
145ed0356edSJason A. Donenfeld	punpckldq	%xmm4,%xmm7
146ed0356edSJason A. Donenfeld	punpckldq	%xmm6,%xmm5
147ed0356edSJason A. Donenfeld	punpcklqdq	%xmm5,%xmm7
148ed0356edSJason A. Donenfeld	paddd		%xmm7,%xmm0
149ed0356edSJason A. Donenfeld	paddd		%xmm1,%xmm0
150ed0356edSJason A. Donenfeld	pxor		%xmm0,%xmm3
151ed0356edSJason A. Donenfeld	pshufb		%xmm13,%xmm3
152ed0356edSJason A. Donenfeld	paddd		%xmm3,%xmm2
153ed0356edSJason A. Donenfeld	pxor		%xmm2,%xmm1
154ed0356edSJason A. Donenfeld	movdqa		%xmm1,%xmm8
155ed0356edSJason A. Donenfeld	psrld		$0x7,%xmm1
156ed0356edSJason A. Donenfeld	pslld		$0x19,%xmm8
157ed0356edSJason A. Donenfeld	por		%xmm8,%xmm1
158ed0356edSJason A. Donenfeld	pshufd		$0x39,%xmm0,%xmm0
159ed0356edSJason A. Donenfeld	pshufd		$0x4e,%xmm3,%xmm3
160ed0356edSJason A. Donenfeld	pshufd		$0x93,%xmm2,%xmm2
161ed0356edSJason A. Donenfeld	addq		$0x10,%rcx
162ed0356edSJason A. Donenfeld	cmpq		%r8,%rcx
163ed0356edSJason A. Donenfeld	jnz		.Lroundloop
164ed0356edSJason A. Donenfeld	pxor		%xmm2,%xmm0
165ed0356edSJason A. Donenfeld	pxor		%xmm3,%xmm1
166ed0356edSJason A. Donenfeld	pxor		%xmm10,%xmm0
167ed0356edSJason A. Donenfeld	pxor		%xmm11,%xmm1
168ed0356edSJason A. Donenfeld	addq		$0x40,%rsi
169ed0356edSJason A. Donenfeld	decq		%rdx
170ed0356edSJason A. Donenfeld	jnz		.Lbeginofloop
171ed0356edSJason A. Donenfeld	movdqu		%xmm0,(%rdi)
172ed0356edSJason A. Donenfeld	movdqu		%xmm1,0x10(%rdi)
173ed0356edSJason A. Donenfeld	movdqu		%xmm14,0x20(%rdi)
174ed0356edSJason A. Donenfeld.Lendofloop:
175ed0356edSJason A. Donenfeld	ret
176ed0356edSJason A. DonenfeldENDPROC(blake2s_compress_ssse3)
177ed0356edSJason A. Donenfeld#endif /* CONFIG_AS_SSSE3 */
178ed0356edSJason A. Donenfeld
179ed0356edSJason A. Donenfeld#ifdef CONFIG_AS_AVX512
180ed0356edSJason A. DonenfeldENTRY(blake2s_compress_avx512)
181ed0356edSJason A. Donenfeld	vmovdqu		(%rdi),%xmm0
182ed0356edSJason A. Donenfeld	vmovdqu		0x10(%rdi),%xmm1
183ed0356edSJason A. Donenfeld	vmovdqu		0x20(%rdi),%xmm4
184ed0356edSJason A. Donenfeld	vmovq		%rcx,%xmm5
185ed0356edSJason A. Donenfeld	vmovdqa		IV(%rip),%xmm14
186ed0356edSJason A. Donenfeld	vmovdqa		IV+16(%rip),%xmm15
187ed0356edSJason A. Donenfeld	jmp		.Lblake2s_compress_avx512_mainloop
188ed0356edSJason A. Donenfeld.align 32
189ed0356edSJason A. Donenfeld.Lblake2s_compress_avx512_mainloop:
190ed0356edSJason A. Donenfeld	vmovdqa		%xmm0,%xmm10
191ed0356edSJason A. Donenfeld	vmovdqa		%xmm1,%xmm11
192ed0356edSJason A. Donenfeld	vpaddq		%xmm5,%xmm4,%xmm4
193ed0356edSJason A. Donenfeld	vmovdqa		%xmm14,%xmm2
194ed0356edSJason A. Donenfeld	vpxor		%xmm15,%xmm4,%xmm3
195ed0356edSJason A. Donenfeld	vmovdqu		(%rsi),%ymm6
196ed0356edSJason A. Donenfeld	vmovdqu		0x20(%rsi),%ymm7
197ed0356edSJason A. Donenfeld	addq		$0x40,%rsi
198ed0356edSJason A. Donenfeld	leaq		SIGMA2(%rip),%rax
199ed0356edSJason A. Donenfeld	movb		$0xa,%cl
200ed0356edSJason A. Donenfeld.Lblake2s_compress_avx512_roundloop:
201ed0356edSJason A. Donenfeld	addq		$0x40,%rax
202ed0356edSJason A. Donenfeld	vmovdqa		-0x40(%rax),%ymm8
203ed0356edSJason A. Donenfeld	vmovdqa		-0x20(%rax),%ymm9
204ed0356edSJason A. Donenfeld	vpermi2d	%ymm7,%ymm6,%ymm8
205ed0356edSJason A. Donenfeld	vpermi2d	%ymm7,%ymm6,%ymm9
206ed0356edSJason A. Donenfeld	vmovdqa		%ymm8,%ymm6
207ed0356edSJason A. Donenfeld	vmovdqa		%ymm9,%ymm7
208ed0356edSJason A. Donenfeld	vpaddd		%xmm8,%xmm0,%xmm0
209ed0356edSJason A. Donenfeld	vpaddd		%xmm1,%xmm0,%xmm0
210ed0356edSJason A. Donenfeld	vpxor		%xmm0,%xmm3,%xmm3
211ed0356edSJason A. Donenfeld	vprord		$0x10,%xmm3,%xmm3
212ed0356edSJason A. Donenfeld	vpaddd		%xmm3,%xmm2,%xmm2
213ed0356edSJason A. Donenfeld	vpxor		%xmm2,%xmm1,%xmm1
214ed0356edSJason A. Donenfeld	vprord		$0xc,%xmm1,%xmm1
215ed0356edSJason A. Donenfeld	vextracti128	$0x1,%ymm8,%xmm8
216ed0356edSJason A. Donenfeld	vpaddd		%xmm8,%xmm0,%xmm0
217ed0356edSJason A. Donenfeld	vpaddd		%xmm1,%xmm0,%xmm0
218ed0356edSJason A. Donenfeld	vpxor		%xmm0,%xmm3,%xmm3
219ed0356edSJason A. Donenfeld	vprord		$0x8,%xmm3,%xmm3
220ed0356edSJason A. Donenfeld	vpaddd		%xmm3,%xmm2,%xmm2
221ed0356edSJason A. Donenfeld	vpxor		%xmm2,%xmm1,%xmm1
222ed0356edSJason A. Donenfeld	vprord		$0x7,%xmm1,%xmm1
223ed0356edSJason A. Donenfeld	vpshufd		$0x93,%xmm0,%xmm0
224ed0356edSJason A. Donenfeld	vpshufd		$0x4e,%xmm3,%xmm3
225ed0356edSJason A. Donenfeld	vpshufd		$0x39,%xmm2,%xmm2
226ed0356edSJason A. Donenfeld	vpaddd		%xmm9,%xmm0,%xmm0
227ed0356edSJason A. Donenfeld	vpaddd		%xmm1,%xmm0,%xmm0
228ed0356edSJason A. Donenfeld	vpxor		%xmm0,%xmm3,%xmm3
229ed0356edSJason A. Donenfeld	vprord		$0x10,%xmm3,%xmm3
230ed0356edSJason A. Donenfeld	vpaddd		%xmm3,%xmm2,%xmm2
231ed0356edSJason A. Donenfeld	vpxor		%xmm2,%xmm1,%xmm1
232ed0356edSJason A. Donenfeld	vprord		$0xc,%xmm1,%xmm1
233ed0356edSJason A. Donenfeld	vextracti128	$0x1,%ymm9,%xmm9
234ed0356edSJason A. Donenfeld	vpaddd		%xmm9,%xmm0,%xmm0
235ed0356edSJason A. Donenfeld	vpaddd		%xmm1,%xmm0,%xmm0
236ed0356edSJason A. Donenfeld	vpxor		%xmm0,%xmm3,%xmm3
237ed0356edSJason A. Donenfeld	vprord		$0x8,%xmm3,%xmm3
238ed0356edSJason A. Donenfeld	vpaddd		%xmm3,%xmm2,%xmm2
239ed0356edSJason A. Donenfeld	vpxor		%xmm2,%xmm1,%xmm1
240ed0356edSJason A. Donenfeld	vprord		$0x7,%xmm1,%xmm1
241ed0356edSJason A. Donenfeld	vpshufd		$0x39,%xmm0,%xmm0
242ed0356edSJason A. Donenfeld	vpshufd		$0x4e,%xmm3,%xmm3
243ed0356edSJason A. Donenfeld	vpshufd		$0x93,%xmm2,%xmm2
244ed0356edSJason A. Donenfeld	decb		%cl
245ed0356edSJason A. Donenfeld	jne		.Lblake2s_compress_avx512_roundloop
246ed0356edSJason A. Donenfeld	vpxor		%xmm10,%xmm0,%xmm0
247ed0356edSJason A. Donenfeld	vpxor		%xmm11,%xmm1,%xmm1
248ed0356edSJason A. Donenfeld	vpxor		%xmm2,%xmm0,%xmm0
249ed0356edSJason A. Donenfeld	vpxor		%xmm3,%xmm1,%xmm1
250ed0356edSJason A. Donenfeld	decq		%rdx
251ed0356edSJason A. Donenfeld	jne		.Lblake2s_compress_avx512_mainloop
252ed0356edSJason A. Donenfeld	vmovdqu		%xmm0,(%rdi)
253ed0356edSJason A. Donenfeld	vmovdqu		%xmm1,0x10(%rdi)
254ed0356edSJason A. Donenfeld	vmovdqu		%xmm4,0x20(%rdi)
255ed0356edSJason A. Donenfeld	vzeroupper
256ed0356edSJason A. Donenfeld	retq
257ed0356edSJason A. DonenfeldENDPROC(blake2s_compress_avx512)
258ed0356edSJason A. Donenfeld#endif /* CONFIG_AS_AVX512 */
259