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_unix.S
2024-09-04 01:24:44 +01:00

2157 lines
73 KiB
ArmAsm

#if defined(__ELF__) && defined(__linux__)
.section .note.GNU-stack,"",%progbits
#endif
#if defined(__ELF__) && defined(__CET__) && defined(__has_include)
#if __has_include(<cet.h>)
#include <cet.h>
#endif
#endif
#if !defined(_CET_ENDBR)
#define _CET_ENDBR
#endif
.intel_syntax noprefix
.global _blake3_hash_many_avx512
.global blake3_hash_many_avx512
.global blake3_compress_in_place_avx512
.global _blake3_compress_in_place_avx512
.global blake3_compress_xof_avx512
.global _blake3_compress_xof_avx512
.global blake3_xof_many_avx512
.global _blake3_xof_many_avx512
#ifdef __APPLE__
.text
#else
.section .text
#endif
.p2align 6
_blake3_hash_many_avx512:
blake3_hash_many_avx512:
_CET_ENDBR
push rbx
push rbp
push r12
push r13
push r14
push r15
mov rbp, rsp
sub rsp, 0x140
and rsp, 0xFFFFFFFFFFFFFFC0
movzx r9d, r9b
neg r9d
kmovw k1, r9d
vpbroadcastd ymm0, r8d
shr r8, 0x20
vpbroadcastd ymm1, r8d
vmovdqa32 ymm2 {k1} {z}, ymmword ptr [rip+ADD0+0]
vmovdqa32 ymm3 {k1} {z}, ymmword ptr [rip+ADD0+32]
vpaddd ymm2, ymm0, ymm2
vmovdqa ymmword ptr [rsp], ymm2
vpaddd ymm3, ymm0, ymm3
vmovdqa ymmword ptr [rsp+0x20], ymm3
vpcmpud k2 {k1}, ymm2, ymm0, 0x01
vpcmpud k3 {k1}, ymm3, ymm0, 0x01
vmovdqa ymm2, ymm1
vpaddd ymm2 {k2}, ymm2, dword ptr [rip+ADD1] {1to8}
vmovdqa ymmword ptr [rsp+0x40], ymm2
vpaddd ymm1 {k3}, ymm1, dword ptr [rip+ADD1] {1to8}
vmovdqa ymmword ptr [rsp+0x60], ymm1
shl rdx, 0x06
mov qword ptr [rsp+0x100], rdx
cmp rsi, 0x08
jbe 5f
.p2align 5
2:
vpbroadcastd zmm0, dword ptr [rcx]
vpbroadcastd zmm1, dword ptr [rcx+0x04]
vpbroadcastd zmm2, dword ptr [rcx+0x08]
vpbroadcastd zmm3, dword ptr [rcx+0x0C]
vpbroadcastd zmm4, dword ptr [rcx+0x10]
vpbroadcastd zmm5, dword ptr [rcx+0x14]
vpbroadcastd zmm6, dword ptr [rcx+0x18]
vpbroadcastd zmm7, dword ptr [rcx+0x1C]
movzx eax, byte ptr [rbp+0x38]
movzx edx, byte ptr [rbp+0x40]
or eax, edx
xor edx, edx
3:
movzx ebx, byte ptr [rbp+0x48]
or ebx, eax
add rdx, 0x40
cmp rdx, qword ptr [rsp+0x100]
cmovz eax, ebx
mov dword ptr [rsp+0x80], eax
mov rax, qword ptr [rdi]
mov rbx, qword ptr [rdi+0x08]
mov r8, qword ptr [rdi+0x10]
mov r9, qword ptr [rdi+0x18]
mov r10, qword ptr [rdi+0x40]
vmovdqu32 ymm8, ymmword ptr [rax+rdx*1-0x40]
vinserti64x4 zmm8, zmm8, ymmword ptr [r10+rdx*1-0x40], 0x01
vmovdqu32 ymm9, ymmword ptr [rbx+rdx*1-0x40]
cmp rsi, 0x0A
jb 4f
mov r11, qword ptr [rdi+0x48]
vinserti64x4 zmm9, zmm9, ymmword ptr [r11+rdx*1-0x40], 0x01
4:
vpunpckldq zmm10, zmm8, zmm9
vpunpckhdq zmm11, zmm8, zmm9
vmovdqu32 ymm8, ymmword ptr [r8+rdx*1-0x40]
cmp rsi, 0x0B
jb 4f
mov r12, qword ptr [rdi+0x50]
vinserti64x4 zmm8, zmm8, ymmword ptr [r12+rdx*1-0x40], 0x01
4:
vmovdqu32 ymm9, ymmword ptr [r9+rdx*1-0x40]
cmp rsi, 0x0C
jb 4f
mov r13, qword ptr [rdi+0x58]
vinserti64x4 zmm9, zmm9, ymmword ptr [r13+rdx*1-0x40], 0x01
4:
vpunpckldq zmm12, zmm8, zmm9
vpunpckhdq zmm13, zmm8, zmm9
mov rax, qword ptr [rdi+0x20]
mov rbx, qword ptr [rdi+0x28]
mov r8, qword ptr [rdi+0x30]
mov r9, qword ptr [rdi+0x38]
vmovdqu32 ymm8, ymmword ptr [rax+rdx*1-0x40]
cmp rsi, 0x0D
jb 4f
mov r10, qword ptr [rdi+0x60]
vinserti64x4 zmm8, zmm8, ymmword ptr [r10+rdx*1-0x40], 0x01
4:
vmovdqu32 ymm9, ymmword ptr [rbx+rdx*1-0x40]
cmp rsi, 0x0E
jb 4f
mov r11, qword ptr [rdi+0x68]
vinserti64x4 zmm9, zmm9, ymmword ptr [r11+rdx*1-0x40], 0x01
4:
vpunpckldq zmm14, zmm8, zmm9
vpunpckhdq zmm15, zmm8, zmm9
vmovdqu32 ymm8, ymmword ptr [r8+rdx*1-0x40]
cmp rsi, 0x0F
jb 4f
mov r12, qword ptr [rdi+0x70]
vinserti64x4 zmm8, zmm8, ymmword ptr [r12+rdx*1-0x40], 0x01
4:
vmovdqu32 ymm9, ymmword ptr [r9+rdx*1-0x40]
cmp rsi, 0x10
jb 4f
mov r13, qword ptr [rdi+0x78]
vinserti64x4 zmm9, zmm9, ymmword ptr [r13+rdx*1-0x40], 0x01
4:
vpunpckldq zmm16, zmm8, zmm9
vpunpckhdq zmm17, zmm8, zmm9
vmovdqa32 zmm8, zmmword ptr [rip+INDEX0]
vmovdqa32 zmm9, zmmword ptr [rip+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 [rdi]
mov rbx, qword ptr [rdi+0x08]
mov r8, qword ptr [rdi+0x10]
mov r9, qword ptr [rdi+0x18]
mov r10, qword ptr [rdi+0x40]
vmovdqu32 ymm11, ymmword ptr [rax+rdx*1-0x20]
vinserti64x4 zmm11, zmm11, ymmword ptr [r10+rdx*1-0x20], 0x01
vmovdqu32 ymm13, ymmword ptr [rbx+rdx*1-0x20]
cmp rsi, 0x0A
jb 4f
mov r11, qword ptr [rdi+0x48]
vinserti64x4 zmm13, zmm13, ymmword ptr [r11+rdx*1-0x20], 0x01
prefetcht0 byte ptr [r11+rdx*1+0x80]
4:
vpunpckldq zmm15, zmm11, zmm13
vpunpckhdq zmm17, zmm11, zmm13
vmovdqu32 ymm11, ymmword ptr [r8+rdx*1-0x20]
cmp rsi, 0x0B
jb 4f
mov r12, qword ptr [rdi+0x50]
vinserti64x4 zmm11, zmm11, ymmword ptr [r12+rdx*1-0x20], 0x01
prefetcht0 byte ptr [r13+rdx*1+0x80]
4:
vmovdqu32 ymm13, ymmword ptr [r9+rdx*1-0x20]
cmp rsi, 0x0C
jb 4f
mov r13, qword ptr [rdi+0x58]
vinserti64x4 zmm13, zmm13, ymmword ptr [r13+rdx*1-0x20], 0x01
prefetcht0 byte ptr [r13+rdx*1+0x80]
4:
vpunpckldq zmm22, zmm11, zmm13
vpunpckhdq zmm23, zmm11, zmm13
prefetcht0 byte ptr [rax+rdx*1+0x80]
prefetcht0 byte ptr [rbx+rdx*1+0x80]
prefetcht0 byte ptr [r8+rdx*1+0x80]
prefetcht0 byte ptr [r9+rdx*1+0x80]
prefetcht0 byte ptr [r10+rdx*1+0x80]
mov rax, qword ptr [rdi+0x20]
mov rbx, qword ptr [rdi+0x28]
mov r8, qword ptr [rdi+0x30]
mov r9, qword ptr [rdi+0x38]
vmovdqu32 ymm11, ymmword ptr [rax+rdx*1-0x20]
cmp rsi, 0x0D
jb 4f
mov r10, qword ptr [rdi+0x60]
vinserti64x4 zmm11, zmm11, ymmword ptr [r10+rdx*1-0x20], 0x01
prefetcht0 byte ptr [r10+rdx*1+0x80]
4:
vmovdqu32 ymm13, ymmword ptr [rbx+rdx*1-0x20]
cmp rsi, 0x0E
jb 4f
mov r11, qword ptr [rdi+0x68]
vinserti64x4 zmm13, zmm13, ymmword ptr [r11+rdx*1-0x20], 0x01
prefetcht0 byte ptr [r11+rdx*1+0x80]
4:
vpunpckldq zmm24, zmm11, zmm13
vpunpckhdq zmm25, zmm11, zmm13
vmovdqu32 ymm11, ymmword ptr [r8+rdx*1-0x20]
cmp rsi, 0x0F
jb 4f
mov r12, qword ptr [rdi+0x70]
vinserti64x4 zmm11, zmm11, ymmword ptr [r12+rdx*1-0x20], 0x01
prefetcht0 byte ptr [r12+rdx*1+0x80]
4:
vmovdqu32 ymm13, ymmword ptr [r9+rdx*1-0x20]
cmp rsi, 0x10
jb 4f
mov r13, qword ptr [rdi+0x78]
vinserti64x4 zmm13, zmm13, ymmword ptr [r13+rdx*1-0x20], 0x01
prefetcht0 byte ptr [r13+rdx*1+0x80]
4:
vpunpckldq zmm26, zmm11, zmm13
vpunpckhdq zmm27, zmm11, zmm13
prefetcht0 byte ptr [r10+rdx*1+0x80]
prefetcht0 byte ptr [r11+rdx*1+0x80]
prefetcht0 byte ptr [r12+rdx*1+0x80]
prefetcht0 byte ptr [r13+rdx*1+0x80]
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 [rip+BLAKE3_IV_0]
vpbroadcastd zmm23, dword ptr [rip+BLAKE3_IV_1]
vpbroadcastd zmm24, dword ptr [rip+BLAKE3_IV_2]
vpbroadcastd zmm25, dword ptr [rip+BLAKE3_IV_3]
vmovdqa32 zmm26, zmmword ptr [rsp]
vmovdqa32 zmm27, zmmword ptr [rsp+0x40]
vpbroadcastd zmm30, dword ptr [rip+BLAKE3_BLOCK_LEN]
vpbroadcastd zmm31, dword ptr [rsp+0x80]
mov al, 0x07
4:
vpaddd zmm0, zmm0, zmm18
vpaddd zmm1, zmm1, zmm10
vpaddd zmm2, zmm2, zmm19
vpaddd zmm3, zmm3, zmm12
vmovdqa32 zmmword ptr [rsp+0x80], zmm18
vmovdqa32 zmmword ptr [rsp+0xC0], 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, 0x10
vprord zmm27, zmm27, 0x10
vprord zmm30, zmm30, 0x10
vprord zmm31, zmm31, 0x10
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, 0x0C
vprord zmm5, zmm5, 0x0C
vprord zmm6, zmm6, 0x0C
vprord zmm7, zmm7, 0x0C
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, 0x08
vmovdqa32 zmm19, zmm16
vprord zmm27, zmm27, 0x08
vprord zmm30, zmm30, 0x08
vprord zmm31, zmm31, 0x08
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, 0x07
vprord zmm5, zmm5, 0x07
vprord zmm6, zmm6, 0x07
vprord zmm7, zmm7, 0x07
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, 0x10
vprord zmm26, zmm26, 0x10
vprord zmm27, zmm27, 0x10
vprord zmm30, zmm30, 0x10
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, 0x0C
vprord zmm6, zmm6, 0x0C
vprord zmm7, zmm7, 0x0C
vprord zmm4, zmm4, 0x0C
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, 0x08
vmovdqa32 zmm8, zmm21
vprord zmm26, zmm26, 0x08
vprord zmm27, zmm27, 0x08
vprord zmm30, zmm30, 0x08
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+0x80]
vprord zmm5, zmm5, 0x07
vprord zmm6, zmm6, 0x07
vprord zmm7, zmm7, 0x07
vprord zmm4, zmm4, 0x07
vmovdqa32 zmm20, zmmword ptr [rsp+0xC0]
dec al
jnz 4b
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+0x38]
cmp rdx, qword ptr [rsp+0x100]
jb 3b
mov rbx, qword ptr [rbp+0x50]
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 [rip+INDEX0]
vmovdqa32 zmm18, zmmword ptr [rip+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 [rbx], zmm8, 0x00
vextracti64x4 ymmword ptr [rbx+0x20], zmm10, 0x00
vextracti64x4 ymmword ptr [rbx+0x40], zmm12, 0x00
vextracti64x4 ymmword ptr [rbx+0x60], zmm14, 0x00
vextracti64x4 ymmword ptr [rbx+0x80], zmm0, 0x00
vextracti64x4 ymmword ptr [rbx+0xA0], zmm1, 0x00
vextracti64x4 ymmword ptr [rbx+0xC0], zmm2, 0x00
vextracti64x4 ymmword ptr [rbx+0xE0], zmm3, 0x00
vextracti64x4 ymmword ptr [rbx+0x100], zmm8, 0x01
cmp rsi, 0x0A
jb 9f
vextracti64x4 ymmword ptr [rbx+0x120], zmm10, 0x01
cmp rsi, 0x0B
jb 9f
vextracti64x4 ymmword ptr [rbx+0x140], zmm12, 0x01
cmp rsi, 0x0C
jb 9f
vextracti64x4 ymmword ptr [rbx+0x160], zmm14, 0x01
cmp rsi, 0x0D
jb 9f
vextracti64x4 ymmword ptr [rbx+0x180], zmm0, 0x01
cmp rsi, 0x0E
jb 9f
vextracti64x4 ymmword ptr [rbx+0x1A0], zmm1, 0x01
cmp rsi, 0x0F
jb 9f
vextracti64x4 ymmword ptr [rbx+0x1C0], zmm2, 0x01
cmp rsi, 0x10
jb 9f
vextracti64x4 ymmword ptr [rbx+0x1E0], zmm3, 0x01
vmovdqa32 zmm8, zmmword ptr [rsp]
vmovdqa32 zmm9, zmmword ptr [rsp+0x40]
vmovdqa32 zmm10, zmm8
vpaddd zmm10 {k1}, zmm8, dword ptr [rip+ADD16] {1to16}
vpcmpud k2 {k1}, zmm10, zmm8, 0x01
vpaddd zmm9 {k2}, zmm9, dword ptr [rip+ADD1] {1to16}
vmovdqa32 zmmword ptr [rsp], zmm10
vmovdqa32 zmmword ptr [rsp+0x40], zmm9
add rbx, 0x200
mov qword ptr [rbp+0x50], rbx
add rdi, 0x80
sub rsi, 0x10
cmp rsi, 0x08
jnbe 2b
test esi, esi
jnz 5f
9:
vzeroupper
mov rsp, rbp
pop r15
pop r14
pop r13
pop r12
pop rbp
pop rbx
ret
.p2align 6
5:
cmp sil, 0x04
jbe 3f
vpbroadcastd ymm0, dword ptr [rcx]
vpbroadcastd ymm1, dword ptr [rcx+0x04]
vpbroadcastd ymm2, dword ptr [rcx+0x08]
vpbroadcastd ymm3, dword ptr [rcx+0x0C]
vpbroadcastd ymm4, dword ptr [rcx+0x10]
vpbroadcastd ymm5, dword ptr [rcx+0x14]
vpbroadcastd ymm6, dword ptr [rcx+0x18]
vpbroadcastd ymm7, dword ptr [rcx+0x1C]
movzx eax, byte ptr [rbp+0x38]
movzx edx, byte ptr [rbp+0x40]
or eax, edx
xor edx, edx
2:
movzx ebx, byte ptr [rbp+0x48]
or ebx, eax
add rdx, 0x40
cmp rdx, qword ptr [rsp+0x100]
cmovz eax, ebx
mov dword ptr [rsp+0x80], eax
mov rax, qword ptr [rdi]
mov rbx, qword ptr [rdi+0x20]
vmovups xmm8, xmmword ptr [rax+rdx*1-0x40]
vinserti32x4 ymm8, ymm8, xmmword ptr [rbx+rdx*1-0x40], 0x01
vmovups xmm12, xmmword ptr [rax+rdx*1-0x30]
vinserti32x4 ymm12, ymm12, xmmword ptr [rbx+rdx*1-0x30], 0x01
mov rax, qword ptr [rdi+0x08]
vmovups xmm9, xmmword ptr [rax+rdx*1-0x40]
vmovups xmm13, xmmword ptr [rax+rdx*1-0x30]
cmp sil, 0x06
jb 4f
mov rbx, qword ptr [rdi+0x28]
vinserti32x4 ymm9, ymm9, xmmword ptr [rbx+rdx*1-0x40], 0x01
vinserti32x4 ymm13, ymm13, xmmword ptr [rbx+rdx*1-0x30], 0x01
4:
mov rax, qword ptr [rdi+0x10]
vmovups xmm10, xmmword ptr [rax+rdx*1-0x40]
vmovups xmm14, xmmword ptr [rax+rdx*1-0x30]
cmp sil, 0x07
jb 4f
mov rbx, qword ptr [rdi+0x30]
vinserti32x4 ymm10, ymm10, xmmword ptr [rbx+rdx*1-0x40], 0x01
vinserti32x4 ymm14, ymm14, xmmword ptr [rbx+rdx*1-0x30], 0x01
4:
mov rax, qword ptr [rdi+0x18]
vmovups xmm11, xmmword ptr [rax+rdx*1-0x40]
vmovups xmm15, xmmword ptr [rax+rdx*1-0x30]
cmp sil, 0x08
jb 4f
mov rbx, qword ptr [rdi+0x38]
vinserti32x4 ymm11, ymm11, xmmword ptr [rbx+rdx*1-0x40], 0x01
vinserti32x4 ymm15, ymm15, xmmword ptr [rbx+rdx*1-0x30], 0x01
4:
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, 0x44
vshufps ymm8, ymm24, ymm8, 0xEE
vshufps ymm24, ymm9, ymm11, 0x44
vshufps ymm11, ymm9, ymm11, 0xEE
vshufps ymm9, ymm10, ymm12, 0x44
vshufps ymm12, ymm10, ymm12, 0xEE
vshufps ymm10, ymm13, ymm15, 0x44
vshufps ymm15, ymm13, ymm15, 0xEE
mov rax, qword ptr [rdi]
mov rbx, qword ptr [rdi+0x20]
vmovups xmm16, xmmword ptr [rax+rdx*1-0x20]
vinserti32x4 ymm16, ymm16, xmmword ptr [rbx+rdx*1-0x20], 0x01
vmovups xmm20, xmmword ptr [rax+rdx*1-0x10]
vinserti32x4 ymm20, ymm20, xmmword ptr [rbx+rdx*1-0x10], 0x01
mov rax, qword ptr [rdi+0x08]
vmovups xmm17, xmmword ptr [rax+rdx*1-0x20]
vmovups xmm21, xmmword ptr [rax+rdx*1-0x10]
cmp sil, 0x06
jb 4f
mov rbx, qword ptr [rdi+0x28]
vinserti32x4 ymm17, ymm17, xmmword ptr [rbx+rdx*1-0x20], 0x01
vinserti32x4 ymm21, ymm21, xmmword ptr [rbx+rdx*1-0x10], 0x01
4:
mov rax, qword ptr [rdi+0x10]
vmovups xmm18, xmmword ptr [rax+rdx*1-0x20]
vmovups xmm22, xmmword ptr [rax+rdx*1-0x10]
cmp sil, 0x07
jb 4f
mov rbx, qword ptr [rdi+0x30]
vinserti32x4 ymm18, ymm18, xmmword ptr [rbx+rdx*1-0x20], 0x01
vinserti32x4 ymm22, ymm22, xmmword ptr [rbx+rdx*1-0x10], 0x01
4:
mov rax, qword ptr [rdi+0x18]
vmovups xmm19, xmmword ptr [rax+rdx*1-0x20]
vmovups xmm23, xmmword ptr [rax+rdx*1-0x10]
cmp sil, 0x08
jb 4f
mov rbx, qword ptr [rdi+0x38]
vinserti32x4 ymm19, ymm19, xmmword ptr [rbx+rdx*1-0x20], 0x01
vinserti32x4 ymm23, ymm23, xmmword ptr [rbx+rdx*1-0x10], 0x01
4:
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, 0x44
vshufps ymm16, ymm13, ymm16, 0xEE
vshufps ymm13, ymm17, ymm19, 0x44
vshufps ymm19, ymm17, ymm19, 0xEE
vshufps ymm17, ymm18, ymm20, 0x44
vshufps ymm20, ymm18, ymm20, 0xEE
vshufps ymm18, ymm21, ymm23, 0x44
vshufps ymm23, ymm21, ymm23, 0xEE
vpbroadcastd ymm21, dword ptr [rip+BLAKE3_IV_0]
vpbroadcastd ymm25, dword ptr [rip+BLAKE3_IV_1]
vpbroadcastd ymm26, dword ptr [rip+BLAKE3_IV_2]
vpbroadcastd ymm27, dword ptr [rip+BLAKE3_IV_3]
vmovdqa32 ymm28, ymmword ptr [rsp]
vmovdqa32 ymm29, ymmword ptr [rsp+0x40]
vpbroadcastd ymm30, dword ptr [rip+BLAKE3_BLOCK_LEN]
vpbroadcastd ymm31, dword ptr [rsp+0x80]
mov al, 0x07
4:
vpaddd ymm0, ymm0, ymm14
vpaddd ymm1, ymm1, ymm24
vpaddd ymm2, ymm2, ymm9
vpaddd ymm3, ymm3, ymm10
vmovdqa32 ymmword ptr [rsp+0x80], ymm14
vmovdqa32 ymmword ptr [rsp+0xC0], 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, 0x10
vprord ymm29, ymm29, 0x10
vprord ymm30, ymm30, 0x10
vprord ymm31, ymm31, 0x10
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, 0x0C
vprord ymm5, ymm5, 0x0C
vprord ymm6, ymm6, 0x0C
vprord ymm7, ymm7, 0x0C
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, 0x08
vmovdqa32 ymm9, ymm15
vprord ymm29, ymm29, 0x08
vprord ymm30, ymm30, 0x08
vprord ymm31, ymm31, 0x08
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, 0x07
vprord ymm5, ymm5, 0x07
vprord ymm6, ymm6, 0x07
vprord ymm7, ymm7, 0x07
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, 0x10
vprord ymm28, ymm28, 0x10
vprord ymm29, ymm29, 0x10
vprord ymm30, ymm30, 0x10
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, 0x0C
vprord ymm6, ymm6, 0x0C
vprord ymm7, ymm7, 0x0C
vprord ymm4, ymm4, 0x0C
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, 0x08
vmovdqa32 ymm19, ymm12
vprord ymm28, ymm28, 0x08
vprord ymm29, ymm29, 0x08
vprord ymm30, ymm30, 0x08
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+0x80]
vprord ymm5, ymm5, 0x07
vprord ymm6, ymm6, 0x07
vprord ymm7, ymm7, 0x07
vprord ymm4, ymm4, 0x07
vmovdqa32 ymm8, ymmword ptr [rsp+0xC0]
dec al
jnz 4b
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+0x38]
cmp rdx, qword ptr [rsp+0x100]
jb 2b
mov rbx, qword ptr [rbp+0x50]
vpunpckldq ymm8, ymm0, ymm1
vpunpckldq ymm9, ymm2, ymm3
vpunpckhdq ymm10, ymm0, ymm1
vpunpckldq ymm11, ymm4, ymm5
vpunpckldq ymm0, ymm6, ymm7
vshufps ymm12, ymm8, ymm9, 0x4E
vpblendd ymm1, ymm8, ymm12, 0xCC
vshufps ymm8, ymm11, ymm0, 0x4E
vpunpckhdq ymm13, ymm2, ymm3
vpblendd ymm2, ymm11, ymm8, 0xCC
vpblendd ymm3, ymm12, ymm9, 0xCC
vperm2i128 ymm12, ymm1, ymm2, 0x20
vmovdqu ymmword ptr [rbx], ymm12
vpunpckhdq ymm14, ymm4, ymm5
vpblendd ymm4, ymm8, ymm0, 0xCC
vpunpckhdq ymm15, ymm6, ymm7
vperm2i128 ymm7, ymm3, ymm4, 0x20
vmovdqu ymmword ptr [rbx+0x20], ymm7
vshufps ymm5, ymm10, ymm13, 0x4E
vpblendd ymm6, ymm5, ymm13, 0xCC
vshufps ymm13, ymm14, ymm15, 0x4E
vpblendd ymm10, ymm10, ymm5, 0xCC
vpblendd ymm14, ymm14, ymm13, 0xCC
vperm2i128 ymm8, ymm10, ymm14, 0x20
vmovdqu ymmword ptr [rbx+0x40], ymm8
vpblendd ymm15, ymm13, ymm15, 0xCC
vperm2i128 ymm13, ymm6, ymm15, 0x20
vmovdqu ymmword ptr [rbx+0x60], ymm13
vperm2i128 ymm9, ymm1, ymm2, 0x31
vmovdqu ymmword ptr [rbx+0x80], ymm9
cmp sil, 0x06
jb 4f
vperm2i128 ymm11, ymm3, ymm4, 0x31
vmovdqu ymmword ptr [rbx+0xA0], ymm11
cmp sil, 0x07
jb 4f
vperm2i128 ymm14, ymm10, ymm14, 0x31
vmovdqu ymmword ptr [rbx+0xC0], ymm14
cmp sil, 0x08
jb 4f
vperm2i128 ymm15, ymm6, ymm15, 0x31
vmovdqu ymmword ptr [rbx+0xE0], ymm15
4:
jmp 9b
3:
mov rax, qword ptr [rsp+0x100]
mov rdx, qword ptr [rbp+0x50]
movzx ebx, byte ptr [rbp+0x38]
movzx r8d, byte ptr [rbp+0x48]
mov r9d, 0xAAAA
kmovw k2, r9d
mov r9d, 0x8888
kmovw k3, r9d
cmp sil, 0x02
jbe 3f
vbroadcasti32x4 zmm0, xmmword ptr [rcx]
vbroadcasti32x4 zmm1, xmmword ptr [rcx+0x10]
vbroadcasti32x4 zmm4, xmmword ptr [rip+BLAKE3_IV]
mov r9d, 0x4444
kmovw k4, r9d
vmovdqa xmm6, xmmword ptr [rsp]
vmovdqa xmm7, xmmword ptr [rsp+0x40]
vpbroadcastd zmm5, dword ptr [rip+BLAKE3_BLOCK_LEN]
vpunpckldq xmm8, xmm6, xmm7
vpunpckhdq xmm7, xmm6, xmm7
vinserti64x4 zmm8, zmm8, ymm7, 0x01
vpermq zmm8, zmm8, 0xDC
vpblendmd zmm5 {k4}, zmm8, zmm5
mov r9, qword ptr [rdi]
mov r10, qword ptr [rdi+0x08]
mov r11, qword ptr [rdi+0x10]
cmp sil, 0x04
jb 4f
mov r12, qword ptr [rdi+0x18]
4:
movzx r13d, byte ptr [rbp+0x40]
or r13d, ebx
xor r14d, r14d
2:
movzx r15d, byte ptr [rbp+0x48]
or r15d, r13d
add r14, 0x40
cmp r14, rax
cmovz r13d, r15d
mov dword ptr [rsp+0x80], r13d
vmovdqa32 zmm2, zmm4
vpblendmd zmm3 {k3}, zmm5, dword ptr [rsp+0x80] {1to16}
vmovdqu32 zmm10, zmmword ptr [r9+r14*1-0x40]
vmovdqu32 zmm11, zmmword ptr [r9+r14*1-0x30]
vmovdqu32 zmm12, zmmword ptr [r9+r14*1-0x20]
vmovdqu32 zmm13, zmmword ptr [r9+r14*1-0x10]
vinserti32x4 zmm10, zmm10, xmmword ptr [r10+r14*1-0x40], 0x01
vinserti32x4 zmm11, zmm11, xmmword ptr [r10+r14*1-0x30], 0x01
vinserti32x4 zmm12, zmm12, xmmword ptr [r10+r14*1-0x20], 0x01
vinserti32x4 zmm13, zmm13, xmmword ptr [r10+r14*1-0x10], 0x01
vinserti32x4 zmm10, zmm10, xmmword ptr [r11+r14*1-0x40], 0x02
vinserti32x4 zmm11, zmm11, xmmword ptr [r11+r14*1-0x30], 0x02
vinserti32x4 zmm12, zmm12, xmmword ptr [r11+r14*1-0x20], 0x02
vinserti32x4 zmm13, zmm13, xmmword ptr [r11+r14*1-0x10], 0x02
cmp sil, 0x04
jb 4f
vinserti32x4 zmm10, zmm10, xmmword ptr [r12+r14*1-0x40], 0x03
vinserti32x4 zmm11, zmm11, xmmword ptr [r12+r14*1-0x30], 0x03
vinserti32x4 zmm12, zmm12, xmmword ptr [r12+r14*1-0x20], 0x03
vinserti32x4 zmm13, zmm13, xmmword ptr [r12+r14*1-0x10], 0x03
4:
vshufps zmm6, zmm10, zmm11, 0x88
vshufps zmm7, zmm10, zmm11, 0xDD
vshufps zmm8, zmm12, zmm13, 0x88
vshufps zmm9, zmm12, zmm13, 0xDD
vpshufd zmm8, zmm8, 0x93
vpshufd zmm9, zmm9, 0x93
mov r15b, 0x07
4:
vpaddd zmm0, zmm0, zmm6
vpaddd zmm0, zmm0, zmm1
vpxord zmm3, zmm3, zmm0
vprord zmm3, zmm3, 0x10
vpaddd zmm2, zmm2, zmm3
vpxord zmm1, zmm1, zmm2
vprord zmm1, zmm1, 0x0C
vpaddd zmm0, zmm0, zmm7
vpaddd zmm0, zmm0, zmm1
vpxord zmm3, zmm3, zmm0
vprord zmm3, zmm3, 0x08
vpaddd zmm2, zmm2, zmm3
vpxord zmm1, zmm1, zmm2
vprord zmm1, zmm1, 0x07
vpshufd zmm0, zmm0, 0x93
vpshufd zmm3, zmm3, 0x4E
vpshufd zmm2, zmm2, 0x39
vpaddd zmm0, zmm0, zmm8
vpaddd zmm0, zmm0, zmm1
vpxord zmm3, zmm3, zmm0
vprord zmm3, zmm3, 0x10
vpaddd zmm2, zmm2, zmm3
vpxord zmm1, zmm1, zmm2
vprord zmm1, zmm1, 0x0C
vpaddd zmm0, zmm0, zmm9
vpaddd zmm0, zmm0, zmm1
vpxord zmm3, zmm3, zmm0
vprord zmm3, zmm3, 0x08
vpaddd zmm2, zmm2, zmm3
vpxord zmm1, zmm1, zmm2
vprord zmm1, zmm1, 0x07
vpshufd zmm0, zmm0, 0x39
vpshufd zmm3, zmm3, 0x4E
vpshufd zmm2, zmm2, 0x93
dec r15b
jz 4f
vshufps zmm14, zmm6, zmm7, 0xD6
vpshufd zmm15, zmm6, 0x0F
vpshufd zmm6, zmm14, 0x39
vshufps zmm14, zmm8, zmm9, 0xFA
vpblendmd zmm15 {k2}, zmm15, zmm14
vpunpcklqdq zmm14, zmm9, zmm7
vpblendmd zmm14 {k3}, zmm14, zmm8
vpshufd zmm14, zmm14, 0x78
vpunpckhdq zmm7, zmm7, zmm9
vpunpckldq zmm8, zmm8, zmm7
vpshufd zmm9, zmm8, 0x1E
vmovdqa32 zmm7, zmm15
vmovdqa32 zmm8, zmm14
jmp 4b
4:
vpxord zmm0, zmm0, zmm2
vpxord zmm1, zmm1, zmm3
mov r13d, ebx
cmp r14, rax
jb 2b
vmovdqu xmmword ptr [rdx], xmm0
vmovdqu xmmword ptr [rdx+0x10], xmm1
vextracti128 xmmword ptr [rdx+0x20], ymm0, 0x01
vextracti128 xmmword ptr [rdx+0x30], ymm1, 0x01
vextracti32x4 xmmword ptr [rdx+0x40], zmm0, 0x02
vextracti32x4 xmmword ptr [rdx+0x50], zmm1, 0x02
cmp sil, 0x04
jb 4f
vextracti32x4 xmmword ptr [rdx+0x60], zmm0, 0x03
vextracti32x4 xmmword ptr [rdx+0x70], zmm1, 0x03
4:
jmp 9b
3:
test sil, sil
jz 9b
vbroadcasti128 ymm0, xmmword ptr [rcx]
vbroadcasti128 ymm1, xmmword ptr [rcx+0x10]
vbroadcasti128 ymm4, xmmword ptr [rip+BLAKE3_IV]
vmovdqa xmm6, xmmword ptr [rsp]
vmovdqa xmm7, xmmword ptr [rsp+0x40]
mov r9d, 0x40
vpbroadcastq ymm5, r9
mov r9d, 0x55
kmovw k4, r9d
vpunpckldq xmm8, xmm6, xmm7
vpunpckhdq xmm7, xmm6, xmm7
vinserti128 ymm8, ymm8, xmm7, 0x01
vpermq ymm5 {k4}, ymm8, 0xDC
mov r9, qword ptr [rdi]
cmp sil, 0x02
jb 4f
mov r10, qword ptr [rdi+0x08]
4:
mov r11d, ebx
movzx r12d, byte ptr [rbp+0x40]
or r11d, r12d
xor r12d, r12d
2:
movzx r13d, byte ptr [rbp+0x48]
or r13d, r11d
add r12, 0x40
cmp r12, rax
cmovz r11d, r13d
mov dword ptr [rsp+0x80], r11d
vmovdqa ymm2, ymm4
vpblendmd ymm3 {k3}, ymm5, dword ptr [rsp+0x80] {1to8}
vmovdqu ymm10, ymmword ptr [r9+r12*1-0x40]
vmovdqu ymm11, ymmword ptr [r9+r12*1-0x30]
vmovdqu ymm12, ymmword ptr [r9+r12*1-0x20]
vmovdqu ymm13, ymmword ptr [r9+r12*1-0x10]
cmp sil, 0x02
jb 4f
vinserti128 ymm10, ymm10, xmmword ptr [r10+r12*1-0x40], 0x01
vinserti128 ymm11, ymm11, xmmword ptr [r10+r12*1-0x30], 0x01
vinserti128 ymm12, ymm12, xmmword ptr [r10+r12*1-0x20], 0x01
vinserti128 ymm13, ymm13, xmmword ptr [r10+r12*1-0x10], 0x01
4:
vshufps ymm6, ymm10, ymm11, 0x88
vshufps ymm7, ymm10, ymm11, 0xDD
vshufps ymm8, ymm12, ymm13, 0x88
vshufps ymm9, ymm12, ymm13, 0xDD
vpshufd ymm8, ymm8, 0x93
vpshufd ymm9, ymm9, 0x93
mov r13b, 0x07
4:
vpaddd ymm0, ymm0, ymm6
vpaddd ymm0, ymm0, ymm1
vpxord ymm3, ymm3, ymm0
vprord ymm3, ymm3, 0x10
vpaddd ymm2, ymm2, ymm3
vpxord ymm1, ymm1, ymm2
vprord ymm1, ymm1, 0x0C
vpaddd ymm0, ymm0, ymm7
vpaddd ymm0, ymm0, ymm1
vpxord ymm3, ymm3, ymm0
vprord ymm3, ymm3, 0x08
vpaddd ymm2, ymm2, ymm3
vpxord ymm1, ymm1, ymm2
vprord ymm1, ymm1, 0x07
vpshufd ymm0, ymm0, 0x93
vpshufd ymm3, ymm3, 0x4E
vpshufd ymm2, ymm2, 0x39
vpaddd ymm0, ymm0, ymm8
vpaddd ymm0, ymm0, ymm1
vpxord ymm3, ymm3, ymm0
vprord ymm3, ymm3, 0x10
vpaddd ymm2, ymm2, ymm3
vpxord ymm1, ymm1, ymm2
vprord ymm1, ymm1, 0x0C
vpaddd ymm0, ymm0, ymm9
vpaddd ymm0, ymm0, ymm1
vpxord ymm3, ymm3, ymm0
vprord ymm3, ymm3, 0x08
vpaddd ymm2, ymm2, ymm3
vpxord ymm1, ymm1, ymm2
vprord ymm1, ymm1, 0x07
vpshufd ymm0, ymm0, 0x39
vpshufd ymm3, ymm3, 0x4E
vpshufd ymm2, ymm2, 0x93
dec r13b
jz 4f
vshufps ymm10, ymm6, ymm7, 0xD6
vpshufd ymm11, ymm6, 0x0F
vpshufd ymm6, ymm10, 0x39
vshufps ymm10, ymm8, ymm9, 0xFA
vpblendd ymm11, ymm11, ymm10, 0xAA
vpunpcklqdq ymm10, ymm9, ymm7
vpblendd ymm10, ymm10, ymm8, 0x88
vpshufd ymm10, ymm10, 0x78
vpunpckhdq ymm7, ymm7, ymm9
vpunpckldq ymm8, ymm8, ymm7
vpshufd ymm9, ymm8, 0x1E
vmovdqa ymm7, ymm11
vmovdqa ymm8, ymm10
jmp 4b
4:
vpxor ymm0, ymm0, ymm2
vpxor ymm1, ymm1, ymm3
mov r11d, ebx
cmp r12, rax
jb 2b
vmovdqu xmmword ptr [rdx], xmm0
vmovdqu xmmword ptr [rdx+0x10], xmm1
cmp sil, 0x02
jb 4f
vextracti128 xmmword ptr [rdx+0x20], ymm0, 0x01
vextracti128 xmmword ptr [rdx+0x30], ymm1, 0x01
4:
jmp 9b
.p2align 6
_blake3_compress_in_place_avx512:
blake3_compress_in_place_avx512:
_CET_ENDBR
vmovdqu xmm0, xmmword ptr [rdi]
vmovdqu xmm1, xmmword ptr [rdi+0x10]
movzx eax, r8b
movzx edx, dl
shl rax, 32
add rdx, rax
vmovq xmm3, rcx
vmovq xmm4, rdx
vpunpcklqdq xmm3, xmm3, xmm4
vmovaps xmm2, xmmword ptr [BLAKE3_IV+rip]
vmovups xmm8, xmmword ptr [rsi]
vmovups xmm9, xmmword ptr [rsi+0x10]
vshufps xmm4, xmm8, xmm9, 136
vshufps xmm5, xmm8, xmm9, 221
vmovups xmm8, xmmword ptr [rsi+0x20]
vmovups xmm9, xmmword ptr [rsi+0x30]
vshufps xmm6, xmm8, xmm9, 136
vshufps xmm7, xmm8, xmm9, 221
vpshufd xmm6, xmm6, 0x93
vpshufd xmm7, xmm7, 0x93
mov al, 7
9:
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, 0x93
vpshufd xmm3, xmm3, 0x4E
vpshufd xmm2, xmm2, 0x39
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, 0x39
vpshufd xmm3, xmm3, 0x4E
vpshufd xmm2, xmm2, 0x93
dec al
jz 9f
vshufps xmm8, xmm4, xmm5, 214
vpshufd xmm9, xmm4, 0x0F
vpshufd xmm4, xmm8, 0x39
vshufps xmm8, xmm6, xmm7, 250
vpblendd xmm9, xmm9, xmm8, 0xAA
vpunpcklqdq xmm8, xmm7, xmm5
vpblendd xmm8, xmm8, xmm6, 0x88
vpshufd xmm8, xmm8, 0x78
vpunpckhdq xmm5, xmm5, xmm7
vpunpckldq xmm6, xmm6, xmm5
vpshufd xmm7, xmm6, 0x1E
vmovdqa xmm5, xmm9
vmovdqa xmm6, xmm8
jmp 9b
9:
vpxor xmm0, xmm0, xmm2
vpxor xmm1, xmm1, xmm3
vmovdqu xmmword ptr [rdi], xmm0
vmovdqu xmmword ptr [rdi+0x10], xmm1
ret
.p2align 6
_blake3_compress_xof_avx512:
blake3_compress_xof_avx512:
_CET_ENDBR
vmovdqu xmm0, xmmword ptr [rdi]
vmovdqu xmm1, xmmword ptr [rdi+0x10]
movzx eax, r8b
movzx edx, dl
shl rax, 32
add rdx, rax
vmovq xmm3, rcx
vmovq xmm4, rdx
vpunpcklqdq xmm3, xmm3, xmm4
vmovaps xmm2, xmmword ptr [BLAKE3_IV+rip]
vmovups xmm8, xmmword ptr [rsi]
vmovups xmm9, xmmword ptr [rsi+0x10]
vshufps xmm4, xmm8, xmm9, 136
vshufps xmm5, xmm8, xmm9, 221
vmovups xmm8, xmmword ptr [rsi+0x20]
vmovups xmm9, xmmword ptr [rsi+0x30]
vshufps xmm6, xmm8, xmm9, 136
vshufps xmm7, xmm8, xmm9, 221
vpshufd xmm6, xmm6, 0x93
vpshufd xmm7, xmm7, 0x93
mov al, 7
9:
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, 0x93
vpshufd xmm3, xmm3, 0x4E
vpshufd xmm2, xmm2, 0x39
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, 0x39
vpshufd xmm3, xmm3, 0x4E
vpshufd xmm2, xmm2, 0x93
dec al
jz 9f
vshufps xmm8, xmm4, xmm5, 214
vpshufd xmm9, xmm4, 0x0F
vpshufd xmm4, xmm8, 0x39
vshufps xmm8, xmm6, xmm7, 250
vpblendd xmm9, xmm9, xmm8, 0xAA
vpunpcklqdq xmm8, xmm7, xmm5
vpblendd xmm8, xmm8, xmm6, 0x88
vpshufd xmm8, xmm8, 0x78
vpunpckhdq xmm5, xmm5, xmm7
vpunpckldq xmm6, xmm6, xmm5
vpshufd xmm7, xmm6, 0x1E
vmovdqa xmm5, xmm9
vmovdqa xmm6, xmm8
jmp 9b
9:
vpxor xmm0, xmm0, xmm2
vpxor xmm1, xmm1, xmm3
vpxor xmm2, xmm2, [rdi]
vpxor xmm3, xmm3, [rdi+0x10]
vmovdqu xmmword ptr [r9], xmm0
vmovdqu xmmword ptr [r9+0x10], xmm1
vmovdqu xmmword ptr [r9+0x20], xmm2
vmovdqu xmmword ptr [r9+0x30], xmm3
ret
.p2align 6
blake3_xof_many_avx512:
_blake3_xof_many_avx512:
_CET_ENDBR
mov rax, qword ptr [rsp+0x08]
cmp rax, 0x01
jnbe 2f
vmovdqu xmm0, xmmword ptr [rdi]
vmovdqu xmm1, xmmword ptr [rdi+0x10]
movzx edx, dl
movzx r8d, r8b
shl r8, 0x20
or rdx, r8
vmovq xmm2, rdx
vmovq xmm3, rcx
vpunpcklqdq xmm3, xmm3, xmm2
vmovaps xmm2, xmmword ptr [rip+BLAKE3_IV]
vmovdqu xmm8, xmmword ptr [rsi]
vmovdqu xmm9, xmmword ptr [rsi+0x10]
vshufps xmm4, xmm8, xmm9, 0x88
vshufps xmm5, xmm8, xmm9, 0xDD
vmovdqu xmm8, xmmword ptr [rsi+0x20]
vmovdqu xmm9, xmmword ptr [rsi+0x30]
vshufps xmm6, xmm8, xmm9, 0x88
vshufps xmm7, xmm8, xmm9, 0xDD
vpshufd xmm6, xmm6, 0x93
vpshufd xmm7, xmm7, 0x93
mov cl, 0x07
3:
vpaddd xmm0, xmm0, xmm4
vpaddd xmm0, xmm0, xmm1
vpxord xmm3, xmm3, xmm0
vprord xmm3, xmm3, 0x10
vpaddd xmm2, xmm2, xmm3
vpxord xmm1, xmm1, xmm2
vprord xmm1, xmm1, 0x0C
vpaddd xmm0, xmm0, xmm5
vpaddd xmm0, xmm0, xmm1
vpxord xmm3, xmm3, xmm0
vprord xmm3, xmm3, 0x08
vpaddd xmm2, xmm2, xmm3
vpxord xmm1, xmm1, xmm2
vprord xmm1, xmm1, 0x07
vpshufd xmm0, xmm0, 0x93
vpshufd xmm3, xmm3, 0x4E
vpshufd xmm2, xmm2, 0x39
vpaddd xmm0, xmm0, xmm6
vpaddd xmm0, xmm0, xmm1
vpxord xmm3, xmm3, xmm0
vprord xmm3, xmm3, 0x10
vpaddd xmm2, xmm2, xmm3
vpxord xmm1, xmm1, xmm2
vprord xmm1, xmm1, 0x0C
vpaddd xmm0, xmm0, xmm7
vpaddd xmm0, xmm0, xmm1
vpxord xmm3, xmm3, xmm0
vprord xmm3, xmm3, 0x08
vpaddd xmm2, xmm2, xmm3
vpxord xmm1, xmm1, xmm2
vprord xmm1, xmm1, 0x07
vpshufd xmm0, xmm0, 0x39
vpshufd xmm3, xmm3, 0x4E
vpshufd xmm2, xmm2, 0x93
dec cl
jz 3f
vshufps xmm8, xmm4, xmm5, 0xD6
vpshufd xmm9, xmm4, 0x0F
vpshufd xmm4, xmm8, 0x39
vshufps xmm8, xmm6, xmm7, 0xFA
vpblendd xmm9, xmm9, xmm8, 0xAA
vpunpcklqdq xmm8, xmm7, xmm5
vpblendd xmm8, xmm8, xmm6, 0x88
vpshufd xmm8, xmm8, 0x78
vpunpckhdq xmm5, xmm5, xmm7
vpunpckldq xmm6, xmm6, xmm5
vpshufd xmm7, xmm6, 0x1E
vmovdqa xmm5, xmm9
vmovdqa xmm6, xmm8
jmp 3b
3:
vpxor xmm0, xmm0, xmm2
vpxor xmm1, xmm1, xmm3
vpxor xmm2, xmm2, xmmword ptr [rdi]
vpxor xmm3, xmm3, xmmword ptr [rdi+0x10]
vmovdqu xmmword ptr [r9], xmm0
vmovdqu xmmword ptr [r9+0x10], xmm1
vmovdqu xmmword ptr [r9+0x20], xmm2
vmovdqu xmmword ptr [r9+0x30], xmm3
vzeroupper
ret
2:
push rbp
mov rbp, rsp
sub rsp, 0x100
and rsp, 0xFFFFFFFFFFFFFFC0
vpbroadcastd zmm0, ecx
shr rcx, 0x20
vpbroadcastd zmm1, ecx
vpaddd zmm2, zmm0, zmmword ptr [rip+ADD0]
vpcmpud k1, zmm2, zmm0, 0x01
vpaddd zmm1 {k1}, zmm1, dword ptr [rip+ADD1] {1to16}
vmovdqa32 zmmword ptr [rsp], zmm2
vmovdqa32 zmmword ptr [rsp+0x40], zmm1
movzx edx, dl
movzx r8d, r8b
cmp rax, 0x08
jbe 2f
.p2align 5
3:
vpbroadcastd zmm0, dword ptr [rsi]
vpbroadcastd zmm1, dword ptr [rsi+0x04]
vpbroadcastd zmm2, dword ptr [rsi+0x08]
vpbroadcastd zmm3, dword ptr [rsi+0x0C]
vpbroadcastd zmm4, dword ptr [rsi+0x10]
vpbroadcastd zmm5, dword ptr [rsi+0x14]
vpbroadcastd zmm6, dword ptr [rsi+0x18]
vpbroadcastd zmm7, dword ptr [rsi+0x1C]
vpbroadcastd zmm8, dword ptr [rsi+0x20]
vpbroadcastd zmm9, dword ptr [rsi+0x24]
vpbroadcastd zmm10, dword ptr [rsi+0x28]
vpbroadcastd zmm11, dword ptr [rsi+0x2C]
vpbroadcastd zmm12, dword ptr [rsi+0x30]
vpbroadcastd zmm13, dword ptr [rsi+0x34]
vpbroadcastd zmm14, dword ptr [rsi+0x38]
vpbroadcastd zmm15, dword ptr [rsi+0x3C]
vpbroadcastd zmm16, dword ptr [rdi]
vpbroadcastd zmm17, dword ptr [rdi+0x04]
vpbroadcastd zmm18, dword ptr [rdi+0x08]
vpbroadcastd zmm19, dword ptr [rdi+0x0C]
vpbroadcastd zmm20, dword ptr [rdi+0x10]
vpbroadcastd zmm21, dword ptr [rdi+0x14]
vpbroadcastd zmm22, dword ptr [rdi+0x18]
vpbroadcastd zmm23, dword ptr [rdi+0x1C]
vpbroadcastd zmm24, dword ptr [rip+BLAKE3_IV_0]
vpbroadcastd zmm25, dword ptr [rip+BLAKE3_IV_1]
vpbroadcastd zmm26, dword ptr [rip+BLAKE3_IV_2]
vpbroadcastd zmm27, dword ptr [rip+BLAKE3_IV_3]
vmovdqa32 zmm28, zmmword ptr [rsp]
vmovdqa32 zmm29, zmmword ptr [rsp+0x40]
vpbroadcastd zmm30, edx
vpbroadcastd zmm31, r8d
mov cl, 0x07
4:
vpaddd zmm16, zmm16, zmm0
vpaddd zmm17, zmm17, zmm2
vpaddd zmm18, zmm18, zmm4
vpaddd zmm19, zmm19, zmm6
vmovdqa32 zmmword ptr [rsp+0x80], zmm0
vmovdqa32 zmmword ptr [rsp+0xC0], 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, 0x10
vprord zmm29, zmm29, 0x10
vprord zmm30, zmm30, 0x10
vprord zmm31, zmm31, 0x10
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, 0x0C
vprord zmm21, zmm21, 0x0C
vprord zmm22, zmm22, 0x0C
vprord zmm23, zmm23, 0x0C
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, 0x08
vmovdqa32 zmm4, zmm7
vprord zmm29, zmm29, 0x08
vprord zmm30, zmm30, 0x08
vprord zmm31, zmm31, 0x08
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, 0x07
vprord zmm21, zmm21, 0x07
vprord zmm22, zmm22, 0x07
vprord zmm23, zmm23, 0x07
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, 0x10
vprord zmm28, zmm28, 0x10
vprord zmm29, zmm29, 0x10
vprord zmm30, zmm30, 0x10
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, 0x0C
vprord zmm22, zmm22, 0x0C
vprord zmm23, zmm23, 0x0C
vprord zmm20, zmm20, 0x0C
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, 0x08
vmovdqa32 zmm11, zmm5
vprord zmm28, zmm28, 0x08
vprord zmm29, zmm29, 0x08
vprord zmm30, zmm30, 0x08
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+0x80]
vprord zmm21, zmm21, 0x07
vprord zmm22, zmm22, 0x07
vprord zmm23, zmm23, 0x07
vprord zmm20, zmm20, 0x07
vmovdqa32 zmm1, zmmword ptr [rsp+0xC0]
dec cl
jnz 4b
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 [rip+INDEX0]
vmovdqa32 zmm9, zmmword ptr [rip+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 [rdi]
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, 0x00
vextracti64x4 ymmword ptr [r9+0x20], zmm1, 0x00
vextracti64x4 ymmword ptr [r9+0x40], zmm2, 0x00
vextracti64x4 ymmword ptr [r9+0x60], zmm3, 0x00
vextracti64x4 ymmword ptr [r9+0x80], zmm4, 0x00
vextracti64x4 ymmword ptr [r9+0xA0], zmm5, 0x00
vextracti64x4 ymmword ptr [r9+0xC0], zmm6, 0x00
vextracti64x4 ymmword ptr [r9+0xE0], zmm7, 0x00
vextracti64x4 ymmword ptr [r9+0x100], zmm16, 0x00
vextracti64x4 ymmword ptr [r9+0x120], zmm24, 0x00
vextracti64x4 ymmword ptr [r9+0x140], zmm17, 0x00
vextracti64x4 ymmword ptr [r9+0x160], zmm25, 0x00
vextracti64x4 ymmword ptr [r9+0x180], zmm18, 0x00
vextracti64x4 ymmword ptr [r9+0x1A0], zmm26, 0x00
vextracti64x4 ymmword ptr [r9+0x1C0], zmm19, 0x00
vextracti64x4 ymmword ptr [r9+0x1E0], zmm27, 0x00
vextracti64x4 ymmword ptr [r9+0x200], zmm0, 0x01
vextracti64x4 ymmword ptr [r9+0x220], zmm1, 0x01
cmp rax, 0x0A
jb 9f
vextracti64x4 ymmword ptr [r9+0x240], zmm2, 0x01
vextracti64x4 ymmword ptr [r9+0x260], zmm3, 0x01
cmp rax, 0x0B
jb 9f
vextracti64x4 ymmword ptr [r9+0x280], zmm4, 0x01
vextracti64x4 ymmword ptr [r9+0x2A0], zmm5, 0x01
cmp rax, 0x0C
jb 9f
vextracti64x4 ymmword ptr [r9+0x2C0], zmm6, 0x01
vextracti64x4 ymmword ptr [r9+0x2E0], zmm7, 0x01
cmp rax, 0x0D
jb 9f
vextracti64x4 ymmword ptr [r9+0x300], zmm16, 0x01
vextracti64x4 ymmword ptr [r9+0x320], zmm24, 0x01
cmp rax, 0x0E
jb 9f
vextracti64x4 ymmword ptr [r9+0x340], zmm17, 0x01
vextracti64x4 ymmword ptr [r9+0x360], zmm25, 0x01
cmp rax, 0x0F
jb 9f
vextracti64x4 ymmword ptr [r9+0x380], zmm18, 0x01
vextracti64x4 ymmword ptr [r9+0x3A0], zmm26, 0x01
cmp rax, 0x10
jb 9f
vextracti64x4 ymmword ptr [r9+0x3C0], zmm19, 0x01
vextracti64x4 ymmword ptr [r9+0x3E0], zmm27, 0x01
vmovdqa32 zmm0, zmmword ptr [rsp]
vmovdqa32 zmm1, zmmword ptr [rsp+0x40]
vpaddd zmm2, zmm0, dword ptr [rip+ADD16] {1to16}
vpcmpud k1, zmm2, zmm0, 0x01
vpaddd zmm1 {k1}, zmm1, dword ptr [rip+ADD1] {1to16}
vmovdqa32 zmmword ptr [rsp], zmm2
vmovdqa32 zmmword ptr [rsp+0x40], zmm1
add r9, 0x400
sub rax, 0x10
cmp rax, 0x08
jnbe 3b
test al, al
jnz 2f
9:
vzeroupper
mov rsp, rbp
pop rbp
ret
2:
cmp al, 0x04
jbe 2f
vpbroadcastd ymm16, dword ptr [rsi]
vpbroadcastd ymm17, dword ptr [rsi+0x04]
vpbroadcastd ymm18, dword ptr [rsi+0x08]
vpbroadcastd ymm19, dword ptr [rsi+0x0C]
vpbroadcastd ymm20, dword ptr [rsi+0x10]
vpbroadcastd ymm21, dword ptr [rsi+0x14]
vpbroadcastd ymm22, dword ptr [rsi+0x18]
vpbroadcastd ymm23, dword ptr [rsi+0x1C]
vpbroadcastd ymm24, dword ptr [rsi+0x20]
vpbroadcastd ymm25, dword ptr [rsi+0x24]
vpbroadcastd ymm26, dword ptr [rsi+0x28]
vpbroadcastd ymm27, dword ptr [rsi+0x2C]
vpbroadcastd ymm28, dword ptr [rsi+0x30]
vpbroadcastd ymm29, dword ptr [rsi+0x34]
vpbroadcastd ymm30, dword ptr [rsi+0x38]
vpbroadcastd ymm31, dword ptr [rsi+0x3C]
vpbroadcastd ymm0, dword ptr [rdi]
vpbroadcastd ymm1, dword ptr [rdi+0x04]
vpbroadcastd ymm2, dword ptr [rdi+0x08]
vpbroadcastd ymm3, dword ptr [rdi+0x0C]
vpbroadcastd ymm4, dword ptr [rdi+0x10]
vpbroadcastd ymm5, dword ptr [rdi+0x14]
vpbroadcastd ymm6, dword ptr [rdi+0x18]
vpbroadcastd ymm7, dword ptr [rdi+0x1C]
vpbroadcastd ymm8, dword ptr [rip+BLAKE3_IV_0]
vpbroadcastd ymm9, dword ptr [rip+BLAKE3_IV_1]
vpbroadcastd ymm10, dword ptr [rip+BLAKE3_IV_2]
vpbroadcastd ymm11, dword ptr [rip+BLAKE3_IV_3]
vmovdqa ymm12, ymmword ptr [rsp]
vmovdqa ymm13, ymmword ptr [rsp+0x40]
vpbroadcastd ymm14, edx
vpbroadcastd ymm15, r8d
mov cl, 0x07
3:
vpaddd ymm0, ymm0, ymm16
vpaddd ymm1, ymm1, ymm18
vpaddd ymm2, ymm2, ymm20
vpaddd ymm3, ymm3, ymm22
vmovdqa32 ymmword ptr [rsp+0x80], ymm16
vmovdqa32 ymmword ptr [rsp+0xC0], 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, 0x10
vprord ymm13, ymm13, 0x10
vprord ymm14, ymm14, 0x10
vprord ymm15, ymm15, 0x10
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, 0x0C
vprord ymm5, ymm5, 0x0C
vprord ymm6, ymm6, 0x0C
vprord ymm7, ymm7, 0x0C
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, 0x08
vmovdqa32 ymm20, ymm23
vprord ymm13, ymm13, 0x08
vprord ymm14, ymm14, 0x08
vprord ymm15, ymm15, 0x08
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, 0x07
vprord ymm5, ymm5, 0x07
vprord ymm6, ymm6, 0x07
vprord ymm7, ymm7, 0x07
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, 0x10
vprord ymm12, ymm12, 0x10
vprord ymm13, ymm13, 0x10
vprord ymm14, ymm14, 0x10
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, 0x0C
vprord ymm6, ymm6, 0x0C
vprord ymm7, ymm7, 0x0C
vprord ymm4, ymm4, 0x0C
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, 0x08
vmovdqa32 ymm27, ymm21
vprord ymm12, ymm12, 0x08
vprord ymm13, ymm13, 0x08
vprord ymm14, ymm14, 0x08
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+0x80]
vprord ymm5, ymm5, 0x07
vprord ymm6, ymm6, 0x07
vprord ymm7, ymm7, 0x07
vprord ymm4, ymm4, 0x07
vmovdqa32 ymm17, ymmword ptr [rsp+0xC0]
dec cl
jnz 3b
vpxord ymm0, ymm0, ymm8
vpxord ymm8, ymm8, dword ptr [rdi] {1to8}
vpxord ymm1, ymm1, ymm9
vpxord ymm9, ymm9, dword ptr [rdi+0x04] {1to8}
vpxord ymm2, ymm2, ymm10
vpxord ymm10, ymm10, dword ptr [rdi+0x08] {1to8}
vpxord ymm3, ymm3, ymm11
vpxord ymm11, ymm11, dword ptr [rdi+0x0C] {1to8}
vpxord ymm4, ymm4, ymm12
vpxord ymm12, ymm12, dword ptr [rdi+0x10] {1to8}
vpxord ymm5, ymm5, ymm13
vpxord ymm13, ymm13, dword ptr [rdi+0x14] {1to8}
vpxord ymm6, ymm6, ymm14
vpxord ymm14, ymm14, dword ptr [rdi+0x18] {1to8}
vpxord ymm7, ymm7, ymm15
vpxord ymm15, ymm15, dword ptr [rdi+0x1C] {1to8}
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, 0x00
vshufi32x4 ymm17, ymm8, ymm12, 0x00
vshufi32x4 ymm18, ymm1, ymm5, 0x00
vshufi32x4 ymm19, ymm9, ymm13, 0x00
vshufi32x4 ymm20, ymm2, ymm6, 0x00
vshufi32x4 ymm21, ymm10, ymm14, 0x00
vshufi32x4 ymm22, ymm3, ymm7, 0x00
vshufi32x4 ymm23, ymm11, ymm15, 0x00
vshufi32x4 ymm24, ymm0, ymm4, 0x03
vshufi32x4 ymm25, ymm8, ymm12, 0x03
vshufi32x4 ymm26, ymm1, ymm5, 0x03
vshufi32x4 ymm27, ymm9, ymm13, 0x03
vshufi32x4 ymm28, ymm2, ymm6, 0x03
vshufi32x4 ymm29, ymm10, ymm14, 0x03
vshufi32x4 ymm30, ymm3, ymm7, 0x03
vshufi32x4 ymm31, ymm11, ymm15, 0x03
vmovdqu32 ymmword ptr [r9], ymm16
vmovdqu32 ymmword ptr [r9+0x20], ymm17
vmovdqu32 ymmword ptr [r9+0x40], ymm18
vmovdqu32 ymmword ptr [r9+0x60], ymm19
vmovdqu32 ymmword ptr [r9+0x80], ymm20
vmovdqu32 ymmword ptr [r9+0xA0], ymm21
vmovdqu32 ymmword ptr [r9+0xC0], ymm22
vmovdqu32 ymmword ptr [r9+0xE0], ymm23
vmovdqu32 ymmword ptr [r9+0x100], ymm24
vmovdqu32 ymmword ptr [r9+0x120], ymm25
cmp al, 0x06
jb 3f
vmovdqu32 ymmword ptr [r9+0x140], ymm26
vmovdqu32 ymmword ptr [r9+0x160], ymm27
cmp al, 0x07
jb 3f
vmovdqu32 ymmword ptr [r9+0x180], ymm28
vmovdqu32 ymmword ptr [r9+0x1A0], ymm29
cmp al, 0x08
jb 3f
vmovdqu32 ymmword ptr [r9+0x1C0], ymm30
vmovdqu32 ymmword ptr [r9+0x1E0], ymm31
3:
jmp 9b
2:
mov ecx, 0xAAAA
kmovw k1, ecx
mov ecx, 0x8888
kmovw k2, ecx
mov ecx, 0x55
kmovw k3, ecx
mov ecx, r8d
shl rcx, 0x20
or rcx, rdx
cmp al, 0x02
jbe 2f
vbroadcasti32x4 zmm0, xmmword ptr [rdi]
vbroadcasti32x4 zmm1, xmmword ptr [rdi+0x10]
vbroadcasti32x4 zmm2, xmmword ptr [rip+BLAKE3_IV]
vmovdqa32 xmm4, xmmword ptr [rsp]
vmovdqa32 xmm5, xmmword ptr [rsp+0x40]
vpbroadcastq zmm3, rcx
vpunpckldq xmm6, xmm4, xmm5
vpunpckhdq xmm5, xmm4, xmm5
vinserti64x4 zmm6, zmm6, ymm5, 0x01
vpermq zmm3 {k3}, zmm6, 0xDC
vbroadcasti32x4 zmm8, xmmword ptr [rsi]
vbroadcasti32x4 zmm9, xmmword ptr [rsi+0x10]
vshufps zmm4, zmm8, zmm9, 0x88
vshufps zmm5, zmm8, zmm9, 0xDD
vbroadcasti32x4 zmm8, xmmword ptr [rsi+0x20]
vbroadcasti32x4 zmm9, xmmword ptr [rsi+0x30]
vshufps zmm6, zmm8, zmm9, 0x88
vshufps zmm7, zmm8, zmm9, 0xDD
vpshufd zmm6, zmm6, 0x93
vpshufd zmm7, zmm7, 0x93
mov dl, 0x07
3:
vpaddd zmm0, zmm0, zmm4
vpaddd zmm0, zmm0, zmm1
vpxord zmm3, zmm3, zmm0
vprord zmm3, zmm3, 0x10
vpaddd zmm2, zmm2, zmm3
vpxord zmm1, zmm1, zmm2
vprord zmm1, zmm1, 0x0C
vpaddd zmm0, zmm0, zmm5
vpaddd zmm0, zmm0, zmm1
vpxord zmm3, zmm3, zmm0
vprord zmm3, zmm3, 0x08
vpaddd zmm2, zmm2, zmm3
vpxord zmm1, zmm1, zmm2
vprord zmm1, zmm1, 0x07
vpshufd zmm0, zmm0, 0x93
vpshufd zmm3, zmm3, 0x4E
vpshufd zmm2, zmm2, 0x39
vpaddd zmm0, zmm0, zmm6
vpaddd zmm0, zmm0, zmm1
vpxord zmm3, zmm3, zmm0
vprord zmm3, zmm3, 0x10
vpaddd zmm2, zmm2, zmm3
vpxord zmm1, zmm1, zmm2
vprord zmm1, zmm1, 0x0C
vpaddd zmm0, zmm0, zmm7
vpaddd zmm0, zmm0, zmm1
vpxord zmm3, zmm3, zmm0
vprord zmm3, zmm3, 0x08
vpaddd zmm2, zmm2, zmm3
vpxord zmm1, zmm1, zmm2
vprord zmm1, zmm1, 0x07
vpshufd zmm0, zmm0, 0x39
vpshufd zmm3, zmm3, 0x4E
vpshufd zmm2, zmm2, 0x93
dec dl
jz 3f
vshufps zmm8, zmm4, zmm5, 0xD6
vpshufd zmm9, zmm4, 0x0F
vpshufd zmm4, zmm8, 0x39
vshufps zmm8, zmm6, zmm7, 0xFA
vpblendmd zmm9 {k1}, zmm9, zmm8
vpunpcklqdq zmm8, zmm7, zmm5
vpblendmd zmm8 {k2}, zmm8, zmm6
vpshufd zmm8, zmm8, 0x78
vpunpckhdq zmm5, zmm5, zmm7
vpunpckldq zmm6, zmm6, zmm5
vpshufd zmm7, zmm6, 0x1E
vmovdqa32 zmm5, zmm9
vmovdqa32 zmm6, zmm8
jmp 3b
3:
vpxord zmm0, zmm0, zmm2
vpxord zmm1, zmm1, zmm3
vbroadcasti32x4 zmm4, xmmword ptr [rdi]
vbroadcasti32x4 zmm5, xmmword ptr [rdi+0x10]
vpxord zmm2, zmm2, zmm4
vpxord zmm3, zmm3, zmm5
vmovdqu xmmword ptr [r9], xmm0
vmovdqu xmmword ptr [r9+0x10], xmm1
vmovdqu xmmword ptr [r9+0x20], xmm2
vmovdqu xmmword ptr [r9+0x30], xmm3
vextracti128 xmmword ptr [r9+0x40], ymm0, 0x01
vextracti128 xmmword ptr [r9+0x50], ymm1, 0x01
vextracti128 xmmword ptr [r9+0x60], ymm2, 0x01
vextracti128 xmmword ptr [r9+0x70], ymm3, 0x01
vextracti32x4 xmmword ptr [r9+0x80], zmm0, 0x02
vextracti32x4 xmmword ptr [r9+0x90], zmm1, 0x02
vextracti32x4 xmmword ptr [r9+0xA0], zmm2, 0x02
vextracti32x4 xmmword ptr [r9+0xB0], zmm3, 0x02
cmp al, 0x04
jb 3f
vextracti32x4 xmmword ptr [r9+0xC0], zmm0, 0x03
vextracti32x4 xmmword ptr [r9+0xD0], zmm1, 0x03
vextracti32x4 xmmword ptr [r9+0xE0], zmm2, 0x03
vextracti32x4 xmmword ptr [r9+0xF0], zmm3, 0x03
3:
jmp 9b
2:
test al, al
jz 9b
vbroadcasti32x4 ymm0, xmmword ptr [rdi]
vbroadcasti32x4 ymm1, xmmword ptr [rdi+0x10]
vbroadcasti32x4 ymm2, xmmword ptr [rip+BLAKE3_IV]
vmovdqa xmm4, xmmword ptr [rsp]
vmovdqa xmm5, xmmword ptr [rsp+0x40]
vpbroadcastq ymm3, rcx
vpunpckldq xmm6, xmm4, xmm5
vpunpckhdq xmm5, xmm4, xmm5
vinserti128 ymm6, ymm6, xmm5, 0x01
vpermq ymm3 {k3}, ymm6, 0xDC
vbroadcasti32x4 ymm8, xmmword ptr [rsi]
vbroadcasti32x4 ymm9, xmmword ptr [rsi+0x10]
vshufps ymm4, ymm8, ymm9, 0x88
vshufps ymm5, ymm8, ymm9, 0xDD
vbroadcasti32x4 ymm8, xmmword ptr [rsi+0x20]
vbroadcasti32x4 ymm9, xmmword ptr [rsi+0x30]
vshufps ymm6, ymm8, ymm9, 0x88
vshufps ymm7, ymm8, ymm9, 0xDD
vpshufd ymm6, ymm6, 0x93
vpshufd ymm7, ymm7, 0x93
mov dl, 0x07
3:
vpaddd ymm0, ymm0, ymm4
vpaddd ymm0, ymm0, ymm1
vpxord ymm3, ymm3, ymm0
vprord ymm3, ymm3, 0x10
vpaddd ymm2, ymm2, ymm3
vpxord ymm1, ymm1, ymm2
vprord ymm1, ymm1, 0x0C
vpaddd ymm0, ymm0, ymm5
vpaddd ymm0, ymm0, ymm1
vpxord ymm3, ymm3, ymm0
vprord ymm3, ymm3, 0x08
vpaddd ymm2, ymm2, ymm3
vpxord ymm1, ymm1, ymm2
vprord ymm1, ymm1, 0x07
vpshufd ymm0, ymm0, 0x93
vpshufd ymm3, ymm3, 0x4E
vpshufd ymm2, ymm2, 0x39
vpaddd ymm0, ymm0, ymm6
vpaddd ymm0, ymm0, ymm1
vpxord ymm3, ymm3, ymm0
vprord ymm3, ymm3, 0x10
vpaddd ymm2, ymm2, ymm3
vpxord ymm1, ymm1, ymm2
vprord ymm1, ymm1, 0x0C
vpaddd ymm0, ymm0, ymm7
vpaddd ymm0, ymm0, ymm1
vpxord ymm3, ymm3, ymm0
vprord ymm3, ymm3, 0x08
vpaddd ymm2, ymm2, ymm3
vpxord ymm1, ymm1, ymm2
vprord ymm1, ymm1, 0x07
vpshufd ymm0, ymm0, 0x39
vpshufd ymm3, ymm3, 0x4E
vpshufd ymm2, ymm2, 0x93
dec dl
jz 3f
vshufps ymm8, ymm4, ymm5, 0xD6
vpshufd ymm9, ymm4, 0x0F
vpshufd ymm4, ymm8, 0x39
vshufps ymm8, ymm6, ymm7, 0xFA
vpblendd ymm9, ymm9, ymm8, 0xAA
vpunpcklqdq ymm8, ymm7, ymm5
vpblendd ymm8, ymm8, ymm6, 0x88
vpshufd ymm8, ymm8, 0x78
vpunpckhdq ymm5, ymm5, ymm7
vpunpckldq ymm6, ymm6, ymm5
vpshufd ymm7, ymm6, 0x1E
vmovdqa ymm5, ymm9
vmovdqa ymm6, ymm8
jmp 3b
3:
vpxord ymm0, ymm0, ymm2
vpxord ymm1, ymm1, ymm3
vbroadcasti128 ymm4, xmmword ptr [rdi]
vbroadcasti128 ymm5, xmmword ptr [rdi+0x10]
vpxord ymm2, ymm2, ymm4
vpxord ymm3, ymm3, ymm5
vmovdqu xmmword ptr [r9], xmm0
vmovdqu xmmword ptr [r9+0x10], xmm1
vmovdqu xmmword ptr [r9+0x20], xmm2
vmovdqu xmmword ptr [r9+0x30], xmm3
cmp al, 0x02
jb 3f
vextracti128 xmmword ptr [r9+0x40], ymm0, 0x01
vextracti128 xmmword ptr [r9+0x50], ymm1, 0x01
vextracti128 xmmword ptr [r9+0x60], ymm2, 0x01
vextracti128 xmmword ptr [r9+0x70], ymm3, 0x01
3:
jmp 9b
#ifdef __APPLE__
.static_data
#else
.section .rodata
#endif
.p2align 6
ADD0:
.long 0, 1, 2, 3, 4, 5, 6, 7
.long 8, 9, 10, 11, 12, 13, 14, 15
INDEX0:
.long 0, 1, 2, 3, 16, 17, 18, 19
.long 8, 9, 10, 11, 24, 25, 26, 27
INDEX1:
.long 4, 5, 6, 7, 20, 21, 22, 23
.long 12, 13, 14, 15, 28, 29, 30, 31
BLAKE3_IV:
BLAKE3_IV_0:
.long 0x6A09E667
BLAKE3_IV_1:
.long 0xBB67AE85
BLAKE3_IV_2:
.long 0x3C6EF372
BLAKE3_IV_3:
.long 0xA54FF53A
ADD1: .long 1
ADD16: .long 16
BLAKE3_BLOCK_LEN:
.long 64