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*f94909ceSPeter 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*f94909ceSPeter Zijlstra RET 2551d872004SLinus TorvaldsSYM_FUNC_END(blake2s_compress_avx512) 256ed0356edSJason A. Donenfeld#endif /* CONFIG_AS_AVX512 */ 257