xref: /freebsd/crypto/openssl/crypto/sha/asm/keccak1600-avx512vl.pl (revision aa7957345732816fb0ba8308798d2f79f45597f9)
1e71b7053SJung-uk Kim#!/usr/bin/env perl
2*aa795734SPierre Pronchery# Copyright 2017-2023 The OpenSSL Project Authors. All Rights Reserved.
3e71b7053SJung-uk Kim#
4b077aed3SPierre Pronchery# Licensed under the Apache License 2.0 (the "License").  You may not use
5e71b7053SJung-uk Kim# this file except in compliance with the License.  You can obtain a copy
6e71b7053SJung-uk Kim# in the file LICENSE in the source distribution or at
7e71b7053SJung-uk Kim# https://www.openssl.org/source/license.html
8e71b7053SJung-uk Kim#
9e71b7053SJung-uk Kim# ====================================================================
10e71b7053SJung-uk Kim# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
11e71b7053SJung-uk Kim# project. The module is, however, dual licensed under OpenSSL and
12e71b7053SJung-uk Kim# CRYPTOGAMS licenses depending on where you obtain it. For further
13e71b7053SJung-uk Kim# details see http://www.openssl.org/~appro/cryptogams/.
14e71b7053SJung-uk Kim# ====================================================================
15e71b7053SJung-uk Kim#
16e71b7053SJung-uk Kim# Keccak-1600 for AVX512VL.
17e71b7053SJung-uk Kim#
18e71b7053SJung-uk Kim# December 2017.
19e71b7053SJung-uk Kim#
20e71b7053SJung-uk Kim# This is an adaptation of AVX2 module that reuses register data
21e71b7053SJung-uk Kim# layout, but utilizes new 256-bit AVX512VL instructions. See AVX2
22e71b7053SJung-uk Kim# module for further information on layout.
23e71b7053SJung-uk Kim#
24e71b7053SJung-uk Kim########################################################################
25e71b7053SJung-uk Kim# Numbers are cycles per processed byte out of large message.
26e71b7053SJung-uk Kim#
27e71b7053SJung-uk Kim#			r=1088(*)
28e71b7053SJung-uk Kim#
29e71b7053SJung-uk Kim# Skylake-X		6.4/+47%
30e71b7053SJung-uk Kim#
31e71b7053SJung-uk Kim# (*)	Corresponds to SHA3-256. Percentage after slash is improvement
32e71b7053SJung-uk Kim#	coefficient in comparison to scalar keccak1600-x86_64.pl.
33e71b7053SJung-uk Kim
34e71b7053SJung-uk Kim# Digits in variables' names denote right-most coordinates:
35e71b7053SJung-uk Kim
36e71b7053SJung-uk Kimmy ($A00,	# [0][0] [0][0] [0][0] [0][0]		# %ymm0
37e71b7053SJung-uk Kim    $A01,	# [0][4] [0][3] [0][2] [0][1]		# %ymm1
38e71b7053SJung-uk Kim    $A20,	# [3][0] [1][0] [4][0] [2][0]		# %ymm2
39e71b7053SJung-uk Kim    $A31,	# [2][4] [4][3] [1][2] [3][1]		# %ymm3
40e71b7053SJung-uk Kim    $A21,	# [3][4] [1][3] [4][2] [2][1]		# %ymm4
41e71b7053SJung-uk Kim    $A41,	# [1][4] [2][3] [3][2] [4][1]		# %ymm5
42e71b7053SJung-uk Kim    $A11) =	# [4][4] [3][3] [2][2] [1][1]		# %ymm6
43e71b7053SJung-uk Kim    map("%ymm$_",(0..6));
44e71b7053SJung-uk Kim
45e71b7053SJung-uk Kim# We also need to map the magic order into offsets within structure:
46e71b7053SJung-uk Kim
47e71b7053SJung-uk Kimmy @A_jagged = ([0,0], [1,0], [1,1], [1,2], [1,3],	# [0][0..4]
48e71b7053SJung-uk Kim		[2,2], [6,0], [3,1], [4,2], [5,3],	# [1][0..4]
49e71b7053SJung-uk Kim		[2,0], [4,0], [6,1], [5,2], [3,3],	# [2][0..4]
50e71b7053SJung-uk Kim		[2,3], [3,0], [5,1], [6,2], [4,3],	# [3][0..4]
51e71b7053SJung-uk Kim		[2,1], [5,0], [4,1], [3,2], [6,3]);	# [4][0..4]
52e71b7053SJung-uk Kim   @A_jagged = map(8*($$_[0]*4+$$_[1]), @A_jagged);	# ... and now linear
53e71b7053SJung-uk Kim
54e71b7053SJung-uk Kimmy @T = map("%ymm$_",(7..15));
55e71b7053SJung-uk Kimmy ($C14,$C00,$D00,$D14) = @T[5..8];
56e71b7053SJung-uk Kimmy ($R20,$R01,$R31,$R21,$R41,$R11) = map("%ymm$_",(16..21));
57e71b7053SJung-uk Kim
58e71b7053SJung-uk Kim$code.=<<___;
59e71b7053SJung-uk Kim.text
60e71b7053SJung-uk Kim
61e71b7053SJung-uk Kim.type	__KeccakF1600,\@function
62e71b7053SJung-uk Kim.align	32
63e71b7053SJung-uk Kim__KeccakF1600:
64e71b7053SJung-uk Kim	lea		iotas(%rip),%r10
65e71b7053SJung-uk Kim	mov		\$24,%eax
66e71b7053SJung-uk Kim	jmp		.Loop_avx512vl
67e71b7053SJung-uk Kim
68e71b7053SJung-uk Kim.align	32
69e71b7053SJung-uk Kim.Loop_avx512vl:
70e71b7053SJung-uk Kim	######################################### Theta
71e71b7053SJung-uk Kim	vpshufd		\$0b01001110,$A20,$C00
72e71b7053SJung-uk Kim	vpxor		$A31,$A41,$C14
73e71b7053SJung-uk Kim	vpxor		$A11,$A21,@T[2]
74e71b7053SJung-uk Kim	vpternlogq	\$0x96,$A01,$T[2],$C14	# C[1..4]
75e71b7053SJung-uk Kim
76e71b7053SJung-uk Kim	vpxor		$A20,$C00,$C00
77e71b7053SJung-uk Kim	vpermq		\$0b01001110,$C00,@T[0]
78e71b7053SJung-uk Kim
79e71b7053SJung-uk Kim	vpermq		\$0b10010011,$C14,@T[4]
80e71b7053SJung-uk Kim	vprolq		\$1,$C14,@T[1]		# ROL64(C[1..4],1)
81e71b7053SJung-uk Kim
82e71b7053SJung-uk Kim	vpermq		\$0b00111001,@T[1],$D14
83e71b7053SJung-uk Kim	vpxor		@T[4],@T[1],$D00
84e71b7053SJung-uk Kim	vpermq		\$0b00000000,$D00,$D00	# D[0..0] = ROL64(C[1],1) ^ C[4]
85e71b7053SJung-uk Kim
86e71b7053SJung-uk Kim	vpternlogq	\$0x96,@T[0],$A00,$C00	# C[0..0]
87e71b7053SJung-uk Kim	vprolq		\$1,$C00,@T[1]		# ROL64(C[0..0],1)
88e71b7053SJung-uk Kim
89e71b7053SJung-uk Kim	vpxor		$D00,$A00,$A00		# ^= D[0..0]
90e71b7053SJung-uk Kim
91e71b7053SJung-uk Kim	vpblendd	\$0b11000000,@T[1],$D14,$D14
92e71b7053SJung-uk Kim	vpblendd	\$0b00000011,$C00,@T[4],@T[0]
93e71b7053SJung-uk Kim
94e71b7053SJung-uk Kim	######################################### Rho + Pi + pre-Chi shuffle
95e71b7053SJung-uk Kim	 vpxor		$D00,$A20,$A20		# ^= D[0..0] from Theta
96e71b7053SJung-uk Kim	vprolvq		$R20,$A20,$A20
97e71b7053SJung-uk Kim
98e71b7053SJung-uk Kim	 vpternlogq	\$0x96,@T[0],$D14,$A31	# ^= D[1..4] from Theta
99e71b7053SJung-uk Kim	vprolvq		$R31,$A31,$A31
100e71b7053SJung-uk Kim
101e71b7053SJung-uk Kim	 vpternlogq	\$0x96,@T[0],$D14,$A21	# ^= D[1..4] from Theta
102e71b7053SJung-uk Kim	vprolvq		$R21,$A21,$A21
103e71b7053SJung-uk Kim
104e71b7053SJung-uk Kim	 vpternlogq	\$0x96,@T[0],$D14,$A41	# ^= D[1..4] from Theta
105e71b7053SJung-uk Kim	vprolvq		$R41,$A41,$A41
106e71b7053SJung-uk Kim
107e71b7053SJung-uk Kim	 vpermq		\$0b10001101,$A20,@T[3]	# $A20 -> future $A31
108e71b7053SJung-uk Kim	 vpermq		\$0b10001101,$A31,@T[4]	# $A31 -> future $A21
109e71b7053SJung-uk Kim	 vpternlogq	\$0x96,@T[0],$D14,$A11	# ^= D[1..4] from Theta
110e71b7053SJung-uk Kim	vprolvq		$R11,$A11,@T[1]		# $A11 -> future $A01
111e71b7053SJung-uk Kim
112e71b7053SJung-uk Kim	 vpermq		\$0b00011011,$A21,@T[5]	# $A21 -> future $A41
113e71b7053SJung-uk Kim	 vpermq		\$0b01110010,$A41,@T[6]	# $A41 -> future $A11
114e71b7053SJung-uk Kim	 vpternlogq	\$0x96,@T[0],$D14,$A01	# ^= D[1..4] from Theta
115e71b7053SJung-uk Kim	vprolvq		$R01,$A01,@T[2]		# $A01 -> future $A20
116e71b7053SJung-uk Kim
117e71b7053SJung-uk Kim	######################################### Chi
118e71b7053SJung-uk Kim	vpblendd	\$0b00001100,@T[6],@T[2],$A31	#               [4][4] [2][0]
119e71b7053SJung-uk Kim	vpblendd	\$0b00001100,@T[2],@T[4],@T[8]	#               [4][0] [2][1]
120e71b7053SJung-uk Kim	 vpblendd	\$0b00001100,@T[4],@T[3],$A41	#               [4][2] [2][4]
121e71b7053SJung-uk Kim	 vpblendd	\$0b00001100,@T[3],@T[2],@T[7]	#               [4][3] [2][0]
122e71b7053SJung-uk Kim	vpblendd	\$0b00110000,@T[4],$A31,$A31	#        [1][3] [4][4] [2][0]
123e71b7053SJung-uk Kim	vpblendd	\$0b00110000,@T[5],@T[8],@T[8]	#        [1][4] [4][0] [2][1]
124e71b7053SJung-uk Kim	 vpblendd	\$0b00110000,@T[2],$A41,$A41	#        [1][0] [4][2] [2][4]
125e71b7053SJung-uk Kim	 vpblendd	\$0b00110000,@T[6],@T[7],@T[7]	#        [1][1] [4][3] [2][0]
126e71b7053SJung-uk Kim	vpblendd	\$0b11000000,@T[5],$A31,$A31	# [3][2] [1][3] [4][4] [2][0]
127e71b7053SJung-uk Kim	vpblendd	\$0b11000000,@T[6],@T[8],@T[8]	# [3][3] [1][4] [4][0] [2][1]
128e71b7053SJung-uk Kim	 vpblendd	\$0b11000000,@T[6],$A41,$A41	# [3][3] [1][0] [4][2] [2][4]
129e71b7053SJung-uk Kim	 vpblendd	\$0b11000000,@T[4],@T[7],@T[7]	# [3][4] [1][1] [4][3] [2][0]
130e71b7053SJung-uk Kim	vpternlogq	\$0xC6,@T[8],@T[3],$A31		# [3][1] [1][2] [4][3] [2][4]
131e71b7053SJung-uk Kim	 vpternlogq	\$0xC6,@T[7],@T[5],$A41		# [3][2] [1][4] [4][1] [2][3]
132e71b7053SJung-uk Kim
133e71b7053SJung-uk Kim	vpsrldq		\$8,@T[1],@T[0]
134e71b7053SJung-uk Kim	vpandn		@T[0],@T[1],@T[0]	# tgting  [0][0] [0][0] [0][0] [0][0]
135e71b7053SJung-uk Kim
136e71b7053SJung-uk Kim	vpblendd	\$0b00001100,@T[2],@T[5],$A11	#               [4][0] [2][3]
137e71b7053SJung-uk Kim	vpblendd	\$0b00001100,@T[5],@T[3],@T[8]	#               [4][1] [2][4]
138e71b7053SJung-uk Kim	vpblendd	\$0b00110000,@T[3],$A11,$A11	#        [1][2] [4][0] [2][3]
139e71b7053SJung-uk Kim	vpblendd	\$0b00110000,@T[4],@T[8],@T[8]	#        [1][3] [4][1] [2][4]
140e71b7053SJung-uk Kim	vpblendd	\$0b11000000,@T[4],$A11,$A11	# [3][4] [1][2] [4][0] [2][3]
141e71b7053SJung-uk Kim	vpblendd	\$0b11000000,@T[2],@T[8],@T[8]	# [3][0] [1][3] [4][1] [2][4]
142e71b7053SJung-uk Kim	vpternlogq	\$0xC6,@T[8],@T[6],$A11		# [3][3] [1][1] [4][4] [2][2]
143e71b7053SJung-uk Kim
144e71b7053SJung-uk Kim	  vpermq	\$0b00011110,@T[1],$A21		# [0][1] [0][2] [0][4] [0][3]
145e71b7053SJung-uk Kim	  vpblendd	\$0b00110000,$A00,$A21,@T[8]	# [0][1] [0][0] [0][4] [0][3]
146e71b7053SJung-uk Kim	  vpermq	\$0b00111001,@T[1],$A01		# [0][1] [0][4] [0][3] [0][2]
147e71b7053SJung-uk Kim	  vpblendd	\$0b11000000,$A00,$A01,$A01	# [0][0] [0][4] [0][3] [0][2]
148e71b7053SJung-uk Kim
149e71b7053SJung-uk Kim	vpblendd	\$0b00001100,@T[5],@T[4],$A20	#               [4][1] [2][1]
150e71b7053SJung-uk Kim	vpblendd	\$0b00001100,@T[4],@T[6],@T[7]	#               [4][2] [2][2]
151e71b7053SJung-uk Kim	vpblendd	\$0b00110000,@T[6],$A20,$A20	#        [1][1] [4][1] [2][1]
152e71b7053SJung-uk Kim	vpblendd	\$0b00110000,@T[3],@T[7],@T[7]	#        [1][2] [4][2] [2][2]
153e71b7053SJung-uk Kim	vpblendd	\$0b11000000,@T[3],$A20,$A20	# [3][1] [1][1] [4][1] [2][1]
154e71b7053SJung-uk Kim	vpblendd	\$0b11000000,@T[5],@T[7],@T[7]	# [3][2] [1][2] [4][2] [2][2]
155e71b7053SJung-uk Kim	vpternlogq	\$0xC6,@T[7],@T[2],$A20		# [3][0] [1][0] [4][0] [2][0]
156e71b7053SJung-uk Kim
157e71b7053SJung-uk Kim	 vpermq		\$0b00000000,@T[0],@T[0]	# [0][0] [0][0] [0][0] [0][0]
158e71b7053SJung-uk Kim	 vpermq		\$0b00011011,$A31,$A31		# post-Chi shuffle
159e71b7053SJung-uk Kim	 vpermq		\$0b10001101,$A41,$A41
160e71b7053SJung-uk Kim	 vpermq		\$0b01110010,$A11,$A11
161e71b7053SJung-uk Kim
162e71b7053SJung-uk Kim	vpblendd	\$0b00001100,@T[3],@T[6],$A21	#               [4][3] [2][2]
163e71b7053SJung-uk Kim	vpblendd	\$0b00001100,@T[6],@T[5],@T[7]	#               [4][4] [2][3]
164e71b7053SJung-uk Kim	vpblendd	\$0b00110000,@T[5],$A21,$A21	#        [1][4] [4][3] [2][2]
165e71b7053SJung-uk Kim	vpblendd	\$0b00110000,@T[2],@T[7],@T[7]	#        [1][0] [4][4] [2][3]
166e71b7053SJung-uk Kim	vpblendd	\$0b11000000,@T[2],$A21,$A21	# [3][0] [1][4] [4][3] [2][2]
167e71b7053SJung-uk Kim	vpblendd	\$0b11000000,@T[3],@T[7],@T[7]	# [3][1] [1][0] [4][4] [2][3]
168e71b7053SJung-uk Kim
169e71b7053SJung-uk Kim	vpternlogq	\$0xC6,@T[8],@T[1],$A01		# [0][4] [0][3] [0][2] [0][1]
170e71b7053SJung-uk Kim	vpternlogq	\$0xC6,@T[7],@T[4],$A21		# [3][4] [1][3] [4][2] [2][1]
171e71b7053SJung-uk Kim
172e71b7053SJung-uk Kim	######################################### Iota
173e71b7053SJung-uk Kim	vpternlogq	\$0x96,(%r10),@T[0],$A00
174e71b7053SJung-uk Kim	lea		32(%r10),%r10
175e71b7053SJung-uk Kim
176e71b7053SJung-uk Kim	dec		%eax
177e71b7053SJung-uk Kim	jnz		.Loop_avx512vl
178e71b7053SJung-uk Kim
179e71b7053SJung-uk Kim	ret
180e71b7053SJung-uk Kim.size	__KeccakF1600,.-__KeccakF1600
181e71b7053SJung-uk Kim___
182e71b7053SJung-uk Kimmy ($A_flat,$inp,$len,$bsz) = ("%rdi","%rsi","%rdx","%rcx");
183e71b7053SJung-uk Kimmy  $out = $inp;	# in squeeze
184e71b7053SJung-uk Kim
185e71b7053SJung-uk Kim$code.=<<___;
186e71b7053SJung-uk Kim.globl	SHA3_absorb
187e71b7053SJung-uk Kim.type	SHA3_absorb,\@function
188e71b7053SJung-uk Kim.align	32
189e71b7053SJung-uk KimSHA3_absorb:
190e71b7053SJung-uk Kim	mov	%rsp,%r11
191e71b7053SJung-uk Kim
192e71b7053SJung-uk Kim	lea	-240(%rsp),%rsp
193e71b7053SJung-uk Kim	and	\$-32,%rsp
194e71b7053SJung-uk Kim
195e71b7053SJung-uk Kim	lea	96($A_flat),$A_flat
196e71b7053SJung-uk Kim	lea	96($inp),$inp
197e71b7053SJung-uk Kim	lea	96(%rsp),%r10
198e71b7053SJung-uk Kim	lea	rhotates_left(%rip),%r8
199e71b7053SJung-uk Kim
200e71b7053SJung-uk Kim	vzeroupper
201e71b7053SJung-uk Kim
202e71b7053SJung-uk Kim	vpbroadcastq	-96($A_flat),$A00	# load A[5][5]
203e71b7053SJung-uk Kim	vmovdqu		8+32*0-96($A_flat),$A01
204e71b7053SJung-uk Kim	vmovdqu		8+32*1-96($A_flat),$A20
205e71b7053SJung-uk Kim	vmovdqu		8+32*2-96($A_flat),$A31
206e71b7053SJung-uk Kim	vmovdqu		8+32*3-96($A_flat),$A21
207e71b7053SJung-uk Kim	vmovdqu		8+32*4-96($A_flat),$A41
208e71b7053SJung-uk Kim	vmovdqu		8+32*5-96($A_flat),$A11
209e71b7053SJung-uk Kim
210e71b7053SJung-uk Kim	vmovdqa64	0*32(%r8),$R20		# load "rhotate" indices
211e71b7053SJung-uk Kim	vmovdqa64	1*32(%r8),$R01
212e71b7053SJung-uk Kim	vmovdqa64	2*32(%r8),$R31
213e71b7053SJung-uk Kim	vmovdqa64	3*32(%r8),$R21
214e71b7053SJung-uk Kim	vmovdqa64	4*32(%r8),$R41
215e71b7053SJung-uk Kim	vmovdqa64	5*32(%r8),$R11
216e71b7053SJung-uk Kim
217e71b7053SJung-uk Kim	vpxor		@T[0],@T[0],@T[0]
218e71b7053SJung-uk Kim	vmovdqa		@T[0],32*2-96(%r10)	# zero transfer area on stack
219e71b7053SJung-uk Kim	vmovdqa		@T[0],32*3-96(%r10)
220e71b7053SJung-uk Kim	vmovdqa		@T[0],32*4-96(%r10)
221e71b7053SJung-uk Kim	vmovdqa		@T[0],32*5-96(%r10)
222e71b7053SJung-uk Kim	vmovdqa		@T[0],32*6-96(%r10)
223e71b7053SJung-uk Kim
224e71b7053SJung-uk Kim.Loop_absorb_avx512vl:
225e71b7053SJung-uk Kim	mov		$bsz,%rax
226e71b7053SJung-uk Kim	sub		$bsz,$len
227e71b7053SJung-uk Kim	jc		.Ldone_absorb_avx512vl
228e71b7053SJung-uk Kim
229e71b7053SJung-uk Kim	shr		\$3,%eax
230e71b7053SJung-uk Kim	vpbroadcastq	0-96($inp),@T[0]
231e71b7053SJung-uk Kim	vmovdqu		8-96($inp),@T[1]
232e71b7053SJung-uk Kim	sub		\$4,%eax
233e71b7053SJung-uk Kim___
234e71b7053SJung-uk Kimfor(my $i=5; $i<25; $i++) {
235e71b7053SJung-uk Kim$code.=<<___
236e71b7053SJung-uk Kim	dec	%eax
237e71b7053SJung-uk Kim	jz	.Labsorved_avx512vl
238e71b7053SJung-uk Kim	mov	8*$i-96($inp),%r8
239e71b7053SJung-uk Kim	mov	%r8,$A_jagged[$i]-96(%r10)
240e71b7053SJung-uk Kim___
241e71b7053SJung-uk Kim}
242e71b7053SJung-uk Kim$code.=<<___;
243e71b7053SJung-uk Kim.Labsorved_avx512vl:
244e71b7053SJung-uk Kim	lea	($inp,$bsz),$inp
245e71b7053SJung-uk Kim
246e71b7053SJung-uk Kim	vpxor	@T[0],$A00,$A00
247e71b7053SJung-uk Kim	vpxor	@T[1],$A01,$A01
248e71b7053SJung-uk Kim	vpxor	32*2-96(%r10),$A20,$A20
249e71b7053SJung-uk Kim	vpxor	32*3-96(%r10),$A31,$A31
250e71b7053SJung-uk Kim	vpxor	32*4-96(%r10),$A21,$A21
251e71b7053SJung-uk Kim	vpxor	32*5-96(%r10),$A41,$A41
252e71b7053SJung-uk Kim	vpxor	32*6-96(%r10),$A11,$A11
253e71b7053SJung-uk Kim
254e71b7053SJung-uk Kim	call	__KeccakF1600
255e71b7053SJung-uk Kim
256e71b7053SJung-uk Kim	lea	96(%rsp),%r10
257e71b7053SJung-uk Kim	jmp	.Loop_absorb_avx512vl
258e71b7053SJung-uk Kim
259e71b7053SJung-uk Kim.Ldone_absorb_avx512vl:
260e71b7053SJung-uk Kim	vmovq	%xmm0,-96($A_flat)
261e71b7053SJung-uk Kim	vmovdqu	$A01,8+32*0-96($A_flat)
262e71b7053SJung-uk Kim	vmovdqu	$A20,8+32*1-96($A_flat)
263e71b7053SJung-uk Kim	vmovdqu	$A31,8+32*2-96($A_flat)
264e71b7053SJung-uk Kim	vmovdqu	$A21,8+32*3-96($A_flat)
265e71b7053SJung-uk Kim	vmovdqu	$A41,8+32*4-96($A_flat)
266e71b7053SJung-uk Kim	vmovdqu	$A11,8+32*5-96($A_flat)
267e71b7053SJung-uk Kim
268e71b7053SJung-uk Kim	vzeroupper
269e71b7053SJung-uk Kim
270e71b7053SJung-uk Kim	lea	(%r11),%rsp
271e71b7053SJung-uk Kim	lea	($len,$bsz),%rax		# return value
272e71b7053SJung-uk Kim	ret
273e71b7053SJung-uk Kim.size	SHA3_absorb,.-SHA3_absorb
274e71b7053SJung-uk Kim
275e71b7053SJung-uk Kim.globl	SHA3_squeeze
276e71b7053SJung-uk Kim.type	SHA3_squeeze,\@function
277e71b7053SJung-uk Kim.align	32
278e71b7053SJung-uk KimSHA3_squeeze:
279e71b7053SJung-uk Kim	mov	%rsp,%r11
280e71b7053SJung-uk Kim
281e71b7053SJung-uk Kim	lea	96($A_flat),$A_flat
282e71b7053SJung-uk Kim	lea	rhotates_left(%rip),%r8
283e71b7053SJung-uk Kim	shr	\$3,$bsz
284e71b7053SJung-uk Kim
285e71b7053SJung-uk Kim	vzeroupper
286e71b7053SJung-uk Kim
287e71b7053SJung-uk Kim	vpbroadcastq	-96($A_flat),$A00
288e71b7053SJung-uk Kim	vpxor		@T[0],@T[0],@T[0]
289e71b7053SJung-uk Kim	vmovdqu		8+32*0-96($A_flat),$A01
290e71b7053SJung-uk Kim	vmovdqu		8+32*1-96($A_flat),$A20
291e71b7053SJung-uk Kim	vmovdqu		8+32*2-96($A_flat),$A31
292e71b7053SJung-uk Kim	vmovdqu		8+32*3-96($A_flat),$A21
293e71b7053SJung-uk Kim	vmovdqu		8+32*4-96($A_flat),$A41
294e71b7053SJung-uk Kim	vmovdqu		8+32*5-96($A_flat),$A11
295e71b7053SJung-uk Kim
296e71b7053SJung-uk Kim	vmovdqa64	0*32(%r8),$R20		# load "rhotate" indices
297e71b7053SJung-uk Kim	vmovdqa64	1*32(%r8),$R01
298e71b7053SJung-uk Kim	vmovdqa64	2*32(%r8),$R31
299e71b7053SJung-uk Kim	vmovdqa64	3*32(%r8),$R21
300e71b7053SJung-uk Kim	vmovdqa64	4*32(%r8),$R41
301e71b7053SJung-uk Kim	vmovdqa64	5*32(%r8),$R11
302e71b7053SJung-uk Kim
303e71b7053SJung-uk Kim	mov	$bsz,%rax
304e71b7053SJung-uk Kim
305e71b7053SJung-uk Kim.Loop_squeeze_avx512vl:
306e71b7053SJung-uk Kim	mov	@A_jagged[$i]-96($A_flat),%r8
307e71b7053SJung-uk Kim___
308e71b7053SJung-uk Kimfor (my $i=0; $i<25; $i++) {
309e71b7053SJung-uk Kim$code.=<<___;
310e71b7053SJung-uk Kim	sub	\$8,$len
311e71b7053SJung-uk Kim	jc	.Ltail_squeeze_avx512vl
312e71b7053SJung-uk Kim	mov	%r8,($out)
313e71b7053SJung-uk Kim	lea	8($out),$out
314e71b7053SJung-uk Kim	je	.Ldone_squeeze_avx512vl
315e71b7053SJung-uk Kim	dec	%eax
316e71b7053SJung-uk Kim	je	.Lextend_output_avx512vl
317e71b7053SJung-uk Kim	mov	@A_jagged[$i+1]-120($A_flat),%r8
318e71b7053SJung-uk Kim___
319e71b7053SJung-uk Kim}
320e71b7053SJung-uk Kim$code.=<<___;
321e71b7053SJung-uk Kim.Lextend_output_avx512vl:
322e71b7053SJung-uk Kim	call	__KeccakF1600
323e71b7053SJung-uk Kim
324e71b7053SJung-uk Kim	vmovq	%xmm0,-96($A_flat)
325e71b7053SJung-uk Kim	vmovdqu	$A01,8+32*0-96($A_flat)
326e71b7053SJung-uk Kim	vmovdqu	$A20,8+32*1-96($A_flat)
327e71b7053SJung-uk Kim	vmovdqu	$A31,8+32*2-96($A_flat)
328e71b7053SJung-uk Kim	vmovdqu	$A21,8+32*3-96($A_flat)
329e71b7053SJung-uk Kim	vmovdqu	$A41,8+32*4-96($A_flat)
330e71b7053SJung-uk Kim	vmovdqu	$A11,8+32*5-96($A_flat)
331e71b7053SJung-uk Kim
332e71b7053SJung-uk Kim	mov	$bsz,%rax
333e71b7053SJung-uk Kim	jmp	.Loop_squeeze_avx512vl
334e71b7053SJung-uk Kim
335e71b7053SJung-uk Kim
336e71b7053SJung-uk Kim.Ltail_squeeze_avx512vl:
337e71b7053SJung-uk Kim	add	\$8,$len
338e71b7053SJung-uk Kim.Loop_tail_avx512vl:
339e71b7053SJung-uk Kim	mov	%r8b,($out)
340e71b7053SJung-uk Kim	lea	1($out),$out
341e71b7053SJung-uk Kim	shr	\$8,%r8
342e71b7053SJung-uk Kim	dec	$len
343e71b7053SJung-uk Kim	jnz	.Loop_tail_avx512vl
344e71b7053SJung-uk Kim
345e71b7053SJung-uk Kim.Ldone_squeeze_avx512vl:
346e71b7053SJung-uk Kim	vzeroupper
347e71b7053SJung-uk Kim
348e71b7053SJung-uk Kim	lea	(%r11),%rsp
349e71b7053SJung-uk Kim	ret
350e71b7053SJung-uk Kim.size	SHA3_squeeze,.-SHA3_squeeze
351e71b7053SJung-uk Kim
352*aa795734SPierre Pronchery.section .rodata
353e71b7053SJung-uk Kim.align	64
354e71b7053SJung-uk Kimrhotates_left:
355e71b7053SJung-uk Kim	.quad	3,	18,	36,	41	# [2][0] [4][0] [1][0] [3][0]
356e71b7053SJung-uk Kim	.quad	1,	62,	28,	27	# [0][1] [0][2] [0][3] [0][4]
357e71b7053SJung-uk Kim	.quad	45,	6,	56,	39	# [3][1] [1][2] [4][3] [2][4]
358e71b7053SJung-uk Kim	.quad	10,	61,	55,	8	# [2][1] [4][2] [1][3] [3][4]
359e71b7053SJung-uk Kim	.quad	2,	15,	25,	20	# [4][1] [3][2] [2][3] [1][4]
360e71b7053SJung-uk Kim	.quad	44,	43,	21,	14	# [1][1] [2][2] [3][3] [4][4]
361e71b7053SJung-uk Kimiotas:
362e71b7053SJung-uk Kim	.quad	0x0000000000000001, 0x0000000000000001, 0x0000000000000001, 0x0000000000000001
363e71b7053SJung-uk Kim	.quad	0x0000000000008082, 0x0000000000008082, 0x0000000000008082, 0x0000000000008082
364e71b7053SJung-uk Kim	.quad	0x800000000000808a, 0x800000000000808a, 0x800000000000808a, 0x800000000000808a
365e71b7053SJung-uk Kim	.quad	0x8000000080008000, 0x8000000080008000, 0x8000000080008000, 0x8000000080008000
366e71b7053SJung-uk Kim	.quad	0x000000000000808b, 0x000000000000808b, 0x000000000000808b, 0x000000000000808b
367e71b7053SJung-uk Kim	.quad	0x0000000080000001, 0x0000000080000001, 0x0000000080000001, 0x0000000080000001
368e71b7053SJung-uk Kim	.quad	0x8000000080008081, 0x8000000080008081, 0x8000000080008081, 0x8000000080008081
369e71b7053SJung-uk Kim	.quad	0x8000000000008009, 0x8000000000008009, 0x8000000000008009, 0x8000000000008009
370e71b7053SJung-uk Kim	.quad	0x000000000000008a, 0x000000000000008a, 0x000000000000008a, 0x000000000000008a
371e71b7053SJung-uk Kim	.quad	0x0000000000000088, 0x0000000000000088, 0x0000000000000088, 0x0000000000000088
372e71b7053SJung-uk Kim	.quad	0x0000000080008009, 0x0000000080008009, 0x0000000080008009, 0x0000000080008009
373e71b7053SJung-uk Kim	.quad	0x000000008000000a, 0x000000008000000a, 0x000000008000000a, 0x000000008000000a
374e71b7053SJung-uk Kim	.quad	0x000000008000808b, 0x000000008000808b, 0x000000008000808b, 0x000000008000808b
375e71b7053SJung-uk Kim	.quad	0x800000000000008b, 0x800000000000008b, 0x800000000000008b, 0x800000000000008b
376e71b7053SJung-uk Kim	.quad	0x8000000000008089, 0x8000000000008089, 0x8000000000008089, 0x8000000000008089
377e71b7053SJung-uk Kim	.quad	0x8000000000008003, 0x8000000000008003, 0x8000000000008003, 0x8000000000008003
378e71b7053SJung-uk Kim	.quad	0x8000000000008002, 0x8000000000008002, 0x8000000000008002, 0x8000000000008002
379e71b7053SJung-uk Kim	.quad	0x8000000000000080, 0x8000000000000080, 0x8000000000000080, 0x8000000000000080
380e71b7053SJung-uk Kim	.quad	0x000000000000800a, 0x000000000000800a, 0x000000000000800a, 0x000000000000800a
381e71b7053SJung-uk Kim	.quad	0x800000008000000a, 0x800000008000000a, 0x800000008000000a, 0x800000008000000a
382e71b7053SJung-uk Kim	.quad	0x8000000080008081, 0x8000000080008081, 0x8000000080008081, 0x8000000080008081
383e71b7053SJung-uk Kim	.quad	0x8000000000008080, 0x8000000000008080, 0x8000000000008080, 0x8000000000008080
384e71b7053SJung-uk Kim	.quad	0x0000000080000001, 0x0000000080000001, 0x0000000080000001, 0x0000000080000001
385e71b7053SJung-uk Kim	.quad	0x8000000080008008, 0x8000000080008008, 0x8000000080008008, 0x8000000080008008
386e71b7053SJung-uk Kim
387e71b7053SJung-uk Kim.asciz	"Keccak-1600 absorb and squeeze for AVX512VL, CRYPTOGAMS by <appro\@openssl.org>"
388e71b7053SJung-uk Kim___
389e71b7053SJung-uk Kim
390b077aed3SPierre Pronchery$output=pop and open STDOUT,">$output";
391e71b7053SJung-uk Kimprint $code;
39217f01e99SJung-uk Kimclose STDOUT or die "error closing STDOUT: $!";
393