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