/* chacha_asm * * Copyright (C) 2006-2022 wolfSSL Inc. * * This file is part of wolfSSL. * * wolfSSL is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * wolfSSL is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ #ifdef WOLFSSL_USER_SETTINGS #ifdef WOLFSSL_USER_SETTINGS_ASM /* * user_settings_asm.h is a file generated by the script user_settings_asm.sh. * The script takes in a user_settings.h and produces user_settings_asm.h, which * is a stripped down version of user_settings.h containing only preprocessor * directives. This makes the header safe to include in assembly (.S) files. */ #include "user_settings_asm.h" #else /* * Note: if user_settings.h contains any C code (e.g. a typedef or function * prototype), including it here in an assembly (.S) file will cause an * assembler failure. See user_settings_asm.h above. */ #include "user_settings.h" #endif /* WOLFSSL_USER_SETTINGS_ASM */ #endif /* WOLFSSL_USER_SETTINGS */ #ifndef HAVE_INTEL_AVX1 #define HAVE_INTEL_AVX1 #endif /* HAVE_INTEL_AVX1 */ #ifndef NO_AVX2_SUPPORT #define HAVE_INTEL_AVX2 #endif /* NO_AVX2_SUPPORT */ #ifdef WOLFSSL_X86_64_BUILD #ifndef __APPLE__ .text .globl chacha_encrypt_x64 .type chacha_encrypt_x64,@function .align 16 chacha_encrypt_x64: #else .section __TEXT,__text .globl _chacha_encrypt_x64 .p2align 4 _chacha_encrypt_x64: #endif /* __APPLE__ */ pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 subq $0x40, %rsp cmpl $0x40, %ecx jl L_chacha_x64_small L_chacha_x64_start: subq $48, %rsp movq %rdx, 24(%rsp) movq %rsi, 32(%rsp) movq %rcx, 40(%rsp) movq 32(%rdi), %rax movq 40(%rdi), %rbx movq %rax, 8(%rsp) movq %rbx, 16(%rsp) movl (%rdi), %eax movl 4(%rdi), %ebx movl 8(%rdi), %ecx movl 12(%rdi), %edx movl 16(%rdi), %r8d movl 20(%rdi), %r9d movl 24(%rdi), %r10d movl 28(%rdi), %r11d movl 48(%rdi), %r12d movl 52(%rdi), %r13d movl 56(%rdi), %r14d movl 60(%rdi), %r15d movb $10, (%rsp) movl 8(%rsp), %esi movl 12(%rsp), %ebp L_chacha_x64_block_crypt_start: addl %r8d, %eax addl %r9d, %ebx xorl %eax, %r12d xorl %ebx, %r13d roll $16, %r12d roll $16, %r13d addl %r12d, %esi addl %r13d, %ebp xorl %esi, %r8d xorl %ebp, %r9d roll $12, %r8d roll $12, %r9d addl %r8d, %eax addl %r9d, %ebx xorl %eax, %r12d xorl %ebx, %r13d roll $8, %r12d roll $8, %r13d addl %r12d, %esi addl %r13d, %ebp xorl %esi, %r8d xorl %ebp, %r9d roll $7, %r8d roll $7, %r9d movl %esi, 8(%rsp) movl %ebp, 12(%rsp) movl 16(%rsp), %esi movl 20(%rsp), %ebp addl %r10d, %ecx addl %r11d, %edx xorl %ecx, %r14d xorl %edx, %r15d roll $16, %r14d roll $16, %r15d addl %r14d, %esi addl %r15d, %ebp xorl %esi, %r10d xorl %ebp, %r11d roll $12, %r10d roll $12, %r11d addl %r10d, %ecx addl %r11d, %edx xorl %ecx, %r14d xorl %edx, %r15d roll $8, %r14d roll $8, %r15d addl %r14d, %esi addl %r15d, %ebp xorl %esi, %r10d xorl %ebp, %r11d roll $7, %r10d roll $7, %r11d addl %r9d, %eax addl %r10d, %ebx xorl %eax, %r15d xorl %ebx, %r12d roll $16, %r15d roll $16, %r12d addl %r15d, %esi addl %r12d, %ebp xorl %esi, %r9d xorl %ebp, %r10d roll $12, %r9d roll $12, %r10d addl %r9d, %eax addl %r10d, %ebx xorl %eax, %r15d xorl %ebx, %r12d roll $8, %r15d roll $8, %r12d addl %r15d, %esi addl %r12d, %ebp xorl %esi, %r9d xorl %ebp, %r10d roll $7, %r9d roll $7, %r10d movl %esi, 16(%rsp) movl %ebp, 20(%rsp) movl 8(%rsp), %esi movl 12(%rsp), %ebp addl %r11d, %ecx addl %r8d, %edx xorl %ecx, %r13d xorl %edx, %r14d roll $16, %r13d roll $16, %r14d addl %r13d, %esi addl %r14d, %ebp xorl %esi, %r11d xorl %ebp, %r8d roll $12, %r11d roll $12, %r8d addl %r11d, %ecx addl %r8d, %edx xorl %ecx, %r13d xorl %edx, %r14d roll $8, %r13d roll $8, %r14d addl %r13d, %esi addl %r14d, %ebp xorl %esi, %r11d xorl %ebp, %r8d roll $7, %r11d roll $7, %r8d decb (%rsp) jnz L_chacha_x64_block_crypt_start movl %esi, 8(%rsp) movl %ebp, 12(%rsp) movq 32(%rsp), %rsi movq 24(%rsp), %rbp addl (%rdi), %eax addl 4(%rdi), %ebx addl 8(%rdi), %ecx addl 12(%rdi), %edx addl 16(%rdi), %r8d addl 20(%rdi), %r9d addl 24(%rdi), %r10d addl 28(%rdi), %r11d addl 48(%rdi), %r12d addl 52(%rdi), %r13d addl 56(%rdi), %r14d addl 60(%rdi), %r15d xorl (%rsi), %eax xorl 4(%rsi), %ebx xorl 8(%rsi), %ecx xorl 12(%rsi), %edx xorl 16(%rsi), %r8d xorl 20(%rsi), %r9d xorl 24(%rsi), %r10d xorl 28(%rsi), %r11d xorl 48(%rsi), %r12d xorl 52(%rsi), %r13d xorl 56(%rsi), %r14d xorl 60(%rsi), %r15d movl %eax, (%rbp) movl %ebx, 4(%rbp) movl %ecx, 8(%rbp) movl %edx, 12(%rbp) movl %r8d, 16(%rbp) movl %r9d, 20(%rbp) movl %r10d, 24(%rbp) movl %r11d, 28(%rbp) movl %r12d, 48(%rbp) movl %r13d, 52(%rbp) movl %r14d, 56(%rbp) movl %r15d, 60(%rbp) movl 8(%rsp), %eax movl 12(%rsp), %ebx movl 16(%rsp), %ecx movl 20(%rsp), %edx addl 32(%rdi), %eax addl 36(%rdi), %ebx addl 40(%rdi), %ecx addl 44(%rdi), %edx xorl 32(%rsi), %eax xorl 36(%rsi), %ebx xorl 40(%rsi), %ecx xorl 44(%rsi), %edx movl %eax, 32(%rbp) movl %ebx, 36(%rbp) movl %ecx, 40(%rbp) movl %edx, 44(%rbp) movq 24(%rsp), %rdx movq 40(%rsp), %rcx addl $0x01, 48(%rdi) addq $48, %rsp subl $0x40, %ecx addq $0x40, %rsi addq $0x40, %rdx cmpl $0x40, %ecx jge L_chacha_x64_start L_chacha_x64_small: cmpl $0x00, %ecx je L_chacha_x64_done subq $48, %rsp movq %rdx, 24(%rsp) movq %rsi, 32(%rsp) movq %rcx, 40(%rsp) movq 32(%rdi), %rax movq 40(%rdi), %rbx movq %rax, 8(%rsp) movq %rbx, 16(%rsp) movl (%rdi), %eax movl 4(%rdi), %ebx movl 8(%rdi), %ecx movl 12(%rdi), %edx movl 16(%rdi), %r8d movl 20(%rdi), %r9d movl 24(%rdi), %r10d movl 28(%rdi), %r11d movl 48(%rdi), %r12d movl 52(%rdi), %r13d movl 56(%rdi), %r14d movl 60(%rdi), %r15d movb $10, (%rsp) movl 8(%rsp), %esi movl 12(%rsp), %ebp L_chacha_x64_partial_crypt_start: addl %r8d, %eax addl %r9d, %ebx xorl %eax, %r12d xorl %ebx, %r13d roll $16, %r12d roll $16, %r13d addl %r12d, %esi addl %r13d, %ebp xorl %esi, %r8d xorl %ebp, %r9d roll $12, %r8d roll $12, %r9d addl %r8d, %eax addl %r9d, %ebx xorl %eax, %r12d xorl %ebx, %r13d roll $8, %r12d roll $8, %r13d addl %r12d, %esi addl %r13d, %ebp xorl %esi, %r8d xorl %ebp, %r9d roll $7, %r8d roll $7, %r9d movl %esi, 8(%rsp) movl %ebp, 12(%rsp) movl 16(%rsp), %esi movl 20(%rsp), %ebp addl %r10d, %ecx addl %r11d, %edx xorl %ecx, %r14d xorl %edx, %r15d roll $16, %r14d roll $16, %r15d addl %r14d, %esi addl %r15d, %ebp xorl %esi, %r10d xorl %ebp, %r11d roll $12, %r10d roll $12, %r11d addl %r10d, %ecx addl %r11d, %edx xorl %ecx, %r14d xorl %edx, %r15d roll $8, %r14d roll $8, %r15d addl %r14d, %esi addl %r15d, %ebp xorl %esi, %r10d xorl %ebp, %r11d roll $7, %r10d roll $7, %r11d addl %r9d, %eax addl %r10d, %ebx xorl %eax, %r15d xorl %ebx, %r12d roll $16, %r15d roll $16, %r12d addl %r15d, %esi addl %r12d, %ebp xorl %esi, %r9d xorl %ebp, %r10d roll $12, %r9d roll $12, %r10d addl %r9d, %eax addl %r10d, %ebx xorl %eax, %r15d xorl %ebx, %r12d roll $8, %r15d roll $8, %r12d addl %r15d, %esi addl %r12d, %ebp xorl %esi, %r9d xorl %ebp, %r10d roll $7, %r9d roll $7, %r10d movl %esi, 16(%rsp) movl %ebp, 20(%rsp) movl 8(%rsp), %esi movl 12(%rsp), %ebp addl %r11d, %ecx addl %r8d, %edx xorl %ecx, %r13d xorl %edx, %r14d roll $16, %r13d roll $16, %r14d addl %r13d, %esi addl %r14d, %ebp xorl %esi, %r11d xorl %ebp, %r8d roll $12, %r11d roll $12, %r8d addl %r11d, %ecx addl %r8d, %edx xorl %ecx, %r13d xorl %edx, %r14d roll $8, %r13d roll $8, %r14d addl %r13d, %esi addl %r14d, %ebp xorl %esi, %r11d xorl %ebp, %r8d roll $7, %r11d roll $7, %r8d decb (%rsp) jnz L_chacha_x64_partial_crypt_start movl %esi, 8(%rsp) movl %ebp, 12(%rsp) movq 32(%rsp), %rsi addl (%rdi), %eax addl 4(%rdi), %ebx addl 8(%rdi), %ecx addl 12(%rdi), %edx addl 16(%rdi), %r8d addl 20(%rdi), %r9d addl 24(%rdi), %r10d addl 28(%rdi), %r11d addl 48(%rdi), %r12d addl 52(%rdi), %r13d addl 56(%rdi), %r14d addl 60(%rdi), %r15d leaq 80(%rdi), %rbp movl %eax, (%rbp) movl %ebx, 4(%rbp) movl %ecx, 8(%rbp) movl %edx, 12(%rbp) movl %r8d, 16(%rbp) movl %r9d, 20(%rbp) movl %r10d, 24(%rbp) movl %r11d, 28(%rbp) movl %r12d, 48(%rbp) movl %r13d, 52(%rbp) movl %r14d, 56(%rbp) movl %r15d, 60(%rbp) movl 8(%rsp), %eax movl 12(%rsp), %ebx movl 16(%rsp), %ecx movl 20(%rsp), %edx addl 32(%rdi), %eax addl 36(%rdi), %ebx addl 40(%rdi), %ecx addl 44(%rdi), %edx movl %eax, 32(%rbp) movl %ebx, 36(%rbp) movl %ecx, 40(%rbp) movl %edx, 44(%rbp) movq 24(%rsp), %rdx movq 40(%rsp), %rcx addl $0x01, 48(%rdi) addq $48, %rsp movl %ecx, %r8d xorq %rbx, %rbx andl $7, %r8d jz L_chacha_x64_partial_start64 L_chacha_x64_partial_start8: movzbl (%rbp,%rbx,1), %eax xorb (%rsi,%rbx,1), %al movb %al, (%rdx,%rbx,1) incl %ebx cmpl %r8d, %ebx jne L_chacha_x64_partial_start8 je L_chacha_x64_partial_end64 L_chacha_x64_partial_start64: movq (%rbp,%rbx,1), %rax xorq (%rsi,%rbx,1), %rax movq %rax, (%rdx,%rbx,1) addl $8, %ebx L_chacha_x64_partial_end64: cmpl %ecx, %ebx jne L_chacha_x64_partial_start64 movl $0x40, %ecx subl %ebx, %ecx movl %ecx, 76(%rdi) L_chacha_x64_done: addq $0x40, %rsp popq %r15 popq %r14 popq %r13 popq %r12 popq %rbp popq %rbx repz retq #ifndef __APPLE__ .size chacha_encrypt_x64,.-chacha_encrypt_x64 #endif /* __APPLE__ */ #ifdef HAVE_INTEL_AVX1 #ifndef __APPLE__ .data #else .section __DATA,__data #endif /* __APPLE__ */ #ifndef __APPLE__ .align 16 #else .p2align 4 #endif /* __APPLE__ */ L_chacha20_avx1_rotl8: .quad 0x605040702010003, 0xe0d0c0f0a09080b #ifndef __APPLE__ .data #else .section __DATA,__data #endif /* __APPLE__ */ #ifndef __APPLE__ .align 16 #else .p2align 4 #endif /* __APPLE__ */ L_chacha20_avx1_rotl16: .quad 0x504070601000302, 0xd0c0f0e09080b0a #ifndef __APPLE__ .data #else .section __DATA,__data #endif /* __APPLE__ */ #ifndef __APPLE__ .align 16 #else .p2align 4 #endif /* __APPLE__ */ L_chacha20_avx1_add: .quad 0x100000000, 0x300000002 #ifndef __APPLE__ .data #else .section __DATA,__data #endif /* __APPLE__ */ #ifndef __APPLE__ .align 16 #else .p2align 4 #endif /* __APPLE__ */ L_chacha20_avx1_four: .quad 0x400000004, 0x400000004 #ifndef __APPLE__ .text .globl chacha_encrypt_avx1 .type chacha_encrypt_avx1,@function .align 16 chacha_encrypt_avx1: #else .section __TEXT,__text .globl _chacha_encrypt_avx1 .p2align 4 _chacha_encrypt_avx1: #endif /* __APPLE__ */ subq $0x190, %rsp movq %rsp, %r9 leaq 256(%rsp), %r10 andq $-16, %r9 andq $-16, %r10 movl %ecx, %eax shrl $8, %eax jz L_chacha20_avx1_end128 vpshufd $0x00, (%rdi), %xmm0 vpshufd $0x00, 4(%rdi), %xmm1 vpshufd $0x00, 8(%rdi), %xmm2 vpshufd $0x00, 12(%rdi), %xmm3 vpshufd $0x00, 16(%rdi), %xmm4 vpshufd $0x00, 20(%rdi), %xmm5 vpshufd $0x00, 24(%rdi), %xmm6 vpshufd $0x00, 28(%rdi), %xmm7 vpshufd $0x00, 32(%rdi), %xmm8 vpshufd $0x00, 36(%rdi), %xmm9 vpshufd $0x00, 40(%rdi), %xmm10 vpshufd $0x00, 44(%rdi), %xmm11 vpshufd $0x00, 48(%rdi), %xmm12 vpshufd $0x00, 52(%rdi), %xmm13 vpshufd $0x00, 56(%rdi), %xmm14 vpshufd $0x00, 60(%rdi), %xmm15 vpaddd L_chacha20_avx1_add(%rip), %xmm12, %xmm12 vmovdqa %xmm0, (%r9) vmovdqa %xmm1, 16(%r9) vmovdqa %xmm2, 32(%r9) vmovdqa %xmm3, 48(%r9) vmovdqa %xmm4, 64(%r9) vmovdqa %xmm5, 80(%r9) vmovdqa %xmm6, 96(%r9) vmovdqa %xmm7, 112(%r9) vmovdqa %xmm8, 128(%r9) vmovdqa %xmm9, 144(%r9) vmovdqa %xmm10, 160(%r9) vmovdqa %xmm11, 176(%r9) vmovdqa %xmm12, 192(%r9) vmovdqa %xmm13, 208(%r9) vmovdqa %xmm14, 224(%r9) vmovdqa %xmm15, 240(%r9) L_chacha20_avx1_start128: vmovdqa %xmm11, 48(%r10) movb $10, %r8b L_chacha20_avx1_loop128: vpaddd %xmm4, %xmm0, %xmm0 vpxor %xmm0, %xmm12, %xmm12 vmovdqa 48(%r10), %xmm11 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm12, %xmm12 vpaddd %xmm12, %xmm8, %xmm8 vpxor %xmm8, %xmm4, %xmm4 vpaddd %xmm5, %xmm1, %xmm1 vpxor %xmm1, %xmm13, %xmm13 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm13, %xmm13 vpaddd %xmm13, %xmm9, %xmm9 vpxor %xmm9, %xmm5, %xmm5 vpaddd %xmm6, %xmm2, %xmm2 vpxor %xmm2, %xmm14, %xmm14 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm14, %xmm14 vpaddd %xmm14, %xmm10, %xmm10 vpxor %xmm10, %xmm6, %xmm6 vpaddd %xmm7, %xmm3, %xmm3 vpxor %xmm3, %xmm15, %xmm15 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm15, %xmm15 vpaddd %xmm15, %xmm11, %xmm11 vpxor %xmm11, %xmm7, %xmm7 vmovdqa %xmm11, 48(%r10) vpsrld $20, %xmm4, %xmm11 vpslld $12, %xmm4, %xmm4 vpxor %xmm11, %xmm4, %xmm4 vpsrld $20, %xmm5, %xmm11 vpslld $12, %xmm5, %xmm5 vpxor %xmm11, %xmm5, %xmm5 vpsrld $20, %xmm6, %xmm11 vpslld $12, %xmm6, %xmm6 vpxor %xmm11, %xmm6, %xmm6 vpsrld $20, %xmm7, %xmm11 vpslld $12, %xmm7, %xmm7 vpxor %xmm11, %xmm7, %xmm7 vpaddd %xmm4, %xmm0, %xmm0 vpxor %xmm0, %xmm12, %xmm12 vmovdqa 48(%r10), %xmm11 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm12, %xmm12 vpaddd %xmm12, %xmm8, %xmm8 vpxor %xmm8, %xmm4, %xmm4 vpaddd %xmm5, %xmm1, %xmm1 vpxor %xmm1, %xmm13, %xmm13 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm13, %xmm13 vpaddd %xmm13, %xmm9, %xmm9 vpxor %xmm9, %xmm5, %xmm5 vpaddd %xmm6, %xmm2, %xmm2 vpxor %xmm2, %xmm14, %xmm14 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm14, %xmm14 vpaddd %xmm14, %xmm10, %xmm10 vpxor %xmm10, %xmm6, %xmm6 vpaddd %xmm7, %xmm3, %xmm3 vpxor %xmm3, %xmm15, %xmm15 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm15, %xmm15 vpaddd %xmm15, %xmm11, %xmm11 vpxor %xmm11, %xmm7, %xmm7 vmovdqa %xmm11, 48(%r10) vpsrld $25, %xmm4, %xmm11 vpslld $7, %xmm4, %xmm4 vpxor %xmm11, %xmm4, %xmm4 vpsrld $25, %xmm5, %xmm11 vpslld $7, %xmm5, %xmm5 vpxor %xmm11, %xmm5, %xmm5 vpsrld $25, %xmm6, %xmm11 vpslld $7, %xmm6, %xmm6 vpxor %xmm11, %xmm6, %xmm6 vpsrld $25, %xmm7, %xmm11 vpslld $7, %xmm7, %xmm7 vpxor %xmm11, %xmm7, %xmm7 vpaddd %xmm5, %xmm0, %xmm0 vpxor %xmm0, %xmm15, %xmm15 vmovdqa 48(%r10), %xmm11 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm15, %xmm15 vpaddd %xmm15, %xmm10, %xmm10 vpxor %xmm10, %xmm5, %xmm5 vpaddd %xmm6, %xmm1, %xmm1 vpxor %xmm1, %xmm12, %xmm12 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm12, %xmm12 vpaddd %xmm12, %xmm11, %xmm11 vpxor %xmm11, %xmm6, %xmm6 vpaddd %xmm7, %xmm2, %xmm2 vpxor %xmm2, %xmm13, %xmm13 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm13, %xmm13 vpaddd %xmm13, %xmm8, %xmm8 vpxor %xmm8, %xmm7, %xmm7 vpaddd %xmm4, %xmm3, %xmm3 vpxor %xmm3, %xmm14, %xmm14 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm14, %xmm14 vpaddd %xmm14, %xmm9, %xmm9 vpxor %xmm9, %xmm4, %xmm4 vmovdqa %xmm11, 48(%r10) vpsrld $20, %xmm5, %xmm11 vpslld $12, %xmm5, %xmm5 vpxor %xmm11, %xmm5, %xmm5 vpsrld $20, %xmm6, %xmm11 vpslld $12, %xmm6, %xmm6 vpxor %xmm11, %xmm6, %xmm6 vpsrld $20, %xmm7, %xmm11 vpslld $12, %xmm7, %xmm7 vpxor %xmm11, %xmm7, %xmm7 vpsrld $20, %xmm4, %xmm11 vpslld $12, %xmm4, %xmm4 vpxor %xmm11, %xmm4, %xmm4 vpaddd %xmm5, %xmm0, %xmm0 vpxor %xmm0, %xmm15, %xmm15 vmovdqa 48(%r10), %xmm11 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm15, %xmm15 vpaddd %xmm15, %xmm10, %xmm10 vpxor %xmm10, %xmm5, %xmm5 vpaddd %xmm6, %xmm1, %xmm1 vpxor %xmm1, %xmm12, %xmm12 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm12, %xmm12 vpaddd %xmm12, %xmm11, %xmm11 vpxor %xmm11, %xmm6, %xmm6 vpaddd %xmm7, %xmm2, %xmm2 vpxor %xmm2, %xmm13, %xmm13 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm13, %xmm13 vpaddd %xmm13, %xmm8, %xmm8 vpxor %xmm8, %xmm7, %xmm7 vpaddd %xmm4, %xmm3, %xmm3 vpxor %xmm3, %xmm14, %xmm14 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm14, %xmm14 vpaddd %xmm14, %xmm9, %xmm9 vpxor %xmm9, %xmm4, %xmm4 vmovdqa %xmm11, 48(%r10) vpsrld $25, %xmm5, %xmm11 vpslld $7, %xmm5, %xmm5 vpxor %xmm11, %xmm5, %xmm5 vpsrld $25, %xmm6, %xmm11 vpslld $7, %xmm6, %xmm6 vpxor %xmm11, %xmm6, %xmm6 vpsrld $25, %xmm7, %xmm11 vpslld $7, %xmm7, %xmm7 vpxor %xmm11, %xmm7, %xmm7 vpsrld $25, %xmm4, %xmm11 vpslld $7, %xmm4, %xmm4 vpxor %xmm11, %xmm4, %xmm4 decb %r8b jnz L_chacha20_avx1_loop128 vmovdqa 48(%r10), %xmm11 vpaddd (%r9), %xmm0, %xmm0 vpaddd 16(%r9), %xmm1, %xmm1 vpaddd 32(%r9), %xmm2, %xmm2 vpaddd 48(%r9), %xmm3, %xmm3 vpaddd 64(%r9), %xmm4, %xmm4 vpaddd 80(%r9), %xmm5, %xmm5 vpaddd 96(%r9), %xmm6, %xmm6 vpaddd 112(%r9), %xmm7, %xmm7 vpaddd 128(%r9), %xmm8, %xmm8 vpaddd 144(%r9), %xmm9, %xmm9 vpaddd 160(%r9), %xmm10, %xmm10 vpaddd 176(%r9), %xmm11, %xmm11 vpaddd 192(%r9), %xmm12, %xmm12 vpaddd 208(%r9), %xmm13, %xmm13 vpaddd 224(%r9), %xmm14, %xmm14 vpaddd 240(%r9), %xmm15, %xmm15 vmovdqa %xmm8, (%r10) vmovdqa %xmm9, 16(%r10) vmovdqa %xmm10, 32(%r10) vmovdqa %xmm11, 48(%r10) vmovdqa %xmm12, 64(%r10) vmovdqa %xmm13, 80(%r10) vmovdqa %xmm14, 96(%r10) vmovdqa %xmm15, 112(%r10) vpunpckldq %xmm1, %xmm0, %xmm8 vpunpckldq %xmm3, %xmm2, %xmm9 vpunpckhdq %xmm1, %xmm0, %xmm12 vpunpckhdq %xmm3, %xmm2, %xmm13 vpunpckldq %xmm5, %xmm4, %xmm10 vpunpckldq %xmm7, %xmm6, %xmm11 vpunpckhdq %xmm5, %xmm4, %xmm14 vpunpckhdq %xmm7, %xmm6, %xmm15 vpunpcklqdq %xmm9, %xmm8, %xmm0 vpunpcklqdq %xmm11, %xmm10, %xmm1 vpunpckhqdq %xmm9, %xmm8, %xmm2 vpunpckhqdq %xmm11, %xmm10, %xmm3 vpunpcklqdq %xmm13, %xmm12, %xmm4 vpunpcklqdq %xmm15, %xmm14, %xmm5 vpunpckhqdq %xmm13, %xmm12, %xmm6 vpunpckhqdq %xmm15, %xmm14, %xmm7 vmovdqu (%rsi), %xmm8 vmovdqu 16(%rsi), %xmm9 vmovdqu 64(%rsi), %xmm10 vmovdqu 80(%rsi), %xmm11 vmovdqu 128(%rsi), %xmm12 vmovdqu 144(%rsi), %xmm13 vmovdqu 192(%rsi), %xmm14 vmovdqu 208(%rsi), %xmm15 vpxor %xmm8, %xmm0, %xmm0 vpxor %xmm9, %xmm1, %xmm1 vpxor %xmm10, %xmm2, %xmm2 vpxor %xmm11, %xmm3, %xmm3 vpxor %xmm12, %xmm4, %xmm4 vpxor %xmm13, %xmm5, %xmm5 vpxor %xmm14, %xmm6, %xmm6 vpxor %xmm15, %xmm7, %xmm7 vmovdqu %xmm0, (%rdx) vmovdqu %xmm1, 16(%rdx) vmovdqu %xmm2, 64(%rdx) vmovdqu %xmm3, 80(%rdx) vmovdqu %xmm4, 128(%rdx) vmovdqu %xmm5, 144(%rdx) vmovdqu %xmm6, 192(%rdx) vmovdqu %xmm7, 208(%rdx) vmovdqa (%r10), %xmm0 vmovdqa 16(%r10), %xmm1 vmovdqa 32(%r10), %xmm2 vmovdqa 48(%r10), %xmm3 vmovdqa 64(%r10), %xmm4 vmovdqa 80(%r10), %xmm5 vmovdqa 96(%r10), %xmm6 vmovdqa 112(%r10), %xmm7 vpunpckldq %xmm1, %xmm0, %xmm8 vpunpckldq %xmm3, %xmm2, %xmm9 vpunpckhdq %xmm1, %xmm0, %xmm12 vpunpckhdq %xmm3, %xmm2, %xmm13 vpunpckldq %xmm5, %xmm4, %xmm10 vpunpckldq %xmm7, %xmm6, %xmm11 vpunpckhdq %xmm5, %xmm4, %xmm14 vpunpckhdq %xmm7, %xmm6, %xmm15 vpunpcklqdq %xmm9, %xmm8, %xmm0 vpunpcklqdq %xmm11, %xmm10, %xmm1 vpunpckhqdq %xmm9, %xmm8, %xmm2 vpunpckhqdq %xmm11, %xmm10, %xmm3 vpunpcklqdq %xmm13, %xmm12, %xmm4 vpunpcklqdq %xmm15, %xmm14, %xmm5 vpunpckhqdq %xmm13, %xmm12, %xmm6 vpunpckhqdq %xmm15, %xmm14, %xmm7 vmovdqu 32(%rsi), %xmm8 vmovdqu 48(%rsi), %xmm9 vmovdqu 96(%rsi), %xmm10 vmovdqu 112(%rsi), %xmm11 vmovdqu 160(%rsi), %xmm12 vmovdqu 176(%rsi), %xmm13 vmovdqu 224(%rsi), %xmm14 vmovdqu 240(%rsi), %xmm15 vpxor %xmm8, %xmm0, %xmm0 vpxor %xmm9, %xmm1, %xmm1 vpxor %xmm10, %xmm2, %xmm2 vpxor %xmm11, %xmm3, %xmm3 vpxor %xmm12, %xmm4, %xmm4 vpxor %xmm13, %xmm5, %xmm5 vpxor %xmm14, %xmm6, %xmm6 vpxor %xmm15, %xmm7, %xmm7 vmovdqu %xmm0, 32(%rdx) vmovdqu %xmm1, 48(%rdx) vmovdqu %xmm2, 96(%rdx) vmovdqu %xmm3, 112(%rdx) vmovdqu %xmm4, 160(%rdx) vmovdqu %xmm5, 176(%rdx) vmovdqu %xmm6, 224(%rdx) vmovdqu %xmm7, 240(%rdx) vmovdqa 192(%r9), %xmm12 addq $0x100, %rsi addq $0x100, %rdx vpaddd L_chacha20_avx1_four(%rip), %xmm12, %xmm12 subl $0x100, %ecx vmovdqa %xmm12, 192(%r9) cmpl $0x100, %ecx jl L_chacha20_avx1_done128 vmovdqa (%r9), %xmm0 vmovdqa 16(%r9), %xmm1 vmovdqa 32(%r9), %xmm2 vmovdqa 48(%r9), %xmm3 vmovdqa 64(%r9), %xmm4 vmovdqa 80(%r9), %xmm5 vmovdqa 96(%r9), %xmm6 vmovdqa 112(%r9), %xmm7 vmovdqa 128(%r9), %xmm8 vmovdqa 144(%r9), %xmm9 vmovdqa 160(%r9), %xmm10 vmovdqa 176(%r9), %xmm11 vmovdqa 192(%r9), %xmm12 vmovdqa 208(%r9), %xmm13 vmovdqa 224(%r9), %xmm14 vmovdqa 240(%r9), %xmm15 jmp L_chacha20_avx1_start128 L_chacha20_avx1_done128: shl $2, %eax addl %eax, 48(%rdi) L_chacha20_avx1_end128: cmpl $0x40, %ecx jl L_chacha20_avx1_block_done L_chacha20_avx1_block_start: vmovdqu (%rdi), %xmm0 vmovdqu 16(%rdi), %xmm1 vmovdqu 32(%rdi), %xmm2 vmovdqu 48(%rdi), %xmm3 vmovdqa %xmm0, %xmm5 vmovdqa %xmm1, %xmm6 vmovdqa %xmm2, %xmm7 vmovdqa %xmm3, %xmm8 movb $10, %al L_chacha20_avx1_block_crypt_start: vpaddd %xmm1, %xmm0, %xmm0 vpxor %xmm0, %xmm3, %xmm3 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm3, %xmm3 vpaddd %xmm3, %xmm2, %xmm2 vpxor %xmm2, %xmm1, %xmm1 vpsrld $20, %xmm1, %xmm4 vpslld $12, %xmm1, %xmm1 vpxor %xmm4, %xmm1, %xmm1 vpaddd %xmm1, %xmm0, %xmm0 vpxor %xmm0, %xmm3, %xmm3 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm3, %xmm3 vpaddd %xmm3, %xmm2, %xmm2 vpxor %xmm2, %xmm1, %xmm1 vpsrld $25, %xmm1, %xmm4 vpslld $7, %xmm1, %xmm1 vpxor %xmm4, %xmm1, %xmm1 vpshufd $57, %xmm1, %xmm1 vpshufd $0x4e, %xmm2, %xmm2 vpshufd $0x93, %xmm3, %xmm3 vpaddd %xmm1, %xmm0, %xmm0 vpxor %xmm0, %xmm3, %xmm3 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm3, %xmm3 vpaddd %xmm3, %xmm2, %xmm2 vpxor %xmm2, %xmm1, %xmm1 vpsrld $20, %xmm1, %xmm4 vpslld $12, %xmm1, %xmm1 vpxor %xmm4, %xmm1, %xmm1 vpaddd %xmm1, %xmm0, %xmm0 vpxor %xmm0, %xmm3, %xmm3 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm3, %xmm3 vpaddd %xmm3, %xmm2, %xmm2 vpxor %xmm2, %xmm1, %xmm1 vpsrld $25, %xmm1, %xmm4 vpslld $7, %xmm1, %xmm1 vpxor %xmm4, %xmm1, %xmm1 vpshufd $0x93, %xmm1, %xmm1 vpshufd $0x4e, %xmm2, %xmm2 vpshufd $57, %xmm3, %xmm3 decb %al jnz L_chacha20_avx1_block_crypt_start vpaddd %xmm5, %xmm0, %xmm0 vpaddd %xmm6, %xmm1, %xmm1 vpaddd %xmm7, %xmm2, %xmm2 vpaddd %xmm8, %xmm3, %xmm3 vmovdqu (%rsi), %xmm5 vmovdqu 16(%rsi), %xmm6 vmovdqu 32(%rsi), %xmm7 vmovdqu 48(%rsi), %xmm8 vpxor %xmm5, %xmm0, %xmm0 vpxor %xmm6, %xmm1, %xmm1 vpxor %xmm7, %xmm2, %xmm2 vpxor %xmm8, %xmm3, %xmm3 vmovdqu %xmm0, (%rdx) vmovdqu %xmm1, 16(%rdx) vmovdqu %xmm2, 32(%rdx) vmovdqu %xmm3, 48(%rdx) addl $0x01, 48(%rdi) subl $0x40, %ecx addq $0x40, %rsi addq $0x40, %rdx cmpl $0x40, %ecx jge L_chacha20_avx1_block_start L_chacha20_avx1_block_done: cmpl $0x00, %ecx je L_chacha20_avx1_partial_done leaq 80(%rdi), %r10 vmovdqu (%rdi), %xmm0 vmovdqu 16(%rdi), %xmm1 vmovdqu 32(%rdi), %xmm2 vmovdqu 48(%rdi), %xmm3 vmovdqa %xmm0, %xmm5 vmovdqa %xmm1, %xmm6 vmovdqa %xmm2, %xmm7 vmovdqa %xmm3, %xmm8 movb $10, %al L_chacha20_avx1_partial_crypt_start: vpaddd %xmm1, %xmm0, %xmm0 vpxor %xmm0, %xmm3, %xmm3 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm3, %xmm3 vpaddd %xmm3, %xmm2, %xmm2 vpxor %xmm2, %xmm1, %xmm1 vpsrld $20, %xmm1, %xmm4 vpslld $12, %xmm1, %xmm1 vpxor %xmm4, %xmm1, %xmm1 vpaddd %xmm1, %xmm0, %xmm0 vpxor %xmm0, %xmm3, %xmm3 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm3, %xmm3 vpaddd %xmm3, %xmm2, %xmm2 vpxor %xmm2, %xmm1, %xmm1 vpsrld $25, %xmm1, %xmm4 vpslld $7, %xmm1, %xmm1 vpxor %xmm4, %xmm1, %xmm1 vpshufd $57, %xmm1, %xmm1 vpshufd $0x4e, %xmm2, %xmm2 vpshufd $0x93, %xmm3, %xmm3 vpaddd %xmm1, %xmm0, %xmm0 vpxor %xmm0, %xmm3, %xmm3 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm3, %xmm3 vpaddd %xmm3, %xmm2, %xmm2 vpxor %xmm2, %xmm1, %xmm1 vpsrld $20, %xmm1, %xmm4 vpslld $12, %xmm1, %xmm1 vpxor %xmm4, %xmm1, %xmm1 vpaddd %xmm1, %xmm0, %xmm0 vpxor %xmm0, %xmm3, %xmm3 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm3, %xmm3 vpaddd %xmm3, %xmm2, %xmm2 vpxor %xmm2, %xmm1, %xmm1 vpsrld $25, %xmm1, %xmm4 vpslld $7, %xmm1, %xmm1 vpxor %xmm4, %xmm1, %xmm1 vpshufd $0x93, %xmm1, %xmm1 vpshufd $0x4e, %xmm2, %xmm2 vpshufd $57, %xmm3, %xmm3 decb %al jnz L_chacha20_avx1_partial_crypt_start vpaddd %xmm5, %xmm0, %xmm0 vpaddd %xmm6, %xmm1, %xmm1 vpaddd %xmm7, %xmm2, %xmm2 vpaddd %xmm8, %xmm3, %xmm3 vmovdqu %xmm0, (%r10) vmovdqu %xmm1, 16(%r10) vmovdqu %xmm2, 32(%r10) vmovdqu %xmm3, 48(%r10) addl $0x01, 48(%rdi) movl %ecx, %r8d xorq %r11, %r11 andl $7, %r8d jz L_chacha20_avx1_partial_start64 L_chacha20_avx1_partial_start8: movzbl (%r10,%r11,1), %eax xorb (%rsi,%r11,1), %al movb %al, (%rdx,%r11,1) incl %r11d cmpl %r8d, %r11d jne L_chacha20_avx1_partial_start8 je L_chacha20_avx1_partial_end64 L_chacha20_avx1_partial_start64: movq (%r10,%r11,1), %rax xorq (%rsi,%r11,1), %rax movq %rax, (%rdx,%r11,1) addl $8, %r11d L_chacha20_avx1_partial_end64: cmpl %ecx, %r11d jne L_chacha20_avx1_partial_start64 movl $0x40, %r8d subl %r11d, %r8d movl %r8d, 76(%rdi) L_chacha20_avx1_partial_done: addq $0x190, %rsp repz retq #ifndef __APPLE__ .size chacha_encrypt_avx1,.-chacha_encrypt_avx1 #endif /* __APPLE__ */ #endif /* HAVE_INTEL_AVX1 */ #ifdef HAVE_INTEL_AVX2 #ifndef __APPLE__ .data #else .section __DATA,__data #endif /* __APPLE__ */ #ifndef __APPLE__ .align 32 #else .p2align 5 #endif /* __APPLE__ */ L_chacha20_avx2_rotl8: .quad 0x605040702010003, 0xe0d0c0f0a09080b .quad 0x605040702010003, 0xe0d0c0f0a09080b #ifndef __APPLE__ .data #else .section __DATA,__data #endif /* __APPLE__ */ #ifndef __APPLE__ .align 32 #else .p2align 5 #endif /* __APPLE__ */ L_chacha20_avx2_rotl16: .quad 0x504070601000302, 0xd0c0f0e09080b0a .quad 0x504070601000302, 0xd0c0f0e09080b0a #ifndef __APPLE__ .data #else .section __DATA,__data #endif /* __APPLE__ */ #ifndef __APPLE__ .align 32 #else .p2align 5 #endif /* __APPLE__ */ L_chacha20_avx2_add: .quad 0x100000000, 0x300000002 .quad 0x500000004, 0x700000006 #ifndef __APPLE__ .data #else .section __DATA,__data #endif /* __APPLE__ */ #ifndef __APPLE__ .align 32 #else .p2align 5 #endif /* __APPLE__ */ L_chacha20_avx2_eight: .quad 0x800000008, 0x800000008 .quad 0x800000008, 0x800000008 #ifndef __APPLE__ .text .globl chacha_encrypt_avx2 .type chacha_encrypt_avx2,@function .align 16 chacha_encrypt_avx2: #else .section __TEXT,__text .globl _chacha_encrypt_avx2 .p2align 4 _chacha_encrypt_avx2: #endif /* __APPLE__ */ subq $0x310, %rsp movq %rsp, %r9 leaq 512(%rsp), %r10 andq $-32, %r9 andq $-32, %r10 movl %ecx, %eax shrl $9, %eax jz L_chacha20_avx2_end256 vpbroadcastd (%rdi), %ymm0 vpbroadcastd 4(%rdi), %ymm1 vpbroadcastd 8(%rdi), %ymm2 vpbroadcastd 12(%rdi), %ymm3 vpbroadcastd 16(%rdi), %ymm4 vpbroadcastd 20(%rdi), %ymm5 vpbroadcastd 24(%rdi), %ymm6 vpbroadcastd 28(%rdi), %ymm7 vpbroadcastd 32(%rdi), %ymm8 vpbroadcastd 36(%rdi), %ymm9 vpbroadcastd 40(%rdi), %ymm10 vpbroadcastd 44(%rdi), %ymm11 vpbroadcastd 48(%rdi), %ymm12 vpbroadcastd 52(%rdi), %ymm13 vpbroadcastd 56(%rdi), %ymm14 vpbroadcastd 60(%rdi), %ymm15 vpaddd L_chacha20_avx2_add(%rip), %ymm12, %ymm12 vmovdqa %ymm0, (%r9) vmovdqa %ymm1, 32(%r9) vmovdqa %ymm2, 64(%r9) vmovdqa %ymm3, 96(%r9) vmovdqa %ymm4, 128(%r9) vmovdqa %ymm5, 160(%r9) vmovdqa %ymm6, 192(%r9) vmovdqa %ymm7, 224(%r9) vmovdqa %ymm8, 256(%r9) vmovdqa %ymm9, 288(%r9) vmovdqa %ymm10, 320(%r9) vmovdqa %ymm11, 352(%r9) vmovdqa %ymm12, 384(%r9) vmovdqa %ymm13, 416(%r9) vmovdqa %ymm14, 448(%r9) vmovdqa %ymm15, 480(%r9) L_chacha20_avx2_start256: movb $10, %r8b vmovdqa %ymm11, 96(%r10) L_chacha20_avx2_loop256: vpaddd %ymm4, %ymm0, %ymm0 vpxor %ymm0, %ymm12, %ymm12 vmovdqa 96(%r10), %ymm11 vpshufb L_chacha20_avx2_rotl16(%rip), %ymm12, %ymm12 vpaddd %ymm12, %ymm8, %ymm8 vpxor %ymm8, %ymm4, %ymm4 vpaddd %ymm5, %ymm1, %ymm1 vpxor %ymm1, %ymm13, %ymm13 vpshufb L_chacha20_avx2_rotl16(%rip), %ymm13, %ymm13 vpaddd %ymm13, %ymm9, %ymm9 vpxor %ymm9, %ymm5, %ymm5 vpaddd %ymm6, %ymm2, %ymm2 vpxor %ymm2, %ymm14, %ymm14 vpshufb L_chacha20_avx2_rotl16(%rip), %ymm14, %ymm14 vpaddd %ymm14, %ymm10, %ymm10 vpxor %ymm10, %ymm6, %ymm6 vpaddd %ymm7, %ymm3, %ymm3 vpxor %ymm3, %ymm15, %ymm15 vpshufb L_chacha20_avx2_rotl16(%rip), %ymm15, %ymm15 vpaddd %ymm15, %ymm11, %ymm11 vpxor %ymm11, %ymm7, %ymm7 vmovdqa %ymm11, 96(%r10) vpsrld $20, %ymm4, %ymm11 vpslld $12, %ymm4, %ymm4 vpxor %ymm11, %ymm4, %ymm4 vpsrld $20, %ymm5, %ymm11 vpslld $12, %ymm5, %ymm5 vpxor %ymm11, %ymm5, %ymm5 vpsrld $20, %ymm6, %ymm11 vpslld $12, %ymm6, %ymm6 vpxor %ymm11, %ymm6, %ymm6 vpsrld $20, %ymm7, %ymm11 vpslld $12, %ymm7, %ymm7 vpxor %ymm11, %ymm7, %ymm7 vpaddd %ymm4, %ymm0, %ymm0 vpxor %ymm0, %ymm12, %ymm12 vmovdqa 96(%r10), %ymm11 vpshufb L_chacha20_avx2_rotl8(%rip), %ymm12, %ymm12 vpaddd %ymm12, %ymm8, %ymm8 vpxor %ymm8, %ymm4, %ymm4 vpaddd %ymm5, %ymm1, %ymm1 vpxor %ymm1, %ymm13, %ymm13 vpshufb L_chacha20_avx2_rotl8(%rip), %ymm13, %ymm13 vpaddd %ymm13, %ymm9, %ymm9 vpxor %ymm9, %ymm5, %ymm5 vpaddd %ymm6, %ymm2, %ymm2 vpxor %ymm2, %ymm14, %ymm14 vpshufb L_chacha20_avx2_rotl8(%rip), %ymm14, %ymm14 vpaddd %ymm14, %ymm10, %ymm10 vpxor %ymm10, %ymm6, %ymm6 vpaddd %ymm7, %ymm3, %ymm3 vpxor %ymm3, %ymm15, %ymm15 vpshufb L_chacha20_avx2_rotl8(%rip), %ymm15, %ymm15 vpaddd %ymm15, %ymm11, %ymm11 vpxor %ymm11, %ymm7, %ymm7 vmovdqa %ymm11, 96(%r10) vpsrld $25, %ymm4, %ymm11 vpslld $7, %ymm4, %ymm4 vpxor %ymm11, %ymm4, %ymm4 vpsrld $25, %ymm5, %ymm11 vpslld $7, %ymm5, %ymm5 vpxor %ymm11, %ymm5, %ymm5 vpsrld $25, %ymm6, %ymm11 vpslld $7, %ymm6, %ymm6 vpxor %ymm11, %ymm6, %ymm6 vpsrld $25, %ymm7, %ymm11 vpslld $7, %ymm7, %ymm7 vpxor %ymm11, %ymm7, %ymm7 vpaddd %ymm5, %ymm0, %ymm0 vpxor %ymm0, %ymm15, %ymm15 vmovdqa 96(%r10), %ymm11 vpshufb L_chacha20_avx2_rotl16(%rip), %ymm15, %ymm15 vpaddd %ymm15, %ymm10, %ymm10 vpxor %ymm10, %ymm5, %ymm5 vpaddd %ymm6, %ymm1, %ymm1 vpxor %ymm1, %ymm12, %ymm12 vpshufb L_chacha20_avx2_rotl16(%rip), %ymm12, %ymm12 vpaddd %ymm12, %ymm11, %ymm11 vpxor %ymm11, %ymm6, %ymm6 vpaddd %ymm7, %ymm2, %ymm2 vpxor %ymm2, %ymm13, %ymm13 vpshufb L_chacha20_avx2_rotl16(%rip), %ymm13, %ymm13 vpaddd %ymm13, %ymm8, %ymm8 vpxor %ymm8, %ymm7, %ymm7 vpaddd %ymm4, %ymm3, %ymm3 vpxor %ymm3, %ymm14, %ymm14 vpshufb L_chacha20_avx2_rotl16(%rip), %ymm14, %ymm14 vpaddd %ymm14, %ymm9, %ymm9 vpxor %ymm9, %ymm4, %ymm4 vmovdqa %ymm11, 96(%r10) vpsrld $20, %ymm5, %ymm11 vpslld $12, %ymm5, %ymm5 vpxor %ymm11, %ymm5, %ymm5 vpsrld $20, %ymm6, %ymm11 vpslld $12, %ymm6, %ymm6 vpxor %ymm11, %ymm6, %ymm6 vpsrld $20, %ymm7, %ymm11 vpslld $12, %ymm7, %ymm7 vpxor %ymm11, %ymm7, %ymm7 vpsrld $20, %ymm4, %ymm11 vpslld $12, %ymm4, %ymm4 vpxor %ymm11, %ymm4, %ymm4 vpaddd %ymm5, %ymm0, %ymm0 vpxor %ymm0, %ymm15, %ymm15 vmovdqa 96(%r10), %ymm11 vpshufb L_chacha20_avx2_rotl8(%rip), %ymm15, %ymm15 vpaddd %ymm15, %ymm10, %ymm10 vpxor %ymm10, %ymm5, %ymm5 vpaddd %ymm6, %ymm1, %ymm1 vpxor %ymm1, %ymm12, %ymm12 vpshufb L_chacha20_avx2_rotl8(%rip), %ymm12, %ymm12 vpaddd %ymm12, %ymm11, %ymm11 vpxor %ymm11, %ymm6, %ymm6 vpaddd %ymm7, %ymm2, %ymm2 vpxor %ymm2, %ymm13, %ymm13 vpshufb L_chacha20_avx2_rotl8(%rip), %ymm13, %ymm13 vpaddd %ymm13, %ymm8, %ymm8 vpxor %ymm8, %ymm7, %ymm7 vpaddd %ymm4, %ymm3, %ymm3 vpxor %ymm3, %ymm14, %ymm14 vpshufb L_chacha20_avx2_rotl8(%rip), %ymm14, %ymm14 vpaddd %ymm14, %ymm9, %ymm9 vpxor %ymm9, %ymm4, %ymm4 vmovdqa %ymm11, 96(%r10) vpsrld $25, %ymm5, %ymm11 vpslld $7, %ymm5, %ymm5 vpxor %ymm11, %ymm5, %ymm5 vpsrld $25, %ymm6, %ymm11 vpslld $7, %ymm6, %ymm6 vpxor %ymm11, %ymm6, %ymm6 vpsrld $25, %ymm7, %ymm11 vpslld $7, %ymm7, %ymm7 vpxor %ymm11, %ymm7, %ymm7 vpsrld $25, %ymm4, %ymm11 vpslld $7, %ymm4, %ymm4 vpxor %ymm11, %ymm4, %ymm4 decb %r8b jnz L_chacha20_avx2_loop256 vmovdqa 96(%r10), %ymm11 vpaddd (%r9), %ymm0, %ymm0 vpaddd 32(%r9), %ymm1, %ymm1 vpaddd 64(%r9), %ymm2, %ymm2 vpaddd 96(%r9), %ymm3, %ymm3 vpaddd 128(%r9), %ymm4, %ymm4 vpaddd 160(%r9), %ymm5, %ymm5 vpaddd 192(%r9), %ymm6, %ymm6 vpaddd 224(%r9), %ymm7, %ymm7 vpaddd 256(%r9), %ymm8, %ymm8 vpaddd 288(%r9), %ymm9, %ymm9 vpaddd 320(%r9), %ymm10, %ymm10 vpaddd 352(%r9), %ymm11, %ymm11 vpaddd 384(%r9), %ymm12, %ymm12 vpaddd 416(%r9), %ymm13, %ymm13 vpaddd 448(%r9), %ymm14, %ymm14 vpaddd 480(%r9), %ymm15, %ymm15 vmovdqa %ymm8, (%r10) vmovdqa %ymm9, 32(%r10) vmovdqa %ymm10, 64(%r10) vmovdqa %ymm11, 96(%r10) vmovdqa %ymm12, 128(%r10) vmovdqa %ymm13, 160(%r10) vmovdqa %ymm14, 192(%r10) vmovdqa %ymm15, 224(%r10) vpunpckldq %ymm1, %ymm0, %ymm8 vpunpckldq %ymm3, %ymm2, %ymm9 vpunpckhdq %ymm1, %ymm0, %ymm12 vpunpckhdq %ymm3, %ymm2, %ymm13 vpunpckldq %ymm5, %ymm4, %ymm10 vpunpckldq %ymm7, %ymm6, %ymm11 vpunpckhdq %ymm5, %ymm4, %ymm14 vpunpckhdq %ymm7, %ymm6, %ymm15 vpunpcklqdq %ymm9, %ymm8, %ymm0 vpunpcklqdq %ymm11, %ymm10, %ymm1 vpunpckhqdq %ymm9, %ymm8, %ymm2 vpunpckhqdq %ymm11, %ymm10, %ymm3 vpunpcklqdq %ymm13, %ymm12, %ymm4 vpunpcklqdq %ymm15, %ymm14, %ymm5 vpunpckhqdq %ymm13, %ymm12, %ymm6 vpunpckhqdq %ymm15, %ymm14, %ymm7 vperm2i128 $32, %ymm1, %ymm0, %ymm8 vperm2i128 $32, %ymm3, %ymm2, %ymm9 vperm2i128 $49, %ymm1, %ymm0, %ymm12 vperm2i128 $49, %ymm3, %ymm2, %ymm13 vperm2i128 $32, %ymm5, %ymm4, %ymm10 vperm2i128 $32, %ymm7, %ymm6, %ymm11 vperm2i128 $49, %ymm5, %ymm4, %ymm14 vperm2i128 $49, %ymm7, %ymm6, %ymm15 vmovdqu (%rsi), %ymm0 vmovdqu 64(%rsi), %ymm1 vmovdqu 128(%rsi), %ymm2 vmovdqu 192(%rsi), %ymm3 vmovdqu 256(%rsi), %ymm4 vmovdqu 320(%rsi), %ymm5 vmovdqu 384(%rsi), %ymm6 vmovdqu 448(%rsi), %ymm7 vpxor %ymm0, %ymm8, %ymm8 vpxor %ymm1, %ymm9, %ymm9 vpxor %ymm2, %ymm10, %ymm10 vpxor %ymm3, %ymm11, %ymm11 vpxor %ymm4, %ymm12, %ymm12 vpxor %ymm5, %ymm13, %ymm13 vpxor %ymm6, %ymm14, %ymm14 vpxor %ymm7, %ymm15, %ymm15 vmovdqu %ymm8, (%rdx) vmovdqu %ymm9, 64(%rdx) vmovdqu %ymm10, 128(%rdx) vmovdqu %ymm11, 192(%rdx) vmovdqu %ymm12, 256(%rdx) vmovdqu %ymm13, 320(%rdx) vmovdqu %ymm14, 384(%rdx) vmovdqu %ymm15, 448(%rdx) vmovdqa (%r10), %ymm0 vmovdqa 32(%r10), %ymm1 vmovdqa 64(%r10), %ymm2 vmovdqa 96(%r10), %ymm3 vmovdqa 128(%r10), %ymm4 vmovdqa 160(%r10), %ymm5 vmovdqa 192(%r10), %ymm6 vmovdqa 224(%r10), %ymm7 vpunpckldq %ymm1, %ymm0, %ymm8 vpunpckldq %ymm3, %ymm2, %ymm9 vpunpckhdq %ymm1, %ymm0, %ymm12 vpunpckhdq %ymm3, %ymm2, %ymm13 vpunpckldq %ymm5, %ymm4, %ymm10 vpunpckldq %ymm7, %ymm6, %ymm11 vpunpckhdq %ymm5, %ymm4, %ymm14 vpunpckhdq %ymm7, %ymm6, %ymm15 vpunpcklqdq %ymm9, %ymm8, %ymm0 vpunpcklqdq %ymm11, %ymm10, %ymm1 vpunpckhqdq %ymm9, %ymm8, %ymm2 vpunpckhqdq %ymm11, %ymm10, %ymm3 vpunpcklqdq %ymm13, %ymm12, %ymm4 vpunpcklqdq %ymm15, %ymm14, %ymm5 vpunpckhqdq %ymm13, %ymm12, %ymm6 vpunpckhqdq %ymm15, %ymm14, %ymm7 vperm2i128 $32, %ymm1, %ymm0, %ymm8 vperm2i128 $32, %ymm3, %ymm2, %ymm9 vperm2i128 $49, %ymm1, %ymm0, %ymm12 vperm2i128 $49, %ymm3, %ymm2, %ymm13 vperm2i128 $32, %ymm5, %ymm4, %ymm10 vperm2i128 $32, %ymm7, %ymm6, %ymm11 vperm2i128 $49, %ymm5, %ymm4, %ymm14 vperm2i128 $49, %ymm7, %ymm6, %ymm15 vmovdqu 32(%rsi), %ymm0 vmovdqu 96(%rsi), %ymm1 vmovdqu 160(%rsi), %ymm2 vmovdqu 224(%rsi), %ymm3 vmovdqu 288(%rsi), %ymm4 vmovdqu 352(%rsi), %ymm5 vmovdqu 416(%rsi), %ymm6 vmovdqu 480(%rsi), %ymm7 vpxor %ymm0, %ymm8, %ymm8 vpxor %ymm1, %ymm9, %ymm9 vpxor %ymm2, %ymm10, %ymm10 vpxor %ymm3, %ymm11, %ymm11 vpxor %ymm4, %ymm12, %ymm12 vpxor %ymm5, %ymm13, %ymm13 vpxor %ymm6, %ymm14, %ymm14 vpxor %ymm7, %ymm15, %ymm15 vmovdqu %ymm8, 32(%rdx) vmovdqu %ymm9, 96(%rdx) vmovdqu %ymm10, 160(%rdx) vmovdqu %ymm11, 224(%rdx) vmovdqu %ymm12, 288(%rdx) vmovdqu %ymm13, 352(%rdx) vmovdqu %ymm14, 416(%rdx) vmovdqu %ymm15, 480(%rdx) vmovdqa 384(%r9), %ymm12 addq $0x200, %rsi addq $0x200, %rdx vpaddd L_chacha20_avx2_eight(%rip), %ymm12, %ymm12 subl $0x200, %ecx vmovdqa %ymm12, 384(%r9) cmpl $0x200, %ecx jl L_chacha20_avx2_done256 vmovdqa (%r9), %ymm0 vmovdqa 32(%r9), %ymm1 vmovdqa 64(%r9), %ymm2 vmovdqa 96(%r9), %ymm3 vmovdqa 128(%r9), %ymm4 vmovdqa 160(%r9), %ymm5 vmovdqa 192(%r9), %ymm6 vmovdqa 224(%r9), %ymm7 vmovdqa 256(%r9), %ymm8 vmovdqa 288(%r9), %ymm9 vmovdqa 320(%r9), %ymm10 vmovdqa 352(%r9), %ymm11 vmovdqa 384(%r9), %ymm12 vmovdqa 416(%r9), %ymm13 vmovdqa 448(%r9), %ymm14 vmovdqa 480(%r9), %ymm15 jmp L_chacha20_avx2_start256 L_chacha20_avx2_done256: shl $3, %eax addl %eax, 48(%rdi) L_chacha20_avx2_end256: #ifndef __APPLE__ callq chacha_encrypt_avx1@plt #else callq _chacha_encrypt_avx1 #endif /* __APPLE__ */ addq $0x310, %rsp repz retq #ifndef __APPLE__ .size chacha_encrypt_avx2,.-chacha_encrypt_avx2 #endif /* __APPLE__ */ #endif /* HAVE_INTEL_AVX2 */ #endif /* WOLFSSL_X86_64_BUILD */ #if defined(__linux__) && defined(__ELF__) .section .note.GNU-stack,"",%progbits #endif