# Copyright 2013-2016 The OpenSSL Project Authors. All Rights Reserved.
# Copyright (c) 2012, Intel Corporation. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Generated by admin/import-aws-lc from aws-lc 91c93a8eb860e51482a871a8772cb9b1b310baea:
# generated-src/linux-x86_64/crypto/fipsmodule/rsaz-avx2.S, which aws-lc generates from crypto/fipsmodule/bn/asm/rsaz-avx2.pl.
# Do not edit by hand.
.cfi_startproc
leaq (%rsp),%rax
.cfi_def_cfa_register %rax
pushq %rbx
.cfi_offset %rbx,-16
pushq %rbp
.cfi_offset %rbp,-24
pushq %r12
.cfi_offset %r12,-32
pushq %r13
.cfi_offset %r13,-40
pushq %r14
.cfi_offset %r14,-48
pushq %r15
.cfi_offset %r15,-56
movq %rax,%rbp
.cfi_def_cfa_register %rbp
vzeroall
movq %rdx,%r13
subq $64,%rsp
.byte 0x67,0x67
movq %rsi,%r15
andq $4095,%r15
addq $320,%r15
shrq $12,%r15
movq %rsi,%r15
cmovnzq %r13,%rsi
cmovnzq %r15,%r13
movq %rcx,%r15
subq $-128,%rsi
subq $-128,%rcx
subq $-128,%rdi
andq $4095,%r15
addq $320,%r15
.byte 0x67,0x67
shrq $12,%r15
jz .Lrsaz_mul_1024_no_n_copy
subq $320,%rsp
vmovdqu 0-128(%rcx),%ymm0
andq $-512,%rsp
vmovdqu 32-128(%rcx),%ymm1
vmovdqu 64-128(%rcx),%ymm2
vmovdqu 96-128(%rcx),%ymm3
vmovdqu 128-128(%rcx),%ymm4
vmovdqu 160-128(%rcx),%ymm5
vmovdqu 192-128(%rcx),%ymm6
vmovdqu 224-128(%rcx),%ymm7
vmovdqu 256-128(%rcx),%ymm8
leaq 64+128(%rsp),%rcx
vmovdqu %ymm0,0-128(%rcx)
vpxor %ymm0,%ymm0,%ymm0
vmovdqu %ymm1,32-128(%rcx)
vpxor %ymm1,%ymm1,%ymm1
vmovdqu %ymm2,64-128(%rcx)
vpxor %ymm2,%ymm2,%ymm2
vmovdqu %ymm3,96-128(%rcx)
vpxor %ymm3,%ymm3,%ymm3
vmovdqu %ymm4,128-128(%rcx)
vpxor %ymm4,%ymm4,%ymm4
vmovdqu %ymm5,160-128(%rcx)
vpxor %ymm5,%ymm5,%ymm5
vmovdqu %ymm6,192-128(%rcx)
vpxor %ymm6,%ymm6,%ymm6
vmovdqu %ymm7,224-128(%rcx)
vpxor %ymm7,%ymm7,%ymm7
vmovdqu %ymm8,256-128(%rcx)
vmovdqa %ymm0,%ymm8
vmovdqu %ymm9,288-128(%rcx)
.Lrsaz_mul_1024_no_n_copy:
andq $-64,%rsp
movq (%r13),%rbx
vpbroadcastq (%r13),%ymm10
vmovdqu %ymm0,(%rsp)
xorq %r9,%r9
.byte 0x67
xorq %r10,%r10
xorq %r11,%r11
xorq %r12,%r12
vmovdqu {and_mask}(%rip),%ymm15
movl $9,%r14d
vmovdqu %ymm9,288-128(%rdi)
jmp .Lrsaz_oop_mul_1024
.align 32
.Lrsaz_oop_mul_1024:
vpsrlq $29,%ymm3,%ymm9
movq %rbx,%rax
imulq -128(%rsi),%rax
addq %r9,%rax
movq %rbx,%r10
imulq 8-128(%rsi),%r10
addq 8(%rsp),%r10
movq %rax,%r9
imull %r8d,%eax
andl $0x1fffffff,%eax
movq %rbx,%r11
imulq 16-128(%rsi),%r11
addq 16(%rsp),%r11
movq %rbx,%r12
imulq 24-128(%rsi),%r12
addq 24(%rsp),%r12
vpmuludq 32-128(%rsi),%ymm10,%ymm0
vmovd %eax,%xmm11
vpaddq %ymm0,%ymm1,%ymm1
vpmuludq 64-128(%rsi),%ymm10,%ymm12
vpbroadcastq %xmm11,%ymm11
vpaddq %ymm12,%ymm2,%ymm2
vpmuludq 96-128(%rsi),%ymm10,%ymm13
vpand %ymm15,%ymm3,%ymm3
vpaddq %ymm13,%ymm3,%ymm3
vpmuludq 128-128(%rsi),%ymm10,%ymm0
vpaddq %ymm0,%ymm4,%ymm4
vpmuludq 160-128(%rsi),%ymm10,%ymm12
vpaddq %ymm12,%ymm5,%ymm5
vpmuludq 192-128(%rsi),%ymm10,%ymm13
vpaddq %ymm13,%ymm6,%ymm6
vpmuludq 224-128(%rsi),%ymm10,%ymm0
vpermq $0x93,%ymm9,%ymm9
vpaddq %ymm0,%ymm7,%ymm7
vpmuludq 256-128(%rsi),%ymm10,%ymm12
vpbroadcastq 8(%r13),%ymm10
vpaddq %ymm12,%ymm8,%ymm8
movq %rax,%rdx
imulq -128(%rcx),%rax
addq %rax,%r9
movq %rdx,%rax
imulq 8-128(%rcx),%rax
addq %rax,%r10
movq %rdx,%rax
imulq 16-128(%rcx),%rax
addq %rax,%r11
shrq $29,%r9
imulq 24-128(%rcx),%rdx
addq %rdx,%r12
addq %r9,%r10
vpmuludq 32-128(%rcx),%ymm11,%ymm13
vmovq %xmm10,%rbx
vpaddq %ymm13,%ymm1,%ymm1
vpmuludq 64-128(%rcx),%ymm11,%ymm0
vpaddq %ymm0,%ymm2,%ymm2
vpmuludq 96-128(%rcx),%ymm11,%ymm12
vpaddq %ymm12,%ymm3,%ymm3
vpmuludq 128-128(%rcx),%ymm11,%ymm13
vpaddq %ymm13,%ymm4,%ymm4
vpmuludq 160-128(%rcx),%ymm11,%ymm0
vpaddq %ymm0,%ymm5,%ymm5
vpmuludq 192-128(%rcx),%ymm11,%ymm12
vpaddq %ymm12,%ymm6,%ymm6
vpmuludq 224-128(%rcx),%ymm11,%ymm13
vpblendd $3,%ymm14,%ymm9,%ymm12
vpaddq %ymm13,%ymm7,%ymm7
vpmuludq 256-128(%rcx),%ymm11,%ymm0
vpaddq %ymm12,%ymm3,%ymm3
vpaddq %ymm0,%ymm8,%ymm8
movq %rbx,%rax
imulq -128(%rsi),%rax
addq %rax,%r10
vmovdqu -8+32-128(%rsi),%ymm12
movq %rbx,%rax
imulq 8-128(%rsi),%rax
addq %rax,%r11
vmovdqu -8+64-128(%rsi),%ymm13
movq %r10,%rax
vpblendd $0xfc,%ymm14,%ymm9,%ymm9
imull %r8d,%eax
vpaddq %ymm9,%ymm4,%ymm4
andl $0x1fffffff,%eax
imulq 16-128(%rsi),%rbx
addq %rbx,%r12
vpmuludq %ymm10,%ymm12,%ymm12
vmovd %eax,%xmm11
vmovdqu -8+96-128(%rsi),%ymm0
vpaddq %ymm12,%ymm1,%ymm1
vpmuludq %ymm10,%ymm13,%ymm13
vpbroadcastq %xmm11,%ymm11
vmovdqu -8+128-128(%rsi),%ymm12
vpaddq %ymm13,%ymm2,%ymm2
vpmuludq %ymm10,%ymm0,%ymm0
vmovdqu -8+160-128(%rsi),%ymm13
vpaddq %ymm0,%ymm3,%ymm3
vpmuludq %ymm10,%ymm12,%ymm12
vmovdqu -8+192-128(%rsi),%ymm0
vpaddq %ymm12,%ymm4,%ymm4
vpmuludq %ymm10,%ymm13,%ymm13
vmovdqu -8+224-128(%rsi),%ymm12
vpaddq %ymm13,%ymm5,%ymm5
vpmuludq %ymm10,%ymm0,%ymm0
vmovdqu -8+256-128(%rsi),%ymm13
vpaddq %ymm0,%ymm6,%ymm6
vpmuludq %ymm10,%ymm12,%ymm12
vmovdqu -8+288-128(%rsi),%ymm9
vpaddq %ymm12,%ymm7,%ymm7
vpmuludq %ymm10,%ymm13,%ymm13
vpaddq %ymm13,%ymm8,%ymm8
vpmuludq %ymm10,%ymm9,%ymm9
vpbroadcastq 16(%r13),%ymm10
movq %rax,%rdx
imulq -128(%rcx),%rax
addq %rax,%r10
vmovdqu -8+32-128(%rcx),%ymm0
movq %rdx,%rax
imulq 8-128(%rcx),%rax
addq %rax,%r11
vmovdqu -8+64-128(%rcx),%ymm12
shrq $29,%r10
imulq 16-128(%rcx),%rdx
addq %rdx,%r12
addq %r10,%r11
vpmuludq %ymm11,%ymm0,%ymm0
vmovq %xmm10,%rbx
vmovdqu -8+96-128(%rcx),%ymm13
vpaddq %ymm0,%ymm1,%ymm1
vpmuludq %ymm11,%ymm12,%ymm12
vmovdqu -8+128-128(%rcx),%ymm0
vpaddq %ymm12,%ymm2,%ymm2
vpmuludq %ymm11,%ymm13,%ymm13
vmovdqu -8+160-128(%rcx),%ymm12
vpaddq %ymm13,%ymm3,%ymm3
vpmuludq %ymm11,%ymm0,%ymm0
vmovdqu -8+192-128(%rcx),%ymm13
vpaddq %ymm0,%ymm4,%ymm4
vpmuludq %ymm11,%ymm12,%ymm12
vmovdqu -8+224-128(%rcx),%ymm0
vpaddq %ymm12,%ymm5,%ymm5
vpmuludq %ymm11,%ymm13,%ymm13
vmovdqu -8+256-128(%rcx),%ymm12
vpaddq %ymm13,%ymm6,%ymm6
vpmuludq %ymm11,%ymm0,%ymm0
vmovdqu -8+288-128(%rcx),%ymm13
vpaddq %ymm0,%ymm7,%ymm7
vpmuludq %ymm11,%ymm12,%ymm12
vpaddq %ymm12,%ymm8,%ymm8
vpmuludq %ymm11,%ymm13,%ymm13
vpaddq %ymm13,%ymm9,%ymm9
vmovdqu -16+32-128(%rsi),%ymm0
movq %rbx,%rax
imulq -128(%rsi),%rax
addq %r11,%rax
vmovdqu -16+64-128(%rsi),%ymm12
movq %rax,%r11
imull %r8d,%eax
andl $0x1fffffff,%eax
imulq 8-128(%rsi),%rbx
addq %rbx,%r12
vpmuludq %ymm10,%ymm0,%ymm0
vmovd %eax,%xmm11
vmovdqu -16+96-128(%rsi),%ymm13
vpaddq %ymm0,%ymm1,%ymm1
vpmuludq %ymm10,%ymm12,%ymm12
vpbroadcastq %xmm11,%ymm11
vmovdqu -16+128-128(%rsi),%ymm0
vpaddq %ymm12,%ymm2,%ymm2
vpmuludq %ymm10,%ymm13,%ymm13
vmovdqu -16+160-128(%rsi),%ymm12
vpaddq %ymm13,%ymm3,%ymm3
vpmuludq %ymm10,%ymm0,%ymm0
vmovdqu -16+192-128(%rsi),%ymm13
vpaddq %ymm0,%ymm4,%ymm4
vpmuludq %ymm10,%ymm12,%ymm12
vmovdqu -16+224-128(%rsi),%ymm0
vpaddq %ymm12,%ymm5,%ymm5
vpmuludq %ymm10,%ymm13,%ymm13
vmovdqu -16+256-128(%rsi),%ymm12
vpaddq %ymm13,%ymm6,%ymm6
vpmuludq %ymm10,%ymm0,%ymm0
vmovdqu -16+288-128(%rsi),%ymm13
vpaddq %ymm0,%ymm7,%ymm7
vpmuludq %ymm10,%ymm12,%ymm12
vpaddq %ymm12,%ymm8,%ymm8
vpmuludq %ymm10,%ymm13,%ymm13
vpbroadcastq 24(%r13),%ymm10
vpaddq %ymm13,%ymm9,%ymm9
vmovdqu -16+32-128(%rcx),%ymm0
movq %rax,%rdx
imulq -128(%rcx),%rax
addq %rax,%r11
vmovdqu -16+64-128(%rcx),%ymm12
imulq 8-128(%rcx),%rdx
addq %rdx,%r12
shrq $29,%r11
vpmuludq %ymm11,%ymm0,%ymm0
vmovq %xmm10,%rbx
vmovdqu -16+96-128(%rcx),%ymm13
vpaddq %ymm0,%ymm1,%ymm1
vpmuludq %ymm11,%ymm12,%ymm12
vmovdqu -16+128-128(%rcx),%ymm0
vpaddq %ymm12,%ymm2,%ymm2
vpmuludq %ymm11,%ymm13,%ymm13
vmovdqu -16+160-128(%rcx),%ymm12
vpaddq %ymm13,%ymm3,%ymm3
vpmuludq %ymm11,%ymm0,%ymm0
vmovdqu -16+192-128(%rcx),%ymm13
vpaddq %ymm0,%ymm4,%ymm4
vpmuludq %ymm11,%ymm12,%ymm12
vmovdqu -16+224-128(%rcx),%ymm0
vpaddq %ymm12,%ymm5,%ymm5
vpmuludq %ymm11,%ymm13,%ymm13
vmovdqu -16+256-128(%rcx),%ymm12
vpaddq %ymm13,%ymm6,%ymm6
vpmuludq %ymm11,%ymm0,%ymm0
vmovdqu -16+288-128(%rcx),%ymm13
vpaddq %ymm0,%ymm7,%ymm7
vpmuludq %ymm11,%ymm12,%ymm12
vmovdqu -24+32-128(%rsi),%ymm0
vpaddq %ymm12,%ymm8,%ymm8
vpmuludq %ymm11,%ymm13,%ymm13
vmovdqu -24+64-128(%rsi),%ymm12
vpaddq %ymm13,%ymm9,%ymm9
addq %r11,%r12
imulq -128(%rsi),%rbx
addq %rbx,%r12
movq %r12,%rax
imull %r8d,%eax
andl $0x1fffffff,%eax
vpmuludq %ymm10,%ymm0,%ymm0
vmovd %eax,%xmm11
vmovdqu -24+96-128(%rsi),%ymm13
vpaddq %ymm0,%ymm1,%ymm1
vpmuludq %ymm10,%ymm12,%ymm12
vpbroadcastq %xmm11,%ymm11
vmovdqu -24+128-128(%rsi),%ymm0
vpaddq %ymm12,%ymm2,%ymm2
vpmuludq %ymm10,%ymm13,%ymm13
vmovdqu -24+160-128(%rsi),%ymm12
vpaddq %ymm13,%ymm3,%ymm3
vpmuludq %ymm10,%ymm0,%ymm0
vmovdqu -24+192-128(%rsi),%ymm13
vpaddq %ymm0,%ymm4,%ymm4
vpmuludq %ymm10,%ymm12,%ymm12
vmovdqu -24+224-128(%rsi),%ymm0
vpaddq %ymm12,%ymm5,%ymm5
vpmuludq %ymm10,%ymm13,%ymm13
vmovdqu -24+256-128(%rsi),%ymm12
vpaddq %ymm13,%ymm6,%ymm6
vpmuludq %ymm10,%ymm0,%ymm0
vmovdqu -24+288-128(%rsi),%ymm13
vpaddq %ymm0,%ymm7,%ymm7
vpmuludq %ymm10,%ymm12,%ymm12
vpaddq %ymm12,%ymm8,%ymm8
vpmuludq %ymm10,%ymm13,%ymm13
vpbroadcastq 32(%r13),%ymm10
vpaddq %ymm13,%ymm9,%ymm9
addq $32,%r13
vmovdqu -24+32-128(%rcx),%ymm0
imulq -128(%rcx),%rax
addq %rax,%r12
shrq $29,%r12
vmovdqu -24+64-128(%rcx),%ymm12
vpmuludq %ymm11,%ymm0,%ymm0
vmovq %xmm10,%rbx
vmovdqu -24+96-128(%rcx),%ymm13
vpaddq %ymm0,%ymm1,%ymm0
vpmuludq %ymm11,%ymm12,%ymm12
vmovdqu %ymm0,(%rsp)
vpaddq %ymm12,%ymm2,%ymm1
vmovdqu -24+128-128(%rcx),%ymm0
vpmuludq %ymm11,%ymm13,%ymm13
vmovdqu -24+160-128(%rcx),%ymm12
vpaddq %ymm13,%ymm3,%ymm2
vpmuludq %ymm11,%ymm0,%ymm0
vmovdqu -24+192-128(%rcx),%ymm13
vpaddq %ymm0,%ymm4,%ymm3
vpmuludq %ymm11,%ymm12,%ymm12
vmovdqu -24+224-128(%rcx),%ymm0
vpaddq %ymm12,%ymm5,%ymm4
vpmuludq %ymm11,%ymm13,%ymm13
vmovdqu -24+256-128(%rcx),%ymm12
vpaddq %ymm13,%ymm6,%ymm5
vpmuludq %ymm11,%ymm0,%ymm0
vmovdqu -24+288-128(%rcx),%ymm13
movq %r12,%r9
vpaddq %ymm0,%ymm7,%ymm6
vpmuludq %ymm11,%ymm12,%ymm12
addq (%rsp),%r9
vpaddq %ymm12,%ymm8,%ymm7
vpmuludq %ymm11,%ymm13,%ymm13
vmovq %r12,%xmm12
vpaddq %ymm13,%ymm9,%ymm8
decl %r14d
jnz .Lrsaz_oop_mul_1024
vpaddq (%rsp),%ymm12,%ymm0
vpsrlq $29,%ymm0,%ymm12
vpand %ymm15,%ymm0,%ymm0
vpsrlq $29,%ymm1,%ymm13
vpand %ymm15,%ymm1,%ymm1
vpsrlq $29,%ymm2,%ymm10
vpermq $0x93,%ymm12,%ymm12
vpand %ymm15,%ymm2,%ymm2
vpsrlq $29,%ymm3,%ymm11
vpermq $0x93,%ymm13,%ymm13
vpand %ymm15,%ymm3,%ymm3
vpblendd $3,%ymm14,%ymm12,%ymm9
vpermq $0x93,%ymm10,%ymm10
vpblendd $3,%ymm12,%ymm13,%ymm12
vpermq $0x93,%ymm11,%ymm11
vpaddq %ymm9,%ymm0,%ymm0
vpblendd $3,%ymm13,%ymm10,%ymm13
vpaddq %ymm12,%ymm1,%ymm1
vpblendd $3,%ymm10,%ymm11,%ymm10
vpaddq %ymm13,%ymm2,%ymm2
vpblendd $3,%ymm11,%ymm14,%ymm11
vpaddq %ymm10,%ymm3,%ymm3
vpaddq %ymm11,%ymm4,%ymm4
vpsrlq $29,%ymm0,%ymm12
vpand %ymm15,%ymm0,%ymm0
vpsrlq $29,%ymm1,%ymm13
vpand %ymm15,%ymm1,%ymm1
vpsrlq $29,%ymm2,%ymm10
vpermq $0x93,%ymm12,%ymm12
vpand %ymm15,%ymm2,%ymm2
vpsrlq $29,%ymm3,%ymm11
vpermq $0x93,%ymm13,%ymm13
vpand %ymm15,%ymm3,%ymm3
vpermq $0x93,%ymm10,%ymm10
vpblendd $3,%ymm14,%ymm12,%ymm9
vpermq $0x93,%ymm11,%ymm11
vpblendd $3,%ymm12,%ymm13,%ymm12
vpaddq %ymm9,%ymm0,%ymm0
vpblendd $3,%ymm13,%ymm10,%ymm13
vpaddq %ymm12,%ymm1,%ymm1
vpblendd $3,%ymm10,%ymm11,%ymm10
vpaddq %ymm13,%ymm2,%ymm2
vpblendd $3,%ymm11,%ymm14,%ymm11
vpaddq %ymm10,%ymm3,%ymm3
vpaddq %ymm11,%ymm4,%ymm4
vmovdqu %ymm0,0-128(%rdi)
vmovdqu %ymm1,32-128(%rdi)
vmovdqu %ymm2,64-128(%rdi)
vmovdqu %ymm3,96-128(%rdi)
vpsrlq $29,%ymm4,%ymm12
vpand %ymm15,%ymm4,%ymm4
vpsrlq $29,%ymm5,%ymm13
vpand %ymm15,%ymm5,%ymm5
vpsrlq $29,%ymm6,%ymm10
vpermq $0x93,%ymm12,%ymm12
vpand %ymm15,%ymm6,%ymm6
vpsrlq $29,%ymm7,%ymm11
vpermq $0x93,%ymm13,%ymm13
vpand %ymm15,%ymm7,%ymm7
vpsrlq $29,%ymm8,%ymm0
vpermq $0x93,%ymm10,%ymm10
vpand %ymm15,%ymm8,%ymm8
vpermq $0x93,%ymm11,%ymm11
vpblendd $3,%ymm14,%ymm12,%ymm9
vpermq $0x93,%ymm0,%ymm0
vpblendd $3,%ymm12,%ymm13,%ymm12
vpaddq %ymm9,%ymm4,%ymm4
vpblendd $3,%ymm13,%ymm10,%ymm13
vpaddq %ymm12,%ymm5,%ymm5
vpblendd $3,%ymm10,%ymm11,%ymm10
vpaddq %ymm13,%ymm6,%ymm6
vpblendd $3,%ymm11,%ymm0,%ymm11
vpaddq %ymm10,%ymm7,%ymm7
vpaddq %ymm11,%ymm8,%ymm8
vpsrlq $29,%ymm4,%ymm12
vpand %ymm15,%ymm4,%ymm4
vpsrlq $29,%ymm5,%ymm13
vpand %ymm15,%ymm5,%ymm5
vpsrlq $29,%ymm6,%ymm10
vpermq $0x93,%ymm12,%ymm12
vpand %ymm15,%ymm6,%ymm6
vpsrlq $29,%ymm7,%ymm11
vpermq $0x93,%ymm13,%ymm13
vpand %ymm15,%ymm7,%ymm7
vpsrlq $29,%ymm8,%ymm0
vpermq $0x93,%ymm10,%ymm10
vpand %ymm15,%ymm8,%ymm8
vpermq $0x93,%ymm11,%ymm11
vpblendd $3,%ymm14,%ymm12,%ymm9
vpermq $0x93,%ymm0,%ymm0
vpblendd $3,%ymm12,%ymm13,%ymm12
vpaddq %ymm9,%ymm4,%ymm4
vpblendd $3,%ymm13,%ymm10,%ymm13
vpaddq %ymm12,%ymm5,%ymm5
vpblendd $3,%ymm10,%ymm11,%ymm10
vpaddq %ymm13,%ymm6,%ymm6
vpblendd $3,%ymm11,%ymm0,%ymm11
vpaddq %ymm10,%ymm7,%ymm7
vpaddq %ymm11,%ymm8,%ymm8
vmovdqu %ymm4,128-128(%rdi)
vmovdqu %ymm5,160-128(%rdi)
vmovdqu %ymm6,192-128(%rdi)
vmovdqu %ymm7,224-128(%rdi)
vmovdqu %ymm8,256-128(%rdi)
vzeroupper
movq %rbp,%rax
.cfi_def_cfa_register %rax
movq -48(%rax),%r15
.cfi_restore %r15
movq -40(%rax),%r14
.cfi_restore %r14
movq -32(%rax),%r13
.cfi_restore %r13
movq -24(%rax),%r12
.cfi_restore %r12
movq -16(%rax),%rbp
.cfi_restore %rbp
movq -8(%rax),%rbx
.cfi_restore %rbx
leaq (%rax),%rsp
.cfi_def_cfa_register %rsp
.Lrsaz_mul_1024_epilogue:
.byte 0xf3,0xc3
.cfi_endproc