#include "../macro.S"
#include "constants.S"

SECTION_TEXT

GLOBAL_HIDDEN_FN_EXT poly1305_block_size_avx,0,0
movl $32, %eax
ret
FN_END poly1305_block_size_avx

GLOBAL_HIDDEN_FN_EXT poly1305_init_ext_avx,4,1
poly1305_init_ext_avx_local:
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbp
pushq %rbx
movq %rdi, %rbp
testq %rdx, %rdx
movq $-1, %rax
cmovne %rdx, %rax
movq %rax, -16(%rsp)
vpxor %xmm0, %xmm0, %xmm0
vmovdqu %xmm0, (%rdi)
vmovdqu %xmm0, 16(%rdi)
vmovdqu %xmm0, 32(%rdi)
movq (%rsi), %r9
movq 8(%rsi), %r8
movabsq $17575274610687, %r10
andq %r9, %r10
shrq $44, %r9
movq %r8, %rax
salq $20, %rax
orq %rax, %r9
movabsq $17592181915647, %rax
andq %rax, %r9
shrq $24, %r8
movabsq $68719475727, %rax
andq %rax, %r8
leaq 40(%rdi), %r15
movl %r10d, %eax
andl $67108863, %eax
movl %eax, 40(%rdi)
movl %r9d, %edx
sall $18, %edx
movq %r10, %rax
shrq $26, %rax
orl %edx, %eax
andl $67108863, %eax
movl %eax, 44(%rdi)
movq %r9, %rax
shrq $8, %rax
andl $67108863, %eax
movl %eax, 48(%rdi)
movq %r9, %rax
shrq $34, %rax
movl %r8d, %edx
sall $10, %edx
orl %edx, %eax
andl $67108863, %eax
movl %eax, 52(%rdi)
movq %r8, %rax
shrq $16, %rax
movl %eax, 56(%rdi)
movq 16(%rsi), %rax
movq %rax, 104(%rdi)
movq 24(%rsi), %rax
movq %rax, 112(%rdi)
movl $0, %ebx
.L7:
testq %rbx, %rbx
jne .L4
leaq 60(%rbp), %r15
cmpq $16, -16(%rsp)
ja .L6
jmp .L5
.L4:
cmpq $1, %rbx
jne .L6
leaq 80(%rbp), %r15
cmpq $95, -16(%rsp)
jbe .L5
.L6:
leaq (%r8,%r8,4), %rsi
salq $2, %rsi
leaq (%r9,%r9), %rdi
movq %rdi, %rax
mulq %rsi
movq %rax, %r13
movq %rdx, %r14
movq %r10, %rax
mulq %r10
addq %r13, %rax
adcq %r14, %rdx
movabsq $17592186044415, %rcx
movq %rax, -72(%rsp)
movq %rdx, -64(%rsp)
andq -72(%rsp), %rcx
leaq (%r10,%r10), %r11
movq %r11, %rax
mulq %r9
movq %rax, %r11
movq %rdx, %r12
movq %rsi, %rax
mulq %r8
movq %rax, %r13
movq %rdx, %r14
addq %r11, %r13
adcq %r12, %r14
movq -72(%rsp), %rax
movq -64(%rsp), %rdx
shrdq $44, %rdx, %rax
movq %rax, -56(%rsp)
movq $0, -48(%rsp)
addq -56(%rsp), %r13
adcq -48(%rsp), %r14
movabsq $17592186044415, %rsi
andq %r13, %rsi
leaq (%r8,%r8), %rdi
movq %rdi, %rax
mulq %r10
movq %rax, %r11
movq %rdx, %r12
movq %r9, %rax
mulq %r9
addq %r11, %rax
adcq %r12, %rdx
shrdq $44, %r14, %r13
movq %r13, -40(%rsp)
movq $0, -32(%rsp)
addq -40(%rsp), %rax
adcq -32(%rsp), %rdx
movabsq $4398046511103, %rdi
andq %rax, %rdi
shrdq $42, %rdx, %rax
leaq (%rax,%rax,4), %r8
addq %rcx, %r8
movabsq $17592186044415, %r10
andq %r8, %r10
shrq $44, %r8
addq %rsi, %r8
movabsq $17592186044415, %r9
andq %r8, %r9
shrq $44, %r8
addq %rdi, %r8
movl %r10d, %eax
andl $67108863, %eax
movl %eax, (%r15)
movl %r9d, %edx
sall $18, %edx
movq %r10, %rax
shrq $26, %rax
orl %edx, %eax
andl $67108863, %eax
movl %eax, 4(%r15)
movq %r9, %rax
shrq $8, %rax
andl $67108863, %eax
movl %eax, 8(%r15)
movl %r8d, %edx
sall $10, %edx
movq %r9, %rax
shrq $34, %rax
orl %edx, %eax
andl $67108863, %eax
movl %eax, 12(%r15)
movq %r8, %rax
shrq $16, %rax
movl %eax, 16(%r15)
addq $1, %rbx
cmpq $2, %rbx
jne .L7
.L5:
movq $0, 120(%rbp)
popq %rbx
popq %rbp
popq %r12
popq %r13
popq %r14
popq %r15
ret
FN_END poly1305_init_ext_avx



GLOBAL_HIDDEN_FN poly1305_blocks_avx
poly1305_blocks_avx_local:
pushq %rbp
movq %rsp, %rbp
pushq %rbx
andq $-64, %rsp
subq $200, %rsp
movl $(1 << 24), %eax
movl $((1 << 26) - 1), %r8d
movl $(5), %r9d
vmovd %eax, %xmm1
vmovd %r8d, %xmm0
vmovd %r9d, %xmm2
vpshufd $68, %xmm1, %xmm1
vpshufd $68, %xmm0, %xmm0
vpshufd $68, %xmm2, %xmm2
vmovdqa %xmm1, 152(%rsp)
vmovdqa %xmm2, 184(%rsp)
movq 120(%rdi), %rax
testb $4, %al
je .L12
vpsrldq $8, %xmm1, %xmm1
vmovdqa %xmm1, 152(%rsp)
.L12:
testb $8, %al
je .L13
vpxor %xmm1, %xmm1, %xmm1
vmovdqa %xmm1, 152(%rsp)
.L13:
testb $1, %al
jne .L14
vmovq (%rsi), %xmm1
vpinsrq $1, 16(%rsi), %xmm1, %xmm1
vmovq 8(%rsi), %xmm3
vpinsrq $1, 24(%rsi), %xmm3, %xmm2
vpand %xmm0, %xmm1, %xmm7
vpsrlq $26, %xmm1, %xmm12
vpand %xmm0, %xmm12, %xmm12
vpsllq $12, %xmm2, %xmm3
vpsrlq $52, %xmm1, %xmm1
vpor %xmm3, %xmm1, %xmm6
vpand %xmm0, %xmm6, %xmm3
vpsrlq $26, %xmm6, %xmm6
vpand %xmm0, %xmm6, %xmm6
vpsrlq $40, %xmm2, %xmm2
vpor 152(%rsp), %xmm2, %xmm2
addq $32, %rsi
subq $32, %rdx
orq $1, %rax
movq %rax, 120(%rdi)
jmp .L15
.L14:
vmovdqu (%rdi), %xmm12
vmovdqu 16(%rdi), %xmm6
vmovdqu 32(%rdi), %xmm2
vpshufd $80, %xmm12, %xmm7
vpshufd $250, %xmm12, %xmm12
vpshufd $80, %xmm6, %xmm3
vpshufd $250, %xmm6, %xmm6
vpshufd $80, %xmm2, %xmm2
.L15:
movq 120(%rdi), %rax
testb $48, %al
je .L16
testb $16, %al
je .L17
vmovdqu 40(%rdi), %xmm1
vmovd 56(%rdi), %xmm4
vmovdqu 60(%rdi), %xmm5
vpunpckldq %xmm1, %xmm5, %xmm11
vpunpckhdq %xmm1, %xmm5, %xmm5
vmovd 76(%rdi), %xmm1
vpunpcklqdq %xmm4, %xmm1, %xmm4
jmp .L18
.L17:
movl $(1), %r8d
vmovdqu 40(%rdi), %xmm5
vmovd 56(%rdi), %xmm4
vmovd %r8d, %xmm1
vpunpckldq %xmm1, %xmm5, %xmm11
vpunpckhdq %xmm1, %xmm5, %xmm5
.L18:
vpshufd $80, %xmm11, %xmm1
vpshufd $250, %xmm11, %xmm11
vpshufd $80, %xmm5, %xmm10
vpshufd $250, %xmm5, %xmm5
jmp .L19
.L16:
vmovdqu 60(%rdi), %xmm5
vpshufd $0, %xmm5, %xmm1
vpshufd $85, %xmm5, %xmm11
vpshufd $170, %xmm5, %xmm10
vpshufd $255, %xmm5, %xmm5
vmovd 76(%rdi), %xmm4
vpshufd $0, %xmm4, %xmm4
.L19:
vmovdqa %xmm11, 136(%rsp)
vpmuludq 184(%rsp), %xmm11, %xmm13
vmovdqa %xmm13, 120(%rsp)
vmovdqa %xmm10, 104(%rsp)
vpmuludq 184(%rsp), %xmm10, %xmm13
vmovdqa %xmm13, 88(%rsp)
vmovdqa %xmm5, 72(%rsp)
vpmuludq 184(%rsp), %xmm5, %xmm5
vmovdqa %xmm5, 56(%rsp)
vmovdqa %xmm4, 40(%rsp)
vpmuludq 184(%rsp), %xmm4, %xmm4
vmovdqa %xmm4, 24(%rsp)
cmpq $63, %rdx
jbe .L20
vmovdqu 80(%rdi), %xmm4
vpshufd $0, %xmm4, %xmm5
vmovdqa %xmm5, 8(%rsp)
vpshufd $85, %xmm4, %xmm5
vmovdqa %xmm5, -8(%rsp)
vpshufd $170, %xmm4, %xmm13
vmovdqa %xmm13, -24(%rsp)
vpshufd $255, %xmm4, %xmm4
vmovdqa %xmm4, %xmm10
vmovdqa %xmm4, -40(%rsp)
vmovd 96(%rdi), %xmm4
vpshufd $0, %xmm4, %xmm4
vmovdqa %xmm4, %xmm8
vmovdqa %xmm4, -56(%rsp)
vpmuludq 184(%rsp), %xmm5, %xmm4
vmovdqa %xmm4, -72(%rsp)
vpmuludq 184(%rsp), %xmm13, %xmm4
vmovdqa %xmm4, -88(%rsp)
vpmuludq 184(%rsp), %xmm10, %xmm4
vmovdqa %xmm4, -104(%rsp)
vpmuludq 184(%rsp), %xmm8, %xmm4
vmovdqa %xmm4, -120(%rsp)
leaq 32(%rsi), %rax
movq %rdx, %rcx
vmovdqa %xmm1, 168(%rsp)
jmp .L22
.p2align 6
nop
nop
nop
nop
.L22:
vpmuludq -72(%rsp), %xmm2, %xmm13
vmovdqa -88(%rsp), %xmm5
vpmuludq %xmm5, %xmm6, %xmm4
vpmuludq %xmm5, %xmm2, %xmm11
vmovdqa -104(%rsp), %xmm9
vpmuludq %xmm9, %xmm6, %xmm5
vpmuludq %xmm9, %xmm2, %xmm10
vpaddq %xmm4, %xmm13, %xmm13
vpmuludq %xmm9, %xmm3, %xmm4
vmovdqa -120(%rsp), %xmm8
vpmuludq %xmm8, %xmm2, %xmm9
vpaddq %xmm5, %xmm11, %xmm11
vmovdqa %xmm8, %xmm5
vpmuludq %xmm8, %xmm12, %xmm8
vpmuludq %xmm5, %xmm3, %xmm14
vpaddq %xmm4, %xmm13, %xmm13
vpmuludq %xmm5, %xmm6, %xmm4
vmovdqa 8(%rsp), %xmm15
vpmuludq %xmm15, %xmm6, %xmm5
vpaddq %xmm8, %xmm13, %xmm13
vpmuludq %xmm15, %xmm2, %xmm8
vpaddq %xmm14, %xmm11, %xmm11
vpmuludq %xmm15, %xmm7, %xmm14
vpaddq %xmm4, %xmm10, %xmm10
vpmuludq %xmm15, %xmm12, %xmm4
vpaddq %xmm5, %xmm9, %xmm9
vpmuludq %xmm15, %xmm3, %xmm5
vmovdqa -8(%rsp), %xmm15
vpmuludq %xmm15, %xmm3, %xmm2
vpaddq %xmm14, %xmm13, %xmm13
vpmuludq %xmm15, %xmm6, %xmm6
vpaddq %xmm4, %xmm11, %xmm11
vpmuludq %xmm15, %xmm7, %xmm4
vpaddq %xmm5, %xmm10, %xmm10
vmovq -32(%rax), %xmm5
vpinsrq $1, -16(%rax), %xmm5, %xmm5
vpmuludq %xmm15, %xmm12, %xmm14
vpaddq %xmm2, %xmm9, %xmm9
vmovdqa -24(%rsp), %xmm2
vpmuludq %xmm2, %xmm12, %xmm15
vpaddq %xmm6, %xmm8, %xmm8
vpmuludq %xmm2, %xmm3, %xmm3
vpaddq %xmm4, %xmm11, %xmm11
vmovq -24(%rax), %xmm4
vpinsrq $1, -8(%rax), %xmm4, %xmm6
vpmuludq %xmm2, %xmm7, %xmm4
vpaddq %xmm14, %xmm10, %xmm10
vmovdqa -40(%rsp), %xmm1
vpmuludq %xmm1, %xmm7, %xmm14
vpaddq %xmm15, %xmm9, %xmm9
vpand %xmm5, %xmm0, %xmm2
vpmuludq %xmm1, %xmm12, %xmm12
vpaddq %xmm3, %xmm8, %xmm8
vpsrlq $26, %xmm5, %xmm3
vpand %xmm3, %xmm0, %xmm3
vpmuludq -56(%rsp), %xmm7, %xmm7
vpaddq %xmm4, %xmm10, %xmm10
vpsllq $12, %xmm6, %xmm15
vpsrlq $52, %xmm5, %xmm4
vpor %xmm15, %xmm4, %xmm4
vpaddq %xmm14, %xmm9, %xmm9
vpsrlq $14, %xmm6, %xmm5
vpand %xmm5, %xmm0, %xmm5
vpaddq %xmm12, %xmm8, %xmm8
vpand %xmm4, %xmm0, %xmm4
vpaddq %xmm7, %xmm8, %xmm8
vpsrlq $40, %xmm6, %xmm6
vpor 152(%rsp), %xmm6, %xmm6
vmovdqu (%rax), %xmm12
vmovdqu 16(%rax), %xmm7
vpunpckldq %xmm7, %xmm12, %xmm15
vpunpckhdq %xmm7, %xmm12, %xmm7
vpxor %xmm14, %xmm14, %xmm14
vpunpckldq %xmm14, %xmm15, %xmm12
vpunpckhdq %xmm14, %xmm15, %xmm15
vpunpckldq %xmm14, %xmm7, %xmm14
vpxor %xmm1, %xmm1, %xmm1
vpunpckhdq %xmm1, %xmm7, %xmm7
vpsllq $6, %xmm15, %xmm15
vpsllq $12, %xmm14, %xmm14
vpsllq $18, %xmm7, %xmm7
vpaddq %xmm12, %xmm13, %xmm12
vpaddq %xmm15, %xmm11, %xmm15
vpaddq %xmm14, %xmm10, %xmm14
vpaddq %xmm7, %xmm9, %xmm7
vpaddq 152(%rsp), %xmm8, %xmm8
vpmuludq 120(%rsp), %xmm6, %xmm13
vmovdqa 88(%rsp), %xmm10
vpmuludq %xmm10, %xmm5, %xmm9
vpmuludq %xmm10, %xmm6, %xmm11
vmovdqa 56(%rsp), %xmm1
vpmuludq %xmm1, %xmm5, %xmm10
vpaddq %xmm13, %xmm12, %xmm12
vpmuludq %xmm1, %xmm6, %xmm13
vpaddq %xmm9, %xmm12, %xmm12
vpmuludq %xmm1, %xmm4, %xmm9
vpaddq %xmm11, %xmm15, %xmm15
vmovdqa 24(%rsp), %xmm1
vpmuludq %xmm1, %xmm6, %xmm11
vpaddq %xmm10, %xmm15, %xmm10
vpmuludq %xmm1, %xmm3, %xmm15
vpaddq %xmm13, %xmm14, %xmm14
vpmuludq %xmm1, %xmm4, %xmm13
vpaddq %xmm9, %xmm12, %xmm9
vpmuludq %xmm1, %xmm5, %xmm12
vpaddq %xmm11, %xmm7, %xmm7
vpmuludq 168(%rsp), %xmm5, %xmm11
vpaddq %xmm15, %xmm9, %xmm9
vpmuludq 168(%rsp), %xmm6, %xmm6
vpaddq %xmm13, %xmm10, %xmm10
vpmuludq 168(%rsp), %xmm2, %xmm15
vpaddq %xmm12, %xmm14, %xmm14
vpmuludq 168(%rsp), %xmm3, %xmm13
vpaddq %xmm11, %xmm7, %xmm11
vpmuludq 168(%rsp), %xmm4, %xmm12
vpaddq %xmm6, %xmm8, %xmm6
vmovdqa 136(%rsp), %xmm8
vpmuludq %xmm8, %xmm4, %xmm7
vpaddq %xmm15, %xmm9, %xmm9
vpmuludq %xmm8, %xmm5, %xmm5
vpaddq %xmm13, %xmm10, %xmm10
vpmuludq %xmm8, %xmm2, %xmm15
vpaddq %xmm12, %xmm14, %xmm14
vpmuludq %xmm8, %xmm3, %xmm8
vpaddq %xmm7, %xmm11, %xmm11
vmovdqa 104(%rsp), %xmm7
vpmuludq %xmm7, %xmm3, %xmm13
vpaddq %xmm5, %xmm6, %xmm6
vpmuludq %xmm7, %xmm4, %xmm4
vpaddq %xmm15, %xmm10, %xmm10
vpmuludq %xmm7, %xmm2, %xmm15
vpaddq %xmm8, %xmm14, %xmm14
vmovdqa 72(%rsp), %xmm5
vpmuludq %xmm5, %xmm2, %xmm7
vpaddq %xmm13, %xmm11, %xmm11
vpmuludq %xmm5, %xmm3, %xmm3
vpaddq %xmm4, %xmm6, %xmm6
vpmuludq 40(%rsp), %xmm2, %xmm2
vpaddq %xmm15, %xmm14, %xmm14
vpaddq %xmm7, %xmm11, %xmm11
vpaddq %xmm3, %xmm6, %xmm6
vpaddq %xmm2, %xmm6, %xmm2
vpsrlq $26, %xmm9, %xmm12
vpsrlq $26, %xmm11, %xmm5
vpand %xmm0, %xmm9, %xmm9
vpand %xmm0, %xmm11, %xmm11
vpaddq %xmm12, %xmm10, %xmm10
vpaddq %xmm5, %xmm2, %xmm2
vpsrlq $26, %xmm10, %xmm3
vpsrlq $26, %xmm2, %xmm7
vpand %xmm0, %xmm10, %xmm10
vpand %xmm0, %xmm2, %xmm2
vpaddq %xmm3, %xmm14, %xmm3
vpmuludq 184(%rsp), %xmm7, %xmm7
vpaddq %xmm7, %xmm9, %xmm9
vpsrlq $26, %xmm3, %xmm6
vpsrlq $26, %xmm9, %xmm12
vpand %xmm0, %xmm3, %xmm3
vpand %xmm0, %xmm9, %xmm7
vpaddq %xmm6, %xmm11, %xmm6
vpaddq %xmm12, %xmm10, %xmm12
vpsrlq $26, %xmm6, %xmm8
vpand %xmm0, %xmm6, %xmm6
vpaddq %xmm8, %xmm2, %xmm2
subq $64, %rcx
addq $64, %rax
cmpq $63, %rcx
ja .L22
vmovdqa 168(%rsp), %xmm1
leaq -64(%rdx), %rax
andq $-64, %rax
leaq 64(%rsi,%rax), %rsi
andl $63, %edx
.L20:
cmpq $31, %rdx
jbe .L23
vpmuludq 120(%rsp), %xmm2, %xmm11
vmovdqa 88(%rsp), %xmm4
vpmuludq %xmm4, %xmm6, %xmm0
vpmuludq %xmm4, %xmm2, %xmm10
vmovdqa 56(%rsp), %xmm4
vpmuludq %xmm4, %xmm6, %xmm8
vpmuludq %xmm4, %xmm2, %xmm5
vpaddq %xmm0, %xmm11, %xmm11
vpmuludq %xmm4, %xmm3, %xmm0
vmovdqa 24(%rsp), %xmm13
vpmuludq %xmm13, %xmm2, %xmm4
vpaddq %xmm8, %xmm10, %xmm10
vpmuludq %xmm13, %xmm12, %xmm8
vpmuludq %xmm13, %xmm3, %xmm9
vpaddq %xmm0, %xmm11, %xmm11
vpmuludq %xmm13, %xmm6, %xmm13
vpmuludq %xmm1, %xmm6, %xmm0
vpaddq %xmm8, %xmm11, %xmm8
vpmuludq %xmm1, %xmm2, %xmm2
vpaddq %xmm9, %xmm10, %xmm9
vpmuludq %xmm1, %xmm7, %xmm11
vpaddq %xmm13, %xmm5, %xmm5
vpmuludq %xmm1, %xmm12, %xmm10
vpaddq %xmm0, %xmm4, %xmm0
vpmuludq %xmm1, %xmm3, %xmm1
vmovdqa 136(%rsp), %xmm4
vpmuludq %xmm4, %xmm3, %xmm14
vpaddq %xmm11, %xmm8, %xmm11
vpmuludq %xmm4, %xmm6, %xmm6
vpaddq %xmm10, %xmm9, %xmm9
vpmuludq %xmm4, %xmm7, %xmm15
vpaddq %xmm1, %xmm5, %xmm5
vpmuludq %xmm4, %xmm12, %xmm1
vpaddq %xmm14, %xmm0, %xmm0
vmovdqa 104(%rsp), %xmm4
vpmuludq %xmm4, %xmm12, %xmm8
vpaddq %xmm6, %xmm2, %xmm2
vpmuludq %xmm4, %xmm3, %xmm3
vpaddq %xmm15, %xmm9, %xmm9
vpmuludq %xmm4, %xmm7, %xmm10
vpaddq %xmm1, %xmm5, %xmm1
vmovdqa 72(%rsp), %xmm4
vpmuludq %xmm4, %xmm7, %xmm15
vpaddq %xmm8, %xmm0, %xmm0
vpmuludq %xmm4, %xmm12, %xmm12
vpaddq %xmm3, %xmm2, %xmm2
vpmuludq 40(%rsp), %xmm7, %xmm7
vpaddq %xmm10, %xmm1, %xmm1
vpaddq %xmm15, %xmm0, %xmm0
vpaddq %xmm12, %xmm2, %xmm2
vpaddq %xmm7, %xmm2, %xmm2
movl $((1 << 26) - 1), %r8d
testq %rsi, %rsi
vmovd %r8d, %xmm15
je .L24
vmovdqu (%rsi), %xmm4
vmovdqu 16(%rsi), %xmm3
vpunpckldq %xmm3, %xmm4, %xmm5
vpunpckhdq %xmm3, %xmm4, %xmm3
vpxor %xmm4, %xmm4, %xmm4
vpunpckldq %xmm4, %xmm5, %xmm7
vpunpckhdq %xmm4, %xmm5, %xmm5
vpunpckldq %xmm4, %xmm3, %xmm6
vpunpckhdq %xmm4, %xmm3, %xmm3
vpsllq $6, %xmm5, %xmm5
vpsllq $12, %xmm6, %xmm6
vpsllq $18, %xmm3, %xmm3
vpaddq %xmm7, %xmm11, %xmm11
vpaddq %xmm5, %xmm9, %xmm9
vpaddq %xmm6, %xmm1, %xmm1
vpaddq %xmm3, %xmm0, %xmm0
vpaddq 152(%rsp), %xmm2, %xmm2
.L24:
vpshufd $68, %xmm15, %xmm15
vpsrlq $26, %xmm11, %xmm12
vpsrlq $26, %xmm0, %xmm3
vpand %xmm15, %xmm11, %xmm11
vpand %xmm15, %xmm0, %xmm6
vpaddq %xmm12, %xmm9, %xmm9
vpaddq %xmm3, %xmm2, %xmm2
vpsrlq $26, %xmm9, %xmm3
vpsrlq $26, %xmm2, %xmm7
vpand %xmm15, %xmm9, %xmm9
vpand %xmm15, %xmm2, %xmm2
vpaddq %xmm3, %xmm1, %xmm3
vpmuludq 184(%rsp), %xmm7, %xmm7
vpaddq %xmm7, %xmm11, %xmm7
vpsrlq $26, %xmm3, %xmm4
vpsrlq $26, %xmm7, %xmm1
vpand %xmm15, %xmm3, %xmm3
vpand %xmm15, %xmm7, %xmm7
vpaddq %xmm4, %xmm6, %xmm6
vpaddq %xmm1, %xmm9, %xmm12
vpsrlq $26, %xmm6, %xmm0
vpand %xmm15, %xmm6, %xmm6
vpaddq %xmm0, %xmm2, %xmm2
.L23:
testq %rsi, %rsi
je .L25
vpshufd $8, %xmm7, %xmm7
vpshufd $8, %xmm12, %xmm12
vpshufd $8, %xmm3, %xmm3
vpshufd $8, %xmm6, %xmm6
vpshufd $8, %xmm2, %xmm2
vpunpcklqdq %xmm12, %xmm7, %xmm7
vpunpcklqdq %xmm6, %xmm3, %xmm3
vmovdqu %xmm7, (%rdi)
vmovdqu %xmm3, 16(%rdi)
vmovq %xmm2, 32(%rdi)
jmp .L11
.L25:
vpsrldq $8, %xmm7, %xmm0
vpaddq %xmm0, %xmm7, %xmm7
vpsrldq $8, %xmm12, %xmm0
vpaddq %xmm0, %xmm12, %xmm12
vpsrldq $8, %xmm3, %xmm0
vpaddq %xmm0, %xmm3, %xmm3
vpsrldq $8, %xmm6, %xmm0
vpaddq %xmm0, %xmm6, %xmm6
vpsrldq $8, %xmm2, %xmm0
vpaddq %xmm0, %xmm2, %xmm2
vmovd %xmm7, %eax
vmovd %xmm12, %edx
movl %eax, %r9d
shrl $26, %r9d
addl %edx, %r9d
movl %r9d, %r8d
andl $67108863, %r8d
vmovd %xmm3, %edx
shrl $26, %r9d
addl %edx, %r9d
vmovd %xmm6, %edx
movl %r9d, %ecx
shrl $26, %ecx
addl %edx, %ecx
movl %ecx, %esi
andl $67108863, %esi
vmovd %xmm2, %r10d
movl %r8d, %r11d
salq $26, %r11
andl $67108863, %eax
orq %rax, %r11
movabsq $17592186044415, %rax
andq %rax, %r11
andl $67108863, %r9d
salq $8, %r9
shrl $18, %r8d
movl %r8d, %r8d
orq %r8, %r9
movq %rsi, %rdx
salq $34, %rdx
orq %rdx, %r9
andq %rax, %r9
shrl $26, %ecx
addl %r10d, %ecx
salq $16, %rcx
shrl $10, %esi
movl %esi, %esi
orq %rsi, %rcx
movabsq $4398046511103, %r10
movq %rcx, %r8
andq %r10, %r8
shrq $42, %rcx
leaq (%rcx,%rcx,4), %rdx
addq %r11, %rdx
movq %rdx, %rsi
andq %rax, %rsi
shrq $44, %rdx
addq %r9, %rdx
movq %rdx, %rcx
andq %rax, %rcx
shrq $44, %rdx
addq %r8, %rdx
andq %rdx, %r10
shrq $42, %rdx
leaq (%rsi,%rdx,4), %rsi
leaq (%rsi,%rdx), %r11
movq %r11, %rbx
andq %rax, %rbx
shrq $44, %r11
addq %rcx, %r11
leaq 5(%rbx), %r9
movq %r9, %r8
shrq $44, %r8
addq %r11, %r8
movabsq $-4398046511104, %rsi
addq %r10, %rsi
movq %r8, %rdx
shrq $44, %rdx
addq %rdx, %rsi
movq %rsi, %rdx
shrq $63, %rdx
subq $1, %rdx
movq %rdx, %rcx
notq %rcx
andq %rcx, %rbx
andq %rcx, %r11
andq %r10, %rcx
andq %rax, %r9
andq %rdx, %r9
orq %r9, %rbx
movq %rbx, (%rdi)
andq %r8, %rax
andq %rdx, %rax
orq %rax, %r11
movq %r11, 8(%rdi)
andq %rsi, %rdx
orq %rcx, %rdx
movq %rdx, 16(%rdi)
.L11:
movq -8(%rbp), %rbx
leave
ret
FN_END poly1305_blocks_avx

GLOBAL_HIDDEN_FN poly1305_finish_ext_avx
poly1305_finish_ext_avx_local:
pushq %r12
pushq %rbp
pushq %rbx
subq $32, %rsp
movq %rdi, %rbx
movq %rdx, %rbp
movq %rcx, %r12
testq %rdx, %rdx
je .L30
movq $0, (%rsp)
movq $0, 8(%rsp)
movq $0, 16(%rsp)
movq $0, 24(%rsp)
movq %rsp, %rax
subq %rsp, %rsi
testb $16, %dl
je .L31
vmovdqu (%rsp,%rsi), %xmm0
vmovdqa %xmm0, (%rsp)
addq $16, %rax
.L31:
testb $8, %bpl
je .L32
movq (%rax,%rsi), %rdx
movq %rdx, (%rax)
addq $8, %rax
.L32:
testb $4, %bpl
je .L33
movl (%rax,%rsi), %edx
movl %edx, (%rax)
addq $4, %rax
.L33:
testb $2, %bpl
je .L34
movzwl (%rax,%rsi), %edx
movw %dx, (%rax)
addq $2, %rax
.L34:
testb $1, %bpl
je .L35
movzbl (%rax,%rsi), %edx
movb %dl, (%rax)
.L35:
cmpq $16, %rbp
je .L36
movb $1, (%rsp,%rbp)
movq 120(%rbx), %rdx
cmpq $16, %rbp
sbbq %rax, %rax
andl $4, %eax
addq $4, %rax
.L37:
orq %rdx, %rax
movq %rax, 120(%rbx)
movq %rsp, %rsi
movl $32, %edx
movq %rbx, %rdi
call poly1305_blocks_avx_local
.L30:
movq 120(%rbx), %rax
testb $1, %al
je .L38
subq $1, %rbp
cmpq $15, %rbp
jbe .L39
orq $16, %rax
movq %rax, 120(%rbx)
jmp .L40
.L39:
orq $32, %rax
movq %rax, 120(%rbx)
.L40:
movl $32, %edx
movl $0, %esi
movq %rbx, %rdi
call poly1305_blocks_avx_local
.L38:
movq 8(%rbx), %rax
movq %rax, %rdx
salq $44, %rdx
orq (%rbx), %rdx
shrq $20, %rax
movq 16(%rbx), %rcx
salq $24, %rcx
orq %rcx, %rax
movq 104(%rbx), %rcx
movq 112(%rbx), %rsi
addq %rcx, %rdx
adcq %rsi, %rax
vpxor %xmm0, %xmm0, %xmm0
vmovdqu %xmm0, (%rbx)
vmovdqu %xmm0, 16(%rbx)
vmovdqu %xmm0, 32(%rbx)
vmovdqu %xmm0, 48(%rbx)
vmovdqu %xmm0, 64(%rbx)
vmovdqu %xmm0, 80(%rbx)
vmovdqu %xmm0, 96(%rbx)
vmovdqu %xmm0, 112(%rbx)
movq %rdx, (%r12)
movq %rax, 8(%r12)
jmp .L43
.L36:
movq 120(%rbx), %rdx
movl $4, %eax
jmp .L37
.L43:
addq $32, %rsp
popq %rbx
popq %rbp
popq %r12
ret
FN_END poly1305_finish_ext_avx

GLOBAL_HIDDEN_FN poly1305_auth_avx
/*
cmp $128, %rdx
jb poly1305_auth_x86_local
*/
pushq %rbp
movq %rsp, %rbp
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
andq $-64, %rsp
addq $-128, %rsp
movq %rdi, %r14
movq %rsi, %r12
movq %rdx, %rbx
movq %rsp, %rdi
movq %rcx, %rsi
call poly1305_init_ext_avx_local
movq %rbx, %r13
andq $-32, %r13
je .L46
movq %rsp, %rdi
movq %r13, %rdx
movq %r12, %rsi
call poly1305_blocks_avx_local
addq %r13, %r12
subq %r13, %rbx
.L46:
movq %rsp, %rdi
movq %r14, %rcx
movq %rbx, %rdx
movq %r12, %rsi
call poly1305_finish_ext_avx_local
leaq -32(%rbp), %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %rbp
ret
FN_END poly1305_auth_avx
