xref: /openbmc/linux/arch/x86/crypto/blake2s-core.S (revision 14b476e0)
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
491d872004SLinus TorvaldsSYM_FUNC_START(blake2s_compress_ssse3)
50ed0356edSJason A. Donenfeld	testq		%rdx,%rdx
51ed0356edSJason A. Donenfeld	je		.Lendofloop
52ed0356edSJason A. Donenfeld	movdqu		(%rdi),%xmm0
53ed0356edSJason A. Donenfeld	movdqu		0x10(%rdi),%xmm1
54ed0356edSJason A. Donenfeld	movdqa		ROT16(%rip),%xmm12
55ed0356edSJason A. Donenfeld	movdqa		ROR328(%rip),%xmm13
56ed0356edSJason A. Donenfeld	movdqu		0x20(%rdi),%xmm14
57ed0356edSJason A. Donenfeld	movq		%rcx,%xmm15
58ed0356edSJason A. Donenfeld	leaq		SIGMA+0xa0(%rip),%r8
59ed0356edSJason A. Donenfeld	jmp		.Lbeginofloop
60ed0356edSJason A. Donenfeld	.align		32
61ed0356edSJason A. Donenfeld.Lbeginofloop:
62ed0356edSJason A. Donenfeld	movdqa		%xmm0,%xmm10
63ed0356edSJason A. Donenfeld	movdqa		%xmm1,%xmm11
64ed0356edSJason A. Donenfeld	paddq		%xmm15,%xmm14
65ed0356edSJason A. Donenfeld	movdqa		IV(%rip),%xmm2
66ed0356edSJason A. Donenfeld	movdqa		%xmm14,%xmm3
67ed0356edSJason A. Donenfeld	pxor		IV+0x10(%rip),%xmm3
68ed0356edSJason A. Donenfeld	leaq		SIGMA(%rip),%rcx
69ed0356edSJason A. Donenfeld.Lroundloop:
70ed0356edSJason A. Donenfeld	movzbl		(%rcx),%eax
71ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm4
72ed0356edSJason A. Donenfeld	movzbl		0x1(%rcx),%eax
73ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm5
74ed0356edSJason A. Donenfeld	movzbl		0x2(%rcx),%eax
75ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm6
76ed0356edSJason A. Donenfeld	movzbl		0x3(%rcx),%eax
77ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm7
78ed0356edSJason A. Donenfeld	punpckldq	%xmm5,%xmm4
79ed0356edSJason A. Donenfeld	punpckldq	%xmm7,%xmm6
80ed0356edSJason A. Donenfeld	punpcklqdq	%xmm6,%xmm4
81ed0356edSJason A. Donenfeld	paddd		%xmm4,%xmm0
82ed0356edSJason A. Donenfeld	paddd		%xmm1,%xmm0
83ed0356edSJason A. Donenfeld	pxor		%xmm0,%xmm3
84ed0356edSJason A. Donenfeld	pshufb		%xmm12,%xmm3
85ed0356edSJason A. Donenfeld	paddd		%xmm3,%xmm2
86ed0356edSJason A. Donenfeld	pxor		%xmm2,%xmm1
87ed0356edSJason A. Donenfeld	movdqa		%xmm1,%xmm8
88ed0356edSJason A. Donenfeld	psrld		$0xc,%xmm1
89ed0356edSJason A. Donenfeld	pslld		$0x14,%xmm8
90ed0356edSJason A. Donenfeld	por		%xmm8,%xmm1
91ed0356edSJason A. Donenfeld	movzbl		0x4(%rcx),%eax
92ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm5
93ed0356edSJason A. Donenfeld	movzbl		0x5(%rcx),%eax
94ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm6
95ed0356edSJason A. Donenfeld	movzbl		0x6(%rcx),%eax
96ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm7
97ed0356edSJason A. Donenfeld	movzbl		0x7(%rcx),%eax
98ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm4
99ed0356edSJason A. Donenfeld	punpckldq	%xmm6,%xmm5
100ed0356edSJason A. Donenfeld	punpckldq	%xmm4,%xmm7
101ed0356edSJason A. Donenfeld	punpcklqdq	%xmm7,%xmm5
102ed0356edSJason A. Donenfeld	paddd		%xmm5,%xmm0
103ed0356edSJason A. Donenfeld	paddd		%xmm1,%xmm0
104ed0356edSJason A. Donenfeld	pxor		%xmm0,%xmm3
105ed0356edSJason A. Donenfeld	pshufb		%xmm13,%xmm3
106ed0356edSJason A. Donenfeld	paddd		%xmm3,%xmm2
107ed0356edSJason A. Donenfeld	pxor		%xmm2,%xmm1
108ed0356edSJason A. Donenfeld	movdqa		%xmm1,%xmm8
109ed0356edSJason A. Donenfeld	psrld		$0x7,%xmm1
110ed0356edSJason A. Donenfeld	pslld		$0x19,%xmm8
111ed0356edSJason A. Donenfeld	por		%xmm8,%xmm1
112ed0356edSJason A. Donenfeld	pshufd		$0x93,%xmm0,%xmm0
113ed0356edSJason A. Donenfeld	pshufd		$0x4e,%xmm3,%xmm3
114ed0356edSJason A. Donenfeld	pshufd		$0x39,%xmm2,%xmm2
115ed0356edSJason A. Donenfeld	movzbl		0x8(%rcx),%eax
116ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm6
117ed0356edSJason A. Donenfeld	movzbl		0x9(%rcx),%eax
118ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm7
119ed0356edSJason A. Donenfeld	movzbl		0xa(%rcx),%eax
120ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm4
121ed0356edSJason A. Donenfeld	movzbl		0xb(%rcx),%eax
122ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm5
123ed0356edSJason A. Donenfeld	punpckldq	%xmm7,%xmm6
124ed0356edSJason A. Donenfeld	punpckldq	%xmm5,%xmm4
125ed0356edSJason A. Donenfeld	punpcklqdq	%xmm4,%xmm6
126ed0356edSJason A. Donenfeld	paddd		%xmm6,%xmm0
127ed0356edSJason A. Donenfeld	paddd		%xmm1,%xmm0
128ed0356edSJason A. Donenfeld	pxor		%xmm0,%xmm3
129ed0356edSJason A. Donenfeld	pshufb		%xmm12,%xmm3
130ed0356edSJason A. Donenfeld	paddd		%xmm3,%xmm2
131ed0356edSJason A. Donenfeld	pxor		%xmm2,%xmm1
132ed0356edSJason A. Donenfeld	movdqa		%xmm1,%xmm8
133ed0356edSJason A. Donenfeld	psrld		$0xc,%xmm1
134ed0356edSJason A. Donenfeld	pslld		$0x14,%xmm8
135ed0356edSJason A. Donenfeld	por		%xmm8,%xmm1
136ed0356edSJason A. Donenfeld	movzbl		0xc(%rcx),%eax
137ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm7
138ed0356edSJason A. Donenfeld	movzbl		0xd(%rcx),%eax
139ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm4
140ed0356edSJason A. Donenfeld	movzbl		0xe(%rcx),%eax
141ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm5
142ed0356edSJason A. Donenfeld	movzbl		0xf(%rcx),%eax
143ed0356edSJason A. Donenfeld	movd		(%rsi,%rax,4),%xmm6
144ed0356edSJason A. Donenfeld	punpckldq	%xmm4,%xmm7
145ed0356edSJason A. Donenfeld	punpckldq	%xmm6,%xmm5
146ed0356edSJason A. Donenfeld	punpcklqdq	%xmm5,%xmm7
147ed0356edSJason A. Donenfeld	paddd		%xmm7,%xmm0
148ed0356edSJason A. Donenfeld	paddd		%xmm1,%xmm0
149ed0356edSJason A. Donenfeld	pxor		%xmm0,%xmm3
150ed0356edSJason A. Donenfeld	pshufb		%xmm13,%xmm3
151ed0356edSJason A. Donenfeld	paddd		%xmm3,%xmm2
152ed0356edSJason A. Donenfeld	pxor		%xmm2,%xmm1
153ed0356edSJason A. Donenfeld	movdqa		%xmm1,%xmm8
154ed0356edSJason A. Donenfeld	psrld		$0x7,%xmm1
155ed0356edSJason A. Donenfeld	pslld		$0x19,%xmm8
156ed0356edSJason A. Donenfeld	por		%xmm8,%xmm1
157ed0356edSJason A. Donenfeld	pshufd		$0x39,%xmm0,%xmm0
158ed0356edSJason A. Donenfeld	pshufd		$0x4e,%xmm3,%xmm3
159ed0356edSJason A. Donenfeld	pshufd		$0x93,%xmm2,%xmm2
160ed0356edSJason A. Donenfeld	addq		$0x10,%rcx
161ed0356edSJason A. Donenfeld	cmpq		%r8,%rcx
162ed0356edSJason A. Donenfeld	jnz		.Lroundloop
163ed0356edSJason A. Donenfeld	pxor		%xmm2,%xmm0
164ed0356edSJason A. Donenfeld	pxor		%xmm3,%xmm1
165ed0356edSJason A. Donenfeld	pxor		%xmm10,%xmm0
166ed0356edSJason A. Donenfeld	pxor		%xmm11,%xmm1
167ed0356edSJason A. Donenfeld	addq		$0x40,%rsi
168ed0356edSJason A. Donenfeld	decq		%rdx
169ed0356edSJason A. Donenfeld	jnz		.Lbeginofloop
170ed0356edSJason A. Donenfeld	movdqu		%xmm0,(%rdi)
171ed0356edSJason A. Donenfeld	movdqu		%xmm1,0x10(%rdi)
172ed0356edSJason A. Donenfeld	movdqu		%xmm14,0x20(%rdi)
173ed0356edSJason A. Donenfeld.Lendofloop:
174*14b476e0SPeter Zijlstra	RET
1751d872004SLinus TorvaldsSYM_FUNC_END(blake2s_compress_ssse3)
176ed0356edSJason A. Donenfeld
177ed0356edSJason A. Donenfeld#ifdef CONFIG_AS_AVX512
1781d872004SLinus TorvaldsSYM_FUNC_START(blake2s_compress_avx512)
179ed0356edSJason A. Donenfeld	vmovdqu		(%rdi),%xmm0
180ed0356edSJason A. Donenfeld	vmovdqu		0x10(%rdi),%xmm1
181ed0356edSJason A. Donenfeld	vmovdqu		0x20(%rdi),%xmm4
182ed0356edSJason A. Donenfeld	vmovq		%rcx,%xmm5
183ed0356edSJason A. Donenfeld	vmovdqa		IV(%rip),%xmm14
184ed0356edSJason A. Donenfeld	vmovdqa		IV+16(%rip),%xmm15
185ed0356edSJason A. Donenfeld	jmp		.Lblake2s_compress_avx512_mainloop
186ed0356edSJason A. Donenfeld.align 32
187ed0356edSJason A. Donenfeld.Lblake2s_compress_avx512_mainloop:
188ed0356edSJason A. Donenfeld	vmovdqa		%xmm0,%xmm10
189ed0356edSJason A. Donenfeld	vmovdqa		%xmm1,%xmm11
190ed0356edSJason A. Donenfeld	vpaddq		%xmm5,%xmm4,%xmm4
191ed0356edSJason A. Donenfeld	vmovdqa		%xmm14,%xmm2
192ed0356edSJason A. Donenfeld	vpxor		%xmm15,%xmm4,%xmm3
193ed0356edSJason A. Donenfeld	vmovdqu		(%rsi),%ymm6
194ed0356edSJason A. Donenfeld	vmovdqu		0x20(%rsi),%ymm7
195ed0356edSJason A. Donenfeld	addq		$0x40,%rsi
196ed0356edSJason A. Donenfeld	leaq		SIGMA2(%rip),%rax
197ed0356edSJason A. Donenfeld	movb		$0xa,%cl
198ed0356edSJason A. Donenfeld.Lblake2s_compress_avx512_roundloop:
199ed0356edSJason A. Donenfeld	addq		$0x40,%rax
200ed0356edSJason A. Donenfeld	vmovdqa		-0x40(%rax),%ymm8
201ed0356edSJason A. Donenfeld	vmovdqa		-0x20(%rax),%ymm9
202ed0356edSJason A. Donenfeld	vpermi2d	%ymm7,%ymm6,%ymm8
203ed0356edSJason A. Donenfeld	vpermi2d	%ymm7,%ymm6,%ymm9
204ed0356edSJason A. Donenfeld	vmovdqa		%ymm8,%ymm6
205ed0356edSJason A. Donenfeld	vmovdqa		%ymm9,%ymm7
206ed0356edSJason A. Donenfeld	vpaddd		%xmm8,%xmm0,%xmm0
207ed0356edSJason A. Donenfeld	vpaddd		%xmm1,%xmm0,%xmm0
208ed0356edSJason A. Donenfeld	vpxor		%xmm0,%xmm3,%xmm3
209ed0356edSJason A. Donenfeld	vprord		$0x10,%xmm3,%xmm3
210ed0356edSJason A. Donenfeld	vpaddd		%xmm3,%xmm2,%xmm2
211ed0356edSJason A. Donenfeld	vpxor		%xmm2,%xmm1,%xmm1
212ed0356edSJason A. Donenfeld	vprord		$0xc,%xmm1,%xmm1
213ed0356edSJason A. Donenfeld	vextracti128	$0x1,%ymm8,%xmm8
214ed0356edSJason A. Donenfeld	vpaddd		%xmm8,%xmm0,%xmm0
215ed0356edSJason A. Donenfeld	vpaddd		%xmm1,%xmm0,%xmm0
216ed0356edSJason A. Donenfeld	vpxor		%xmm0,%xmm3,%xmm3
217ed0356edSJason A. Donenfeld	vprord		$0x8,%xmm3,%xmm3
218ed0356edSJason A. Donenfeld	vpaddd		%xmm3,%xmm2,%xmm2
219ed0356edSJason A. Donenfeld	vpxor		%xmm2,%xmm1,%xmm1
220ed0356edSJason A. Donenfeld	vprord		$0x7,%xmm1,%xmm1
221ed0356edSJason A. Donenfeld	vpshufd		$0x93,%xmm0,%xmm0
222ed0356edSJason A. Donenfeld	vpshufd		$0x4e,%xmm3,%xmm3
223ed0356edSJason A. Donenfeld	vpshufd		$0x39,%xmm2,%xmm2
224ed0356edSJason A. Donenfeld	vpaddd		%xmm9,%xmm0,%xmm0
225ed0356edSJason A. Donenfeld	vpaddd		%xmm1,%xmm0,%xmm0
226ed0356edSJason A. Donenfeld	vpxor		%xmm0,%xmm3,%xmm3
227ed0356edSJason A. Donenfeld	vprord		$0x10,%xmm3,%xmm3
228ed0356edSJason A. Donenfeld	vpaddd		%xmm3,%xmm2,%xmm2
229ed0356edSJason A. Donenfeld	vpxor		%xmm2,%xmm1,%xmm1
230ed0356edSJason A. Donenfeld	vprord		$0xc,%xmm1,%xmm1
231ed0356edSJason A. Donenfeld	vextracti128	$0x1,%ymm9,%xmm9
232ed0356edSJason A. Donenfeld	vpaddd		%xmm9,%xmm0,%xmm0
233ed0356edSJason A. Donenfeld	vpaddd		%xmm1,%xmm0,%xmm0
234ed0356edSJason A. Donenfeld	vpxor		%xmm0,%xmm3,%xmm3
235ed0356edSJason A. Donenfeld	vprord		$0x8,%xmm3,%xmm3
236ed0356edSJason A. Donenfeld	vpaddd		%xmm3,%xmm2,%xmm2
237ed0356edSJason A. Donenfeld	vpxor		%xmm2,%xmm1,%xmm1
238ed0356edSJason A. Donenfeld	vprord		$0x7,%xmm1,%xmm1
239ed0356edSJason A. Donenfeld	vpshufd		$0x39,%xmm0,%xmm0
240ed0356edSJason A. Donenfeld	vpshufd		$0x4e,%xmm3,%xmm3
241ed0356edSJason A. Donenfeld	vpshufd		$0x93,%xmm2,%xmm2
242ed0356edSJason A. Donenfeld	decb		%cl
243ed0356edSJason A. Donenfeld	jne		.Lblake2s_compress_avx512_roundloop
244ed0356edSJason A. Donenfeld	vpxor		%xmm10,%xmm0,%xmm0
245ed0356edSJason A. Donenfeld	vpxor		%xmm11,%xmm1,%xmm1
246ed0356edSJason A. Donenfeld	vpxor		%xmm2,%xmm0,%xmm0
247ed0356edSJason A. Donenfeld	vpxor		%xmm3,%xmm1,%xmm1
248ed0356edSJason A. Donenfeld	decq		%rdx
249ed0356edSJason A. Donenfeld	jne		.Lblake2s_compress_avx512_mainloop
250ed0356edSJason A. Donenfeld	vmovdqu		%xmm0,(%rdi)
251ed0356edSJason A. Donenfeld	vmovdqu		%xmm1,0x10(%rdi)
252ed0356edSJason A. Donenfeld	vmovdqu		%xmm4,0x20(%rdi)
253ed0356edSJason A. Donenfeld	vzeroupper
254*14b476e0SPeter Zijlstra	RET
2551d872004SLinus TorvaldsSYM_FUNC_END(blake2s_compress_avx512)
256ed0356edSJason A. Donenfeld#endif /* CONFIG_AS_AVX512 */
257