...

Text file src/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s

Documentation: vendor/golang.org/x/crypto/chacha20poly1305

     1// Code generated by command: go run chacha20poly1305_amd64_asm.go -out ../chacha20poly1305_amd64.s -pkg chacha20poly1305. DO NOT EDIT.
     2
     3//go:build gc && !purego
     4
     5#include "textflag.h"
     6
     7// func polyHashADInternal<>()
     8TEXT polyHashADInternal<>(SB), NOSPLIT, $0
     9	XORQ  R10, R10
    10	XORQ  R11, R11
    11	XORQ  R12, R12
    12	CMPQ  R9, $0x0d
    13	JNE   hashADLoop
    14	MOVQ  (CX), R10
    15	MOVQ  5(CX), R11
    16	SHRQ  $0x18, R11
    17	MOVQ  $0x00000001, R12
    18	MOVQ  (BP), AX
    19	MOVQ  AX, R15
    20	MULQ  R10
    21	MOVQ  AX, R13
    22	MOVQ  DX, R14
    23	MOVQ  (BP), AX
    24	MULQ  R11
    25	IMULQ R12, R15
    26	ADDQ  AX, R14
    27	ADCQ  DX, R15
    28	MOVQ  8(BP), AX
    29	MOVQ  AX, R8
    30	MULQ  R10
    31	ADDQ  AX, R14
    32	ADCQ  $0x00, DX
    33	MOVQ  DX, R10
    34	MOVQ  8(BP), AX
    35	MULQ  R11
    36	ADDQ  AX, R15
    37	ADCQ  $0x00, DX
    38	IMULQ R12, R8
    39	ADDQ  R10, R15
    40	ADCQ  DX, R8
    41	MOVQ  R13, R10
    42	MOVQ  R14, R11
    43	MOVQ  R15, R12
    44	ANDQ  $0x03, R12
    45	MOVQ  R15, R13
    46	ANDQ  $-4, R13
    47	MOVQ  R8, R14
    48	SHRQ  $0x02, R8, R15
    49	SHRQ  $0x02, R8
    50	ADDQ  R13, R10
    51	ADCQ  R14, R11
    52	ADCQ  $0x00, R12
    53	ADDQ  R15, R10
    54	ADCQ  R8, R11
    55	ADCQ  $0x00, R12
    56	RET
    57
    58hashADLoop:
    59	// Hash in 16 byte chunks
    60	CMPQ  R9, $0x10
    61	JB    hashADTail
    62	ADDQ  (CX), R10
    63	ADCQ  8(CX), R11
    64	ADCQ  $0x01, R12
    65	LEAQ  16(CX), CX
    66	SUBQ  $0x10, R9
    67	MOVQ  (BP), AX
    68	MOVQ  AX, R15
    69	MULQ  R10
    70	MOVQ  AX, R13
    71	MOVQ  DX, R14
    72	MOVQ  (BP), AX
    73	MULQ  R11
    74	IMULQ R12, R15
    75	ADDQ  AX, R14
    76	ADCQ  DX, R15
    77	MOVQ  8(BP), AX
    78	MOVQ  AX, R8
    79	MULQ  R10
    80	ADDQ  AX, R14
    81	ADCQ  $0x00, DX
    82	MOVQ  DX, R10
    83	MOVQ  8(BP), AX
    84	MULQ  R11
    85	ADDQ  AX, R15
    86	ADCQ  $0x00, DX
    87	IMULQ R12, R8
    88	ADDQ  R10, R15
    89	ADCQ  DX, R8
    90	MOVQ  R13, R10
    91	MOVQ  R14, R11
    92	MOVQ  R15, R12
    93	ANDQ  $0x03, R12
    94	MOVQ  R15, R13
    95	ANDQ  $-4, R13
    96	MOVQ  R8, R14
    97	SHRQ  $0x02, R8, R15
    98	SHRQ  $0x02, R8
    99	ADDQ  R13, R10
   100	ADCQ  R14, R11
   101	ADCQ  $0x00, R12
   102	ADDQ  R15, R10
   103	ADCQ  R8, R11
   104	ADCQ  $0x00, R12
   105	JMP   hashADLoop
   106
   107hashADTail:
   108	CMPQ R9, $0x00
   109	JE   hashADDone
   110
   111	// Hash last < 16 byte tail
   112	XORQ R13, R13
   113	XORQ R14, R14
   114	XORQ R15, R15
   115	ADDQ R9, CX
   116
   117hashADTailLoop:
   118	SHLQ  $0x08, R13, R14
   119	SHLQ  $0x08, R13
   120	MOVB  -1(CX), R15
   121	XORQ  R15, R13
   122	DECQ  CX
   123	DECQ  R9
   124	JNE   hashADTailLoop
   125	ADDQ  R13, R10
   126	ADCQ  R14, R11
   127	ADCQ  $0x01, R12
   128	MOVQ  (BP), AX
   129	MOVQ  AX, R15
   130	MULQ  R10
   131	MOVQ  AX, R13
   132	MOVQ  DX, R14
   133	MOVQ  (BP), AX
   134	MULQ  R11
   135	IMULQ R12, R15
   136	ADDQ  AX, R14
   137	ADCQ  DX, R15
   138	MOVQ  8(BP), AX
   139	MOVQ  AX, R8
   140	MULQ  R10
   141	ADDQ  AX, R14
   142	ADCQ  $0x00, DX
   143	MOVQ  DX, R10
   144	MOVQ  8(BP), AX
   145	MULQ  R11
   146	ADDQ  AX, R15
   147	ADCQ  $0x00, DX
   148	IMULQ R12, R8
   149	ADDQ  R10, R15
   150	ADCQ  DX, R8
   151	MOVQ  R13, R10
   152	MOVQ  R14, R11
   153	MOVQ  R15, R12
   154	ANDQ  $0x03, R12
   155	MOVQ  R15, R13
   156	ANDQ  $-4, R13
   157	MOVQ  R8, R14
   158	SHRQ  $0x02, R8, R15
   159	SHRQ  $0x02, R8
   160	ADDQ  R13, R10
   161	ADCQ  R14, R11
   162	ADCQ  $0x00, R12
   163	ADDQ  R15, R10
   164	ADCQ  R8, R11
   165	ADCQ  $0x00, R12
   166
   167hashADDone:
   168	RET
   169
   170// func chacha20Poly1305Open(dst []byte, key []uint32, src []byte, ad []byte) bool
   171// Requires: AVX, AVX2, BMI2, CMOV, SSE2
   172TEXT ·chacha20Poly1305Open(SB), $288-97
   173	// For aligned stack access
   174	MOVQ           SP, BP
   175	ADDQ           $0x20, BP
   176	ANDQ           $-32, BP
   177	MOVQ           dst_base+0(FP), DI
   178	MOVQ           key_base+24(FP), R8
   179	MOVQ           src_base+48(FP), SI
   180	MOVQ           src_len+56(FP), BX
   181	MOVQ           ad_base+72(FP), CX
   182	VZEROUPPER
   183	VMOVDQU        ·chacha20Constants<>+0(SB), Y0
   184	VBROADCASTI128 16(R8), Y14
   185	VBROADCASTI128 32(R8), Y12
   186	VBROADCASTI128 48(R8), Y4
   187	VPADDD         ·avx2InitMask<>+0(SB), Y4, Y4
   188
   189	// Special optimization, for very short buffers
   190	CMPQ BX, $0xc0
   191	JBE  openAVX2192
   192	CMPQ BX, $0x00000140
   193	JBE  openAVX2320
   194
   195	// For the general key prepare the key first - as a byproduct we have 64 bytes of cipher stream
   196	VMOVDQA Y14, 32(BP)
   197	VMOVDQA Y12, 64(BP)
   198	VMOVDQA Y4, 192(BP)
   199	MOVQ    $0x0000000a, R9
   200
   201openAVX2PreparePolyKey:
   202	VPADDD     Y14, Y0, Y0
   203	VPXOR      Y0, Y4, Y4
   204	VPSHUFB    ·rol16<>+0(SB), Y4, Y4
   205	VPADDD     Y4, Y12, Y12
   206	VPXOR      Y12, Y14, Y14
   207	VPSLLD     $0x0c, Y14, Y3
   208	VPSRLD     $0x14, Y14, Y14
   209	VPXOR      Y3, Y14, Y14
   210	VPADDD     Y14, Y0, Y0
   211	VPXOR      Y0, Y4, Y4
   212	VPSHUFB    ·rol8<>+0(SB), Y4, Y4
   213	VPADDD     Y4, Y12, Y12
   214	VPXOR      Y12, Y14, Y14
   215	VPSLLD     $0x07, Y14, Y3
   216	VPSRLD     $0x19, Y14, Y14
   217	VPXOR      Y3, Y14, Y14
   218	VPALIGNR   $0x04, Y14, Y14, Y14
   219	VPALIGNR   $0x08, Y12, Y12, Y12
   220	VPALIGNR   $0x0c, Y4, Y4, Y4
   221	VPADDD     Y14, Y0, Y0
   222	VPXOR      Y0, Y4, Y4
   223	VPSHUFB    ·rol16<>+0(SB), Y4, Y4
   224	VPADDD     Y4, Y12, Y12
   225	VPXOR      Y12, Y14, Y14
   226	VPSLLD     $0x0c, Y14, Y3
   227	VPSRLD     $0x14, Y14, Y14
   228	VPXOR      Y3, Y14, Y14
   229	VPADDD     Y14, Y0, Y0
   230	VPXOR      Y0, Y4, Y4
   231	VPSHUFB    ·rol8<>+0(SB), Y4, Y4
   232	VPADDD     Y4, Y12, Y12
   233	VPXOR      Y12, Y14, Y14
   234	VPSLLD     $0x07, Y14, Y3
   235	VPSRLD     $0x19, Y14, Y14
   236	VPXOR      Y3, Y14, Y14
   237	VPALIGNR   $0x0c, Y14, Y14, Y14
   238	VPALIGNR   $0x08, Y12, Y12, Y12
   239	VPALIGNR   $0x04, Y4, Y4, Y4
   240	DECQ       R9
   241	JNE        openAVX2PreparePolyKey
   242	VPADDD     ·chacha20Constants<>+0(SB), Y0, Y0
   243	VPADDD     32(BP), Y14, Y14
   244	VPADDD     64(BP), Y12, Y12
   245	VPADDD     192(BP), Y4, Y4
   246	VPERM2I128 $0x02, Y0, Y14, Y3
   247
   248	// Clamp and store poly key
   249	VPAND   ·polyClampMask<>+0(SB), Y3, Y3
   250	VMOVDQA Y3, (BP)
   251
   252	// Stream for the first 64 bytes
   253	VPERM2I128 $0x13, Y0, Y14, Y0
   254	VPERM2I128 $0x13, Y12, Y4, Y14
   255
   256	// Hash AD + first 64 bytes
   257	MOVQ ad_len+80(FP), R9
   258	CALL polyHashADInternal<>(SB)
   259	XORQ CX, CX
   260
   261openAVX2InitialHash64:
   262	ADDQ  (SI)(CX*1), R10
   263	ADCQ  8(SI)(CX*1), R11
   264	ADCQ  $0x01, R12
   265	MOVQ  (BP), DX
   266	MOVQ  DX, R15
   267	MULXQ R10, R13, R14
   268	IMULQ R12, R15
   269	MULXQ R11, AX, DX
   270	ADDQ  AX, R14
   271	ADCQ  DX, R15
   272	MOVQ  8(BP), DX
   273	MULXQ R10, R10, AX
   274	ADDQ  R10, R14
   275	MULXQ R11, R11, R8
   276	ADCQ  R11, R15
   277	ADCQ  $0x00, R8
   278	IMULQ R12, DX
   279	ADDQ  AX, R15
   280	ADCQ  DX, R8
   281	MOVQ  R13, R10
   282	MOVQ  R14, R11
   283	MOVQ  R15, R12
   284	ANDQ  $0x03, R12
   285	MOVQ  R15, R13
   286	ANDQ  $-4, R13
   287	MOVQ  R8, R14
   288	SHRQ  $0x02, R8, R15
   289	SHRQ  $0x02, R8
   290	ADDQ  R13, R10
   291	ADCQ  R14, R11
   292	ADCQ  $0x00, R12
   293	ADDQ  R15, R10
   294	ADCQ  R8, R11
   295	ADCQ  $0x00, R12
   296	ADDQ  $0x10, CX
   297	CMPQ  CX, $0x40
   298	JNE   openAVX2InitialHash64
   299
   300	// Decrypt the first 64 bytes
   301	VPXOR   (SI), Y0, Y0
   302	VPXOR   32(SI), Y14, Y14
   303	VMOVDQU Y0, (DI)
   304	VMOVDQU Y14, 32(DI)
   305	LEAQ    64(SI), SI
   306	LEAQ    64(DI), DI
   307	SUBQ    $0x40, BX
   308
   309openAVX2MainLoop:
   310	CMPQ BX, $0x00000200
   311	JB   openAVX2MainLoopDone
   312
   313	// Load state, increment counter blocks, store the incremented counters
   314	VMOVDQU ·chacha20Constants<>+0(SB), Y0
   315	VMOVDQA Y0, Y5
   316	VMOVDQA Y0, Y6
   317	VMOVDQA Y0, Y7
   318	VMOVDQA 32(BP), Y14
   319	VMOVDQA Y14, Y9
   320	VMOVDQA Y14, Y10
   321	VMOVDQA Y14, Y11
   322	VMOVDQA 64(BP), Y12
   323	VMOVDQA Y12, Y13
   324	VMOVDQA Y12, Y8
   325	VMOVDQA Y12, Y15
   326	VMOVDQA 192(BP), Y4
   327	VPADDD  ·avx2IncMask<>+0(SB), Y4, Y4
   328	VPADDD  ·avx2IncMask<>+0(SB), Y4, Y1
   329	VPADDD  ·avx2IncMask<>+0(SB), Y1, Y2
   330	VPADDD  ·avx2IncMask<>+0(SB), Y2, Y3
   331	VMOVDQA Y4, 96(BP)
   332	VMOVDQA Y1, 128(BP)
   333	VMOVDQA Y2, 160(BP)
   334	VMOVDQA Y3, 192(BP)
   335	XORQ    CX, CX
   336
   337openAVX2InternalLoop:
   338	ADDQ     (SI)(CX*1), R10
   339	ADCQ     8(SI)(CX*1), R11
   340	ADCQ     $0x01, R12
   341	VPADDD   Y14, Y0, Y0
   342	VPADDD   Y9, Y5, Y5
   343	VPADDD   Y10, Y6, Y6
   344	VPADDD   Y11, Y7, Y7
   345	MOVQ     (BP), DX
   346	MOVQ     DX, R15
   347	MULXQ    R10, R13, R14
   348	IMULQ    R12, R15
   349	MULXQ    R11, AX, DX
   350	ADDQ     AX, R14
   351	ADCQ     DX, R15
   352	VPXOR    Y0, Y4, Y4
   353	VPXOR    Y5, Y1, Y1
   354	VPXOR    Y6, Y2, Y2
   355	VPXOR    Y7, Y3, Y3
   356	VPSHUFB  ·rol16<>+0(SB), Y4, Y4
   357	VPSHUFB  ·rol16<>+0(SB), Y1, Y1
   358	VPSHUFB  ·rol16<>+0(SB), Y2, Y2
   359	VPSHUFB  ·rol16<>+0(SB), Y3, Y3
   360	MOVQ     8(BP), DX
   361	MULXQ    R10, R10, AX
   362	ADDQ     R10, R14
   363	MULXQ    R11, R11, R8
   364	ADCQ     R11, R15
   365	ADCQ     $0x00, R8
   366	VPADDD   Y4, Y12, Y12
   367	VPADDD   Y1, Y13, Y13
   368	VPADDD   Y2, Y8, Y8
   369	VPADDD   Y3, Y15, Y15
   370	VPXOR    Y12, Y14, Y14
   371	VPXOR    Y13, Y9, Y9
   372	VPXOR    Y8, Y10, Y10
   373	VPXOR    Y15, Y11, Y11
   374	IMULQ    R12, DX
   375	ADDQ     AX, R15
   376	ADCQ     DX, R8
   377	VMOVDQA  Y15, 224(BP)
   378	VPSLLD   $0x0c, Y14, Y15
   379	VPSRLD   $0x14, Y14, Y14
   380	VPXOR    Y15, Y14, Y14
   381	VPSLLD   $0x0c, Y9, Y15
   382	VPSRLD   $0x14, Y9, Y9
   383	VPXOR    Y15, Y9, Y9
   384	VPSLLD   $0x0c, Y10, Y15
   385	VPSRLD   $0x14, Y10, Y10
   386	VPXOR    Y15, Y10, Y10
   387	VPSLLD   $0x0c, Y11, Y15
   388	VPSRLD   $0x14, Y11, Y11
   389	VPXOR    Y15, Y11, Y11
   390	VMOVDQA  224(BP), Y15
   391	MOVQ     R13, R10
   392	MOVQ     R14, R11
   393	MOVQ     R15, R12
   394	ANDQ     $0x03, R12
   395	MOVQ     R15, R13
   396	ANDQ     $-4, R13
   397	MOVQ     R8, R14
   398	SHRQ     $0x02, R8, R15
   399	SHRQ     $0x02, R8
   400	ADDQ     R13, R10
   401	ADCQ     R14, R11
   402	ADCQ     $0x00, R12
   403	ADDQ     R15, R10
   404	ADCQ     R8, R11
   405	ADCQ     $0x00, R12
   406	VPADDD   Y14, Y0, Y0
   407	VPADDD   Y9, Y5, Y5
   408	VPADDD   Y10, Y6, Y6
   409	VPADDD   Y11, Y7, Y7
   410	VPXOR    Y0, Y4, Y4
   411	VPXOR    Y5, Y1, Y1
   412	VPXOR    Y6, Y2, Y2
   413	VPXOR    Y7, Y3, Y3
   414	VPSHUFB  ·rol8<>+0(SB), Y4, Y4
   415	VPSHUFB  ·rol8<>+0(SB), Y1, Y1
   416	VPSHUFB  ·rol8<>+0(SB), Y2, Y2
   417	VPSHUFB  ·rol8<>+0(SB), Y3, Y3
   418	ADDQ     16(SI)(CX*1), R10
   419	ADCQ     24(SI)(CX*1), R11
   420	ADCQ     $0x01, R12
   421	VPADDD   Y4, Y12, Y12
   422	VPADDD   Y1, Y13, Y13
   423	VPADDD   Y2, Y8, Y8
   424	VPADDD   Y3, Y15, Y15
   425	MOVQ     (BP), DX
   426	MOVQ     DX, R15
   427	MULXQ    R10, R13, R14
   428	IMULQ    R12, R15
   429	MULXQ    R11, AX, DX
   430	ADDQ     AX, R14
   431	ADCQ     DX, R15
   432	VPXOR    Y12, Y14, Y14
   433	VPXOR    Y13, Y9, Y9
   434	VPXOR    Y8, Y10, Y10
   435	VPXOR    Y15, Y11, Y11
   436	VMOVDQA  Y15, 224(BP)
   437	VPSLLD   $0x07, Y14, Y15
   438	VPSRLD   $0x19, Y14, Y14
   439	VPXOR    Y15, Y14, Y14
   440	VPSLLD   $0x07, Y9, Y15
   441	VPSRLD   $0x19, Y9, Y9
   442	VPXOR    Y15, Y9, Y9
   443	VPSLLD   $0x07, Y10, Y15
   444	VPSRLD   $0x19, Y10, Y10
   445	VPXOR    Y15, Y10, Y10
   446	VPSLLD   $0x07, Y11, Y15
   447	VPSRLD   $0x19, Y11, Y11
   448	VPXOR    Y15, Y11, Y11
   449	VMOVDQA  224(BP), Y15
   450	MOVQ     8(BP), DX
   451	MULXQ    R10, R10, AX
   452	ADDQ     R10, R14
   453	MULXQ    R11, R11, R8
   454	ADCQ     R11, R15
   455	ADCQ     $0x00, R8
   456	VPALIGNR $0x04, Y14, Y14, Y14
   457	VPALIGNR $0x04, Y9, Y9, Y9
   458	VPALIGNR $0x04, Y10, Y10, Y10
   459	VPALIGNR $0x04, Y11, Y11, Y11
   460	VPALIGNR $0x08, Y12, Y12, Y12
   461	VPALIGNR $0x08, Y13, Y13, Y13
   462	VPALIGNR $0x08, Y8, Y8, Y8
   463	VPALIGNR $0x08, Y15, Y15, Y15
   464	VPALIGNR $0x0c, Y4, Y4, Y4
   465	VPALIGNR $0x0c, Y1, Y1, Y1
   466	VPALIGNR $0x0c, Y2, Y2, Y2
   467	VPALIGNR $0x0c, Y3, Y3, Y3
   468	VPADDD   Y14, Y0, Y0
   469	VPADDD   Y9, Y5, Y5
   470	VPADDD   Y10, Y6, Y6
   471	VPADDD   Y11, Y7, Y7
   472	IMULQ    R12, DX
   473	ADDQ     AX, R15
   474	ADCQ     DX, R8
   475	VPXOR    Y0, Y4, Y4
   476	VPXOR    Y5, Y1, Y1
   477	VPXOR    Y6, Y2, Y2
   478	VPXOR    Y7, Y3, Y3
   479	VPSHUFB  ·rol16<>+0(SB), Y4, Y4
   480	VPSHUFB  ·rol16<>+0(SB), Y1, Y1
   481	VPSHUFB  ·rol16<>+0(SB), Y2, Y2
   482	VPSHUFB  ·rol16<>+0(SB), Y3, Y3
   483	MOVQ     R13, R10
   484	MOVQ     R14, R11
   485	MOVQ     R15, R12
   486	ANDQ     $0x03, R12
   487	MOVQ     R15, R13
   488	ANDQ     $-4, R13
   489	MOVQ     R8, R14
   490	SHRQ     $0x02, R8, R15
   491	SHRQ     $0x02, R8
   492	ADDQ     R13, R10
   493	ADCQ     R14, R11
   494	ADCQ     $0x00, R12
   495	ADDQ     R15, R10
   496	ADCQ     R8, R11
   497	ADCQ     $0x00, R12
   498	VPADDD   Y4, Y12, Y12
   499	VPADDD   Y1, Y13, Y13
   500	VPADDD   Y2, Y8, Y8
   501	VPADDD   Y3, Y15, Y15
   502	VPXOR    Y12, Y14, Y14
   503	VPXOR    Y13, Y9, Y9
   504	VPXOR    Y8, Y10, Y10
   505	VPXOR    Y15, Y11, Y11
   506	ADDQ     32(SI)(CX*1), R10
   507	ADCQ     40(SI)(CX*1), R11
   508	ADCQ     $0x01, R12
   509	LEAQ     48(CX), CX
   510	VMOVDQA  Y15, 224(BP)
   511	VPSLLD   $0x0c, Y14, Y15
   512	VPSRLD   $0x14, Y14, Y14
   513	VPXOR    Y15, Y14, Y14
   514	VPSLLD   $0x0c, Y9, Y15
   515	VPSRLD   $0x14, Y9, Y9
   516	VPXOR    Y15, Y9, Y9
   517	VPSLLD   $0x0c, Y10, Y15
   518	VPSRLD   $0x14, Y10, Y10
   519	VPXOR    Y15, Y10, Y10
   520	VPSLLD   $0x0c, Y11, Y15
   521	VPSRLD   $0x14, Y11, Y11
   522	VPXOR    Y15, Y11, Y11
   523	VMOVDQA  224(BP), Y15
   524	MOVQ     (BP), DX
   525	MOVQ     DX, R15
   526	MULXQ    R10, R13, R14
   527	IMULQ    R12, R15
   528	MULXQ    R11, AX, DX
   529	ADDQ     AX, R14
   530	ADCQ     DX, R15
   531	VPADDD   Y14, Y0, Y0
   532	VPADDD   Y9, Y5, Y5
   533	VPADDD   Y10, Y6, Y6
   534	VPADDD   Y11, Y7, Y7
   535	VPXOR    Y0, Y4, Y4
   536	VPXOR    Y5, Y1, Y1
   537	VPXOR    Y6, Y2, Y2
   538	VPXOR    Y7, Y3, Y3
   539	MOVQ     8(BP), DX
   540	MULXQ    R10, R10, AX
   541	ADDQ     R10, R14
   542	MULXQ    R11, R11, R8
   543	ADCQ     R11, R15
   544	ADCQ     $0x00, R8
   545	VPSHUFB  ·rol8<>+0(SB), Y4, Y4
   546	VPSHUFB  ·rol8<>+0(SB), Y1, Y1
   547	VPSHUFB  ·rol8<>+0(SB), Y2, Y2
   548	VPSHUFB  ·rol8<>+0(SB), Y3, Y3
   549	VPADDD   Y4, Y12, Y12
   550	VPADDD   Y1, Y13, Y13
   551	VPADDD   Y2, Y8, Y8
   552	VPADDD   Y3, Y15, Y15
   553	IMULQ    R12, DX
   554	ADDQ     AX, R15
   555	ADCQ     DX, R8
   556	VPXOR    Y12, Y14, Y14
   557	VPXOR    Y13, Y9, Y9
   558	VPXOR    Y8, Y10, Y10
   559	VPXOR    Y15, Y11, Y11
   560	VMOVDQA  Y15, 224(BP)
   561	VPSLLD   $0x07, Y14, Y15
   562	VPSRLD   $0x19, Y14, Y14
   563	VPXOR    Y15, Y14, Y14
   564	VPSLLD   $0x07, Y9, Y15
   565	VPSRLD   $0x19, Y9, Y9
   566	VPXOR    Y15, Y9, Y9
   567	VPSLLD   $0x07, Y10, Y15
   568	VPSRLD   $0x19, Y10, Y10
   569	VPXOR    Y15, Y10, Y10
   570	VPSLLD   $0x07, Y11, Y15
   571	VPSRLD   $0x19, Y11, Y11
   572	VPXOR    Y15, Y11, Y11
   573	VMOVDQA  224(BP), Y15
   574	MOVQ     R13, R10
   575	MOVQ     R14, R11
   576	MOVQ     R15, R12
   577	ANDQ     $0x03, R12
   578	MOVQ     R15, R13
   579	ANDQ     $-4, R13
   580	MOVQ     R8, R14
   581	SHRQ     $0x02, R8, R15
   582	SHRQ     $0x02, R8
   583	ADDQ     R13, R10
   584	ADCQ     R14, R11
   585	ADCQ     $0x00, R12
   586	ADDQ     R15, R10
   587	ADCQ     R8, R11
   588	ADCQ     $0x00, R12
   589	VPALIGNR $0x0c, Y14, Y14, Y14
   590	VPALIGNR $0x0c, Y9, Y9, Y9
   591	VPALIGNR $0x0c, Y10, Y10, Y10
   592	VPALIGNR $0x0c, Y11, Y11, Y11
   593	VPALIGNR $0x08, Y12, Y12, Y12
   594	VPALIGNR $0x08, Y13, Y13, Y13
   595	VPALIGNR $0x08, Y8, Y8, Y8
   596	VPALIGNR $0x08, Y15, Y15, Y15
   597	VPALIGNR $0x04, Y4, Y4, Y4
   598	VPALIGNR $0x04, Y1, Y1, Y1
   599	VPALIGNR $0x04, Y2, Y2, Y2
   600	VPALIGNR $0x04, Y3, Y3, Y3
   601	CMPQ     CX, $0x000001e0
   602	JNE      openAVX2InternalLoop
   603	VPADDD   ·chacha20Constants<>+0(SB), Y0, Y0
   604	VPADDD   ·chacha20Constants<>+0(SB), Y5, Y5
   605	VPADDD   ·chacha20Constants<>+0(SB), Y6, Y6
   606	VPADDD   ·chacha20Constants<>+0(SB), Y7, Y7
   607	VPADDD   32(BP), Y14, Y14
   608	VPADDD   32(BP), Y9, Y9
   609	VPADDD   32(BP), Y10, Y10
   610	VPADDD   32(BP), Y11, Y11
   611	VPADDD   64(BP), Y12, Y12
   612	VPADDD   64(BP), Y13, Y13
   613	VPADDD   64(BP), Y8, Y8
   614	VPADDD   64(BP), Y15, Y15
   615	VPADDD   96(BP), Y4, Y4
   616	VPADDD   128(BP), Y1, Y1
   617	VPADDD   160(BP), Y2, Y2
   618	VPADDD   192(BP), Y3, Y3
   619	VMOVDQA  Y15, 224(BP)
   620
   621	// We only hashed 480 of the 512 bytes available - hash the remaining 32 here
   622	ADDQ       480(SI), R10
   623	ADCQ       488(SI), R11
   624	ADCQ       $0x01, R12
   625	MOVQ       (BP), DX
   626	MOVQ       DX, R15
   627	MULXQ      R10, R13, R14
   628	IMULQ      R12, R15
   629	MULXQ      R11, AX, DX
   630	ADDQ       AX, R14
   631	ADCQ       DX, R15
   632	MOVQ       8(BP), DX
   633	MULXQ      R10, R10, AX
   634	ADDQ       R10, R14
   635	MULXQ      R11, R11, R8
   636	ADCQ       R11, R15
   637	ADCQ       $0x00, R8
   638	IMULQ      R12, DX
   639	ADDQ       AX, R15
   640	ADCQ       DX, R8
   641	MOVQ       R13, R10
   642	MOVQ       R14, R11
   643	MOVQ       R15, R12
   644	ANDQ       $0x03, R12
   645	MOVQ       R15, R13
   646	ANDQ       $-4, R13
   647	MOVQ       R8, R14
   648	SHRQ       $0x02, R8, R15
   649	SHRQ       $0x02, R8
   650	ADDQ       R13, R10
   651	ADCQ       R14, R11
   652	ADCQ       $0x00, R12
   653	ADDQ       R15, R10
   654	ADCQ       R8, R11
   655	ADCQ       $0x00, R12
   656	VPERM2I128 $0x02, Y0, Y14, Y15
   657	VPERM2I128 $0x13, Y0, Y14, Y14
   658	VPERM2I128 $0x02, Y12, Y4, Y0
   659	VPERM2I128 $0x13, Y12, Y4, Y12
   660	VPXOR      (SI), Y15, Y15
   661	VPXOR      32(SI), Y0, Y0
   662	VPXOR      64(SI), Y14, Y14
   663	VPXOR      96(SI), Y12, Y12
   664	VMOVDQU    Y15, (DI)
   665	VMOVDQU    Y0, 32(DI)
   666	VMOVDQU    Y14, 64(DI)
   667	VMOVDQU    Y12, 96(DI)
   668	VPERM2I128 $0x02, Y5, Y9, Y0
   669	VPERM2I128 $0x02, Y13, Y1, Y14
   670	VPERM2I128 $0x13, Y5, Y9, Y12
   671	VPERM2I128 $0x13, Y13, Y1, Y4
   672	VPXOR      128(SI), Y0, Y0
   673	VPXOR      160(SI), Y14, Y14
   674	VPXOR      192(SI), Y12, Y12
   675	VPXOR      224(SI), Y4, Y4
   676	VMOVDQU    Y0, 128(DI)
   677	VMOVDQU    Y14, 160(DI)
   678	VMOVDQU    Y12, 192(DI)
   679	VMOVDQU    Y4, 224(DI)
   680
   681	// and here
   682	ADDQ       496(SI), R10
   683	ADCQ       504(SI), R11
   684	ADCQ       $0x01, R12
   685	MOVQ       (BP), DX
   686	MOVQ       DX, R15
   687	MULXQ      R10, R13, R14
   688	IMULQ      R12, R15
   689	MULXQ      R11, AX, DX
   690	ADDQ       AX, R14
   691	ADCQ       DX, R15
   692	MOVQ       8(BP), DX
   693	MULXQ      R10, R10, AX
   694	ADDQ       R10, R14
   695	MULXQ      R11, R11, R8
   696	ADCQ       R11, R15
   697	ADCQ       $0x00, R8
   698	IMULQ      R12, DX
   699	ADDQ       AX, R15
   700	ADCQ       DX, R8
   701	MOVQ       R13, R10
   702	MOVQ       R14, R11
   703	MOVQ       R15, R12
   704	ANDQ       $0x03, R12
   705	MOVQ       R15, R13
   706	ANDQ       $-4, R13
   707	MOVQ       R8, R14
   708	SHRQ       $0x02, R8, R15
   709	SHRQ       $0x02, R8
   710	ADDQ       R13, R10
   711	ADCQ       R14, R11
   712	ADCQ       $0x00, R12
   713	ADDQ       R15, R10
   714	ADCQ       R8, R11
   715	ADCQ       $0x00, R12
   716	VPERM2I128 $0x02, Y6, Y10, Y0
   717	VPERM2I128 $0x02, Y8, Y2, Y14
   718	VPERM2I128 $0x13, Y6, Y10, Y12
   719	VPERM2I128 $0x13, Y8, Y2, Y4
   720	VPXOR      256(SI), Y0, Y0
   721	VPXOR      288(SI), Y14, Y14
   722	VPXOR      320(SI), Y12, Y12
   723	VPXOR      352(SI), Y4, Y4
   724	VMOVDQU    Y0, 256(DI)
   725	VMOVDQU    Y14, 288(DI)
   726	VMOVDQU    Y12, 320(DI)
   727	VMOVDQU    Y4, 352(DI)
   728	VPERM2I128 $0x02, Y7, Y11, Y0
   729	VPERM2I128 $0x02, 224(BP), Y3, Y14
   730	VPERM2I128 $0x13, Y7, Y11, Y12
   731	VPERM2I128 $0x13, 224(BP), Y3, Y4
   732	VPXOR      384(SI), Y0, Y0
   733	VPXOR      416(SI), Y14, Y14
   734	VPXOR      448(SI), Y12, Y12
   735	VPXOR      480(SI), Y4, Y4
   736	VMOVDQU    Y0, 384(DI)
   737	VMOVDQU    Y14, 416(DI)
   738	VMOVDQU    Y12, 448(DI)
   739	VMOVDQU    Y4, 480(DI)
   740	LEAQ       512(SI), SI
   741	LEAQ       512(DI), DI
   742	SUBQ       $0x00000200, BX
   743	JMP        openAVX2MainLoop
   744
   745openAVX2MainLoopDone:
   746	// Handle the various tail sizes efficiently
   747	TESTQ BX, BX
   748	JE    openSSEFinalize
   749	CMPQ  BX, $0x80
   750	JBE   openAVX2Tail128
   751	CMPQ  BX, $0x00000100
   752	JBE   openAVX2Tail256
   753	CMPQ  BX, $0x00000180
   754	JBE   openAVX2Tail384
   755	JMP   openAVX2Tail512
   756
   757openSSEFinalize:
   758	// Hash in the PT, AAD lengths
   759	ADDQ  ad_len+80(FP), R10
   760	ADCQ  src_len+56(FP), R11
   761	ADCQ  $0x01, R12
   762	MOVQ  (BP), AX
   763	MOVQ  AX, R15
   764	MULQ  R10
   765	MOVQ  AX, R13
   766	MOVQ  DX, R14
   767	MOVQ  (BP), AX
   768	MULQ  R11
   769	IMULQ R12, R15
   770	ADDQ  AX, R14
   771	ADCQ  DX, R15
   772	MOVQ  8(BP), AX
   773	MOVQ  AX, R8
   774	MULQ  R10
   775	ADDQ  AX, R14
   776	ADCQ  $0x00, DX
   777	MOVQ  DX, R10
   778	MOVQ  8(BP), AX
   779	MULQ  R11
   780	ADDQ  AX, R15
   781	ADCQ  $0x00, DX
   782	IMULQ R12, R8
   783	ADDQ  R10, R15
   784	ADCQ  DX, R8
   785	MOVQ  R13, R10
   786	MOVQ  R14, R11
   787	MOVQ  R15, R12
   788	ANDQ  $0x03, R12
   789	MOVQ  R15, R13
   790	ANDQ  $-4, R13
   791	MOVQ  R8, R14
   792	SHRQ  $0x02, R8, R15
   793	SHRQ  $0x02, R8
   794	ADDQ  R13, R10
   795	ADCQ  R14, R11
   796	ADCQ  $0x00, R12
   797	ADDQ  R15, R10
   798	ADCQ  R8, R11
   799	ADCQ  $0x00, R12
   800
   801	// Final reduce
   802	MOVQ    R10, R13
   803	MOVQ    R11, R14
   804	MOVQ    R12, R15
   805	SUBQ    $-5, R10
   806	SBBQ    $-1, R11
   807	SBBQ    $0x03, R12
   808	CMOVQCS R13, R10
   809	CMOVQCS R14, R11
   810	CMOVQCS R15, R12
   811
   812	// Add in the "s" part of the key
   813	ADDQ 16(BP), R10
   814	ADCQ 24(BP), R11
   815
   816	// Finally, constant time compare to the tag at the end of the message
   817	XORQ    AX, AX
   818	MOVQ    $0x00000001, DX
   819	XORQ    (SI), R10
   820	XORQ    8(SI), R11
   821	ORQ     R11, R10
   822	CMOVQEQ DX, AX
   823
   824	// Return true iff tags are equal
   825	MOVB AX, ret+96(FP)
   826	RET
   827
   828openSSETail16:
   829	TESTQ BX, BX
   830	JE    openSSEFinalize
   831
   832	// We can safely load the CT from the end, because it is padded with the MAC
   833	MOVQ  BX, R9
   834	SHLQ  $0x04, R9
   835	LEAQ  ·andMask<>+0(SB), R13
   836	MOVOU (SI), X12
   837	ADDQ  BX, SI
   838	PAND  -16(R13)(R9*1), X12
   839	MOVO  X12, 64(BP)
   840	MOVQ  X12, R13
   841	MOVQ  72(BP), R14
   842	PXOR  X1, X12
   843
   844	// We can only store one byte at a time, since plaintext can be shorter than 16 bytes
   845openSSETail16Store:
   846	MOVQ   X12, R8
   847	MOVB   R8, (DI)
   848	PSRLDQ $0x01, X12
   849	INCQ   DI
   850	DECQ   BX
   851	JNE    openSSETail16Store
   852	ADDQ   R13, R10
   853	ADCQ   R14, R11
   854	ADCQ   $0x01, R12
   855	MOVQ   (BP), AX
   856	MOVQ   AX, R15
   857	MULQ   R10
   858	MOVQ   AX, R13
   859	MOVQ   DX, R14
   860	MOVQ   (BP), AX
   861	MULQ   R11
   862	IMULQ  R12, R15
   863	ADDQ   AX, R14
   864	ADCQ   DX, R15
   865	MOVQ   8(BP), AX
   866	MOVQ   AX, R8
   867	MULQ   R10
   868	ADDQ   AX, R14
   869	ADCQ   $0x00, DX
   870	MOVQ   DX, R10
   871	MOVQ   8(BP), AX
   872	MULQ   R11
   873	ADDQ   AX, R15
   874	ADCQ   $0x00, DX
   875	IMULQ  R12, R8
   876	ADDQ   R10, R15
   877	ADCQ   DX, R8
   878	MOVQ   R13, R10
   879	MOVQ   R14, R11
   880	MOVQ   R15, R12
   881	ANDQ   $0x03, R12
   882	MOVQ   R15, R13
   883	ANDQ   $-4, R13
   884	MOVQ   R8, R14
   885	SHRQ   $0x02, R8, R15
   886	SHRQ   $0x02, R8
   887	ADDQ   R13, R10
   888	ADCQ   R14, R11
   889	ADCQ   $0x00, R12
   890	ADDQ   R15, R10
   891	ADCQ   R8, R11
   892	ADCQ   $0x00, R12
   893	JMP    openSSEFinalize
   894
   895openAVX2192:
   896	VMOVDQA Y0, Y5
   897	VMOVDQA Y14, Y9
   898	VMOVDQA Y12, Y13
   899	VPADDD  ·avx2IncMask<>+0(SB), Y4, Y1
   900	VMOVDQA Y0, Y6
   901	VMOVDQA Y14, Y10
   902	VMOVDQA Y12, Y8
   903	VMOVDQA Y4, Y2
   904	VMOVDQA Y1, Y15
   905	MOVQ    $0x0000000a, R9
   906
   907openAVX2192InnerCipherLoop:
   908	VPADDD     Y14, Y0, Y0
   909	VPXOR      Y0, Y4, Y4
   910	VPSHUFB    ·rol16<>+0(SB), Y4, Y4
   911	VPADDD     Y4, Y12, Y12
   912	VPXOR      Y12, Y14, Y14
   913	VPSLLD     $0x0c, Y14, Y3
   914	VPSRLD     $0x14, Y14, Y14
   915	VPXOR      Y3, Y14, Y14
   916	VPADDD     Y14, Y0, Y0
   917	VPXOR      Y0, Y4, Y4
   918	VPSHUFB    ·rol8<>+0(SB), Y4, Y4
   919	VPADDD     Y4, Y12, Y12
   920	VPXOR      Y12, Y14, Y14
   921	VPSLLD     $0x07, Y14, Y3
   922	VPSRLD     $0x19, Y14, Y14
   923	VPXOR      Y3, Y14, Y14
   924	VPADDD     Y9, Y5, Y5
   925	VPXOR      Y5, Y1, Y1
   926	VPSHUFB    ·rol16<>+0(SB), Y1, Y1
   927	VPADDD     Y1, Y13, Y13
   928	VPXOR      Y13, Y9, Y9
   929	VPSLLD     $0x0c, Y9, Y3
   930	VPSRLD     $0x14, Y9, Y9
   931	VPXOR      Y3, Y9, Y9
   932	VPADDD     Y9, Y5, Y5
   933	VPXOR      Y5, Y1, Y1
   934	VPSHUFB    ·rol8<>+0(SB), Y1, Y1
   935	VPADDD     Y1, Y13, Y13
   936	VPXOR      Y13, Y9, Y9
   937	VPSLLD     $0x07, Y9, Y3
   938	VPSRLD     $0x19, Y9, Y9
   939	VPXOR      Y3, Y9, Y9
   940	VPALIGNR   $0x04, Y14, Y14, Y14
   941	VPALIGNR   $0x04, Y9, Y9, Y9
   942	VPALIGNR   $0x08, Y12, Y12, Y12
   943	VPALIGNR   $0x08, Y13, Y13, Y13
   944	VPALIGNR   $0x0c, Y4, Y4, Y4
   945	VPALIGNR   $0x0c, Y1, Y1, Y1
   946	VPADDD     Y14, Y0, Y0
   947	VPXOR      Y0, Y4, Y4
   948	VPSHUFB    ·rol16<>+0(SB), Y4, Y4
   949	VPADDD     Y4, Y12, Y12
   950	VPXOR      Y12, Y14, Y14
   951	VPSLLD     $0x0c, Y14, Y3
   952	VPSRLD     $0x14, Y14, Y14
   953	VPXOR      Y3, Y14, Y14
   954	VPADDD     Y14, Y0, Y0
   955	VPXOR      Y0, Y4, Y4
   956	VPSHUFB    ·rol8<>+0(SB), Y4, Y4
   957	VPADDD     Y4, Y12, Y12
   958	VPXOR      Y12, Y14, Y14
   959	VPSLLD     $0x07, Y14, Y3
   960	VPSRLD     $0x19, Y14, Y14
   961	VPXOR      Y3, Y14, Y14
   962	VPADDD     Y9, Y5, Y5
   963	VPXOR      Y5, Y1, Y1
   964	VPSHUFB    ·rol16<>+0(SB), Y1, Y1
   965	VPADDD     Y1, Y13, Y13
   966	VPXOR      Y13, Y9, Y9
   967	VPSLLD     $0x0c, Y9, Y3
   968	VPSRLD     $0x14, Y9, Y9
   969	VPXOR      Y3, Y9, Y9
   970	VPADDD     Y9, Y5, Y5
   971	VPXOR      Y5, Y1, Y1
   972	VPSHUFB    ·rol8<>+0(SB), Y1, Y1
   973	VPADDD     Y1, Y13, Y13
   974	VPXOR      Y13, Y9, Y9
   975	VPSLLD     $0x07, Y9, Y3
   976	VPSRLD     $0x19, Y9, Y9
   977	VPXOR      Y3, Y9, Y9
   978	VPALIGNR   $0x0c, Y14, Y14, Y14
   979	VPALIGNR   $0x0c, Y9, Y9, Y9
   980	VPALIGNR   $0x08, Y12, Y12, Y12
   981	VPALIGNR   $0x08, Y13, Y13, Y13
   982	VPALIGNR   $0x04, Y4, Y4, Y4
   983	VPALIGNR   $0x04, Y1, Y1, Y1
   984	DECQ       R9
   985	JNE        openAVX2192InnerCipherLoop
   986	VPADDD     Y6, Y0, Y0
   987	VPADDD     Y6, Y5, Y5
   988	VPADDD     Y10, Y14, Y14
   989	VPADDD     Y10, Y9, Y9
   990	VPADDD     Y8, Y12, Y12
   991	VPADDD     Y8, Y13, Y13
   992	VPADDD     Y2, Y4, Y4
   993	VPADDD     Y15, Y1, Y1
   994	VPERM2I128 $0x02, Y0, Y14, Y3
   995
   996	// Clamp and store poly key
   997	VPAND   ·polyClampMask<>+0(SB), Y3, Y3
   998	VMOVDQA Y3, (BP)
   999
  1000	// Stream for up to 192 bytes
  1001	VPERM2I128 $0x13, Y0, Y14, Y0
  1002	VPERM2I128 $0x13, Y12, Y4, Y14
  1003	VPERM2I128 $0x02, Y5, Y9, Y12
  1004	VPERM2I128 $0x02, Y13, Y1, Y4
  1005	VPERM2I128 $0x13, Y5, Y9, Y5
  1006	VPERM2I128 $0x13, Y13, Y1, Y9
  1007
  1008openAVX2ShortOpen:
  1009	// Hash
  1010	MOVQ ad_len+80(FP), R9
  1011	CALL polyHashADInternal<>(SB)
  1012
  1013openAVX2ShortOpenLoop:
  1014	CMPQ BX, $0x20
  1015	JB   openAVX2ShortTail32
  1016	SUBQ $0x20, BX
  1017
  1018	// Load for hashing
  1019	ADDQ  (SI), R10
  1020	ADCQ  8(SI), R11
  1021	ADCQ  $0x01, R12
  1022	MOVQ  (BP), DX
  1023	MOVQ  DX, R15
  1024	MULXQ R10, R13, R14
  1025	IMULQ R12, R15
  1026	MULXQ R11, AX, DX
  1027	ADDQ  AX, R14
  1028	ADCQ  DX, R15
  1029	MOVQ  8(BP), DX
  1030	MULXQ R10, R10, AX
  1031	ADDQ  R10, R14
  1032	MULXQ R11, R11, R8
  1033	ADCQ  R11, R15
  1034	ADCQ  $0x00, R8
  1035	IMULQ R12, DX
  1036	ADDQ  AX, R15
  1037	ADCQ  DX, R8
  1038	MOVQ  R13, R10
  1039	MOVQ  R14, R11
  1040	MOVQ  R15, R12
  1041	ANDQ  $0x03, R12
  1042	MOVQ  R15, R13
  1043	ANDQ  $-4, R13
  1044	MOVQ  R8, R14
  1045	SHRQ  $0x02, R8, R15
  1046	SHRQ  $0x02, R8
  1047	ADDQ  R13, R10
  1048	ADCQ  R14, R11
  1049	ADCQ  $0x00, R12
  1050	ADDQ  R15, R10
  1051	ADCQ  R8, R11
  1052	ADCQ  $0x00, R12
  1053	ADDQ  16(SI), R10
  1054	ADCQ  24(SI), R11
  1055	ADCQ  $0x01, R12
  1056	MOVQ  (BP), DX
  1057	MOVQ  DX, R15
  1058	MULXQ R10, R13, R14
  1059	IMULQ R12, R15
  1060	MULXQ R11, AX, DX
  1061	ADDQ  AX, R14
  1062	ADCQ  DX, R15
  1063	MOVQ  8(BP), DX
  1064	MULXQ R10, R10, AX
  1065	ADDQ  R10, R14
  1066	MULXQ R11, R11, R8
  1067	ADCQ  R11, R15
  1068	ADCQ  $0x00, R8
  1069	IMULQ R12, DX
  1070	ADDQ  AX, R15
  1071	ADCQ  DX, R8
  1072	MOVQ  R13, R10
  1073	MOVQ  R14, R11
  1074	MOVQ  R15, R12
  1075	ANDQ  $0x03, R12
  1076	MOVQ  R15, R13
  1077	ANDQ  $-4, R13
  1078	MOVQ  R8, R14
  1079	SHRQ  $0x02, R8, R15
  1080	SHRQ  $0x02, R8
  1081	ADDQ  R13, R10
  1082	ADCQ  R14, R11
  1083	ADCQ  $0x00, R12
  1084	ADDQ  R15, R10
  1085	ADCQ  R8, R11
  1086	ADCQ  $0x00, R12
  1087
  1088	// Load for decryption
  1089	VPXOR   (SI), Y0, Y0
  1090	VMOVDQU Y0, (DI)
  1091	LEAQ    32(SI), SI
  1092	LEAQ    32(DI), DI
  1093
  1094	// Shift stream left
  1095	VMOVDQA Y14, Y0
  1096	VMOVDQA Y12, Y14
  1097	VMOVDQA Y4, Y12
  1098	VMOVDQA Y5, Y4
  1099	VMOVDQA Y9, Y5
  1100	VMOVDQA Y13, Y9
  1101	VMOVDQA Y1, Y13
  1102	VMOVDQA Y6, Y1
  1103	VMOVDQA Y10, Y6
  1104	JMP     openAVX2ShortOpenLoop
  1105
  1106openAVX2ShortTail32:
  1107	CMPQ    BX, $0x10
  1108	VMOVDQA X0, X1
  1109	JB      openAVX2ShortDone
  1110	SUBQ    $0x10, BX
  1111
  1112	// Load for hashing
  1113	ADDQ  (SI), R10
  1114	ADCQ  8(SI), R11
  1115	ADCQ  $0x01, R12
  1116	MOVQ  (BP), DX
  1117	MOVQ  DX, R15
  1118	MULXQ R10, R13, R14
  1119	IMULQ R12, R15
  1120	MULXQ R11, AX, DX
  1121	ADDQ  AX, R14
  1122	ADCQ  DX, R15
  1123	MOVQ  8(BP), DX
  1124	MULXQ R10, R10, AX
  1125	ADDQ  R10, R14
  1126	MULXQ R11, R11, R8
  1127	ADCQ  R11, R15
  1128	ADCQ  $0x00, R8
  1129	IMULQ R12, DX
  1130	ADDQ  AX, R15
  1131	ADCQ  DX, R8
  1132	MOVQ  R13, R10
  1133	MOVQ  R14, R11
  1134	MOVQ  R15, R12
  1135	ANDQ  $0x03, R12
  1136	MOVQ  R15, R13
  1137	ANDQ  $-4, R13
  1138	MOVQ  R8, R14
  1139	SHRQ  $0x02, R8, R15
  1140	SHRQ  $0x02, R8
  1141	ADDQ  R13, R10
  1142	ADCQ  R14, R11
  1143	ADCQ  $0x00, R12
  1144	ADDQ  R15, R10
  1145	ADCQ  R8, R11
  1146	ADCQ  $0x00, R12
  1147
  1148	// Load for decryption
  1149	VPXOR      (SI), X0, X12
  1150	VMOVDQU    X12, (DI)
  1151	LEAQ       16(SI), SI
  1152	LEAQ       16(DI), DI
  1153	VPERM2I128 $0x11, Y0, Y0, Y0
  1154	VMOVDQA    X0, X1
  1155
  1156openAVX2ShortDone:
  1157	VZEROUPPER
  1158	JMP openSSETail16
  1159
  1160openAVX2320:
  1161	VMOVDQA Y0, Y5
  1162	VMOVDQA Y14, Y9
  1163	VMOVDQA Y12, Y13
  1164	VPADDD  ·avx2IncMask<>+0(SB), Y4, Y1
  1165	VMOVDQA Y0, Y6
  1166	VMOVDQA Y14, Y10
  1167	VMOVDQA Y12, Y8
  1168	VPADDD  ·avx2IncMask<>+0(SB), Y1, Y2
  1169	VMOVDQA Y14, Y7
  1170	VMOVDQA Y12, Y11
  1171	VMOVDQA Y4, Y15
  1172	MOVQ    $0x0000000a, R9
  1173
  1174openAVX2320InnerCipherLoop:
  1175	VPADDD   Y14, Y0, Y0
  1176	VPXOR    Y0, Y4, Y4
  1177	VPSHUFB  ·rol16<>+0(SB), Y4, Y4
  1178	VPADDD   Y4, Y12, Y12
  1179	VPXOR    Y12, Y14, Y14
  1180	VPSLLD   $0x0c, Y14, Y3
  1181	VPSRLD   $0x14, Y14, Y14
  1182	VPXOR    Y3, Y14, Y14
  1183	VPADDD   Y14, Y0, Y0
  1184	VPXOR    Y0, Y4, Y4
  1185	VPSHUFB  ·rol8<>+0(SB), Y4, Y4
  1186	VPADDD   Y4, Y12, Y12
  1187	VPXOR    Y12, Y14, Y14
  1188	VPSLLD   $0x07, Y14, Y3
  1189	VPSRLD   $0x19, Y14, Y14
  1190	VPXOR    Y3, Y14, Y14
  1191	VPADDD   Y9, Y5, Y5
  1192	VPXOR    Y5, Y1, Y1
  1193	VPSHUFB  ·rol16<>+0(SB), Y1, Y1
  1194	VPADDD   Y1, Y13, Y13
  1195	VPXOR    Y13, Y9, Y9
  1196	VPSLLD   $0x0c, Y9, Y3
  1197	VPSRLD   $0x14, Y9, Y9
  1198	VPXOR    Y3, Y9, Y9
  1199	VPADDD   Y9, Y5, Y5
  1200	VPXOR    Y5, Y1, Y1
  1201	VPSHUFB  ·rol8<>+0(SB), Y1, Y1
  1202	VPADDD   Y1, Y13, Y13
  1203	VPXOR    Y13, Y9, Y9
  1204	VPSLLD   $0x07, Y9, Y3
  1205	VPSRLD   $0x19, Y9, Y9
  1206	VPXOR    Y3, Y9, Y9
  1207	VPADDD   Y10, Y6, Y6
  1208	VPXOR    Y6, Y2, Y2
  1209	VPSHUFB  ·rol16<>+0(SB), Y2, Y2
  1210	VPADDD   Y2, Y8, Y8
  1211	VPXOR    Y8, Y10, Y10
  1212	VPSLLD   $0x0c, Y10, Y3
  1213	VPSRLD   $0x14, Y10, Y10
  1214	VPXOR    Y3, Y10, Y10
  1215	VPADDD   Y10, Y6, Y6
  1216	VPXOR    Y6, Y2, Y2
  1217	VPSHUFB  ·rol8<>+0(SB), Y2, Y2
  1218	VPADDD   Y2, Y8, Y8
  1219	VPXOR    Y8, Y10, Y10
  1220	VPSLLD   $0x07, Y10, Y3
  1221	VPSRLD   $0x19, Y10, Y10
  1222	VPXOR    Y3, Y10, Y10
  1223	VPALIGNR $0x04, Y14, Y14, Y14
  1224	VPALIGNR $0x04, Y9, Y9, Y9
  1225	VPALIGNR $0x04, Y10, Y10, Y10
  1226	VPALIGNR $0x08, Y12, Y12, Y12
  1227	VPALIGNR $0x08, Y13, Y13, Y13
  1228	VPALIGNR $0x08, Y8, Y8, Y8
  1229	VPALIGNR $0x0c, Y4, Y4, Y4
  1230	VPALIGNR $0x0c, Y1, Y1, Y1
  1231	VPALIGNR $0x0c, Y2, Y2, Y2
  1232	VPADDD   Y14, Y0, Y0
  1233	VPXOR    Y0, Y4, Y4
  1234	VPSHUFB  ·rol16<>+0(SB), Y4, Y4
  1235	VPADDD   Y4, Y12, Y12
  1236	VPXOR    Y12, Y14, Y14
  1237	VPSLLD   $0x0c, Y14, Y3
  1238	VPSRLD   $0x14, Y14, Y14
  1239	VPXOR    Y3, Y14, Y14
  1240	VPADDD   Y14, Y0, Y0
  1241	VPXOR    Y0, Y4, Y4
  1242	VPSHUFB  ·rol8<>+0(SB), Y4, Y4
  1243	VPADDD   Y4, Y12, Y12
  1244	VPXOR    Y12, Y14, Y14
  1245	VPSLLD   $0x07, Y14, Y3
  1246	VPSRLD   $0x19, Y14, Y14
  1247	VPXOR    Y3, Y14, Y14
  1248	VPADDD   Y9, Y5, Y5
  1249	VPXOR    Y5, Y1, Y1
  1250	VPSHUFB  ·rol16<>+0(SB), Y1, Y1
  1251	VPADDD   Y1, Y13, Y13
  1252	VPXOR    Y13, Y9, Y9
  1253	VPSLLD   $0x0c, Y9, Y3
  1254	VPSRLD   $0x14, Y9, Y9
  1255	VPXOR    Y3, Y9, Y9
  1256	VPADDD   Y9, Y5, Y5
  1257	VPXOR    Y5, Y1, Y1
  1258	VPSHUFB  ·rol8<>+0(SB), Y1, Y1
  1259	VPADDD   Y1, Y13, Y13
  1260	VPXOR    Y13, Y9, Y9
  1261	VPSLLD   $0x07, Y9, Y3
  1262	VPSRLD   $0x19, Y9, Y9
  1263	VPXOR    Y3, Y9, Y9
  1264	VPADDD   Y10, Y6, Y6
  1265	VPXOR    Y6, Y2, Y2
  1266	VPSHUFB  ·rol16<>+0(SB), Y2, Y2
  1267	VPADDD   Y2, Y8, Y8
  1268	VPXOR    Y8, Y10, Y10
  1269	VPSLLD   $0x0c, Y10, Y3
  1270	VPSRLD   $0x14, Y10, Y10
  1271	VPXOR    Y3, Y10, Y10
  1272	VPADDD   Y10, Y6, Y6
  1273	VPXOR    Y6, Y2, Y2
  1274	VPSHUFB  ·rol8<>+0(SB), Y2, Y2
  1275	VPADDD   Y2, Y8, Y8
  1276	VPXOR    Y8, Y10, Y10
  1277	VPSLLD   $0x07, Y10, Y3
  1278	VPSRLD   $0x19, Y10, Y10
  1279	VPXOR    Y3, Y10, Y10
  1280	VPALIGNR $0x0c, Y14, Y14, Y14
  1281	VPALIGNR $0x0c, Y9, Y9, Y9
  1282	VPALIGNR $0x0c, Y10, Y10, Y10
  1283	VPALIGNR $0x08, Y12, Y12, Y12
  1284	VPALIGNR $0x08, Y13, Y13, Y13
  1285	VPALIGNR $0x08, Y8, Y8, Y8
  1286	VPALIGNR $0x04, Y4, Y4, Y4
  1287	VPALIGNR $0x04, Y1, Y1, Y1
  1288	VPALIGNR $0x04, Y2, Y2, Y2
  1289	DECQ     R9
  1290	JNE      openAVX2320InnerCipherLoop
  1291	VMOVDQA  ·chacha20Constants<>+0(SB), Y3
  1292	VPADDD   Y3, Y0, Y0
  1293	VPADDD   Y3, Y5, Y5
  1294	VPADDD   Y3, Y6, Y6
  1295	VPADDD   Y7, Y14, Y14
  1296	VPADDD   Y7, Y9, Y9
  1297	VPADDD   Y7, Y10, Y10
  1298	VPADDD   Y11, Y12, Y12
  1299	VPADDD   Y11, Y13, Y13
  1300	VPADDD   Y11, Y8, Y8
  1301	VMOVDQA  ·avx2IncMask<>+0(SB), Y3
  1302	VPADDD   Y15, Y4, Y4
  1303	VPADDD   Y3, Y15, Y15
  1304	VPADDD   Y15, Y1, Y1
  1305	VPADDD   Y3, Y15, Y15
  1306	VPADDD   Y15, Y2, Y2
  1307
  1308	// Clamp and store poly key
  1309	VPERM2I128 $0x02, Y0, Y14, Y3
  1310	VPAND      ·polyClampMask<>+0(SB), Y3, Y3
  1311	VMOVDQA    Y3, (BP)
  1312
  1313	// Stream for up to 320 bytes
  1314	VPERM2I128 $0x13, Y0, Y14, Y0
  1315	VPERM2I128 $0x13, Y12, Y4, Y14
  1316	VPERM2I128 $0x02, Y5, Y9, Y12
  1317	VPERM2I128 $0x02, Y13, Y1, Y4
  1318	VPERM2I128 $0x13, Y5, Y9, Y5
  1319	VPERM2I128 $0x13, Y13, Y1, Y9
  1320	VPERM2I128 $0x02, Y6, Y10, Y13
  1321	VPERM2I128 $0x02, Y8, Y2, Y1
  1322	VPERM2I128 $0x13, Y6, Y10, Y6
  1323	VPERM2I128 $0x13, Y8, Y2, Y10
  1324	JMP        openAVX2ShortOpen
  1325
  1326openAVX2Tail128:
  1327	// Need to decrypt up to 128 bytes - prepare two blocks
  1328	VMOVDQA ·chacha20Constants<>+0(SB), Y5
  1329	VMOVDQA 32(BP), Y9
  1330	VMOVDQA 64(BP), Y13
  1331	VMOVDQA 192(BP), Y1
  1332	VPADDD  ·avx2IncMask<>+0(SB), Y1, Y1
  1333	VMOVDQA Y1, Y4
  1334	XORQ    R9, R9
  1335	MOVQ    BX, CX
  1336	ANDQ    $-16, CX
  1337	TESTQ   CX, CX
  1338	JE      openAVX2Tail128LoopB
  1339
  1340openAVX2Tail128LoopA:
  1341	ADDQ  (SI)(R9*1), R10
  1342	ADCQ  8(SI)(R9*1), R11
  1343	ADCQ  $0x01, R12
  1344	MOVQ  (BP), DX
  1345	MOVQ  DX, R15
  1346	MULXQ R10, R13, R14
  1347	IMULQ R12, R15
  1348	MULXQ R11, AX, DX
  1349	ADDQ  AX, R14
  1350	ADCQ  DX, R15
  1351	MOVQ  8(BP), DX
  1352	MULXQ R10, R10, AX
  1353	ADDQ  R10, R14
  1354	MULXQ R11, R11, R8
  1355	ADCQ  R11, R15
  1356	ADCQ  $0x00, R8
  1357	IMULQ R12, DX
  1358	ADDQ  AX, R15
  1359	ADCQ  DX, R8
  1360	MOVQ  R13, R10
  1361	MOVQ  R14, R11
  1362	MOVQ  R15, R12
  1363	ANDQ  $0x03, R12
  1364	MOVQ  R15, R13
  1365	ANDQ  $-4, R13
  1366	MOVQ  R8, R14
  1367	SHRQ  $0x02, R8, R15
  1368	SHRQ  $0x02, R8
  1369	ADDQ  R13, R10
  1370	ADCQ  R14, R11
  1371	ADCQ  $0x00, R12
  1372	ADDQ  R15, R10
  1373	ADCQ  R8, R11
  1374	ADCQ  $0x00, R12
  1375
  1376openAVX2Tail128LoopB:
  1377	ADDQ       $0x10, R9
  1378	VPADDD     Y9, Y5, Y5
  1379	VPXOR      Y5, Y1, Y1
  1380	VPSHUFB    ·rol16<>+0(SB), Y1, Y1
  1381	VPADDD     Y1, Y13, Y13
  1382	VPXOR      Y13, Y9, Y9
  1383	VPSLLD     $0x0c, Y9, Y3
  1384	VPSRLD     $0x14, Y9, Y9
  1385	VPXOR      Y3, Y9, Y9
  1386	VPADDD     Y9, Y5, Y5
  1387	VPXOR      Y5, Y1, Y1
  1388	VPSHUFB    ·rol8<>+0(SB), Y1, Y1
  1389	VPADDD     Y1, Y13, Y13
  1390	VPXOR      Y13, Y9, Y9
  1391	VPSLLD     $0x07, Y9, Y3
  1392	VPSRLD     $0x19, Y9, Y9
  1393	VPXOR      Y3, Y9, Y9
  1394	VPALIGNR   $0x04, Y9, Y9, Y9
  1395	VPALIGNR   $0x08, Y13, Y13, Y13
  1396	VPALIGNR   $0x0c, Y1, Y1, Y1
  1397	VPADDD     Y9, Y5, Y5
  1398	VPXOR      Y5, Y1, Y1
  1399	VPSHUFB    ·rol16<>+0(SB), Y1, Y1
  1400	VPADDD     Y1, Y13, Y13
  1401	VPXOR      Y13, Y9, Y9
  1402	VPSLLD     $0x0c, Y9, Y3
  1403	VPSRLD     $0x14, Y9, Y9
  1404	VPXOR      Y3, Y9, Y9
  1405	VPADDD     Y9, Y5, Y5
  1406	VPXOR      Y5, Y1, Y1
  1407	VPSHUFB    ·rol8<>+0(SB), Y1, Y1
  1408	VPADDD     Y1, Y13, Y13
  1409	VPXOR      Y13, Y9, Y9
  1410	VPSLLD     $0x07, Y9, Y3
  1411	VPSRLD     $0x19, Y9, Y9
  1412	VPXOR      Y3, Y9, Y9
  1413	VPALIGNR   $0x0c, Y9, Y9, Y9
  1414	VPALIGNR   $0x08, Y13, Y13, Y13
  1415	VPALIGNR   $0x04, Y1, Y1, Y1
  1416	CMPQ       R9, CX
  1417	JB         openAVX2Tail128LoopA
  1418	CMPQ       R9, $0xa0
  1419	JNE        openAVX2Tail128LoopB
  1420	VPADDD     ·chacha20Constants<>+0(SB), Y5, Y5
  1421	VPADDD     32(BP), Y9, Y9
  1422	VPADDD     64(BP), Y13, Y13
  1423	VPADDD     Y4, Y1, Y1
  1424	VPERM2I128 $0x02, Y5, Y9, Y0
  1425	VPERM2I128 $0x02, Y13, Y1, Y14
  1426	VPERM2I128 $0x13, Y5, Y9, Y12
  1427	VPERM2I128 $0x13, Y13, Y1, Y4
  1428
  1429openAVX2TailLoop:
  1430	CMPQ BX, $0x20
  1431	JB   openAVX2Tail
  1432	SUBQ $0x20, BX
  1433
  1434	// Load for decryption
  1435	VPXOR   (SI), Y0, Y0
  1436	VMOVDQU Y0, (DI)
  1437	LEAQ    32(SI), SI
  1438	LEAQ    32(DI), DI
  1439	VMOVDQA Y14, Y0
  1440	VMOVDQA Y12, Y14
  1441	VMOVDQA Y4, Y12
  1442	JMP     openAVX2TailLoop
  1443
  1444openAVX2Tail:
  1445	CMPQ    BX, $0x10
  1446	VMOVDQA X0, X1
  1447	JB      openAVX2TailDone
  1448	SUBQ    $0x10, BX
  1449
  1450	// Load for decryption
  1451	VPXOR      (SI), X0, X12
  1452	VMOVDQU    X12, (DI)
  1453	LEAQ       16(SI), SI
  1454	LEAQ       16(DI), DI
  1455	VPERM2I128 $0x11, Y0, Y0, Y0
  1456	VMOVDQA    X0, X1
  1457
  1458openAVX2TailDone:
  1459	VZEROUPPER
  1460	JMP openSSETail16
  1461
  1462openAVX2Tail256:
  1463	VMOVDQA ·chacha20Constants<>+0(SB), Y0
  1464	VMOVDQA Y0, Y5
  1465	VMOVDQA 32(BP), Y14
  1466	VMOVDQA Y14, Y9
  1467	VMOVDQA 64(BP), Y12
  1468	VMOVDQA Y12, Y13
  1469	VMOVDQA 192(BP), Y4
  1470	VPADDD  ·avx2IncMask<>+0(SB), Y4, Y4
  1471	VPADDD  ·avx2IncMask<>+0(SB), Y4, Y1
  1472	VMOVDQA Y4, Y7
  1473	VMOVDQA Y1, Y11
  1474
  1475	// Compute the number of iterations that will hash data
  1476	MOVQ    BX, 224(BP)
  1477	MOVQ    BX, CX
  1478	SUBQ    $0x80, CX
  1479	SHRQ    $0x04, CX
  1480	MOVQ    $0x0000000a, R9
  1481	CMPQ    CX, $0x0a
  1482	CMOVQGT R9, CX
  1483	MOVQ    SI, BX
  1484	XORQ    R9, R9
  1485
  1486openAVX2Tail256LoopA:
  1487	ADDQ  (BX), R10
  1488	ADCQ  8(BX), R11
  1489	ADCQ  $0x01, R12
  1490	MOVQ  (BP), DX
  1491	MOVQ  DX, R15
  1492	MULXQ R10, R13, R14
  1493	IMULQ R12, R15
  1494	MULXQ R11, AX, DX
  1495	ADDQ  AX, R14
  1496	ADCQ  DX, R15
  1497	MOVQ  8(BP), DX
  1498	MULXQ R10, R10, AX
  1499	ADDQ  R10, R14
  1500	MULXQ R11, R11, R8
  1501	ADCQ  R11, R15
  1502	ADCQ  $0x00, R8
  1503	IMULQ R12, DX
  1504	ADDQ  AX, R15
  1505	ADCQ  DX, R8
  1506	MOVQ  R13, R10
  1507	MOVQ  R14, R11
  1508	MOVQ  R15, R12
  1509	ANDQ  $0x03, R12
  1510	MOVQ  R15, R13
  1511	ANDQ  $-4, R13
  1512	MOVQ  R8, R14
  1513	SHRQ  $0x02, R8, R15
  1514	SHRQ  $0x02, R8
  1515	ADDQ  R13, R10
  1516	ADCQ  R14, R11
  1517	ADCQ  $0x00, R12
  1518	ADDQ  R15, R10
  1519	ADCQ  R8, R11
  1520	ADCQ  $0x00, R12
  1521	LEAQ  16(BX), BX
  1522
  1523openAVX2Tail256LoopB:
  1524	VPADDD   Y14, Y0, Y0
  1525	VPXOR    Y0, Y4, Y4
  1526	VPSHUFB  ·rol16<>+0(SB), Y4, Y4
  1527	VPADDD   Y4, Y12, Y12
  1528	VPXOR    Y12, Y14, Y14
  1529	VPSLLD   $0x0c, Y14, Y3
  1530	VPSRLD   $0x14, Y14, Y14
  1531	VPXOR    Y3, Y14, Y14
  1532	VPADDD   Y14, Y0, Y0
  1533	VPXOR    Y0, Y4, Y4
  1534	VPSHUFB  ·rol8<>+0(SB), Y4, Y4
  1535	VPADDD   Y4, Y12, Y12
  1536	VPXOR    Y12, Y14, Y14
  1537	VPSLLD   $0x07, Y14, Y3
  1538	VPSRLD   $0x19, Y14, Y14
  1539	VPXOR    Y3, Y14, Y14
  1540	VPADDD   Y9, Y5, Y5
  1541	VPXOR    Y5, Y1, Y1
  1542	VPSHUFB  ·rol16<>+0(SB), Y1, Y1
  1543	VPADDD   Y1, Y13, Y13
  1544	VPXOR    Y13, Y9, Y9
  1545	VPSLLD   $0x0c, Y9, Y3
  1546	VPSRLD   $0x14, Y9, Y9
  1547	VPXOR    Y3, Y9, Y9
  1548	VPADDD   Y9, Y5, Y5
  1549	VPXOR    Y5, Y1, Y1
  1550	VPSHUFB  ·rol8<>+0(SB), Y1, Y1
  1551	VPADDD   Y1, Y13, Y13
  1552	VPXOR    Y13, Y9, Y9
  1553	VPSLLD   $0x07, Y9, Y3
  1554	VPSRLD   $0x19, Y9, Y9
  1555	VPXOR    Y3, Y9, Y9
  1556	VPALIGNR $0x04, Y14, Y14, Y14
  1557	VPALIGNR $0x04, Y9, Y9, Y9
  1558	VPALIGNR $0x08, Y12, Y12, Y12
  1559	VPALIGNR $0x08, Y13, Y13, Y13
  1560	VPALIGNR $0x0c, Y4, Y4, Y4
  1561	VPALIGNR $0x0c, Y1, Y1, Y1
  1562	INCQ     R9
  1563	VPADDD   Y14, Y0, Y0
  1564	VPXOR    Y0, Y4, Y4
  1565	VPSHUFB  ·rol16<>+0(SB), Y4, Y4
  1566	VPADDD   Y4, Y12, Y12
  1567	VPXOR    Y12, Y14, Y14
  1568	VPSLLD   $0x0c, Y14, Y3
  1569	VPSRLD   $0x14, Y14, Y14
  1570	VPXOR    Y3, Y14, Y14
  1571	VPADDD   Y14, Y0, Y0
  1572	VPXOR    Y0, Y4, Y4
  1573	VPSHUFB  ·rol8<>+0(SB), Y4, Y4
  1574	VPADDD   Y4, Y12, Y12
  1575	VPXOR    Y12, Y14, Y14
  1576	VPSLLD   $0x07, Y14, Y3
  1577	VPSRLD   $0x19, Y14, Y14
  1578	VPXOR    Y3, Y14, Y14
  1579	VPADDD   Y9, Y5, Y5
  1580	VPXOR    Y5, Y1, Y1
  1581	VPSHUFB  ·rol16<>+0(SB), Y1, Y1
  1582	VPADDD   Y1, Y13, Y13
  1583	VPXOR    Y13, Y9, Y9
  1584	VPSLLD   $0x0c, Y9, Y3
  1585	VPSRLD   $0x14, Y9, Y9
  1586	VPXOR    Y3, Y9, Y9
  1587	VPADDD   Y9, Y5, Y5
  1588	VPXOR    Y5, Y1, Y1
  1589	VPSHUFB  ·rol8<>+0(SB), Y1, Y1
  1590	VPADDD   Y1, Y13, Y13
  1591	VPXOR    Y13, Y9, Y9
  1592	VPSLLD   $0x07, Y9, Y3
  1593	VPSRLD   $0x19, Y9, Y9
  1594	VPXOR    Y3, Y9, Y9
  1595	VPALIGNR $0x0c, Y14, Y14, Y14
  1596	VPALIGNR $0x0c, Y9, Y9, Y9
  1597	VPALIGNR $0x08, Y12, Y12, Y12
  1598	VPALIGNR $0x08, Y13, Y13, Y13
  1599	VPALIGNR $0x04, Y4, Y4, Y4
  1600	VPALIGNR $0x04, Y1, Y1, Y1
  1601	CMPQ     R9, CX
  1602	JB       openAVX2Tail256LoopA
  1603	CMPQ     R9, $0x0a
  1604	JNE      openAVX2Tail256LoopB
  1605	MOVQ     BX, R9
  1606	SUBQ     SI, BX
  1607	MOVQ     BX, CX
  1608	MOVQ     224(BP), BX
  1609
  1610openAVX2Tail256Hash:
  1611	ADDQ  $0x10, CX
  1612	CMPQ  CX, BX
  1613	JGT   openAVX2Tail256HashEnd
  1614	ADDQ  (R9), R10
  1615	ADCQ  8(R9), R11
  1616	ADCQ  $0x01, R12
  1617	MOVQ  (BP), DX
  1618	MOVQ  DX, R15
  1619	MULXQ R10, R13, R14
  1620	IMULQ R12, R15
  1621	MULXQ R11, AX, DX
  1622	ADDQ  AX, R14
  1623	ADCQ  DX, R15
  1624	MOVQ  8(BP), DX
  1625	MULXQ R10, R10, AX
  1626	ADDQ  R10, R14
  1627	MULXQ R11, R11, R8
  1628	ADCQ  R11, R15
  1629	ADCQ  $0x00, R8
  1630	IMULQ R12, DX
  1631	ADDQ  AX, R15
  1632	ADCQ  DX, R8
  1633	MOVQ  R13, R10
  1634	MOVQ  R14, R11
  1635	MOVQ  R15, R12
  1636	ANDQ  $0x03, R12
  1637	MOVQ  R15, R13
  1638	ANDQ  $-4, R13
  1639	MOVQ  R8, R14
  1640	SHRQ  $0x02, R8, R15
  1641	SHRQ  $0x02, R8
  1642	ADDQ  R13, R10
  1643	ADCQ  R14, R11
  1644	ADCQ  $0x00, R12
  1645	ADDQ  R15, R10
  1646	ADCQ  R8, R11
  1647	ADCQ  $0x00, R12
  1648	LEAQ  16(R9), R9
  1649	JMP   openAVX2Tail256Hash
  1650
  1651openAVX2Tail256HashEnd:
  1652	VPADDD     ·chacha20Constants<>+0(SB), Y0, Y0
  1653	VPADDD     ·chacha20Constants<>+0(SB), Y5, Y5
  1654	VPADDD     32(BP), Y14, Y14
  1655	VPADDD     32(BP), Y9, Y9
  1656	VPADDD     64(BP), Y12, Y12
  1657	VPADDD     64(BP), Y13, Y13
  1658	VPADDD     Y7, Y4, Y4
  1659	VPADDD     Y11, Y1, Y1
  1660	VPERM2I128 $0x02, Y0, Y14, Y6
  1661	VPERM2I128 $0x02, Y12, Y4, Y10
  1662	VPERM2I128 $0x13, Y0, Y14, Y8
  1663	VPERM2I128 $0x13, Y12, Y4, Y2
  1664	VPERM2I128 $0x02, Y5, Y9, Y0
  1665	VPERM2I128 $0x02, Y13, Y1, Y14
  1666	VPERM2I128 $0x13, Y5, Y9, Y12
  1667	VPERM2I128 $0x13, Y13, Y1, Y4
  1668	VPXOR      (SI), Y6, Y6
  1669	VPXOR      32(SI), Y10, Y10
  1670	VPXOR      64(SI), Y8, Y8
  1671	VPXOR      96(SI), Y2, Y2
  1672	VMOVDQU    Y6, (DI)
  1673	VMOVDQU    Y10, 32(DI)
  1674	VMOVDQU    Y8, 64(DI)
  1675	VMOVDQU    Y2, 96(DI)
  1676	LEAQ       128(SI), SI
  1677	LEAQ       128(DI), DI
  1678	SUBQ       $0x80, BX
  1679	JMP        openAVX2TailLoop
  1680
  1681openAVX2Tail384:
  1682	// Need to decrypt up to 384 bytes - prepare six blocks
  1683	VMOVDQA ·chacha20Constants<>+0(SB), Y0
  1684	VMOVDQA Y0, Y5
  1685	VMOVDQA Y0, Y6
  1686	VMOVDQA 32(BP), Y14
  1687	VMOVDQA Y14, Y9
  1688	VMOVDQA Y14, Y10
  1689	VMOVDQA 64(BP), Y12
  1690	VMOVDQA Y12, Y13
  1691	VMOVDQA Y12, Y8
  1692	VMOVDQA 192(BP), Y4
  1693	VPADDD  ·avx2IncMask<>+0(SB), Y4, Y4
  1694	VPADDD  ·avx2IncMask<>+0(SB), Y4, Y1
  1695	VPADDD  ·avx2IncMask<>+0(SB), Y1, Y2
  1696	VMOVDQA Y4, 96(BP)
  1697	VMOVDQA Y1, 128(BP)
  1698	VMOVDQA Y2, 160(BP)
  1699
  1700	// Compute the number of iterations that will hash two blocks of data
  1701	MOVQ    BX, 224(BP)
  1702	MOVQ    BX, CX
  1703	SUBQ    $0x00000100, CX
  1704	SHRQ    $0x04, CX
  1705	ADDQ    $0x06, CX
  1706	MOVQ    $0x0000000a, R9
  1707	CMPQ    CX, $0x0a
  1708	CMOVQGT R9, CX
  1709	MOVQ    SI, BX
  1710	XORQ    R9, R9
  1711
  1712openAVX2Tail384LoopB:
  1713	ADDQ  (BX), R10
  1714	ADCQ  8(BX), R11
  1715	ADCQ  $0x01, R12
  1716	MOVQ  (BP), DX
  1717	MOVQ  DX, R15
  1718	MULXQ R10, R13, R14
  1719	IMULQ R12, R15
  1720	MULXQ R11, AX, DX
  1721	ADDQ  AX, R14
  1722	ADCQ  DX, R15
  1723	MOVQ  8(BP), DX
  1724	MULXQ R10, R10, AX
  1725	ADDQ  R10, R14
  1726	MULXQ R11, R11, R8
  1727	ADCQ  R11, R15
  1728	ADCQ  $0x00, R8
  1729	IMULQ R12, DX
  1730	ADDQ  AX, R15
  1731	ADCQ  DX, R8
  1732	MOVQ  R13, R10
  1733	MOVQ  R14, R11
  1734	MOVQ  R15, R12
  1735	ANDQ  $0x03, R12
  1736	MOVQ  R15, R13
  1737	ANDQ  $-4, R13
  1738	MOVQ  R8, R14
  1739	SHRQ  $0x02, R8, R15
  1740	SHRQ  $0x02, R8
  1741	ADDQ  R13, R10
  1742	ADCQ  R14, R11
  1743	ADCQ  $0x00, R12
  1744	ADDQ  R15, R10
  1745	ADCQ  R8, R11
  1746	ADCQ  $0x00, R12
  1747	LEAQ  16(BX), BX
  1748
  1749openAVX2Tail384LoopA:
  1750	VPADDD   Y14, Y0, Y0
  1751	VPXOR    Y0, Y4, Y4
  1752	VPSHUFB  ·rol16<>+0(SB), Y4, Y4
  1753	VPADDD   Y4, Y12, Y12
  1754	VPXOR    Y12, Y14, Y14
  1755	VPSLLD   $0x0c, Y14, Y3
  1756	VPSRLD   $0x14, Y14, Y14
  1757	VPXOR    Y3, Y14, Y14
  1758	VPADDD   Y14, Y0, Y0
  1759	VPXOR    Y0, Y4, Y4
  1760	VPSHUFB  ·rol8<>+0(SB), Y4, Y4
  1761	VPADDD   Y4, Y12, Y12
  1762	VPXOR    Y12, Y14, Y14
  1763	VPSLLD   $0x07, Y14, Y3
  1764	VPSRLD   $0x19, Y14, Y14
  1765	VPXOR    Y3, Y14, Y14
  1766	VPADDD   Y9, Y5, Y5
  1767	VPXOR    Y5, Y1, Y1
  1768	VPSHUFB  ·rol16<>+0(SB), Y1, Y1
  1769	VPADDD   Y1, Y13, Y13
  1770	VPXOR    Y13, Y9, Y9
  1771	VPSLLD   $0x0c, Y9, Y3
  1772	VPSRLD   $0x14, Y9, Y9
  1773	VPXOR    Y3, Y9, Y9
  1774	VPADDD   Y9, Y5, Y5
  1775	VPXOR    Y5, Y1, Y1
  1776	VPSHUFB  ·rol8<>+0(SB), Y1, Y1
  1777	VPADDD   Y1, Y13, Y13
  1778	VPXOR    Y13, Y9, Y9
  1779	VPSLLD   $0x07, Y9, Y3
  1780	VPSRLD   $0x19, Y9, Y9
  1781	VPXOR    Y3, Y9, Y9
  1782	VPADDD   Y10, Y6, Y6
  1783	VPXOR    Y6, Y2, Y2
  1784	VPSHUFB  ·rol16<>+0(SB), Y2, Y2
  1785	VPADDD   Y2, Y8, Y8
  1786	VPXOR    Y8, Y10, Y10
  1787	VPSLLD   $0x0c, Y10, Y3
  1788	VPSRLD   $0x14, Y10, Y10
  1789	VPXOR    Y3, Y10, Y10
  1790	VPADDD   Y10, Y6, Y6
  1791	VPXOR    Y6, Y2, Y2
  1792	VPSHUFB  ·rol8<>+0(SB), Y2, Y2
  1793	VPADDD   Y2, Y8, Y8
  1794	VPXOR    Y8, Y10, Y10
  1795	VPSLLD   $0x07, Y10, Y3
  1796	VPSRLD   $0x19, Y10, Y10
  1797	VPXOR    Y3, Y10, Y10
  1798	VPALIGNR $0x04, Y14, Y14, Y14
  1799	VPALIGNR $0x04, Y9, Y9, Y9
  1800	VPALIGNR $0x04, Y10, Y10, Y10
  1801	VPALIGNR $0x08, Y12, Y12, Y12
  1802	VPALIGNR $0x08, Y13, Y13, Y13
  1803	VPALIGNR $0x08, Y8, Y8, Y8
  1804	VPALIGNR $0x0c, Y4, Y4, Y4
  1805	VPALIGNR $0x0c, Y1, Y1, Y1
  1806	VPALIGNR $0x0c, Y2, Y2, Y2
  1807	ADDQ     (BX), R10
  1808	ADCQ     8(BX), R11
  1809	ADCQ     $0x01, R12
  1810	MOVQ     (BP), DX
  1811	MOVQ     DX, R15
  1812	MULXQ    R10, R13, R14
  1813	IMULQ    R12, R15
  1814	MULXQ    R11, AX, DX
  1815	ADDQ     AX, R14
  1816	ADCQ     DX, R15
  1817	MOVQ     8(BP), DX
  1818	MULXQ    R10, R10, AX
  1819	ADDQ     R10, R14
  1820	MULXQ    R11, R11, R8
  1821	ADCQ     R11, R15
  1822	ADCQ     $0x00, R8
  1823	IMULQ    R12, DX
  1824	ADDQ     AX, R15
  1825	ADCQ     DX, R8
  1826	MOVQ     R13, R10
  1827	MOVQ     R14, R11
  1828	MOVQ     R15, R12
  1829	ANDQ     $0x03, R12
  1830	MOVQ     R15, R13
  1831	ANDQ     $-4, R13
  1832	MOVQ     R8, R14
  1833	SHRQ     $0x02, R8, R15
  1834	SHRQ     $0x02, R8
  1835	ADDQ     R13, R10
  1836	ADCQ     R14, R11
  1837	ADCQ     $0x00, R12
  1838	ADDQ     R15, R10
  1839	ADCQ     R8, R11
  1840	ADCQ     $0x00, R12
  1841	LEAQ     16(BX), BX
  1842	INCQ     R9
  1843	VPADDD   Y14, Y0, Y0
  1844	VPXOR    Y0, Y4, Y4
  1845	VPSHUFB  ·rol16<>+0(SB), Y4, Y4
  1846	VPADDD   Y4, Y12, Y12
  1847	VPXOR    Y12, Y14, Y14
  1848	VPSLLD   $0x0c, Y14, Y3
  1849	VPSRLD   $0x14, Y14, Y14
  1850	VPXOR    Y3, Y14, Y14
  1851	VPADDD   Y14, Y0, Y0
  1852	VPXOR    Y0, Y4, Y4
  1853	VPSHUFB  ·rol8<>+0(SB), Y4, Y4
  1854	VPADDD   Y4, Y12, Y12
  1855	VPXOR    Y12, Y14, Y14
  1856	VPSLLD   $0x07, Y14, Y3
  1857	VPSRLD   $0x19, Y14, Y14
  1858	VPXOR    Y3, Y14, Y14
  1859	VPADDD   Y9, Y5, Y5
  1860	VPXOR    Y5, Y1, Y1
  1861	VPSHUFB  ·rol16<>+0(SB), Y1, Y1
  1862	VPADDD   Y1, Y13, Y13
  1863	VPXOR    Y13, Y9, Y9
  1864	VPSLLD   $0x0c, Y9, Y3
  1865	VPSRLD   $0x14, Y9, Y9
  1866	VPXOR    Y3, Y9, Y9
  1867	VPADDD   Y9, Y5, Y5
  1868	VPXOR    Y5, Y1, Y1
  1869	VPSHUFB  ·rol8<>+0(SB), Y1, Y1
  1870	VPADDD   Y1, Y13, Y13
  1871	VPXOR    Y13, Y9, Y9
  1872	VPSLLD   $0x07, Y9, Y3
  1873	VPSRLD   $0x19, Y9, Y9
  1874	VPXOR    Y3, Y9, Y9
  1875	VPADDD   Y10, Y6, Y6
  1876	VPXOR    Y6, Y2, Y2
  1877	VPSHUFB  ·rol16<>+0(SB), Y2, Y2
  1878	VPADDD   Y2, Y8, Y8
  1879	VPXOR    Y8, Y10, Y10
  1880	VPSLLD   $0x0c, Y10, Y3
  1881	VPSRLD   $0x14, Y10, Y10
  1882	VPXOR    Y3, Y10, Y10
  1883	VPADDD   Y10, Y6, Y6
  1884	VPXOR    Y6, Y2, Y2
  1885	VPSHUFB  ·rol8<>+0(SB), Y2, Y2
  1886	VPADDD   Y2, Y8, Y8
  1887	VPXOR    Y8, Y10, Y10
  1888	VPSLLD   $0x07, Y10, Y3
  1889	VPSRLD   $0x19, Y10, Y10
  1890	VPXOR    Y3, Y10, Y10
  1891	VPALIGNR $0x0c, Y14, Y14, Y14
  1892	VPALIGNR $0x0c, Y9, Y9, Y9
  1893	VPALIGNR $0x0c, Y10, Y10, Y10
  1894	VPALIGNR $0x08, Y12, Y12, Y12
  1895	VPALIGNR $0x08, Y13, Y13, Y13
  1896	VPALIGNR $0x08, Y8, Y8, Y8
  1897	VPALIGNR $0x04, Y4, Y4, Y4
  1898	VPALIGNR $0x04, Y1, Y1, Y1
  1899	VPALIGNR $0x04, Y2, Y2, Y2
  1900	CMPQ     R9, CX
  1901	JB       openAVX2Tail384LoopB
  1902	CMPQ     R9, $0x0a
  1903	JNE      openAVX2Tail384LoopA
  1904	MOVQ     BX, R9
  1905	SUBQ     SI, BX
  1906	MOVQ     BX, CX
  1907	MOVQ     224(BP), BX
  1908
  1909openAVX2Tail384Hash:
  1910	ADDQ  $0x10, CX
  1911	CMPQ  CX, BX
  1912	JGT   openAVX2Tail384HashEnd
  1913	ADDQ  (R9), R10
  1914	ADCQ  8(R9), R11
  1915	ADCQ  $0x01, R12
  1916	MOVQ  (BP), DX
  1917	MOVQ  DX, R15
  1918	MULXQ R10, R13, R14
  1919	IMULQ R12, R15
  1920	MULXQ R11, AX, DX
  1921	ADDQ  AX, R14
  1922	ADCQ  DX, R15
  1923	MOVQ  8(BP), DX
  1924	MULXQ R10, R10, AX
  1925	ADDQ  R10, R14
  1926	MULXQ R11, R11, R8
  1927	ADCQ  R11, R15
  1928	ADCQ  $0x00, R8
  1929	IMULQ R12, DX
  1930	ADDQ  AX, R15
  1931	ADCQ  DX, R8
  1932	MOVQ  R13, R10
  1933	MOVQ  R14, R11
  1934	MOVQ  R15, R12
  1935	ANDQ  $0x03, R12
  1936	MOVQ  R15, R13
  1937	ANDQ  $-4, R13
  1938	MOVQ  R8, R14
  1939	SHRQ  $0x02, R8, R15
  1940	SHRQ  $0x02, R8
  1941	ADDQ  R13, R10
  1942	ADCQ  R14, R11
  1943	ADCQ  $0x00, R12
  1944	ADDQ  R15, R10
  1945	ADCQ  R8, R11
  1946	ADCQ  $0x00, R12
  1947	LEAQ  16(R9), R9
  1948	JMP   openAVX2Tail384Hash
  1949
  1950openAVX2Tail384HashEnd:
  1951	VPADDD     ·chacha20Constants<>+0(SB), Y0, Y0
  1952	VPADDD     ·chacha20Constants<>+0(SB), Y5, Y5
  1953	VPADDD     ·chacha20Constants<>+0(SB), Y6, Y6
  1954	VPADDD     32(BP), Y14, Y14
  1955	VPADDD     32(BP), Y9, Y9
  1956	VPADDD     32(BP), Y10, Y10
  1957	VPADDD     64(BP), Y12, Y12
  1958	VPADDD     64(BP), Y13, Y13
  1959	VPADDD     64(BP), Y8, Y8
  1960	VPADDD     96(BP), Y4, Y4
  1961	VPADDD     128(BP), Y1, Y1
  1962	VPADDD     160(BP), Y2, Y2
  1963	VPERM2I128 $0x02, Y0, Y14, Y3
  1964	VPERM2I128 $0x02, Y12, Y4, Y7
  1965	VPERM2I128 $0x13, Y0, Y14, Y11
  1966	VPERM2I128 $0x13, Y12, Y4, Y15
  1967	VPXOR      (SI), Y3, Y3
  1968	VPXOR      32(SI), Y7, Y7
  1969	VPXOR      64(SI), Y11, Y11
  1970	VPXOR      96(SI), Y15, Y15
  1971	VMOVDQU    Y3, (DI)
  1972	VMOVDQU    Y7, 32(DI)
  1973	VMOVDQU    Y11, 64(DI)
  1974	VMOVDQU    Y15, 96(DI)
  1975	VPERM2I128 $0x02, Y5, Y9, Y3
  1976	VPERM2I128 $0x02, Y13, Y1, Y7
  1977	VPERM2I128 $0x13, Y5, Y9, Y11
  1978	VPERM2I128 $0x13, Y13, Y1, Y15
  1979	VPXOR      128(SI), Y3, Y3
  1980	VPXOR      160(SI), Y7, Y7
  1981	VPXOR      192(SI), Y11, Y11
  1982	VPXOR      224(SI), Y15, Y15
  1983	VMOVDQU    Y3, 128(DI)
  1984	VMOVDQU    Y7, 160(DI)
  1985	VMOVDQU    Y11, 192(DI)
  1986	VMOVDQU    Y15, 224(DI)
  1987	VPERM2I128 $0x02, Y6, Y10, Y0
  1988	VPERM2I128 $0x02, Y8, Y2, Y14
  1989	VPERM2I128 $0x13, Y6, Y10, Y12
  1990	VPERM2I128 $0x13, Y8, Y2, Y4
  1991	LEAQ       256(SI), SI
  1992	LEAQ       256(DI), DI
  1993	SUBQ       $0x00000100, BX
  1994	JMP        openAVX2TailLoop
  1995
  1996openAVX2Tail512:
  1997	VMOVDQU ·chacha20Constants<>+0(SB), Y0
  1998	VMOVDQA Y0, Y5
  1999	VMOVDQA Y0, Y6
  2000	VMOVDQA Y0, Y7
  2001	VMOVDQA 32(BP), Y14
  2002	VMOVDQA Y14, Y9
  2003	VMOVDQA Y14, Y10
  2004	VMOVDQA Y14, Y11
  2005	VMOVDQA 64(BP), Y12
  2006	VMOVDQA Y12, Y13
  2007	VMOVDQA Y12, Y8
  2008	VMOVDQA Y12, Y15
  2009	VMOVDQA 192(BP), Y4
  2010	VPADDD  ·avx2IncMask<>+0(SB), Y4, Y4
  2011	VPADDD  ·avx2IncMask<>+0(SB), Y4, Y1
  2012	VPADDD  ·avx2IncMask<>+0(SB), Y1, Y2
  2013	VPADDD  ·avx2IncMask<>+0(SB), Y2, Y3
  2014	VMOVDQA Y4, 96(BP)
  2015	VMOVDQA Y1, 128(BP)
  2016	VMOVDQA Y2, 160(BP)
  2017	VMOVDQA Y3, 192(BP)
  2018	XORQ    CX, CX
  2019	MOVQ    SI, R9
  2020
  2021openAVX2Tail512LoopB:
  2022	ADDQ  (R9), R10
  2023	ADCQ  8(R9), R11
  2024	ADCQ  $0x01, R12
  2025	MOVQ  (BP), DX
  2026	MOVQ  DX, R15
  2027	MULXQ R10, R13, R14
  2028	IMULQ R12, R15
  2029	MULXQ R11, AX, DX
  2030	ADDQ  AX, R14
  2031	ADCQ  DX, R15
  2032	MOVQ  8(BP), DX
  2033	MULXQ R10, R10, AX
  2034	ADDQ  R10, R14
  2035	MULXQ R11, R11, R8
  2036	ADCQ  R11, R15
  2037	ADCQ  $0x00, R8
  2038	IMULQ R12, DX
  2039	ADDQ  AX, R15
  2040	ADCQ  DX, R8
  2041	MOVQ  R13, R10
  2042	MOVQ  R14, R11
  2043	MOVQ  R15, R12
  2044	ANDQ  $0x03, R12
  2045	MOVQ  R15, R13
  2046	ANDQ  $-4, R13
  2047	MOVQ  R8, R14
  2048	SHRQ  $0x02, R8, R15
  2049	SHRQ  $0x02, R8
  2050	ADDQ  R13, R10
  2051	ADCQ  R14, R11
  2052	ADCQ  $0x00, R12
  2053	ADDQ  R15, R10
  2054	ADCQ  R8, R11
  2055	ADCQ  $0x00, R12
  2056	LEAQ  16(R9), R9
  2057
  2058openAVX2Tail512LoopA:
  2059	VPADDD   Y14, Y0, Y0
  2060	VPADDD   Y9, Y5, Y5
  2061	VPADDD   Y10, Y6, Y6
  2062	VPADDD   Y11, Y7, Y7
  2063	VPXOR    Y0, Y4, Y4
  2064	VPXOR    Y5, Y1, Y1
  2065	VPXOR    Y6, Y2, Y2
  2066	VPXOR    Y7, Y3, Y3
  2067	VPSHUFB  ·rol16<>+0(SB), Y4, Y4
  2068	VPSHUFB  ·rol16<>+0(SB), Y1, Y1
  2069	VPSHUFB  ·rol16<>+0(SB), Y2, Y2
  2070	VPSHUFB  ·rol16<>+0(SB), Y3, Y3
  2071	VPADDD   Y4, Y12, Y12
  2072	VPADDD   Y1, Y13, Y13
  2073	VPADDD   Y2, Y8, Y8
  2074	VPADDD   Y3, Y15, Y15
  2075	VPXOR    Y12, Y14, Y14
  2076	VPXOR    Y13, Y9, Y9
  2077	VPXOR    Y8, Y10, Y10
  2078	VPXOR    Y15, Y11, Y11
  2079	VMOVDQA  Y15, 224(BP)
  2080	VPSLLD   $0x0c, Y14, Y15
  2081	VPSRLD   $0x14, Y14, Y14
  2082	VPXOR    Y15, Y14, Y14
  2083	VPSLLD   $0x0c, Y9, Y15
  2084	VPSRLD   $0x14, Y9, Y9
  2085	VPXOR    Y15, Y9, Y9
  2086	VPSLLD   $0x0c, Y10, Y15
  2087	VPSRLD   $0x14, Y10, Y10
  2088	VPXOR    Y15, Y10, Y10
  2089	VPSLLD   $0x0c, Y11, Y15
  2090	VPSRLD   $0x14, Y11, Y11
  2091	VPXOR    Y15, Y11, Y11
  2092	VMOVDQA  224(BP), Y15
  2093	ADDQ     (R9), R10
  2094	ADCQ     8(R9), R11
  2095	ADCQ     $0x01, R12
  2096	MOVQ     (BP), DX
  2097	MOVQ     DX, R15
  2098	MULXQ    R10, R13, R14
  2099	IMULQ    R12, R15
  2100	MULXQ    R11, AX, DX
  2101	ADDQ     AX, R14
  2102	ADCQ     DX, R15
  2103	MOVQ     8(BP), DX
  2104	MULXQ    R10, R10, AX
  2105	ADDQ     R10, R14
  2106	MULXQ    R11, R11, R8
  2107	ADCQ     R11, R15
  2108	ADCQ     $0x00, R8
  2109	IMULQ    R12, DX
  2110	ADDQ     AX, R15
  2111	ADCQ     DX, R8
  2112	MOVQ     R13, R10
  2113	MOVQ     R14, R11
  2114	MOVQ     R15, R12
  2115	ANDQ     $0x03, R12
  2116	MOVQ     R15, R13
  2117	ANDQ     $-4, R13
  2118	MOVQ     R8, R14
  2119	SHRQ     $0x02, R8, R15
  2120	SHRQ     $0x02, R8
  2121	ADDQ     R13, R10
  2122	ADCQ     R14, R11
  2123	ADCQ     $0x00, R12
  2124	ADDQ     R15, R10
  2125	ADCQ     R8, R11
  2126	ADCQ     $0x00, R12
  2127	VPADDD   Y14, Y0, Y0
  2128	VPADDD   Y9, Y5, Y5
  2129	VPADDD   Y10, Y6, Y6
  2130	VPADDD   Y11, Y7, Y7
  2131	VPXOR    Y0, Y4, Y4
  2132	VPXOR    Y5, Y1, Y1
  2133	VPXOR    Y6, Y2, Y2
  2134	VPXOR    Y7, Y3, Y3
  2135	VPSHUFB  ·rol8<>+0(SB), Y4, Y4
  2136	VPSHUFB  ·rol8<>+0(SB), Y1, Y1
  2137	VPSHUFB  ·rol8<>+0(SB), Y2, Y2
  2138	VPSHUFB  ·rol8<>+0(SB), Y3, Y3
  2139	VPADDD   Y4, Y12, Y12
  2140	VPADDD   Y1, Y13, Y13
  2141	VPADDD   Y2, Y8, Y8
  2142	VPADDD   Y3, Y15, Y15
  2143	VPXOR    Y12, Y14, Y14
  2144	VPXOR    Y13, Y9, Y9
  2145	VPXOR    Y8, Y10, Y10
  2146	VPXOR    Y15, Y11, Y11
  2147	VMOVDQA  Y15, 224(BP)
  2148	VPSLLD   $0x07, Y14, Y15
  2149	VPSRLD   $0x19, Y14, Y14
  2150	VPXOR    Y15, Y14, Y14
  2151	VPSLLD   $0x07, Y9, Y15
  2152	VPSRLD   $0x19, Y9, Y9
  2153	VPXOR    Y15, Y9, Y9
  2154	VPSLLD   $0x07, Y10, Y15
  2155	VPSRLD   $0x19, Y10, Y10
  2156	VPXOR    Y15, Y10, Y10
  2157	VPSLLD   $0x07, Y11, Y15
  2158	VPSRLD   $0x19, Y11, Y11
  2159	VPXOR    Y15, Y11, Y11
  2160	VMOVDQA  224(BP), Y15
  2161	VPALIGNR $0x04, Y14, Y14, Y14
  2162	VPALIGNR $0x04, Y9, Y9, Y9
  2163	VPALIGNR $0x04, Y10, Y10, Y10
  2164	VPALIGNR $0x04, Y11, Y11, Y11
  2165	VPALIGNR $0x08, Y12, Y12, Y12
  2166	VPALIGNR $0x08, Y13, Y13, Y13
  2167	VPALIGNR $0x08, Y8, Y8, Y8
  2168	VPALIGNR $0x08, Y15, Y15, Y15
  2169	VPALIGNR $0x0c, Y4, Y4, Y4
  2170	VPALIGNR $0x0c, Y1, Y1, Y1
  2171	VPALIGNR $0x0c, Y2, Y2, Y2
  2172	VPALIGNR $0x0c, Y3, Y3, Y3
  2173	VPADDD   Y14, Y0, Y0
  2174	VPADDD   Y9, Y5, Y5
  2175	VPADDD   Y10, Y6, Y6
  2176	VPADDD   Y11, Y7, Y7
  2177	VPXOR    Y0, Y4, Y4
  2178	VPXOR    Y5, Y1, Y1
  2179	VPXOR    Y6, Y2, Y2
  2180	VPXOR    Y7, Y3, Y3
  2181	VPSHUFB  ·rol16<>+0(SB), Y4, Y4
  2182	VPSHUFB  ·rol16<>+0(SB), Y1, Y1
  2183	VPSHUFB  ·rol16<>+0(SB), Y2, Y2
  2184	VPSHUFB  ·rol16<>+0(SB), Y3, Y3
  2185	VPADDD   Y4, Y12, Y12
  2186	VPADDD   Y1, Y13, Y13
  2187	VPADDD   Y2, Y8, Y8
  2188	VPADDD   Y3, Y15, Y15
  2189	VPXOR    Y12, Y14, Y14
  2190	VPXOR    Y13, Y9, Y9
  2191	VPXOR    Y8, Y10, Y10
  2192	VPXOR    Y15, Y11, Y11
  2193	ADDQ     16(R9), R10
  2194	ADCQ     24(R9), R11
  2195	ADCQ     $0x01, R12
  2196	MOVQ     (BP), DX
  2197	MOVQ     DX, R15
  2198	MULXQ    R10, R13, R14
  2199	IMULQ    R12, R15
  2200	MULXQ    R11, AX, DX
  2201	ADDQ     AX, R14
  2202	ADCQ     DX, R15
  2203	MOVQ     8(BP), DX
  2204	MULXQ    R10, R10, AX
  2205	ADDQ     R10, R14
  2206	MULXQ    R11, R11, R8
  2207	ADCQ     R11, R15
  2208	ADCQ     $0x00, R8
  2209	IMULQ    R12, DX
  2210	ADDQ     AX, R15
  2211	ADCQ     DX, R8
  2212	MOVQ     R13, R10
  2213	MOVQ     R14, R11
  2214	MOVQ     R15, R12
  2215	ANDQ     $0x03, R12
  2216	MOVQ     R15, R13
  2217	ANDQ     $-4, R13
  2218	MOVQ     R8, R14
  2219	SHRQ     $0x02, R8, R15
  2220	SHRQ     $0x02, R8
  2221	ADDQ     R13, R10
  2222	ADCQ     R14, R11
  2223	ADCQ     $0x00, R12
  2224	ADDQ     R15, R10
  2225	ADCQ     R8, R11
  2226	ADCQ     $0x00, R12
  2227	LEAQ     32(R9), R9
  2228	VMOVDQA  Y15, 224(BP)
  2229	VPSLLD   $0x0c, Y14, Y15
  2230	VPSRLD   $0x14, Y14, Y14
  2231	VPXOR    Y15, Y14, Y14
  2232	VPSLLD   $0x0c, Y9, Y15
  2233	VPSRLD   $0x14, Y9, Y9
  2234	VPXOR    Y15, Y9, Y9
  2235	VPSLLD   $0x0c, Y10, Y15
  2236	VPSRLD   $0x14, Y10, Y10
  2237	VPXOR    Y15, Y10, Y10
  2238	VPSLLD   $0x0c, Y11, Y15
  2239	VPSRLD   $0x14, Y11, Y11
  2240	VPXOR    Y15, Y11, Y11
  2241	VMOVDQA  224(BP), Y15
  2242	VPADDD   Y14, Y0, Y0
  2243	VPADDD   Y9, Y5, Y5
  2244	VPADDD   Y10, Y6, Y6
  2245	VPADDD   Y11, Y7, Y7
  2246	VPXOR    Y0, Y4, Y4
  2247	VPXOR    Y5, Y1, Y1
  2248	VPXOR    Y6, Y2, Y2
  2249	VPXOR    Y7, Y3, Y3
  2250	VPSHUFB  ·rol8<>+0(SB), Y4, Y4
  2251	VPSHUFB  ·rol8<>+0(SB), Y1, Y1
  2252	VPSHUFB  ·rol8<>+0(SB), Y2, Y2
  2253	VPSHUFB  ·rol8<>+0(SB), Y3, Y3
  2254	VPADDD   Y4, Y12, Y12
  2255	VPADDD   Y1, Y13, Y13
  2256	VPADDD   Y2, Y8, Y8
  2257	VPADDD   Y3, Y15, Y15
  2258	VPXOR    Y12, Y14, Y14
  2259	VPXOR    Y13, Y9, Y9
  2260	VPXOR    Y8, Y10, Y10
  2261	VPXOR    Y15, Y11, Y11
  2262	VMOVDQA  Y15, 224(BP)
  2263	VPSLLD   $0x07, Y14, Y15
  2264	VPSRLD   $0x19, Y14, Y14
  2265	VPXOR    Y15, Y14, Y14
  2266	VPSLLD   $0x07, Y9, Y15
  2267	VPSRLD   $0x19, Y9, Y9
  2268	VPXOR    Y15, Y9, Y9
  2269	VPSLLD   $0x07, Y10, Y15
  2270	VPSRLD   $0x19, Y10, Y10
  2271	VPXOR    Y15, Y10, Y10
  2272	VPSLLD   $0x07, Y11, Y15
  2273	VPSRLD   $0x19, Y11, Y11
  2274	VPXOR    Y15, Y11, Y11
  2275	VMOVDQA  224(BP), Y15
  2276	VPALIGNR $0x0c, Y14, Y14, Y14
  2277	VPALIGNR $0x0c, Y9, Y9, Y9
  2278	VPALIGNR $0x0c, Y10, Y10, Y10
  2279	VPALIGNR $0x0c, Y11, Y11, Y11
  2280	VPALIGNR $0x08, Y12, Y12, Y12
  2281	VPALIGNR $0x08, Y13, Y13, Y13
  2282	VPALIGNR $0x08, Y8, Y8, Y8
  2283	VPALIGNR $0x08, Y15, Y15, Y15
  2284	VPALIGNR $0x04, Y4, Y4, Y4
  2285	VPALIGNR $0x04, Y1, Y1, Y1
  2286	VPALIGNR $0x04, Y2, Y2, Y2
  2287	VPALIGNR $0x04, Y3, Y3, Y3
  2288	INCQ     CX
  2289	CMPQ     CX, $0x04
  2290	JLT      openAVX2Tail512LoopB
  2291	CMPQ     CX, $0x0a
  2292	JNE      openAVX2Tail512LoopA
  2293	MOVQ     BX, CX
  2294	SUBQ     $0x00000180, CX
  2295	ANDQ     $-16, CX
  2296
  2297openAVX2Tail512HashLoop:
  2298	TESTQ CX, CX
  2299	JE    openAVX2Tail512HashEnd
  2300	ADDQ  (R9), R10
  2301	ADCQ  8(R9), R11
  2302	ADCQ  $0x01, R12
  2303	MOVQ  (BP), DX
  2304	MOVQ  DX, R15
  2305	MULXQ R10, R13, R14
  2306	IMULQ R12, R15
  2307	MULXQ R11, AX, DX
  2308	ADDQ  AX, R14
  2309	ADCQ  DX, R15
  2310	MOVQ  8(BP), DX
  2311	MULXQ R10, R10, AX
  2312	ADDQ  R10, R14
  2313	MULXQ R11, R11, R8
  2314	ADCQ  R11, R15
  2315	ADCQ  $0x00, R8
  2316	IMULQ R12, DX
  2317	ADDQ  AX, R15
  2318	ADCQ  DX, R8
  2319	MOVQ  R13, R10
  2320	MOVQ  R14, R11
  2321	MOVQ  R15, R12
  2322	ANDQ  $0x03, R12
  2323	MOVQ  R15, R13
  2324	ANDQ  $-4, R13
  2325	MOVQ  R8, R14
  2326	SHRQ  $0x02, R8, R15
  2327	SHRQ  $0x02, R8
  2328	ADDQ  R13, R10
  2329	ADCQ  R14, R11
  2330	ADCQ  $0x00, R12
  2331	ADDQ  R15, R10
  2332	ADCQ  R8, R11
  2333	ADCQ  $0x00, R12
  2334	LEAQ  16(R9), R9
  2335	SUBQ  $0x10, CX
  2336	JMP   openAVX2Tail512HashLoop
  2337
  2338openAVX2Tail512HashEnd:
  2339	VPADDD     ·chacha20Constants<>+0(SB), Y0, Y0
  2340	VPADDD     ·chacha20Constants<>+0(SB), Y5, Y5
  2341	VPADDD     ·chacha20Constants<>+0(SB), Y6, Y6
  2342	VPADDD     ·chacha20Constants<>+0(SB), Y7, Y7
  2343	VPADDD     32(BP), Y14, Y14
  2344	VPADDD     32(BP), Y9, Y9
  2345	VPADDD     32(BP), Y10, Y10
  2346	VPADDD     32(BP), Y11, Y11
  2347	VPADDD     64(BP), Y12, Y12
  2348	VPADDD     64(BP), Y13, Y13
  2349	VPADDD     64(BP), Y8, Y8
  2350	VPADDD     64(BP), Y15, Y15
  2351	VPADDD     96(BP), Y4, Y4
  2352	VPADDD     128(BP), Y1, Y1
  2353	VPADDD     160(BP), Y2, Y2
  2354	VPADDD     192(BP), Y3, Y3
  2355	VMOVDQA    Y15, 224(BP)
  2356	VPERM2I128 $0x02, Y0, Y14, Y15
  2357	VPERM2I128 $0x13, Y0, Y14, Y14
  2358	VPERM2I128 $0x02, Y12, Y4, Y0
  2359	VPERM2I128 $0x13, Y12, Y4, Y12
  2360	VPXOR      (SI), Y15, Y15
  2361	VPXOR      32(SI), Y0, Y0
  2362	VPXOR      64(SI), Y14, Y14
  2363	VPXOR      96(SI), Y12, Y12
  2364	VMOVDQU    Y15, (DI)
  2365	VMOVDQU    Y0, 32(DI)
  2366	VMOVDQU    Y14, 64(DI)
  2367	VMOVDQU    Y12, 96(DI)
  2368	VPERM2I128 $0x02, Y5, Y9, Y0
  2369	VPERM2I128 $0x02, Y13, Y1, Y14
  2370	VPERM2I128 $0x13, Y5, Y9, Y12
  2371	VPERM2I128 $0x13, Y13, Y1, Y4
  2372	VPXOR      128(SI), Y0, Y0
  2373	VPXOR      160(SI), Y14, Y14
  2374	VPXOR      192(SI), Y12, Y12
  2375	VPXOR      224(SI), Y4, Y4
  2376	VMOVDQU    Y0, 128(DI)
  2377	VMOVDQU    Y14, 160(DI)
  2378	VMOVDQU    Y12, 192(DI)
  2379	VMOVDQU    Y4, 224(DI)
  2380	VPERM2I128 $0x02, Y6, Y10, Y0
  2381	VPERM2I128 $0x02, Y8, Y2, Y14
  2382	VPERM2I128 $0x13, Y6, Y10, Y12
  2383	VPERM2I128 $0x13, Y8, Y2, Y4
  2384	VPXOR      256(SI), Y0, Y0
  2385	VPXOR      288(SI), Y14, Y14
  2386	VPXOR      320(SI), Y12, Y12
  2387	VPXOR      352(SI), Y4, Y4
  2388	VMOVDQU    Y0, 256(DI)
  2389	VMOVDQU    Y14, 288(DI)
  2390	VMOVDQU    Y12, 320(DI)
  2391	VMOVDQU    Y4, 352(DI)
  2392	VPERM2I128 $0x02, Y7, Y11, Y0
  2393	VPERM2I128 $0x02, 224(BP), Y3, Y14
  2394	VPERM2I128 $0x13, Y7, Y11, Y12
  2395	VPERM2I128 $0x13, 224(BP), Y3, Y4
  2396	LEAQ       384(SI), SI
  2397	LEAQ       384(DI), DI
  2398	SUBQ       $0x00000180, BX
  2399	JMP        openAVX2TailLoop
  2400
  2401DATA ·chacha20Constants<>+0(SB)/4, $0x61707865
  2402DATA ·chacha20Constants<>+4(SB)/4, $0x3320646e
  2403DATA ·chacha20Constants<>+8(SB)/4, $0x79622d32
  2404DATA ·chacha20Constants<>+12(SB)/4, $0x6b206574
  2405DATA ·chacha20Constants<>+16(SB)/4, $0x61707865
  2406DATA ·chacha20Constants<>+20(SB)/4, $0x3320646e
  2407DATA ·chacha20Constants<>+24(SB)/4, $0x79622d32
  2408DATA ·chacha20Constants<>+28(SB)/4, $0x6b206574
  2409GLOBL ·chacha20Constants<>(SB), RODATA|NOPTR, $32
  2410
  2411DATA ·avx2InitMask<>+0(SB)/8, $0x0000000000000000
  2412DATA ·avx2InitMask<>+8(SB)/8, $0x0000000000000000
  2413DATA ·avx2InitMask<>+16(SB)/8, $0x0000000000000001
  2414DATA ·avx2InitMask<>+24(SB)/8, $0x0000000000000000
  2415GLOBL ·avx2InitMask<>(SB), RODATA|NOPTR, $32
  2416
  2417DATA ·rol16<>+0(SB)/8, $0x0504070601000302
  2418DATA ·rol16<>+8(SB)/8, $0x0d0c0f0e09080b0a
  2419DATA ·rol16<>+16(SB)/8, $0x0504070601000302
  2420DATA ·rol16<>+24(SB)/8, $0x0d0c0f0e09080b0a
  2421GLOBL ·rol16<>(SB), RODATA|NOPTR, $32
  2422
  2423DATA ·rol8<>+0(SB)/8, $0x0605040702010003
  2424DATA ·rol8<>+8(SB)/8, $0x0e0d0c0f0a09080b
  2425DATA ·rol8<>+16(SB)/8, $0x0605040702010003
  2426DATA ·rol8<>+24(SB)/8, $0x0e0d0c0f0a09080b
  2427GLOBL ·rol8<>(SB), RODATA|NOPTR, $32
  2428
  2429DATA ·polyClampMask<>+0(SB)/8, $0x0ffffffc0fffffff
  2430DATA ·polyClampMask<>+8(SB)/8, $0x0ffffffc0ffffffc
  2431DATA ·polyClampMask<>+16(SB)/8, $0xffffffffffffffff
  2432DATA ·polyClampMask<>+24(SB)/8, $0xffffffffffffffff
  2433GLOBL ·polyClampMask<>(SB), RODATA|NOPTR, $32
  2434
  2435DATA ·avx2IncMask<>+0(SB)/8, $0x0000000000000002
  2436DATA ·avx2IncMask<>+8(SB)/8, $0x0000000000000000
  2437DATA ·avx2IncMask<>+16(SB)/8, $0x0000000000000002
  2438DATA ·avx2IncMask<>+24(SB)/8, $0x0000000000000000
  2439GLOBL ·avx2IncMask<>(SB), RODATA|NOPTR, $32
  2440
  2441DATA ·andMask<>+0(SB)/8, $0x00000000000000ff
  2442DATA ·andMask<>+8(SB)/8, $0x0000000000000000
  2443DATA ·andMask<>+16(SB)/8, $0x000000000000ffff
  2444DATA ·andMask<>+24(SB)/8, $0x0000000000000000
  2445DATA ·andMask<>+32(SB)/8, $0x0000000000ffffff
  2446DATA ·andMask<>+40(SB)/8, $0x0000000000000000
  2447DATA ·andMask<>+48(SB)/8, $0x00000000ffffffff
  2448DATA ·andMask<>+56(SB)/8, $0x0000000000000000
  2449DATA ·andMask<>+64(SB)/8, $0x000000ffffffffff
  2450DATA ·andMask<>+72(SB)/8, $0x0000000000000000
  2451DATA ·andMask<>+80(SB)/8, $0x0000ffffffffffff
  2452DATA ·andMask<>+88(SB)/8, $0x0000000000000000
  2453DATA ·andMask<>+96(SB)/8, $0x00ffffffffffffff
  2454DATA ·andMask<>+104(SB)/8, $0x0000000000000000
  2455DATA ·andMask<>+112(SB)/8, $0xffffffffffffffff
  2456DATA ·andMask<>+120(SB)/8, $0x0000000000000000
  2457DATA ·andMask<>+128(SB)/8, $0xffffffffffffffff
  2458DATA ·andMask<>+136(SB)/8, $0x00000000000000ff
  2459DATA ·andMask<>+144(SB)/8, $0xffffffffffffffff
  2460DATA ·andMask<>+152(SB)/8, $0x000000000000ffff
  2461DATA ·andMask<>+160(SB)/8, $0xffffffffffffffff
  2462DATA ·andMask<>+168(SB)/8, $0x0000000000ffffff
  2463DATA ·andMask<>+176(SB)/8, $0xffffffffffffffff
  2464DATA ·andMask<>+184(SB)/8, $0x00000000ffffffff
  2465DATA ·andMask<>+192(SB)/8, $0xffffffffffffffff
  2466DATA ·andMask<>+200(SB)/8, $0x000000ffffffffff
  2467DATA ·andMask<>+208(SB)/8, $0xffffffffffffffff
  2468DATA ·andMask<>+216(SB)/8, $0x0000ffffffffffff
  2469DATA ·andMask<>+224(SB)/8, $0xffffffffffffffff
  2470DATA ·andMask<>+232(SB)/8, $0x00ffffffffffffff
  2471GLOBL ·andMask<>(SB), RODATA|NOPTR, $240
  2472
  2473// func chacha20Poly1305Seal(dst []byte, key []uint32, src []byte, ad []byte)
  2474// Requires: AVX, AVX2, BMI2, CMOV, SSE2
  2475TEXT ·chacha20Poly1305Seal(SB), $288-96
  2476	MOVQ           SP, BP
  2477	ADDQ           $0x20, BP
  2478	ANDQ           $-32, BP
  2479	MOVQ           dst_base+0(FP), DI
  2480	MOVQ           key_base+24(FP), R8
  2481	MOVQ           src_base+48(FP), SI
  2482	MOVQ           src_len+56(FP), BX
  2483	MOVQ           ad_base+72(FP), CX
  2484	VZEROUPPER
  2485	VMOVDQU        ·chacha20Constants<>+0(SB), Y0
  2486	VBROADCASTI128 16(R8), Y14
  2487	VBROADCASTI128 32(R8), Y12
  2488	VBROADCASTI128 48(R8), Y4
  2489	VPADDD         ·avx2InitMask<>+0(SB), Y4, Y4
  2490
  2491	// Special optimizations, for very short buffers
  2492	CMPQ BX, $0x000000c0
  2493	JBE  seal192AVX2
  2494	CMPQ BX, $0x00000140
  2495	JBE  seal320AVX2
  2496
  2497	// For the general key prepare the key first - as a byproduct we have 64 bytes of cipher stream
  2498	VMOVDQA Y0, Y5
  2499	VMOVDQA Y0, Y6
  2500	VMOVDQA Y0, Y7
  2501	VMOVDQA Y14, Y9
  2502	VMOVDQA Y14, Y10
  2503	VMOVDQA Y14, Y11
  2504	VMOVDQA Y14, 32(BP)
  2505	VMOVDQA Y12, Y13
  2506	VMOVDQA Y12, Y8
  2507	VMOVDQA Y12, Y15
  2508	VMOVDQA Y12, 64(BP)
  2509	VPADDD  ·avx2IncMask<>+0(SB), Y4, Y1
  2510	VMOVDQA Y4, 96(BP)
  2511	VPADDD  ·avx2IncMask<>+0(SB), Y1, Y2
  2512	VMOVDQA Y1, 128(BP)
  2513	VPADDD  ·avx2IncMask<>+0(SB), Y2, Y3
  2514	VMOVDQA Y2, 160(BP)
  2515	VMOVDQA Y3, 192(BP)
  2516	MOVQ    $0x0000000a, R9
  2517
  2518sealAVX2IntroLoop:
  2519	VMOVDQA    Y15, 224(BP)
  2520	VPADDD     Y14, Y0, Y0
  2521	VPXOR      Y0, Y4, Y4
  2522	VPSHUFB    ·rol16<>+0(SB), Y4, Y4
  2523	VPADDD     Y4, Y12, Y12
  2524	VPXOR      Y12, Y14, Y14
  2525	VPSLLD     $0x0c, Y14, Y15
  2526	VPSRLD     $0x14, Y14, Y14
  2527	VPXOR      Y15, Y14, Y14
  2528	VPADDD     Y14, Y0, Y0
  2529	VPXOR      Y0, Y4, Y4
  2530	VPSHUFB    ·rol8<>+0(SB), Y4, Y4
  2531	VPADDD     Y4, Y12, Y12
  2532	VPXOR      Y12, Y14, Y14
  2533	VPSLLD     $0x07, Y14, Y15
  2534	VPSRLD     $0x19, Y14, Y14
  2535	VPXOR      Y15, Y14, Y14
  2536	VPADDD     Y9, Y5, Y5
  2537	VPXOR      Y5, Y1, Y1
  2538	VPSHUFB    ·rol16<>+0(SB), Y1, Y1
  2539	VPADDD     Y1, Y13, Y13
  2540	VPXOR      Y13, Y9, Y9
  2541	VPSLLD     $0x0c, Y9, Y15
  2542	VPSRLD     $0x14, Y9, Y9
  2543	VPXOR      Y15, Y9, Y9
  2544	VPADDD     Y9, Y5, Y5
  2545	VPXOR      Y5, Y1, Y1
  2546	VPSHUFB    ·rol8<>+0(SB), Y1, Y1
  2547	VPADDD     Y1, Y13, Y13
  2548	VPXOR      Y13, Y9, Y9
  2549	VPSLLD     $0x07, Y9, Y15
  2550	VPSRLD     $0x19, Y9, Y9
  2551	VPXOR      Y15, Y9, Y9
  2552	VPADDD     Y10, Y6, Y6
  2553	VPXOR      Y6, Y2, Y2
  2554	VPSHUFB    ·rol16<>+0(SB), Y2, Y2
  2555	VPADDD     Y2, Y8, Y8
  2556	VPXOR      Y8, Y10, Y10
  2557	VPSLLD     $0x0c, Y10, Y15
  2558	VPSRLD     $0x14, Y10, Y10
  2559	VPXOR      Y15, Y10, Y10
  2560	VPADDD     Y10, Y6, Y6
  2561	VPXOR      Y6, Y2, Y2
  2562	VPSHUFB    ·rol8<>+0(SB), Y2, Y2
  2563	VPADDD     Y2, Y8, Y8
  2564	VPXOR      Y8, Y10, Y10
  2565	VPSLLD     $0x07, Y10, Y15
  2566	VPSRLD     $0x19, Y10, Y10
  2567	VPXOR      Y15, Y10, Y10
  2568	VMOVDQA    224(BP), Y15
  2569	VMOVDQA    Y13, 224(BP)
  2570	VPADDD     Y11, Y7, Y7
  2571	VPXOR      Y7, Y3, Y3
  2572	VPSHUFB    ·rol16<>+0(SB), Y3, Y3
  2573	VPADDD     Y3, Y15, Y15
  2574	VPXOR      Y15, Y11, Y11
  2575	VPSLLD     $0x0c, Y11, Y13
  2576	VPSRLD     $0x14, Y11, Y11
  2577	VPXOR      Y13, Y11, Y11
  2578	VPADDD     Y11, Y7, Y7
  2579	VPXOR      Y7, Y3, Y3
  2580	VPSHUFB    ·rol8<>+0(SB), Y3, Y3
  2581	VPADDD     Y3, Y15, Y15
  2582	VPXOR      Y15, Y11, Y11
  2583	VPSLLD     $0x07, Y11, Y13
  2584	VPSRLD     $0x19, Y11, Y11
  2585	VPXOR      Y13, Y11, Y11
  2586	VMOVDQA    224(BP), Y13
  2587	VPALIGNR   $0x04, Y14, Y14, Y14
  2588	VPALIGNR   $0x08, Y12, Y12, Y12
  2589	VPALIGNR   $0x0c, Y4, Y4, Y4
  2590	VPALIGNR   $0x04, Y9, Y9, Y9
  2591	VPALIGNR   $0x08, Y13, Y13, Y13
  2592	VPALIGNR   $0x0c, Y1, Y1, Y1
  2593	VPALIGNR   $0x04, Y10, Y10, Y10
  2594	VPALIGNR   $0x08, Y8, Y8, Y8
  2595	VPALIGNR   $0x0c, Y2, Y2, Y2
  2596	VPALIGNR   $0x04, Y11, Y11, Y11
  2597	VPALIGNR   $0x08, Y15, Y15, Y15
  2598	VPALIGNR   $0x0c, Y3, Y3, Y3
  2599	VMOVDQA    Y15, 224(BP)
  2600	VPADDD     Y14, Y0, Y0
  2601	VPXOR      Y0, Y4, Y4
  2602	VPSHUFB    ·rol16<>+0(SB), Y4, Y4
  2603	VPADDD     Y4, Y12, Y12
  2604	VPXOR      Y12, Y14, Y14
  2605	VPSLLD     $0x0c, Y14, Y15
  2606	VPSRLD     $0x14, Y14, Y14
  2607	VPXOR      Y15, Y14, Y14
  2608	VPADDD     Y14, Y0, Y0
  2609	VPXOR      Y0, Y4, Y4
  2610	VPSHUFB    ·rol8<>+0(SB), Y4, Y4
  2611	VPADDD     Y4, Y12, Y12
  2612	VPXOR      Y12, Y14, Y14
  2613	VPSLLD     $0x07, Y14, Y15
  2614	VPSRLD     $0x19, Y14, Y14
  2615	VPXOR      Y15, Y14, Y14
  2616	VPADDD     Y9, Y5, Y5
  2617	VPXOR      Y5, Y1, Y1
  2618	VPSHUFB    ·rol16<>+0(SB), Y1, Y1
  2619	VPADDD     Y1, Y13, Y13
  2620	VPXOR      Y13, Y9, Y9
  2621	VPSLLD     $0x0c, Y9, Y15
  2622	VPSRLD     $0x14, Y9, Y9
  2623	VPXOR      Y15, Y9, Y9
  2624	VPADDD     Y9, Y5, Y5
  2625	VPXOR      Y5, Y1, Y1
  2626	VPSHUFB    ·rol8<>+0(SB), Y1, Y1
  2627	VPADDD     Y1, Y13, Y13
  2628	VPXOR      Y13, Y9, Y9
  2629	VPSLLD     $0x07, Y9, Y15
  2630	VPSRLD     $0x19, Y9, Y9
  2631	VPXOR      Y15, Y9, Y9
  2632	VPADDD     Y10, Y6, Y6
  2633	VPXOR      Y6, Y2, Y2
  2634	VPSHUFB    ·rol16<>+0(SB), Y2, Y2
  2635	VPADDD     Y2, Y8, Y8
  2636	VPXOR      Y8, Y10, Y10
  2637	VPSLLD     $0x0c, Y10, Y15
  2638	VPSRLD     $0x14, Y10, Y10
  2639	VPXOR      Y15, Y10, Y10
  2640	VPADDD     Y10, Y6, Y6
  2641	VPXOR      Y6, Y2, Y2
  2642	VPSHUFB    ·rol8<>+0(SB), Y2, Y2
  2643	VPADDD     Y2, Y8, Y8
  2644	VPXOR      Y8, Y10, Y10
  2645	VPSLLD     $0x07, Y10, Y15
  2646	VPSRLD     $0x19, Y10, Y10
  2647	VPXOR      Y15, Y10, Y10
  2648	VMOVDQA    224(BP), Y15
  2649	VMOVDQA    Y13, 224(BP)
  2650	VPADDD     Y11, Y7, Y7
  2651	VPXOR      Y7, Y3, Y3
  2652	VPSHUFB    ·rol16<>+0(SB), Y3, Y3
  2653	VPADDD     Y3, Y15, Y15
  2654	VPXOR      Y15, Y11, Y11
  2655	VPSLLD     $0x0c, Y11, Y13
  2656	VPSRLD     $0x14, Y11, Y11
  2657	VPXOR      Y13, Y11, Y11
  2658	VPADDD     Y11, Y7, Y7
  2659	VPXOR      Y7, Y3, Y3
  2660	VPSHUFB    ·rol8<>+0(SB), Y3, Y3
  2661	VPADDD     Y3, Y15, Y15
  2662	VPXOR      Y15, Y11, Y11
  2663	VPSLLD     $0x07, Y11, Y13
  2664	VPSRLD     $0x19, Y11, Y11
  2665	VPXOR      Y13, Y11, Y11
  2666	VMOVDQA    224(BP), Y13
  2667	VPALIGNR   $0x0c, Y14, Y14, Y14
  2668	VPALIGNR   $0x08, Y12, Y12, Y12
  2669	VPALIGNR   $0x04, Y4, Y4, Y4
  2670	VPALIGNR   $0x0c, Y9, Y9, Y9
  2671	VPALIGNR   $0x08, Y13, Y13, Y13
  2672	VPALIGNR   $0x04, Y1, Y1, Y1
  2673	VPALIGNR   $0x0c, Y10, Y10, Y10
  2674	VPALIGNR   $0x08, Y8, Y8, Y8
  2675	VPALIGNR   $0x04, Y2, Y2, Y2
  2676	VPALIGNR   $0x0c, Y11, Y11, Y11
  2677	VPALIGNR   $0x08, Y15, Y15, Y15
  2678	VPALIGNR   $0x04, Y3, Y3, Y3
  2679	DECQ       R9
  2680	JNE        sealAVX2IntroLoop
  2681	VPADDD     ·chacha20Constants<>+0(SB), Y0, Y0
  2682	VPADDD     ·chacha20Constants<>+0(SB), Y5, Y5
  2683	VPADDD     ·chacha20Constants<>+0(SB), Y6, Y6
  2684	VPADDD     ·chacha20Constants<>+0(SB), Y7, Y7
  2685	VPADDD     32(BP), Y14, Y14
  2686	VPADDD     32(BP), Y9, Y9
  2687	VPADDD     32(BP), Y10, Y10
  2688	VPADDD     32(BP), Y11, Y11
  2689	VPADDD     64(BP), Y12, Y12
  2690	VPADDD     64(BP), Y13, Y13
  2691	VPADDD     64(BP), Y8, Y8
  2692	VPADDD     64(BP), Y15, Y15
  2693	VPADDD     96(BP), Y4, Y4
  2694	VPADDD     128(BP), Y1, Y1
  2695	VPADDD     160(BP), Y2, Y2
  2696	VPADDD     192(BP), Y3, Y3
  2697	VPERM2I128 $0x13, Y12, Y4, Y12
  2698	VPERM2I128 $0x02, Y0, Y14, Y4
  2699	VPERM2I128 $0x13, Y0, Y14, Y0
  2700
  2701	// Clamp and store poly key
  2702	VPAND   ·polyClampMask<>+0(SB), Y4, Y4
  2703	VMOVDQA Y4, (BP)
  2704
  2705	// Hash AD
  2706	MOVQ ad_len+80(FP), R9
  2707	CALL polyHashADInternal<>(SB)
  2708
  2709	// Can store at least 320 bytes
  2710	VPXOR      (SI), Y0, Y0
  2711	VPXOR      32(SI), Y12, Y12
  2712	VMOVDQU    Y0, (DI)
  2713	VMOVDQU    Y12, 32(DI)
  2714	VPERM2I128 $0x02, Y5, Y9, Y0
  2715	VPERM2I128 $0x02, Y13, Y1, Y14
  2716	VPERM2I128 $0x13, Y5, Y9, Y12
  2717	VPERM2I128 $0x13, Y13, Y1, Y4
  2718	VPXOR      64(SI), Y0, Y0
  2719	VPXOR      96(SI), Y14, Y14
  2720	VPXOR      128(SI), Y12, Y12
  2721	VPXOR      160(SI), Y4, Y4
  2722	VMOVDQU    Y0, 64(DI)
  2723	VMOVDQU    Y14, 96(DI)
  2724	VMOVDQU    Y12, 128(DI)
  2725	VMOVDQU    Y4, 160(DI)
  2726	VPERM2I128 $0x02, Y6, Y10, Y0
  2727	VPERM2I128 $0x02, Y8, Y2, Y14
  2728	VPERM2I128 $0x13, Y6, Y10, Y12
  2729	VPERM2I128 $0x13, Y8, Y2, Y4
  2730	VPXOR      192(SI), Y0, Y0
  2731	VPXOR      224(SI), Y14, Y14
  2732	VPXOR      256(SI), Y12, Y12
  2733	VPXOR      288(SI), Y4, Y4
  2734	VMOVDQU    Y0, 192(DI)
  2735	VMOVDQU    Y14, 224(DI)
  2736	VMOVDQU    Y12, 256(DI)
  2737	VMOVDQU    Y4, 288(DI)
  2738	MOVQ       $0x00000140, CX
  2739	SUBQ       $0x00000140, BX
  2740	LEAQ       320(SI), SI
  2741	VPERM2I128 $0x02, Y7, Y11, Y0
  2742	VPERM2I128 $0x02, Y15, Y3, Y14
  2743	VPERM2I128 $0x13, Y7, Y11, Y12
  2744	VPERM2I128 $0x13, Y15, Y3, Y4
  2745	CMPQ       BX, $0x80
  2746	JBE        sealAVX2SealHash
  2747	VPXOR      (SI), Y0, Y0
  2748	VPXOR      32(SI), Y14, Y14
  2749	VPXOR      64(SI), Y12, Y12
  2750	VPXOR      96(SI), Y4, Y4
  2751	VMOVDQU    Y0, 320(DI)
  2752	VMOVDQU    Y14, 352(DI)
  2753	VMOVDQU    Y12, 384(DI)
  2754	VMOVDQU    Y4, 416(DI)
  2755	SUBQ       $0x80, BX
  2756	LEAQ       128(SI), SI
  2757	MOVQ       $0x00000008, CX
  2758	MOVQ       $0x00000002, R9
  2759	CMPQ       BX, $0x80
  2760	JBE        sealAVX2Tail128
  2761	CMPQ       BX, $0x00000100
  2762	JBE        sealAVX2Tail256
  2763	CMPQ       BX, $0x00000180
  2764	JBE        sealAVX2Tail384
  2765	CMPQ       BX, $0x00000200
  2766	JBE        sealAVX2Tail512
  2767
  2768	// We have 448 bytes to hash, but main loop hashes 512 bytes at a time - perform some rounds, before the main loop
  2769	VMOVDQA  ·chacha20Constants<>+0(SB), Y0
  2770	VMOVDQA  Y0, Y5
  2771	VMOVDQA  Y0, Y6
  2772	VMOVDQA  Y0, Y7
  2773	VMOVDQA  32(BP), Y14
  2774	VMOVDQA  Y14, Y9
  2775	VMOVDQA  Y14, Y10
  2776	VMOVDQA  Y14, Y11
  2777	VMOVDQA  64(BP), Y12
  2778	VMOVDQA  Y12, Y13
  2779	VMOVDQA  Y12, Y8
  2780	VMOVDQA  Y12, Y15
  2781	VMOVDQA  192(BP), Y4
  2782	VPADDD   ·avx2IncMask<>+0(SB), Y4, Y4
  2783	VPADDD   ·avx2IncMask<>+0(SB), Y4, Y1
  2784	VPADDD   ·avx2IncMask<>+0(SB), Y1, Y2
  2785	VPADDD   ·avx2IncMask<>+0(SB), Y2, Y3
  2786	VMOVDQA  Y4, 96(BP)
  2787	VMOVDQA  Y1, 128(BP)
  2788	VMOVDQA  Y2, 160(BP)
  2789	VMOVDQA  Y3, 192(BP)
  2790	VMOVDQA  Y15, 224(BP)
  2791	VPADDD   Y14, Y0, Y0
  2792	VPXOR    Y0, Y4, Y4
  2793	VPSHUFB  ·rol16<>+0(SB), Y4, Y4
  2794	VPADDD   Y4, Y12, Y12
  2795	VPXOR    Y12, Y14, Y14
  2796	VPSLLD   $0x0c, Y14, Y15
  2797	VPSRLD   $0x14, Y14, Y14
  2798	VPXOR    Y15, Y14, Y14
  2799	VPADDD   Y14, Y0, Y0
  2800	VPXOR    Y0, Y4, Y4
  2801	VPSHUFB  ·rol8<>+0(SB), Y4, Y4
  2802	VPADDD   Y4, Y12, Y12
  2803	VPXOR    Y12, Y14, Y14
  2804	VPSLLD   $0x07, Y14, Y15
  2805	VPSRLD   $0x19, Y14, Y14
  2806	VPXOR    Y15, Y14, Y14
  2807	VPADDD   Y9, Y5, Y5
  2808	VPXOR    Y5, Y1, Y1
  2809	VPSHUFB  ·rol16<>+0(SB), Y1, Y1
  2810	VPADDD   Y1, Y13, Y13
  2811	VPXOR    Y13, Y9, Y9
  2812	VPSLLD   $0x0c, Y9, Y15
  2813	VPSRLD   $0x14, Y9, Y9
  2814	VPXOR    Y15, Y9, Y9
  2815	VPADDD   Y9, Y5, Y5
  2816	VPXOR    Y5, Y1, Y1
  2817	VPSHUFB  ·rol8<>+0(SB), Y1, Y1
  2818	VPADDD   Y1, Y13, Y13
  2819	VPXOR    Y13, Y9, Y9
  2820	VPSLLD   $0x07, Y9, Y15
  2821	VPSRLD   $0x19, Y9, Y9
  2822	VPXOR    Y15, Y9, Y9
  2823	VPADDD   Y10, Y6, Y6
  2824	VPXOR    Y6, Y2, Y2
  2825	VPSHUFB  ·rol16<>+0(SB), Y2, Y2
  2826	VPADDD   Y2, Y8, Y8
  2827	VPXOR    Y8, Y10, Y10
  2828	VPSLLD   $0x0c, Y10, Y15
  2829	VPSRLD   $0x14, Y10, Y10
  2830	VPXOR    Y15, Y10, Y10
  2831	VPADDD   Y10, Y6, Y6
  2832	VPXOR    Y6, Y2, Y2
  2833	VPSHUFB  ·rol8<>+0(SB), Y2, Y2
  2834	VPADDD   Y2, Y8, Y8
  2835	VPXOR    Y8, Y10, Y10
  2836	VPSLLD   $0x07, Y10, Y15
  2837	VPSRLD   $0x19, Y10, Y10
  2838	VPXOR    Y15, Y10, Y10
  2839	VMOVDQA  224(BP), Y15
  2840	VMOVDQA  Y13, 224(BP)
  2841	VPADDD   Y11, Y7, Y7
  2842	VPXOR    Y7, Y3, Y3
  2843	VPSHUFB  ·rol16<>+0(SB), Y3, Y3
  2844	VPADDD   Y3, Y15, Y15
  2845	VPXOR    Y15, Y11, Y11
  2846	VPSLLD   $0x0c, Y11, Y13
  2847	VPSRLD   $0x14, Y11, Y11
  2848	VPXOR    Y13, Y11, Y11
  2849	VPADDD   Y11, Y7, Y7
  2850	VPXOR    Y7, Y3, Y3
  2851	VPSHUFB  ·rol8<>+0(SB), Y3, Y3
  2852	VPADDD   Y3, Y15, Y15
  2853	VPXOR    Y15, Y11, Y11
  2854	VPSLLD   $0x07, Y11, Y13
  2855	VPSRLD   $0x19, Y11, Y11
  2856	VPXOR    Y13, Y11, Y11
  2857	VMOVDQA  224(BP), Y13
  2858	VPALIGNR $0x04, Y14, Y14, Y14
  2859	VPALIGNR $0x08, Y12, Y12, Y12
  2860	VPALIGNR $0x0c, Y4, Y4, Y4
  2861	VPALIGNR $0x04, Y9, Y9, Y9
  2862	VPALIGNR $0x08, Y13, Y13, Y13
  2863	VPALIGNR $0x0c, Y1, Y1, Y1
  2864	VPALIGNR $0x04, Y10, Y10, Y10
  2865	VPALIGNR $0x08, Y8, Y8, Y8
  2866	VPALIGNR $0x0c, Y2, Y2, Y2
  2867	VPALIGNR $0x04, Y11, Y11, Y11
  2868	VPALIGNR $0x08, Y15, Y15, Y15
  2869	VPALIGNR $0x0c, Y3, Y3, Y3
  2870	VMOVDQA  Y15, 224(BP)
  2871	VPADDD   Y14, Y0, Y0
  2872	VPXOR    Y0, Y4, Y4
  2873	VPSHUFB  ·rol16<>+0(SB), Y4, Y4
  2874	VPADDD   Y4, Y12, Y12
  2875	VPXOR    Y12, Y14, Y14
  2876	VPSLLD   $0x0c, Y14, Y15
  2877	VPSRLD   $0x14, Y14, Y14
  2878	VPXOR    Y15, Y14, Y14
  2879	VPADDD   Y14, Y0, Y0
  2880	VPXOR    Y0, Y4, Y4
  2881	VPSHUFB  ·rol8<>+0(SB), Y4, Y4
  2882	VPADDD   Y4, Y12, Y12
  2883	VPXOR    Y12, Y14, Y14
  2884	VPSLLD   $0x07, Y14, Y15
  2885	VPSRLD   $0x19, Y14, Y14
  2886	VPXOR    Y15, Y14, Y14
  2887	VPADDD   Y9, Y5, Y5
  2888	VPXOR    Y5, Y1, Y1
  2889	VPSHUFB  ·rol16<>+0(SB), Y1, Y1
  2890	VPADDD   Y1, Y13, Y13
  2891	VPXOR    Y13, Y9, Y9
  2892	VPSLLD   $0x0c, Y9, Y15
  2893	VPSRLD   $0x14, Y9, Y9
  2894	VPXOR    Y15, Y9, Y9
  2895	VPADDD   Y9, Y5, Y5
  2896	VPXOR    Y5, Y1, Y1
  2897	VPSHUFB  ·rol8<>+0(SB), Y1, Y1
  2898	VPADDD   Y1, Y13, Y13
  2899	VPXOR    Y13, Y9, Y9
  2900	VPSLLD   $0x07, Y9, Y15
  2901	VPSRLD   $0x19, Y9, Y9
  2902	VPXOR    Y15, Y9, Y9
  2903	VPADDD   Y10, Y6, Y6
  2904	VPXOR    Y6, Y2, Y2
  2905	VPSHUFB  ·rol16<>+0(SB), Y2, Y2
  2906	VPADDD   Y2, Y8, Y8
  2907	VPXOR    Y8, Y10, Y10
  2908	VPSLLD   $0x0c, Y10, Y15
  2909	VPSRLD   $0x14, Y10, Y10
  2910	VPXOR    Y15, Y10, Y10
  2911	VPADDD   Y10, Y6, Y6
  2912	VPXOR    Y6, Y2, Y2
  2913	VPSHUFB  ·rol8<>+0(SB), Y2, Y2
  2914	VPADDD   Y2, Y8, Y8
  2915	VPXOR    Y8, Y10, Y10
  2916	VPSLLD   $0x07, Y10, Y15
  2917	VPSRLD   $0x19, Y10, Y10
  2918	VPXOR    Y15, Y10, Y10
  2919	VMOVDQA  224(BP), Y15
  2920	VMOVDQA  Y13, 224(BP)
  2921	VPADDD   Y11, Y7, Y7
  2922	VPXOR    Y7, Y3, Y3
  2923	VPSHUFB  ·rol16<>+0(SB), Y3, Y3
  2924	VPADDD   Y3, Y15, Y15
  2925	VPXOR    Y15, Y11, Y11
  2926	VPSLLD   $0x0c, Y11, Y13
  2927	VPSRLD   $0x14, Y11, Y11
  2928	VPXOR    Y13, Y11, Y11
  2929	VPADDD   Y11, Y7, Y7
  2930	VPXOR    Y7, Y3, Y3
  2931	VPSHUFB  ·rol8<>+0(SB), Y3, Y3
  2932	VPADDD   Y3, Y15, Y15
  2933	VPXOR    Y15, Y11, Y11
  2934	VPSLLD   $0x07, Y11, Y13
  2935	VPSRLD   $0x19, Y11, Y11
  2936	VPXOR    Y13, Y11, Y11
  2937	VMOVDQA  224(BP), Y13
  2938	VPALIGNR $0x0c, Y14, Y14, Y14
  2939	VPALIGNR $0x08, Y12, Y12, Y12
  2940	VPALIGNR $0x04, Y4, Y4, Y4
  2941	VPALIGNR $0x0c, Y9, Y9, Y9
  2942	VPALIGNR $0x08, Y13, Y13, Y13
  2943	VPALIGNR $0x04, Y1, Y1, Y1
  2944	VPALIGNR $0x0c, Y10, Y10, Y10
  2945	VPALIGNR $0x08, Y8, Y8, Y8
  2946	VPALIGNR $0x04, Y2, Y2, Y2
  2947	VPALIGNR $0x0c, Y11, Y11, Y11
  2948	VPALIGNR $0x08, Y15, Y15, Y15
  2949	VPALIGNR $0x04, Y3, Y3, Y3
  2950	VPADDD   Y14, Y0, Y0
  2951	VPADDD   Y9, Y5, Y5
  2952	VPADDD   Y10, Y6, Y6
  2953	VPADDD   Y11, Y7, Y7
  2954	VPXOR    Y0, Y4, Y4
  2955	VPXOR    Y5, Y1, Y1
  2956	VPXOR    Y6, Y2, Y2
  2957	VPXOR    Y7, Y3, Y3
  2958	VPSHUFB  ·rol16<>+0(SB), Y4, Y4
  2959	VPSHUFB  ·rol16<>+0(SB), Y1, Y1
  2960	VPSHUFB  ·rol16<>+0(SB), Y2, Y2
  2961	VPSHUFB  ·rol16<>+0(SB), Y3, Y3
  2962	VPADDD   Y4, Y12, Y12
  2963	VPADDD   Y1, Y13, Y13
  2964	VPADDD   Y2, Y8, Y8
  2965	VPADDD   Y3, Y15, Y15
  2966	VPXOR    Y12, Y14, Y14
  2967	VPXOR    Y13, Y9, Y9
  2968	VPXOR    Y8, Y10, Y10
  2969	VPXOR    Y15, Y11, Y11
  2970	VMOVDQA  Y15, 224(BP)
  2971	VPSLLD   $0x0c, Y14, Y15
  2972	VPSRLD   $0x14, Y14, Y14
  2973	VPXOR    Y15, Y14, Y14
  2974	VPSLLD   $0x0c, Y9, Y15
  2975	VPSRLD   $0x14, Y9, Y9
  2976	VPXOR    Y15, Y9, Y9
  2977	VPSLLD   $0x0c, Y10, Y15
  2978	VPSRLD   $0x14, Y10, Y10
  2979	VPXOR    Y15, Y10, Y10
  2980	VPSLLD   $0x0c, Y11, Y15
  2981	VPSRLD   $0x14, Y11, Y11
  2982	VPXOR    Y15, Y11, Y11
  2983	VMOVDQA  224(BP), Y15
  2984	SUBQ     $0x10, DI
  2985	MOVQ     $0x00000009, CX
  2986	JMP      sealAVX2InternalLoopStart
  2987
  2988sealAVX2MainLoop:
  2989	VMOVDQU ·chacha20Constants<>+0(SB), Y0
  2990	VMOVDQA Y0, Y5
  2991	VMOVDQA Y0, Y6
  2992	VMOVDQA Y0, Y7
  2993	VMOVDQA 32(BP), Y14
  2994	VMOVDQA Y14, Y9
  2995	VMOVDQA Y14, Y10
  2996	VMOVDQA Y14, Y11
  2997	VMOVDQA 64(BP), Y12
  2998	VMOVDQA Y12, Y13
  2999	VMOVDQA Y12, Y8
  3000	VMOVDQA Y12, Y15
  3001	VMOVDQA 192(BP), Y4
  3002	VPADDD  ·avx2IncMask<>+0(SB), Y4, Y4
  3003	VPADDD  ·avx2IncMask<>+0(SB), Y4, Y1
  3004	VPADDD  ·avx2IncMask<>+0(SB), Y1, Y2
  3005	VPADDD  ·avx2IncMask<>+0(SB), Y2, Y3
  3006	VMOVDQA Y4, 96(BP)
  3007	VMOVDQA Y1, 128(BP)
  3008	VMOVDQA Y2, 160(BP)
  3009	VMOVDQA Y3, 192(BP)
  3010	MOVQ    $0x0000000a, CX
  3011
  3012sealAVX2InternalLoop:
  3013	ADDQ    (DI), R10
  3014	ADCQ    8(DI), R11
  3015	ADCQ    $0x01, R12
  3016	VPADDD  Y14, Y0, Y0
  3017	VPADDD  Y9, Y5, Y5
  3018	VPADDD  Y10, Y6, Y6
  3019	VPADDD  Y11, Y7, Y7
  3020	MOVQ    (BP), DX
  3021	MOVQ    DX, R15
  3022	MULXQ   R10, R13, R14
  3023	IMULQ   R12, R15
  3024	MULXQ   R11, AX, DX
  3025	ADDQ    AX, R14
  3026	ADCQ    DX, R15
  3027	VPXOR   Y0, Y4, Y4
  3028	VPXOR   Y5, Y1, Y1
  3029	VPXOR   Y6, Y2, Y2
  3030	VPXOR   Y7, Y3, Y3
  3031	VPSHUFB ·rol16<>+0(SB), Y4, Y4
  3032	VPSHUFB ·rol16<>+0(SB), Y1, Y1
  3033	VPSHUFB ·rol16<>+0(SB), Y2, Y2
  3034	VPSHUFB ·rol16<>+0(SB), Y3, Y3
  3035	MOVQ    8(BP), DX
  3036	MULXQ   R10, R10, AX
  3037	ADDQ    R10, R14
  3038	MULXQ   R11, R11, R8
  3039	ADCQ    R11, R15
  3040	ADCQ    $0x00, R8
  3041	VPADDD  Y4, Y12, Y12
  3042	VPADDD  Y1, Y13, Y13
  3043	VPADDD  Y2, Y8, Y8
  3044	VPADDD  Y3, Y15, Y15
  3045	VPXOR   Y12, Y14, Y14
  3046	VPXOR   Y13, Y9, Y9
  3047	VPXOR   Y8, Y10, Y10
  3048	VPXOR   Y15, Y11, Y11
  3049	IMULQ   R12, DX
  3050	ADDQ    AX, R15
  3051	ADCQ    DX, R8
  3052	VMOVDQA Y15, 224(BP)
  3053	VPSLLD  $0x0c, Y14, Y15
  3054	VPSRLD  $0x14, Y14, Y14
  3055	VPXOR   Y15, Y14, Y14
  3056	VPSLLD  $0x0c, Y9, Y15
  3057	VPSRLD  $0x14, Y9, Y9
  3058	VPXOR   Y15, Y9, Y9
  3059	VPSLLD  $0x0c, Y10, Y15
  3060	VPSRLD  $0x14, Y10, Y10
  3061	VPXOR   Y15, Y10, Y10
  3062	VPSLLD  $0x0c, Y11, Y15
  3063	VPSRLD  $0x14, Y11, Y11
  3064	VPXOR   Y15, Y11, Y11
  3065	VMOVDQA 224(BP), Y15
  3066	MOVQ    R13, R10
  3067	MOVQ    R14, R11
  3068	MOVQ    R15, R12
  3069	ANDQ    $0x03, R12
  3070	MOVQ    R15, R13
  3071	ANDQ    $-4, R13
  3072	MOVQ    R8, R14
  3073	SHRQ    $0x02, R8, R15
  3074	SHRQ    $0x02, R8
  3075	ADDQ    R13, R10
  3076	ADCQ    R14, R11
  3077	ADCQ    $0x00, R12
  3078	ADDQ    R15, R10
  3079	ADCQ    R8, R11
  3080	ADCQ    $0x00, R12
  3081
  3082sealAVX2InternalLoopStart:
  3083	VPADDD   Y14, Y0, Y0
  3084	VPADDD   Y9, Y5, Y5
  3085	VPADDD   Y10, Y6, Y6
  3086	VPADDD   Y11, Y7, Y7
  3087	VPXOR    Y0, Y4, Y4
  3088	VPXOR    Y5, Y1, Y1
  3089	VPXOR    Y6, Y2, Y2
  3090	VPXOR    Y7, Y3, Y3
  3091	VPSHUFB  ·rol8<>+0(SB), Y4, Y4
  3092	VPSHUFB  ·rol8<>+0(SB), Y1, Y1
  3093	VPSHUFB  ·rol8<>+0(SB), Y2, Y2
  3094	VPSHUFB  ·rol8<>+0(SB), Y3, Y3
  3095	ADDQ     16(DI), R10
  3096	ADCQ     24(DI), R11
  3097	ADCQ     $0x01, R12
  3098	VPADDD   Y4, Y12, Y12
  3099	VPADDD   Y1, Y13, Y13
  3100	VPADDD   Y2, Y8, Y8
  3101	VPADDD   Y3, Y15, Y15
  3102	MOVQ     (BP), DX
  3103	MOVQ     DX, R15
  3104	MULXQ    R10, R13, R14
  3105	IMULQ    R12, R15
  3106	MULXQ    R11, AX, DX
  3107	ADDQ     AX, R14
  3108	ADCQ     DX, R15
  3109	VPXOR    Y12, Y14, Y14
  3110	VPXOR    Y13, Y9, Y9
  3111	VPXOR    Y8, Y10, Y10
  3112	VPXOR    Y15, Y11, Y11
  3113	VMOVDQA  Y15, 224(BP)
  3114	VPSLLD   $0x07, Y14, Y15
  3115	VPSRLD   $0x19, Y14, Y14
  3116	VPXOR    Y15, Y14, Y14
  3117	VPSLLD   $0x07, Y9, Y15
  3118	VPSRLD   $0x19, Y9, Y9
  3119	VPXOR    Y15, Y9, Y9
  3120	VPSLLD   $0x07, Y10, Y15
  3121	VPSRLD   $0x19, Y10, Y10
  3122	VPXOR    Y15, Y10, Y10
  3123	VPSLLD   $0x07, Y11, Y15
  3124	VPSRLD   $0x19, Y11, Y11
  3125	VPXOR    Y15, Y11, Y11
  3126	VMOVDQA  224(BP), Y15
  3127	MOVQ     8(BP), DX
  3128	MULXQ    R10, R10, AX
  3129	ADDQ     R10, R14
  3130	MULXQ    R11, R11, R8
  3131	ADCQ     R11, R15
  3132	ADCQ     $0x00, R8
  3133	VPALIGNR $0x04, Y14, Y14, Y14
  3134	VPALIGNR $0x04, Y9, Y9, Y9
  3135	VPALIGNR $0x04, Y10, Y10, Y10
  3136	VPALIGNR $0x04, Y11, Y11, Y11
  3137	VPALIGNR $0x08, Y12, Y12, Y12
  3138	VPALIGNR $0x08, Y13, Y13, Y13
  3139	VPALIGNR $0x08, Y8, Y8, Y8
  3140	VPALIGNR $0x08, Y15, Y15, Y15
  3141	VPALIGNR $0x0c, Y4, Y4, Y4
  3142	VPALIGNR $0x0c, Y1, Y1, Y1
  3143	VPALIGNR $0x0c, Y2, Y2, Y2
  3144	VPALIGNR $0x0c, Y3, Y3, Y3
  3145	VPADDD   Y14, Y0, Y0
  3146	VPADDD   Y9, Y5, Y5
  3147	VPADDD   Y10, Y6, Y6
  3148	VPADDD   Y11, Y7, Y7
  3149	IMULQ    R12, DX
  3150	ADDQ     AX, R15
  3151	ADCQ     DX, R8
  3152	VPXOR    Y0, Y4, Y4
  3153	VPXOR    Y5, Y1, Y1
  3154	VPXOR    Y6, Y2, Y2
  3155	VPXOR    Y7, Y3, Y3
  3156	VPSHUFB  ·rol16<>+0(SB), Y4, Y4
  3157	VPSHUFB  ·rol16<>+0(SB), Y1, Y1
  3158	VPSHUFB  ·rol16<>+0(SB), Y2, Y2
  3159	VPSHUFB  ·rol16<>+0(SB), Y3, Y3
  3160	MOVQ     R13, R10
  3161	MOVQ     R14, R11
  3162	MOVQ     R15, R12
  3163	ANDQ     $0x03, R12
  3164	MOVQ     R15, R13
  3165	ANDQ     $-4, R13
  3166	MOVQ     R8, R14
  3167	SHRQ     $0x02, R8, R15
  3168	SHRQ     $0x02, R8
  3169	ADDQ     R13, R10
  3170	ADCQ     R14, R11
  3171	ADCQ     $0x00, R12
  3172	ADDQ     R15, R10
  3173	ADCQ     R8, R11
  3174	ADCQ     $0x00, R12
  3175	VPADDD   Y4, Y12, Y12
  3176	VPADDD   Y1, Y13, Y13
  3177	VPADDD   Y2, Y8, Y8
  3178	VPADDD   Y3, Y15, Y15
  3179	VPXOR    Y12, Y14, Y14
  3180	VPXOR    Y13, Y9, Y9
  3181	VPXOR    Y8, Y10, Y10
  3182	VPXOR    Y15, Y11, Y11
  3183	ADDQ     32(DI), R10
  3184	ADCQ     40(DI), R11
  3185	ADCQ     $0x01, R12
  3186	LEAQ     48(DI), DI
  3187	VMOVDQA  Y15, 224(BP)
  3188	VPSLLD   $0x0c, Y14, Y15
  3189	VPSRLD   $0x14, Y14, Y14
  3190	VPXOR    Y15, Y14, Y14
  3191	VPSLLD   $0x0c, Y9, Y15
  3192	VPSRLD   $0x14, Y9, Y9
  3193	VPXOR    Y15, Y9, Y9
  3194	VPSLLD   $0x0c, Y10, Y15
  3195	VPSRLD   $0x14, Y10, Y10
  3196	VPXOR    Y15, Y10, Y10
  3197	VPSLLD   $0x0c, Y11, Y15
  3198	VPSRLD   $0x14, Y11, Y11
  3199	VPXOR    Y15, Y11, Y11
  3200	VMOVDQA  224(BP), Y15
  3201	MOVQ     (BP), DX
  3202	MOVQ     DX, R15
  3203	MULXQ    R10, R13, R14
  3204	IMULQ    R12, R15
  3205	MULXQ    R11, AX, DX
  3206	ADDQ     AX, R14
  3207	ADCQ     DX, R15
  3208	VPADDD   Y14, Y0, Y0
  3209	VPADDD   Y9, Y5, Y5
  3210	VPADDD   Y10, Y6, Y6
  3211	VPADDD   Y11, Y7, Y7
  3212	VPXOR    Y0, Y4, Y4
  3213	VPXOR    Y5, Y1, Y1
  3214	VPXOR    Y6, Y2, Y2
  3215	VPXOR    Y7, Y3, Y3
  3216	MOVQ     8(BP), DX
  3217	MULXQ    R10, R10, AX
  3218	ADDQ     R10, R14
  3219	MULXQ    R11, R11, R8
  3220	ADCQ     R11, R15
  3221	ADCQ     $0x00, R8
  3222	VPSHUFB  ·rol8<>+0(SB), Y4, Y4
  3223	VPSHUFB  ·rol8<>+0(SB), Y1, Y1
  3224	VPSHUFB  ·rol8<>+0(SB), Y2, Y2
  3225	VPSHUFB  ·rol8<>+0(SB), Y3, Y3
  3226	VPADDD   Y4, Y12, Y12
  3227	VPADDD   Y1, Y13, Y13
  3228	VPADDD   Y2, Y8, Y8
  3229	VPADDD   Y3, Y15, Y15
  3230	IMULQ    R12, DX
  3231	ADDQ     AX, R15
  3232	ADCQ     DX, R8
  3233	VPXOR    Y12, Y14, Y14
  3234	VPXOR    Y13, Y9, Y9
  3235	VPXOR    Y8, Y10, Y10
  3236	VPXOR    Y15, Y11, Y11
  3237	VMOVDQA  Y15, 224(BP)
  3238	VPSLLD   $0x07, Y14, Y15
  3239	VPSRLD   $0x19, Y14, Y14
  3240	VPXOR    Y15, Y14, Y14
  3241	VPSLLD   $0x07, Y9, Y15
  3242	VPSRLD   $0x19, Y9, Y9
  3243	VPXOR    Y15, Y9, Y9
  3244	VPSLLD   $0x07, Y10, Y15
  3245	VPSRLD   $0x19, Y10, Y10
  3246	VPXOR    Y15, Y10, Y10
  3247	VPSLLD   $0x07, Y11, Y15
  3248	VPSRLD   $0x19, Y11, Y11
  3249	VPXOR    Y15, Y11, Y11
  3250	VMOVDQA  224(BP), Y15
  3251	MOVQ     R13, R10
  3252	MOVQ     R14, R11
  3253	MOVQ     R15, R12
  3254	ANDQ     $0x03, R12
  3255	MOVQ     R15, R13
  3256	ANDQ     $-4, R13
  3257	MOVQ     R8, R14
  3258	SHRQ     $0x02, R8, R15
  3259	SHRQ     $0x02, R8
  3260	ADDQ     R13, R10
  3261	ADCQ     R14, R11
  3262	ADCQ     $0x00, R12
  3263	ADDQ     R15, R10
  3264	ADCQ     R8, R11
  3265	ADCQ     $0x00, R12
  3266	VPALIGNR $0x0c, Y14, Y14, Y14
  3267	VPALIGNR $0x0c, Y9, Y9, Y9
  3268	VPALIGNR $0x0c, Y10, Y10, Y10
  3269	VPALIGNR $0x0c, Y11, Y11, Y11
  3270	VPALIGNR $0x08, Y12, Y12, Y12
  3271	VPALIGNR $0x08, Y13, Y13, Y13
  3272	VPALIGNR $0x08, Y8, Y8, Y8
  3273	VPALIGNR $0x08, Y15, Y15, Y15
  3274	VPALIGNR $0x04, Y4, Y4, Y4
  3275	VPALIGNR $0x04, Y1, Y1, Y1
  3276	VPALIGNR $0x04, Y2, Y2, Y2
  3277	VPALIGNR $0x04, Y3, Y3, Y3
  3278	DECQ     CX
  3279	JNE      sealAVX2InternalLoop
  3280	VPADDD   ·chacha20Constants<>+0(SB), Y0, Y0
  3281	VPADDD   ·chacha20Constants<>+0(SB), Y5, Y5
  3282	VPADDD   ·chacha20Constants<>+0(SB), Y6, Y6
  3283	VPADDD   ·chacha20Constants<>+0(SB), Y7, Y7
  3284	VPADDD   32(BP), Y14, Y14
  3285	VPADDD   32(BP), Y9, Y9
  3286	VPADDD   32(BP), Y10, Y10
  3287	VPADDD   32(BP), Y11, Y11
  3288	VPADDD   64(BP), Y12, Y12
  3289	VPADDD   64(BP), Y13, Y13
  3290	VPADDD   64(BP), Y8, Y8
  3291	VPADDD   64(BP), Y15, Y15
  3292	VPADDD   96(BP), Y4, Y4
  3293	VPADDD   128(BP), Y1, Y1
  3294	VPADDD   160(BP), Y2, Y2
  3295	VPADDD   192(BP), Y3, Y3
  3296	VMOVDQA  Y15, 224(BP)
  3297
  3298	// We only hashed 480 of the 512 bytes available - hash the remaining 32 here
  3299	ADDQ       (DI), R10
  3300	ADCQ       8(DI), R11
  3301	ADCQ       $0x01, R12
  3302	MOVQ       (BP), DX
  3303	MOVQ       DX, R15
  3304	MULXQ      R10, R13, R14
  3305	IMULQ      R12, R15
  3306	MULXQ      R11, AX, DX
  3307	ADDQ       AX, R14
  3308	ADCQ       DX, R15
  3309	MOVQ       8(BP), DX
  3310	MULXQ      R10, R10, AX
  3311	ADDQ       R10, R14
  3312	MULXQ      R11, R11, R8
  3313	ADCQ       R11, R15
  3314	ADCQ       $0x00, R8
  3315	IMULQ      R12, DX
  3316	ADDQ       AX, R15
  3317	ADCQ       DX, R8
  3318	MOVQ       R13, R10
  3319	MOVQ       R14, R11
  3320	MOVQ       R15, R12
  3321	ANDQ       $0x03, R12
  3322	MOVQ       R15, R13
  3323	ANDQ       $-4, R13
  3324	MOVQ       R8, R14
  3325	SHRQ       $0x02, R8, R15
  3326	SHRQ       $0x02, R8
  3327	ADDQ       R13, R10
  3328	ADCQ       R14, R11
  3329	ADCQ       $0x00, R12
  3330	ADDQ       R15, R10
  3331	ADCQ       R8, R11
  3332	ADCQ       $0x00, R12
  3333	LEAQ       32(DI), DI
  3334	VPERM2I128 $0x02, Y0, Y14, Y15
  3335	VPERM2I128 $0x13, Y0, Y14, Y14
  3336	VPERM2I128 $0x02, Y12, Y4, Y0
  3337	VPERM2I128 $0x13, Y12, Y4, Y12
  3338	VPXOR      (SI), Y15, Y15
  3339	VPXOR      32(SI), Y0, Y0
  3340	VPXOR      64(SI), Y14, Y14
  3341	VPXOR      96(SI), Y12, Y12
  3342	VMOVDQU    Y15, (DI)
  3343	VMOVDQU    Y0, 32(DI)
  3344	VMOVDQU    Y14, 64(DI)
  3345	VMOVDQU    Y12, 96(DI)
  3346	VPERM2I128 $0x02, Y5, Y9, Y0
  3347	VPERM2I128 $0x02, Y13, Y1, Y14
  3348	VPERM2I128 $0x13, Y5, Y9, Y12
  3349	VPERM2I128 $0x13, Y13, Y1, Y4
  3350	VPXOR      128(SI), Y0, Y0
  3351	VPXOR      160(SI), Y14, Y14
  3352	VPXOR      192(SI), Y12, Y12
  3353	VPXOR      224(SI), Y4, Y4
  3354	VMOVDQU    Y0, 128(DI)
  3355	VMOVDQU    Y14, 160(DI)
  3356	VMOVDQU    Y12, 192(DI)
  3357	VMOVDQU    Y4, 224(DI)
  3358
  3359	// and here
  3360	ADDQ       -16(DI), R10
  3361	ADCQ       -8(DI), R11
  3362	ADCQ       $0x01, R12
  3363	MOVQ       (BP), DX
  3364	MOVQ       DX, R15
  3365	MULXQ      R10, R13, R14
  3366	IMULQ      R12, R15
  3367	MULXQ      R11, AX, DX
  3368	ADDQ       AX, R14
  3369	ADCQ       DX, R15
  3370	MOVQ       8(BP), DX
  3371	MULXQ      R10, R10, AX
  3372	ADDQ       R10, R14
  3373	MULXQ      R11, R11, R8
  3374	ADCQ       R11, R15
  3375	ADCQ       $0x00, R8
  3376	IMULQ      R12, DX
  3377	ADDQ       AX, R15
  3378	ADCQ       DX, R8
  3379	MOVQ       R13, R10
  3380	MOVQ       R14, R11
  3381	MOVQ       R15, R12
  3382	ANDQ       $0x03, R12
  3383	MOVQ       R15, R13
  3384	ANDQ       $-4, R13
  3385	MOVQ       R8, R14
  3386	SHRQ       $0x02, R8, R15
  3387	SHRQ       $0x02, R8
  3388	ADDQ       R13, R10
  3389	ADCQ       R14, R11
  3390	ADCQ       $0x00, R12
  3391	ADDQ       R15, R10
  3392	ADCQ       R8, R11
  3393	ADCQ       $0x00, R12
  3394	VPERM2I128 $0x02, Y6, Y10, Y0
  3395	VPERM2I128 $0x02, Y8, Y2, Y14
  3396	VPERM2I128 $0x13, Y6, Y10, Y12
  3397	VPERM2I128 $0x13, Y8, Y2, Y4
  3398	VPXOR      256(SI), Y0, Y0
  3399	VPXOR      288(SI), Y14, Y14
  3400	VPXOR      320(SI), Y12, Y12
  3401	VPXOR      352(SI), Y4, Y4
  3402	VMOVDQU    Y0, 256(DI)
  3403	VMOVDQU    Y14, 288(DI)
  3404	VMOVDQU    Y12, 320(DI)
  3405	VMOVDQU    Y4, 352(DI)
  3406	VPERM2I128 $0x02, Y7, Y11, Y0
  3407	VPERM2I128 $0x02, 224(BP), Y3, Y14
  3408	VPERM2I128 $0x13, Y7, Y11, Y12
  3409	VPERM2I128 $0x13, 224(BP), Y3, Y4
  3410	VPXOR      384(SI), Y0, Y0
  3411	VPXOR      416(SI), Y14, Y14
  3412	VPXOR      448(SI), Y12, Y12
  3413	VPXOR      480(SI), Y4, Y4
  3414	VMOVDQU    Y0, 384(DI)
  3415	VMOVDQU    Y14, 416(DI)
  3416	VMOVDQU    Y12, 448(DI)
  3417	VMOVDQU    Y4, 480(DI)
  3418	LEAQ       512(SI), SI
  3419	SUBQ       $0x00000200, BX
  3420	CMPQ       BX, $0x00000200
  3421	JG         sealAVX2MainLoop
  3422
  3423	// Tail can only hash 480 bytes
  3424	ADDQ  (DI), R10
  3425	ADCQ  8(DI), R11
  3426	ADCQ  $0x01, R12
  3427	MOVQ  (BP), DX
  3428	MOVQ  DX, R15
  3429	MULXQ R10, R13, R14
  3430	IMULQ R12, R15
  3431	MULXQ R11, AX, DX
  3432	ADDQ  AX, R14
  3433	ADCQ  DX, R15
  3434	MOVQ  8(BP), DX
  3435	MULXQ R10, R10, AX
  3436	ADDQ  R10, R14
  3437	MULXQ R11, R11, R8
  3438	ADCQ  R11, R15
  3439	ADCQ  $0x00, R8
  3440	IMULQ R12, DX
  3441	ADDQ  AX, R15
  3442	ADCQ  DX, R8
  3443	MOVQ  R13, R10
  3444	MOVQ  R14, R11
  3445	MOVQ  R15, R12
  3446	ANDQ  $0x03, R12
  3447	MOVQ  R15, R13
  3448	ANDQ  $-4, R13
  3449	MOVQ  R8, R14
  3450	SHRQ  $0x02, R8, R15
  3451	SHRQ  $0x02, R8
  3452	ADDQ  R13, R10
  3453	ADCQ  R14, R11
  3454	ADCQ  $0x00, R12
  3455	ADDQ  R15, R10
  3456	ADCQ  R8, R11
  3457	ADCQ  $0x00, R12
  3458	ADDQ  16(DI), R10
  3459	ADCQ  24(DI), R11
  3460	ADCQ  $0x01, R12
  3461	MOVQ  (BP), DX
  3462	MOVQ  DX, R15
  3463	MULXQ R10, R13, R14
  3464	IMULQ R12, R15
  3465	MULXQ R11, AX, DX
  3466	ADDQ  AX, R14
  3467	ADCQ  DX, R15
  3468	MOVQ  8(BP), DX
  3469	MULXQ R10, R10, AX
  3470	ADDQ  R10, R14
  3471	MULXQ R11, R11, R8
  3472	ADCQ  R11, R15
  3473	ADCQ  $0x00, R8
  3474	IMULQ R12, DX
  3475	ADDQ  AX, R15
  3476	ADCQ  DX, R8
  3477	MOVQ  R13, R10
  3478	MOVQ  R14, R11
  3479	MOVQ  R15, R12
  3480	ANDQ  $0x03, R12
  3481	MOVQ  R15, R13
  3482	ANDQ  $-4, R13
  3483	MOVQ  R8, R14
  3484	SHRQ  $0x02, R8, R15
  3485	SHRQ  $0x02, R8
  3486	ADDQ  R13, R10
  3487	ADCQ  R14, R11
  3488	ADCQ  $0x00, R12
  3489	ADDQ  R15, R10
  3490	ADCQ  R8, R11
  3491	ADCQ  $0x00, R12
  3492	LEAQ  32(DI), DI
  3493	MOVQ  $0x0000000a, CX
  3494	MOVQ  $0x00000000, R9
  3495	CMPQ  BX, $0x80
  3496	JBE   sealAVX2Tail128
  3497	CMPQ  BX, $0x00000100
  3498	JBE   sealAVX2Tail256
  3499	CMPQ  BX, $0x00000180
  3500	JBE   sealAVX2Tail384
  3501	JMP   sealAVX2Tail512
  3502
  3503sealSSETail:
  3504	TESTQ BX, BX
  3505	JE    sealSSEFinalize
  3506
  3507	// We can only load the PT one byte at a time to avoid read after end of buffer
  3508	MOVQ BX, R9
  3509	SHLQ $0x04, R9
  3510	LEAQ ·andMask<>+0(SB), R13
  3511	MOVQ BX, CX
  3512	LEAQ -1(SI)(BX*1), SI
  3513	XORQ R15, R15
  3514	XORQ R8, R8
  3515	XORQ AX, AX
  3516
  3517sealSSETailLoadLoop:
  3518	SHLQ   $0x08, R15, R8
  3519	SHLQ   $0x08, R15
  3520	MOVB   (SI), AX
  3521	XORQ   AX, R15
  3522	LEAQ   -1(SI), SI
  3523	DECQ   CX
  3524	JNE    sealSSETailLoadLoop
  3525	MOVQ   R15, 64(BP)
  3526	MOVQ   R8, 72(BP)
  3527	PXOR   64(BP), X1
  3528	MOVOU  X1, (DI)
  3529	MOVOU  -16(R13)(R9*1), X12
  3530	PAND   X12, X1
  3531	MOVQ   X1, R13
  3532	PSRLDQ $0x08, X1
  3533	MOVQ   X1, R14
  3534	ADDQ   R13, R10
  3535	ADCQ   R14, R11
  3536	ADCQ   $0x01, R12
  3537	MOVQ   (BP), AX
  3538	MOVQ   AX, R15
  3539	MULQ   R10
  3540	MOVQ   AX, R13
  3541	MOVQ   DX, R14
  3542	MOVQ   (BP), AX
  3543	MULQ   R11
  3544	IMULQ  R12, R15
  3545	ADDQ   AX, R14
  3546	ADCQ   DX, R15
  3547	MOVQ   8(BP), AX
  3548	MOVQ   AX, R8
  3549	MULQ   R10
  3550	ADDQ   AX, R14
  3551	ADCQ   $0x00, DX
  3552	MOVQ   DX, R10
  3553	MOVQ   8(BP), AX
  3554	MULQ   R11
  3555	ADDQ   AX, R15
  3556	ADCQ   $0x00, DX
  3557	IMULQ  R12, R8
  3558	ADDQ   R10, R15
  3559	ADCQ   DX, R8
  3560	MOVQ   R13, R10
  3561	MOVQ   R14, R11
  3562	MOVQ   R15, R12
  3563	ANDQ   $0x03, R12
  3564	MOVQ   R15, R13
  3565	ANDQ   $-4, R13
  3566	MOVQ   R8, R14
  3567	SHRQ   $0x02, R8, R15
  3568	SHRQ   $0x02, R8
  3569	ADDQ   R13, R10
  3570	ADCQ   R14, R11
  3571	ADCQ   $0x00, R12
  3572	ADDQ   R15, R10
  3573	ADCQ   R8, R11
  3574	ADCQ   $0x00, R12
  3575	ADDQ   BX, DI
  3576
  3577sealSSEFinalize:
  3578	// Hash in the buffer lengths
  3579	ADDQ  ad_len+80(FP), R10
  3580	ADCQ  src_len+56(FP), R11
  3581	ADCQ  $0x01, R12
  3582	MOVQ  (BP), AX
  3583	MOVQ  AX, R15
  3584	MULQ  R10
  3585	MOVQ  AX, R13
  3586	MOVQ  DX, R14
  3587	MOVQ  (BP), AX
  3588	MULQ  R11
  3589	IMULQ R12, R15
  3590	ADDQ  AX, R14
  3591	ADCQ  DX, R15
  3592	MOVQ  8(BP), AX
  3593	MOVQ  AX, R8
  3594	MULQ  R10
  3595	ADDQ  AX, R14
  3596	ADCQ  $0x00, DX
  3597	MOVQ  DX, R10
  3598	MOVQ  8(BP), AX
  3599	MULQ  R11
  3600	ADDQ  AX, R15
  3601	ADCQ  $0x00, DX
  3602	IMULQ R12, R8
  3603	ADDQ  R10, R15
  3604	ADCQ  DX, R8
  3605	MOVQ  R13, R10
  3606	MOVQ  R14, R11
  3607	MOVQ  R15, R12
  3608	ANDQ  $0x03, R12
  3609	MOVQ  R15, R13
  3610	ANDQ  $-4, R13
  3611	MOVQ  R8, R14
  3612	SHRQ  $0x02, R8, R15
  3613	SHRQ  $0x02, R8
  3614	ADDQ  R13, R10
  3615	ADCQ  R14, R11
  3616	ADCQ  $0x00, R12
  3617	ADDQ  R15, R10
  3618	ADCQ  R8, R11
  3619	ADCQ  $0x00, R12
  3620
  3621	// Final reduce
  3622	MOVQ    R10, R13
  3623	MOVQ    R11, R14
  3624	MOVQ    R12, R15
  3625	SUBQ    $-5, R10
  3626	SBBQ    $-1, R11
  3627	SBBQ    $0x03, R12
  3628	CMOVQCS R13, R10
  3629	CMOVQCS R14, R11
  3630	CMOVQCS R15, R12
  3631
  3632	// Add in the "s" part of the key
  3633	ADDQ 16(BP), R10
  3634	ADCQ 24(BP), R11
  3635
  3636	// Finally store the tag at the end of the message
  3637	MOVQ R10, (DI)
  3638	MOVQ R11, 8(DI)
  3639	RET
  3640
  3641seal192AVX2:
  3642	VMOVDQA Y0, Y5
  3643	VMOVDQA Y14, Y9
  3644	VMOVDQA Y12, Y13
  3645	VPADDD  ·avx2IncMask<>+0(SB), Y4, Y1
  3646	VMOVDQA Y0, Y6
  3647	VMOVDQA Y14, Y10
  3648	VMOVDQA Y12, Y8
  3649	VMOVDQA Y4, Y2
  3650	VMOVDQA Y1, Y15
  3651	MOVQ    $0x0000000a, R9
  3652
  3653sealAVX2192InnerCipherLoop:
  3654	VPADDD     Y14, Y0, Y0
  3655	VPXOR      Y0, Y4, Y4
  3656	VPSHUFB    ·rol16<>+0(SB), Y4, Y4
  3657	VPADDD     Y4, Y12, Y12
  3658	VPXOR      Y12, Y14, Y14
  3659	VPSLLD     $0x0c, Y14, Y3
  3660	VPSRLD     $0x14, Y14, Y14
  3661	VPXOR      Y3, Y14, Y14
  3662	VPADDD     Y14, Y0, Y0
  3663	VPXOR      Y0, Y4, Y4
  3664	VPSHUFB    ·rol8<>+0(SB), Y4, Y4
  3665	VPADDD     Y4, Y12, Y12
  3666	VPXOR      Y12, Y14, Y14
  3667	VPSLLD     $0x07, Y14, Y3
  3668	VPSRLD     $0x19, Y14, Y14
  3669	VPXOR      Y3, Y14, Y14
  3670	VPADDD     Y9, Y5, Y5
  3671	VPXOR      Y5, Y1, Y1
  3672	VPSHUFB    ·rol16<>+0(SB), Y1, Y1
  3673	VPADDD     Y1, Y13, Y13
  3674	VPXOR      Y13, Y9, Y9
  3675	VPSLLD     $0x0c, Y9, Y3
  3676	VPSRLD     $0x14, Y9, Y9
  3677	VPXOR      Y3, Y9, Y9
  3678	VPADDD     Y9, Y5, Y5
  3679	VPXOR      Y5, Y1, Y1
  3680	VPSHUFB    ·rol8<>+0(SB), Y1, Y1
  3681	VPADDD     Y1, Y13, Y13
  3682	VPXOR      Y13, Y9, Y9
  3683	VPSLLD     $0x07, Y9, Y3
  3684	VPSRLD     $0x19, Y9, Y9
  3685	VPXOR      Y3, Y9, Y9
  3686	VPALIGNR   $0x04, Y14, Y14, Y14
  3687	VPALIGNR   $0x04, Y9, Y9, Y9
  3688	VPALIGNR   $0x08, Y12, Y12, Y12
  3689	VPALIGNR   $0x08, Y13, Y13, Y13
  3690	VPALIGNR   $0x0c, Y4, Y4, Y4
  3691	VPALIGNR   $0x0c, Y1, Y1, Y1
  3692	VPADDD     Y14, Y0, Y0
  3693	VPXOR      Y0, Y4, Y4
  3694	VPSHUFB    ·rol16<>+0(SB), Y4, Y4
  3695	VPADDD     Y4, Y12, Y12
  3696	VPXOR      Y12, Y14, Y14
  3697	VPSLLD     $0x0c, Y14, Y3
  3698	VPSRLD     $0x14, Y14, Y14
  3699	VPXOR      Y3, Y14, Y14
  3700	VPADDD     Y14, Y0, Y0
  3701	VPXOR      Y0, Y4, Y4
  3702	VPSHUFB    ·rol8<>+0(SB), Y4, Y4
  3703	VPADDD     Y4, Y12, Y12
  3704	VPXOR      Y12, Y14, Y14
  3705	VPSLLD     $0x07, Y14, Y3
  3706	VPSRLD     $0x19, Y14, Y14
  3707	VPXOR      Y3, Y14, Y14
  3708	VPADDD     Y9, Y5, Y5
  3709	VPXOR      Y5, Y1, Y1
  3710	VPSHUFB    ·rol16<>+0(SB), Y1, Y1
  3711	VPADDD     Y1, Y13, Y13
  3712	VPXOR      Y13, Y9, Y9
  3713	VPSLLD     $0x0c, Y9, Y3
  3714	VPSRLD     $0x14, Y9, Y9
  3715	VPXOR      Y3, Y9, Y9
  3716	VPADDD     Y9, Y5, Y5
  3717	VPXOR      Y5, Y1, Y1
  3718	VPSHUFB    ·rol8<>+0(SB), Y1, Y1
  3719	VPADDD     Y1, Y13, Y13
  3720	VPXOR      Y13, Y9, Y9
  3721	VPSLLD     $0x07, Y9, Y3
  3722	VPSRLD     $0x19, Y9, Y9
  3723	VPXOR      Y3, Y9, Y9
  3724	VPALIGNR   $0x0c, Y14, Y14, Y14
  3725	VPALIGNR   $0x0c, Y9, Y9, Y9
  3726	VPALIGNR   $0x08, Y12, Y12, Y12
  3727	VPALIGNR   $0x08, Y13, Y13, Y13
  3728	VPALIGNR   $0x04, Y4, Y4, Y4
  3729	VPALIGNR   $0x04, Y1, Y1, Y1
  3730	DECQ       R9
  3731	JNE        sealAVX2192InnerCipherLoop
  3732	VPADDD     Y6, Y0, Y0
  3733	VPADDD     Y6, Y5, Y5
  3734	VPADDD     Y10, Y14, Y14
  3735	VPADDD     Y10, Y9, Y9
  3736	VPADDD     Y8, Y12, Y12
  3737	VPADDD     Y8, Y13, Y13
  3738	VPADDD     Y2, Y4, Y4
  3739	VPADDD     Y15, Y1, Y1
  3740	VPERM2I128 $0x02, Y0, Y14, Y3
  3741
  3742	// Clamp and store poly key
  3743	VPAND   ·polyClampMask<>+0(SB), Y3, Y3
  3744	VMOVDQA Y3, (BP)
  3745
  3746	// Stream for up to 192 bytes
  3747	VPERM2I128 $0x13, Y0, Y14, Y0
  3748	VPERM2I128 $0x13, Y12, Y4, Y14
  3749	VPERM2I128 $0x02, Y5, Y9, Y12
  3750	VPERM2I128 $0x02, Y13, Y1, Y4
  3751	VPERM2I128 $0x13, Y5, Y9, Y5
  3752	VPERM2I128 $0x13, Y13, Y1, Y9
  3753
  3754sealAVX2ShortSeal:
  3755	// Hash aad
  3756	MOVQ ad_len+80(FP), R9
  3757	CALL polyHashADInternal<>(SB)
  3758	XORQ CX, CX
  3759
  3760sealAVX2SealHash:
  3761	// itr1 holds the number of bytes encrypted but not yet hashed
  3762	CMPQ  CX, $0x10
  3763	JB    sealAVX2ShortSealLoop
  3764	ADDQ  (DI), R10
  3765	ADCQ  8(DI), R11
  3766	ADCQ  $0x01, R12
  3767	MOVQ  (BP), AX
  3768	MOVQ  AX, R15
  3769	MULQ  R10
  3770	MOVQ  AX, R13
  3771	MOVQ  DX, R14
  3772	MOVQ  (BP), AX
  3773	MULQ  R11
  3774	IMULQ R12, R15
  3775	ADDQ  AX, R14
  3776	ADCQ  DX, R15
  3777	MOVQ  8(BP), AX
  3778	MOVQ  AX, R8
  3779	MULQ  R10
  3780	ADDQ  AX, R14
  3781	ADCQ  $0x00, DX
  3782	MOVQ  DX, R10
  3783	MOVQ  8(BP), AX
  3784	MULQ  R11
  3785	ADDQ  AX, R15
  3786	ADCQ  $0x00, DX
  3787	IMULQ R12, R8
  3788	ADDQ  R10, R15
  3789	ADCQ  DX, R8
  3790	MOVQ  R13, R10
  3791	MOVQ  R14, R11
  3792	MOVQ  R15, R12
  3793	ANDQ  $0x03, R12
  3794	MOVQ  R15, R13
  3795	ANDQ  $-4, R13
  3796	MOVQ  R8, R14
  3797	SHRQ  $0x02, R8, R15
  3798	SHRQ  $0x02, R8
  3799	ADDQ  R13, R10
  3800	ADCQ  R14, R11
  3801	ADCQ  $0x00, R12
  3802	ADDQ  R15, R10
  3803	ADCQ  R8, R11
  3804	ADCQ  $0x00, R12
  3805	SUBQ  $0x10, CX
  3806	ADDQ  $0x10, DI
  3807	JMP   sealAVX2SealHash
  3808
  3809sealAVX2ShortSealLoop:
  3810	CMPQ BX, $0x20
  3811	JB   sealAVX2ShortTail32
  3812	SUBQ $0x20, BX
  3813
  3814	// Load for encryption
  3815	VPXOR   (SI), Y0, Y0
  3816	VMOVDQU Y0, (DI)
  3817	LEAQ    32(SI), SI
  3818
  3819	// Now can hash
  3820	ADDQ  (DI), R10
  3821	ADCQ  8(DI), R11
  3822	ADCQ  $0x01, R12
  3823	MOVQ  (BP), DX
  3824	MOVQ  DX, R15
  3825	MULXQ R10, R13, R14
  3826	IMULQ R12, R15
  3827	MULXQ R11, AX, DX
  3828	ADDQ  AX, R14
  3829	ADCQ  DX, R15
  3830	MOVQ  8(BP), DX
  3831	MULXQ R10, R10, AX
  3832	ADDQ  R10, R14
  3833	MULXQ R11, R11, R8
  3834	ADCQ  R11, R15
  3835	ADCQ  $0x00, R8
  3836	IMULQ R12, DX
  3837	ADDQ  AX, R15
  3838	ADCQ  DX, R8
  3839	MOVQ  R13, R10
  3840	MOVQ  R14, R11
  3841	MOVQ  R15, R12
  3842	ANDQ  $0x03, R12
  3843	MOVQ  R15, R13
  3844	ANDQ  $-4, R13
  3845	MOVQ  R8, R14
  3846	SHRQ  $0x02, R8, R15
  3847	SHRQ  $0x02, R8
  3848	ADDQ  R13, R10
  3849	ADCQ  R14, R11
  3850	ADCQ  $0x00, R12
  3851	ADDQ  R15, R10
  3852	ADCQ  R8, R11
  3853	ADCQ  $0x00, R12
  3854	ADDQ  16(DI), R10
  3855	ADCQ  24(DI), R11
  3856	ADCQ  $0x01, R12
  3857	MOVQ  (BP), DX
  3858	MOVQ  DX, R15
  3859	MULXQ R10, R13, R14
  3860	IMULQ R12, R15
  3861	MULXQ R11, AX, DX
  3862	ADDQ  AX, R14
  3863	ADCQ  DX, R15
  3864	MOVQ  8(BP), DX
  3865	MULXQ R10, R10, AX
  3866	ADDQ  R10, R14
  3867	MULXQ R11, R11, R8
  3868	ADCQ  R11, R15
  3869	ADCQ  $0x00, R8
  3870	IMULQ R12, DX
  3871	ADDQ  AX, R15
  3872	ADCQ  DX, R8
  3873	MOVQ  R13, R10
  3874	MOVQ  R14, R11
  3875	MOVQ  R15, R12
  3876	ANDQ  $0x03, R12
  3877	MOVQ  R15, R13
  3878	ANDQ  $-4, R13
  3879	MOVQ  R8, R14
  3880	SHRQ  $0x02, R8, R15
  3881	SHRQ  $0x02, R8
  3882	ADDQ  R13, R10
  3883	ADCQ  R14, R11
  3884	ADCQ  $0x00, R12
  3885	ADDQ  R15, R10
  3886	ADCQ  R8, R11
  3887	ADCQ  $0x00, R12
  3888	LEAQ  32(DI), DI
  3889
  3890	// Shift stream left
  3891	VMOVDQA Y14, Y0
  3892	VMOVDQA Y12, Y14
  3893	VMOVDQA Y4, Y12
  3894	VMOVDQA Y5, Y4
  3895	VMOVDQA Y9, Y5
  3896	VMOVDQA Y13, Y9
  3897	VMOVDQA Y1, Y13
  3898	VMOVDQA Y6, Y1
  3899	VMOVDQA Y10, Y6
  3900	JMP     sealAVX2ShortSealLoop
  3901
  3902sealAVX2ShortTail32:
  3903	CMPQ    BX, $0x10
  3904	VMOVDQA X0, X1
  3905	JB      sealAVX2ShortDone
  3906	SUBQ    $0x10, BX
  3907
  3908	// Load for encryption
  3909	VPXOR   (SI), X0, X12
  3910	VMOVDQU X12, (DI)
  3911	LEAQ    16(SI), SI
  3912
  3913	// Hash
  3914	ADDQ       (DI), R10
  3915	ADCQ       8(DI), R11
  3916	ADCQ       $0x01, R12
  3917	MOVQ       (BP), DX
  3918	MOVQ       DX, R15
  3919	MULXQ      R10, R13, R14
  3920	IMULQ      R12, R15
  3921	MULXQ      R11, AX, DX
  3922	ADDQ       AX, R14
  3923	ADCQ       DX, R15
  3924	MOVQ       8(BP), DX
  3925	MULXQ      R10, R10, AX
  3926	ADDQ       R10, R14
  3927	MULXQ      R11, R11, R8
  3928	ADCQ       R11, R15
  3929	ADCQ       $0x00, R8
  3930	IMULQ      R12, DX
  3931	ADDQ       AX, R15
  3932	ADCQ       DX, R8
  3933	MOVQ       R13, R10
  3934	MOVQ       R14, R11
  3935	MOVQ       R15, R12
  3936	ANDQ       $0x03, R12
  3937	MOVQ       R15, R13
  3938	ANDQ       $-4, R13
  3939	MOVQ       R8, R14
  3940	SHRQ       $0x02, R8, R15
  3941	SHRQ       $0x02, R8
  3942	ADDQ       R13, R10
  3943	ADCQ       R14, R11
  3944	ADCQ       $0x00, R12
  3945	ADDQ       R15, R10
  3946	ADCQ       R8, R11
  3947	ADCQ       $0x00, R12
  3948	LEAQ       16(DI), DI
  3949	VPERM2I128 $0x11, Y0, Y0, Y0
  3950	VMOVDQA    X0, X1
  3951
  3952sealAVX2ShortDone:
  3953	VZEROUPPER
  3954	JMP sealSSETail
  3955
  3956seal320AVX2:
  3957	VMOVDQA Y0, Y5
  3958	VMOVDQA Y14, Y9
  3959	VMOVDQA Y12, Y13
  3960	VPADDD  ·avx2IncMask<>+0(SB), Y4, Y1
  3961	VMOVDQA Y0, Y6
  3962	VMOVDQA Y14, Y10
  3963	VMOVDQA Y12, Y8
  3964	VPADDD  ·avx2IncMask<>+0(SB), Y1, Y2
  3965	VMOVDQA Y14, Y7
  3966	VMOVDQA Y12, Y11
  3967	VMOVDQA Y4, Y15
  3968	MOVQ    $0x0000000a, R9
  3969
  3970sealAVX2320InnerCipherLoop:
  3971	VPADDD   Y14, Y0, Y0
  3972	VPXOR    Y0, Y4, Y4
  3973	VPSHUFB  ·rol16<>+0(SB), Y4, Y4
  3974	VPADDD   Y4, Y12, Y12
  3975	VPXOR    Y12, Y14, Y14
  3976	VPSLLD   $0x0c, Y14, Y3
  3977	VPSRLD   $0x14, Y14, Y14
  3978	VPXOR    Y3, Y14, Y14
  3979	VPADDD   Y14, Y0, Y0
  3980	VPXOR    Y0, Y4, Y4
  3981	VPSHUFB  ·rol8<>+0(SB), Y4, Y4
  3982	VPADDD   Y4, Y12, Y12
  3983	VPXOR    Y12, Y14, Y14
  3984	VPSLLD   $0x07, Y14, Y3
  3985	VPSRLD   $0x19, Y14, Y14
  3986	VPXOR    Y3, Y14, Y14
  3987	VPADDD   Y9, Y5, Y5
  3988	VPXOR    Y5, Y1, Y1
  3989	VPSHUFB  ·rol16<>+0(SB), Y1, Y1
  3990	VPADDD   Y1, Y13, Y13
  3991	VPXOR    Y13, Y9, Y9
  3992	VPSLLD   $0x0c, Y9, Y3
  3993	VPSRLD   $0x14, Y9, Y9
  3994	VPXOR    Y3, Y9, Y9
  3995	VPADDD   Y9, Y5, Y5
  3996	VPXOR    Y5, Y1, Y1
  3997	VPSHUFB  ·rol8<>+0(SB), Y1, Y1
  3998	VPADDD   Y1, Y13, Y13
  3999	VPXOR    Y13, Y9, Y9
  4000	VPSLLD   $0x07, Y9, Y3
  4001	VPSRLD   $0x19, Y9, Y9
  4002	VPXOR    Y3, Y9, Y9
  4003	VPADDD   Y10, Y6, Y6
  4004	VPXOR    Y6, Y2, Y2
  4005	VPSHUFB  ·rol16<>+0(SB), Y2, Y2
  4006	VPADDD   Y2, Y8, Y8
  4007	VPXOR    Y8, Y10, Y10
  4008	VPSLLD   $0x0c, Y10, Y3
  4009	VPSRLD   $0x14, Y10, Y10
  4010	VPXOR    Y3, Y10, Y10
  4011	VPADDD   Y10, Y6, Y6
  4012	VPXOR    Y6, Y2, Y2
  4013	VPSHUFB  ·rol8<>+0(SB), Y2, Y2
  4014	VPADDD   Y2, Y8, Y8
  4015	VPXOR    Y8, Y10, Y10
  4016	VPSLLD   $0x07, Y10, Y3
  4017	VPSRLD   $0x19, Y10, Y10
  4018	VPXOR    Y3, Y10, Y10
  4019	VPALIGNR $0x04, Y14, Y14, Y14
  4020	VPALIGNR $0x04, Y9, Y9, Y9
  4021	VPALIGNR $0x04, Y10, Y10, Y10
  4022	VPALIGNR $0x08, Y12, Y12, Y12
  4023	VPALIGNR $0x08, Y13, Y13, Y13
  4024	VPALIGNR $0x08, Y8, Y8, Y8
  4025	VPALIGNR $0x0c, Y4, Y4, Y4
  4026	VPALIGNR $0x0c, Y1, Y1, Y1
  4027	VPALIGNR $0x0c, Y2, Y2, Y2
  4028	VPADDD   Y14, Y0, Y0
  4029	VPXOR    Y0, Y4, Y4
  4030	VPSHUFB  ·rol16<>+0(SB), Y4, Y4
  4031	VPADDD   Y4, Y12, Y12
  4032	VPXOR    Y12, Y14, Y14
  4033	VPSLLD   $0x0c, Y14, Y3
  4034	VPSRLD   $0x14, Y14, Y14
  4035	VPXOR    Y3, Y14, Y14
  4036	VPADDD   Y14, Y0, Y0
  4037	VPXOR    Y0, Y4, Y4
  4038	VPSHUFB  ·rol8<>+0(SB), Y4, Y4
  4039	VPADDD   Y4, Y12, Y12
  4040	VPXOR    Y12, Y14, Y14
  4041	VPSLLD   $0x07, Y14, Y3
  4042	VPSRLD   $0x19, Y14, Y14
  4043	VPXOR    Y3, Y14, Y14
  4044	VPADDD   Y9, Y5, Y5
  4045	VPXOR    Y5, Y1, Y1
  4046	VPSHUFB  ·rol16<>+0(SB), Y1, Y1
  4047	VPADDD   Y1, Y13, Y13
  4048	VPXOR    Y13, Y9, Y9
  4049	VPSLLD   $0x0c, Y9, Y3
  4050	VPSRLD   $0x14, Y9, Y9
  4051	VPXOR    Y3, Y9, Y9
  4052	VPADDD   Y9, Y5, Y5
  4053	VPXOR    Y5, Y1, Y1
  4054	VPSHUFB  ·rol8<>+0(SB), Y1, Y1
  4055	VPADDD   Y1, Y13, Y13
  4056	VPXOR    Y13, Y9, Y9
  4057	VPSLLD   $0x07, Y9, Y3
  4058	VPSRLD   $0x19, Y9, Y9
  4059	VPXOR    Y3, Y9, Y9
  4060	VPADDD   Y10, Y6, Y6
  4061	VPXOR    Y6, Y2, Y2
  4062	VPSHUFB  ·rol16<>+0(SB), Y2, Y2
  4063	VPADDD   Y2, Y8, Y8
  4064	VPXOR    Y8, Y10, Y10
  4065	VPSLLD   $0x0c, Y10, Y3
  4066	VPSRLD   $0x14, Y10, Y10
  4067	VPXOR    Y3, Y10, Y10
  4068	VPADDD   Y10, Y6, Y6
  4069	VPXOR    Y6, Y2, Y2
  4070	VPSHUFB  ·rol8<>+0(SB), Y2, Y2
  4071	VPADDD   Y2, Y8, Y8
  4072	VPXOR    Y8, Y10, Y10
  4073	VPSLLD   $0x07, Y10, Y3
  4074	VPSRLD   $0x19, Y10, Y10
  4075	VPXOR    Y3, Y10, Y10
  4076	VPALIGNR $0x0c, Y14, Y14, Y14
  4077	VPALIGNR $0x0c, Y9, Y9, Y9
  4078	VPALIGNR $0x0c, Y10, Y10, Y10
  4079	VPALIGNR $0x08, Y12, Y12, Y12
  4080	VPALIGNR $0x08, Y13, Y13, Y13
  4081	VPALIGNR $0x08, Y8, Y8, Y8
  4082	VPALIGNR $0x04, Y4, Y4, Y4
  4083	VPALIGNR $0x04, Y1, Y1, Y1
  4084	VPALIGNR $0x04, Y2, Y2, Y2
  4085	DECQ     R9
  4086	JNE      sealAVX2320InnerCipherLoop
  4087	VMOVDQA  ·chacha20Constants<>+0(SB), Y3
  4088	VPADDD   Y3, Y0, Y0
  4089	VPADDD   Y3, Y5, Y5
  4090	VPADDD   Y3, Y6, Y6
  4091	VPADDD   Y7, Y14, Y14
  4092	VPADDD   Y7, Y9, Y9
  4093	VPADDD   Y7, Y10, Y10
  4094	VPADDD   Y11, Y12, Y12
  4095	VPADDD   Y11, Y13, Y13
  4096	VPADDD   Y11, Y8, Y8
  4097	VMOVDQA  ·avx2IncMask<>+0(SB), Y3
  4098	VPADDD   Y15, Y4, Y4
  4099	VPADDD   Y3, Y15, Y15
  4100	VPADDD   Y15, Y1, Y1
  4101	VPADDD   Y3, Y15, Y15
  4102	VPADDD   Y15, Y2, Y2
  4103
  4104	// Clamp and store poly key
  4105	VPERM2I128 $0x02, Y0, Y14, Y3
  4106	VPAND      ·polyClampMask<>+0(SB), Y3, Y3
  4107	VMOVDQA    Y3, (BP)
  4108
  4109	// Stream for up to 320 bytes
  4110	VPERM2I128 $0x13, Y0, Y14, Y0
  4111	VPERM2I128 $0x13, Y12, Y4, Y14
  4112	VPERM2I128 $0x02, Y5, Y9, Y12
  4113	VPERM2I128 $0x02, Y13, Y1, Y4
  4114	VPERM2I128 $0x13, Y5, Y9, Y5
  4115	VPERM2I128 $0x13, Y13, Y1, Y9
  4116	VPERM2I128 $0x02, Y6, Y10, Y13
  4117	VPERM2I128 $0x02, Y8, Y2, Y1
  4118	VPERM2I128 $0x13, Y6, Y10, Y6
  4119	VPERM2I128 $0x13, Y8, Y2, Y10
  4120	JMP        sealAVX2ShortSeal
  4121
  4122sealAVX2Tail128:
  4123	VMOVDQA ·chacha20Constants<>+0(SB), Y0
  4124	VMOVDQA 32(BP), Y14
  4125	VMOVDQA 64(BP), Y12
  4126	VMOVDQA 192(BP), Y4
  4127	VPADDD  ·avx2IncMask<>+0(SB), Y4, Y4
  4128	VMOVDQA Y4, Y1
  4129
  4130sealAVX2Tail128LoopA:
  4131	ADDQ  (DI), R10
  4132	ADCQ  8(DI), R11
  4133	ADCQ  $0x01, R12
  4134	MOVQ  (BP), AX
  4135	MOVQ  AX, R15
  4136	MULQ  R10
  4137	MOVQ  AX, R13
  4138	MOVQ  DX, R14
  4139	MOVQ  (BP), AX
  4140	MULQ  R11
  4141	IMULQ R12, R15
  4142	ADDQ  AX, R14
  4143	ADCQ  DX, R15
  4144	MOVQ  8(BP), AX
  4145	MOVQ  AX, R8
  4146	MULQ  R10
  4147	ADDQ  AX, R14
  4148	ADCQ  $0x00, DX
  4149	MOVQ  DX, R10
  4150	MOVQ  8(BP), AX
  4151	MULQ  R11
  4152	ADDQ  AX, R15
  4153	ADCQ  $0x00, DX
  4154	IMULQ R12, R8
  4155	ADDQ  R10, R15
  4156	ADCQ  DX, R8
  4157	MOVQ  R13, R10
  4158	MOVQ  R14, R11
  4159	MOVQ  R15, R12
  4160	ANDQ  $0x03, R12
  4161	MOVQ  R15, R13
  4162	ANDQ  $-4, R13
  4163	MOVQ  R8, R14
  4164	SHRQ  $0x02, R8, R15
  4165	SHRQ  $0x02, R8
  4166	ADDQ  R13, R10
  4167	ADCQ  R14, R11
  4168	ADCQ  $0x00, R12
  4169	ADDQ  R15, R10
  4170	ADCQ  R8, R11
  4171	ADCQ  $0x00, R12
  4172	LEAQ  16(DI), DI
  4173
  4174sealAVX2Tail128LoopB:
  4175	VPADDD     Y14, Y0, Y0
  4176	VPXOR      Y0, Y4, Y4
  4177	VPSHUFB    ·rol16<>+0(SB), Y4, Y4
  4178	VPADDD     Y4, Y12, Y12
  4179	VPXOR      Y12, Y14, Y14
  4180	VPSLLD     $0x0c, Y14, Y3
  4181	VPSRLD     $0x14, Y14, Y14
  4182	VPXOR      Y3, Y14, Y14
  4183	VPADDD     Y14, Y0, Y0
  4184	VPXOR      Y0, Y4, Y4
  4185	VPSHUFB    ·rol8<>+0(SB), Y4, Y4
  4186	VPADDD     Y4, Y12, Y12
  4187	VPXOR      Y12, Y14, Y14
  4188	VPSLLD     $0x07, Y14, Y3
  4189	VPSRLD     $0x19, Y14, Y14
  4190	VPXOR      Y3, Y14, Y14
  4191	ADDQ       (DI), R10
  4192	ADCQ       8(DI), R11
  4193	ADCQ       $0x01, R12
  4194	MOVQ       (BP), AX
  4195	MOVQ       AX, R15
  4196	MULQ       R10
  4197	MOVQ       AX, R13
  4198	MOVQ       DX, R14
  4199	MOVQ       (BP), AX
  4200	MULQ       R11
  4201	IMULQ      R12, R15
  4202	ADDQ       AX, R14
  4203	ADCQ       DX, R15
  4204	MOVQ       8(BP), AX
  4205	MOVQ       AX, R8
  4206	MULQ       R10
  4207	ADDQ       AX, R14
  4208	ADCQ       $0x00, DX
  4209	MOVQ       DX, R10
  4210	MOVQ       8(BP), AX
  4211	MULQ       R11
  4212	ADDQ       AX, R15
  4213	ADCQ       $0x00, DX
  4214	IMULQ      R12, R8
  4215	ADDQ       R10, R15
  4216	ADCQ       DX, R8
  4217	MOVQ       R13, R10
  4218	MOVQ       R14, R11
  4219	MOVQ       R15, R12
  4220	ANDQ       $0x03, R12
  4221	MOVQ       R15, R13
  4222	ANDQ       $-4, R13
  4223	MOVQ       R8, R14
  4224	SHRQ       $0x02, R8, R15
  4225	SHRQ       $0x02, R8
  4226	ADDQ       R13, R10
  4227	ADCQ       R14, R11
  4228	ADCQ       $0x00, R12
  4229	ADDQ       R15, R10
  4230	ADCQ       R8, R11
  4231	ADCQ       $0x00, R12
  4232	VPALIGNR   $0x04, Y14, Y14, Y14
  4233	VPALIGNR   $0x08, Y12, Y12, Y12
  4234	VPALIGNR   $0x0c, Y4, Y4, Y4
  4235	VPADDD     Y14, Y0, Y0
  4236	VPXOR      Y0, Y4, Y4
  4237	VPSHUFB    ·rol16<>+0(SB), Y4, Y4
  4238	VPADDD     Y4, Y12, Y12
  4239	VPXOR      Y12, Y14, Y14
  4240	VPSLLD     $0x0c, Y14, Y3
  4241	VPSRLD     $0x14, Y14, Y14
  4242	VPXOR      Y3, Y14, Y14
  4243	VPADDD     Y14, Y0, Y0
  4244	VPXOR      Y0, Y4, Y4
  4245	VPSHUFB    ·rol8<>+0(SB), Y4, Y4
  4246	VPADDD     Y4, Y12, Y12
  4247	VPXOR      Y12, Y14, Y14
  4248	VPSLLD     $0x07, Y14, Y3
  4249	VPSRLD     $0x19, Y14, Y14
  4250	VPXOR      Y3, Y14, Y14
  4251	ADDQ       16(DI), R10
  4252	ADCQ       24(DI), R11
  4253	ADCQ       $0x01, R12
  4254	MOVQ       (BP), AX
  4255	MOVQ       AX, R15
  4256	MULQ       R10
  4257	MOVQ       AX, R13
  4258	MOVQ       DX, R14
  4259	MOVQ       (BP), AX
  4260	MULQ       R11
  4261	IMULQ      R12, R15
  4262	ADDQ       AX, R14
  4263	ADCQ       DX, R15
  4264	MOVQ       8(BP), AX
  4265	MOVQ       AX, R8
  4266	MULQ       R10
  4267	ADDQ       AX, R14
  4268	ADCQ       $0x00, DX
  4269	MOVQ       DX, R10
  4270	MOVQ       8(BP), AX
  4271	MULQ       R11
  4272	ADDQ       AX, R15
  4273	ADCQ       $0x00, DX
  4274	IMULQ      R12, R8
  4275	ADDQ       R10, R15
  4276	ADCQ       DX, R8
  4277	MOVQ       R13, R10
  4278	MOVQ       R14, R11
  4279	MOVQ       R15, R12
  4280	ANDQ       $0x03, R12
  4281	MOVQ       R15, R13
  4282	ANDQ       $-4, R13
  4283	MOVQ       R8, R14
  4284	SHRQ       $0x02, R8, R15
  4285	SHRQ       $0x02, R8
  4286	ADDQ       R13, R10
  4287	ADCQ       R14, R11
  4288	ADCQ       $0x00, R12
  4289	ADDQ       R15, R10
  4290	ADCQ       R8, R11
  4291	ADCQ       $0x00, R12
  4292	LEAQ       32(DI), DI
  4293	VPALIGNR   $0x0c, Y14, Y14, Y14
  4294	VPALIGNR   $0x08, Y12, Y12, Y12
  4295	VPALIGNR   $0x04, Y4, Y4, Y4
  4296	DECQ       CX
  4297	JG         sealAVX2Tail128LoopA
  4298	DECQ       R9
  4299	JGE        sealAVX2Tail128LoopB
  4300	VPADDD     ·chacha20Constants<>+0(SB), Y0, Y5
  4301	VPADDD     32(BP), Y14, Y9
  4302	VPADDD     64(BP), Y12, Y13
  4303	VPADDD     Y1, Y4, Y1
  4304	VPERM2I128 $0x02, Y5, Y9, Y0
  4305	VPERM2I128 $0x02, Y13, Y1, Y14
  4306	VPERM2I128 $0x13, Y5, Y9, Y12
  4307	VPERM2I128 $0x13, Y13, Y1, Y4
  4308	JMP        sealAVX2ShortSealLoop
  4309
  4310sealAVX2Tail256:
  4311	VMOVDQA ·chacha20Constants<>+0(SB), Y0
  4312	VMOVDQA ·chacha20Constants<>+0(SB), Y5
  4313	VMOVDQA 32(BP), Y14
  4314	VMOVDQA 32(BP), Y9
  4315	VMOVDQA 64(BP), Y12
  4316	VMOVDQA 64(BP), Y13
  4317	VMOVDQA 192(BP), Y4
  4318	VPADDD  ·avx2IncMask<>+0(SB), Y4, Y4
  4319	VPADDD  ·avx2IncMask<>+0(SB), Y4, Y1
  4320	VMOVDQA Y4, Y7
  4321	VMOVDQA Y1, Y11
  4322
  4323sealAVX2Tail256LoopA:
  4324	ADDQ  (DI), R10
  4325	ADCQ  8(DI), R11
  4326	ADCQ  $0x01, R12
  4327	MOVQ  (BP), AX
  4328	MOVQ  AX, R15
  4329	MULQ  R10
  4330	MOVQ  AX, R13
  4331	MOVQ  DX, R14
  4332	MOVQ  (BP), AX
  4333	MULQ  R11
  4334	IMULQ R12, R15
  4335	ADDQ  AX, R14
  4336	ADCQ  DX, R15
  4337	MOVQ  8(BP), AX
  4338	MOVQ  AX, R8
  4339	MULQ  R10
  4340	ADDQ  AX, R14
  4341	ADCQ  $0x00, DX
  4342	MOVQ  DX, R10
  4343	MOVQ  8(BP), AX
  4344	MULQ  R11
  4345	ADDQ  AX, R15
  4346	ADCQ  $0x00, DX
  4347	IMULQ R12, R8
  4348	ADDQ  R10, R15
  4349	ADCQ  DX, R8
  4350	MOVQ  R13, R10
  4351	MOVQ  R14, R11
  4352	MOVQ  R15, R12
  4353	ANDQ  $0x03, R12
  4354	MOVQ  R15, R13
  4355	ANDQ  $-4, R13
  4356	MOVQ  R8, R14
  4357	SHRQ  $0x02, R8, R15
  4358	SHRQ  $0x02, R8
  4359	ADDQ  R13, R10
  4360	ADCQ  R14, R11
  4361	ADCQ  $0x00, R12
  4362	ADDQ  R15, R10
  4363	ADCQ  R8, R11
  4364	ADCQ  $0x00, R12
  4365	LEAQ  16(DI), DI
  4366
  4367sealAVX2Tail256LoopB:
  4368	VPADDD     Y14, Y0, Y0
  4369	VPXOR      Y0, Y4, Y4
  4370	VPSHUFB    ·rol16<>+0(SB), Y4, Y4
  4371	VPADDD     Y4, Y12, Y12
  4372	VPXOR      Y12, Y14, Y14
  4373	VPSLLD     $0x0c, Y14, Y3
  4374	VPSRLD     $0x14, Y14, Y14
  4375	VPXOR      Y3, Y14, Y14
  4376	VPADDD     Y14, Y0, Y0
  4377	VPXOR      Y0, Y4, Y4
  4378	VPSHUFB    ·rol8<>+0(SB), Y4, Y4
  4379	VPADDD     Y4, Y12, Y12
  4380	VPXOR      Y12, Y14, Y14
  4381	VPSLLD     $0x07, Y14, Y3
  4382	VPSRLD     $0x19, Y14, Y14
  4383	VPXOR      Y3, Y14, Y14
  4384	VPADDD     Y9, Y5, Y5
  4385	VPXOR      Y5, Y1, Y1
  4386	VPSHUFB    ·rol16<>+0(SB), Y1, Y1
  4387	VPADDD     Y1, Y13, Y13
  4388	VPXOR      Y13, Y9, Y9
  4389	VPSLLD     $0x0c, Y9, Y3
  4390	VPSRLD     $0x14, Y9, Y9
  4391	VPXOR      Y3, Y9, Y9
  4392	VPADDD     Y9, Y5, Y5
  4393	VPXOR      Y5, Y1, Y1
  4394	VPSHUFB    ·rol8<>+0(SB), Y1, Y1
  4395	VPADDD     Y1, Y13, Y13
  4396	VPXOR      Y13, Y9, Y9
  4397	VPSLLD     $0x07, Y9, Y3
  4398	VPSRLD     $0x19, Y9, Y9
  4399	VPXOR      Y3, Y9, Y9
  4400	ADDQ       (DI), R10
  4401	ADCQ       8(DI), R11
  4402	ADCQ       $0x01, R12
  4403	MOVQ       (BP), AX
  4404	MOVQ       AX, R15
  4405	MULQ       R10
  4406	MOVQ       AX, R13
  4407	MOVQ       DX, R14
  4408	MOVQ       (BP), AX
  4409	MULQ       R11
  4410	IMULQ      R12, R15
  4411	ADDQ       AX, R14
  4412	ADCQ       DX, R15
  4413	MOVQ       8(BP), AX
  4414	MOVQ       AX, R8
  4415	MULQ       R10
  4416	ADDQ       AX, R14
  4417	ADCQ       $0x00, DX
  4418	MOVQ       DX, R10
  4419	MOVQ       8(BP), AX
  4420	MULQ       R11
  4421	ADDQ       AX, R15
  4422	ADCQ       $0x00, DX
  4423	IMULQ      R12, R8
  4424	ADDQ       R10, R15
  4425	ADCQ       DX, R8
  4426	MOVQ       R13, R10
  4427	MOVQ       R14, R11
  4428	MOVQ       R15, R12
  4429	ANDQ       $0x03, R12
  4430	MOVQ       R15, R13
  4431	ANDQ       $-4, R13
  4432	MOVQ       R8, R14
  4433	SHRQ       $0x02, R8, R15
  4434	SHRQ       $0x02, R8
  4435	ADDQ       R13, R10
  4436	ADCQ       R14, R11
  4437	ADCQ       $0x00, R12
  4438	ADDQ       R15, R10
  4439	ADCQ       R8, R11
  4440	ADCQ       $0x00, R12
  4441	VPALIGNR   $0x04, Y14, Y14, Y14
  4442	VPALIGNR   $0x04, Y9, Y9, Y9
  4443	VPALIGNR   $0x08, Y12, Y12, Y12
  4444	VPALIGNR   $0x08, Y13, Y13, Y13
  4445	VPALIGNR   $0x0c, Y4, Y4, Y4
  4446	VPALIGNR   $0x0c, Y1, Y1, Y1
  4447	VPADDD     Y14, Y0, Y0
  4448	VPXOR      Y0, Y4, Y4
  4449	VPSHUFB    ·rol16<>+0(SB), Y4, Y4
  4450	VPADDD     Y4, Y12, Y12
  4451	VPXOR      Y12, Y14, Y14
  4452	VPSLLD     $0x0c, Y14, Y3
  4453	VPSRLD     $0x14, Y14, Y14
  4454	VPXOR      Y3, Y14, Y14
  4455	VPADDD     Y14, Y0, Y0
  4456	VPXOR      Y0, Y4, Y4
  4457	VPSHUFB    ·rol8<>+0(SB), Y4, Y4
  4458	VPADDD     Y4, Y12, Y12
  4459	VPXOR      Y12, Y14, Y14
  4460	VPSLLD     $0x07, Y14, Y3
  4461	VPSRLD     $0x19, Y14, Y14
  4462	VPXOR      Y3, Y14, Y14
  4463	VPADDD     Y9, Y5, Y5
  4464	VPXOR      Y5, Y1, Y1
  4465	VPSHUFB    ·rol16<>+0(SB), Y1, Y1
  4466	VPADDD     Y1, Y13, Y13
  4467	VPXOR      Y13, Y9, Y9
  4468	VPSLLD     $0x0c, Y9, Y3
  4469	VPSRLD     $0x14, Y9, Y9
  4470	VPXOR      Y3, Y9, Y9
  4471	VPADDD     Y9, Y5, Y5
  4472	VPXOR      Y5, Y1, Y1
  4473	VPSHUFB    ·rol8<>+0(SB), Y1, Y1
  4474	VPADDD     Y1, Y13, Y13
  4475	VPXOR      Y13, Y9, Y9
  4476	VPSLLD     $0x07, Y9, Y3
  4477	VPSRLD     $0x19, Y9, Y9
  4478	VPXOR      Y3, Y9, Y9
  4479	ADDQ       16(DI), R10
  4480	ADCQ       24(DI), R11
  4481	ADCQ       $0x01, R12
  4482	MOVQ       (BP), AX
  4483	MOVQ       AX, R15
  4484	MULQ       R10
  4485	MOVQ       AX, R13
  4486	MOVQ       DX, R14
  4487	MOVQ       (BP), AX
  4488	MULQ       R11
  4489	IMULQ      R12, R15
  4490	ADDQ       AX, R14
  4491	ADCQ       DX, R15
  4492	MOVQ       8(BP), AX
  4493	MOVQ       AX, R8
  4494	MULQ       R10
  4495	ADDQ       AX, R14
  4496	ADCQ       $0x00, DX
  4497	MOVQ       DX, R10
  4498	MOVQ       8(BP), AX
  4499	MULQ       R11
  4500	ADDQ       AX, R15
  4501	ADCQ       $0x00, DX
  4502	IMULQ      R12, R8
  4503	ADDQ       R10, R15
  4504	ADCQ       DX, R8
  4505	MOVQ       R13, R10
  4506	MOVQ       R14, R11
  4507	MOVQ       R15, R12
  4508	ANDQ       $0x03, R12
  4509	MOVQ       R15, R13
  4510	ANDQ       $-4, R13
  4511	MOVQ       R8, R14
  4512	SHRQ       $0x02, R8, R15
  4513	SHRQ       $0x02, R8
  4514	ADDQ       R13, R10
  4515	ADCQ       R14, R11
  4516	ADCQ       $0x00, R12
  4517	ADDQ       R15, R10
  4518	ADCQ       R8, R11
  4519	ADCQ       $0x00, R12
  4520	LEAQ       32(DI), DI
  4521	VPALIGNR   $0x0c, Y14, Y14, Y14
  4522	VPALIGNR   $0x0c, Y9, Y9, Y9
  4523	VPALIGNR   $0x08, Y12, Y12, Y12
  4524	VPALIGNR   $0x08, Y13, Y13, Y13
  4525	VPALIGNR   $0x04, Y4, Y4, Y4
  4526	VPALIGNR   $0x04, Y1, Y1, Y1
  4527	DECQ       CX
  4528	JG         sealAVX2Tail256LoopA
  4529	DECQ       R9
  4530	JGE        sealAVX2Tail256LoopB
  4531	VPADDD     ·chacha20Constants<>+0(SB), Y0, Y0
  4532	VPADDD     ·chacha20Constants<>+0(SB), Y5, Y5
  4533	VPADDD     32(BP), Y14, Y14
  4534	VPADDD     32(BP), Y9, Y9
  4535	VPADDD     64(BP), Y12, Y12
  4536	VPADDD     64(BP), Y13, Y13
  4537	VPADDD     Y7, Y4, Y4
  4538	VPADDD     Y11, Y1, Y1
  4539	VPERM2I128 $0x02, Y0, Y14, Y3
  4540	VPERM2I128 $0x02, Y12, Y4, Y7
  4541	VPERM2I128 $0x13, Y0, Y14, Y11
  4542	VPERM2I128 $0x13, Y12, Y4, Y15
  4543	VPXOR      (SI), Y3, Y3
  4544	VPXOR      32(SI), Y7, Y7
  4545	VPXOR      64(SI), Y11, Y11
  4546	VPXOR      96(SI), Y15, Y15
  4547	VMOVDQU    Y3, (DI)
  4548	VMOVDQU    Y7, 32(DI)
  4549	VMOVDQU    Y11, 64(DI)
  4550	VMOVDQU    Y15, 96(DI)
  4551	MOVQ       $0x00000080, CX
  4552	LEAQ       128(SI), SI
  4553	SUBQ       $0x80, BX
  4554	VPERM2I128 $0x02, Y5, Y9, Y0
  4555	VPERM2I128 $0x02, Y13, Y1, Y14
  4556	VPERM2I128 $0x13, Y5, Y9, Y12
  4557	VPERM2I128 $0x13, Y13, Y1, Y4
  4558	JMP        sealAVX2SealHash
  4559
  4560sealAVX2Tail384:
  4561	VMOVDQA ·chacha20Constants<>+0(SB), Y0
  4562	VMOVDQA Y0, Y5
  4563	VMOVDQA Y0, Y6
  4564	VMOVDQA 32(BP), Y14
  4565	VMOVDQA Y14, Y9
  4566	VMOVDQA Y14, Y10
  4567	VMOVDQA 64(BP), Y12
  4568	VMOVDQA Y12, Y13
  4569	VMOVDQA Y12, Y8
  4570	VMOVDQA 192(BP), Y4
  4571	VPADDD  ·avx2IncMask<>+0(SB), Y4, Y4
  4572	VPADDD  ·avx2IncMask<>+0(SB), Y4, Y1
  4573	VPADDD  ·avx2IncMask<>+0(SB), Y1, Y2
  4574	VMOVDQA Y4, Y7
  4575	VMOVDQA Y1, Y11
  4576	VMOVDQA Y2, Y15
  4577
  4578sealAVX2Tail384LoopA:
  4579	ADDQ  (DI), R10
  4580	ADCQ  8(DI), R11
  4581	ADCQ  $0x01, R12
  4582	MOVQ  (BP), AX
  4583	MOVQ  AX, R15
  4584	MULQ  R10
  4585	MOVQ  AX, R13
  4586	MOVQ  DX, R14
  4587	MOVQ  (BP), AX
  4588	MULQ  R11
  4589	IMULQ R12, R15
  4590	ADDQ  AX, R14
  4591	ADCQ  DX, R15
  4592	MOVQ  8(BP), AX
  4593	MOVQ  AX, R8
  4594	MULQ  R10
  4595	ADDQ  AX, R14
  4596	ADCQ  $0x00, DX
  4597	MOVQ  DX, R10
  4598	MOVQ  8(BP), AX
  4599	MULQ  R11
  4600	ADDQ  AX, R15
  4601	ADCQ  $0x00, DX
  4602	IMULQ R12, R8
  4603	ADDQ  R10, R15
  4604	ADCQ  DX, R8
  4605	MOVQ  R13, R10
  4606	MOVQ  R14, R11
  4607	MOVQ  R15, R12
  4608	ANDQ  $0x03, R12
  4609	MOVQ  R15, R13
  4610	ANDQ  $-4, R13
  4611	MOVQ  R8, R14
  4612	SHRQ  $0x02, R8, R15
  4613	SHRQ  $0x02, R8
  4614	ADDQ  R13, R10
  4615	ADCQ  R14, R11
  4616	ADCQ  $0x00, R12
  4617	ADDQ  R15, R10
  4618	ADCQ  R8, R11
  4619	ADCQ  $0x00, R12
  4620	LEAQ  16(DI), DI
  4621
  4622sealAVX2Tail384LoopB:
  4623	VPADDD     Y14, Y0, Y0
  4624	VPXOR      Y0, Y4, Y4
  4625	VPSHUFB    ·rol16<>+0(SB), Y4, Y4
  4626	VPADDD     Y4, Y12, Y12
  4627	VPXOR      Y12, Y14, Y14
  4628	VPSLLD     $0x0c, Y14, Y3
  4629	VPSRLD     $0x14, Y14, Y14
  4630	VPXOR      Y3, Y14, Y14
  4631	VPADDD     Y14, Y0, Y0
  4632	VPXOR      Y0, Y4, Y4
  4633	VPSHUFB    ·rol8<>+0(SB), Y4, Y4
  4634	VPADDD     Y4, Y12, Y12
  4635	VPXOR      Y12, Y14, Y14
  4636	VPSLLD     $0x07, Y14, Y3
  4637	VPSRLD     $0x19, Y14, Y14
  4638	VPXOR      Y3, Y14, Y14
  4639	VPADDD     Y9, Y5, Y5
  4640	VPXOR      Y5, Y1, Y1
  4641	VPSHUFB    ·rol16<>+0(SB), Y1, Y1
  4642	VPADDD     Y1, Y13, Y13
  4643	VPXOR      Y13, Y9, Y9
  4644	VPSLLD     $0x0c, Y9, Y3
  4645	VPSRLD     $0x14, Y9, Y9
  4646	VPXOR      Y3, Y9, Y9
  4647	VPADDD     Y9, Y5, Y5
  4648	VPXOR      Y5, Y1, Y1
  4649	VPSHUFB    ·rol8<>+0(SB), Y1, Y1
  4650	VPADDD     Y1, Y13, Y13
  4651	VPXOR      Y13, Y9, Y9
  4652	VPSLLD     $0x07, Y9, Y3
  4653	VPSRLD     $0x19, Y9, Y9
  4654	VPXOR      Y3, Y9, Y9
  4655	VPADDD     Y10, Y6, Y6
  4656	VPXOR      Y6, Y2, Y2
  4657	VPSHUFB    ·rol16<>+0(SB), Y2, Y2
  4658	VPADDD     Y2, Y8, Y8
  4659	VPXOR      Y8, Y10, Y10
  4660	VPSLLD     $0x0c, Y10, Y3
  4661	VPSRLD     $0x14, Y10, Y10
  4662	VPXOR      Y3, Y10, Y10
  4663	VPADDD     Y10, Y6, Y6
  4664	VPXOR      Y6, Y2, Y2
  4665	VPSHUFB    ·rol8<>+0(SB), Y2, Y2
  4666	VPADDD     Y2, Y8, Y8
  4667	VPXOR      Y8, Y10, Y10
  4668	VPSLLD     $0x07, Y10, Y3
  4669	VPSRLD     $0x19, Y10, Y10
  4670	VPXOR      Y3, Y10, Y10
  4671	ADDQ       (DI), R10
  4672	ADCQ       8(DI), R11
  4673	ADCQ       $0x01, R12
  4674	MOVQ       (BP), AX
  4675	MOVQ       AX, R15
  4676	MULQ       R10
  4677	MOVQ       AX, R13
  4678	MOVQ       DX, R14
  4679	MOVQ       (BP), AX
  4680	MULQ       R11
  4681	IMULQ      R12, R15
  4682	ADDQ       AX, R14
  4683	ADCQ       DX, R15
  4684	MOVQ       8(BP), AX
  4685	MOVQ       AX, R8
  4686	MULQ       R10
  4687	ADDQ       AX, R14
  4688	ADCQ       $0x00, DX
  4689	MOVQ       DX, R10
  4690	MOVQ       8(BP), AX
  4691	MULQ       R11
  4692	ADDQ       AX, R15
  4693	ADCQ       $0x00, DX
  4694	IMULQ      R12, R8
  4695	ADDQ       R10, R15
  4696	ADCQ       DX, R8
  4697	MOVQ       R13, R10
  4698	MOVQ       R14, R11
  4699	MOVQ       R15, R12
  4700	ANDQ       $0x03, R12
  4701	MOVQ       R15, R13
  4702	ANDQ       $-4, R13
  4703	MOVQ       R8, R14
  4704	SHRQ       $0x02, R8, R15
  4705	SHRQ       $0x02, R8
  4706	ADDQ       R13, R10
  4707	ADCQ       R14, R11
  4708	ADCQ       $0x00, R12
  4709	ADDQ       R15, R10
  4710	ADCQ       R8, R11
  4711	ADCQ       $0x00, R12
  4712	VPALIGNR   $0x04, Y14, Y14, Y14
  4713	VPALIGNR   $0x04, Y9, Y9, Y9
  4714	VPALIGNR   $0x04, Y10, Y10, Y10
  4715	VPALIGNR   $0x08, Y12, Y12, Y12
  4716	VPALIGNR   $0x08, Y13, Y13, Y13
  4717	VPALIGNR   $0x08, Y8, Y8, Y8
  4718	VPALIGNR   $0x0c, Y4, Y4, Y4
  4719	VPALIGNR   $0x0c, Y1, Y1, Y1
  4720	VPALIGNR   $0x0c, Y2, Y2, Y2
  4721	VPADDD     Y14, Y0, Y0
  4722	VPXOR      Y0, Y4, Y4
  4723	VPSHUFB    ·rol16<>+0(SB), Y4, Y4
  4724	VPADDD     Y4, Y12, Y12
  4725	VPXOR      Y12, Y14, Y14
  4726	VPSLLD     $0x0c, Y14, Y3
  4727	VPSRLD     $0x14, Y14, Y14
  4728	VPXOR      Y3, Y14, Y14
  4729	VPADDD     Y14, Y0, Y0
  4730	VPXOR      Y0, Y4, Y4
  4731	VPSHUFB    ·rol8<>+0(SB), Y4, Y4
  4732	VPADDD     Y4, Y12, Y12
  4733	VPXOR      Y12, Y14, Y14
  4734	VPSLLD     $0x07, Y14, Y3
  4735	VPSRLD     $0x19, Y14, Y14
  4736	VPXOR      Y3, Y14, Y14
  4737	VPADDD     Y9, Y5, Y5
  4738	VPXOR      Y5, Y1, Y1
  4739	VPSHUFB    ·rol16<>+0(SB), Y1, Y1
  4740	VPADDD     Y1, Y13, Y13
  4741	VPXOR      Y13, Y9, Y9
  4742	VPSLLD     $0x0c, Y9, Y3
  4743	VPSRLD     $0x14, Y9, Y9
  4744	VPXOR      Y3, Y9, Y9
  4745	VPADDD     Y9, Y5, Y5
  4746	VPXOR      Y5, Y1, Y1
  4747	VPSHUFB    ·rol8<>+0(SB), Y1, Y1
  4748	VPADDD     Y1, Y13, Y13
  4749	VPXOR      Y13, Y9, Y9
  4750	VPSLLD     $0x07, Y9, Y3
  4751	VPSRLD     $0x19, Y9, Y9
  4752	VPXOR      Y3, Y9, Y9
  4753	VPADDD     Y10, Y6, Y6
  4754	VPXOR      Y6, Y2, Y2
  4755	VPSHUFB    ·rol16<>+0(SB), Y2, Y2
  4756	VPADDD     Y2, Y8, Y8
  4757	VPXOR      Y8, Y10, Y10
  4758	VPSLLD     $0x0c, Y10, Y3
  4759	VPSRLD     $0x14, Y10, Y10
  4760	VPXOR      Y3, Y10, Y10
  4761	VPADDD     Y10, Y6, Y6
  4762	VPXOR      Y6, Y2, Y2
  4763	VPSHUFB    ·rol8<>+0(SB), Y2, Y2
  4764	VPADDD     Y2, Y8, Y8
  4765	VPXOR      Y8, Y10, Y10
  4766	VPSLLD     $0x07, Y10, Y3
  4767	VPSRLD     $0x19, Y10, Y10
  4768	VPXOR      Y3, Y10, Y10
  4769	ADDQ       16(DI), R10
  4770	ADCQ       24(DI), R11
  4771	ADCQ       $0x01, R12
  4772	MOVQ       (BP), AX
  4773	MOVQ       AX, R15
  4774	MULQ       R10
  4775	MOVQ       AX, R13
  4776	MOVQ       DX, R14
  4777	MOVQ       (BP), AX
  4778	MULQ       R11
  4779	IMULQ      R12, R15
  4780	ADDQ       AX, R14
  4781	ADCQ       DX, R15
  4782	MOVQ       8(BP), AX
  4783	MOVQ       AX, R8
  4784	MULQ       R10
  4785	ADDQ       AX, R14
  4786	ADCQ       $0x00, DX
  4787	MOVQ       DX, R10
  4788	MOVQ       8(BP), AX
  4789	MULQ       R11
  4790	ADDQ       AX, R15
  4791	ADCQ       $0x00, DX
  4792	IMULQ      R12, R8
  4793	ADDQ       R10, R15
  4794	ADCQ       DX, R8
  4795	MOVQ       R13, R10
  4796	MOVQ       R14, R11
  4797	MOVQ       R15, R12
  4798	ANDQ       $0x03, R12
  4799	MOVQ       R15, R13
  4800	ANDQ       $-4, R13
  4801	MOVQ       R8, R14
  4802	SHRQ       $0x02, R8, R15
  4803	SHRQ       $0x02, R8
  4804	ADDQ       R13, R10
  4805	ADCQ       R14, R11
  4806	ADCQ       $0x00, R12
  4807	ADDQ       R15, R10
  4808	ADCQ       R8, R11
  4809	ADCQ       $0x00, R12
  4810	LEAQ       32(DI), DI
  4811	VPALIGNR   $0x0c, Y14, Y14, Y14
  4812	VPALIGNR   $0x0c, Y9, Y9, Y9
  4813	VPALIGNR   $0x0c, Y10, Y10, Y10
  4814	VPALIGNR   $0x08, Y12, Y12, Y12
  4815	VPALIGNR   $0x08, Y13, Y13, Y13
  4816	VPALIGNR   $0x08, Y8, Y8, Y8
  4817	VPALIGNR   $0x04, Y4, Y4, Y4
  4818	VPALIGNR   $0x04, Y1, Y1, Y1
  4819	VPALIGNR   $0x04, Y2, Y2, Y2
  4820	DECQ       CX
  4821	JG         sealAVX2Tail384LoopA
  4822	DECQ       R9
  4823	JGE        sealAVX2Tail384LoopB
  4824	VPADDD     ·chacha20Constants<>+0(SB), Y0, Y0
  4825	VPADDD     ·chacha20Constants<>+0(SB), Y5, Y5
  4826	VPADDD     ·chacha20Constants<>+0(SB), Y6, Y6
  4827	VPADDD     32(BP), Y14, Y14
  4828	VPADDD     32(BP), Y9, Y9
  4829	VPADDD     32(BP), Y10, Y10
  4830	VPADDD     64(BP), Y12, Y12
  4831	VPADDD     64(BP), Y13, Y13
  4832	VPADDD     64(BP), Y8, Y8
  4833	VPADDD     Y7, Y4, Y4
  4834	VPADDD     Y11, Y1, Y1
  4835	VPADDD     Y15, Y2, Y2
  4836	VPERM2I128 $0x02, Y0, Y14, Y3
  4837	VPERM2I128 $0x02, Y12, Y4, Y7
  4838	VPERM2I128 $0x13, Y0, Y14, Y11
  4839	VPERM2I128 $0x13, Y12, Y4, Y15
  4840	VPXOR      (SI), Y3, Y3
  4841	VPXOR      32(SI), Y7, Y7
  4842	VPXOR      64(SI), Y11, Y11
  4843	VPXOR      96(SI), Y15, Y15
  4844	VMOVDQU    Y3, (DI)
  4845	VMOVDQU    Y7, 32(DI)
  4846	VMOVDQU    Y11, 64(DI)
  4847	VMOVDQU    Y15, 96(DI)
  4848	VPERM2I128 $0x02, Y5, Y9, Y3
  4849	VPERM2I128 $0x02, Y13, Y1, Y7
  4850	VPERM2I128 $0x13, Y5, Y9, Y11
  4851	VPERM2I128 $0x13, Y13, Y1, Y15
  4852	VPXOR      128(SI), Y3, Y3
  4853	VPXOR      160(SI), Y7, Y7
  4854	VPXOR      192(SI), Y11, Y11
  4855	VPXOR      224(SI), Y15, Y15
  4856	VMOVDQU    Y3, 128(DI)
  4857	VMOVDQU    Y7, 160(DI)
  4858	VMOVDQU    Y11, 192(DI)
  4859	VMOVDQU    Y15, 224(DI)
  4860	MOVQ       $0x00000100, CX
  4861	LEAQ       256(SI), SI
  4862	SUBQ       $0x00000100, BX
  4863	VPERM2I128 $0x02, Y6, Y10, Y0
  4864	VPERM2I128 $0x02, Y8, Y2, Y14
  4865	VPERM2I128 $0x13, Y6, Y10, Y12
  4866	VPERM2I128 $0x13, Y8, Y2, Y4
  4867	JMP        sealAVX2SealHash
  4868
  4869sealAVX2Tail512:
  4870	VMOVDQA ·chacha20Constants<>+0(SB), Y0
  4871	VMOVDQA Y0, Y5
  4872	VMOVDQA Y0, Y6
  4873	VMOVDQA Y0, Y7
  4874	VMOVDQA 32(BP), Y14
  4875	VMOVDQA Y14, Y9
  4876	VMOVDQA Y14, Y10
  4877	VMOVDQA Y14, Y11
  4878	VMOVDQA 64(BP), Y12
  4879	VMOVDQA Y12, Y13
  4880	VMOVDQA Y12, Y8
  4881	VMOVDQA Y12, Y15
  4882	VMOVDQA 192(BP), Y4
  4883	VPADDD  ·avx2IncMask<>+0(SB), Y4, Y4
  4884	VPADDD  ·avx2IncMask<>+0(SB), Y4, Y1
  4885	VPADDD  ·avx2IncMask<>+0(SB), Y1, Y2
  4886	VPADDD  ·avx2IncMask<>+0(SB), Y2, Y3
  4887	VMOVDQA Y4, 96(BP)
  4888	VMOVDQA Y1, 128(BP)
  4889	VMOVDQA Y2, 160(BP)
  4890	VMOVDQA Y3, 192(BP)
  4891
  4892sealAVX2Tail512LoopA:
  4893	ADDQ  (DI), R10
  4894	ADCQ  8(DI), R11
  4895	ADCQ  $0x01, R12
  4896	MOVQ  (BP), AX
  4897	MOVQ  AX, R15
  4898	MULQ  R10
  4899	MOVQ  AX, R13
  4900	MOVQ  DX, R14
  4901	MOVQ  (BP), AX
  4902	MULQ  R11
  4903	IMULQ R12, R15
  4904	ADDQ  AX, R14
  4905	ADCQ  DX, R15
  4906	MOVQ  8(BP), AX
  4907	MOVQ  AX, R8
  4908	MULQ  R10
  4909	ADDQ  AX, R14
  4910	ADCQ  $0x00, DX
  4911	MOVQ  DX, R10
  4912	MOVQ  8(BP), AX
  4913	MULQ  R11
  4914	ADDQ  AX, R15
  4915	ADCQ  $0x00, DX
  4916	IMULQ R12, R8
  4917	ADDQ  R10, R15
  4918	ADCQ  DX, R8
  4919	MOVQ  R13, R10
  4920	MOVQ  R14, R11
  4921	MOVQ  R15, R12
  4922	ANDQ  $0x03, R12
  4923	MOVQ  R15, R13
  4924	ANDQ  $-4, R13
  4925	MOVQ  R8, R14
  4926	SHRQ  $0x02, R8, R15
  4927	SHRQ  $0x02, R8
  4928	ADDQ  R13, R10
  4929	ADCQ  R14, R11
  4930	ADCQ  $0x00, R12
  4931	ADDQ  R15, R10
  4932	ADCQ  R8, R11
  4933	ADCQ  $0x00, R12
  4934	LEAQ  16(DI), DI
  4935
  4936sealAVX2Tail512LoopB:
  4937	VPADDD     Y14, Y0, Y0
  4938	VPADDD     Y9, Y5, Y5
  4939	VPADDD     Y10, Y6, Y6
  4940	VPADDD     Y11, Y7, Y7
  4941	VPXOR      Y0, Y4, Y4
  4942	VPXOR      Y5, Y1, Y1
  4943	VPXOR      Y6, Y2, Y2
  4944	VPXOR      Y7, Y3, Y3
  4945	VPSHUFB    ·rol16<>+0(SB), Y4, Y4
  4946	VPSHUFB    ·rol16<>+0(SB), Y1, Y1
  4947	VPSHUFB    ·rol16<>+0(SB), Y2, Y2
  4948	VPSHUFB    ·rol16<>+0(SB), Y3, Y3
  4949	VPADDD     Y4, Y12, Y12
  4950	VPADDD     Y1, Y13, Y13
  4951	VPADDD     Y2, Y8, Y8
  4952	VPADDD     Y3, Y15, Y15
  4953	VPXOR      Y12, Y14, Y14
  4954	VPXOR      Y13, Y9, Y9
  4955	VPXOR      Y8, Y10, Y10
  4956	VPXOR      Y15, Y11, Y11
  4957	VMOVDQA    Y15, 224(BP)
  4958	VPSLLD     $0x0c, Y14, Y15
  4959	VPSRLD     $0x14, Y14, Y14
  4960	VPXOR      Y15, Y14, Y14
  4961	VPSLLD     $0x0c, Y9, Y15
  4962	VPSRLD     $0x14, Y9, Y9
  4963	VPXOR      Y15, Y9, Y9
  4964	VPSLLD     $0x0c, Y10, Y15
  4965	VPSRLD     $0x14, Y10, Y10
  4966	VPXOR      Y15, Y10, Y10
  4967	VPSLLD     $0x0c, Y11, Y15
  4968	VPSRLD     $0x14, Y11, Y11
  4969	VPXOR      Y15, Y11, Y11
  4970	VMOVDQA    224(BP), Y15
  4971	ADDQ       (DI), R10
  4972	ADCQ       8(DI), R11
  4973	ADCQ       $0x01, R12
  4974	MOVQ       (BP), DX
  4975	MOVQ       DX, R15
  4976	MULXQ      R10, R13, R14
  4977	IMULQ      R12, R15
  4978	MULXQ      R11, AX, DX
  4979	ADDQ       AX, R14
  4980	ADCQ       DX, R15
  4981	MOVQ       8(BP), DX
  4982	MULXQ      R10, R10, AX
  4983	ADDQ       R10, R14
  4984	MULXQ      R11, R11, R8
  4985	ADCQ       R11, R15
  4986	ADCQ       $0x00, R8
  4987	IMULQ      R12, DX
  4988	ADDQ       AX, R15
  4989	ADCQ       DX, R8
  4990	MOVQ       R13, R10
  4991	MOVQ       R14, R11
  4992	MOVQ       R15, R12
  4993	ANDQ       $0x03, R12
  4994	MOVQ       R15, R13
  4995	ANDQ       $-4, R13
  4996	MOVQ       R8, R14
  4997	SHRQ       $0x02, R8, R15
  4998	SHRQ       $0x02, R8
  4999	ADDQ       R13, R10
  5000	ADCQ       R14, R11
  5001	ADCQ       $0x00, R12
  5002	ADDQ       R15, R10
  5003	ADCQ       R8, R11
  5004	ADCQ       $0x00, R12
  5005	VPADDD     Y14, Y0, Y0
  5006	VPADDD     Y9, Y5, Y5
  5007	VPADDD     Y10, Y6, Y6
  5008	VPADDD     Y11, Y7, Y7
  5009	VPXOR      Y0, Y4, Y4
  5010	VPXOR      Y5, Y1, Y1
  5011	VPXOR      Y6, Y2, Y2
  5012	VPXOR      Y7, Y3, Y3
  5013	VPSHUFB    ·rol8<>+0(SB), Y4, Y4
  5014	VPSHUFB    ·rol8<>+0(SB), Y1, Y1
  5015	VPSHUFB    ·rol8<>+0(SB), Y2, Y2
  5016	VPSHUFB    ·rol8<>+0(SB), Y3, Y3
  5017	VPADDD     Y4, Y12, Y12
  5018	VPADDD     Y1, Y13, Y13
  5019	VPADDD     Y2, Y8, Y8
  5020	VPADDD     Y3, Y15, Y15
  5021	VPXOR      Y12, Y14, Y14
  5022	VPXOR      Y13, Y9, Y9
  5023	VPXOR      Y8, Y10, Y10
  5024	VPXOR      Y15, Y11, Y11
  5025	VMOVDQA    Y15, 224(BP)
  5026	VPSLLD     $0x07, Y14, Y15
  5027	VPSRLD     $0x19, Y14, Y14
  5028	VPXOR      Y15, Y14, Y14
  5029	VPSLLD     $0x07, Y9, Y15
  5030	VPSRLD     $0x19, Y9, Y9
  5031	VPXOR      Y15, Y9, Y9
  5032	VPSLLD     $0x07, Y10, Y15
  5033	VPSRLD     $0x19, Y10, Y10
  5034	VPXOR      Y15, Y10, Y10
  5035	VPSLLD     $0x07, Y11, Y15
  5036	VPSRLD     $0x19, Y11, Y11
  5037	VPXOR      Y15, Y11, Y11
  5038	VMOVDQA    224(BP), Y15
  5039	VPALIGNR   $0x04, Y14, Y14, Y14
  5040	VPALIGNR   $0x04, Y9, Y9, Y9
  5041	VPALIGNR   $0x04, Y10, Y10, Y10
  5042	VPALIGNR   $0x04, Y11, Y11, Y11
  5043	VPALIGNR   $0x08, Y12, Y12, Y12
  5044	VPALIGNR   $0x08, Y13, Y13, Y13
  5045	VPALIGNR   $0x08, Y8, Y8, Y8
  5046	VPALIGNR   $0x08, Y15, Y15, Y15
  5047	VPALIGNR   $0x0c, Y4, Y4, Y4
  5048	VPALIGNR   $0x0c, Y1, Y1, Y1
  5049	VPALIGNR   $0x0c, Y2, Y2, Y2
  5050	VPALIGNR   $0x0c, Y3, Y3, Y3
  5051	VPADDD     Y14, Y0, Y0
  5052	VPADDD     Y9, Y5, Y5
  5053	VPADDD     Y10, Y6, Y6
  5054	VPADDD     Y11, Y7, Y7
  5055	VPXOR      Y0, Y4, Y4
  5056	VPXOR      Y5, Y1, Y1
  5057	VPXOR      Y6, Y2, Y2
  5058	VPXOR      Y7, Y3, Y3
  5059	VPSHUFB    ·rol16<>+0(SB), Y4, Y4
  5060	VPSHUFB    ·rol16<>+0(SB), Y1, Y1
  5061	VPSHUFB    ·rol16<>+0(SB), Y2, Y2
  5062	VPSHUFB    ·rol16<>+0(SB), Y3, Y3
  5063	VPADDD     Y4, Y12, Y12
  5064	VPADDD     Y1, Y13, Y13
  5065	VPADDD     Y2, Y8, Y8
  5066	VPADDD     Y3, Y15, Y15
  5067	VPXOR      Y12, Y14, Y14
  5068	VPXOR      Y13, Y9, Y9
  5069	VPXOR      Y8, Y10, Y10
  5070	VPXOR      Y15, Y11, Y11
  5071	ADDQ       16(DI), R10
  5072	ADCQ       24(DI), R11
  5073	ADCQ       $0x01, R12
  5074	MOVQ       (BP), DX
  5075	MOVQ       DX, R15
  5076	MULXQ      R10, R13, R14
  5077	IMULQ      R12, R15
  5078	MULXQ      R11, AX, DX
  5079	ADDQ       AX, R14
  5080	ADCQ       DX, R15
  5081	MOVQ       8(BP), DX
  5082	MULXQ      R10, R10, AX
  5083	ADDQ       R10, R14
  5084	MULXQ      R11, R11, R8
  5085	ADCQ       R11, R15
  5086	ADCQ       $0x00, R8
  5087	IMULQ      R12, DX
  5088	ADDQ       AX, R15
  5089	ADCQ       DX, R8
  5090	MOVQ       R13, R10
  5091	MOVQ       R14, R11
  5092	MOVQ       R15, R12
  5093	ANDQ       $0x03, R12
  5094	MOVQ       R15, R13
  5095	ANDQ       $-4, R13
  5096	MOVQ       R8, R14
  5097	SHRQ       $0x02, R8, R15
  5098	SHRQ       $0x02, R8
  5099	ADDQ       R13, R10
  5100	ADCQ       R14, R11
  5101	ADCQ       $0x00, R12
  5102	ADDQ       R15, R10
  5103	ADCQ       R8, R11
  5104	ADCQ       $0x00, R12
  5105	LEAQ       32(DI), DI
  5106	VMOVDQA    Y15, 224(BP)
  5107	VPSLLD     $0x0c, Y14, Y15
  5108	VPSRLD     $0x14, Y14, Y14
  5109	VPXOR      Y15, Y14, Y14
  5110	VPSLLD     $0x0c, Y9, Y15
  5111	VPSRLD     $0x14, Y9, Y9
  5112	VPXOR      Y15, Y9, Y9
  5113	VPSLLD     $0x0c, Y10, Y15
  5114	VPSRLD     $0x14, Y10, Y10
  5115	VPXOR      Y15, Y10, Y10
  5116	VPSLLD     $0x0c, Y11, Y15
  5117	VPSRLD     $0x14, Y11, Y11
  5118	VPXOR      Y15, Y11, Y11
  5119	VMOVDQA    224(BP), Y15
  5120	VPADDD     Y14, Y0, Y0
  5121	VPADDD     Y9, Y5, Y5
  5122	VPADDD     Y10, Y6, Y6
  5123	VPADDD     Y11, Y7, Y7
  5124	VPXOR      Y0, Y4, Y4
  5125	VPXOR      Y5, Y1, Y1
  5126	VPXOR      Y6, Y2, Y2
  5127	VPXOR      Y7, Y3, Y3
  5128	VPSHUFB    ·rol8<>+0(SB), Y4, Y4
  5129	VPSHUFB    ·rol8<>+0(SB), Y1, Y1
  5130	VPSHUFB    ·rol8<>+0(SB), Y2, Y2
  5131	VPSHUFB    ·rol8<>+0(SB), Y3, Y3
  5132	VPADDD     Y4, Y12, Y12
  5133	VPADDD     Y1, Y13, Y13
  5134	VPADDD     Y2, Y8, Y8
  5135	VPADDD     Y3, Y15, Y15
  5136	VPXOR      Y12, Y14, Y14
  5137	VPXOR      Y13, Y9, Y9
  5138	VPXOR      Y8, Y10, Y10
  5139	VPXOR      Y15, Y11, Y11
  5140	VMOVDQA    Y15, 224(BP)
  5141	VPSLLD     $0x07, Y14, Y15
  5142	VPSRLD     $0x19, Y14, Y14
  5143	VPXOR      Y15, Y14, Y14
  5144	VPSLLD     $0x07, Y9, Y15
  5145	VPSRLD     $0x19, Y9, Y9
  5146	VPXOR      Y15, Y9, Y9
  5147	VPSLLD     $0x07, Y10, Y15
  5148	VPSRLD     $0x19, Y10, Y10
  5149	VPXOR      Y15, Y10, Y10
  5150	VPSLLD     $0x07, Y11, Y15
  5151	VPSRLD     $0x19, Y11, Y11
  5152	VPXOR      Y15, Y11, Y11
  5153	VMOVDQA    224(BP), Y15
  5154	VPALIGNR   $0x0c, Y14, Y14, Y14
  5155	VPALIGNR   $0x0c, Y9, Y9, Y9
  5156	VPALIGNR   $0x0c, Y10, Y10, Y10
  5157	VPALIGNR   $0x0c, Y11, Y11, Y11
  5158	VPALIGNR   $0x08, Y12, Y12, Y12
  5159	VPALIGNR   $0x08, Y13, Y13, Y13
  5160	VPALIGNR   $0x08, Y8, Y8, Y8
  5161	VPALIGNR   $0x08, Y15, Y15, Y15
  5162	VPALIGNR   $0x04, Y4, Y4, Y4
  5163	VPALIGNR   $0x04, Y1, Y1, Y1
  5164	VPALIGNR   $0x04, Y2, Y2, Y2
  5165	VPALIGNR   $0x04, Y3, Y3, Y3
  5166	DECQ       CX
  5167	JG         sealAVX2Tail512LoopA
  5168	DECQ       R9
  5169	JGE        sealAVX2Tail512LoopB
  5170	VPADDD     ·chacha20Constants<>+0(SB), Y0, Y0
  5171	VPADDD     ·chacha20Constants<>+0(SB), Y5, Y5
  5172	VPADDD     ·chacha20Constants<>+0(SB), Y6, Y6
  5173	VPADDD     ·chacha20Constants<>+0(SB), Y7, Y7
  5174	VPADDD     32(BP), Y14, Y14
  5175	VPADDD     32(BP), Y9, Y9
  5176	VPADDD     32(BP), Y10, Y10
  5177	VPADDD     32(BP), Y11, Y11
  5178	VPADDD     64(BP), Y12, Y12
  5179	VPADDD     64(BP), Y13, Y13
  5180	VPADDD     64(BP), Y8, Y8
  5181	VPADDD     64(BP), Y15, Y15
  5182	VPADDD     96(BP), Y4, Y4
  5183	VPADDD     128(BP), Y1, Y1
  5184	VPADDD     160(BP), Y2, Y2
  5185	VPADDD     192(BP), Y3, Y3
  5186	VMOVDQA    Y15, 224(BP)
  5187	VPERM2I128 $0x02, Y0, Y14, Y15
  5188	VPXOR      (SI), Y15, Y15
  5189	VMOVDQU    Y15, (DI)
  5190	VPERM2I128 $0x02, Y12, Y4, Y15
  5191	VPXOR      32(SI), Y15, Y15
  5192	VMOVDQU    Y15, 32(DI)
  5193	VPERM2I128 $0x13, Y0, Y14, Y15
  5194	VPXOR      64(SI), Y15, Y15
  5195	VMOVDQU    Y15, 64(DI)
  5196	VPERM2I128 $0x13, Y12, Y4, Y15
  5197	VPXOR      96(SI), Y15, Y15
  5198	VMOVDQU    Y15, 96(DI)
  5199	VPERM2I128 $0x02, Y5, Y9, Y0
  5200	VPERM2I128 $0x02, Y13, Y1, Y14
  5201	VPERM2I128 $0x13, Y5, Y9, Y12
  5202	VPERM2I128 $0x13, Y13, Y1, Y4
  5203	VPXOR      128(SI), Y0, Y0
  5204	VPXOR      160(SI), Y14, Y14
  5205	VPXOR      192(SI), Y12, Y12
  5206	VPXOR      224(SI), Y4, Y4
  5207	VMOVDQU    Y0, 128(DI)
  5208	VMOVDQU    Y14, 160(DI)
  5209	VMOVDQU    Y12, 192(DI)
  5210	VMOVDQU    Y4, 224(DI)
  5211	VPERM2I128 $0x02, Y6, Y10, Y0
  5212	VPERM2I128 $0x02, Y8, Y2, Y14
  5213	VPERM2I128 $0x13, Y6, Y10, Y12
  5214	VPERM2I128 $0x13, Y8, Y2, Y4
  5215	VPXOR      256(SI), Y0, Y0
  5216	VPXOR      288(SI), Y14, Y14
  5217	VPXOR      320(SI), Y12, Y12
  5218	VPXOR      352(SI), Y4, Y4
  5219	VMOVDQU    Y0, 256(DI)
  5220	VMOVDQU    Y14, 288(DI)
  5221	VMOVDQU    Y12, 320(DI)
  5222	VMOVDQU    Y4, 352(DI)
  5223	MOVQ       $0x00000180, CX
  5224	LEAQ       384(SI), SI
  5225	SUBQ       $0x00000180, BX
  5226	VPERM2I128 $0x02, Y7, Y11, Y0
  5227	VPERM2I128 $0x02, 224(BP), Y3, Y14
  5228	VPERM2I128 $0x13, Y7, Y11, Y12
  5229	VPERM2I128 $0x13, 224(BP), Y3, Y4
  5230	JMP        sealAVX2SealHash

View as plain text