/*
 * Copyright (C) 2025 - 2026, Stephan Mueller <smueller@chronox.de>
 *
 * License: see LICENSE file in root directory
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
 * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 */
/*
 * This code is derived in parts from
+-----------------------------------------------------------------------------+
| This code corresponds to the the paper "Efficient 4-way Vectorizations of   |
| the Montgomery Ladder" authored by   			       	       	      |
| Kaushik Nath,  Indian Statistical Institute, Kolkata, India, and            |
| Palash Sarkar, Indian Statistical Institute, Kolkata, India.	              |
+-----------------------------------------------------------------------------+
| Copyright (c) 2020, Kaushik Nath and Palash Sarkar.                         |
|                                                                             |
| Permission to use this code is granted.                          	      |
|                                                                             |
| Redistribution and use in source and binary forms, with or without          |
| modification, are permitted provided that the following conditions are      |
| met:                                                                        |
|                                                                             |
| * Redistributions of source code must retain the above copyright notice,    |
|   this list of conditions and the following disclaimer.                     |
|                                                                             |
| * Redistributions in binary form must reproduce the above copyright         |
|   notice, this list of conditions and the following disclaimer in the       |
|   documentation and/or other materials provided with the distribution.      |
|                                                                             |
| * The names of the contributors may not be used to endorse or promote       |
|   products derived from this software without specific prior written        |
|   permission.                                                               |
+-----------------------------------------------------------------------------+
| THIS SOFTWARE IS PROVIDED BY THE AUTHORS ""AS IS"" AND ANY EXPRESS OR       |
| IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES   |
| OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.     |
| IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,      |
| INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT    |
| NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,   |
| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY       |
| THEORY LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
| NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,| 
| EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                          |
+-----------------------------------------------------------------------------+
*/

#include "assembler_support.h"

.p2align 5

STACK_FRAME_NON_STANDARD(curve448_mladder_base_avx2)
SYM_FUNC_START(curve448_mladder_base_avx2)
SYM_FUNC_ENTER(curve448_mladder_base_avx2)

movq 	  %rsp,%r11
andq 	  $-32,%rsp
subq 	  $2176,%rsp

movq 	  %r11,0(%rsp)
movq 	  %r12,8(%rsp)
movq 	  %r13,16(%rsp)
movq 	  %r14,24(%rsp)
movq 	  %r15,32(%rsp)
movq 	  %rbx,40(%rsp)
movq 	  %rbp,48(%rsp) 

// load <X2,Z2,X3,Z3>
vmovdqa   0(%rdi),  %ymm8
vmovdqa   32(%rdi), %ymm9
vmovdqa   64(%rdi), %ymm10
vmovdqa   96(%rdi), %ymm11
vmovdqa   128(%rdi),%ymm12
vmovdqa   160(%rdi),%ymm13
vmovdqa   192(%rdi),%ymm14
vmovdqa   224(%rdi),%ymm15
vmovdqa   256(%rdi),%ymm0
vmovdqa   288(%rdi),%ymm1
vmovdqa   320(%rdi),%ymm2
vmovdqa   352(%rdi),%ymm3
vmovdqa   384(%rdi),%ymm4
vmovdqa   416(%rdi),%ymm5
vmovdqa   448(%rdi),%ymm6
vmovdqa   480(%rdi),%ymm7

// <X2',Z2',X3',Z3'> ← Pack-N2D(<X2,Z2,X3,Z3>)
vpsllq    $32,%ymm0,%ymm0
vpor      %ymm0,%ymm8,%ymm8
vpsllq    $32,%ymm1,%ymm1
vpor      %ymm1,%ymm9,%ymm9
vpsllq    $32,%ymm2,%ymm2
vpor      %ymm2,%ymm10,%ymm10
vpsllq    $32,%ymm3,%ymm3
vpor      %ymm3,%ymm11,%ymm11
vpsllq    $32,%ymm4,%ymm4
vpor      %ymm4,%ymm12,%ymm12
vpsllq    $32,%ymm5,%ymm5
vpor      %ymm5,%ymm13,%ymm13
vpsllq    $32,%ymm6,%ymm6
vpor      %ymm6,%ymm14,%ymm14
vpsllq    $32,%ymm7,%ymm7
vpor      %ymm7,%ymm15,%ymm15

movq      $55,%r15
movq	  $7,%rcx

movb      $0, %r8b 
movq      %rdx,%rax

.L1_base:
addq      %r15,%rax
movb      0(%rax),%r14b
movq      %rdx,%rax

.L2_base:
movb	  %r14b,%bl
shrb      %cl,%bl
andb      $1,%bl

movb      %bl,%r9b
xorb      %r8b,%bl
movb      %r9b,%r8b

// <X2',Z2',X3',Z3'> ← Dense-Swap(<X2',Z2',X3',Z3'>,b)
movzbl    %bl,%ebx
imul	  $4,%ebx,%ebx
movl      %ebx,56(%rsp)
vpbroadcastd 56(%rsp),%ymm1
vmovdqa   swap_c(%rip), %ymm0
vpaddd	  %ymm0,%ymm1,%ymm1
vmovdqa   swap_mask(%rip), %ymm0
vpand     %ymm0,%ymm1,%ymm1

vpermd	  %ymm8,%ymm1,%ymm8
vpermd	  %ymm9,%ymm1,%ymm9
vpermd	  %ymm10,%ymm1,%ymm10
vpermd	  %ymm11,%ymm1,%ymm11
vpermd	  %ymm12,%ymm1,%ymm12
vpermd	  %ymm13,%ymm1,%ymm13
vpermd	  %ymm14,%ymm1,%ymm14
vpermd	  %ymm15,%ymm1,%ymm15

// <T1',T2',T4',T3'> ← Dense-H-H1(<X2',Z2',X3',Z3'>)
vpshufd	  $68,%ymm8,%ymm1
vpshufd	  $238,%ymm8,%ymm3
vmovdqa   hh1_p1(%rip), %ymm0
vpaddd    %ymm0,%ymm1,%ymm1
vmovdqa   hh1_xor(%rip), %ymm2
vpxor     %ymm2,%ymm3,%ymm3
vpaddd    %ymm1,%ymm3,%ymm8

vpshufd	  $68,%ymm9,%ymm1
vpshufd	  $238,%ymm9,%ymm3
vmovdqa   hh1_p2(%rip), %ymm0
vpaddd    %ymm0,%ymm1,%ymm1
vpxor     %ymm2,%ymm3,%ymm3
vpaddd    %ymm1,%ymm3,%ymm9

vpshufd	  $68,%ymm10,%ymm1
vpshufd	  $238,%ymm10,%ymm3
vpaddd    %ymm0,%ymm1,%ymm1
vpxor     %ymm2,%ymm3,%ymm3
vpaddd    %ymm1,%ymm3,%ymm10

vpshufd	  $68,%ymm11,%ymm1
vpshufd	  $238,%ymm11,%ymm3
vpaddd    %ymm0,%ymm1,%ymm1
vpxor     %ymm2,%ymm3,%ymm3
vpaddd    %ymm1,%ymm3,%ymm11

vpshufd	  $68,%ymm12,%ymm1
vpshufd	  $238,%ymm12,%ymm3
vpaddd    %ymm0,%ymm1,%ymm1
vpxor     %ymm2,%ymm3,%ymm3
vpaddd    %ymm1,%ymm3,%ymm12

vpshufd	  $68,%ymm13,%ymm1
vpshufd	  $238,%ymm13,%ymm3
vpaddd    %ymm0,%ymm1,%ymm1
vpxor     %ymm2,%ymm3,%ymm3
vpaddd    %ymm1,%ymm3,%ymm13

vpshufd	  $68,%ymm14,%ymm1
vpshufd	  $238,%ymm14,%ymm3
vpaddd    %ymm0,%ymm1,%ymm1
vpxor     %ymm2,%ymm3,%ymm3
vpaddd    %ymm1,%ymm3,%ymm14

vpshufd	  $68,%ymm15,%ymm1
vpshufd	  $238,%ymm15,%ymm3
vpaddd    %ymm0,%ymm1,%ymm1
vpxor     %ymm2,%ymm3,%ymm3
vpaddd    %ymm1,%ymm3,%ymm15

vpsrld    $28,%ymm8,%ymm1
vpaddd    %ymm1,%ymm9,%ymm9
vmovdqa   vecmask28d(%rip), %ymm0
vpand     %ymm0,%ymm8,%ymm8

vpsrld    $28,%ymm9,%ymm1
vpaddd    %ymm1,%ymm10,%ymm10
vpand     %ymm0,%ymm9,%ymm9

vpsrld    $28,%ymm10,%ymm1
vpaddd    %ymm1,%ymm11,%ymm11
vpand     %ymm0,%ymm10,%ymm10

vpsrld    $28,%ymm11,%ymm1
vpaddd    %ymm1,%ymm12,%ymm12
vpand     %ymm0,%ymm11,%ymm11

vpsrld    $28,%ymm12,%ymm1
vpaddd    %ymm1,%ymm13,%ymm13
vpand     %ymm0,%ymm12,%ymm12

vpsrld    $28,%ymm13,%ymm1
vpaddd    %ymm1,%ymm14,%ymm14
vpand     %ymm0,%ymm13,%ymm13

vpsrld    $28,%ymm14,%ymm1
vpaddd    %ymm1,%ymm15,%ymm15
vpand     %ymm0,%ymm14,%ymm14

// <T1',T2',T1',T2'> ← Dense-Dup(<T1',T2',T4',T3'>)
vpermq	  $68,%ymm8,%ymm0
vpermq	  $68,%ymm9,%ymm1
vpermq	  $68,%ymm10,%ymm2
vpermq	  $68,%ymm11,%ymm3
vpermq	  $68,%ymm12,%ymm4
vpermq	  $68,%ymm13,%ymm5
vpermq	  $68,%ymm14,%ymm6
vpermq	  $68,%ymm15,%ymm7

// <T1,T2,T1,T2> ← Pack-D2N(<T1',T2',T1',T2'>)
vmovdqa   %ymm8,64(%rsp)

vmovdqa   %ymm0,192(%rsp)
vpsrlq    $32,%ymm0,%ymm8
vmovdqa   %ymm8,448(%rsp)

vmovdqa   %ymm1,224(%rsp)
vpsrlq    $32,%ymm1,%ymm8
vmovdqa   %ymm8,480(%rsp)

vmovdqa   %ymm2,256(%rsp)
vpsrlq    $32,%ymm2,%ymm8
vmovdqa   %ymm8,512(%rsp)

vmovdqa   %ymm3,288(%rsp)
vpsrlq    $32,%ymm3,%ymm8
vmovdqa   %ymm8,544(%rsp)

vmovdqa   %ymm4,320(%rsp)
vpsrlq    $32,%ymm4,%ymm8
vmovdqa   %ymm8,576(%rsp)

vmovdqa   %ymm5,352(%rsp)
vpsrlq    $32,%ymm5,%ymm8
vmovdqa   %ymm8,608(%rsp)

vmovdqa   %ymm6,384(%rsp)
vpsrlq    $32,%ymm6,%ymm8
vmovdqa   %ymm8,640(%rsp)

vmovdqa   %ymm7,416(%rsp)
vpsrlq    $32,%ymm7,%ymm8
vmovdqa   %ymm8,672(%rsp)

vmovdqa   64(%rsp),%ymm8

// <T1,T2,T4,T3> ← Pack-D2N(<T1',T2',T4',T3'>)
vpsrlq    $32,%ymm8,%ymm0
vpsrlq    $32,%ymm9,%ymm1
vpsrlq    $32,%ymm10,%ymm2
vpsrlq    $32,%ymm11,%ymm3
vpsrlq    $32,%ymm12,%ymm4
vpsrlq    $32,%ymm13,%ymm5
vpsrlq    $32,%ymm14,%ymm6
vpsrlq    $32,%ymm15,%ymm7

// <T5,T6,T7,T8> ← Mul(<T1,T2,T4,T3>,<T1,T2,T1,T2>)
vmovdqa   %ymm14,64(%rsp)
vmovdqa   %ymm15,96(%rsp)
vmovdqa   %ymm0,128(%rsp)
vmovdqa   %ymm1,160(%rsp)

vpmuludq  448(%rsp),%ymm0,%ymm15
vmovdqa   %ymm15,704(%rsp)

vpmuludq  480(%rsp),%ymm0,%ymm15
vpmuludq  448(%rsp),%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,736(%rsp)

vpmuludq  512(%rsp),%ymm0,%ymm15
vpmuludq  480(%rsp),%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  448(%rsp),%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,768(%rsp)

vpmuludq  544(%rsp),%ymm0,%ymm15
vpmuludq  512(%rsp),%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  480(%rsp),%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  448(%rsp),%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,800(%rsp)

vpmuludq  576(%rsp),%ymm0,%ymm15
vpmuludq  544(%rsp),%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  512(%rsp),%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  480(%rsp),%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  448(%rsp),%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,832(%rsp)

vpmuludq  608(%rsp),%ymm0,%ymm15
vpmuludq  576(%rsp),%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  544(%rsp),%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  512(%rsp),%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  480(%rsp),%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  448(%rsp),%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,864(%rsp)

vpmuludq  640(%rsp),%ymm0,%ymm15
vpmuludq  608(%rsp),%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  576(%rsp),%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  544(%rsp),%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  512(%rsp),%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  480(%rsp),%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  448(%rsp),%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,896(%rsp)

vpmuludq  672(%rsp),%ymm0,%ymm15
vpmuludq  640(%rsp),%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  608(%rsp),%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  576(%rsp),%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  544(%rsp),%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  512(%rsp),%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  480(%rsp),%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  448(%rsp),%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,928(%rsp)

vpmuludq  672(%rsp),%ymm1,%ymm15
vpmuludq  640(%rsp),%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  608(%rsp),%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  576(%rsp),%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  544(%rsp),%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  512(%rsp),%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  480(%rsp),%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,960(%rsp)

vpmuludq  672(%rsp),%ymm2,%ymm15
vpmuludq  640(%rsp),%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  608(%rsp),%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  576(%rsp),%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  544(%rsp),%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  512(%rsp),%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,992(%rsp)

vpmuludq  672(%rsp),%ymm3,%ymm15
vpmuludq  640(%rsp),%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  608(%rsp),%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  576(%rsp),%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  544(%rsp),%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,1024(%rsp)

vpmuludq  672(%rsp),%ymm4,%ymm15
vpmuludq  640(%rsp),%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  608(%rsp),%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  576(%rsp),%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,1056(%rsp)

vpmuludq  672(%rsp),%ymm5,%ymm15
vpmuludq  640(%rsp),%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  608(%rsp),%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,1088(%rsp)

vpmuludq  672(%rsp),%ymm6,%ymm15
vpmuludq  640(%rsp),%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,1120(%rsp)

vpmuludq  672(%rsp),%ymm7,%ymm15
vmovdqa   %ymm15,1152(%rsp)

vmovdqa   64(%rsp),%ymm14
vmovdqa   96(%rsp),%ymm15

vpmuludq  192(%rsp),%ymm8,%ymm1
vmovdqa   %ymm1,1184(%rsp)
vpaddq    704(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,704(%rsp)

vpmuludq  224(%rsp),%ymm8,%ymm1
vpmuludq  192(%rsp),%ymm9,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1216(%rsp)
vpaddq    736(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,736(%rsp)

vpmuludq  256(%rsp),%ymm8,%ymm1
vpmuludq  224(%rsp),%ymm9,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  192(%rsp),%ymm10,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1248(%rsp)
vpaddq    768(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,768(%rsp)

vpmuludq  288(%rsp),%ymm8,%ymm1
vpmuludq  256(%rsp),%ymm9,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  224(%rsp),%ymm10,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  192(%rsp),%ymm11,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1280(%rsp)
vpaddq    800(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,800(%rsp)

vpmuludq  320(%rsp),%ymm8,%ymm1
vpmuludq  288(%rsp),%ymm9,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  256(%rsp),%ymm10,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  224(%rsp),%ymm11,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  192(%rsp),%ymm12,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1312(%rsp)
vpaddq    832(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,832(%rsp)

vpmuludq  352(%rsp),%ymm8,%ymm1
vpmuludq  320(%rsp),%ymm9,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  288(%rsp),%ymm10,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  256(%rsp),%ymm11,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  224(%rsp),%ymm12,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  192(%rsp),%ymm13,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1344(%rsp)
vpaddq    864(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,864(%rsp)

vpmuludq  384(%rsp),%ymm8,%ymm1
vpmuludq  352(%rsp),%ymm9,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  320(%rsp),%ymm10,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  288(%rsp),%ymm11,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  256(%rsp),%ymm12,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  224(%rsp),%ymm13,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  192(%rsp),%ymm14,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1376(%rsp)
vpaddq    896(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,896(%rsp)

vpmuludq  416(%rsp),%ymm8,%ymm1
vpmuludq  384(%rsp),%ymm9,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  352(%rsp),%ymm10,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  320(%rsp),%ymm11,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  288(%rsp),%ymm12,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  256(%rsp),%ymm13,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  224(%rsp),%ymm14,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  192(%rsp),%ymm15,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1408(%rsp)
vpaddq    928(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,928(%rsp)

vpmuludq  416(%rsp),%ymm9,%ymm1
vpmuludq  384(%rsp),%ymm10,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  352(%rsp),%ymm11,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  320(%rsp),%ymm12,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  288(%rsp),%ymm13,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  256(%rsp),%ymm14,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  224(%rsp),%ymm15,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1440(%rsp)
vpaddq    960(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,960(%rsp)

vpmuludq  416(%rsp),%ymm10,%ymm1
vpmuludq  384(%rsp),%ymm11,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  352(%rsp),%ymm12,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  320(%rsp),%ymm13,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  288(%rsp),%ymm14,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  256(%rsp),%ymm15,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1472(%rsp)
vpaddq    992(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,992(%rsp)

vpmuludq  416(%rsp),%ymm11,%ymm1
vpmuludq  384(%rsp),%ymm12,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  352(%rsp),%ymm13,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  320(%rsp),%ymm14,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  288(%rsp),%ymm15,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1504(%rsp)
vpaddq    1024(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,1024(%rsp)

vpmuludq  416(%rsp),%ymm12,%ymm1
vpmuludq  384(%rsp),%ymm13,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  352(%rsp),%ymm14,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  320(%rsp),%ymm15,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1536(%rsp)
vpaddq    1056(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,1056(%rsp)

vpmuludq  416(%rsp),%ymm13,%ymm1
vpmuludq  384(%rsp),%ymm14,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  352(%rsp),%ymm15,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1568(%rsp)
vpaddq    1088(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,1088(%rsp)

vpmuludq  416(%rsp),%ymm14,%ymm1
vpmuludq  384(%rsp),%ymm15,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1600(%rsp)
vpaddq    1120(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,1120(%rsp)

vpmuludq  416(%rsp),%ymm15,%ymm1
vmovdqa   %ymm1,1632(%rsp)
vpaddq    1152(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,1152(%rsp)

vpaddq    128(%rsp),%ymm8,%ymm8
vpaddq    160(%rsp),%ymm9,%ymm9
vpaddq    %ymm2,%ymm10,%ymm10
vpaddq    %ymm3,%ymm11,%ymm11
vpaddq    %ymm4,%ymm12,%ymm12
vpaddq    %ymm5,%ymm13,%ymm13
vpaddq    %ymm6,%ymm14,%ymm14
vpaddq    %ymm7,%ymm15,%ymm15

vmovdqa   %ymm14,1664(%rsp)
vmovdqa   %ymm15,1696(%rsp)

vmovdqa   192(%rsp),%ymm0
vmovdqa   224(%rsp),%ymm1
vmovdqa   256(%rsp),%ymm2
vmovdqa   288(%rsp),%ymm3
vmovdqa   320(%rsp),%ymm4
vmovdqa   352(%rsp),%ymm5
vmovdqa   384(%rsp),%ymm6
vmovdqa   416(%rsp),%ymm7

vpaddq    448(%rsp),%ymm0,%ymm0
vpaddq    480(%rsp),%ymm1,%ymm1
vpaddq    512(%rsp),%ymm2,%ymm2
vpaddq    544(%rsp),%ymm3,%ymm3
vpaddq    576(%rsp),%ymm4,%ymm4
vpaddq    608(%rsp),%ymm5,%ymm5
vpaddq    640(%rsp),%ymm6,%ymm6
vpaddq    672(%rsp),%ymm7,%ymm7

vpmuludq  %ymm8,%ymm0,%ymm15
vmovdqa   %ymm15,1728(%rsp)

vpmuludq  %ymm9,%ymm0,%ymm15
vpmuludq  %ymm8,%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,1760(%rsp)

vpmuludq  %ymm10,%ymm0,%ymm15
vpmuludq  %ymm9,%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm8,%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,1792(%rsp)

vpmuludq  %ymm11,%ymm0,%ymm15
vpmuludq  %ymm10,%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm9,%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm8,%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,1824(%rsp)

vpmuludq  %ymm12,%ymm0,%ymm15
vpmuludq  %ymm11,%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm10,%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm9,%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm8,%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,1856(%rsp)

vpmuludq  %ymm13,%ymm0,%ymm15
vpmuludq  %ymm12,%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm11,%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm10,%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm9,%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm8,%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,1888(%rsp)

vpmuludq  1664(%rsp),%ymm0,%ymm15
vpmuludq  %ymm13,%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm12,%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm11,%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm10,%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm9,%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm8,%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,1920(%rsp)

vpmuludq  1696(%rsp),%ymm0,%ymm15
vpmuludq  1664(%rsp),%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm13,%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm12,%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm11,%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm10,%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm9,%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm8,%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm8

vpmuludq  1696(%rsp),%ymm1,%ymm15
vpmuludq  1664(%rsp),%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm13,%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm12,%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm11,%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm10,%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm9,%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm9

vpmuludq  1696(%rsp),%ymm2,%ymm15
vpmuludq  1664(%rsp),%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm13,%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm12,%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm11,%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm10,%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm10

vpmuludq  1696(%rsp),%ymm3,%ymm15
vpmuludq  1664(%rsp),%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm13,%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm12,%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm11,%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm11

vpmuludq  1696(%rsp),%ymm4,%ymm15
vpmuludq  1664(%rsp),%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm13,%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm12,%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm12

vpmuludq  1696(%rsp),%ymm5,%ymm15
vpmuludq  1664(%rsp),%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm13,%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm13

vpmuludq  1696(%rsp),%ymm6,%ymm15
vpmuludq  1664(%rsp),%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm14

vpmuludq  1696(%rsp),%ymm7,%ymm15

vmovdqa   1728(%rsp),%ymm0
vmovdqa   1760(%rsp),%ymm1
vmovdqa   1792(%rsp),%ymm2
vmovdqa   1824(%rsp),%ymm3
vmovdqa   1856(%rsp),%ymm4
vmovdqa   1888(%rsp),%ymm5
vmovdqa   1920(%rsp),%ymm6

vpsubq    1184(%rsp),%ymm0,%ymm0
vpsubq    1216(%rsp),%ymm1,%ymm1
vpsubq    1248(%rsp),%ymm2,%ymm2
vpsubq    1280(%rsp),%ymm3,%ymm3
vpsubq    1312(%rsp),%ymm4,%ymm4
vpsubq    1344(%rsp),%ymm5,%ymm5
vpsubq    1376(%rsp),%ymm6,%ymm6
vpsubq    1408(%rsp),%ymm8,%ymm8
vpsubq    1440(%rsp),%ymm9,%ymm9
vpsubq    1472(%rsp),%ymm10,%ymm10
vpsubq    1504(%rsp),%ymm11,%ymm11
vpsubq    1536(%rsp),%ymm12,%ymm12
vpsubq    1568(%rsp),%ymm13,%ymm13
vpsubq    1600(%rsp),%ymm14,%ymm14
vpsubq    1632(%rsp),%ymm15,%ymm15

vpaddq    960(%rsp),%ymm0,%ymm0
vpaddq    992(%rsp),%ymm1,%ymm1
vpaddq    1024(%rsp),%ymm2,%ymm2
vpaddq    1056(%rsp),%ymm3,%ymm3
vpaddq    1088(%rsp),%ymm4,%ymm4
vpaddq    1120(%rsp),%ymm5,%ymm5
vpaddq    1152(%rsp),%ymm6,%ymm6

vpaddq    %ymm9,%ymm0,%ymm0
vpaddq    %ymm10,%ymm1,%ymm1
vpaddq    %ymm11,%ymm2,%ymm2
vpaddq    %ymm12,%ymm3,%ymm3
vpaddq    %ymm13,%ymm4,%ymm4
vpaddq    %ymm14,%ymm5,%ymm5
vpaddq    %ymm15,%ymm6,%ymm6

vpaddq    704(%rsp),%ymm9,%ymm9
vpaddq    736(%rsp),%ymm10,%ymm10
vpaddq    768(%rsp),%ymm11,%ymm11
vpaddq    800(%rsp),%ymm12,%ymm12
vpaddq    832(%rsp),%ymm13,%ymm13
vpaddq    864(%rsp),%ymm14,%ymm14
vpaddq    896(%rsp),%ymm15,%ymm15

vmovdqa   %ymm8,64(%rsp)

vpsrlq    $28,%ymm9,%ymm7
vpaddq    %ymm7,%ymm10,%ymm10
vmovdqa   vecmask28(%rip), %ymm8
vpand     %ymm8,%ymm9,%ymm8
vmovdqa   %ymm8, 704(%rsp)	#Temorarily store ymm8 to load vecmask28
vmovdqa   vecmask28(%rip), %ymm8

vpsrlq    $28,%ymm0,%ymm7
vpaddq    %ymm7,%ymm1,%ymm1
vpand     %ymm8,%ymm0,%ymm0

vpsrlq    $28,%ymm10,%ymm7
vpaddq    %ymm7,%ymm11,%ymm11
vpand     %ymm8,%ymm10,%ymm9

vpsrlq    $28,%ymm1,%ymm7
vpaddq    %ymm7,%ymm2,%ymm2
vpand     %ymm8,%ymm1,%ymm1

vpsrlq    $28,%ymm11,%ymm7
vpaddq    %ymm7,%ymm12,%ymm12
vpand     %ymm8,%ymm11,%ymm10

vpsrlq    $28,%ymm2,%ymm7
vpaddq    %ymm7,%ymm3,%ymm3
vpand     %ymm8,%ymm2,%ymm2

vpsrlq    $28,%ymm12,%ymm7
vpaddq    %ymm7,%ymm13,%ymm13
vpand     %ymm8,%ymm12,%ymm11

vpsrlq    $28,%ymm3,%ymm7
vpaddq    %ymm7,%ymm4,%ymm4
vpand     %ymm8,%ymm3,%ymm3

vpsrlq    $28,%ymm13,%ymm7
vpaddq    %ymm7,%ymm14,%ymm14
vpand     %ymm8,%ymm13,%ymm12

vpsrlq    $28,%ymm4,%ymm7
vpaddq    %ymm7,%ymm5,%ymm5
vpand     %ymm8,%ymm4,%ymm4

vpsrlq    $28,%ymm14,%ymm7
vpaddq    %ymm7,%ymm15,%ymm15
vpand     %ymm8,%ymm14,%ymm13

vpsrlq    $28,%ymm5,%ymm7
vpaddq    %ymm7,%ymm6,%ymm6
vpand     %ymm8,%ymm5,%ymm5

vmovdqa   %ymm10,768(%rsp)
vpsrlq    $28,%ymm15,%ymm10
vpaddq    928(%rsp),%ymm10,%ymm10
vpand     %ymm8,%ymm15,%ymm14

vpsrlq    $28,%ymm6,%ymm7
vpaddq    64(%rsp),%ymm7,%ymm7
vpand     %ymm8,%ymm6,%ymm6

vmovdqa   %ymm11,800(%rsp)
vpsrlq    $28,%ymm10,%ymm11
vpaddq    %ymm11,%ymm0,%ymm0
vpand     %ymm8,%ymm10,%ymm15
vmovdqa   %ymm15,928(%rsp)	#Store %ymm15

vpsrlq    $28,%ymm7,%ymm11
vmovdqa   704(%rsp), %ymm8     # Restore
vpaddq    %ymm11,%ymm8,%ymm8
vpaddq    %ymm11,%ymm0,%ymm0
vmovdqa   vecmask28(%rip), %ymm15
vpand     %ymm15,%ymm7,%ymm7

vpsrlq    $28,%ymm8,%ymm11
vpaddq    %ymm11,%ymm9,%ymm9
vpand     %ymm15,%ymm8,%ymm8

vpsrlq    $28,%ymm0,%ymm11
vpaddq    %ymm11,%ymm1,%ymm1
vpand     %ymm15,%ymm0,%ymm0

vmovdqa   768(%rsp),%ymm10
vmovdqa   800(%rsp),%ymm11
vmovdqa   928(%rsp), %ymm15     # Restore

vmovdqa   %ymm8, 704(%rsp)
vmovdqa   %ymm9, 736(%rsp)
vmovdqa   %ymm12,832(%rsp)
vmovdqa   %ymm13,864(%rsp)
vmovdqa   %ymm14,896(%rsp)
#%ymm15 already stored above
vmovdqa   %ymm0, 960(%rsp)
vmovdqa   %ymm1, 992(%rsp)
vmovdqa   %ymm2, 1024(%rsp)
vmovdqa   %ymm3, 1056(%rsp)
vmovdqa   %ymm4, 1088(%rsp)
vmovdqa   %ymm5, 1120(%rsp)
vmovdqa   %ymm6, 1152(%rsp)
vmovdqa   %ymm7, 1184(%rsp)

// <T5',T6',T7',T8'> ← Pack-N2D(<T5,T6,T7,T8>)
vpsllq    $32,%ymm0,%ymm0
vpor      %ymm0,%ymm8,%ymm8
vpsllq    $32,%ymm1,%ymm1
vpor      %ymm1,%ymm9,%ymm9
vpsllq    $32,%ymm2,%ymm2
vpor      %ymm2,%ymm10,%ymm10
vpsllq    $32,%ymm3,%ymm3
vpor      %ymm3,%ymm11,%ymm11
vpsllq    $32,%ymm4,%ymm4
vpor      %ymm4,%ymm12,%ymm12
vpsllq    $32,%ymm5,%ymm5
vpor      %ymm5,%ymm13,%ymm13
vpsllq    $32,%ymm6,%ymm6
vpor      %ymm6,%ymm14,%ymm14
vpsllq    $32,%ymm7,%ymm7
vpor      %ymm7,%ymm15,%ymm15

// <T9',T10',T11',T12'> ← Dense-H2-H(<T5',T6',T7',T8'>)
vmovdqa   %ymm0,192(%rsp)      # Temprarily store ymm0
vmovdqa   %ymm2,256(%rsp)      # Temprarily store ymm2
vmovdqa   %ymm4,320(%rsp)      # Temprarily store ymm4
vpshufd	  $68,%ymm8,%ymm1
vmovdqa   h2h_mask(%rip), %ymm0
vpand     %ymm0,%ymm1,%ymm1
vpshufd	  $238,%ymm8,%ymm3
vmovdqa   h2h_p1(%rip), %ymm2
vpaddd    %ymm2,%ymm1,%ymm1
vmovdqa   h2h_xor(%rip), %ymm2
vpxor     %ymm2,%ymm3,%ymm3
vpaddd    %ymm1,%ymm3,%ymm8

vpshufd	  $68,%ymm9,%ymm1
vpand     %ymm0,%ymm1,%ymm1
vpshufd	  $238,%ymm9,%ymm3
vmovdqa   h2h_p2(%rip), %ymm4
vpaddd    %ymm4,%ymm1,%ymm1
vpxor     %ymm2,%ymm3,%ymm3
vpaddd    %ymm1,%ymm3,%ymm9

vpshufd	  $68,%ymm10,%ymm1
vpand     %ymm0,%ymm1,%ymm1
vpshufd	  $238,%ymm10,%ymm3
vpaddd    %ymm4,%ymm1,%ymm1
vpxor     %ymm2,%ymm3,%ymm3
vpaddd    %ymm1,%ymm3,%ymm10

vpshufd	  $68,%ymm11,%ymm1
vpand     %ymm0,%ymm1,%ymm1
vpshufd	  $238,%ymm11,%ymm3
vpaddd    %ymm4,%ymm1,%ymm1
vpxor     %ymm2,%ymm3,%ymm3
vpaddd    %ymm1,%ymm3,%ymm11

vpshufd	  $68,%ymm12,%ymm1
vpand     %ymm0,%ymm1,%ymm1
vpshufd	  $238,%ymm12,%ymm3
vpaddd    %ymm4,%ymm1,%ymm1
vpxor     %ymm2,%ymm3,%ymm3
vpaddd    %ymm1,%ymm3,%ymm12

vpshufd	  $68,%ymm13,%ymm1
vpand     %ymm0,%ymm1,%ymm1
vpshufd	  $238,%ymm13,%ymm3
vpaddd    %ymm4,%ymm1,%ymm1
vpxor     %ymm2,%ymm3,%ymm3
vpaddd    %ymm1,%ymm3,%ymm13

vpshufd	  $68,%ymm14,%ymm1
vpand     %ymm0,%ymm1,%ymm1
vpshufd	  $238,%ymm14,%ymm3
vpaddd    %ymm4,%ymm1,%ymm1
vpxor     %ymm2,%ymm3,%ymm3
vpaddd    %ymm1,%ymm3,%ymm14

vpshufd	  $68,%ymm15,%ymm1
vpand     %ymm0,%ymm1,%ymm1
vpshufd	  $238,%ymm15,%ymm3
vpaddd    %ymm4,%ymm1,%ymm1
vpxor     %ymm2,%ymm3,%ymm3
vpaddd    %ymm1,%ymm3,%ymm15

vpsrld    $28,%ymm8,%ymm1
vpaddd    %ymm1,%ymm9,%ymm9
vmovdqa   vecmask28d(%rip), %ymm0
vpand     %ymm0,%ymm8,%ymm8

vpsrld    $28,%ymm9,%ymm1
vpaddd    %ymm1,%ymm10,%ymm10
vpand     %ymm0,%ymm9,%ymm9

vpsrld    $28,%ymm10,%ymm1
vpaddd    %ymm1,%ymm11,%ymm11
vpand     %ymm0,%ymm10,%ymm10

vpsrld    $28,%ymm11,%ymm1
vpaddd    %ymm1,%ymm12,%ymm12
vpand     %ymm0,%ymm11,%ymm11

vpsrld    $28,%ymm12,%ymm1
vpaddd    %ymm1,%ymm13,%ymm13
vpand     %ymm0,%ymm12,%ymm12

vpsrld    $28,%ymm13,%ymm1
vpaddd    %ymm1,%ymm14,%ymm14
vpand     %ymm0,%ymm13,%ymm13

vpsrld    $28,%ymm14,%ymm1
vpaddd    %ymm1,%ymm15,%ymm15
vpand     %ymm0,%ymm14,%ymm14

vmovdqa   192(%rsp),%ymm0      # Restore
vmovdqa   256(%rsp),%ymm2      # Restore
vmovdqa   320(%rsp),%ymm4      # Restore

// <T9,T10,T11,T12> ← Pack-D2N(<T9',T10',T11',T12'>)
vmovdqa   %ymm8,192(%rsp)
vpsrlq    $32,%ymm8,%ymm0
vmovdqa   %ymm0,448(%rsp)

vmovdqa   %ymm9,224(%rsp)
vpsrlq    $32,%ymm9,%ymm1
vmovdqa   %ymm1,480(%rsp)

vmovdqa   %ymm10,256(%rsp)
vpsrlq    $32,%ymm10,%ymm2
vmovdqa   %ymm2,512(%rsp)

vmovdqa   %ymm11,288(%rsp)
vpsrlq    $32,%ymm11,%ymm3
vmovdqa   %ymm3,544(%rsp)

vmovdqa   %ymm12,320(%rsp)
vpsrlq    $32,%ymm12,%ymm4
vmovdqa   %ymm4,576(%rsp)

vmovdqa   %ymm13,352(%rsp)
vpsrlq    $32,%ymm13,%ymm5
vmovdqa   %ymm5,608(%rsp)

vmovdqa   %ymm14,384(%rsp)
vpsrlq    $32,%ymm14,%ymm6
vmovdqa   %ymm6,640(%rsp)

vmovdqa   %ymm15,416(%rsp)
vpsrlq    $32,%ymm15,%ymm7
vmovdqa   %ymm7,672(%rsp)

// <0,T13,0,0> ← Unreduced-Mulc(<T9,T10,T11,T12>,<0,a24(%rip),0,0>)
// <T5,T14,T7,T8> ← Add(<0,T13,0,0>,<T5,T6,T7,T8>)
vmovdqa   a24(%rip),%ymm7
vpmuludq  %ymm7,%ymm8,%ymm8
vpaddq    704(%rsp),%ymm8,%ymm8
vpmuludq  %ymm7,%ymm9,%ymm9
vpaddq    736(%rsp),%ymm9,%ymm9
vpmuludq  %ymm7,%ymm10,%ymm10
vpaddq    768(%rsp),%ymm10,%ymm10
vpmuludq  %ymm7,%ymm11,%ymm11
vpaddq    800(%rsp),%ymm11,%ymm11
vpmuludq  %ymm7,%ymm12,%ymm12
vpaddq    832(%rsp),%ymm12,%ymm12
vpmuludq  %ymm7,%ymm13,%ymm13
vpaddq    864(%rsp),%ymm13,%ymm13
vpmuludq  %ymm7,%ymm14,%ymm14
vpaddq    896(%rsp),%ymm14,%ymm14
vpmuludq  %ymm7,%ymm0,%ymm0
vpaddq    960(%rsp),%ymm0,%ymm0
vpmuludq  %ymm7,%ymm1,%ymm1
vpaddq    992(%rsp),%ymm1,%ymm1
vpmuludq  %ymm7,%ymm2,%ymm2
vpaddq    1024(%rsp),%ymm2,%ymm2
vpmuludq  %ymm7,%ymm3,%ymm3
vpaddq    1056(%rsp),%ymm3,%ymm3
vpmuludq  %ymm7,%ymm4,%ymm4
vpaddq    1088(%rsp),%ymm4,%ymm4
vpmuludq  %ymm7,%ymm5,%ymm5
vpaddq    1120(%rsp),%ymm5,%ymm5
vpmuludq  %ymm7,%ymm6,%ymm6
vpaddq    1152(%rsp),%ymm6,%ymm6
vmovdqa   %ymm6,64(%rsp)		# Temporarily store %ymm6
vmovdqa   a24(%rip),%ymm6
vmovdqa   672(%rsp),%ymm7		# Restore %ymm7
vpmuludq  %ymm6,%ymm7,%ymm7
vpaddq    1184(%rsp),%ymm7,%ymm7

vpsrlq    $28,%ymm0,%ymm15
vpaddq    %ymm15,%ymm1,%ymm1
vmovdqa   vecmask28(%rip),%ymm6
vpand     %ymm6,%ymm0,%ymm0

vpsrlq    $28,%ymm8,%ymm15
vpaddq    %ymm15,%ymm9,%ymm9
vpand     %ymm6,%ymm8,%ymm8

vpsrlq    $28,%ymm1,%ymm15
vpaddq    %ymm15,%ymm2,%ymm2
vpand     %ymm6,%ymm1,%ymm1

vpsrlq    $28,%ymm9,%ymm15
vpaddq    %ymm15,%ymm10,%ymm10
vpand     %ymm6,%ymm9,%ymm9

vpsrlq    $28,%ymm2,%ymm15
vpaddq    %ymm15,%ymm3,%ymm3
vpand     %ymm6,%ymm2,%ymm2

vpsrlq    $28,%ymm10,%ymm15
vpaddq    %ymm15,%ymm11,%ymm11
vpand     %ymm6,%ymm10,%ymm10

vpsrlq    $28,%ymm3,%ymm15
vpaddq    %ymm15,%ymm4,%ymm4
vpand     %ymm6,%ymm3,%ymm3

vpsrlq    $28,%ymm11,%ymm15
vpaddq    %ymm15,%ymm12,%ymm12
vpand     %ymm6,%ymm11,%ymm11

vpsrlq    $28,%ymm4,%ymm15
vpaddq    %ymm15,%ymm5,%ymm5
vpand     %ymm6,%ymm4,%ymm4

vpsrlq    $28,%ymm12,%ymm15
vpaddq    %ymm15,%ymm13,%ymm13
vpand     %ymm6,%ymm12,%ymm12

vmovdqa   %ymm12,96(%rsp)		# Temporarily store %ymm12
vmovdqa   vecmask28(%rip),%ymm12
vmovdqa   64(%rsp),%ymm6		# Restore
vpsrlq    $28,%ymm5,%ymm15
vpaddq    %ymm15,%ymm6,%ymm6
vpand     %ymm12,%ymm5,%ymm5

vpsrlq    $28,%ymm13,%ymm15
vpaddq    %ymm15,%ymm14,%ymm14
vpand     %ymm12,%ymm13,%ymm13

vpsrlq    $28,%ymm6,%ymm15
vpaddq    %ymm15,%ymm7,%ymm7
vpand     %ymm12,%ymm6,%ymm6

vmovdqa   %ymm13,64(%rsp)
vmovdqa   416(%rsp),%ymm15
vmovdqa   a24(%rip),%ymm12
vpmuludq  %ymm12,%ymm15,%ymm15
vpaddq    928(%rsp),%ymm15,%ymm15

vmovdqa   vecmask28(%rip),%ymm12
vpsrlq    $28,%ymm14,%ymm13
vpaddq    %ymm13,%ymm15,%ymm15
vpand     %ymm12,%ymm14,%ymm14

vpsrlq    $28,%ymm7,%ymm13
vpaddq    %ymm13,%ymm8,%ymm8
vpaddq    %ymm13,%ymm0,%ymm0
vpand     %ymm12,%ymm7,%ymm7

vpsrlq    $28,%ymm15,%ymm13
vpaddq    %ymm13,%ymm0,%ymm0
vpand     %ymm12,%ymm15,%ymm15

vmovdqa   64(%rsp),%ymm13
vmovdqa   96(%rsp),%ymm12		# Restore

// <T5,T14,T11,T12> ← Blend(<T9,T10,T11,T12>,<T5,T14,T7,T8>,1100)
vpblendd  $240,192(%rsp),%ymm8,%ymm8
vpblendd  $240,224(%rsp),%ymm9,%ymm9
vpblendd  $240,256(%rsp),%ymm10,%ymm10
vpblendd  $240,288(%rsp),%ymm11,%ymm11
vpblendd  $240,320(%rsp),%ymm12,%ymm12
vpblendd  $240,352(%rsp),%ymm13,%ymm13
vpblendd  $240,384(%rsp),%ymm14,%ymm14
vpblendd  $240,416(%rsp),%ymm15,%ymm15
vpblendd  $240,448(%rsp),%ymm0,%ymm0
vpblendd  $240,480(%rsp),%ymm1,%ymm1
vpblendd  $240,512(%rsp),%ymm2,%ymm2
vpblendd  $240,544(%rsp),%ymm3,%ymm3
vpblendd  $240,576(%rsp),%ymm4,%ymm4
vpblendd  $240,608(%rsp),%ymm5,%ymm5
vpblendd  $240,640(%rsp),%ymm6,%ymm6
vpblendd  $240,672(%rsp),%ymm7,%ymm7

// <T15,T16,T17,T18> ← Mul(<T5,T14,T11,T12>,<T9,T10,T11,T12>)
vmovdqa   %ymm14,64(%rsp)
vmovdqa   %ymm15,96(%rsp)
vmovdqa   %ymm0,128(%rsp)
vmovdqa   %ymm1,160(%rsp)

vpmuludq  448(%rsp),%ymm0,%ymm15
vmovdqa   %ymm15,704(%rsp)

vpmuludq  480(%rsp),%ymm0,%ymm15
vpmuludq  448(%rsp),%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,736(%rsp)

vpmuludq  512(%rsp),%ymm0,%ymm15
vpmuludq  480(%rsp),%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  448(%rsp),%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,768(%rsp)

vpmuludq  544(%rsp),%ymm0,%ymm15
vpmuludq  512(%rsp),%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  480(%rsp),%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  448(%rsp),%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,800(%rsp)

vpmuludq  576(%rsp),%ymm0,%ymm15
vpmuludq  544(%rsp),%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  512(%rsp),%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  480(%rsp),%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  448(%rsp),%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,832(%rsp)

vpmuludq  608(%rsp),%ymm0,%ymm15
vpmuludq  576(%rsp),%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  544(%rsp),%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  512(%rsp),%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  480(%rsp),%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  448(%rsp),%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,864(%rsp)

vpmuludq  640(%rsp),%ymm0,%ymm15
vpmuludq  608(%rsp),%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  576(%rsp),%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  544(%rsp),%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  512(%rsp),%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  480(%rsp),%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  448(%rsp),%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,896(%rsp)

vpmuludq  672(%rsp),%ymm0,%ymm15
vpmuludq  640(%rsp),%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  608(%rsp),%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  576(%rsp),%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  544(%rsp),%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  512(%rsp),%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  480(%rsp),%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  448(%rsp),%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,928(%rsp)

vpmuludq  672(%rsp),%ymm1,%ymm15
vpmuludq  640(%rsp),%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  608(%rsp),%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  576(%rsp),%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  544(%rsp),%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  512(%rsp),%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  480(%rsp),%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,960(%rsp)

vpmuludq  672(%rsp),%ymm2,%ymm15
vpmuludq  640(%rsp),%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  608(%rsp),%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  576(%rsp),%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  544(%rsp),%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  512(%rsp),%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,992(%rsp)

vpmuludq  672(%rsp),%ymm3,%ymm15
vpmuludq  640(%rsp),%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  608(%rsp),%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  576(%rsp),%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  544(%rsp),%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,1024(%rsp)

vpmuludq  672(%rsp),%ymm4,%ymm15
vpmuludq  640(%rsp),%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  608(%rsp),%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  576(%rsp),%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,1056(%rsp)

vpmuludq  672(%rsp),%ymm5,%ymm15
vpmuludq  640(%rsp),%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  608(%rsp),%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,1088(%rsp)

vpmuludq  672(%rsp),%ymm6,%ymm15
vpmuludq  640(%rsp),%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,1120(%rsp)

vpmuludq  672(%rsp),%ymm7,%ymm15
vmovdqa   %ymm15,1152(%rsp)

vmovdqa   64(%rsp),%ymm14
vmovdqa   96(%rsp),%ymm15

vpmuludq  192(%rsp),%ymm8,%ymm1
vmovdqa   %ymm1,1184(%rsp)
vpaddq    704(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,704(%rsp)

vpmuludq  224(%rsp),%ymm8,%ymm1
vpmuludq  192(%rsp),%ymm9,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1216(%rsp)
vpaddq    736(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,736(%rsp)

vpmuludq  256(%rsp),%ymm8,%ymm1
vpmuludq  224(%rsp),%ymm9,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  192(%rsp),%ymm10,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1248(%rsp)
vpaddq    768(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,768(%rsp)

vpmuludq  288(%rsp),%ymm8,%ymm1
vpmuludq  256(%rsp),%ymm9,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  224(%rsp),%ymm10,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  192(%rsp),%ymm11,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1280(%rsp)
vpaddq    800(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,800(%rsp)

vpmuludq  320(%rsp),%ymm8,%ymm1
vpmuludq  288(%rsp),%ymm9,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  256(%rsp),%ymm10,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  224(%rsp),%ymm11,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  192(%rsp),%ymm12,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1312(%rsp)
vpaddq    832(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,832(%rsp)

vpmuludq  352(%rsp),%ymm8,%ymm1
vpmuludq  320(%rsp),%ymm9,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  288(%rsp),%ymm10,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  256(%rsp),%ymm11,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  224(%rsp),%ymm12,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  192(%rsp),%ymm13,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1344(%rsp)
vpaddq    864(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,864(%rsp)

vpmuludq  384(%rsp),%ymm8,%ymm1
vpmuludq  352(%rsp),%ymm9,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  320(%rsp),%ymm10,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  288(%rsp),%ymm11,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  256(%rsp),%ymm12,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  224(%rsp),%ymm13,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  192(%rsp),%ymm14,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1376(%rsp)
vpaddq    896(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,896(%rsp)

vpmuludq  416(%rsp),%ymm8,%ymm1
vpmuludq  384(%rsp),%ymm9,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  352(%rsp),%ymm10,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  320(%rsp),%ymm11,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  288(%rsp),%ymm12,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  256(%rsp),%ymm13,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  224(%rsp),%ymm14,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  192(%rsp),%ymm15,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1408(%rsp)
vpaddq    928(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,928(%rsp)

vpmuludq  416(%rsp),%ymm9,%ymm1
vpmuludq  384(%rsp),%ymm10,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  352(%rsp),%ymm11,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  320(%rsp),%ymm12,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  288(%rsp),%ymm13,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  256(%rsp),%ymm14,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  224(%rsp),%ymm15,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1440(%rsp)
vpaddq    960(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,960(%rsp)

vpmuludq  416(%rsp),%ymm10,%ymm1
vpmuludq  384(%rsp),%ymm11,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  352(%rsp),%ymm12,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  320(%rsp),%ymm13,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  288(%rsp),%ymm14,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  256(%rsp),%ymm15,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1472(%rsp)
vpaddq    992(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,992(%rsp)

vpmuludq  416(%rsp),%ymm11,%ymm1
vpmuludq  384(%rsp),%ymm12,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  352(%rsp),%ymm13,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  320(%rsp),%ymm14,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  288(%rsp),%ymm15,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1504(%rsp)
vpaddq    1024(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,1024(%rsp)

vpmuludq  416(%rsp),%ymm12,%ymm1
vpmuludq  384(%rsp),%ymm13,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  352(%rsp),%ymm14,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  320(%rsp),%ymm15,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1536(%rsp)
vpaddq    1056(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,1056(%rsp)

vpmuludq  416(%rsp),%ymm13,%ymm1
vpmuludq  384(%rsp),%ymm14,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vpmuludq  352(%rsp),%ymm15,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1568(%rsp)
vpaddq    1088(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,1088(%rsp)

vpmuludq  416(%rsp),%ymm14,%ymm1
vpmuludq  384(%rsp),%ymm15,%ymm0
vpaddq    %ymm0,%ymm1,%ymm1
vmovdqa   %ymm1,1600(%rsp)
vpaddq    1120(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,1120(%rsp)

vpmuludq  416(%rsp),%ymm15,%ymm1
vmovdqa   %ymm1,1632(%rsp)
vpaddq    1152(%rsp),%ymm1,%ymm1
vmovdqa   %ymm1,1152(%rsp)

vpaddq    128(%rsp),%ymm8,%ymm8
vpaddq    160(%rsp),%ymm9,%ymm9
vpaddq    %ymm2,%ymm10,%ymm10
vpaddq    %ymm3,%ymm11,%ymm11
vpaddq    %ymm4,%ymm12,%ymm12
vpaddq    %ymm5,%ymm13,%ymm13
vpaddq    %ymm6,%ymm14,%ymm14
vpaddq    %ymm7,%ymm15,%ymm15

vmovdqa   %ymm14,1664(%rsp)
vmovdqa   %ymm15,1696(%rsp)

vmovdqa   192(%rsp),%ymm0
vmovdqa   224(%rsp),%ymm1
vmovdqa   256(%rsp),%ymm2
vmovdqa   288(%rsp),%ymm3
vmovdqa   320(%rsp),%ymm4
vmovdqa   352(%rsp),%ymm5
vmovdqa   384(%rsp),%ymm6
vmovdqa   416(%rsp),%ymm7

vpaddq    448(%rsp),%ymm0,%ymm0
vpaddq    480(%rsp),%ymm1,%ymm1
vpaddq    512(%rsp),%ymm2,%ymm2
vpaddq    544(%rsp),%ymm3,%ymm3
vpaddq    576(%rsp),%ymm4,%ymm4
vpaddq    608(%rsp),%ymm5,%ymm5
vpaddq    640(%rsp),%ymm6,%ymm6
vpaddq    672(%rsp),%ymm7,%ymm7

vpmuludq  %ymm8,%ymm0,%ymm15
vmovdqa   %ymm15,1728(%rsp)

vpmuludq  %ymm9,%ymm0,%ymm15
vpmuludq  %ymm8,%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,1760(%rsp)

vpmuludq  %ymm10,%ymm0,%ymm15
vpmuludq  %ymm9,%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm8,%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,1792(%rsp)

vpmuludq  %ymm11,%ymm0,%ymm15
vpmuludq  %ymm10,%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm9,%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm8,%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,1824(%rsp)

vpmuludq  %ymm12,%ymm0,%ymm15
vpmuludq  %ymm11,%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm10,%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm9,%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm8,%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,1856(%rsp)

vpmuludq  %ymm13,%ymm0,%ymm15
vpmuludq  %ymm12,%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm11,%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm10,%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm9,%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm8,%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,1888(%rsp)

vpmuludq  1664(%rsp),%ymm0,%ymm15
vpmuludq  %ymm13,%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm12,%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm11,%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm10,%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm9,%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm8,%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vmovdqa   %ymm15,1920(%rsp)

vpmuludq  1696(%rsp),%ymm0,%ymm15
vpmuludq  1664(%rsp),%ymm1,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm13,%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm12,%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm11,%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm10,%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm9,%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm8,%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm8

vpmuludq  1696(%rsp),%ymm1,%ymm15
vpmuludq  1664(%rsp),%ymm2,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm13,%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm12,%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm11,%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm10,%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm9,%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm9

vpmuludq  1696(%rsp),%ymm2,%ymm15
vpmuludq  1664(%rsp),%ymm3,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm13,%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm12,%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm11,%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm10,%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm10

vpmuludq  1696(%rsp),%ymm3,%ymm15
vpmuludq  1664(%rsp),%ymm4,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm13,%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm12,%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm11,%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm11

vpmuludq  1696(%rsp),%ymm4,%ymm15
vpmuludq  1664(%rsp),%ymm5,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm13,%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm12,%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm12

vpmuludq  1696(%rsp),%ymm5,%ymm15
vpmuludq  1664(%rsp),%ymm6,%ymm14
vpaddq    %ymm14,%ymm15,%ymm15
vpmuludq  %ymm13,%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm13

vpmuludq  1696(%rsp),%ymm6,%ymm15
vpmuludq  1664(%rsp),%ymm7,%ymm14
vpaddq    %ymm14,%ymm15,%ymm14

vpmuludq  1696(%rsp),%ymm7,%ymm15

vmovdqa   1728(%rsp),%ymm0
vmovdqa   1760(%rsp),%ymm1
vmovdqa   1792(%rsp),%ymm2
vmovdqa   1824(%rsp),%ymm3
vmovdqa   1856(%rsp),%ymm4
vmovdqa   1888(%rsp),%ymm5
vmovdqa   1920(%rsp),%ymm6

vpsubq    1184(%rsp),%ymm0,%ymm0
vpsubq    1216(%rsp),%ymm1,%ymm1
vpsubq    1248(%rsp),%ymm2,%ymm2
vpsubq    1280(%rsp),%ymm3,%ymm3
vpsubq    1312(%rsp),%ymm4,%ymm4
vpsubq    1344(%rsp),%ymm5,%ymm5
vpsubq    1376(%rsp),%ymm6,%ymm6
vpsubq    1408(%rsp),%ymm8,%ymm8
vpsubq    1440(%rsp),%ymm9,%ymm9
vpsubq    1472(%rsp),%ymm10,%ymm10
vpsubq    1504(%rsp),%ymm11,%ymm11
vpsubq    1536(%rsp),%ymm12,%ymm12
vpsubq    1568(%rsp),%ymm13,%ymm13
vpsubq    1600(%rsp),%ymm14,%ymm14
vpsubq    1632(%rsp),%ymm15,%ymm15

vpaddq    960(%rsp),%ymm0,%ymm0
vpaddq    992(%rsp),%ymm1,%ymm1
vpaddq    1024(%rsp),%ymm2,%ymm2
vpaddq    1056(%rsp),%ymm3,%ymm3
vpaddq    1088(%rsp),%ymm4,%ymm4
vpaddq    1120(%rsp),%ymm5,%ymm5
vpaddq    1152(%rsp),%ymm6,%ymm6

vpaddq    %ymm9,%ymm0,%ymm0
vpaddq    %ymm10,%ymm1,%ymm1
vpaddq    %ymm11,%ymm2,%ymm2
vpaddq    %ymm12,%ymm3,%ymm3
vpaddq    %ymm13,%ymm4,%ymm4
vpaddq    %ymm14,%ymm5,%ymm5
vpaddq    %ymm15,%ymm6,%ymm6

vpaddq    704(%rsp),%ymm9,%ymm9
vpaddq    736(%rsp),%ymm10,%ymm10
vpaddq    768(%rsp),%ymm11,%ymm11
vpaddq    800(%rsp),%ymm12,%ymm12
vpaddq    832(%rsp),%ymm13,%ymm13
vpaddq    864(%rsp),%ymm14,%ymm14
vpaddq    896(%rsp),%ymm15,%ymm15

vmovdqa   %ymm8,64(%rsp)
vmovdqa   %ymm11,128(%rsp)		# Temporarily store %ymm11

vpsrlq    $28,%ymm9,%ymm7
vpaddq    %ymm7,%ymm10,%ymm10
vmovdqa   vecmask28(%rip),%ymm11
vpand     %ymm11,%ymm9,%ymm8

vpsrlq    $28,%ymm0,%ymm7
vpaddq    %ymm7,%ymm1,%ymm1
vpand     %ymm11,%ymm0,%ymm0

vmovdqa   128(%rsp),%ymm11		# Restore
vmovdqa   %ymm0,128(%rsp)		# Temporarily store %ymm0
vmovdqa   vecmask28(%rip),%ymm0

vpsrlq    $28,%ymm10,%ymm7
vpaddq    %ymm7,%ymm11,%ymm11
vpand     %ymm0,%ymm10,%ymm9

vpsrlq    $28,%ymm1,%ymm7
vpaddq    %ymm7,%ymm2,%ymm2
vpand     %ymm0,%ymm1,%ymm1

vpsrlq    $28,%ymm11,%ymm7
vpaddq    %ymm7,%ymm12,%ymm12
vpand     %ymm0,%ymm11,%ymm10

vpsrlq    $28,%ymm2,%ymm7
vpaddq    %ymm7,%ymm3,%ymm3
vpand     %ymm0,%ymm2,%ymm2

vpsrlq    $28,%ymm12,%ymm7
vpaddq    %ymm7,%ymm13,%ymm13
vpand     %ymm0,%ymm12,%ymm11

vpsrlq    $28,%ymm3,%ymm7
vpaddq    %ymm7,%ymm4,%ymm4
vpand     %ymm0,%ymm3,%ymm3

vpsrlq    $28,%ymm13,%ymm7
vpaddq    %ymm7,%ymm14,%ymm14
vpand     %ymm0,%ymm13,%ymm12

vpsrlq    $28,%ymm4,%ymm7
vpaddq    %ymm7,%ymm5,%ymm5
vpand     %ymm0,%ymm4,%ymm4

vpsrlq    $28,%ymm14,%ymm7
vpaddq    %ymm7,%ymm15,%ymm15
vpand     %ymm0,%ymm14,%ymm13

vpsrlq    $28,%ymm5,%ymm7
vpaddq    %ymm7,%ymm6,%ymm6
vpand     %ymm0,%ymm5,%ymm5

vmovdqa   %ymm10,96(%rsp)
vpsrlq    $28,%ymm15,%ymm10
vpaddq    928(%rsp),%ymm10,%ymm10
vpand     %ymm0,%ymm15,%ymm14

vpsrlq    $28,%ymm6,%ymm7
vpaddq    64(%rsp),%ymm7,%ymm7
vpand     %ymm0,%ymm6,%ymm6

vmovdqa   128(%rsp),%ymm0		# Restore
vmovdqa   %ymm12,160(%rsp)		# Temporarily store %ymm12
vmovdqa   %ymm11,128(%rsp)
vpsrlq    $28,%ymm10,%ymm11
vpaddq    %ymm11,%ymm0,%ymm0
vmovdqa   vecmask28(%rip),%ymm12
vpand     %ymm12,%ymm10,%ymm15

vpsrlq    $28,%ymm7,%ymm11
vpaddq    %ymm11,%ymm8,%ymm8
vpaddq    %ymm11,%ymm0,%ymm0
vpand     %ymm12,%ymm7,%ymm7

vpsrlq    $28,%ymm8,%ymm11
vpaddq    %ymm11,%ymm9,%ymm9
vpand     %ymm12,%ymm8,%ymm8

vpsrlq    $28,%ymm0,%ymm11
vpaddq    %ymm11,%ymm1,%ymm1
vpand     %ymm12,%ymm0,%ymm0

vmovdqa   160(%rsp),%ymm12		# Restore

// <X2,Z2,X3,Z3> ← Mulc(<T15,T16,T17,T18>,<1,1,1,X1>)
vpmuludq  0(%rsi),%ymm8,%ymm8
vpmuludq  0(%rsi),%ymm9,%ymm9
vpmuludq  0(%rsi),%ymm12,%ymm12
vpmuludq  0(%rsi),%ymm13,%ymm13
vpmuludq  0(%rsi),%ymm14,%ymm14
vpmuludq  0(%rsi),%ymm15,%ymm15
vpmuludq  0(%rsi),%ymm0,%ymm0
vpmuludq  0(%rsi),%ymm1,%ymm1
vpmuludq  0(%rsi),%ymm2,%ymm2
vpmuludq  0(%rsi),%ymm3,%ymm3
vpmuludq  0(%rsi),%ymm4,%ymm4
vpmuludq  0(%rsi),%ymm5,%ymm5
vpmuludq  0(%rsi),%ymm6,%ymm6
vpmuludq  0(%rsi),%ymm7,%ymm7

vmovdqa   %ymm15,160(%rsp)		# Temporarily store %ymm15
vmovdqa   vecmask28(%rip),%ymm15

vpsrlq    $28,%ymm0,%ymm10
vpaddq    %ymm10,%ymm1,%ymm1
vpand     %ymm15,%ymm0,%ymm0

vpsrlq    $28,%ymm8,%ymm10
vpaddq    %ymm10,%ymm9,%ymm9
vpand     %ymm15,%ymm8,%ymm8

vpsrlq    $28,%ymm1,%ymm10
vpaddq    %ymm10,%ymm2,%ymm2
vpand     %ymm15,%ymm1,%ymm1

vmovdqa   96(%rsp),%ymm10
vpmuludq  0(%rsi),%ymm10,%ymm10
vpsrlq    $28,%ymm9,%ymm11
vpaddq    %ymm11,%ymm10,%ymm10
vpand     %ymm15,%ymm9,%ymm9

vpsrlq    $28,%ymm2,%ymm11
vpaddq    %ymm11,%ymm3,%ymm3
vpand     %ymm15,%ymm2,%ymm2

vmovdqa   %ymm9,64(%rsp)
vmovdqa   128(%rsp),%ymm11
vpmuludq  0(%rsi),%ymm11,%ymm11
vpsrlq    $28,%ymm10,%ymm9
vpaddq    %ymm9,%ymm11,%ymm11
vpand     %ymm15,%ymm10,%ymm10

vpsrlq    $28,%ymm3,%ymm9
vpaddq    %ymm9,%ymm4,%ymm4
vpand     %ymm15,%ymm3,%ymm3

vpsrlq    $28,%ymm11,%ymm9
vpaddq    %ymm9,%ymm12,%ymm12
vpand     %ymm15,%ymm11,%ymm11

vpsrlq    $28,%ymm4,%ymm9
vpaddq    %ymm9,%ymm5,%ymm5
vpand     %ymm15,%ymm4,%ymm4

vpsrlq    $28,%ymm12,%ymm9
vpaddq    %ymm9,%ymm13,%ymm13
vpand     %ymm15,%ymm12,%ymm12

vpsrlq    $28,%ymm5,%ymm9
vpaddq    %ymm9,%ymm6,%ymm6
vpand     %ymm15,%ymm5,%ymm5

vpsrlq    $28,%ymm13,%ymm9
vpaddq    %ymm9,%ymm14,%ymm14
vpand     %ymm15,%ymm13,%ymm13

vpsrlq    $28,%ymm6,%ymm9
vpaddq    %ymm9,%ymm7,%ymm7
vpand     %ymm15,%ymm6,%ymm6

vmovdqa   160(%rsp),%ymm15		# Restore
vmovdqa   %ymm13,160(%rsp)		# Temporarily store %ymm13
vmovdqa   vecmask28(%rip),%ymm13

vpsrlq    $28,%ymm14,%ymm9
vpaddq    %ymm9,%ymm15,%ymm15
vpand     %ymm13,%ymm14,%ymm14

vpsrlq    $28,%ymm7,%ymm9
vpaddq    %ymm9,%ymm8,%ymm8
vpaddq    %ymm9,%ymm0,%ymm0
vpand     %ymm13,%ymm7,%ymm7

vpsrlq    $28,%ymm15,%ymm9
vpaddq    %ymm9,%ymm0,%ymm0
vpand     %ymm13,%ymm15,%ymm15

vmovdqa   64(%rsp),%ymm9
vmovdqa   160(%rsp),%ymm13		# Restore

// <X2',Z2',X3',Z3'> ← Pack-N2D(<X2,Z2,X3,Z3>)
vpsllq    $32,%ymm0,%ymm0
vpor      %ymm0,%ymm8,%ymm8
vpsllq    $32,%ymm1,%ymm1
vpor      %ymm1,%ymm9,%ymm9
vpsllq    $32,%ymm2,%ymm2
vpor      %ymm2,%ymm10,%ymm10
vpsllq    $32,%ymm3,%ymm3
vpor      %ymm3,%ymm11,%ymm11
vpsllq    $32,%ymm4,%ymm4
vpor      %ymm4,%ymm12,%ymm12
vpsllq    $32,%ymm5,%ymm5
vpor      %ymm5,%ymm13,%ymm13
vpsllq    $32,%ymm6,%ymm6
vpor      %ymm6,%ymm14,%ymm14
vpsllq    $32,%ymm7,%ymm7
vpor      %ymm7,%ymm15,%ymm15

subb      $1,%cl
cmpb	  $0,%cl
jge       .L2_base

movb	  $7,%cl
subq      $1,%r15
cmpq	  $0,%r15
jge       .L1_base

// <X2,Z2,X3,Z3> ← Pack-D2N(<X2',Z2',X3',Z3'>)
vpsrlq    $32,%ymm8,%ymm0
vmovdqa   %ymm0,192(%rsp)              #Temporarily store
vmovdqa   vecmask32(%rip), %ymm0
vpand     %ymm0,%ymm8,%ymm8
vpsrlq    $32,%ymm9,%ymm1
vpand     %ymm0,%ymm9,%ymm9
vpsrlq    $32,%ymm10,%ymm2
vpand     %ymm0,%ymm10,%ymm10
vpsrlq    $32,%ymm11,%ymm3
vpand     %ymm0,%ymm11,%ymm11
vpsrlq    $32,%ymm12,%ymm4
vpand     %ymm0,%ymm12,%ymm12
vpsrlq    $32,%ymm13,%ymm5
vpand     %ymm0,%ymm13,%ymm13
vpsrlq    $32,%ymm14,%ymm6
vpand     %ymm0,%ymm14,%ymm14
vpsrlq    $32,%ymm15,%ymm7
vpand     %ymm0,%ymm15,%ymm15

// <X2,Z2,X3,Z3> ← Reduce(<X2,Z2,X3,Z3>)
vmovdqa   %ymm7,64(%rsp)

vpsrlq    $28,%ymm8,%ymm7
vpaddq    %ymm7,%ymm9,%ymm9
vmovdqa   vecmask28(%rip), %ymm0
vpand     %ymm0,%ymm8,%ymm8

vmovdqa   %ymm8,96(%rsp)

vpsrlq    $28,%ymm9,%ymm7
vpaddq    %ymm7,%ymm10,%ymm10
vpand     %ymm0,%ymm9,%ymm9

vmovdqa   %ymm9,128(%rsp)

vpsrlq    $28,%ymm10,%ymm7
vpaddq    %ymm7,%ymm11,%ymm11
vpand     %ymm0,%ymm10,%ymm10

vmovdqa   %ymm10,160(%rsp)

vpsrlq    $28,%ymm11,%ymm7
vpaddq    %ymm7,%ymm12,%ymm12
vpand     %ymm0,%ymm11,%ymm11

vpsrlq    $28,%ymm12,%ymm7
vpaddq    %ymm7,%ymm13,%ymm13
vpand     %ymm0,%ymm12,%ymm12

vpsrlq    $28,%ymm13,%ymm7
vpaddq    %ymm7,%ymm14,%ymm14
vpand     %ymm0,%ymm13,%ymm13

vpsrlq    $28,%ymm14,%ymm7
vpaddq    %ymm7,%ymm15,%ymm15
vpand     %ymm0,%ymm14,%ymm14

vmovdqa   192(%rsp),%ymm0              #Reload
vmovdqa   %ymm14,192(%rdi)             #Finally store to destination
vmovdqa   vecmask28(%rip), %ymm14

vpsrlq    $28,%ymm15,%ymm7
vpaddq    %ymm7,%ymm0,%ymm0
vpand     %ymm14,%ymm15,%ymm15

vpsrlq    $28,%ymm0,%ymm7
vpaddq    %ymm7,%ymm1,%ymm1
vpand     %ymm14,%ymm0,%ymm0

vpsrlq    $28,%ymm1,%ymm7
vpaddq    %ymm7,%ymm2,%ymm2
vpand     %ymm14,%ymm1,%ymm1

vpsrlq    $28,%ymm2,%ymm7
vpaddq    %ymm7,%ymm3,%ymm3
vpand     %ymm14,%ymm2,%ymm2

vpsrlq    $28,%ymm3,%ymm7
vpaddq    %ymm7,%ymm4,%ymm4
vpand     %ymm14,%ymm3,%ymm3

vpsrlq    $28,%ymm4,%ymm7
vpaddq    %ymm7,%ymm5,%ymm5
vpand     %ymm14,%ymm4,%ymm4

vpsrlq    $28,%ymm5,%ymm7
vpaddq    %ymm7,%ymm6,%ymm6
vpand     %ymm14,%ymm5,%ymm5

vpsrlq    $28,%ymm6,%ymm7
vpaddq    64(%rsp),%ymm7,%ymm7
vpand     %ymm14,%ymm6,%ymm6

vpsrlq    $28,%ymm7,%ymm8
vpaddq    %ymm8,%ymm0,%ymm0
vpaddq    96(%rsp),%ymm8,%ymm8
vpand     vecmask28(%rip),%ymm7,%ymm7

vpsrlq    $28,%ymm8,%ymm9
vpaddq    128(%rsp),%ymm9,%ymm9
vpand     %ymm14,%ymm8,%ymm8

vpsrlq    $28,%ymm0,%ymm10
vpaddq    %ymm10,%ymm1,%ymm1
vpand     %ymm14,%ymm0,%ymm0

vmovdqa   160(%rsp),%ymm10

// store <X2,Z2,X3,Z3>
vmovdqa   %ymm8, 0(%rdi)
vmovdqa   %ymm9, 32(%rdi)
vmovdqa   %ymm10,64(%rdi)
vmovdqa   %ymm11,96(%rdi)
vmovdqa   %ymm12,128(%rdi)
vmovdqa   %ymm13,160(%rdi)
#%ymm14 was already stored to destination above
vmovdqa   %ymm15,224(%rdi)
vmovdqa   %ymm0, 256(%rdi)
vmovdqa   %ymm1, 288(%rdi)
vmovdqa   %ymm2, 320(%rdi)
vmovdqa   %ymm3, 352(%rdi)
vmovdqa   %ymm4, 384(%rdi)
vmovdqa   %ymm5, 416(%rdi)
vmovdqa   %ymm6, 448(%rdi)
vmovdqa   %ymm7, 480(%rdi)

movq 	  0(%rsp),%r11
movq 	  8(%rsp),%r12
movq 	  16(%rsp),%r13
movq 	  24(%rsp),%r14
movq 	  32(%rsp),%r15
movq 	  40(%rsp),%rbx
movq 	  48(%rsp),%rbp

movq 	  %r11,%rsp

RET
SYM_FUNC_END(curve448_mladder_base_avx2)
