1
0
mirror of https://github.com/BLAKE3-team/BLAKE3 synced 2025-01-21 15:50:01 +01:00
BLAKE3/c/blake3_avx512_x86-64_windows_msvc.asm
2024-09-04 01:24:44 +01:00

2224 lines
75 KiB
NASM

public _blake3_hash_many_avx512
public blake3_hash_many_avx512
public blake3_compress_in_place_avx512
public _blake3_compress_in_place_avx512
public blake3_compress_xof_avx512
public _blake3_compress_xof_avx512
public _blake3_xof_many_avx512
public blake3_xof_many_avx512
_TEXT SEGMENT ALIGN(16) 'CODE'
ALIGN 16
blake3_hash_many_avx512 PROC
_blake3_hash_many_avx512 PROC
push rbx
push rbp
push rsi
push rdi
push r12
push r13
push r14
push r15
mov rbp, rsp
sub rsp, 1E8h
movaps xmmword ptr [rbp-0A8h], xmm6
movaps xmmword ptr [rbp-98h], xmm7
movaps xmmword ptr [rbp-88h], xmm8
movaps xmmword ptr [rbp-78h], xmm9
movaps xmmword ptr [rbp-68h], xmm10
movaps xmmword ptr [rbp-58h], xmm11
movaps xmmword ptr [rbp-48h], xmm12
movaps xmmword ptr [rbp-38h], xmm13
movaps xmmword ptr [rbp-28h], xmm14
movaps xmmword ptr [rbp-18h], xmm15
and rsp, -40h
mov rax, qword ptr [rbp+68h]
movzx ebx, byte ptr [rbp+70h]
neg ebx
kmovw k1, ebx
vpbroadcastd ymm0, eax
shr rax, 20h
vpbroadcastd ymm1, eax
vmovdqa32 ymm2 {k1} {z}, ymmword ptr [ADD0+0]
vmovdqa32 ymm3 {k1} {z}, ymmword ptr [ADD0+32]
vpaddd ymm2, ymm0, ymm2
vmovdqa ymmword ptr [rsp], ymm2
vpaddd ymm3, ymm0, ymm3
vmovdqa ymmword ptr [rsp+20h], ymm3
vpcmpud k2 {k1}, ymm2, ymm0, 1h
vpcmpud k3 {k1}, ymm3, ymm0, 1h
vmovdqa ymm2, ymm1
vpaddd ymm2 {k2}, ymm2, dword bcst [ADD1]
vmovdqa ymmword ptr [rsp+40h], ymm2
vpaddd ymm1 {k3}, ymm1, dword bcst [ADD1]
vmovdqa ymmword ptr [rsp+60h], ymm1
shl r8, 6h
mov qword ptr [rsp+100h], r8
cmp rdx, 8h
jbe final8blocks
ALIGN 16
outerloop16:
vpbroadcastd zmm0, dword ptr [r9]
vpbroadcastd zmm1, dword ptr [r9+4h]
vpbroadcastd zmm2, dword ptr [r9+8h]
vpbroadcastd zmm3, dword ptr [r9+0Ch]
vpbroadcastd zmm4, dword ptr [r9+10h]
vpbroadcastd zmm5, dword ptr [r9+14h]
vpbroadcastd zmm6, dword ptr [r9+18h]
vpbroadcastd zmm7, dword ptr [r9+1Ch]
movzx eax, byte ptr [rbp+78h]
movzx ebx, byte ptr [rbp+80h]
or eax, ebx
xor ebx, ebx
innerloop16:
movzx esi, byte ptr [rbp+88h]
or esi, eax
add rbx, 40h
cmp rbx, qword ptr [rsp+100h]
cmovz eax, esi
mov dword ptr [rsp+80h], eax
mov rax, qword ptr [rcx]
mov rsi, qword ptr [rcx+8h]
mov rdi, qword ptr [rcx+10h]
mov r8, qword ptr [rcx+18h]
mov r10, qword ptr [rcx+40h]
vmovdqu32 ymm8, ymmword ptr [rax+rbx*1-40h]
vinserti64x4 zmm8, zmm8, ymmword ptr [r10+rbx*1-40h], 1h
vmovdqu32 ymm9, ymmword ptr [rsi+rbx*1-40h]
cmp rdx, 0Ah
jb @F
mov r11, qword ptr [rcx+48h]
vinserti64x4 zmm9, zmm9, ymmword ptr [r11+rbx*1-40h], 1h
@@:
vpunpckldq zmm10, zmm8, zmm9
vpunpckhdq zmm11, zmm8, zmm9
vmovdqu32 ymm8, ymmword ptr [rdi+rbx*1-40h]
cmp rdx, 0Bh
jb @F
mov r12, qword ptr [rcx+50h]
vinserti64x4 zmm8, zmm8, ymmword ptr [r12+rbx*1-40h], 1h
@@:
vmovdqu32 ymm9, ymmword ptr [r8+rbx*1-40h]
cmp rdx, 0Ch
jb @F
mov r13, qword ptr [rcx+58h]
vinserti64x4 zmm9, zmm9, ymmword ptr [r13+rbx*1-40h], 1h
@@:
vpunpckldq zmm12, zmm8, zmm9
vpunpckhdq zmm13, zmm8, zmm9
mov rax, qword ptr [rcx+20h]
mov rsi, qword ptr [rcx+28h]
mov rdi, qword ptr [rcx+30h]
mov r8, qword ptr [rcx+38h]
vmovdqu32 ymm8, ymmword ptr [rax+rbx*1-40h]
cmp rdx, 0Dh
jb @F
mov r10, qword ptr [rcx+60h]
vinserti64x4 zmm8, zmm8, ymmword ptr [r10+rbx*1-40h], 1h
@@:
vmovdqu32 ymm9, ymmword ptr [rsi+rbx*1-40h]
cmp rdx, 0Eh
jb @F
mov r11, qword ptr [rcx+68h]
vinserti64x4 zmm9, zmm9, ymmword ptr [r11+rbx*1-40h], 1h
@@:
vpunpckldq zmm14, zmm8, zmm9
vpunpckhdq zmm15, zmm8, zmm9
vmovdqu32 ymm8, ymmword ptr [rdi+rbx*1-40h]
cmp rdx, 0Fh
jb @F
mov r12, qword ptr [rcx+70h]
vinserti64x4 zmm8, zmm8, ymmword ptr [r12+rbx*1-40h], 1h
@@:
vmovdqu32 ymm9, ymmword ptr [r8+rbx*1-40h]
cmp rdx, 10h
jb @F
mov r13, qword ptr [rcx+78h]
vinserti64x4 zmm9, zmm9, ymmword ptr [r13+rbx*1-40h], 1h
@@:
vpunpckldq zmm16, zmm8, zmm9
vpunpckhdq zmm17, zmm8, zmm9
vmovdqa32 zmm8, zmmword ptr [INDEX0]
vmovdqa32 zmm9, zmmword ptr [INDEX1]
vpunpcklqdq zmm18, zmm10, zmm12
vpunpcklqdq zmm20, zmm14, zmm16
vmovdqa32 zmm19, zmm18
vpermt2d zmm18, zmm8, zmm20
vpermt2d zmm19, zmm9, zmm20
vpunpckhqdq zmm20, zmm10, zmm12
vpunpckhqdq zmm22, zmm14, zmm16
vmovdqa32 zmm21, zmm20
vpermt2d zmm20, zmm8, zmm22
vpermt2d zmm21, zmm9, zmm22
vpunpcklqdq zmm10, zmm11, zmm13
vpunpcklqdq zmm14, zmm15, zmm17
vmovdqa32 zmm12, zmm10
vpermt2d zmm10, zmm8, zmm14
vpermt2d zmm12, zmm9, zmm14
vpunpckhqdq zmm14, zmm11, zmm13
vpunpckhqdq zmm22, zmm15, zmm17
vmovdqa32 zmm16, zmm14
vpermt2d zmm14, zmm8, zmm22
vpermt2d zmm16, zmm9, zmm22
mov rax, qword ptr [rcx]
mov rsi, qword ptr [rcx+8h]
mov rdi, qword ptr [rcx+10h]
mov r8, qword ptr [rcx+18h]
mov r10, qword ptr [rcx+40h]
vmovdqu32 ymm11, ymmword ptr [rax+rbx*1-20h]
vinserti64x4 zmm11, zmm11, ymmword ptr [r10+rbx*1-20h], 1h
vmovdqu32 ymm13, ymmword ptr [rsi+rbx*1-20h]
cmp rdx, 0Ah
jb @F
mov r11, qword ptr [rcx+48h]
vinserti64x4 zmm13, zmm13, ymmword ptr [r11+rbx*1-20h], 1h
prefetcht0 byte ptr [r11+rbx*1+80h]
@@:
vpunpckldq zmm15, zmm11, zmm13
vpunpckhdq zmm17, zmm11, zmm13
vmovdqu32 ymm11, ymmword ptr [rdi+rbx*1-20h]
cmp rdx, 0Bh
jb @F
mov r12, qword ptr [rcx+50h]
vinserti64x4 zmm11, zmm11, ymmword ptr [r12+rbx*1-20h], 1h
prefetcht0 byte ptr [r13+rbx*1+80h]
@@:
vmovdqu32 ymm13, ymmword ptr [r8+rbx*1-20h]
cmp rdx, 0Ch
jb @F
mov r13, qword ptr [rcx+58h]
vinserti64x4 zmm13, zmm13, ymmword ptr [r13+rbx*1-20h], 1h
prefetcht0 byte ptr [r13+rbx*1+80h]
@@:
vpunpckldq zmm22, zmm11, zmm13
vpunpckhdq zmm23, zmm11, zmm13
prefetcht0 byte ptr [rax+rbx*1+80h]
prefetcht0 byte ptr [rsi+rbx*1+80h]
prefetcht0 byte ptr [rdi+rbx*1+80h]
prefetcht0 byte ptr [r8+rbx*1+80h]
prefetcht0 byte ptr [r10+rbx*1+80h]
mov rax, qword ptr [rcx+20h]
mov rsi, qword ptr [rcx+28h]
mov rdi, qword ptr [rcx+30h]
mov r8, qword ptr [rcx+38h]
vmovdqu32 ymm11, ymmword ptr [rax+rbx*1-20h]
cmp rdx, 0Dh
jb @F
mov r10, qword ptr [rcx+60h]
vinserti64x4 zmm11, zmm11, ymmword ptr [r10+rbx*1-20h], 1h
prefetcht0 byte ptr [r10+rbx*1+80h]
@@:
vmovdqu32 ymm13, ymmword ptr [rsi+rbx*1-20h]
cmp rdx, 0Eh
jb @F
mov r11, qword ptr [rcx+68h]
vinserti64x4 zmm13, zmm13, ymmword ptr [r11+rbx*1-20h], 1h
prefetcht0 byte ptr [r11+rbx*1+80h]
@@:
vpunpckldq zmm24, zmm11, zmm13
vpunpckhdq zmm25, zmm11, zmm13
vmovdqu32 ymm11, ymmword ptr [rdi+rbx*1-20h]
cmp rdx, 0Fh
jb @F
mov r12, qword ptr [rcx+70h]
vinserti64x4 zmm11, zmm11, ymmword ptr [r12+rbx*1-20h], 1h
prefetcht0 byte ptr [r12+rbx*1+80h]
@@:
vmovdqu32 ymm13, ymmword ptr [r8+rbx*1-20h]
cmp rdx, 10h
jb @F
mov r13, qword ptr [rcx+78h]
vinserti64x4 zmm13, zmm13, ymmword ptr [r13+rbx*1-20h], 1h
prefetcht0 byte ptr [r13+rbx*1+80h]
@@:
vpunpckldq zmm26, zmm11, zmm13
vpunpckhdq zmm27, zmm11, zmm13
prefetcht0 byte ptr [r10+rbx*1+80h]
prefetcht0 byte ptr [r11+rbx*1+80h]
prefetcht0 byte ptr [r12+rbx*1+80h]
prefetcht0 byte ptr [r13+rbx*1+80h]
vpunpcklqdq zmm11, zmm15, zmm22
vpunpcklqdq zmm28, zmm24, zmm26
vmovdqa32 zmm13, zmm11
vpermt2d zmm11, zmm8, zmm28
vpermt2d zmm13, zmm9, zmm28
vpunpckhqdq zmm28, zmm15, zmm22
vpunpckhqdq zmm30, zmm24, zmm26
vmovdqa32 zmm29, zmm28
vpermt2d zmm28, zmm8, zmm30
vpermt2d zmm29, zmm9, zmm30
vpunpcklqdq zmm15, zmm17, zmm23
vpunpcklqdq zmm24, zmm25, zmm27
vmovdqa32 zmm22, zmm15
vpermt2d zmm15, zmm8, zmm24
vpermt2d zmm22, zmm9, zmm24
vpunpckhqdq zmm24, zmm17, zmm23
vpunpckhqdq zmm26, zmm25, zmm27
vpermi2d zmm8, zmm24, zmm26
vpermi2d zmm9, zmm24, zmm26
vpbroadcastd zmm17, dword ptr [BLAKE3_IV_0]
vpbroadcastd zmm23, dword ptr [BLAKE3_IV_1]
vpbroadcastd zmm24, dword ptr [BLAKE3_IV_2]
vpbroadcastd zmm25, dword ptr [BLAKE3_IV_3]
vmovdqa32 zmm26, zmmword ptr [rsp]
vmovdqa32 zmm27, zmmword ptr [rsp+40h]
vpbroadcastd zmm30, dword ptr [BLAKE3_BLOCK_LEN]
vpbroadcastd zmm31, dword ptr [rsp+80h]
mov al, 7h
@@:
vpaddd zmm0, zmm0, zmm18
vpaddd zmm1, zmm1, zmm10
vpaddd zmm2, zmm2, zmm19
vpaddd zmm3, zmm3, zmm12
vmovdqa32 zmmword ptr [rsp+80h], zmm18
vmovdqa32 zmmword ptr [rsp+0C0h], zmm12
vpaddd zmm0, zmm0, zmm4
vpaddd zmm1, zmm1, zmm5
vpaddd zmm2, zmm2, zmm6
vpaddd zmm3, zmm3, zmm7
vpxord zmm26, zmm26, zmm0
vmovdqa32 zmm18, zmm10
vpxord zmm27, zmm27, zmm1
vpxord zmm30, zmm30, zmm2
vpxord zmm31, zmm31, zmm3
vprord zmm26, zmm26, 10h
vprord zmm27, zmm27, 10h
vprord zmm30, zmm30, 10h
vprord zmm31, zmm31, 10h
vpaddd zmm17, zmm17, zmm26
vmovdqa32 zmm12, zmm19
vpaddd zmm23, zmm23, zmm27
vpaddd zmm24, zmm24, zmm30
vpaddd zmm25, zmm25, zmm31
vpxord zmm4, zmm4, zmm17
vpxord zmm5, zmm5, zmm23
vpxord zmm6, zmm6, zmm24
vpxord zmm7, zmm7, zmm25
vprord zmm4, zmm4, 0Ch
vprord zmm5, zmm5, 0Ch
vprord zmm6, zmm6, 0Ch
vprord zmm7, zmm7, 0Ch
vpaddd zmm0, zmm0, zmm20
vpaddd zmm1, zmm1, zmm14
vpaddd zmm2, zmm2, zmm21
vpaddd zmm3, zmm3, zmm16
vpaddd zmm0, zmm0, zmm4
vmovdqa32 zmm10, zmm14
vpaddd zmm1, zmm1, zmm5
vpaddd zmm2, zmm2, zmm6
vpaddd zmm3, zmm3, zmm7
vpxord zmm26, zmm26, zmm0
vpxord zmm27, zmm27, zmm1
vpxord zmm30, zmm30, zmm2
vpxord zmm31, zmm31, zmm3
vprord zmm26, zmm26, 8h
vmovdqa32 zmm19, zmm16
vprord zmm27, zmm27, 8h
vprord zmm30, zmm30, 8h
vprord zmm31, zmm31, 8h
vpaddd zmm17, zmm17, zmm26
vpaddd zmm23, zmm23, zmm27
vpaddd zmm24, zmm24, zmm30
vpaddd zmm25, zmm25, zmm31
vpxord zmm4, zmm4, zmm17
vmovdqa32 zmm14, zmm15
vpxord zmm5, zmm5, zmm23
vpxord zmm6, zmm6, zmm24
vpxord zmm7, zmm7, zmm25
vprord zmm4, zmm4, 7h
vprord zmm5, zmm5, 7h
vprord zmm6, zmm6, 7h
vprord zmm7, zmm7, 7h
vpaddd zmm0, zmm0, zmm11
vmovdqa32 zmm16, zmm29
vpaddd zmm1, zmm1, zmm15
vpaddd zmm2, zmm2, zmm13
vpaddd zmm3, zmm3, zmm22
vpaddd zmm0, zmm0, zmm5
vpaddd zmm1, zmm1, zmm6
vpaddd zmm2, zmm2, zmm7
vpaddd zmm3, zmm3, zmm4
vpxord zmm31, zmm31, zmm0
vmovdqa32 zmm15, zmm13
vpxord zmm26, zmm26, zmm1
vpxord zmm27, zmm27, zmm2
vpxord zmm30, zmm30, zmm3
vprord zmm31, zmm31, 10h
vprord zmm26, zmm26, 10h
vprord zmm27, zmm27, 10h
vprord zmm30, zmm30, 10h
vpaddd zmm24, zmm24, zmm31
vmovdqa32 zmm13, zmm28
vpaddd zmm25, zmm25, zmm26
vpaddd zmm17, zmm17, zmm27
vpaddd zmm23, zmm23, zmm30
vpxord zmm5, zmm5, zmm24
vpxord zmm6, zmm6, zmm25
vpxord zmm7, zmm7, zmm17
vpxord zmm4, zmm4, zmm23
vprord zmm5, zmm5, 0Ch
vprord zmm6, zmm6, 0Ch
vprord zmm7, zmm7, 0Ch
vprord zmm4, zmm4, 0Ch
vpaddd zmm0, zmm0, zmm28
vpaddd zmm1, zmm1, zmm8
vpaddd zmm2, zmm2, zmm29
vmovdqa32 zmm29, zmm22
vpaddd zmm3, zmm3, zmm9
vpaddd zmm0, zmm0, zmm5
vpaddd zmm1, zmm1, zmm6
vpaddd zmm2, zmm2, zmm7
vmovdqa32 zmm28, zmm8
vpaddd zmm3, zmm3, zmm4
vpxord zmm31, zmm31, zmm0
vpxord zmm26, zmm26, zmm1
vmovdqa32 zmm22, zmm9
vpxord zmm27, zmm27, zmm2
vpxord zmm30, zmm30, zmm3
vprord zmm31, zmm31, 8h
vmovdqa32 zmm8, zmm21
vprord zmm26, zmm26, 8h
vprord zmm27, zmm27, 8h
vprord zmm30, zmm30, 8h
vmovdqa32 zmm9, zmm11
vpaddd zmm24, zmm24, zmm31
vpaddd zmm25, zmm25, zmm26
vpaddd zmm17, zmm17, zmm27
vpaddd zmm23, zmm23, zmm30
vmovdqa32 zmm11, zmm20
vpxord zmm5, zmm5, zmm24
vpxord zmm6, zmm6, zmm25
vpxord zmm7, zmm7, zmm17
vpxord zmm4, zmm4, zmm23
vmovdqa32 zmm21, zmmword ptr [rsp+80h]
vprord zmm5, zmm5, 7h
vprord zmm6, zmm6, 7h
vprord zmm7, zmm7, 7h
vprord zmm4, zmm4, 7h
vmovdqa32 zmm20, zmmword ptr [rsp+0C0h]
dec al
jnz @B
vpxord zmm0, zmm0, zmm17
vpxord zmm1, zmm1, zmm23
vpxord zmm2, zmm2, zmm24
vpxord zmm3, zmm3, zmm25
vpxord zmm4, zmm4, zmm26
vpxord zmm5, zmm5, zmm27
vpxord zmm6, zmm6, zmm30
vpxord zmm7, zmm7, zmm31
movzx eax, byte ptr [rbp+78h]
cmp rbx, qword ptr [rsp+100h]
jb innerloop16
mov rsi, qword ptr [rbp+90h]
vpunpckldq zmm8, zmm0, zmm2
vpunpckhdq zmm9, zmm0, zmm2
vpunpckldq zmm10, zmm1, zmm3
vpunpckhdq zmm11, zmm1, zmm3
vpunpckldq zmm12, zmm4, zmm6
vpunpckhdq zmm13, zmm4, zmm6
vpunpckldq zmm14, zmm5, zmm7
vpunpckhdq zmm15, zmm5, zmm7
vpunpckldq zmm0, zmm8, zmm10
vpunpckhdq zmm1, zmm8, zmm10
vpunpckldq zmm2, zmm9, zmm11
vpunpckhdq zmm3, zmm9, zmm11
vpunpckldq zmm4, zmm12, zmm14
vpunpckhdq zmm5, zmm12, zmm14
vpunpckldq zmm6, zmm13, zmm15
vpunpckhdq zmm7, zmm13, zmm15
vmovdqa32 zmm16, zmmword ptr [INDEX0]
vmovdqa32 zmm18, zmmword ptr [INDEX1]
vmovdqa32 zmm8, zmm0
vpermt2d zmm8, zmm16, zmm4
vpermt2d zmm0, zmm18, zmm4
vmovdqa32 zmm10, zmm1
vpermt2d zmm10, zmm16, zmm5
vpermt2d zmm1, zmm18, zmm5
vmovdqa32 zmm12, zmm2
vpermt2d zmm12, zmm16, zmm6
vpermt2d zmm2, zmm18, zmm6
vmovdqa32 zmm14, zmm3
vpermt2d zmm14, zmm16, zmm7
vpermt2d zmm3, zmm18, zmm7
vextracti64x4 ymmword ptr [rsi], zmm8, 0h
vextracti64x4 ymmword ptr [rsi+20h], zmm10, 0h
vextracti64x4 ymmword ptr [rsi+40h], zmm12, 0h
vextracti64x4 ymmword ptr [rsi+60h], zmm14, 0h
vextracti64x4 ymmword ptr [rsi+80h], zmm0, 0h
vextracti64x4 ymmword ptr [rsi+0A0h], zmm1, 0h
vextracti64x4 ymmword ptr [rsi+0C0h], zmm2, 0h
vextracti64x4 ymmword ptr [rsi+0E0h], zmm3, 0h
vextracti64x4 ymmword ptr [rsi+100h], zmm8, 1h
cmp rdx, 0Ah
jb unwind
vextracti64x4 ymmword ptr [rsi+120h], zmm10, 1h
cmp rdx, 0Bh
jb unwind
vextracti64x4 ymmword ptr [rsi+140h], zmm12, 1h
cmp rdx, 0Ch
jb unwind
vextracti64x4 ymmword ptr [rsi+160h], zmm14, 1h
cmp rdx, 0Dh
jb unwind
vextracti64x4 ymmword ptr [rsi+180h], zmm0, 1h
cmp rdx, 0Eh
jb unwind
vextracti64x4 ymmword ptr [rsi+1A0h], zmm1, 1h
cmp rdx, 0Fh
jb unwind
vextracti64x4 ymmword ptr [rsi+1C0h], zmm2, 1h
cmp rdx, 10h
jb unwind
vextracti64x4 ymmword ptr [rsi+1E0h], zmm3, 1h
vmovdqa32 zmm8, zmmword ptr [rsp]
vmovdqa32 zmm9, zmmword ptr [rsp+40h]
vmovdqa32 zmm10, zmm8
vpaddd zmm10 {k1}, zmm8, dword bcst [ADD16]
vpcmpud k2 {k1}, zmm10, zmm8, 1h
vpaddd zmm9 {k2}, zmm9, dword bcst [ADD1]
vmovdqa32 zmmword ptr [rsp], zmm10
vmovdqa32 zmmword ptr [rsp+40h], zmm9
add rsi, 200h
mov qword ptr [rbp+90h], rsi
add rcx, 80h
sub rdx, 10h
cmp rdx, 8h
jnbe outerloop16
test rdx, rdx
jnz final8blocks
unwind:
vzeroupper
movaps xmm6, xmmword ptr [rbp-0A8h]
movaps xmm7, xmmword ptr [rbp-98h]
movaps xmm8, xmmword ptr [rbp-88h]
movaps xmm9, xmmword ptr [rbp-78h]
movaps xmm10, xmmword ptr [rbp-68h]
movaps xmm11, xmmword ptr [rbp-58h]
movaps xmm12, xmmword ptr [rbp-48h]
movaps xmm13, xmmword ptr [rbp-38h]
movaps xmm14, xmmword ptr [rbp-28h]
movaps xmm15, xmmword ptr [rbp-18h]
mov rsp, rbp
pop r15
pop r14
pop r13
pop r12
pop rdi
pop rsi
pop rbp
pop rbx
ret
ALIGN 16
final8blocks:
cmp dl, 4h
jbe final4blocks
vpbroadcastd ymm0, dword ptr [r9]
vpbroadcastd ymm1, dword ptr [r9+4h]
vpbroadcastd ymm2, dword ptr [r9+8h]
vpbroadcastd ymm3, dword ptr [r9+0Ch]
vpbroadcastd ymm4, dword ptr [r9+10h]
vpbroadcastd ymm5, dword ptr [r9+14h]
vpbroadcastd ymm6, dword ptr [r9+18h]
vpbroadcastd ymm7, dword ptr [r9+1Ch]
movzx eax, byte ptr [rbp+78h]
movzx ebx, byte ptr [rbp+80h]
or eax, ebx
xor ebx, ebx
innerloop8:
movzx esi, byte ptr [rbp+88h]
or esi, eax
add rbx, 40h
cmp rbx, qword ptr [rsp+100h]
cmovz eax, esi
mov dword ptr [rsp+80h], eax
mov rax, qword ptr [rcx]
mov rsi, qword ptr [rcx+20h]
vmovups xmm8, xmmword ptr [rax+rbx*1-40h]
vinserti32x4 ymm8, ymm8, xmmword ptr [rsi+rbx*1-40h], 1h
vmovups xmm12, xmmword ptr [rax+rbx*1-30h]
vinserti32x4 ymm12, ymm12, xmmword ptr [rsi+rbx*1-30h], 1h
mov rax, qword ptr [rcx+8h]
vmovups xmm9, xmmword ptr [rax+rbx*1-40h]
vmovups xmm13, xmmword ptr [rax+rbx*1-30h]
cmp dl, 6h
jb @F
mov rsi, qword ptr [rcx+28h]
vinserti32x4 ymm9, ymm9, xmmword ptr [rsi+rbx*1-40h], 1h
vinserti32x4 ymm13, ymm13, xmmword ptr [rsi+rbx*1-30h], 1h
@@:
mov rax, qword ptr [rcx+10h]
vmovups xmm10, xmmword ptr [rax+rbx*1-40h]
vmovups xmm14, xmmword ptr [rax+rbx*1-30h]
cmp dl, 7h
jb @F
mov rsi, qword ptr [rcx+30h]
vinserti32x4 ymm10, ymm10, xmmword ptr [rsi+rbx*1-40h], 1h
vinserti32x4 ymm14, ymm14, xmmword ptr [rsi+rbx*1-30h], 1h
@@:
mov rax, qword ptr [rcx+18h]
vmovups xmm11, xmmword ptr [rax+rbx*1-40h]
vmovups xmm15, xmmword ptr [rax+rbx*1-30h]
cmp dl, 8h
jb @F
mov rsi, qword ptr [rcx+38h]
vinserti32x4 ymm11, ymm11, xmmword ptr [rsi+rbx*1-40h], 1h
vinserti32x4 ymm15, ymm15, xmmword ptr [rsi+rbx*1-30h], 1h
@@:
vpunpckldq ymm24, ymm8, ymm9
vpunpckhdq ymm9, ymm8, ymm9
vpunpckldq ymm8, ymm10, ymm11
vpunpckhdq ymm11, ymm10, ymm11
vpunpckldq ymm10, ymm12, ymm13
vpunpckhdq ymm13, ymm12, ymm13
vpunpckldq ymm12, ymm14, ymm15
vpunpckhdq ymm15, ymm14, ymm15
vshufps ymm14, ymm24, ymm8, 44h
vshufps ymm8, ymm24, ymm8, 0EEh
vshufps ymm24, ymm9, ymm11, 44h
vshufps ymm11, ymm9, ymm11, 0EEh
vshufps ymm9, ymm10, ymm12, 44h
vshufps ymm12, ymm10, ymm12, 0EEh
vshufps ymm10, ymm13, ymm15, 44h
vshufps ymm15, ymm13, ymm15, 0EEh
mov rax, qword ptr [rcx]
mov rsi, qword ptr [rcx+20h]
vmovups xmm16, xmmword ptr [rax+rbx*1-20h]
vinserti32x4 ymm16, ymm16, xmmword ptr [rsi+rbx*1-20h], 1h
vmovups xmm20, xmmword ptr [rax+rbx*1-10h]
vinserti32x4 ymm20, ymm20, xmmword ptr [rsi+rbx*1-10h], 1h
mov rax, qword ptr [rcx+8h]
vmovups xmm17, xmmword ptr [rax+rbx*1-20h]
vmovups xmm21, xmmword ptr [rax+rbx*1-10h]
cmp dl, 6h
jb @F
mov rsi, qword ptr [rcx+28h]
vinserti32x4 ymm17, ymm17, xmmword ptr [rsi+rbx*1-20h], 1h
vinserti32x4 ymm21, ymm21, xmmword ptr [rsi+rbx*1-10h], 1h
@@:
mov rax, qword ptr [rcx+10h]
vmovups xmm18, xmmword ptr [rax+rbx*1-20h]
vmovups xmm22, xmmword ptr [rax+rbx*1-10h]
cmp dl, 7h
jb @F
mov rsi, qword ptr [rcx+30h]
vinserti32x4 ymm18, ymm18, xmmword ptr [rsi+rbx*1-20h], 1h
vinserti32x4 ymm22, ymm22, xmmword ptr [rsi+rbx*1-10h], 1h
@@:
mov rax, qword ptr [rcx+18h]
vmovups xmm19, xmmword ptr [rax+rbx*1-20h]
vmovups xmm23, xmmword ptr [rax+rbx*1-10h]
cmp dl, 8h
jb @F
mov rsi, qword ptr [rcx+38h]
vinserti32x4 ymm19, ymm19, xmmword ptr [rsi+rbx*1-20h], 1h
vinserti32x4 ymm23, ymm23, xmmword ptr [rsi+rbx*1-10h], 1h
@@:
vpunpckldq ymm13, ymm16, ymm17
vpunpckhdq ymm17, ymm16, ymm17
vpunpckldq ymm16, ymm18, ymm19
vpunpckhdq ymm19, ymm18, ymm19
vpunpckldq ymm18, ymm20, ymm21
vpunpckhdq ymm21, ymm20, ymm21
vpunpckldq ymm20, ymm22, ymm23
vpunpckhdq ymm23, ymm22, ymm23
vshufps ymm22, ymm13, ymm16, 44h
vshufps ymm16, ymm13, ymm16, 0EEh
vshufps ymm13, ymm17, ymm19, 44h
vshufps ymm19, ymm17, ymm19, 0EEh
vshufps ymm17, ymm18, ymm20, 44h
vshufps ymm20, ymm18, ymm20, 0EEh
vshufps ymm18, ymm21, ymm23, 44h
vshufps ymm23, ymm21, ymm23, 0EEh
vpbroadcastd ymm21, dword ptr [BLAKE3_IV_0]
vpbroadcastd ymm25, dword ptr [BLAKE3_IV_1]
vpbroadcastd ymm26, dword ptr [BLAKE3_IV_2]
vpbroadcastd ymm27, dword ptr [BLAKE3_IV_3]
vmovdqa32 ymm28, ymmword ptr [rsp]
vmovdqa32 ymm29, ymmword ptr [rsp+40h]
vpbroadcastd ymm30, dword ptr [BLAKE3_BLOCK_LEN]
vpbroadcastd ymm31, dword ptr [rsp+80h]
mov al, 7h
@@:
vpaddd ymm0, ymm0, ymm14
vpaddd ymm1, ymm1, ymm24
vpaddd ymm2, ymm2, ymm9
vpaddd ymm3, ymm3, ymm10
vmovdqa32 ymmword ptr [rsp+80h], ymm14
vmovdqa32 ymmword ptr [rsp+0C0h], ymm10
vpaddd ymm0, ymm0, ymm4
vpaddd ymm1, ymm1, ymm5
vpaddd ymm2, ymm2, ymm6
vpaddd ymm3, ymm3, ymm7
vpxord ymm28, ymm28, ymm0
vmovdqa32 ymm14, ymm24
vpxord ymm29, ymm29, ymm1
vpxord ymm30, ymm30, ymm2
vpxord ymm31, ymm31, ymm3
vprord ymm28, ymm28, 10h
vprord ymm29, ymm29, 10h
vprord ymm30, ymm30, 10h
vprord ymm31, ymm31, 10h
vpaddd ymm21, ymm21, ymm28
vmovdqa32 ymm10, ymm9
vpaddd ymm25, ymm25, ymm29
vpaddd ymm26, ymm26, ymm30
vpaddd ymm27, ymm27, ymm31
vpxord ymm4, ymm4, ymm21
vpxord ymm5, ymm5, ymm25
vpxord ymm6, ymm6, ymm26
vpxord ymm7, ymm7, ymm27
vprord ymm4, ymm4, 0Ch
vprord ymm5, ymm5, 0Ch
vprord ymm6, ymm6, 0Ch
vprord ymm7, ymm7, 0Ch
vpaddd ymm0, ymm0, ymm8
vpaddd ymm1, ymm1, ymm11
vpaddd ymm2, ymm2, ymm12
vpaddd ymm3, ymm3, ymm15
vpaddd ymm0, ymm0, ymm4
vmovdqa32 ymm24, ymm11
vpaddd ymm1, ymm1, ymm5
vpaddd ymm2, ymm2, ymm6
vpaddd ymm3, ymm3, ymm7
vpxord ymm28, ymm28, ymm0
vpxord ymm29, ymm29, ymm1
vpxord ymm30, ymm30, ymm2
vpxord ymm31, ymm31, ymm3
vprord ymm28, ymm28, 8h
vmovdqa32 ymm9, ymm15
vprord ymm29, ymm29, 8h
vprord ymm30, ymm30, 8h
vprord ymm31, ymm31, 8h
vpaddd ymm21, ymm21, ymm28
vpaddd ymm25, ymm25, ymm29
vpaddd ymm26, ymm26, ymm30
vpaddd ymm27, ymm27, ymm31
vpxord ymm4, ymm4, ymm21
vmovdqa32 ymm11, ymm13
vpxord ymm5, ymm5, ymm25
vpxord ymm6, ymm6, ymm26
vpxord ymm7, ymm7, ymm27
vprord ymm4, ymm4, 7h
vprord ymm5, ymm5, 7h
vprord ymm6, ymm6, 7h
vprord ymm7, ymm7, 7h
vpaddd ymm0, ymm0, ymm22
vmovdqa32 ymm15, ymm20
vpaddd ymm1, ymm1, ymm13
vpaddd ymm2, ymm2, ymm17
vpaddd ymm3, ymm3, ymm18
vpaddd ymm0, ymm0, ymm5
vpaddd ymm1, ymm1, ymm6
vpaddd ymm2, ymm2, ymm7
vpaddd ymm3, ymm3, ymm4
vpxord ymm31, ymm31, ymm0
vmovdqa32 ymm13, ymm17
vpxord ymm28, ymm28, ymm1
vpxord ymm29, ymm29, ymm2
vpxord ymm30, ymm30, ymm3
vprord ymm31, ymm31, 10h
vprord ymm28, ymm28, 10h
vprord ymm29, ymm29, 10h
vprord ymm30, ymm30, 10h
vpaddd ymm26, ymm26, ymm31
vmovdqa32 ymm17, ymm16
vpaddd ymm27, ymm27, ymm28
vpaddd ymm21, ymm21, ymm29
vpaddd ymm25, ymm25, ymm30
vpxord ymm5, ymm5, ymm26
vpxord ymm6, ymm6, ymm27
vpxord ymm7, ymm7, ymm21
vpxord ymm4, ymm4, ymm25
vprord ymm5, ymm5, 0Ch
vprord ymm6, ymm6, 0Ch
vprord ymm7, ymm7, 0Ch
vprord ymm4, ymm4, 0Ch
vpaddd ymm0, ymm0, ymm16
vpaddd ymm1, ymm1, ymm19
vpaddd ymm2, ymm2, ymm20
vmovdqa32 ymm20, ymm18
vpaddd ymm3, ymm3, ymm23
vpaddd ymm0, ymm0, ymm5
vpaddd ymm1, ymm1, ymm6
vpaddd ymm2, ymm2, ymm7
vmovdqa32 ymm16, ymm19
vpaddd ymm3, ymm3, ymm4
vpxord ymm31, ymm31, ymm0
vpxord ymm28, ymm28, ymm1
vmovdqa32 ymm18, ymm23
vpxord ymm29, ymm29, ymm2
vpxord ymm30, ymm30, ymm3
vprord ymm31, ymm31, 8h
vmovdqa32 ymm19, ymm12
vprord ymm28, ymm28, 8h
vprord ymm29, ymm29, 8h
vprord ymm30, ymm30, 8h
vmovdqa32 ymm23, ymm22
vpaddd ymm26, ymm26, ymm31
vpaddd ymm27, ymm27, ymm28
vpaddd ymm21, ymm21, ymm29
vpaddd ymm25, ymm25, ymm30
vmovdqa32 ymm22, ymm8
vpxord ymm5, ymm5, ymm26
vpxord ymm6, ymm6, ymm27
vpxord ymm7, ymm7, ymm21
vpxord ymm4, ymm4, ymm25
vmovdqa32 ymm12, ymmword ptr [rsp+80h]
vprord ymm5, ymm5, 7h
vprord ymm6, ymm6, 7h
vprord ymm7, ymm7, 7h
vprord ymm4, ymm4, 7h
vmovdqa32 ymm8, ymmword ptr [rsp+0C0h]
dec al
jnz @B
vpxord ymm0, ymm0, ymm21
vpxord ymm1, ymm1, ymm25
vpxord ymm2, ymm2, ymm26
vpxord ymm3, ymm3, ymm27
vpxord ymm4, ymm4, ymm28
vpxord ymm5, ymm5, ymm29
vpxord ymm6, ymm6, ymm30
vpxord ymm7, ymm7, ymm31
movzx eax, byte ptr [rbp+78h]
cmp rbx, qword ptr [rsp+100h]
jb innerloop8
mov rsi, qword ptr [rbp+90h]
vpunpckldq ymm8, ymm0, ymm1
vpunpckldq ymm9, ymm2, ymm3
vpunpckhdq ymm10, ymm0, ymm1
vpunpckldq ymm11, ymm4, ymm5
vpunpckldq ymm0, ymm6, ymm7
vshufps ymm12, ymm8, ymm9, 4Eh
vpblendd ymm1, ymm8, ymm12, 0CCh
vshufps ymm8, ymm11, ymm0, 4Eh
vpunpckhdq ymm13, ymm2, ymm3
vpblendd ymm2, ymm11, ymm8, 0CCh
vpblendd ymm3, ymm12, ymm9, 0CCh
vperm2i128 ymm12, ymm1, ymm2, 20h
vmovdqu ymmword ptr [rsi], ymm12
vpunpckhdq ymm14, ymm4, ymm5
vpblendd ymm4, ymm8, ymm0, 0CCh
vpunpckhdq ymm15, ymm6, ymm7
vperm2i128 ymm7, ymm3, ymm4, 20h
vmovdqu ymmword ptr [rsi+20h], ymm7
vshufps ymm5, ymm10, ymm13, 4Eh
vpblendd ymm6, ymm5, ymm13, 0CCh
vshufps ymm13, ymm14, ymm15, 4Eh
vpblendd ymm10, ymm10, ymm5, 0CCh
vpblendd ymm14, ymm14, ymm13, 0CCh
vperm2i128 ymm8, ymm10, ymm14, 20h
vmovdqu ymmword ptr [rsi+40h], ymm8
vpblendd ymm15, ymm13, ymm15, 0CCh
vperm2i128 ymm13, ymm6, ymm15, 20h
vmovdqu ymmword ptr [rsi+60h], ymm13
vperm2i128 ymm9, ymm1, ymm2, 31h
vmovdqu ymmword ptr [rsi+80h], ymm9
cmp dl, 6h
jb @F
vperm2i128 ymm11, ymm3, ymm4, 31h
vmovdqu ymmword ptr [rsi+0A0h], ymm11
cmp dl, 7h
jb @F
vperm2i128 ymm14, ymm10, ymm14, 31h
vmovdqu ymmword ptr [rsi+0C0h], ymm14
cmp dl, 8h
jb @F
vperm2i128 ymm15, ymm6, ymm15, 31h
vmovdqu ymmword ptr [rsi+0E0h], ymm15
@@:
jmp unwind
final4blocks:
mov rax, qword ptr [rsp+100h]
mov rbx, qword ptr [rbp+90h]
movzx esi, byte ptr [rbp+78h]
movzx edi, byte ptr [rbp+88h]
mov r8d, 0AAAAh
kmovw k2, r8d
mov r8d, 8888h
kmovw k3, r8d
cmp dl, 2h
jbe final2blocks
vbroadcasti32x4 zmm0, xmmword ptr [r9]
vbroadcasti32x4 zmm1, xmmword ptr [r9+10h]
vbroadcasti32x4 zmm4, xmmword ptr [BLAKE3_IV]
mov r8d, 4444h
kmovw k4, r8d
vmovdqa xmm6, xmmword ptr [rsp]
vmovdqa xmm7, xmmword ptr [rsp+40h]
vpbroadcastd zmm5, dword ptr [BLAKE3_BLOCK_LEN]
vpunpckldq xmm8, xmm6, xmm7
vpunpckhdq xmm7, xmm6, xmm7
vinserti64x4 zmm8, zmm8, ymm7, 1h
vpermq zmm8, zmm8, 0DCh
vpblendmd zmm5 {k4}, zmm8, zmm5
mov r8, qword ptr [rcx]
mov r10, qword ptr [rcx+8h]
mov r11, qword ptr [rcx+10h]
cmp dl, 4h
jb @F
mov r12, qword ptr [rcx+18h]
@@:
movzx r13d, byte ptr [rbp+80h]
or r13d, esi
xor r14d, r14d
innerloop4:
movzx r15d, byte ptr [rbp+88h]
or r15d, r13d
add r14, 40h
cmp r14, rax
cmovz r13d, r15d
mov dword ptr [rsp+80h], r13d
vmovdqa32 zmm2, zmm4
vpblendmd zmm3 {k3}, zmm5, dword bcst [rsp+80h]
vmovdqu32 zmm10, zmmword ptr [r8+r14*1-40h]
vmovdqu32 zmm11, zmmword ptr [r8+r14*1-30h]
vmovdqu32 zmm12, zmmword ptr [r8+r14*1-20h]
vmovdqu32 zmm13, zmmword ptr [r8+r14*1-10h]
vinserti32x4 zmm10, zmm10, xmmword ptr [r10+r14*1-40h], 1h
vinserti32x4 zmm11, zmm11, xmmword ptr [r10+r14*1-30h], 1h
vinserti32x4 zmm12, zmm12, xmmword ptr [r10+r14*1-20h], 1h
vinserti32x4 zmm13, zmm13, xmmword ptr [r10+r14*1-10h], 1h
vinserti32x4 zmm10, zmm10, xmmword ptr [r11+r14*1-40h], 2h
vinserti32x4 zmm11, zmm11, xmmword ptr [r11+r14*1-30h], 2h
vinserti32x4 zmm12, zmm12, xmmword ptr [r11+r14*1-20h], 2h
vinserti32x4 zmm13, zmm13, xmmword ptr [r11+r14*1-10h], 2h
cmp dl, 4h
jb @F
vinserti32x4 zmm10, zmm10, xmmword ptr [r12+r14*1-40h], 3h
vinserti32x4 zmm11, zmm11, xmmword ptr [r12+r14*1-30h], 3h
vinserti32x4 zmm12, zmm12, xmmword ptr [r12+r14*1-20h], 3h
vinserti32x4 zmm13, zmm13, xmmword ptr [r12+r14*1-10h], 3h
@@:
vshufps zmm6, zmm10, zmm11, 88h
vshufps zmm7, zmm10, zmm11, 0DDh
vshufps zmm8, zmm12, zmm13, 88h
vshufps zmm9, zmm12, zmm13, 0DDh
vpshufd zmm8, zmm8, 93h
vpshufd zmm9, zmm9, 93h
mov r15b, 7h
@@:
vpaddd zmm0, zmm0, zmm6
vpaddd zmm0, zmm0, zmm1
vpxord zmm3, zmm3, zmm0
vprord zmm3, zmm3, 10h
vpaddd zmm2, zmm2, zmm3
vpxord zmm1, zmm1, zmm2
vprord zmm1, zmm1, 0Ch
vpaddd zmm0, zmm0, zmm7
vpaddd zmm0, zmm0, zmm1
vpxord zmm3, zmm3, zmm0
vprord zmm3, zmm3, 8h
vpaddd zmm2, zmm2, zmm3
vpxord zmm1, zmm1, zmm2
vprord zmm1, zmm1, 7h
vpshufd zmm0, zmm0, 93h
vpshufd zmm3, zmm3, 4Eh
vpshufd zmm2, zmm2, 39h
vpaddd zmm0, zmm0, zmm8
vpaddd zmm0, zmm0, zmm1
vpxord zmm3, zmm3, zmm0
vprord zmm3, zmm3, 10h
vpaddd zmm2, zmm2, zmm3
vpxord zmm1, zmm1, zmm2
vprord zmm1, zmm1, 0Ch
vpaddd zmm0, zmm0, zmm9
vpaddd zmm0, zmm0, zmm1
vpxord zmm3, zmm3, zmm0
vprord zmm3, zmm3, 8h
vpaddd zmm2, zmm2, zmm3
vpxord zmm1, zmm1, zmm2
vprord zmm1, zmm1, 7h
vpshufd zmm0, zmm0, 39h
vpshufd zmm3, zmm3, 4Eh
vpshufd zmm2, zmm2, 93h
dec r15b
jz @F
vshufps zmm14, zmm6, zmm7, 0D6h
vpshufd zmm15, zmm6, 0Fh
vpshufd zmm6, zmm14, 39h
vshufps zmm14, zmm8, zmm9, 0FAh
vpblendmd zmm15 {k2}, zmm15, zmm14
vpunpcklqdq zmm14, zmm9, zmm7
vpblendmd zmm14 {k3}, zmm14, zmm8
vpshufd zmm14, zmm14, 78h
vpunpckhdq zmm7, zmm7, zmm9
vpunpckldq zmm8, zmm8, zmm7
vpshufd zmm9, zmm8, 1Eh
vmovdqa32 zmm7, zmm15
vmovdqa32 zmm8, zmm14
jmp @B
@@:
vpxord zmm0, zmm0, zmm2
vpxord zmm1, zmm1, zmm3
mov r13d, esi
cmp r14, rax
jb innerloop4
vmovdqu xmmword ptr [rbx], xmm0
vmovdqu xmmword ptr [rbx+10h], xmm1
vextracti128 xmmword ptr [rbx+20h], ymm0, 1h
vextracti128 xmmword ptr [rbx+30h], ymm1, 1h
vextracti32x4 xmmword ptr [rbx+40h], zmm0, 2h
vextracti32x4 xmmword ptr [rbx+50h], zmm1, 2h
cmp dl, 4h
jb @F
vextracti32x4 xmmword ptr [rbx+60h], zmm0, 3h
vextracti32x4 xmmword ptr [rbx+70h], zmm1, 3h
@@:
jmp unwind
final2blocks:
test dl, dl
jz unwind
vbroadcasti128 ymm0, xmmword ptr [r9]
vbroadcasti128 ymm1, xmmword ptr [r9+10h]
vbroadcasti128 ymm4, xmmword ptr [BLAKE3_IV]
vmovdqa xmm6, xmmword ptr [rsp]
vmovdqa xmm7, xmmword ptr [rsp+40h]
mov r8d, 40h
vpbroadcastq ymm5, r8
mov r8d, 55h
kmovw k4, r8d
vpunpckldq xmm8, xmm6, xmm7
vpunpckhdq xmm7, xmm6, xmm7
vinserti128 ymm8, ymm8, xmm7, 1h
vpermq ymm5 {k4}, ymm8, 0DCh
mov r8, qword ptr [rcx]
cmp dl, 2h
jb @F
mov r10, qword ptr [rcx+8h]
@@:
mov r11d, esi
movzx r12d, byte ptr [rbp+80h]
or r11d, r12d
xor r12d, r12d
innerloop2:
movzx r13d, byte ptr [rbp+88h]
or r13d, r11d
add r12, 40h
cmp r12, rax
cmovz r11d, r13d
mov dword ptr [rsp+80h], r11d
vmovdqa ymm2, ymm4
vpblendmd ymm3 {k3}, ymm5, dword bcst [rsp+80h]
vmovdqu ymm10, ymmword ptr [r8+r12*1-40h]
vmovdqu ymm11, ymmword ptr [r8+r12*1-30h]
vmovdqu ymm12, ymmword ptr [r8+r12*1-20h]
vmovdqu ymm13, ymmword ptr [r8+r12*1-10h]
cmp dl, 2h
jb @F
vinserti128 ymm10, ymm10, xmmword ptr [r10+r12*1-40h], 1h
vinserti128 ymm11, ymm11, xmmword ptr [r10+r12*1-30h], 1h
vinserti128 ymm12, ymm12, xmmword ptr [r10+r12*1-20h], 1h
vinserti128 ymm13, ymm13, xmmword ptr [r10+r12*1-10h], 1h
@@:
vshufps ymm6, ymm10, ymm11, 88h
vshufps ymm7, ymm10, ymm11, 0DDh
vshufps ymm8, ymm12, ymm13, 88h
vshufps ymm9, ymm12, ymm13, 0DDh
vpshufd ymm8, ymm8, 93h
vpshufd ymm9, ymm9, 93h
mov r13b, 7h
@@:
vpaddd ymm0, ymm0, ymm6
vpaddd ymm0, ymm0, ymm1
vpxord ymm3, ymm3, ymm0
vprord ymm3, ymm3, 10h
vpaddd ymm2, ymm2, ymm3
vpxord ymm1, ymm1, ymm2
vprord ymm1, ymm1, 0Ch
vpaddd ymm0, ymm0, ymm7
vpaddd ymm0, ymm0, ymm1
vpxord ymm3, ymm3, ymm0
vprord ymm3, ymm3, 8h
vpaddd ymm2, ymm2, ymm3
vpxord ymm1, ymm1, ymm2
vprord ymm1, ymm1, 7h
vpshufd ymm0, ymm0, 93h
vpshufd ymm3, ymm3, 4Eh
vpshufd ymm2, ymm2, 39h
vpaddd ymm0, ymm0, ymm8
vpaddd ymm0, ymm0, ymm1
vpxord ymm3, ymm3, ymm0
vprord ymm3, ymm3, 10h
vpaddd ymm2, ymm2, ymm3
vpxord ymm1, ymm1, ymm2
vprord ymm1, ymm1, 0Ch
vpaddd ymm0, ymm0, ymm9
vpaddd ymm0, ymm0, ymm1
vpxord ymm3, ymm3, ymm0
vprord ymm3, ymm3, 8h
vpaddd ymm2, ymm2, ymm3
vpxord ymm1, ymm1, ymm2
vprord ymm1, ymm1, 7h
vpshufd ymm0, ymm0, 39h
vpshufd ymm3, ymm3, 4Eh
vpshufd ymm2, ymm2, 93h
dec r13b
jz @F
vshufps ymm10, ymm6, ymm7, 0D6h
vpshufd ymm11, ymm6, 0Fh
vpshufd ymm6, ymm10, 39h
vshufps ymm10, ymm8, ymm9, 0FAh
vpblendd ymm11, ymm11, ymm10, 0AAh
vpunpcklqdq ymm10, ymm9, ymm7
vpblendd ymm10, ymm10, ymm8, 88h
vpshufd ymm10, ymm10, 78h
vpunpckhdq ymm7, ymm7, ymm9
vpunpckldq ymm8, ymm8, ymm7
vpshufd ymm9, ymm8, 1Eh
vmovdqa ymm7, ymm11
vmovdqa ymm8, ymm10
jmp @B
@@:
vpxor ymm0, ymm0, ymm2
vpxor ymm1, ymm1, ymm3
mov r11d, esi
cmp r12, rax
jb innerloop2
vmovdqu xmmword ptr [rbx], xmm0
vmovdqu xmmword ptr [rbx+10h], xmm1
cmp dl, 2h
jb @F
vextracti128 xmmword ptr [rbx+20h], ymm0, 1h
vextracti128 xmmword ptr [rbx+30h], ymm1, 1h
@@:
jmp unwind
_blake3_hash_many_avx512 ENDP
blake3_hash_many_avx512 ENDP
ALIGN 16
blake3_compress_in_place_avx512 PROC
_blake3_compress_in_place_avx512 PROC
sub rsp, 72
vmovdqa xmmword ptr [rsp], xmm6
vmovdqa xmmword ptr [rsp+10H], xmm7
vmovdqa xmmword ptr [rsp+20H], xmm8
vmovdqa xmmword ptr [rsp+30H], xmm9
vmovdqu xmm0, xmmword ptr [rcx]
vmovdqu xmm1, xmmword ptr [rcx+10H]
movzx eax, byte ptr [rsp+70H]
movzx r8d, r8b
shl rax, 32
add r8, rax
vmovq xmm3, r9
vmovq xmm4, r8
vpunpcklqdq xmm3, xmm3, xmm4
vmovaps xmm2, xmmword ptr [BLAKE3_IV]
vmovups xmm8, xmmword ptr [rdx]
vmovups xmm9, xmmword ptr [rdx+10H]
vshufps xmm4, xmm8, xmm9, 136
vshufps xmm5, xmm8, xmm9, 221
vmovups xmm8, xmmword ptr [rdx+20H]
vmovups xmm9, xmmword ptr [rdx+30H]
vshufps xmm6, xmm8, xmm9, 136
vshufps xmm7, xmm8, xmm9, 221
vpshufd xmm6, xmm6, 93H
vpshufd xmm7, xmm7, 93H
mov al, 7
@@:
vpaddd xmm0, xmm0, xmm4
vpaddd xmm0, xmm0, xmm1
vpxord xmm3, xmm3, xmm0
vprord xmm3, xmm3, 16
vpaddd xmm2, xmm2, xmm3
vpxord xmm1, xmm1, xmm2
vprord xmm1, xmm1, 12
vpaddd xmm0, xmm0, xmm5
vpaddd xmm0, xmm0, xmm1
vpxord xmm3, xmm3, xmm0
vprord xmm3, xmm3, 8
vpaddd xmm2, xmm2, xmm3
vpxord xmm1, xmm1, xmm2
vprord xmm1, xmm1, 7
vpshufd xmm0, xmm0, 93H
vpshufd xmm3, xmm3, 4EH
vpshufd xmm2, xmm2, 39H
vpaddd xmm0, xmm0, xmm6
vpaddd xmm0, xmm0, xmm1
vpxord xmm3, xmm3, xmm0
vprord xmm3, xmm3, 16
vpaddd xmm2, xmm2, xmm3
vpxord xmm1, xmm1, xmm2
vprord xmm1, xmm1, 12
vpaddd xmm0, xmm0, xmm7
vpaddd xmm0, xmm0, xmm1
vpxord xmm3, xmm3, xmm0
vprord xmm3, xmm3, 8
vpaddd xmm2, xmm2, xmm3
vpxord xmm1, xmm1, xmm2
vprord xmm1, xmm1, 7
vpshufd xmm0, xmm0, 39H
vpshufd xmm3, xmm3, 4EH
vpshufd xmm2, xmm2, 93H
dec al
jz @F
vshufps xmm8, xmm4, xmm5, 214
vpshufd xmm9, xmm4, 0FH
vpshufd xmm4, xmm8, 39H
vshufps xmm8, xmm6, xmm7, 250
vpblendd xmm9, xmm9, xmm8, 0AAH
vpunpcklqdq xmm8, xmm7, xmm5
vpblendd xmm8, xmm8, xmm6, 88H
vpshufd xmm8, xmm8, 78H
vpunpckhdq xmm5, xmm5, xmm7
vpunpckldq xmm6, xmm6, xmm5
vpshufd xmm7, xmm6, 1EH
vmovdqa xmm5, xmm9
vmovdqa xmm6, xmm8
jmp @B
@@:
vpxor xmm0, xmm0, xmm2
vpxor xmm1, xmm1, xmm3
vmovdqu xmmword ptr [rcx], xmm0
vmovdqu xmmword ptr [rcx+10H], xmm1
vmovdqa xmm6, xmmword ptr [rsp]
vmovdqa xmm7, xmmword ptr [rsp+10H]
vmovdqa xmm8, xmmword ptr [rsp+20H]
vmovdqa xmm9, xmmword ptr [rsp+30H]
add rsp, 72
ret
_blake3_compress_in_place_avx512 ENDP
blake3_compress_in_place_avx512 ENDP
ALIGN 16
blake3_compress_xof_avx512 PROC
_blake3_compress_xof_avx512 PROC
sub rsp, 72
vmovdqa xmmword ptr [rsp], xmm6
vmovdqa xmmword ptr [rsp+10H], xmm7
vmovdqa xmmword ptr [rsp+20H], xmm8
vmovdqa xmmword ptr [rsp+30H], xmm9
vmovdqu xmm0, xmmword ptr [rcx]
vmovdqu xmm1, xmmword ptr [rcx+10H]
movzx eax, byte ptr [rsp+70H]
movzx r8d, r8b
mov r10, qword ptr [rsp+78H]
shl rax, 32
add r8, rax
vmovq xmm3, r9
vmovq xmm4, r8
vpunpcklqdq xmm3, xmm3, xmm4
vmovaps xmm2, xmmword ptr [BLAKE3_IV]
vmovups xmm8, xmmword ptr [rdx]
vmovups xmm9, xmmword ptr [rdx+10H]
vshufps xmm4, xmm8, xmm9, 136
vshufps xmm5, xmm8, xmm9, 221
vmovups xmm8, xmmword ptr [rdx+20H]
vmovups xmm9, xmmword ptr [rdx+30H]
vshufps xmm6, xmm8, xmm9, 136
vshufps xmm7, xmm8, xmm9, 221
vpshufd xmm6, xmm6, 93H
vpshufd xmm7, xmm7, 93H
mov al, 7
@@:
vpaddd xmm0, xmm0, xmm4
vpaddd xmm0, xmm0, xmm1
vpxord xmm3, xmm3, xmm0
vprord xmm3, xmm3, 16
vpaddd xmm2, xmm2, xmm3
vpxord xmm1, xmm1, xmm2
vprord xmm1, xmm1, 12
vpaddd xmm0, xmm0, xmm5
vpaddd xmm0, xmm0, xmm1
vpxord xmm3, xmm3, xmm0
vprord xmm3, xmm3, 8
vpaddd xmm2, xmm2, xmm3
vpxord xmm1, xmm1, xmm2
vprord xmm1, xmm1, 7
vpshufd xmm0, xmm0, 93H
vpshufd xmm3, xmm3, 4EH
vpshufd xmm2, xmm2, 39H
vpaddd xmm0, xmm0, xmm6
vpaddd xmm0, xmm0, xmm1
vpxord xmm3, xmm3, xmm0
vprord xmm3, xmm3, 16
vpaddd xmm2, xmm2, xmm3
vpxord xmm1, xmm1, xmm2
vprord xmm1, xmm1, 12
vpaddd xmm0, xmm0, xmm7
vpaddd xmm0, xmm0, xmm1
vpxord xmm3, xmm3, xmm0
vprord xmm3, xmm3, 8
vpaddd xmm2, xmm2, xmm3
vpxord xmm1, xmm1, xmm2
vprord xmm1, xmm1, 7
vpshufd xmm0, xmm0, 39H
vpshufd xmm3, xmm3, 4EH
vpshufd xmm2, xmm2, 93H
dec al
jz @F
vshufps xmm8, xmm4, xmm5, 214
vpshufd xmm9, xmm4, 0FH
vpshufd xmm4, xmm8, 39H
vshufps xmm8, xmm6, xmm7, 250
vpblendd xmm9, xmm9, xmm8, 0AAH
vpunpcklqdq xmm8, xmm7, xmm5
vpblendd xmm8, xmm8, xmm6, 88H
vpshufd xmm8, xmm8, 78H
vpunpckhdq xmm5, xmm5, xmm7
vpunpckldq xmm6, xmm6, xmm5
vpshufd xmm7, xmm6, 1EH
vmovdqa xmm5, xmm9
vmovdqa xmm6, xmm8
jmp @B
@@:
vpxor xmm0, xmm0, xmm2
vpxor xmm1, xmm1, xmm3
vpxor xmm2, xmm2, xmmword ptr [rcx]
vpxor xmm3, xmm3, xmmword ptr [rcx+10H]
vmovdqu xmmword ptr [r10], xmm0
vmovdqu xmmword ptr [r10+10H], xmm1
vmovdqu xmmword ptr [r10+20H], xmm2
vmovdqu xmmword ptr [r10+30H], xmm3
vmovdqa xmm6, xmmword ptr [rsp]
vmovdqa xmm7, xmmword ptr [rsp+10H]
vmovdqa xmm8, xmmword ptr [rsp+20H]
vmovdqa xmm9, xmmword ptr [rsp+30H]
add rsp, 72
ret
_blake3_compress_xof_avx512 ENDP
blake3_compress_xof_avx512 ENDP
ALIGN 16
blake3_xof_many_avx512 PROC
_blake3_xof_many_avx512 PROC
mov rax, qword ptr [rsp+38h]
cmp rax, 1h
jnbe slowpath
sub rsp, 48h
movaps xmmword ptr [rsp], xmm6
movaps xmmword ptr [rsp+10h], xmm7
movaps xmmword ptr [rsp+20h], xmm8
movaps xmmword ptr [rsp+30h], xmm9
vmovdqu xmm0, xmmword ptr [rcx]
vmovdqu xmm1, xmmword ptr [rcx+10h]
movzx r8d, r8b
movzx r10d, byte ptr [rsp+70h]
shl r10, 20h
or r8, r10
vmovq xmm2, r8
vmovq xmm3, r9
vpunpcklqdq xmm3, xmm3, xmm2
vmovaps xmm2, xmmword ptr [BLAKE3_IV]
vmovdqu xmm8, xmmword ptr [rdx]
vmovdqu xmm9, xmmword ptr [rdx+10h]
vshufps xmm4, xmm8, xmm9, 88h
vshufps xmm5, xmm8, xmm9, 0DDh
vmovdqu xmm8, xmmword ptr [rdx+20h]
vmovdqu xmm9, xmmword ptr [rdx+30h]
vshufps xmm6, xmm8, xmm9, 88h
vshufps xmm7, xmm8, xmm9, 0DDh
vpshufd xmm6, xmm6, 93h
vpshufd xmm7, xmm7, 93h
mov r8b, 7h
@@:
vpaddd xmm0, xmm0, xmm4
vpaddd xmm0, xmm0, xmm1
vpxord xmm3, xmm3, xmm0
vprord xmm3, xmm3, 10h
vpaddd xmm2, xmm2, xmm3
vpxord xmm1, xmm1, xmm2
vprord xmm1, xmm1, 0Ch
vpaddd xmm0, xmm0, xmm5
vpaddd xmm0, xmm0, xmm1
vpxord xmm3, xmm3, xmm0
vprord xmm3, xmm3, 8h
vpaddd xmm2, xmm2, xmm3
vpxord xmm1, xmm1, xmm2
vprord xmm1, xmm1, 7h
vpshufd xmm0, xmm0, 93h
vpshufd xmm3, xmm3, 4Eh
vpshufd xmm2, xmm2, 39h
vpaddd xmm0, xmm0, xmm6
vpaddd xmm0, xmm0, xmm1
vpxord xmm3, xmm3, xmm0
vprord xmm3, xmm3, 10h
vpaddd xmm2, xmm2, xmm3
vpxord xmm1, xmm1, xmm2
vprord xmm1, xmm1, 0Ch
vpaddd xmm0, xmm0, xmm7
vpaddd xmm0, xmm0, xmm1
vpxord xmm3, xmm3, xmm0
vprord xmm3, xmm3, 8h
vpaddd xmm2, xmm2, xmm3
vpxord xmm1, xmm1, xmm2
vprord xmm1, xmm1, 7h
vpshufd xmm0, xmm0, 39h
vpshufd xmm3, xmm3, 4Eh
vpshufd xmm2, xmm2, 93h
dec r8b
jz @F
vshufps xmm8, xmm4, xmm5, 0D6h
vpshufd xmm9, xmm4, 0Fh
vpshufd xmm4, xmm8, 39h
vshufps xmm8, xmm6, xmm7, 0FAh
vpblendd xmm9, xmm9, xmm8, 0AAh
vpunpcklqdq xmm8, xmm7, xmm5
vpblendd xmm8, xmm8, xmm6, 88h
vpshufd xmm8, xmm8, 78h
vpunpckhdq xmm5, xmm5, xmm7
vpunpckldq xmm6, xmm6, xmm5
vpshufd xmm7, xmm6, 1Eh
vmovdqa xmm5, xmm9
vmovdqa xmm6, xmm8
jmp @B
@@:
mov r8, qword ptr [rsp+78h]
vpxor xmm0, xmm0, xmm2
vpxor xmm1, xmm1, xmm3
vpxor xmm2, xmm2, xmmword ptr [rcx]
vpxor xmm3, xmm3, xmmword ptr [rcx+10h]
vmovdqu xmmword ptr [r8], xmm0
vmovdqu xmmword ptr [r8+10h], xmm1
vmovdqu xmmword ptr [r8+20h], xmm2
vmovdqu xmmword ptr [r8+30h], xmm3
vzeroupper
movaps xmm6, xmmword ptr [rsp]
movaps xmm7, xmmword ptr [rsp+10h]
movaps xmm8, xmmword ptr [rsp+20h]
movaps xmm9, xmmword ptr [rsp+30h]
add rsp, 48h
ret
slowpath:
push rbp
mov rbp, rsp
sub rsp, 1A0h
movaps xmmword ptr [rbp-0A0h], xmm6
movaps xmmword ptr [rbp-90h], xmm7
movaps xmmword ptr [rbp-80h], xmm8
movaps xmmword ptr [rbp-70h], xmm9
movaps xmmword ptr [rbp-60h], xmm10
movaps xmmword ptr [rbp-50h], xmm11
movaps xmmword ptr [rbp-40h], xmm12
movaps xmmword ptr [rbp-30h], xmm13
movaps xmmword ptr [rbp-20h], xmm14
movaps xmmword ptr [rbp-10h], xmm15
and rsp, -40h
vpbroadcastd zmm0, r9d
shr r9, 20h
vpbroadcastd zmm1, r9d
vpaddd zmm2, zmm0, zmmword ptr [ADD0]
vpcmpud k1, zmm2, zmm0, 1h
vpaddd zmm1 {k1}, zmm1, dword bcst [ADD1]
vmovdqa32 zmmword ptr [rsp], zmm2
vmovdqa32 zmmword ptr [rsp+40h], zmm1
mov r9, qword ptr [rbp+38h]
movzx r8d, r8b
movzx r10d, byte ptr [rbp+30h]
cmp rax, 8h
jbe final8blocks
ALIGN 16
innerloop16:
vpbroadcastd zmm0, dword ptr [rdx]
vpbroadcastd zmm1, dword ptr [rdx+4h]
vpbroadcastd zmm2, dword ptr [rdx+8h]
vpbroadcastd zmm3, dword ptr [rdx+0Ch]
vpbroadcastd zmm4, dword ptr [rdx+10h]
vpbroadcastd zmm5, dword ptr [rdx+14h]
vpbroadcastd zmm6, dword ptr [rdx+18h]
vpbroadcastd zmm7, dword ptr [rdx+1Ch]
vpbroadcastd zmm8, dword ptr [rdx+20h]
vpbroadcastd zmm9, dword ptr [rdx+24h]
vpbroadcastd zmm10, dword ptr [rdx+28h]
vpbroadcastd zmm11, dword ptr [rdx+2Ch]
vpbroadcastd zmm12, dword ptr [rdx+30h]
vpbroadcastd zmm13, dword ptr [rdx+34h]
vpbroadcastd zmm14, dword ptr [rdx+38h]
vpbroadcastd zmm15, dword ptr [rdx+3Ch]
vpbroadcastd zmm16, dword ptr [rcx]
vpbroadcastd zmm17, dword ptr [rcx+4h]
vpbroadcastd zmm18, dword ptr [rcx+8h]
vpbroadcastd zmm19, dword ptr [rcx+0Ch]
vpbroadcastd zmm20, dword ptr [rcx+10h]
vpbroadcastd zmm21, dword ptr [rcx+14h]
vpbroadcastd zmm22, dword ptr [rcx+18h]
vpbroadcastd zmm23, dword ptr [rcx+1Ch]
vpbroadcastd zmm24, dword ptr [BLAKE3_IV_0]
vpbroadcastd zmm25, dword ptr [BLAKE3_IV_1]
vpbroadcastd zmm26, dword ptr [BLAKE3_IV_2]
vpbroadcastd zmm27, dword ptr [BLAKE3_IV_3]
vmovdqa32 zmm28, zmmword ptr [rsp]
vmovdqa32 zmm29, zmmword ptr [rsp+40h]
vpbroadcastd zmm30, r8d
vpbroadcastd zmm31, r10d
mov r11b, 7h
@@:
vpaddd zmm16, zmm16, zmm0
vpaddd zmm17, zmm17, zmm2
vpaddd zmm18, zmm18, zmm4
vpaddd zmm19, zmm19, zmm6
vmovdqa32 zmmword ptr [rsp+80h], zmm0
vmovdqa32 zmmword ptr [rsp+0C0h], zmm6
vpaddd zmm16, zmm16, zmm20
vpaddd zmm17, zmm17, zmm21
vpaddd zmm18, zmm18, zmm22
vpaddd zmm19, zmm19, zmm23
vpxord zmm28, zmm28, zmm16
vmovdqa32 zmm0, zmm2
vpxord zmm29, zmm29, zmm17
vpxord zmm30, zmm30, zmm18
vpxord zmm31, zmm31, zmm19
vprord zmm28, zmm28, 10h
vprord zmm29, zmm29, 10h
vprord zmm30, zmm30, 10h
vprord zmm31, zmm31, 10h
vpaddd zmm24, zmm24, zmm28
vmovdqa32 zmm6, zmm4
vpaddd zmm25, zmm25, zmm29
vpaddd zmm26, zmm26, zmm30
vpaddd zmm27, zmm27, zmm31
vpxord zmm20, zmm20, zmm24
vpxord zmm21, zmm21, zmm25
vpxord zmm22, zmm22, zmm26
vpxord zmm23, zmm23, zmm27
vprord zmm20, zmm20, 0Ch
vprord zmm21, zmm21, 0Ch
vprord zmm22, zmm22, 0Ch
vprord zmm23, zmm23, 0Ch
vpaddd zmm16, zmm16, zmm1
vpaddd zmm17, zmm17, zmm3
vpaddd zmm18, zmm18, zmm5
vpaddd zmm19, zmm19, zmm7
vpaddd zmm16, zmm16, zmm20
vmovdqa32 zmm2, zmm3
vpaddd zmm17, zmm17, zmm21
vpaddd zmm18, zmm18, zmm22
vpaddd zmm19, zmm19, zmm23
vpxord zmm28, zmm28, zmm16
vpxord zmm29, zmm29, zmm17
vpxord zmm30, zmm30, zmm18
vpxord zmm31, zmm31, zmm19
vprord zmm28, zmm28, 8h
vmovdqa32 zmm4, zmm7
vprord zmm29, zmm29, 8h
vprord zmm30, zmm30, 8h
vprord zmm31, zmm31, 8h
vpaddd zmm24, zmm24, zmm28
vpaddd zmm25, zmm25, zmm29
vpaddd zmm26, zmm26, zmm30
vpaddd zmm27, zmm27, zmm31
vpxord zmm20, zmm20, zmm24
vmovdqa32 zmm3, zmm10
vpxord zmm21, zmm21, zmm25
vpxord zmm22, zmm22, zmm26
vpxord zmm23, zmm23, zmm27
vprord zmm20, zmm20, 7h
vprord zmm21, zmm21, 7h
vprord zmm22, zmm22, 7h
vprord zmm23, zmm23, 7h
vpaddd zmm16, zmm16, zmm8
vmovdqa32 zmm7, zmm13
vpaddd zmm17, zmm17, zmm10
vpaddd zmm18, zmm18, zmm12
vpaddd zmm19, zmm19, zmm14
vpaddd zmm16, zmm16, zmm21
vpaddd zmm17, zmm17, zmm22
vpaddd zmm18, zmm18, zmm23
vpaddd zmm19, zmm19, zmm20
vpxord zmm31, zmm31, zmm16
vmovdqa32 zmm10, zmm12
vpxord zmm28, zmm28, zmm17
vpxord zmm29, zmm29, zmm18
vpxord zmm30, zmm30, zmm19
vprord zmm31, zmm31, 10h
vprord zmm28, zmm28, 10h
vprord zmm29, zmm29, 10h
vprord zmm30, zmm30, 10h
vpaddd zmm26, zmm26, zmm31
vmovdqa32 zmm12, zmm9
vpaddd zmm27, zmm27, zmm28
vpaddd zmm24, zmm24, zmm29
vpaddd zmm25, zmm25, zmm30
vpxord zmm21, zmm21, zmm26
vpxord zmm22, zmm22, zmm27
vpxord zmm23, zmm23, zmm24
vpxord zmm20, zmm20, zmm25
vprord zmm21, zmm21, 0Ch
vprord zmm22, zmm22, 0Ch
vprord zmm23, zmm23, 0Ch
vprord zmm20, zmm20, 0Ch
vpaddd zmm16, zmm16, zmm9
vpaddd zmm17, zmm17, zmm11
vpaddd zmm18, zmm18, zmm13
vmovdqa32 zmm13, zmm14
vpaddd zmm19, zmm19, zmm15
vpaddd zmm16, zmm16, zmm21
vpaddd zmm17, zmm17, zmm22
vpaddd zmm18, zmm18, zmm23
vmovdqa32 zmm9, zmm11
vpaddd zmm19, zmm19, zmm20
vpxord zmm31, zmm31, zmm16
vpxord zmm28, zmm28, zmm17
vmovdqa32 zmm14, zmm15
vpxord zmm29, zmm29, zmm18
vpxord zmm30, zmm30, zmm19
vprord zmm31, zmm31, 8h
vmovdqa32 zmm11, zmm5
vprord zmm28, zmm28, 8h
vprord zmm29, zmm29, 8h
vprord zmm30, zmm30, 8h
vmovdqa32 zmm15, zmm8
vpaddd zmm26, zmm26, zmm31
vpaddd zmm27, zmm27, zmm28
vpaddd zmm24, zmm24, zmm29
vpaddd zmm25, zmm25, zmm30
vmovdqa32 zmm8, zmm1
vpxord zmm21, zmm21, zmm26
vpxord zmm22, zmm22, zmm27
vpxord zmm23, zmm23, zmm24
vpxord zmm20, zmm20, zmm25
vmovdqa32 zmm5, zmmword ptr [rsp+80h]
vprord zmm21, zmm21, 7h
vprord zmm22, zmm22, 7h
vprord zmm23, zmm23, 7h
vprord zmm20, zmm20, 7h
vmovdqa32 zmm1, zmmword ptr [rsp+0C0h]
dec r11b
jnz @B
vpxord zmm16, zmm16, zmm24
vpxord zmm17, zmm17, zmm25
vpxord zmm18, zmm18, zmm26
vpxord zmm19, zmm19, zmm27
vpxord zmm20, zmm20, zmm28
vpxord zmm21, zmm21, zmm29
vpxord zmm22, zmm22, zmm30
vpxord zmm23, zmm23, zmm31
vpunpckldq zmm0, zmm16, zmm18
vpunpckhdq zmm1, zmm16, zmm18
vpunpckldq zmm2, zmm17, zmm19
vpunpckhdq zmm3, zmm17, zmm19
vpunpckldq zmm4, zmm20, zmm22
vpunpckhdq zmm5, zmm20, zmm22
vpunpckldq zmm6, zmm21, zmm23
vpunpckhdq zmm7, zmm21, zmm23
vpunpckldq zmm16, zmm0, zmm2
vpunpckhdq zmm17, zmm0, zmm2
vpunpckldq zmm18, zmm1, zmm3
vpunpckhdq zmm19, zmm1, zmm3
vpunpckldq zmm20, zmm4, zmm6
vpunpckhdq zmm21, zmm4, zmm6
vpunpckldq zmm22, zmm5, zmm7
vpunpckhdq zmm23, zmm5, zmm7
vpunpckldq zmm0, zmm24, zmm26
vpunpckhdq zmm1, zmm24, zmm26
vpunpckldq zmm2, zmm25, zmm27
vpunpckhdq zmm3, zmm25, zmm27
vpunpckldq zmm4, zmm28, zmm30
vpunpckhdq zmm5, zmm28, zmm30
vpunpckldq zmm6, zmm29, zmm31
vpunpckhdq zmm7, zmm29, zmm31
vpunpckldq zmm24, zmm0, zmm2
vpunpckhdq zmm25, zmm0, zmm2
vpunpckldq zmm26, zmm1, zmm3
vpunpckhdq zmm27, zmm1, zmm3
vpunpckldq zmm28, zmm4, zmm6
vpunpckhdq zmm29, zmm4, zmm6
vpunpckldq zmm30, zmm5, zmm7
vpunpckhdq zmm31, zmm5, zmm7
vmovdqa32 zmm8, zmmword ptr [INDEX0]
vmovdqa32 zmm9, zmmword ptr [INDEX1]
vmovdqa32 zmm0, zmm16
vpermt2d zmm0, zmm8, zmm20
vpermt2d zmm16, zmm9, zmm20
vmovdqa32 zmm1, zmm24
vpermt2d zmm1, zmm8, zmm28
vpermt2d zmm24, zmm9, zmm28
vmovdqa32 zmm2, zmm17
vpermt2d zmm2, zmm8, zmm21
vpermt2d zmm17, zmm9, zmm21
vmovdqa32 zmm3, zmm25
vpermt2d zmm3, zmm8, zmm29
vpermt2d zmm25, zmm9, zmm29
vmovdqa32 zmm4, zmm18
vpermt2d zmm4, zmm8, zmm22
vpermt2d zmm18, zmm9, zmm22
vmovdqa32 zmm5, zmm26
vpermt2d zmm5, zmm8, zmm30
vpermt2d zmm26, zmm9, zmm30
vmovdqa32 zmm6, zmm19
vpermt2d zmm6, zmm8, zmm23
vpermt2d zmm19, zmm9, zmm23
vmovdqa32 zmm7, zmm27
vpermt2d zmm7, zmm8, zmm31
vpermt2d zmm27, zmm9, zmm31
vbroadcasti64x4 zmm8, ymmword ptr [rcx]
vpxord zmm1, zmm1, zmm8
vpxord zmm3, zmm3, zmm8
vpxord zmm5, zmm5, zmm8
vpxord zmm7, zmm7, zmm8
vpxord zmm24, zmm24, zmm8
vpxord zmm25, zmm25, zmm8
vpxord zmm26, zmm26, zmm8
vpxord zmm27, zmm27, zmm8
vextracti64x4 ymmword ptr [r9], zmm0, 0h
vextracti64x4 ymmword ptr [r9+20h], zmm1, 0h
vextracti64x4 ymmword ptr [r9+40h], zmm2, 0h
vextracti64x4 ymmword ptr [r9+60h], zmm3, 0h
vextracti64x4 ymmword ptr [r9+80h], zmm4, 0h
vextracti64x4 ymmword ptr [r9+0A0h], zmm5, 0h
vextracti64x4 ymmword ptr [r9+0C0h], zmm6, 0h
vextracti64x4 ymmword ptr [r9+0E0h], zmm7, 0h
vextracti64x4 ymmword ptr [r9+100h], zmm16, 0h
vextracti64x4 ymmword ptr [r9+120h], zmm24, 0h
vextracti64x4 ymmword ptr [r9+140h], zmm17, 0h
vextracti64x4 ymmword ptr [r9+160h], zmm25, 0h
vextracti64x4 ymmword ptr [r9+180h], zmm18, 0h
vextracti64x4 ymmword ptr [r9+1A0h], zmm26, 0h
vextracti64x4 ymmword ptr [r9+1C0h], zmm19, 0h
vextracti64x4 ymmword ptr [r9+1E0h], zmm27, 0h
vextracti64x4 ymmword ptr [r9+200h], zmm0, 1h
vextracti64x4 ymmword ptr [r9+220h], zmm1, 1h
cmp rax, 0Ah
jb unwind
vextracti64x4 ymmword ptr [r9+240h], zmm2, 1h
vextracti64x4 ymmword ptr [r9+260h], zmm3, 1h
cmp rax, 0Bh
jb unwind
vextracti64x4 ymmword ptr [r9+280h], zmm4, 1h
vextracti64x4 ymmword ptr [r9+2A0h], zmm5, 1h
cmp rax, 0Ch
jb unwind
vextracti64x4 ymmword ptr [r9+2C0h], zmm6, 1h
vextracti64x4 ymmword ptr [r9+2E0h], zmm7, 1h
cmp rax, 0Dh
jb unwind
vextracti64x4 ymmword ptr [r9+300h], zmm16, 1h
vextracti64x4 ymmword ptr [r9+320h], zmm24, 1h
cmp rax, 0Eh
jb unwind
vextracti64x4 ymmword ptr [r9+340h], zmm17, 1h
vextracti64x4 ymmword ptr [r9+360h], zmm25, 1h
cmp rax, 0Fh
jb unwind
vextracti64x4 ymmword ptr [r9+380h], zmm18, 1h
vextracti64x4 ymmword ptr [r9+3A0h], zmm26, 1h
cmp rax, 10h
jb unwind
vextracti64x4 ymmword ptr [r9+3C0h], zmm19, 1h
vextracti64x4 ymmword ptr [r9+3E0h], zmm27, 1h
vmovdqa32 zmm0, zmmword ptr [rsp]
vmovdqa32 zmm1, zmmword ptr [rsp+40h]
vpaddd zmm2, zmm0, dword bcst [ADD16]
vpcmpud k1, zmm2, zmm0, 1h
vpaddd zmm1 {k1}, zmm1, dword bcst [ADD1]
vmovdqa32 zmmword ptr [rsp], zmm2
vmovdqa32 zmmword ptr [rsp+40h], zmm1
add r9, 400h
sub rax, 10h
cmp rax, 8h
jnbe innerloop16
test al, al
jnz final8blocks
unwind:
vzeroupper
movaps xmm6, xmmword ptr [rbp-0A0h]
movaps xmm7, xmmword ptr [rbp-90h]
movaps xmm8, xmmword ptr [rbp-80h]
movaps xmm9, xmmword ptr [rbp-70h]
movaps xmm10, xmmword ptr [rbp-60h]
movaps xmm11, xmmword ptr [rbp-50h]
movaps xmm12, xmmword ptr [rbp-40h]
movaps xmm13, xmmword ptr [rbp-30h]
movaps xmm14, xmmword ptr [rbp-20h]
movaps xmm15, xmmword ptr [rbp-10h]
mov rsp, rbp
pop rbp
ret
final8blocks:
cmp al, 4h
jbe final4blocks
vpbroadcastd ymm16, dword ptr [rdx]
vpbroadcastd ymm17, dword ptr [rdx+4h]
vpbroadcastd ymm18, dword ptr [rdx+8h]
vpbroadcastd ymm19, dword ptr [rdx+0Ch]
vpbroadcastd ymm20, dword ptr [rdx+10h]
vpbroadcastd ymm21, dword ptr [rdx+14h]
vpbroadcastd ymm22, dword ptr [rdx+18h]
vpbroadcastd ymm23, dword ptr [rdx+1Ch]
vpbroadcastd ymm24, dword ptr [rdx+20h]
vpbroadcastd ymm25, dword ptr [rdx+24h]
vpbroadcastd ymm26, dword ptr [rdx+28h]
vpbroadcastd ymm27, dword ptr [rdx+2Ch]
vpbroadcastd ymm28, dword ptr [rdx+30h]
vpbroadcastd ymm29, dword ptr [rdx+34h]
vpbroadcastd ymm30, dword ptr [rdx+38h]
vpbroadcastd ymm31, dword ptr [rdx+3Ch]
vpbroadcastd ymm0, dword ptr [rcx]
vpbroadcastd ymm1, dword ptr [rcx+4h]
vpbroadcastd ymm2, dword ptr [rcx+8h]
vpbroadcastd ymm3, dword ptr [rcx+0Ch]
vpbroadcastd ymm4, dword ptr [rcx+10h]
vpbroadcastd ymm5, dword ptr [rcx+14h]
vpbroadcastd ymm6, dword ptr [rcx+18h]
vpbroadcastd ymm7, dword ptr [rcx+1Ch]
vpbroadcastd ymm8, dword ptr [BLAKE3_IV_0]
vpbroadcastd ymm9, dword ptr [BLAKE3_IV_1]
vpbroadcastd ymm10, dword ptr [BLAKE3_IV_2]
vpbroadcastd ymm11, dword ptr [BLAKE3_IV_3]
vmovdqa ymm12, ymmword ptr [rsp]
vmovdqa ymm13, ymmword ptr [rsp+40h]
vpbroadcastd ymm14, r8d
vpbroadcastd ymm15, r10d
mov r11b, 7h
@@:
vpaddd ymm0, ymm0, ymm16
vpaddd ymm1, ymm1, ymm18
vpaddd ymm2, ymm2, ymm20
vpaddd ymm3, ymm3, ymm22
vmovdqa32 ymmword ptr [rsp+80h], ymm16
vmovdqa32 ymmword ptr [rsp+0C0h], ymm22
vpaddd ymm0, ymm0, ymm4
vpaddd ymm1, ymm1, ymm5
vpaddd ymm2, ymm2, ymm6
vpaddd ymm3, ymm3, ymm7
vpxord ymm12, ymm12, ymm0
vmovdqa32 ymm16, ymm18
vpxord ymm13, ymm13, ymm1
vpxord ymm14, ymm14, ymm2
vpxord ymm15, ymm15, ymm3
vprord ymm12, ymm12, 10h
vprord ymm13, ymm13, 10h
vprord ymm14, ymm14, 10h
vprord ymm15, ymm15, 10h
vpaddd ymm8, ymm8, ymm12
vmovdqa32 ymm22, ymm20
vpaddd ymm9, ymm9, ymm13
vpaddd ymm10, ymm10, ymm14
vpaddd ymm11, ymm11, ymm15
vpxord ymm4, ymm4, ymm8
vpxord ymm5, ymm5, ymm9
vpxord ymm6, ymm6, ymm10
vpxord ymm7, ymm7, ymm11
vprord ymm4, ymm4, 0Ch
vprord ymm5, ymm5, 0Ch
vprord ymm6, ymm6, 0Ch
vprord ymm7, ymm7, 0Ch
vpaddd ymm0, ymm0, ymm17
vpaddd ymm1, ymm1, ymm19
vpaddd ymm2, ymm2, ymm21
vpaddd ymm3, ymm3, ymm23
vpaddd ymm0, ymm0, ymm4
vmovdqa32 ymm18, ymm19
vpaddd ymm1, ymm1, ymm5
vpaddd ymm2, ymm2, ymm6
vpaddd ymm3, ymm3, ymm7
vpxord ymm12, ymm12, ymm0
vpxord ymm13, ymm13, ymm1
vpxord ymm14, ymm14, ymm2
vpxord ymm15, ymm15, ymm3
vprord ymm12, ymm12, 8h
vmovdqa32 ymm20, ymm23
vprord ymm13, ymm13, 8h
vprord ymm14, ymm14, 8h
vprord ymm15, ymm15, 8h
vpaddd ymm8, ymm8, ymm12
vpaddd ymm9, ymm9, ymm13
vpaddd ymm10, ymm10, ymm14
vpaddd ymm11, ymm11, ymm15
vpxord ymm4, ymm4, ymm8
vmovdqa32 ymm19, ymm26
vpxord ymm5, ymm5, ymm9
vpxord ymm6, ymm6, ymm10
vpxord ymm7, ymm7, ymm11
vprord ymm4, ymm4, 7h
vprord ymm5, ymm5, 7h
vprord ymm6, ymm6, 7h
vprord ymm7, ymm7, 7h
vpaddd ymm0, ymm0, ymm24
vmovdqa32 ymm23, ymm29
vpaddd ymm1, ymm1, ymm26
vpaddd ymm2, ymm2, ymm28
vpaddd ymm3, ymm3, ymm30
vpaddd ymm0, ymm0, ymm5
vpaddd ymm1, ymm1, ymm6
vpaddd ymm2, ymm2, ymm7
vpaddd ymm3, ymm3, ymm4
vpxord ymm15, ymm15, ymm0
vmovdqa32 ymm26, ymm28
vpxord ymm12, ymm12, ymm1
vpxord ymm13, ymm13, ymm2
vpxord ymm14, ymm14, ymm3
vprord ymm15, ymm15, 10h
vprord ymm12, ymm12, 10h
vprord ymm13, ymm13, 10h
vprord ymm14, ymm14, 10h
vpaddd ymm10, ymm10, ymm15
vmovdqa32 ymm28, ymm25
vpaddd ymm11, ymm11, ymm12
vpaddd ymm8, ymm8, ymm13
vpaddd ymm9, ymm9, ymm14
vpxord ymm5, ymm5, ymm10
vpxord ymm6, ymm6, ymm11
vpxord ymm7, ymm7, ymm8
vpxord ymm4, ymm4, ymm9
vprord ymm5, ymm5, 0Ch
vprord ymm6, ymm6, 0Ch
vprord ymm7, ymm7, 0Ch
vprord ymm4, ymm4, 0Ch
vpaddd ymm0, ymm0, ymm25
vpaddd ymm1, ymm1, ymm27
vpaddd ymm2, ymm2, ymm29
vmovdqa32 ymm29, ymm30
vpaddd ymm3, ymm3, ymm31
vpaddd ymm0, ymm0, ymm5
vpaddd ymm1, ymm1, ymm6
vpaddd ymm2, ymm2, ymm7
vmovdqa32 ymm25, ymm27
vpaddd ymm3, ymm3, ymm4
vpxord ymm15, ymm15, ymm0
vpxord ymm12, ymm12, ymm1
vmovdqa32 ymm30, ymm31
vpxord ymm13, ymm13, ymm2
vpxord ymm14, ymm14, ymm3
vprord ymm15, ymm15, 8h
vmovdqa32 ymm27, ymm21
vprord ymm12, ymm12, 8h
vprord ymm13, ymm13, 8h
vprord ymm14, ymm14, 8h
vmovdqa32 ymm31, ymm24
vpaddd ymm10, ymm10, ymm15
vpaddd ymm11, ymm11, ymm12
vpaddd ymm8, ymm8, ymm13
vpaddd ymm9, ymm9, ymm14
vmovdqa32 ymm24, ymm17
vpxord ymm5, ymm5, ymm10
vpxord ymm6, ymm6, ymm11
vpxord ymm7, ymm7, ymm8
vpxord ymm4, ymm4, ymm9
vmovdqa32 ymm21, ymmword ptr [rsp+80h]
vprord ymm5, ymm5, 7h
vprord ymm6, ymm6, 7h
vprord ymm7, ymm7, 7h
vprord ymm4, ymm4, 7h
vmovdqa32 ymm17, ymmword ptr [rsp+0C0h]
dec r11b
jnz @B
vpxord ymm0, ymm0, ymm8
vpxord ymm8, ymm8, dword bcst [rcx]
vpxord ymm1, ymm1, ymm9
vpxord ymm9, ymm9, dword bcst [rcx+4h]
vpxord ymm2, ymm2, ymm10
vpxord ymm10, ymm10, dword bcst [rcx+8h]
vpxord ymm3, ymm3, ymm11
vpxord ymm11, ymm11, dword bcst [rcx+0Ch]
vpxord ymm4, ymm4, ymm12
vpxord ymm12, ymm12, dword bcst [rcx+10h]
vpxord ymm5, ymm5, ymm13
vpxord ymm13, ymm13, dword bcst [rcx+14h]
vpxord ymm6, ymm6, ymm14
vpxord ymm14, ymm14, dword bcst [rcx+18h]
vpxord ymm7, ymm7, ymm15
vpxord ymm15, ymm15, dword bcst [rcx+1Ch]
vpunpckldq ymm16, ymm0, ymm1
vpunpckhdq ymm17, ymm0, ymm1
vpunpckldq ymm18, ymm2, ymm3
vpunpckhdq ymm19, ymm2, ymm3
vpunpckldq ymm20, ymm4, ymm5
vpunpckhdq ymm21, ymm4, ymm5
vpunpckldq ymm22, ymm6, ymm7
vpunpckhdq ymm23, ymm6, ymm7
vpunpckldq ymm24, ymm8, ymm9
vpunpckhdq ymm25, ymm8, ymm9
vpunpckldq ymm26, ymm10, ymm11
vpunpckhdq ymm27, ymm10, ymm11
vpunpckldq ymm28, ymm12, ymm13
vpunpckhdq ymm29, ymm12, ymm13
vpunpckldq ymm30, ymm14, ymm15
vpunpckhdq ymm31, ymm14, ymm15
vpunpcklqdq ymm0, ymm16, ymm18
vpunpckhqdq ymm1, ymm16, ymm18
vpunpcklqdq ymm2, ymm17, ymm19
vpunpckhqdq ymm3, ymm17, ymm19
vpunpcklqdq ymm4, ymm20, ymm22
vpunpckhqdq ymm5, ymm20, ymm22
vpunpcklqdq ymm6, ymm21, ymm23
vpunpckhqdq ymm7, ymm21, ymm23
vpunpcklqdq ymm8, ymm24, ymm26
vpunpckhqdq ymm9, ymm24, ymm26
vpunpcklqdq ymm10, ymm25, ymm27
vpunpckhqdq ymm11, ymm25, ymm27
vpunpcklqdq ymm12, ymm28, ymm30
vpunpckhqdq ymm13, ymm28, ymm30
vpunpcklqdq ymm14, ymm29, ymm31
vpunpckhqdq ymm15, ymm29, ymm31
vshufi32x4 ymm16, ymm0, ymm4, 0h
vshufi32x4 ymm17, ymm8, ymm12, 0h
vshufi32x4 ymm18, ymm1, ymm5, 0h
vshufi32x4 ymm19, ymm9, ymm13, 0h
vshufi32x4 ymm20, ymm2, ymm6, 0h
vshufi32x4 ymm21, ymm10, ymm14, 0h
vshufi32x4 ymm22, ymm3, ymm7, 0h
vshufi32x4 ymm23, ymm11, ymm15, 0h
vshufi32x4 ymm24, ymm0, ymm4, 3h
vshufi32x4 ymm25, ymm8, ymm12, 3h
vshufi32x4 ymm26, ymm1, ymm5, 3h
vshufi32x4 ymm27, ymm9, ymm13, 3h
vshufi32x4 ymm28, ymm2, ymm6, 3h
vshufi32x4 ymm29, ymm10, ymm14, 3h
vshufi32x4 ymm30, ymm3, ymm7, 3h
vshufi32x4 ymm31, ymm11, ymm15, 3h
vmovdqu32 ymmword ptr [r9], ymm16
vmovdqu32 ymmword ptr [r9+20h], ymm17
vmovdqu32 ymmword ptr [r9+40h], ymm18
vmovdqu32 ymmword ptr [r9+60h], ymm19
vmovdqu32 ymmword ptr [r9+80h], ymm20
vmovdqu32 ymmword ptr [r9+0A0h], ymm21
vmovdqu32 ymmword ptr [r9+0C0h], ymm22
vmovdqu32 ymmword ptr [r9+0E0h], ymm23
vmovdqu32 ymmword ptr [r9+100h], ymm24
vmovdqu32 ymmword ptr [r9+120h], ymm25
cmp al, 6h
jb @F
vmovdqu32 ymmword ptr [r9+140h], ymm26
vmovdqu32 ymmword ptr [r9+160h], ymm27
cmp al, 7h
jb @F
vmovdqu32 ymmword ptr [r9+180h], ymm28
vmovdqu32 ymmword ptr [r9+1A0h], ymm29
cmp al, 8h
jb @F
vmovdqu32 ymmword ptr [r9+1C0h], ymm30
vmovdqu32 ymmword ptr [r9+1E0h], ymm31
@@:
jmp unwind
final4blocks:
mov r11d, 0AAAAh
kmovw k1, r11d
mov r11d, 8888h
kmovw k2, r11d
mov r11d, 55h
kmovw k3, r11d
mov r11d, r10d
shl r11, 20h
or r11, r8
cmp al, 2h
jbe final2blocks
vbroadcasti32x4 zmm0, xmmword ptr [rcx]
vbroadcasti32x4 zmm1, xmmword ptr [rcx+10h]
vbroadcasti32x4 zmm2, xmmword ptr [BLAKE3_IV]
vmovdqa32 xmm4, xmmword ptr [rsp]
vmovdqa32 xmm5, xmmword ptr [rsp+40h]
vpbroadcastq zmm3, r11
vpunpckldq xmm6, xmm4, xmm5
vpunpckhdq xmm5, xmm4, xmm5
vinserti64x4 zmm6, zmm6, ymm5, 1h
vpermq zmm3 {k3}, zmm6, 0DCh
vbroadcasti32x4 zmm8, xmmword ptr [rdx]
vbroadcasti32x4 zmm9, xmmword ptr [rdx+10h]
vshufps zmm4, zmm8, zmm9, 88h
vshufps zmm5, zmm8, zmm9, 0DDh
vbroadcasti32x4 zmm8, xmmword ptr [rdx+20h]
vbroadcasti32x4 zmm9, xmmword ptr [rdx+30h]
vshufps zmm6, zmm8, zmm9, 88h
vshufps zmm7, zmm8, zmm9, 0DDh
vpshufd zmm6, zmm6, 93h
vpshufd zmm7, zmm7, 93h
mov r8b, 7h
@@:
vpaddd zmm0, zmm0, zmm4
vpaddd zmm0, zmm0, zmm1
vpxord zmm3, zmm3, zmm0
vprord zmm3, zmm3, 10h
vpaddd zmm2, zmm2, zmm3
vpxord zmm1, zmm1, zmm2
vprord zmm1, zmm1, 0Ch
vpaddd zmm0, zmm0, zmm5
vpaddd zmm0, zmm0, zmm1
vpxord zmm3, zmm3, zmm0
vprord zmm3, zmm3, 8h
vpaddd zmm2, zmm2, zmm3
vpxord zmm1, zmm1, zmm2
vprord zmm1, zmm1, 7h
vpshufd zmm0, zmm0, 93h
vpshufd zmm3, zmm3, 4Eh
vpshufd zmm2, zmm2, 39h
vpaddd zmm0, zmm0, zmm6
vpaddd zmm0, zmm0, zmm1
vpxord zmm3, zmm3, zmm0
vprord zmm3, zmm3, 10h
vpaddd zmm2, zmm2, zmm3
vpxord zmm1, zmm1, zmm2
vprord zmm1, zmm1, 0Ch
vpaddd zmm0, zmm0, zmm7
vpaddd zmm0, zmm0, zmm1
vpxord zmm3, zmm3, zmm0
vprord zmm3, zmm3, 8h
vpaddd zmm2, zmm2, zmm3
vpxord zmm1, zmm1, zmm2
vprord zmm1, zmm1, 7h
vpshufd zmm0, zmm0, 39h
vpshufd zmm3, zmm3, 4Eh
vpshufd zmm2, zmm2, 93h
dec r8b
jz @F
vshufps zmm8, zmm4, zmm5, 0D6h
vpshufd zmm9, zmm4, 0Fh
vpshufd zmm4, zmm8, 39h
vshufps zmm8, zmm6, zmm7, 0FAh
vpblendmd zmm9 {k1}, zmm9, zmm8
vpunpcklqdq zmm8, zmm7, zmm5
vpblendmd zmm8 {k2}, zmm8, zmm6
vpshufd zmm8, zmm8, 78h
vpunpckhdq zmm5, zmm5, zmm7
vpunpckldq zmm6, zmm6, zmm5
vpshufd zmm7, zmm6, 1Eh
vmovdqa32 zmm5, zmm9
vmovdqa32 zmm6, zmm8
jmp @B
@@:
vpxord zmm0, zmm0, zmm2
vpxord zmm1, zmm1, zmm3
vbroadcasti32x4 zmm4, xmmword ptr [rcx]
vbroadcasti32x4 zmm5, xmmword ptr [rcx+10h]
vpxord zmm2, zmm2, zmm4
vpxord zmm3, zmm3, zmm5
vmovdqu xmmword ptr [r9], xmm0
vmovdqu xmmword ptr [r9+10h], xmm1
vmovdqu xmmword ptr [r9+20h], xmm2
vmovdqu xmmword ptr [r9+30h], xmm3
vextracti128 xmmword ptr [r9+40h], ymm0, 1h
vextracti128 xmmword ptr [r9+50h], ymm1, 1h
vextracti128 xmmword ptr [r9+60h], ymm2, 1h
vextracti128 xmmword ptr [r9+70h], ymm3, 1h
vextracti32x4 xmmword ptr [r9+80h], zmm0, 2h
vextracti32x4 xmmword ptr [r9+90h], zmm1, 2h
vextracti32x4 xmmword ptr [r9+0A0h], zmm2, 2h
vextracti32x4 xmmword ptr [r9+0B0h], zmm3, 2h
cmp al, 4h
jb @F
vextracti32x4 xmmword ptr [r9+0C0h], zmm0, 3h
vextracti32x4 xmmword ptr [r9+0D0h], zmm1, 3h
vextracti32x4 xmmword ptr [r9+0E0h], zmm2, 3h
vextracti32x4 xmmword ptr [r9+0F0h], zmm3, 3h
@@:
jmp unwind
final2blocks:
test al, al
jz unwind
vbroadcasti32x4 ymm0, xmmword ptr [rcx]
vbroadcasti32x4 ymm1, xmmword ptr [rcx+10h]
vbroadcasti32x4 ymm2, xmmword ptr [BLAKE3_IV]
vmovdqa xmm4, xmmword ptr [rsp]
vmovdqa xmm5, xmmword ptr [rsp+40h]
vpbroadcastq ymm3, r11
vpunpckldq xmm6, xmm4, xmm5
vpunpckhdq xmm5, xmm4, xmm5
vinserti128 ymm6, ymm6, xmm5, 1h
vpermq ymm3 {k3}, ymm6, 0DCh
vbroadcasti32x4 ymm8, xmmword ptr [rdx]
vbroadcasti32x4 ymm9, xmmword ptr [rdx+10h]
vshufps ymm4, ymm8, ymm9, 88h
vshufps ymm5, ymm8, ymm9, 0DDh
vbroadcasti32x4 ymm8, xmmword ptr [rdx+20h]
vbroadcasti32x4 ymm9, xmmword ptr [rdx+30h]
vshufps ymm6, ymm8, ymm9, 88h
vshufps ymm7, ymm8, ymm9, 0DDh
vpshufd ymm6, ymm6, 93h
vpshufd ymm7, ymm7, 93h
mov r8b, 7h
@@:
vpaddd ymm0, ymm0, ymm4
vpaddd ymm0, ymm0, ymm1
vpxord ymm3, ymm3, ymm0
vprord ymm3, ymm3, 10h
vpaddd ymm2, ymm2, ymm3
vpxord ymm1, ymm1, ymm2
vprord ymm1, ymm1, 0Ch
vpaddd ymm0, ymm0, ymm5
vpaddd ymm0, ymm0, ymm1
vpxord ymm3, ymm3, ymm0
vprord ymm3, ymm3, 8h
vpaddd ymm2, ymm2, ymm3
vpxord ymm1, ymm1, ymm2
vprord ymm1, ymm1, 7h
vpshufd ymm0, ymm0, 93h
vpshufd ymm3, ymm3, 4Eh
vpshufd ymm2, ymm2, 39h
vpaddd ymm0, ymm0, ymm6
vpaddd ymm0, ymm0, ymm1
vpxord ymm3, ymm3, ymm0
vprord ymm3, ymm3, 10h
vpaddd ymm2, ymm2, ymm3
vpxord ymm1, ymm1, ymm2
vprord ymm1, ymm1, 0Ch
vpaddd ymm0, ymm0, ymm7
vpaddd ymm0, ymm0, ymm1
vpxord ymm3, ymm3, ymm0
vprord ymm3, ymm3, 8h
vpaddd ymm2, ymm2, ymm3
vpxord ymm1, ymm1, ymm2
vprord ymm1, ymm1, 7h
vpshufd ymm0, ymm0, 39h
vpshufd ymm3, ymm3, 4Eh
vpshufd ymm2, ymm2, 93h
dec r8b
jz @F
vshufps ymm8, ymm4, ymm5, 0D6h
vpshufd ymm9, ymm4, 0Fh
vpshufd ymm4, ymm8, 39h
vshufps ymm8, ymm6, ymm7, 0FAh
vpblendd ymm9, ymm9, ymm8, 0AAh
vpunpcklqdq ymm8, ymm7, ymm5
vpblendd ymm8, ymm8, ymm6, 88h
vpshufd ymm8, ymm8, 78h
vpunpckhdq ymm5, ymm5, ymm7
vpunpckldq ymm6, ymm6, ymm5
vpshufd ymm7, ymm6, 1Eh
vmovdqa ymm5, ymm9
vmovdqa ymm6, ymm8
jmp @B
@@:
vpxord ymm0, ymm0, ymm2
vpxord ymm1, ymm1, ymm3
vbroadcasti128 ymm4, xmmword ptr [rcx]
vbroadcasti128 ymm5, xmmword ptr [rcx+10h]
vpxord ymm2, ymm2, ymm4
vpxord ymm3, ymm3, ymm5
vmovdqu xmmword ptr [r9], xmm0
vmovdqu xmmword ptr [r9+10h], xmm1
vmovdqu xmmword ptr [r9+20h], xmm2
vmovdqu xmmword ptr [r9+30h], xmm3
cmp al, 2h
jb @F
vextracti128 xmmword ptr [r9+40h], ymm0, 1h
vextracti128 xmmword ptr [r9+50h], ymm1, 1h
vextracti128 xmmword ptr [r9+60h], ymm2, 1h
vextracti128 xmmword ptr [r9+70h], ymm3, 1h
@@:
jmp unwind
_blake3_xof_many_avx512 ENDP
blake3_xof_many_avx512 ENDP
_TEXT ENDS
_RDATA SEGMENT READONLY PAGE ALIAS(".rdata") 'CONST'
ALIGN 64
ADD0:
dd 0, 1, 2, 3, 4, 5, 6, 7
dd 8, 9, 10, 11, 12, 13, 14, 15
INDEX0:
dd 0, 1, 2, 3, 16, 17, 18, 19
dd 8, 9, 10, 11, 24, 25, 26, 27
INDEX1:
dd 4, 5, 6, 7, 20, 21, 22, 23
dd 12, 13, 14, 15, 28, 29, 30, 31
BLAKE3_IV:
BLAKE3_IV_0:
dd 06A09E667H
BLAKE3_IV_1:
dd 0BB67AE85H
BLAKE3_IV_2:
dd 03C6EF372H
BLAKE3_IV_3:
dd 0A54FF53AH
ADD1:
dd 1
ADD16:
dd 16
BLAKE3_BLOCK_LEN:
dd 64
_RDATA ENDS
END