//go:build !noasm && amd64
// AUTO-GENERATED BY GOAT -- DO NOT EDIT

TEXT ·popcnt_AVX2_lookup(SB), $0-32
	MOVQ vec+0(FP), DI
	MOVQ low_mask_vec+8(FP), SI
	MOVQ lookup_vec+16(FP), DX

TEXT ·popcnt_64bit(SB), $0-32
	MOVQ src+0(FP), DI
	MOVQ popcnt_constants+8(FP), SI

TEXT ·hamming_bitwise_256(SB), $0-32
	MOVQ a+0(FP), DI
	MOVQ b+8(FP), SI
	MOVQ res+16(FP), DX
	MOVQ len+24(FP), CX
	MOVQ lookup_avx+32(FP), R8
	MOVQ popcnt_constants+40(FP), R9
	BYTE $0x55                       // pushq	%rbp
	WORD $0x8948; BYTE $0xe5         // movq	%rsp, %rbp
	WORD $0x5741                     // pushq	%r15
	WORD $0x5641                     // pushq	%r14
	WORD $0x5541                     // pushq	%r13
	WORD $0x5441                     // pushq	%r12
	BYTE $0x53                       // pushq	%rbx
	LONG $0xf8e48348                 // andq	$-8, %rsp
	BYTE $0x50                       // pushq	%rax
	WORD $0x8949; BYTE $0xd4         // movq	%rdx, %r12
	WORD $0x8b48; BYTE $0x01         // movq	(%rcx), %rax
	WORD $0xf883; BYTE $0x08         // cmpl	$8, %eax
	JGE  LBB0_1
	LONG $0x2424894c                 // movq	%r12, (%rsp)                    # 8-byte Spill
	WORD $0x8b4d; BYTE $0x01         // movq	(%r9), %r8
	LONG $0x08518b4d                 // movq	8(%r9), %r10
	LONG $0x10598b4d                 // movq	16(%r9), %r11
	LONG $0x18498b4d                 // movq	24(%r9), %r9
	WORD $0x8941; BYTE $0xc4         // movl	%eax, %r12d
	LONG $0xffc48341                 // addl	$-1, %r12d
	LONG $0x0ffc8341                 // cmpl	$15, %r12d
	JAE  LBB0_12
	WORD $0x3145; BYTE $0xff         // xorl	%r15d, %r15d
	WORD $0x8949; BYTE $0xf6         // movq	%rsi, %r14
	WORD $0x8949; BYTE $0xfd         // movq	%rdi, %r13
	LONG $0x24248b4c                 // movq	(%rsp), %r12                    # 8-byte Reload
	JMP  LBB0_15

LBB0_1:
	LONG $0x6f7ec1c4; BYTE $0x00   // vmovdqu	(%r8), %ymm0
	LONG $0x597dc2c4; WORD $0x2049 // vpbroadcastq	32(%r9), %ymm1
	WORD $0x3145; BYTE $0xff       // xorl	%r15d, %r15d
	WORD $0xf883; BYTE $0x10       // cmpl	$16, %eax
	JB   LBB0_5
	LONG $0xd2efe9c5               // vpxor	%xmm2, %xmm2, %xmm2

LBB0_3:
	LONG $0x1e6ffec5               // vmovdqu	(%rsi), %ymm3
	LONG $0x666ffec5; BYTE $0x20   // vmovdqu	32(%rsi), %ymm4
	LONG $0x6e6ffec5; BYTE $0x40   // vmovdqu	64(%rsi), %ymm5
	LONG $0x766ffec5; BYTE $0x60   // vmovdqu	96(%rsi), %ymm6
	LONG $0x3fefe5c5               // vpxor	(%rdi), %ymm3, %ymm7
	LONG $0x47ef5dc5; BYTE $0x20   // vpxor	32(%rdi), %ymm4, %ymm8
	LONG $0x67efd5c5; BYTE $0x40   // vpxor	64(%rdi), %ymm5, %ymm4
	LONG $0x5fefcdc5; BYTE $0x60   // vpxor	96(%rdi), %ymm6, %ymm3
	LONG $0xe9dbc5c5               // vpand	%ymm1, %ymm7, %ymm5
	LONG $0xd771cdc5; BYTE $0x04   // vpsrlw	$4, %ymm7, %ymm6
	LONG $0xf6dbf5c5               // vpand	%ymm6, %ymm1, %ymm6
	LONG $0x007de2c4; BYTE $0xed   // vpshufb	%ymm5, %ymm0, %ymm5
	LONG $0x007de2c4; BYTE $0xf6   // vpshufb	%ymm6, %ymm0, %ymm6
	LONG $0xf5fccdc5               // vpaddb	%ymm5, %ymm6, %ymm6
	LONG $0xe9dbbdc5               // vpand	%ymm1, %ymm8, %ymm5
	LONG $0x7145c1c4; WORD $0x04d0 // vpsrlw	$4, %ymm8, %ymm7
	LONG $0xffdbf5c5               // vpand	%ymm7, %ymm1, %ymm7
	LONG $0x007de2c4; BYTE $0xed   // vpshufb	%ymm5, %ymm0, %ymm5
	LONG $0x007de2c4; BYTE $0xff   // vpshufb	%ymm7, %ymm0, %ymm7
	LONG $0xedfcc5c5               // vpaddb	%ymm5, %ymm7, %ymm5
	LONG $0xeaf6d5c5               // vpsadbw	%ymm2, %ymm5, %ymm5
	LONG $0x16f9e3c4; WORD $0x01eb // vpextrq	$1, %xmm5, %rbx
	LONG $0xf2f6cdc5               // vpsadbw	%ymm2, %ymm6, %ymm6
	LONG $0x397de3c4; WORD $0x01f7 // vextracti128	$1, %ymm6, %xmm7
	LONG $0xf7d4c9c5               // vpaddq	%xmm7, %xmm6, %xmm6
	LONG $0xfe70f9c5; BYTE $0xee   // vpshufd	$238, %xmm6, %xmm7              # xmm7 = xmm6[2,3,2,3]
	LONG $0xf7d4c9c5               // vpaddq	%xmm7, %xmm6, %xmm6
	LONG $0x7ef9e1c4; BYTE $0xf1   // vmovq	%xmm6, %rcx
	WORD $0x0148; BYTE $0xd9       // addq	%rbx, %rcx
	LONG $0x7ef9e1c4; BYTE $0xea   // vmovq	%xmm5, %rdx
	LONG $0x397de3c4; WORD $0x01ed // vextracti128	$1, %ymm5, %xmm5
	WORD $0x0148; BYTE $0xd1       // addq	%rdx, %rcx
	LONG $0x7ef9e1c4; BYTE $0xea   // vmovq	%xmm5, %rdx
	WORD $0x0148; BYTE $0xd1       // addq	%rdx, %rcx
	LONG $0x16f9e3c4; WORD $0x01ea // vpextrq	$1, %xmm5, %rdx
	LONG $0xe9dbddc5               // vpand	%ymm1, %ymm4, %ymm5
	LONG $0xd471ddc5; BYTE $0x04   // vpsrlw	$4, %ymm4, %ymm4
	LONG $0xe4dbf5c5               // vpand	%ymm4, %ymm1, %ymm4
	LONG $0x007de2c4; BYTE $0xed   // vpshufb	%ymm5, %ymm0, %ymm5
	LONG $0x007de2c4; BYTE $0xe4   // vpshufb	%ymm4, %ymm0, %ymm4
	LONG $0xe5fcddc5               // vpaddb	%ymm5, %ymm4, %ymm4
	LONG $0xe2f6ddc5               // vpsadbw	%ymm2, %ymm4, %ymm4
	WORD $0x014c; BYTE $0xf9       // addq	%r15, %rcx
	LONG $0x7ef9e1c4; BYTE $0xe3   // vmovq	%xmm4, %rbx
	WORD $0x0148; BYTE $0xd1       // addq	%rdx, %rcx
	LONG $0x16f9e3c4; WORD $0x01e2 // vpextrq	$1, %xmm4, %rdx
	LONG $0x397de3c4; WORD $0x01e4 // vextracti128	$1, %ymm4, %xmm4
	WORD $0x0148; BYTE $0xd1       // addq	%rdx, %rcx
	LONG $0x7ef9e1c4; BYTE $0xe2   // vmovq	%xmm4, %rdx
	WORD $0x0148; BYTE $0xd9       // addq	%rbx, %rcx
	LONG $0x16f9e3c4; WORD $0x01e3 // vpextrq	$1, %xmm4, %rbx
	WORD $0x0148; BYTE $0xd1       // addq	%rdx, %rcx
	LONG $0xe1dbe5c5               // vpand	%ymm1, %ymm3, %ymm4
	LONG $0xd371e5c5; BYTE $0x04   // vpsrlw	$4, %ymm3, %ymm3
	LONG $0xdbdbf5c5               // vpand	%ymm3, %ymm1, %ymm3
	LONG $0x007de2c4; BYTE $0xe4   // vpshufb	%ymm4, %ymm0, %ymm4
	LONG $0x007de2c4; BYTE $0xdb   // vpshufb	%ymm3, %ymm0, %ymm3
	LONG $0xdcfce5c5               // vpaddb	%ymm4, %ymm3, %ymm3
	LONG $0xdaf6e5c5               // vpsadbw	%ymm2, %ymm3, %ymm3
	WORD $0x0148; BYTE $0xd9       // addq	%rbx, %rcx
	LONG $0x16f9e3c4; WORD $0x01da // vpextrq	$1, %xmm3, %rdx
	WORD $0x0148; BYTE $0xd1       // addq	%rdx, %rcx
	LONG $0x7ef9e1c4; BYTE $0xda   // vmovq	%xmm3, %rdx
	LONG $0x397de3c4; WORD $0x01db // vextracti128	$1, %ymm3, %xmm3
	WORD $0x0148; BYTE $0xd1       // addq	%rdx, %rcx
	LONG $0x7ef9e1c4; BYTE $0xda   // vmovq	%xmm3, %rdx
	WORD $0x0148; BYTE $0xd1       // addq	%rdx, %rcx
	LONG $0x16f9e3c4; WORD $0x01da // vpextrq	$1, %xmm3, %rdx
	WORD $0x8949; BYTE $0xcf       // movq	%rcx, %r15
	WORD $0x0149; BYTE $0xd7       // addq	%rdx, %r15
	WORD $0xc083; BYTE $0xf0       // addl	$-16, %eax
	LONG $0x80ef8348               // subq	$-128, %rdi
	LONG $0x80ee8348               // subq	$-128, %rsi
	WORD $0xf883; BYTE $0x0f       // cmpl	$15, %eax
	JA   LBB0_3
	WORD $0xf883; BYTE $0x04       // cmpl	$4, %eax
	JB   LBB0_7

LBB0_5:
	LONG $0xd2efe9c5 // vpxor	%xmm2, %xmm2, %xmm2

LBB0_6:
	LONG $0x1e6ffec5               // vmovdqu	(%rsi), %ymm3
	LONG $0x1fefe5c5               // vpxor	(%rdi), %ymm3, %ymm3
	LONG $0xe1dbe5c5               // vpand	%ymm1, %ymm3, %ymm4
	LONG $0xd371e5c5; BYTE $0x04   // vpsrlw	$4, %ymm3, %ymm3
	LONG $0xdbdbf5c5               // vpand	%ymm3, %ymm1, %ymm3
	LONG $0x007de2c4; BYTE $0xe4   // vpshufb	%ymm4, %ymm0, %ymm4
	LONG $0x007de2c4; BYTE $0xdb   // vpshufb	%ymm3, %ymm0, %ymm3
	LONG $0xdcfce5c5               // vpaddb	%ymm4, %ymm3, %ymm3
	LONG $0xdaf6e5c5               // vpsadbw	%ymm2, %ymm3, %ymm3
	LONG $0x397de3c4; WORD $0x01dc // vextracti128	$1, %ymm3, %xmm4
	LONG $0xdcd4e1c5               // vpaddq	%xmm4, %xmm3, %xmm3
	LONG $0xe370f9c5; BYTE $0xee   // vpshufd	$238, %xmm3, %xmm4              # xmm4 = xmm3[2,3,2,3]
	LONG $0xdcd4e1c5               // vpaddq	%xmm4, %xmm3, %xmm3
	LONG $0x7ef9e1c4; BYTE $0xd9   // vmovq	%xmm3, %rcx
	WORD $0x0149; BYTE $0xcf       // addq	%rcx, %r15
	WORD $0xc083; BYTE $0xfc       // addl	$-4, %eax
	LONG $0x20c78348               // addq	$32, %rdi
	LONG $0x20c68348               // addq	$32, %rsi
	WORD $0xf883; BYTE $0x03       // cmpl	$3, %eax
	JA   LBB0_6

LBB0_7:
	WORD $0xc085             // testl	%eax, %eax
	JE   LBB0_22
	WORD $0x8b4d; BYTE $0x11 // movq	(%r9), %r10
	LONG $0x08418b4d         // movq	8(%r9), %r8
	LONG $0x10598b49         // movq	16(%r9), %rbx
	LONG $0x18498b4d         // movq	24(%r9), %r9
	WORD $0x508d; BYTE $0xff // leal	-1(%rax), %edx
	WORD $0xfa83; BYTE $0x07 // cmpl	$7, %edx
	JAE  LBB0_17
	WORD $0x8949; BYTE $0xfb // movq	%rdi, %r11
	WORD $0x8949; BYTE $0xf6 // movq	%rsi, %r14
	JMP  LBB0_20

LBB0_12:
	LONG $0x01c48349             // addq	$1, %r12
	WORD $0x894c; BYTE $0xe2     // movq	%r12, %rdx
	LONG $0xf0e28348             // andq	$-16, %rdx
	WORD $0xd029                 // subl	%edx, %eax
	LONG $0xd6348d4c             // leaq	(%rsi,%rdx,8), %r14
	LONG $0xd72c8d4c             // leaq	(%rdi,%rdx,8), %r13
	LONG $0x6ef9c1c4; BYTE $0xc0 // vmovq	%r8, %xmm0
	LONG $0x597de2c4; BYTE $0xc0 // vpbroadcastq	%xmm0, %ymm0
	LONG $0x6ef9c1c4; BYTE $0xca // vmovq	%r10, %xmm1
	LONG $0x597de2c4; BYTE $0xc9 // vpbroadcastq	%xmm1, %ymm1
	LONG $0x6ef9c1c4; BYTE $0xd3 // vmovq	%r11, %xmm2
	LONG $0x597de2c4; BYTE $0xd2 // vpbroadcastq	%xmm2, %ymm2
	LONG $0x6ef9c1c4; BYTE $0xd9 // vmovq	%r9, %xmm3
	LONG $0x597de2c4; BYTE $0xdb // vpbroadcastq	%xmm3, %ymm3
	QUAD $0x00000000e50c8d4a     // leaq	(,%r12,8), %rcx
	LONG $0x80e18348             // andq	$-128, %rcx
	LONG $0xe4efd9c5             // vpxor	%xmm4, %xmm4, %xmm4
	WORD $0xdb31                 // xorl	%ebx, %ebx
	LONG $0xedefd1c5             // vpxor	%xmm5, %xmm5, %xmm5
	LONG $0xf6efc9c5             // vpxor	%xmm6, %xmm6, %xmm6
	LONG $0xffefc1c5             // vpxor	%xmm7, %xmm7, %xmm7

LBB0_13:
	LONG $0x046f7ec5; BYTE $0x1e   // vmovdqu	(%rsi,%rbx), %ymm8
	LONG $0x4c6f7ec5; WORD $0x201e // vmovdqu	32(%rsi,%rbx), %ymm9
	LONG $0x546f7ec5; WORD $0x401e // vmovdqu	64(%rsi,%rbx), %ymm10
	LONG $0x5c6f7ec5; WORD $0x601e // vmovdqu	96(%rsi,%rbx), %ymm11
	LONG $0x04ef3dc5; BYTE $0x1f   // vpxor	(%rdi,%rbx), %ymm8, %ymm8
	LONG $0x4cef35c5; WORD $0x201f // vpxor	32(%rdi,%rbx), %ymm9, %ymm9
	LONG $0x54ef2dc5; WORD $0x401f // vpxor	64(%rdi,%rbx), %ymm10, %ymm10
	LONG $0x5cef25c5; WORD $0x601f // vpxor	96(%rdi,%rbx), %ymm11, %ymm11
	LONG $0xe0db3dc5               // vpand	%ymm0, %ymm8, %ymm12
	LONG $0xe8db35c5               // vpand	%ymm0, %ymm9, %ymm13
	LONG $0xf0db2dc5               // vpand	%ymm0, %ymm10, %ymm14
	LONG $0xf8db25c5               // vpand	%ymm0, %ymm11, %ymm15
	LONG $0x733dc1c4; WORD $0x01d0 // vpsrlq	$1, %ymm8, %ymm8
	LONG $0x7335c1c4; WORD $0x01d1 // vpsrlq	$1, %ymm9, %ymm9
	LONG $0x732dc1c4; WORD $0x01d2 // vpsrlq	$1, %ymm10, %ymm10
	LONG $0x7325c1c4; WORD $0x01d3 // vpsrlq	$1, %ymm11, %ymm11
	LONG $0xc0db3dc5               // vpand	%ymm0, %ymm8, %ymm8
	LONG $0xd43d41c4; BYTE $0xc4   // vpaddq	%ymm12, %ymm8, %ymm8
	LONG $0xc8db35c5               // vpand	%ymm0, %ymm9, %ymm9
	LONG $0xd43541c4; BYTE $0xcd   // vpaddq	%ymm13, %ymm9, %ymm9
	LONG $0xd0db2dc5               // vpand	%ymm0, %ymm10, %ymm10
	LONG $0xd42d41c4; BYTE $0xd6   // vpaddq	%ymm14, %ymm10, %ymm10
	LONG $0xd8db25c5               // vpand	%ymm0, %ymm11, %ymm11
	LONG $0xd42541c4; BYTE $0xdf   // vpaddq	%ymm15, %ymm11, %ymm11
	LONG $0xe1db3dc5               // vpand	%ymm1, %ymm8, %ymm12
	LONG $0xe9db35c5               // vpand	%ymm1, %ymm9, %ymm13
	LONG $0xf1db2dc5               // vpand	%ymm1, %ymm10, %ymm14
	LONG $0xf9db25c5               // vpand	%ymm1, %ymm11, %ymm15
	LONG $0x733dc1c4; WORD $0x02d0 // vpsrlq	$2, %ymm8, %ymm8
	LONG $0x7335c1c4; WORD $0x02d1 // vpsrlq	$2, %ymm9, %ymm9
	LONG $0x732dc1c4; WORD $0x02d2 // vpsrlq	$2, %ymm10, %ymm10
	LONG $0x7325c1c4; WORD $0x02d3 // vpsrlq	$2, %ymm11, %ymm11
	LONG $0xc1db3dc5               // vpand	%ymm1, %ymm8, %ymm8
	LONG $0xd43d41c4; BYTE $0xc4   // vpaddq	%ymm12, %ymm8, %ymm8
	LONG $0xc9db35c5               // vpand	%ymm1, %ymm9, %ymm9
	LONG $0xd43541c4; BYTE $0xcd   // vpaddq	%ymm13, %ymm9, %ymm9
	LONG $0xd1db2dc5               // vpand	%ymm1, %ymm10, %ymm10
	LONG $0xd42d41c4; BYTE $0xd6   // vpaddq	%ymm14, %ymm10, %ymm10
	LONG $0xd9db25c5               // vpand	%ymm1, %ymm11, %ymm11
	LONG $0xd42541c4; BYTE $0xdf   // vpaddq	%ymm15, %ymm11, %ymm11
	LONG $0xe2db3dc5               // vpand	%ymm2, %ymm8, %ymm12
	LONG $0xeadb35c5               // vpand	%ymm2, %ymm9, %ymm13
	LONG $0xf2db2dc5               // vpand	%ymm2, %ymm10, %ymm14
	LONG $0xfadb25c5               // vpand	%ymm2, %ymm11, %ymm15
	LONG $0x733dc1c4; WORD $0x04d0 // vpsrlq	$4, %ymm8, %ymm8
	LONG $0x7335c1c4; WORD $0x04d1 // vpsrlq	$4, %ymm9, %ymm9
	LONG $0x732dc1c4; WORD $0x04d2 // vpsrlq	$4, %ymm10, %ymm10
	LONG $0x7325c1c4; WORD $0x04d3 // vpsrlq	$4, %ymm11, %ymm11
	LONG $0xc2db3dc5               // vpand	%ymm2, %ymm8, %ymm8
	LONG $0xd43d41c4; BYTE $0xc4   // vpaddq	%ymm12, %ymm8, %ymm8
	LONG $0xcadb35c5               // vpand	%ymm2, %ymm9, %ymm9
	LONG $0xd43541c4; BYTE $0xcd   // vpaddq	%ymm13, %ymm9, %ymm9
	LONG $0xd2db2dc5               // vpand	%ymm2, %ymm10, %ymm10
	LONG $0xd42d41c4; BYTE $0xd6   // vpaddq	%ymm14, %ymm10, %ymm10
	LONG $0xdadb25c5               // vpand	%ymm2, %ymm11, %ymm11
	LONG $0xd42541c4; BYTE $0xdf   // vpaddq	%ymm15, %ymm11, %ymm11
	LONG $0xd3739dc5; BYTE $0x20   // vpsrlq	$32, %ymm3, %ymm12
	LONG $0xf43d41c4; BYTE $0xec   // vpmuludq	%ymm12, %ymm8, %ymm13
	LONG $0x730dc1c4; WORD $0x20d0 // vpsrlq	$32, %ymm8, %ymm14
	LONG $0xf3f40dc5               // vpmuludq	%ymm3, %ymm14, %ymm14
	LONG $0xd41541c4; BYTE $0xee   // vpaddq	%ymm14, %ymm13, %ymm13
	LONG $0x7315c1c4; WORD $0x20f5 // vpsllq	$32, %ymm13, %ymm13
	LONG $0xc3f43dc5               // vpmuludq	%ymm3, %ymm8, %ymm8
	LONG $0xd43d41c4; BYTE $0xc5   // vpaddq	%ymm13, %ymm8, %ymm8
	LONG $0xf43541c4; BYTE $0xec   // vpmuludq	%ymm12, %ymm9, %ymm13
	LONG $0x730dc1c4; WORD $0x20d1 // vpsrlq	$32, %ymm9, %ymm14
	LONG $0xf3f40dc5               // vpmuludq	%ymm3, %ymm14, %ymm14
	LONG $0xd41541c4; BYTE $0xee   // vpaddq	%ymm14, %ymm13, %ymm13
	LONG $0x7315c1c4; WORD $0x20f5 // vpsllq	$32, %ymm13, %ymm13
	LONG $0xcbf435c5               // vpmuludq	%ymm3, %ymm9, %ymm9
	LONG $0xd43541c4; BYTE $0xcd   // vpaddq	%ymm13, %ymm9, %ymm9
	LONG $0xf42d41c4; BYTE $0xec   // vpmuludq	%ymm12, %ymm10, %ymm13
	LONG $0x730dc1c4; WORD $0x20d2 // vpsrlq	$32, %ymm10, %ymm14
	LONG $0xf3f40dc5               // vpmuludq	%ymm3, %ymm14, %ymm14
	LONG $0xd41541c4; BYTE $0xee   // vpaddq	%ymm14, %ymm13, %ymm13
	LONG $0x7315c1c4; WORD $0x20f5 // vpsllq	$32, %ymm13, %ymm13
	LONG $0xd3f42dc5               // vpmuludq	%ymm3, %ymm10, %ymm10
	LONG $0xd42d41c4; BYTE $0xd5   // vpaddq	%ymm13, %ymm10, %ymm10
	LONG $0xf42541c4; BYTE $0xe4   // vpmuludq	%ymm12, %ymm11, %ymm12
	LONG $0x7315c1c4; WORD $0x20d3 // vpsrlq	$32, %ymm11, %ymm13
	LONG $0xebf415c5               // vpmuludq	%ymm3, %ymm13, %ymm13
	LONG $0xd41d41c4; BYTE $0xe5   // vpaddq	%ymm13, %ymm12, %ymm12
	LONG $0x731dc1c4; WORD $0x20f4 // vpsllq	$32, %ymm12, %ymm12
	LONG $0xdbf425c5               // vpmuludq	%ymm3, %ymm11, %ymm11
	LONG $0xd42541c4; BYTE $0xdc   // vpaddq	%ymm12, %ymm11, %ymm11
	LONG $0x733dc1c4; WORD $0x38d0 // vpsrlq	$56, %ymm8, %ymm8
	LONG $0xe4d4bdc5               // vpaddq	%ymm4, %ymm8, %ymm4
	LONG $0x733dc1c4; WORD $0x38d1 // vpsrlq	$56, %ymm9, %ymm8
	LONG $0xedd4bdc5               // vpaddq	%ymm5, %ymm8, %ymm5
	LONG $0x733dc1c4; WORD $0x38d2 // vpsrlq	$56, %ymm10, %ymm8
	LONG $0xf6d4bdc5               // vpaddq	%ymm6, %ymm8, %ymm6
	LONG $0x733dc1c4; WORD $0x38d3 // vpsrlq	$56, %ymm11, %ymm8
	LONG $0xffd4bdc5               // vpaddq	%ymm7, %ymm8, %ymm7
	LONG $0x80eb8348               // subq	$-128, %rbx
	WORD $0x3948; BYTE $0xd9       // cmpq	%rbx, %rcx
	JNE  LBB0_13
	LONG $0xc4d4d5c5               // vpaddq	%ymm4, %ymm5, %ymm0
	LONG $0xc0d4cdc5               // vpaddq	%ymm0, %ymm6, %ymm0
	LONG $0xc0d4c5c5               // vpaddq	%ymm0, %ymm7, %ymm0
	LONG $0x397de3c4; WORD $0x01c1 // vextracti128	$1, %ymm0, %xmm1
	LONG $0xc1d4f9c5               // vpaddq	%xmm1, %xmm0, %xmm0
	LONG $0xc870f9c5; BYTE $0xee   // vpshufd	$238, %xmm0, %xmm1              # xmm1 = xmm0[2,3,2,3]
	LONG $0xc1d4f9c5               // vpaddq	%xmm1, %xmm0, %xmm0
	LONG $0x7ef9c1c4; BYTE $0xc7   // vmovq	%xmm0, %r15
	WORD $0x3949; BYTE $0xd4       // cmpq	%rdx, %r12
	LONG $0x24248b4c               // movq	(%rsp), %r12                    # 8-byte Reload
	JE   LBB0_22

LBB0_15:
	WORD $0xc089 // movl	%eax, %eax
	WORD $0xf631 // xorl	%esi, %esi

LBB0_16:
	LONG $0xf63c8b49             // movq	(%r14,%rsi,8), %rdi
	LONG $0xf57c3349; BYTE $0x00 // xorq	(%r13,%rsi,8), %rdi
	WORD $0x894c; BYTE $0xc3     // movq	%r8, %rbx
	WORD $0x2148; BYTE $0xfb     // andq	%rdi, %rbx
	WORD $0xd148; BYTE $0xef     // shrq	%rdi
	WORD $0x214c; BYTE $0xc7     // andq	%r8, %rdi
	WORD $0x0148; BYTE $0xdf     // addq	%rbx, %rdi
	WORD $0x8948; BYTE $0xfb     // movq	%rdi, %rbx
	WORD $0x214c; BYTE $0xd3     // andq	%r10, %rbx
	LONG $0x02efc148             // shrq	$2, %rdi
	WORD $0x214c; BYTE $0xd7     // andq	%r10, %rdi
	WORD $0x0148; BYTE $0xdf     // addq	%rbx, %rdi
	WORD $0x8948; BYTE $0xfb     // movq	%rdi, %rbx
	WORD $0x214c; BYTE $0xdb     // andq	%r11, %rbx
	LONG $0x04efc148             // shrq	$4, %rdi
	WORD $0x214c; BYTE $0xdf     // andq	%r11, %rdi
	WORD $0x0148; BYTE $0xdf     // addq	%rbx, %rdi
	LONG $0xf9af0f49             // imulq	%r9, %rdi
	LONG $0x38efc148             // shrq	$56, %rdi
	WORD $0x0149; BYTE $0xff     // addq	%rdi, %r15
	LONG $0x01c68348             // addq	$1, %rsi
	WORD $0xf039                 // cmpl	%esi, %eax
	JNE  LBB0_16
	JMP  LBB0_22

LBB0_17:
	WORD $0x894d; BYTE $0xe5               // movq	%r12, %r13
	LONG $0x01c28348                       // addq	$1, %rdx
	QUAD $0x0001fffffff0bc49; WORD $0x0000 // movabsq	$8589934576, %r12               # imm = 0x1FFFFFFF0
	LONG $0x08cc8349                       // orq	$8, %r12
	WORD $0x2149; BYTE $0xd4               // andq	%rdx, %r12
	LONG $0xe71c8d4e                       // leaq	(%rdi,%r12,8), %r11
	LONG $0xe6348d4e                       // leaq	(%rsi,%r12,8), %r14
	WORD $0x2944; BYTE $0xe0               // subl	%r12d, %eax
	LONG $0x6ef9c1c4; BYTE $0xc7           // vmovq	%r15, %xmm0
	LONG $0x6ef9c1c4; BYTE $0xca           // vmovq	%r10, %xmm1
	LONG $0x597de2c4; BYTE $0xc9           // vpbroadcastq	%xmm1, %ymm1
	LONG $0x6ef9c1c4; BYTE $0xd0           // vmovq	%r8, %xmm2
	LONG $0x597de2c4; BYTE $0xd2           // vpbroadcastq	%xmm2, %ymm2
	LONG $0x6ef9e1c4; BYTE $0xdb           // vmovq	%rbx, %xmm3
	LONG $0x597de2c4; BYTE $0xdb           // vpbroadcastq	%xmm3, %ymm3
	LONG $0x6ef9c1c4; BYTE $0xe1           // vmovq	%r9, %xmm4
	LONG $0x597de2c4; BYTE $0xec           // vpbroadcastq	%xmm4, %ymm5
	LONG $0xe4efd9c5                       // vpxor	%xmm4, %xmm4, %xmm4
	WORD $0xc931                           // xorl	%ecx, %ecx
	LONG $0xd573cdc5; BYTE $0x20           // vpsrlq	$32, %ymm5, %ymm6

LBB0_18:
	LONG $0x3c6ffec5; BYTE $0xce   // vmovdqu	(%rsi,%rcx,8), %ymm7
	LONG $0x446f7ec5; WORD $0x20ce // vmovdqu	32(%rsi,%rcx,8), %ymm8
	LONG $0x3cefc5c5; BYTE $0xcf   // vpxor	(%rdi,%rcx,8), %ymm7, %ymm7
	LONG $0x44ef3dc5; WORD $0x20cf // vpxor	32(%rdi,%rcx,8), %ymm8, %ymm8
	LONG $0xcfdb75c5               // vpand	%ymm7, %ymm1, %ymm9
	LONG $0xd1db3dc5               // vpand	%ymm1, %ymm8, %ymm10
	LONG $0xd773c5c5; BYTE $0x01   // vpsrlq	$1, %ymm7, %ymm7
	LONG $0x733dc1c4; WORD $0x01d0 // vpsrlq	$1, %ymm8, %ymm8
	LONG $0xf9dbc5c5               // vpand	%ymm1, %ymm7, %ymm7
	LONG $0xffd4b5c5               // vpaddq	%ymm7, %ymm9, %ymm7
	LONG $0xc1db3dc5               // vpand	%ymm1, %ymm8, %ymm8
	LONG $0xd43d41c4; BYTE $0xc2   // vpaddq	%ymm10, %ymm8, %ymm8
	LONG $0xcadb45c5               // vpand	%ymm2, %ymm7, %ymm9
	LONG $0xd2db3dc5               // vpand	%ymm2, %ymm8, %ymm10
	LONG $0xd773c5c5; BYTE $0x02   // vpsrlq	$2, %ymm7, %ymm7
	LONG $0x733dc1c4; WORD $0x02d0 // vpsrlq	$2, %ymm8, %ymm8
	LONG $0xfadbc5c5               // vpand	%ymm2, %ymm7, %ymm7
	LONG $0xffd4b5c5               // vpaddq	%ymm7, %ymm9, %ymm7
	LONG $0xc2db3dc5               // vpand	%ymm2, %ymm8, %ymm8
	LONG $0xd43d41c4; BYTE $0xc2   // vpaddq	%ymm10, %ymm8, %ymm8
	LONG $0xcbdb45c5               // vpand	%ymm3, %ymm7, %ymm9
	LONG $0xd3db3dc5               // vpand	%ymm3, %ymm8, %ymm10
	LONG $0xd773c5c5; BYTE $0x04   // vpsrlq	$4, %ymm7, %ymm7
	LONG $0x733dc1c4; WORD $0x04d0 // vpsrlq	$4, %ymm8, %ymm8
	LONG $0xfbdbc5c5               // vpand	%ymm3, %ymm7, %ymm7
	LONG $0xffd4b5c5               // vpaddq	%ymm7, %ymm9, %ymm7
	LONG $0xc3db3dc5               // vpand	%ymm3, %ymm8, %ymm8
	LONG $0xd43d41c4; BYTE $0xc2   // vpaddq	%ymm10, %ymm8, %ymm8
	LONG $0xcef445c5               // vpmuludq	%ymm6, %ymm7, %ymm9
	LONG $0xd773adc5; BYTE $0x20   // vpsrlq	$32, %ymm7, %ymm10
	LONG $0xd5f42dc5               // vpmuludq	%ymm5, %ymm10, %ymm10
	LONG $0xd43541c4; BYTE $0xca   // vpaddq	%ymm10, %ymm9, %ymm9
	LONG $0x7335c1c4; WORD $0x20f1 // vpsllq	$32, %ymm9, %ymm9
	LONG $0xfdf4c5c5               // vpmuludq	%ymm5, %ymm7, %ymm7
	LONG $0xffd4b5c5               // vpaddq	%ymm7, %ymm9, %ymm7
	LONG $0xcef43dc5               // vpmuludq	%ymm6, %ymm8, %ymm9
	LONG $0x732dc1c4; WORD $0x20d0 // vpsrlq	$32, %ymm8, %ymm10
	LONG $0xd5f42dc5               // vpmuludq	%ymm5, %ymm10, %ymm10
	LONG $0xd43541c4; BYTE $0xca   // vpaddq	%ymm10, %ymm9, %ymm9
	LONG $0x7335c1c4; WORD $0x20f1 // vpsllq	$32, %ymm9, %ymm9
	LONG $0xc5f43dc5               // vpmuludq	%ymm5, %ymm8, %ymm8
	LONG $0xd43d41c4; BYTE $0xc1   // vpaddq	%ymm9, %ymm8, %ymm8
	LONG $0xd773c5c5; BYTE $0x38   // vpsrlq	$56, %ymm7, %ymm7
	LONG $0xc0d4c5c5               // vpaddq	%ymm0, %ymm7, %ymm0
	LONG $0x7345c1c4; WORD $0x38d0 // vpsrlq	$56, %ymm8, %ymm7
	LONG $0xe4d4c5c5               // vpaddq	%ymm4, %ymm7, %ymm4
	LONG $0x08c18348               // addq	$8, %rcx
	WORD $0x3949; BYTE $0xcc       // cmpq	%rcx, %r12
	JNE  LBB0_18
	LONG $0xc0d4ddc5               // vpaddq	%ymm0, %ymm4, %ymm0
	LONG $0x397de3c4; WORD $0x01c1 // vextracti128	$1, %ymm0, %xmm1
	LONG $0xc1d4f9c5               // vpaddq	%xmm1, %xmm0, %xmm0
	LONG $0xc870f9c5; BYTE $0xee   // vpshufd	$238, %xmm0, %xmm1              # xmm1 = xmm0[2,3,2,3]
	LONG $0xc1d4f9c5               // vpaddq	%xmm1, %xmm0, %xmm0
	LONG $0x7ef9c1c4; BYTE $0xc7   // vmovq	%xmm0, %r15
	WORD $0x394c; BYTE $0xe2       // cmpq	%r12, %rdx
	WORD $0x894d; BYTE $0xec       // movq	%r13, %r12
	JE   LBB0_22

LBB0_20:
	WORD $0xc089 // movl	%eax, %eax
	WORD $0xf631 // xorl	%esi, %esi

LBB0_21:
	LONG $0xf63c8b49         // movq	(%r14,%rsi,8), %rdi
	LONG $0xf33c3349         // xorq	(%r11,%rsi,8), %rdi
	WORD $0x894c; BYTE $0xd1 // movq	%r10, %rcx
	WORD $0x2148; BYTE $0xf9 // andq	%rdi, %rcx
	WORD $0xd148; BYTE $0xef // shrq	%rdi
	WORD $0x214c; BYTE $0xd7 // andq	%r10, %rdi
	WORD $0x0148; BYTE $0xcf // addq	%rcx, %rdi
	WORD $0x8948; BYTE $0xf9 // movq	%rdi, %rcx
	WORD $0x214c; BYTE $0xc1 // andq	%r8, %rcx
	LONG $0x02efc148         // shrq	$2, %rdi
	WORD $0x214c; BYTE $0xc7 // andq	%r8, %rdi
	WORD $0x0148; BYTE $0xcf // addq	%rcx, %rdi
	WORD $0x8948; BYTE $0xf9 // movq	%rdi, %rcx
	WORD $0x2148; BYTE $0xd9 // andq	%rbx, %rcx
	LONG $0x04efc148         // shrq	$4, %rdi
	WORD $0x2148; BYTE $0xdf // andq	%rbx, %rdi
	WORD $0x0148; BYTE $0xcf // addq	%rcx, %rdi
	LONG $0xf9af0f49         // imulq	%r9, %rdi
	LONG $0x38efc148         // shrq	$56, %rdi
	WORD $0x0149; BYTE $0xff // addq	%rdi, %r15
	LONG $0x01c68348         // addq	$1, %rsi
	WORD $0xf039             // cmpl	%esi, %eax
	JNE  LBB0_21

LBB0_22:
	LONG $0x243c894d         // movq	%r15, (%r12)
	LONG $0xd8658d48         // leaq	-40(%rbp), %rsp
	BYTE $0x5b               // popq	%rbx
	WORD $0x5c41             // popq	%r12
	WORD $0x5d41             // popq	%r13
	WORD $0x5e41             // popq	%r14
	WORD $0x5f41             // popq	%r15
	BYTE $0x5d               // popq	%rbp
	WORD $0xf8c5; BYTE $0x77 // vzeroupper
	BYTE $0xc3               // retq
