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