/* aes_gcm_x86_asm
 *
 * Copyright (C) 2006-2022 wolfSSL Inc.
 *
 * This file is part of wolfSSL.
 *
 * wolfSSL is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * wolfSSL is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
 */

#ifdef WOLFSSL_USER_SETTINGS
#include "wolfssl/wolfcrypt/settings.h"
#endif

#ifndef HAVE_INTEL_AVX1
#define HAVE_INTEL_AVX1
#endif /* HAVE_INTEL_AVX1 */
#ifndef NO_AVX2_SUPPORT
#define HAVE_INTEL_AVX2
#endif /* NO_AVX2_SUPPORT */

.type	data, @object
L_aes_gcm_one:
.long	0x0,0x0,0x1,0x0
.type	data, @object
L_aes_gcm_two:
.long	0x0,0x0,0x2,0x0
.type	data, @object
L_aes_gcm_three:
.long	0x0,0x0,0x3,0x0
.type	data, @object
L_aes_gcm_four:
.long	0x0,0x0,0x4,0x0
.type	data, @object
L_aes_gcm_bswap_epi64:
.long	0x4050607,0x10203,0xc0d0e0f,0x8090a0b
.type	data, @object
L_aes_gcm_bswap_mask:
.long	0xc0d0e0f,0x8090a0b,0x4050607,0x10203
.type	data, @object
L_aes_gcm_mod2_128:
.long	0x1,0x0,0x0,0xc2000000
.type	data, @object
L_aes_gcm_avx1_one:
.long	0x0,0x0,0x1,0x0
.type	data, @object
L_aes_gcm_avx1_two:
.long	0x0,0x0,0x2,0x0
.type	data, @object
L_aes_gcm_avx1_three:
.long	0x0,0x0,0x3,0x0
.type	data, @object
L_aes_gcm_avx1_four:
.long	0x0,0x0,0x4,0x0
.type	data, @object
L_aes_gcm_avx1_bswap_epi64:
.long	0x4050607,0x10203,0xc0d0e0f,0x8090a0b
.type	data, @object
L_aes_gcm_avx1_bswap_mask:
.long	0xc0d0e0f,0x8090a0b,0x4050607,0x10203
.type	data, @object
L_aes_gcm_avx1_mod2_128:
.long	0x1,0x0,0x0,0xc2000000
.type	data, @object
L_aes_gcm_avx2_one:
.long	0x0,0x0,0x1,0x0
.type	data, @object
L_aes_gcm_avx2_two:
.long	0x0,0x0,0x2,0x0
.type	data, @object
L_aes_gcm_avx2_three:
.long	0x0,0x0,0x3,0x0
.type	data, @object
L_aes_gcm_avx2_four:
.long	0x0,0x0,0x4,0x0
.type	data, @object
L_avx2_aes_gcm_bswap_one:
.long	0x0,0x0,0x0,0x1000000
.type	data, @object
L_aes_gcm_avx2_bswap_epi64:
.long	0x4050607,0x10203,0xc0d0e0f,0x8090a0b
.type	data, @object
L_aes_gcm_avx2_bswap_mask:
.long	0xc0d0e0f,0x8090a0b,0x4050607,0x10203
.type	data, @object
L_aes_gcm_avx2_mod2_128:
.long	0x1,0x0,0x0,0xc2000000
.text
.globl	AES_GCM_encrypt
.type	AES_GCM_encrypt,@function
.align	16
AES_GCM_encrypt:
        pushl	%ebx
        pushl	%esi
        pushl	%edi
        pushl	%ebp
        subl	$0x70, %esp
        movl	144(%esp), %esi
        movl	168(%esp), %ebp
        movl	160(%esp), %edx
        pxor	%xmm0, %xmm0
        pxor	%xmm2, %xmm2
        cmpl	$12, %edx
        jne	L_AES_GCM_encrypt_iv_not_12
        # # Calculate values when IV is 12 bytes
        # Set counter based on IV
        movl	$0x1000000, %ecx
        pinsrd	$0x00, (%esi), %xmm0
        pinsrd	$0x01, 4(%esi), %xmm0
        pinsrd	$2, 8(%esi), %xmm0
        pinsrd	$3, %ecx, %xmm0
        # H = Encrypt X(=0) and T = Encrypt counter
        movdqa	%xmm0, %xmm5
        movdqa	(%ebp), %xmm1
        pxor	%xmm1, %xmm5
        movdqa	16(%ebp), %xmm3
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        movdqa	32(%ebp), %xmm3
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        movdqa	48(%ebp), %xmm3
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        movdqa	64(%ebp), %xmm3
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        movdqa	80(%ebp), %xmm3
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        movdqa	96(%ebp), %xmm3
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        movdqa	112(%ebp), %xmm3
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        movdqa	128(%ebp), %xmm3
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        movdqa	144(%ebp), %xmm3
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        cmpl	$11, 172(%esp)
        movdqa	160(%ebp), %xmm3
        jl	L_AES_GCM_encrypt_calc_iv_12_last
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        movdqa	176(%ebp), %xmm3
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        cmpl	$13, 172(%esp)
        movdqa	192(%ebp), %xmm3
        jl	L_AES_GCM_encrypt_calc_iv_12_last
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        movdqa	208(%ebp), %xmm3
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        movdqa	224(%ebp), %xmm3
L_AES_GCM_encrypt_calc_iv_12_last:
        aesenclast	%xmm3, %xmm1
        aesenclast	%xmm3, %xmm5
        pshufb	L_aes_gcm_bswap_mask, %xmm1
        movdqu	%xmm5, 80(%esp)
        jmp	L_AES_GCM_encrypt_iv_done
L_AES_GCM_encrypt_iv_not_12:
        # Calculate values when IV is not 12 bytes
        # H = Encrypt X(=0)
        movdqa	(%ebp), %xmm1
        aesenc	16(%ebp), %xmm1
        aesenc	32(%ebp), %xmm1
        aesenc	48(%ebp), %xmm1
        aesenc	64(%ebp), %xmm1
        aesenc	80(%ebp), %xmm1
        aesenc	96(%ebp), %xmm1
        aesenc	112(%ebp), %xmm1
        aesenc	128(%ebp), %xmm1
        aesenc	144(%ebp), %xmm1
        cmpl	$11, 172(%esp)
        movdqa	160(%ebp), %xmm5
        jl	L_AES_GCM_encrypt_calc_iv_1_aesenc_avx_last
        aesenc	%xmm5, %xmm1
        aesenc	176(%ebp), %xmm1
        cmpl	$13, 172(%esp)
        movdqa	192(%ebp), %xmm5
        jl	L_AES_GCM_encrypt_calc_iv_1_aesenc_avx_last
        aesenc	%xmm5, %xmm1
        aesenc	208(%ebp), %xmm1
        movdqa	224(%ebp), %xmm5
L_AES_GCM_encrypt_calc_iv_1_aesenc_avx_last:
        aesenclast	%xmm5, %xmm1
        pshufb	L_aes_gcm_bswap_mask, %xmm1
        # Calc counter
        # Initialization vector
        cmpl	$0x00, %edx
        movl	$0x00, %ecx
        je	L_AES_GCM_encrypt_calc_iv_done
        cmpl	$16, %edx
        jl	L_AES_GCM_encrypt_calc_iv_lt16
        andl	$0xfffffff0, %edx
L_AES_GCM_encrypt_calc_iv_16_loop:
        movdqu	(%esi,%ecx,1), %xmm4
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        pxor	%xmm4, %xmm0
        pshufd	$0x4e, %xmm0, %xmm5
        pshufd	$0x4e, %xmm1, %xmm6
        movdqa	%xmm1, %xmm7
        movdqa	%xmm1, %xmm4
        pclmulqdq	$0x11, %xmm0, %xmm7
        pclmulqdq	$0x00, %xmm0, %xmm4
        pxor	%xmm0, %xmm5
        pxor	%xmm1, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        movdqa	%xmm4, %xmm3
        movdqa	%xmm7, %xmm0
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm3
        pxor	%xmm5, %xmm0
        movdqa	%xmm3, %xmm4
        movdqa	%xmm0, %xmm5
        psrld	$31, %xmm4
        psrld	$31, %xmm5
        pslld	$0x01, %xmm3
        pslld	$0x01, %xmm0
        movdqa	%xmm4, %xmm6
        pslldq	$4, %xmm4
        psrldq	$12, %xmm6
        pslldq	$4, %xmm5
        por	%xmm6, %xmm0
        por	%xmm4, %xmm3
        por	%xmm5, %xmm0
        movdqa	%xmm3, %xmm4
        movdqa	%xmm3, %xmm5
        movdqa	%xmm3, %xmm6
        pslld	$31, %xmm4
        pslld	$30, %xmm5
        pslld	$25, %xmm6
        pxor	%xmm5, %xmm4
        pxor	%xmm6, %xmm4
        movdqa	%xmm4, %xmm5
        psrldq	$4, %xmm5
        pslldq	$12, %xmm4
        pxor	%xmm4, %xmm3
        movdqa	%xmm3, %xmm6
        movdqa	%xmm3, %xmm7
        movdqa	%xmm3, %xmm4
        psrld	$0x01, %xmm6
        psrld	$2, %xmm7
        psrld	$7, %xmm4
        pxor	%xmm7, %xmm6
        pxor	%xmm4, %xmm6
        pxor	%xmm5, %xmm6
        pxor	%xmm3, %xmm6
        pxor	%xmm6, %xmm0
        addl	$16, %ecx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_encrypt_calc_iv_16_loop
        movl	160(%esp), %edx
        cmpl	%edx, %ecx
        je	L_AES_GCM_encrypt_calc_iv_done
L_AES_GCM_encrypt_calc_iv_lt16:
        subl	$16, %esp
        pxor	%xmm4, %xmm4
        xorl	%ebx, %ebx
        movdqu	%xmm4, (%esp)
L_AES_GCM_encrypt_calc_iv_loop:
        movzbl	(%esi,%ecx,1), %eax
        movb	%al, (%esp,%ebx,1)
        incl	%ecx
        incl	%ebx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_encrypt_calc_iv_loop
        movdqu	(%esp), %xmm4
        addl	$16, %esp
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        pxor	%xmm4, %xmm0
        pshufd	$0x4e, %xmm0, %xmm5
        pshufd	$0x4e, %xmm1, %xmm6
        movdqa	%xmm1, %xmm7
        movdqa	%xmm1, %xmm4
        pclmulqdq	$0x11, %xmm0, %xmm7
        pclmulqdq	$0x00, %xmm0, %xmm4
        pxor	%xmm0, %xmm5
        pxor	%xmm1, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        movdqa	%xmm4, %xmm3
        movdqa	%xmm7, %xmm0
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm3
        pxor	%xmm5, %xmm0
        movdqa	%xmm3, %xmm4
        movdqa	%xmm0, %xmm5
        psrld	$31, %xmm4
        psrld	$31, %xmm5
        pslld	$0x01, %xmm3
        pslld	$0x01, %xmm0
        movdqa	%xmm4, %xmm6
        pslldq	$4, %xmm4
        psrldq	$12, %xmm6
        pslldq	$4, %xmm5
        por	%xmm6, %xmm0
        por	%xmm4, %xmm3
        por	%xmm5, %xmm0
        movdqa	%xmm3, %xmm4
        movdqa	%xmm3, %xmm5
        movdqa	%xmm3, %xmm6
        pslld	$31, %xmm4
        pslld	$30, %xmm5
        pslld	$25, %xmm6
        pxor	%xmm5, %xmm4
        pxor	%xmm6, %xmm4
        movdqa	%xmm4, %xmm5
        psrldq	$4, %xmm5
        pslldq	$12, %xmm4
        pxor	%xmm4, %xmm3
        movdqa	%xmm3, %xmm6
        movdqa	%xmm3, %xmm7
        movdqa	%xmm3, %xmm4
        psrld	$0x01, %xmm6
        psrld	$2, %xmm7
        psrld	$7, %xmm4
        pxor	%xmm7, %xmm6
        pxor	%xmm4, %xmm6
        pxor	%xmm5, %xmm6
        pxor	%xmm3, %xmm6
        pxor	%xmm6, %xmm0
L_AES_GCM_encrypt_calc_iv_done:
        # T = Encrypt counter
        pxor	%xmm4, %xmm4
        shll	$3, %edx
        pinsrd	$0x00, %edx, %xmm4
        pxor	%xmm4, %xmm0
        pshufd	$0x4e, %xmm0, %xmm5
        pshufd	$0x4e, %xmm1, %xmm6
        movdqa	%xmm1, %xmm7
        movdqa	%xmm1, %xmm4
        pclmulqdq	$0x11, %xmm0, %xmm7
        pclmulqdq	$0x00, %xmm0, %xmm4
        pxor	%xmm0, %xmm5
        pxor	%xmm1, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        movdqa	%xmm4, %xmm3
        movdqa	%xmm7, %xmm0
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm3
        pxor	%xmm5, %xmm0
        movdqa	%xmm3, %xmm4
        movdqa	%xmm0, %xmm5
        psrld	$31, %xmm4
        psrld	$31, %xmm5
        pslld	$0x01, %xmm3
        pslld	$0x01, %xmm0
        movdqa	%xmm4, %xmm6
        pslldq	$4, %xmm4
        psrldq	$12, %xmm6
        pslldq	$4, %xmm5
        por	%xmm6, %xmm0
        por	%xmm4, %xmm3
        por	%xmm5, %xmm0
        movdqa	%xmm3, %xmm4
        movdqa	%xmm3, %xmm5
        movdqa	%xmm3, %xmm6
        pslld	$31, %xmm4
        pslld	$30, %xmm5
        pslld	$25, %xmm6
        pxor	%xmm5, %xmm4
        pxor	%xmm6, %xmm4
        movdqa	%xmm4, %xmm5
        psrldq	$4, %xmm5
        pslldq	$12, %xmm4
        pxor	%xmm4, %xmm3
        movdqa	%xmm3, %xmm6
        movdqa	%xmm3, %xmm7
        movdqa	%xmm3, %xmm4
        psrld	$0x01, %xmm6
        psrld	$2, %xmm7
        psrld	$7, %xmm4
        pxor	%xmm7, %xmm6
        pxor	%xmm4, %xmm6
        pxor	%xmm5, %xmm6
        pxor	%xmm3, %xmm6
        pxor	%xmm6, %xmm0
        pshufb	L_aes_gcm_bswap_mask, %xmm0
        #   Encrypt counter
        movdqa	(%ebp), %xmm4
        pxor	%xmm0, %xmm4
        aesenc	16(%ebp), %xmm4
        aesenc	32(%ebp), %xmm4
        aesenc	48(%ebp), %xmm4
        aesenc	64(%ebp), %xmm4
        aesenc	80(%ebp), %xmm4
        aesenc	96(%ebp), %xmm4
        aesenc	112(%ebp), %xmm4
        aesenc	128(%ebp), %xmm4
        aesenc	144(%ebp), %xmm4
        cmpl	$11, 172(%esp)
        movdqa	160(%ebp), %xmm5
        jl	L_AES_GCM_encrypt_calc_iv_2_aesenc_avx_last
        aesenc	%xmm5, %xmm4
        aesenc	176(%ebp), %xmm4
        cmpl	$13, 172(%esp)
        movdqa	192(%ebp), %xmm5
        jl	L_AES_GCM_encrypt_calc_iv_2_aesenc_avx_last
        aesenc	%xmm5, %xmm4
        aesenc	208(%ebp), %xmm4
        movdqa	224(%ebp), %xmm5
L_AES_GCM_encrypt_calc_iv_2_aesenc_avx_last:
        aesenclast	%xmm5, %xmm4
        movdqu	%xmm4, 80(%esp)
L_AES_GCM_encrypt_iv_done:
        movl	140(%esp), %esi
        # Additional authentication data
        movl	156(%esp), %edx
        cmpl	$0x00, %edx
        je	L_AES_GCM_encrypt_calc_aad_done
        xorl	%ecx, %ecx
        cmpl	$16, %edx
        jl	L_AES_GCM_encrypt_calc_aad_lt16
        andl	$0xfffffff0, %edx
L_AES_GCM_encrypt_calc_aad_16_loop:
        movdqu	(%esi,%ecx,1), %xmm4
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        pxor	%xmm4, %xmm2
        pshufd	$0x4e, %xmm2, %xmm5
        pshufd	$0x4e, %xmm1, %xmm6
        movdqa	%xmm1, %xmm7
        movdqa	%xmm1, %xmm4
        pclmulqdq	$0x11, %xmm2, %xmm7
        pclmulqdq	$0x00, %xmm2, %xmm4
        pxor	%xmm2, %xmm5
        pxor	%xmm1, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        movdqa	%xmm4, %xmm3
        movdqa	%xmm7, %xmm2
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm3
        pxor	%xmm5, %xmm2
        movdqa	%xmm3, %xmm4
        movdqa	%xmm2, %xmm5
        psrld	$31, %xmm4
        psrld	$31, %xmm5
        pslld	$0x01, %xmm3
        pslld	$0x01, %xmm2
        movdqa	%xmm4, %xmm6
        pslldq	$4, %xmm4
        psrldq	$12, %xmm6
        pslldq	$4, %xmm5
        por	%xmm6, %xmm2
        por	%xmm4, %xmm3
        por	%xmm5, %xmm2
        movdqa	%xmm3, %xmm4
        movdqa	%xmm3, %xmm5
        movdqa	%xmm3, %xmm6
        pslld	$31, %xmm4
        pslld	$30, %xmm5
        pslld	$25, %xmm6
        pxor	%xmm5, %xmm4
        pxor	%xmm6, %xmm4
        movdqa	%xmm4, %xmm5
        psrldq	$4, %xmm5
        pslldq	$12, %xmm4
        pxor	%xmm4, %xmm3
        movdqa	%xmm3, %xmm6
        movdqa	%xmm3, %xmm7
        movdqa	%xmm3, %xmm4
        psrld	$0x01, %xmm6
        psrld	$2, %xmm7
        psrld	$7, %xmm4
        pxor	%xmm7, %xmm6
        pxor	%xmm4, %xmm6
        pxor	%xmm5, %xmm6
        pxor	%xmm3, %xmm6
        pxor	%xmm6, %xmm2
        addl	$16, %ecx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_encrypt_calc_aad_16_loop
        movl	156(%esp), %edx
        cmpl	%edx, %ecx
        je	L_AES_GCM_encrypt_calc_aad_done
L_AES_GCM_encrypt_calc_aad_lt16:
        subl	$16, %esp
        pxor	%xmm4, %xmm4
        xorl	%ebx, %ebx
        movdqu	%xmm4, (%esp)
L_AES_GCM_encrypt_calc_aad_loop:
        movzbl	(%esi,%ecx,1), %eax
        movb	%al, (%esp,%ebx,1)
        incl	%ecx
        incl	%ebx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_encrypt_calc_aad_loop
        movdqu	(%esp), %xmm4
        addl	$16, %esp
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        pxor	%xmm4, %xmm2
        pshufd	$0x4e, %xmm2, %xmm5
        pshufd	$0x4e, %xmm1, %xmm6
        movdqa	%xmm1, %xmm7
        movdqa	%xmm1, %xmm4
        pclmulqdq	$0x11, %xmm2, %xmm7
        pclmulqdq	$0x00, %xmm2, %xmm4
        pxor	%xmm2, %xmm5
        pxor	%xmm1, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        movdqa	%xmm4, %xmm3
        movdqa	%xmm7, %xmm2
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm3
        pxor	%xmm5, %xmm2
        movdqa	%xmm3, %xmm4
        movdqa	%xmm2, %xmm5
        psrld	$31, %xmm4
        psrld	$31, %xmm5
        pslld	$0x01, %xmm3
        pslld	$0x01, %xmm2
        movdqa	%xmm4, %xmm6
        pslldq	$4, %xmm4
        psrldq	$12, %xmm6
        pslldq	$4, %xmm5
        por	%xmm6, %xmm2
        por	%xmm4, %xmm3
        por	%xmm5, %xmm2
        movdqa	%xmm3, %xmm4
        movdqa	%xmm3, %xmm5
        movdqa	%xmm3, %xmm6
        pslld	$31, %xmm4
        pslld	$30, %xmm5
        pslld	$25, %xmm6
        pxor	%xmm5, %xmm4
        pxor	%xmm6, %xmm4
        movdqa	%xmm4, %xmm5
        psrldq	$4, %xmm5
        pslldq	$12, %xmm4
        pxor	%xmm4, %xmm3
        movdqa	%xmm3, %xmm6
        movdqa	%xmm3, %xmm7
        movdqa	%xmm3, %xmm4
        psrld	$0x01, %xmm6
        psrld	$2, %xmm7
        psrld	$7, %xmm4
        pxor	%xmm7, %xmm6
        pxor	%xmm4, %xmm6
        pxor	%xmm5, %xmm6
        pxor	%xmm3, %xmm6
        pxor	%xmm6, %xmm2
L_AES_GCM_encrypt_calc_aad_done:
        movdqu	%xmm2, 96(%esp)
        movl	132(%esp), %esi
        movl	136(%esp), %edi
        # Calculate counter and H
        pshufb	L_aes_gcm_bswap_epi64, %xmm0
        movdqa	%xmm1, %xmm5
        paddd	L_aes_gcm_one, %xmm0
        movdqa	%xmm1, %xmm4
        movdqu	%xmm0, 64(%esp)
        psrlq	$63, %xmm5
        psllq	$0x01, %xmm4
        pslldq	$8, %xmm5
        por	%xmm5, %xmm4
        pshufd	$0xff, %xmm1, %xmm1
        psrad	$31, %xmm1
        pand	L_aes_gcm_mod2_128, %xmm1
        pxor	%xmm4, %xmm1
        xorl	%ebx, %ebx
        movl	152(%esp), %eax
        cmpl	$0x40, %eax
        jl	L_AES_GCM_encrypt_done_64
        andl	$0xffffffc0, %eax
        movdqa	%xmm2, %xmm6
        # H ^ 1
        movdqu	%xmm1, (%esp)
        # H ^ 2
        pshufd	$0x4e, %xmm1, %xmm5
        pshufd	$0x4e, %xmm1, %xmm6
        movdqa	%xmm1, %xmm7
        movdqa	%xmm1, %xmm4
        pclmulqdq	$0x11, %xmm1, %xmm7
        pclmulqdq	$0x00, %xmm1, %xmm4
        pxor	%xmm1, %xmm5
        pxor	%xmm1, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        movdqa	%xmm7, %xmm0
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm4
        pxor	%xmm5, %xmm0
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        movdqa	%xmm4, %xmm7
        pslld	$31, %xmm5
        pslld	$30, %xmm6
        pslld	$25, %xmm7
        pxor	%xmm6, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm7
        psrldq	$4, %xmm7
        pslldq	$12, %xmm5
        pxor	%xmm5, %xmm4
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        psrld	$0x01, %xmm5
        psrld	$2, %xmm6
        pxor	%xmm6, %xmm5
        pxor	%xmm4, %xmm5
        psrld	$7, %xmm4
        pxor	%xmm7, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm5, %xmm0
        movdqu	%xmm0, 16(%esp)
        # H ^ 3
        pshufd	$0x4e, %xmm1, %xmm5
        pshufd	$0x4e, %xmm0, %xmm6
        movdqa	%xmm0, %xmm7
        movdqa	%xmm0, %xmm4
        pclmulqdq	$0x11, %xmm1, %xmm7
        pclmulqdq	$0x00, %xmm1, %xmm4
        pxor	%xmm1, %xmm5
        pxor	%xmm0, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        movdqa	%xmm7, %xmm3
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm4
        pxor	%xmm5, %xmm3
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        movdqa	%xmm4, %xmm7
        pslld	$31, %xmm5
        pslld	$30, %xmm6
        pslld	$25, %xmm7
        pxor	%xmm6, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm7
        psrldq	$4, %xmm7
        pslldq	$12, %xmm5
        pxor	%xmm5, %xmm4
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        psrld	$0x01, %xmm5
        psrld	$2, %xmm6
        pxor	%xmm6, %xmm5
        pxor	%xmm4, %xmm5
        psrld	$7, %xmm4
        pxor	%xmm7, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm5, %xmm3
        movdqu	%xmm3, 32(%esp)
        # H ^ 4
        pshufd	$0x4e, %xmm0, %xmm5
        pshufd	$0x4e, %xmm0, %xmm6
        movdqa	%xmm0, %xmm7
        movdqa	%xmm0, %xmm4
        pclmulqdq	$0x11, %xmm0, %xmm7
        pclmulqdq	$0x00, %xmm0, %xmm4
        pxor	%xmm0, %xmm5
        pxor	%xmm0, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        movdqa	%xmm7, %xmm3
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm4
        pxor	%xmm5, %xmm3
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        movdqa	%xmm4, %xmm7
        pslld	$31, %xmm5
        pslld	$30, %xmm6
        pslld	$25, %xmm7
        pxor	%xmm6, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm7
        psrldq	$4, %xmm7
        pslldq	$12, %xmm5
        pxor	%xmm5, %xmm4
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        psrld	$0x01, %xmm5
        psrld	$2, %xmm6
        pxor	%xmm6, %xmm5
        pxor	%xmm4, %xmm5
        psrld	$7, %xmm4
        pxor	%xmm7, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm5, %xmm3
        movdqu	%xmm3, 48(%esp)
        # First 64 bytes of input
        # Encrypt 64 bytes of counter
        movdqu	64(%esp), %xmm4
        movdqa	L_aes_gcm_bswap_epi64, %xmm3
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        movdqa	%xmm4, %xmm7
        pshufb	%xmm3, %xmm4
        paddd	L_aes_gcm_one, %xmm5
        pshufb	%xmm3, %xmm5
        paddd	L_aes_gcm_two, %xmm6
        pshufb	%xmm3, %xmm6
        paddd	L_aes_gcm_three, %xmm7
        pshufb	%xmm3, %xmm7
        movdqu	64(%esp), %xmm3
        paddd	L_aes_gcm_four, %xmm3
        movdqu	%xmm3, 64(%esp)
        movdqa	(%ebp), %xmm3
        pxor	%xmm3, %xmm4
        pxor	%xmm3, %xmm5
        pxor	%xmm3, %xmm6
        pxor	%xmm3, %xmm7
        movdqa	16(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	32(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	48(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	64(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	80(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	96(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	112(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	128(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	144(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        cmpl	$11, 172(%esp)
        movdqa	160(%ebp), %xmm3
        jl	L_AES_GCM_encrypt_enc_done
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	176(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        cmpl	$13, 172(%esp)
        movdqa	192(%ebp), %xmm3
        jl	L_AES_GCM_encrypt_enc_done
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	208(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	224(%ebp), %xmm3
L_AES_GCM_encrypt_enc_done:
        aesenclast	%xmm3, %xmm4
        aesenclast	%xmm3, %xmm5
        movdqu	(%esi), %xmm0
        movdqu	16(%esi), %xmm1
        pxor	%xmm0, %xmm4
        pxor	%xmm1, %xmm5
        movdqu	%xmm4, (%edi)
        movdqu	%xmm5, 16(%edi)
        aesenclast	%xmm3, %xmm6
        aesenclast	%xmm3, %xmm7
        movdqu	32(%esi), %xmm0
        movdqu	48(%esi), %xmm1
        pxor	%xmm0, %xmm6
        pxor	%xmm1, %xmm7
        movdqu	%xmm6, 32(%edi)
        movdqu	%xmm7, 48(%edi)
        cmpl	$0x40, %eax
        movl	$0x40, %ebx
        movl	%esi, %ecx
        movl	%edi, %edx
        jle	L_AES_GCM_encrypt_end_64
        # More 64 bytes of input
L_AES_GCM_encrypt_ghash_64:
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        # Encrypt 64 bytes of counter
        movdqu	64(%esp), %xmm4
        movdqa	L_aes_gcm_bswap_epi64, %xmm3
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        movdqa	%xmm4, %xmm7
        pshufb	%xmm3, %xmm4
        paddd	L_aes_gcm_one, %xmm5
        pshufb	%xmm3, %xmm5
        paddd	L_aes_gcm_two, %xmm6
        pshufb	%xmm3, %xmm6
        paddd	L_aes_gcm_three, %xmm7
        pshufb	%xmm3, %xmm7
        movdqu	64(%esp), %xmm3
        paddd	L_aes_gcm_four, %xmm3
        movdqu	%xmm3, 64(%esp)
        movdqa	(%ebp), %xmm3
        pxor	%xmm3, %xmm4
        pxor	%xmm3, %xmm5
        pxor	%xmm3, %xmm6
        pxor	%xmm3, %xmm7
        movdqa	16(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	32(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	48(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	64(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	80(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	96(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	112(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	128(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	144(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        cmpl	$11, 172(%esp)
        movdqa	160(%ebp), %xmm3
        jl	L_AES_GCM_encrypt_aesenc_64_ghash_avx_done
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	176(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        cmpl	$13, 172(%esp)
        movdqa	192(%ebp), %xmm3
        jl	L_AES_GCM_encrypt_aesenc_64_ghash_avx_done
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	208(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	224(%ebp), %xmm3
L_AES_GCM_encrypt_aesenc_64_ghash_avx_done:
        aesenclast	%xmm3, %xmm4
        aesenclast	%xmm3, %xmm5
        movdqu	(%ecx), %xmm0
        movdqu	16(%ecx), %xmm1
        pxor	%xmm0, %xmm4
        pxor	%xmm1, %xmm5
        movdqu	%xmm4, (%edx)
        movdqu	%xmm5, 16(%edx)
        aesenclast	%xmm3, %xmm6
        aesenclast	%xmm3, %xmm7
        movdqu	32(%ecx), %xmm0
        movdqu	48(%ecx), %xmm1
        pxor	%xmm0, %xmm6
        pxor	%xmm1, %xmm7
        movdqu	%xmm6, 32(%edx)
        movdqu	%xmm7, 48(%edx)
        # ghash encrypted counter
        movdqu	96(%esp), %xmm6
        movdqu	48(%esp), %xmm3
        movdqu	-64(%edx), %xmm4
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        pxor	%xmm6, %xmm4
        pshufd	$0x4e, %xmm3, %xmm5
        pshufd	$0x4e, %xmm4, %xmm1
        pxor	%xmm3, %xmm5
        pxor	%xmm4, %xmm1
        movdqa	%xmm4, %xmm7
        pclmulqdq	$0x11, %xmm3, %xmm7
        movdqa	%xmm4, %xmm6
        pclmulqdq	$0x00, %xmm3, %xmm6
        pclmulqdq	$0x00, %xmm1, %xmm5
        pxor	%xmm6, %xmm5
        pxor	%xmm7, %xmm5
        movdqu	32(%esp), %xmm3
        movdqu	-48(%edx), %xmm4
        pshufd	$0x4e, %xmm3, %xmm0
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        pxor	%xmm3, %xmm0
        pshufd	$0x4e, %xmm4, %xmm1
        pxor	%xmm4, %xmm1
        movdqa	%xmm4, %xmm2
        pclmulqdq	$0x11, %xmm3, %xmm2
        pclmulqdq	$0x00, %xmm4, %xmm3
        pclmulqdq	$0x00, %xmm1, %xmm0
        pxor	%xmm3, %xmm5
        pxor	%xmm3, %xmm6
        pxor	%xmm2, %xmm5
        pxor	%xmm2, %xmm7
        pxor	%xmm0, %xmm5
        movdqu	16(%esp), %xmm3
        movdqu	-32(%edx), %xmm4
        pshufd	$0x4e, %xmm3, %xmm0
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        pxor	%xmm3, %xmm0
        pshufd	$0x4e, %xmm4, %xmm1
        pxor	%xmm4, %xmm1
        movdqa	%xmm4, %xmm2
        pclmulqdq	$0x11, %xmm3, %xmm2
        pclmulqdq	$0x00, %xmm4, %xmm3
        pclmulqdq	$0x00, %xmm1, %xmm0
        pxor	%xmm3, %xmm5
        pxor	%xmm3, %xmm6
        pxor	%xmm2, %xmm5
        pxor	%xmm2, %xmm7
        pxor	%xmm0, %xmm5
        movdqu	(%esp), %xmm3
        movdqu	-16(%edx), %xmm4
        pshufd	$0x4e, %xmm3, %xmm0
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        pxor	%xmm3, %xmm0
        pshufd	$0x4e, %xmm4, %xmm1
        pxor	%xmm4, %xmm1
        movdqa	%xmm4, %xmm2
        pclmulqdq	$0x11, %xmm3, %xmm2
        pclmulqdq	$0x00, %xmm4, %xmm3
        pclmulqdq	$0x00, %xmm1, %xmm0
        pxor	%xmm3, %xmm5
        pxor	%xmm3, %xmm6
        pxor	%xmm2, %xmm5
        pxor	%xmm2, %xmm7
        pxor	%xmm0, %xmm5
        movdqa	%xmm5, %xmm1
        psrldq	$8, %xmm5
        pslldq	$8, %xmm1
        pxor	%xmm1, %xmm6
        pxor	%xmm5, %xmm7
        movdqa	%xmm6, %xmm3
        movdqa	%xmm6, %xmm0
        movdqa	%xmm6, %xmm1
        pslld	$31, %xmm3
        pslld	$30, %xmm0
        pslld	$25, %xmm1
        pxor	%xmm0, %xmm3
        pxor	%xmm1, %xmm3
        movdqa	%xmm3, %xmm0
        pslldq	$12, %xmm3
        psrldq	$4, %xmm0
        pxor	%xmm3, %xmm6
        movdqa	%xmm6, %xmm1
        movdqa	%xmm6, %xmm5
        movdqa	%xmm6, %xmm4
        psrld	$0x01, %xmm1
        psrld	$2, %xmm5
        psrld	$7, %xmm4
        pxor	%xmm5, %xmm1
        pxor	%xmm4, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm1, %xmm6
        pxor	%xmm7, %xmm6
        movdqu	%xmm6, 96(%esp)
        addl	$0x40, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_encrypt_ghash_64
L_AES_GCM_encrypt_end_64:
        movdqu	96(%esp), %xmm2
        # Block 1
        movdqa	L_aes_gcm_bswap_mask, %xmm4
        movdqu	(%edx), %xmm1
        pshufb	%xmm4, %xmm1
        movdqu	48(%esp), %xmm3
        pxor	%xmm2, %xmm1
        pshufd	$0x4e, %xmm1, %xmm5
        pshufd	$0x4e, %xmm3, %xmm6
        movdqa	%xmm3, %xmm7
        movdqa	%xmm3, %xmm4
        pclmulqdq	$0x11, %xmm1, %xmm7
        pclmulqdq	$0x00, %xmm1, %xmm4
        pxor	%xmm1, %xmm5
        pxor	%xmm3, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        movdqa	%xmm4, %xmm0
        movdqa	%xmm7, %xmm2
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm0
        pxor	%xmm5, %xmm2
        # Block 2
        movdqa	L_aes_gcm_bswap_mask, %xmm4
        movdqu	16(%edx), %xmm1
        pshufb	%xmm4, %xmm1
        movdqu	32(%esp), %xmm3
        pshufd	$0x4e, %xmm1, %xmm5
        pshufd	$0x4e, %xmm3, %xmm6
        movdqa	%xmm3, %xmm7
        movdqa	%xmm3, %xmm4
        pclmulqdq	$0x11, %xmm1, %xmm7
        pclmulqdq	$0x00, %xmm1, %xmm4
        pxor	%xmm1, %xmm5
        pxor	%xmm3, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        pxor	%xmm4, %xmm0
        pxor	%xmm7, %xmm2
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm0
        pxor	%xmm5, %xmm2
        # Block 3
        movdqa	L_aes_gcm_bswap_mask, %xmm4
        movdqu	32(%edx), %xmm1
        pshufb	%xmm4, %xmm1
        movdqu	16(%esp), %xmm3
        pshufd	$0x4e, %xmm1, %xmm5
        pshufd	$0x4e, %xmm3, %xmm6
        movdqa	%xmm3, %xmm7
        movdqa	%xmm3, %xmm4
        pclmulqdq	$0x11, %xmm1, %xmm7
        pclmulqdq	$0x00, %xmm1, %xmm4
        pxor	%xmm1, %xmm5
        pxor	%xmm3, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        pxor	%xmm4, %xmm0
        pxor	%xmm7, %xmm2
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm0
        pxor	%xmm5, %xmm2
        # Block 4
        movdqa	L_aes_gcm_bswap_mask, %xmm4
        movdqu	48(%edx), %xmm1
        pshufb	%xmm4, %xmm1
        movdqu	(%esp), %xmm3
        pshufd	$0x4e, %xmm1, %xmm5
        pshufd	$0x4e, %xmm3, %xmm6
        movdqa	%xmm3, %xmm7
        movdqa	%xmm3, %xmm4
        pclmulqdq	$0x11, %xmm1, %xmm7
        pclmulqdq	$0x00, %xmm1, %xmm4
        pxor	%xmm1, %xmm5
        pxor	%xmm3, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        pxor	%xmm4, %xmm0
        pxor	%xmm7, %xmm2
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm0
        pxor	%xmm5, %xmm2
        movdqa	%xmm0, %xmm4
        movdqa	%xmm0, %xmm5
        movdqa	%xmm0, %xmm6
        pslld	$31, %xmm4
        pslld	$30, %xmm5
        pslld	$25, %xmm6
        pxor	%xmm5, %xmm4
        pxor	%xmm6, %xmm4
        movdqa	%xmm4, %xmm5
        psrldq	$4, %xmm5
        pslldq	$12, %xmm4
        pxor	%xmm4, %xmm0
        movdqa	%xmm0, %xmm6
        movdqa	%xmm0, %xmm7
        movdqa	%xmm0, %xmm4
        psrld	$0x01, %xmm6
        psrld	$2, %xmm7
        psrld	$7, %xmm4
        pxor	%xmm7, %xmm6
        pxor	%xmm4, %xmm6
        pxor	%xmm5, %xmm6
        pxor	%xmm0, %xmm6
        pxor	%xmm6, %xmm2
        movdqu	(%esp), %xmm1
L_AES_GCM_encrypt_done_64:
        movl	152(%esp), %edx
        cmpl	%edx, %ebx
        jge	L_AES_GCM_encrypt_done_enc
        movl	152(%esp), %eax
        andl	$0xfffffff0, %eax
        cmpl	%eax, %ebx
        jge	L_AES_GCM_encrypt_last_block_done
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        movdqu	64(%esp), %xmm4
        movdqa	%xmm4, %xmm5
        pshufb	L_aes_gcm_bswap_epi64, %xmm4
        paddd	L_aes_gcm_one, %xmm5
        pxor	(%ebp), %xmm4
        movdqu	%xmm5, 64(%esp)
        aesenc	16(%ebp), %xmm4
        aesenc	32(%ebp), %xmm4
        aesenc	48(%ebp), %xmm4
        aesenc	64(%ebp), %xmm4
        aesenc	80(%ebp), %xmm4
        aesenc	96(%ebp), %xmm4
        aesenc	112(%ebp), %xmm4
        aesenc	128(%ebp), %xmm4
        aesenc	144(%ebp), %xmm4
        cmpl	$11, 172(%esp)
        movdqa	160(%ebp), %xmm5
        jl	L_AES_GCM_encrypt_aesenc_block_aesenc_avx_last
        aesenc	%xmm5, %xmm4
        aesenc	176(%ebp), %xmm4
        cmpl	$13, 172(%esp)
        movdqa	192(%ebp), %xmm5
        jl	L_AES_GCM_encrypt_aesenc_block_aesenc_avx_last
        aesenc	%xmm5, %xmm4
        aesenc	208(%ebp), %xmm4
        movdqa	224(%ebp), %xmm5
L_AES_GCM_encrypt_aesenc_block_aesenc_avx_last:
        aesenclast	%xmm5, %xmm4
        movdqu	(%ecx), %xmm5
        pxor	%xmm5, %xmm4
        movdqu	%xmm4, (%edx)
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        pxor	%xmm4, %xmm2
        addl	$16, %ebx
        cmpl	%eax, %ebx
        jge	L_AES_GCM_encrypt_last_block_ghash
L_AES_GCM_encrypt_last_block_start:
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        movdqu	64(%esp), %xmm4
        movdqa	%xmm4, %xmm5
        pshufb	L_aes_gcm_bswap_epi64, %xmm4
        paddd	L_aes_gcm_one, %xmm5
        pxor	(%ebp), %xmm4
        movdqu	%xmm5, 64(%esp)
        movdqu	%xmm2, %xmm0
        pclmulqdq	$16, %xmm1, %xmm0
        aesenc	16(%ebp), %xmm4
        aesenc	32(%ebp), %xmm4
        movdqu	%xmm2, %xmm3
        pclmulqdq	$0x01, %xmm1, %xmm3
        aesenc	48(%ebp), %xmm4
        aesenc	64(%ebp), %xmm4
        aesenc	80(%ebp), %xmm4
        movdqu	%xmm2, %xmm5
        pclmulqdq	$0x11, %xmm1, %xmm5
        aesenc	96(%ebp), %xmm4
        pxor	%xmm3, %xmm0
        movdqa	%xmm0, %xmm6
        psrldq	$8, %xmm0
        pslldq	$8, %xmm6
        aesenc	112(%ebp), %xmm4
        movdqu	%xmm2, %xmm3
        pclmulqdq	$0x00, %xmm1, %xmm3
        pxor	%xmm3, %xmm6
        pxor	%xmm0, %xmm5
        movdqa	L_aes_gcm_mod2_128, %xmm7
        movdqa	%xmm6, %xmm3
        pclmulqdq	$16, %xmm7, %xmm3
        aesenc	128(%ebp), %xmm4
        pshufd	$0x4e, %xmm6, %xmm0
        pxor	%xmm3, %xmm0
        movdqa	%xmm0, %xmm3
        pclmulqdq	$16, %xmm7, %xmm3
        aesenc	144(%ebp), %xmm4
        pshufd	$0x4e, %xmm0, %xmm2
        pxor	%xmm3, %xmm2
        pxor	%xmm5, %xmm2
        cmpl	$11, 172(%esp)
        movdqa	160(%ebp), %xmm5
        jl	L_AES_GCM_encrypt_aesenc_gfmul_last
        aesenc	%xmm5, %xmm4
        aesenc	176(%ebp), %xmm4
        cmpl	$13, 172(%esp)
        movdqa	192(%ebp), %xmm5
        jl	L_AES_GCM_encrypt_aesenc_gfmul_last
        aesenc	%xmm5, %xmm4
        aesenc	208(%ebp), %xmm4
        movdqa	224(%ebp), %xmm5
L_AES_GCM_encrypt_aesenc_gfmul_last:
        aesenclast	%xmm5, %xmm4
        movdqu	(%ecx), %xmm5
        pxor	%xmm5, %xmm4
        movdqu	%xmm4, (%edx)
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        pxor	%xmm4, %xmm2
        addl	$16, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_encrypt_last_block_start
L_AES_GCM_encrypt_last_block_ghash:
        pshufd	$0x4e, %xmm1, %xmm5
        pshufd	$0x4e, %xmm2, %xmm6
        movdqa	%xmm2, %xmm7
        movdqa	%xmm2, %xmm4
        pclmulqdq	$0x11, %xmm1, %xmm7
        pclmulqdq	$0x00, %xmm1, %xmm4
        pxor	%xmm1, %xmm5
        pxor	%xmm2, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        movdqa	%xmm7, %xmm2
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm4
        pxor	%xmm5, %xmm2
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        movdqa	%xmm4, %xmm7
        pslld	$31, %xmm5
        pslld	$30, %xmm6
        pslld	$25, %xmm7
        pxor	%xmm6, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm7
        psrldq	$4, %xmm7
        pslldq	$12, %xmm5
        pxor	%xmm5, %xmm4
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        psrld	$0x01, %xmm5
        psrld	$2, %xmm6
        pxor	%xmm6, %xmm5
        pxor	%xmm4, %xmm5
        psrld	$7, %xmm4
        pxor	%xmm7, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm5, %xmm2
L_AES_GCM_encrypt_last_block_done:
        movl	152(%esp), %ecx
        movl	%ecx, %edx
        andl	$15, %ecx
        jz	L_AES_GCM_encrypt_aesenc_last15_enc_avx_done
        movdqu	64(%esp), %xmm0
        pshufb	L_aes_gcm_bswap_epi64, %xmm0
        pxor	(%ebp), %xmm0
        aesenc	16(%ebp), %xmm0
        aesenc	32(%ebp), %xmm0
        aesenc	48(%ebp), %xmm0
        aesenc	64(%ebp), %xmm0
        aesenc	80(%ebp), %xmm0
        aesenc	96(%ebp), %xmm0
        aesenc	112(%ebp), %xmm0
        aesenc	128(%ebp), %xmm0
        aesenc	144(%ebp), %xmm0
        cmpl	$11, 172(%esp)
        movdqa	160(%ebp), %xmm5
        jl	L_AES_GCM_encrypt_aesenc_last15_enc_avx_aesenc_avx_last
        aesenc	%xmm5, %xmm0
        aesenc	176(%ebp), %xmm0
        cmpl	$13, 172(%esp)
        movdqa	192(%ebp), %xmm5
        jl	L_AES_GCM_encrypt_aesenc_last15_enc_avx_aesenc_avx_last
        aesenc	%xmm5, %xmm0
        aesenc	208(%ebp), %xmm0
        movdqa	224(%ebp), %xmm5
L_AES_GCM_encrypt_aesenc_last15_enc_avx_aesenc_avx_last:
        aesenclast	%xmm5, %xmm0
        subl	$16, %esp
        xorl	%ecx, %ecx
        movdqu	%xmm0, (%esp)
L_AES_GCM_encrypt_aesenc_last15_enc_avx_loop:
        movzbl	(%esi,%ebx,1), %eax
        xorb	(%esp,%ecx,1), %al
        movb	%al, (%edi,%ebx,1)
        movb	%al, (%esp,%ecx,1)
        incl	%ebx
        incl	%ecx
        cmpl	%edx, %ebx
        jl	L_AES_GCM_encrypt_aesenc_last15_enc_avx_loop
        xorl	%eax, %eax
        cmpl	$16, %ecx
        je	L_AES_GCM_encrypt_aesenc_last15_enc_avx_finish_enc
L_AES_GCM_encrypt_aesenc_last15_enc_avx_byte_loop:
        movb	%al, (%esp,%ecx,1)
        incl	%ecx
        cmpl	$16, %ecx
        jl	L_AES_GCM_encrypt_aesenc_last15_enc_avx_byte_loop
L_AES_GCM_encrypt_aesenc_last15_enc_avx_finish_enc:
        movdqu	(%esp), %xmm0
        addl	$16, %esp
        pshufb	L_aes_gcm_bswap_mask, %xmm0
        pxor	%xmm0, %xmm2
        pshufd	$0x4e, %xmm1, %xmm5
        pshufd	$0x4e, %xmm2, %xmm6
        movdqa	%xmm2, %xmm7
        movdqa	%xmm2, %xmm4
        pclmulqdq	$0x11, %xmm1, %xmm7
        pclmulqdq	$0x00, %xmm1, %xmm4
        pxor	%xmm1, %xmm5
        pxor	%xmm2, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        movdqa	%xmm7, %xmm2
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm4
        pxor	%xmm5, %xmm2
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        movdqa	%xmm4, %xmm7
        pslld	$31, %xmm5
        pslld	$30, %xmm6
        pslld	$25, %xmm7
        pxor	%xmm6, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm7
        psrldq	$4, %xmm7
        pslldq	$12, %xmm5
        pxor	%xmm5, %xmm4
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        psrld	$0x01, %xmm5
        psrld	$2, %xmm6
        pxor	%xmm6, %xmm5
        pxor	%xmm4, %xmm5
        psrld	$7, %xmm4
        pxor	%xmm7, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm5, %xmm2
L_AES_GCM_encrypt_aesenc_last15_enc_avx_done:
L_AES_GCM_encrypt_done_enc:
        movl	148(%esp), %edi
        movl	164(%esp), %ebx
        movl	152(%esp), %edx
        movl	156(%esp), %ecx
        shll	$3, %edx
        shll	$3, %ecx
        pinsrd	$0x00, %edx, %xmm4
        pinsrd	$2, %ecx, %xmm4
        movl	152(%esp), %edx
        movl	156(%esp), %ecx
        shrl	$29, %edx
        shrl	$29, %ecx
        pinsrd	$0x01, %edx, %xmm4
        pinsrd	$3, %ecx, %xmm4
        pxor	%xmm4, %xmm2
        pshufd	$0x4e, %xmm1, %xmm5
        pshufd	$0x4e, %xmm2, %xmm6
        movdqa	%xmm2, %xmm7
        movdqa	%xmm2, %xmm4
        pclmulqdq	$0x11, %xmm1, %xmm7
        pclmulqdq	$0x00, %xmm1, %xmm4
        pxor	%xmm1, %xmm5
        pxor	%xmm2, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        movdqa	%xmm7, %xmm2
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm4
        pxor	%xmm5, %xmm2
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        movdqa	%xmm4, %xmm7
        pslld	$31, %xmm5
        pslld	$30, %xmm6
        pslld	$25, %xmm7
        pxor	%xmm6, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm7
        psrldq	$4, %xmm7
        pslldq	$12, %xmm5
        pxor	%xmm5, %xmm4
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        psrld	$0x01, %xmm5
        psrld	$2, %xmm6
        pxor	%xmm6, %xmm5
        pxor	%xmm4, %xmm5
        psrld	$7, %xmm4
        pxor	%xmm7, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm5, %xmm2
        pshufb	L_aes_gcm_bswap_mask, %xmm2
        movdqu	80(%esp), %xmm4
        pxor	%xmm2, %xmm4
        cmpl	$16, %ebx
        je	L_AES_GCM_encrypt_store_tag_16
        xorl	%ecx, %ecx
        movdqu	%xmm4, (%esp)
L_AES_GCM_encrypt_store_tag_loop:
        movzbl	(%esp,%ecx,1), %eax
        movb	%al, (%edi,%ecx,1)
        incl	%ecx
        cmpl	%ebx, %ecx
        jne	L_AES_GCM_encrypt_store_tag_loop
        jmp	L_AES_GCM_encrypt_store_tag_done
L_AES_GCM_encrypt_store_tag_16:
        movdqu	%xmm4, (%edi)
L_AES_GCM_encrypt_store_tag_done:
        addl	$0x70, %esp
        popl	%ebp
        popl	%edi
        popl	%esi
        popl	%ebx
        ret
.size	AES_GCM_encrypt,.-AES_GCM_encrypt
.text
.globl	AES_GCM_decrypt
.type	AES_GCM_decrypt,@function
.align	16
AES_GCM_decrypt:
        pushl	%ebx
        pushl	%esi
        pushl	%edi
        pushl	%ebp
        subl	$0xb0, %esp
        movl	208(%esp), %esi
        movl	232(%esp), %ebp
        movl	224(%esp), %edx
        pxor	%xmm0, %xmm0
        pxor	%xmm2, %xmm2
        cmpl	$12, %edx
        jne	L_AES_GCM_decrypt_iv_not_12
        # # Calculate values when IV is 12 bytes
        # Set counter based on IV
        movl	$0x1000000, %ecx
        pinsrd	$0x00, (%esi), %xmm0
        pinsrd	$0x01, 4(%esi), %xmm0
        pinsrd	$2, 8(%esi), %xmm0
        pinsrd	$3, %ecx, %xmm0
        # H = Encrypt X(=0) and T = Encrypt counter
        movdqa	%xmm0, %xmm5
        movdqa	(%ebp), %xmm1
        pxor	%xmm1, %xmm5
        movdqa	16(%ebp), %xmm3
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        movdqa	32(%ebp), %xmm3
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        movdqa	48(%ebp), %xmm3
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        movdqa	64(%ebp), %xmm3
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        movdqa	80(%ebp), %xmm3
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        movdqa	96(%ebp), %xmm3
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        movdqa	112(%ebp), %xmm3
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        movdqa	128(%ebp), %xmm3
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        movdqa	144(%ebp), %xmm3
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        cmpl	$11, 236(%esp)
        movdqa	160(%ebp), %xmm3
        jl	L_AES_GCM_decrypt_calc_iv_12_last
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        movdqa	176(%ebp), %xmm3
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        cmpl	$13, 236(%esp)
        movdqa	192(%ebp), %xmm3
        jl	L_AES_GCM_decrypt_calc_iv_12_last
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        movdqa	208(%ebp), %xmm3
        aesenc	%xmm3, %xmm1
        aesenc	%xmm3, %xmm5
        movdqa	224(%ebp), %xmm3
L_AES_GCM_decrypt_calc_iv_12_last:
        aesenclast	%xmm3, %xmm1
        aesenclast	%xmm3, %xmm5
        pshufb	L_aes_gcm_bswap_mask, %xmm1
        movdqu	%xmm5, 80(%esp)
        jmp	L_AES_GCM_decrypt_iv_done
L_AES_GCM_decrypt_iv_not_12:
        # Calculate values when IV is not 12 bytes
        # H = Encrypt X(=0)
        movdqa	(%ebp), %xmm1
        aesenc	16(%ebp), %xmm1
        aesenc	32(%ebp), %xmm1
        aesenc	48(%ebp), %xmm1
        aesenc	64(%ebp), %xmm1
        aesenc	80(%ebp), %xmm1
        aesenc	96(%ebp), %xmm1
        aesenc	112(%ebp), %xmm1
        aesenc	128(%ebp), %xmm1
        aesenc	144(%ebp), %xmm1
        cmpl	$11, 236(%esp)
        movdqa	160(%ebp), %xmm5
        jl	L_AES_GCM_decrypt_calc_iv_1_aesenc_avx_last
        aesenc	%xmm5, %xmm1
        aesenc	176(%ebp), %xmm1
        cmpl	$13, 236(%esp)
        movdqa	192(%ebp), %xmm5
        jl	L_AES_GCM_decrypt_calc_iv_1_aesenc_avx_last
        aesenc	%xmm5, %xmm1
        aesenc	208(%ebp), %xmm1
        movdqa	224(%ebp), %xmm5
L_AES_GCM_decrypt_calc_iv_1_aesenc_avx_last:
        aesenclast	%xmm5, %xmm1
        pshufb	L_aes_gcm_bswap_mask, %xmm1
        # Calc counter
        # Initialization vector
        cmpl	$0x00, %edx
        movl	$0x00, %ecx
        je	L_AES_GCM_decrypt_calc_iv_done
        cmpl	$16, %edx
        jl	L_AES_GCM_decrypt_calc_iv_lt16
        andl	$0xfffffff0, %edx
L_AES_GCM_decrypt_calc_iv_16_loop:
        movdqu	(%esi,%ecx,1), %xmm4
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        pxor	%xmm4, %xmm0
        pshufd	$0x4e, %xmm0, %xmm5
        pshufd	$0x4e, %xmm1, %xmm6
        movdqa	%xmm1, %xmm7
        movdqa	%xmm1, %xmm4
        pclmulqdq	$0x11, %xmm0, %xmm7
        pclmulqdq	$0x00, %xmm0, %xmm4
        pxor	%xmm0, %xmm5
        pxor	%xmm1, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        movdqa	%xmm4, %xmm3
        movdqa	%xmm7, %xmm0
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm3
        pxor	%xmm5, %xmm0
        movdqa	%xmm3, %xmm4
        movdqa	%xmm0, %xmm5
        psrld	$31, %xmm4
        psrld	$31, %xmm5
        pslld	$0x01, %xmm3
        pslld	$0x01, %xmm0
        movdqa	%xmm4, %xmm6
        pslldq	$4, %xmm4
        psrldq	$12, %xmm6
        pslldq	$4, %xmm5
        por	%xmm6, %xmm0
        por	%xmm4, %xmm3
        por	%xmm5, %xmm0
        movdqa	%xmm3, %xmm4
        movdqa	%xmm3, %xmm5
        movdqa	%xmm3, %xmm6
        pslld	$31, %xmm4
        pslld	$30, %xmm5
        pslld	$25, %xmm6
        pxor	%xmm5, %xmm4
        pxor	%xmm6, %xmm4
        movdqa	%xmm4, %xmm5
        psrldq	$4, %xmm5
        pslldq	$12, %xmm4
        pxor	%xmm4, %xmm3
        movdqa	%xmm3, %xmm6
        movdqa	%xmm3, %xmm7
        movdqa	%xmm3, %xmm4
        psrld	$0x01, %xmm6
        psrld	$2, %xmm7
        psrld	$7, %xmm4
        pxor	%xmm7, %xmm6
        pxor	%xmm4, %xmm6
        pxor	%xmm5, %xmm6
        pxor	%xmm3, %xmm6
        pxor	%xmm6, %xmm0
        addl	$16, %ecx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_decrypt_calc_iv_16_loop
        movl	224(%esp), %edx
        cmpl	%edx, %ecx
        je	L_AES_GCM_decrypt_calc_iv_done
L_AES_GCM_decrypt_calc_iv_lt16:
        subl	$16, %esp
        pxor	%xmm4, %xmm4
        xorl	%ebx, %ebx
        movdqu	%xmm4, (%esp)
L_AES_GCM_decrypt_calc_iv_loop:
        movzbl	(%esi,%ecx,1), %eax
        movb	%al, (%esp,%ebx,1)
        incl	%ecx
        incl	%ebx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_decrypt_calc_iv_loop
        movdqu	(%esp), %xmm4
        addl	$16, %esp
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        pxor	%xmm4, %xmm0
        pshufd	$0x4e, %xmm0, %xmm5
        pshufd	$0x4e, %xmm1, %xmm6
        movdqa	%xmm1, %xmm7
        movdqa	%xmm1, %xmm4
        pclmulqdq	$0x11, %xmm0, %xmm7
        pclmulqdq	$0x00, %xmm0, %xmm4
        pxor	%xmm0, %xmm5
        pxor	%xmm1, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        movdqa	%xmm4, %xmm3
        movdqa	%xmm7, %xmm0
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm3
        pxor	%xmm5, %xmm0
        movdqa	%xmm3, %xmm4
        movdqa	%xmm0, %xmm5
        psrld	$31, %xmm4
        psrld	$31, %xmm5
        pslld	$0x01, %xmm3
        pslld	$0x01, %xmm0
        movdqa	%xmm4, %xmm6
        pslldq	$4, %xmm4
        psrldq	$12, %xmm6
        pslldq	$4, %xmm5
        por	%xmm6, %xmm0
        por	%xmm4, %xmm3
        por	%xmm5, %xmm0
        movdqa	%xmm3, %xmm4
        movdqa	%xmm3, %xmm5
        movdqa	%xmm3, %xmm6
        pslld	$31, %xmm4
        pslld	$30, %xmm5
        pslld	$25, %xmm6
        pxor	%xmm5, %xmm4
        pxor	%xmm6, %xmm4
        movdqa	%xmm4, %xmm5
        psrldq	$4, %xmm5
        pslldq	$12, %xmm4
        pxor	%xmm4, %xmm3
        movdqa	%xmm3, %xmm6
        movdqa	%xmm3, %xmm7
        movdqa	%xmm3, %xmm4
        psrld	$0x01, %xmm6
        psrld	$2, %xmm7
        psrld	$7, %xmm4
        pxor	%xmm7, %xmm6
        pxor	%xmm4, %xmm6
        pxor	%xmm5, %xmm6
        pxor	%xmm3, %xmm6
        pxor	%xmm6, %xmm0
L_AES_GCM_decrypt_calc_iv_done:
        # T = Encrypt counter
        pxor	%xmm4, %xmm4
        shll	$3, %edx
        pinsrd	$0x00, %edx, %xmm4
        pxor	%xmm4, %xmm0
        pshufd	$0x4e, %xmm0, %xmm5
        pshufd	$0x4e, %xmm1, %xmm6
        movdqa	%xmm1, %xmm7
        movdqa	%xmm1, %xmm4
        pclmulqdq	$0x11, %xmm0, %xmm7
        pclmulqdq	$0x00, %xmm0, %xmm4
        pxor	%xmm0, %xmm5
        pxor	%xmm1, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        movdqa	%xmm4, %xmm3
        movdqa	%xmm7, %xmm0
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm3
        pxor	%xmm5, %xmm0
        movdqa	%xmm3, %xmm4
        movdqa	%xmm0, %xmm5
        psrld	$31, %xmm4
        psrld	$31, %xmm5
        pslld	$0x01, %xmm3
        pslld	$0x01, %xmm0
        movdqa	%xmm4, %xmm6
        pslldq	$4, %xmm4
        psrldq	$12, %xmm6
        pslldq	$4, %xmm5
        por	%xmm6, %xmm0
        por	%xmm4, %xmm3
        por	%xmm5, %xmm0
        movdqa	%xmm3, %xmm4
        movdqa	%xmm3, %xmm5
        movdqa	%xmm3, %xmm6
        pslld	$31, %xmm4
        pslld	$30, %xmm5
        pslld	$25, %xmm6
        pxor	%xmm5, %xmm4
        pxor	%xmm6, %xmm4
        movdqa	%xmm4, %xmm5
        psrldq	$4, %xmm5
        pslldq	$12, %xmm4
        pxor	%xmm4, %xmm3
        movdqa	%xmm3, %xmm6
        movdqa	%xmm3, %xmm7
        movdqa	%xmm3, %xmm4
        psrld	$0x01, %xmm6
        psrld	$2, %xmm7
        psrld	$7, %xmm4
        pxor	%xmm7, %xmm6
        pxor	%xmm4, %xmm6
        pxor	%xmm5, %xmm6
        pxor	%xmm3, %xmm6
        pxor	%xmm6, %xmm0
        pshufb	L_aes_gcm_bswap_mask, %xmm0
        #   Encrypt counter
        movdqa	(%ebp), %xmm4
        pxor	%xmm0, %xmm4
        aesenc	16(%ebp), %xmm4
        aesenc	32(%ebp), %xmm4
        aesenc	48(%ebp), %xmm4
        aesenc	64(%ebp), %xmm4
        aesenc	80(%ebp), %xmm4
        aesenc	96(%ebp), %xmm4
        aesenc	112(%ebp), %xmm4
        aesenc	128(%ebp), %xmm4
        aesenc	144(%ebp), %xmm4
        cmpl	$11, 236(%esp)
        movdqa	160(%ebp), %xmm5
        jl	L_AES_GCM_decrypt_calc_iv_2_aesenc_avx_last
        aesenc	%xmm5, %xmm4
        aesenc	176(%ebp), %xmm4
        cmpl	$13, 236(%esp)
        movdqa	192(%ebp), %xmm5
        jl	L_AES_GCM_decrypt_calc_iv_2_aesenc_avx_last
        aesenc	%xmm5, %xmm4
        aesenc	208(%ebp), %xmm4
        movdqa	224(%ebp), %xmm5
L_AES_GCM_decrypt_calc_iv_2_aesenc_avx_last:
        aesenclast	%xmm5, %xmm4
        movdqu	%xmm4, 80(%esp)
L_AES_GCM_decrypt_iv_done:
        movl	204(%esp), %esi
        # Additional authentication data
        movl	220(%esp), %edx
        cmpl	$0x00, %edx
        je	L_AES_GCM_decrypt_calc_aad_done
        xorl	%ecx, %ecx
        cmpl	$16, %edx
        jl	L_AES_GCM_decrypt_calc_aad_lt16
        andl	$0xfffffff0, %edx
L_AES_GCM_decrypt_calc_aad_16_loop:
        movdqu	(%esi,%ecx,1), %xmm4
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        pxor	%xmm4, %xmm2
        pshufd	$0x4e, %xmm2, %xmm5
        pshufd	$0x4e, %xmm1, %xmm6
        movdqa	%xmm1, %xmm7
        movdqa	%xmm1, %xmm4
        pclmulqdq	$0x11, %xmm2, %xmm7
        pclmulqdq	$0x00, %xmm2, %xmm4
        pxor	%xmm2, %xmm5
        pxor	%xmm1, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        movdqa	%xmm4, %xmm3
        movdqa	%xmm7, %xmm2
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm3
        pxor	%xmm5, %xmm2
        movdqa	%xmm3, %xmm4
        movdqa	%xmm2, %xmm5
        psrld	$31, %xmm4
        psrld	$31, %xmm5
        pslld	$0x01, %xmm3
        pslld	$0x01, %xmm2
        movdqa	%xmm4, %xmm6
        pslldq	$4, %xmm4
        psrldq	$12, %xmm6
        pslldq	$4, %xmm5
        por	%xmm6, %xmm2
        por	%xmm4, %xmm3
        por	%xmm5, %xmm2
        movdqa	%xmm3, %xmm4
        movdqa	%xmm3, %xmm5
        movdqa	%xmm3, %xmm6
        pslld	$31, %xmm4
        pslld	$30, %xmm5
        pslld	$25, %xmm6
        pxor	%xmm5, %xmm4
        pxor	%xmm6, %xmm4
        movdqa	%xmm4, %xmm5
        psrldq	$4, %xmm5
        pslldq	$12, %xmm4
        pxor	%xmm4, %xmm3
        movdqa	%xmm3, %xmm6
        movdqa	%xmm3, %xmm7
        movdqa	%xmm3, %xmm4
        psrld	$0x01, %xmm6
        psrld	$2, %xmm7
        psrld	$7, %xmm4
        pxor	%xmm7, %xmm6
        pxor	%xmm4, %xmm6
        pxor	%xmm5, %xmm6
        pxor	%xmm3, %xmm6
        pxor	%xmm6, %xmm2
        addl	$16, %ecx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_decrypt_calc_aad_16_loop
        movl	220(%esp), %edx
        cmpl	%edx, %ecx
        je	L_AES_GCM_decrypt_calc_aad_done
L_AES_GCM_decrypt_calc_aad_lt16:
        subl	$16, %esp
        pxor	%xmm4, %xmm4
        xorl	%ebx, %ebx
        movdqu	%xmm4, (%esp)
L_AES_GCM_decrypt_calc_aad_loop:
        movzbl	(%esi,%ecx,1), %eax
        movb	%al, (%esp,%ebx,1)
        incl	%ecx
        incl	%ebx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_decrypt_calc_aad_loop
        movdqu	(%esp), %xmm4
        addl	$16, %esp
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        pxor	%xmm4, %xmm2
        pshufd	$0x4e, %xmm2, %xmm5
        pshufd	$0x4e, %xmm1, %xmm6
        movdqa	%xmm1, %xmm7
        movdqa	%xmm1, %xmm4
        pclmulqdq	$0x11, %xmm2, %xmm7
        pclmulqdq	$0x00, %xmm2, %xmm4
        pxor	%xmm2, %xmm5
        pxor	%xmm1, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        movdqa	%xmm4, %xmm3
        movdqa	%xmm7, %xmm2
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm3
        pxor	%xmm5, %xmm2
        movdqa	%xmm3, %xmm4
        movdqa	%xmm2, %xmm5
        psrld	$31, %xmm4
        psrld	$31, %xmm5
        pslld	$0x01, %xmm3
        pslld	$0x01, %xmm2
        movdqa	%xmm4, %xmm6
        pslldq	$4, %xmm4
        psrldq	$12, %xmm6
        pslldq	$4, %xmm5
        por	%xmm6, %xmm2
        por	%xmm4, %xmm3
        por	%xmm5, %xmm2
        movdqa	%xmm3, %xmm4
        movdqa	%xmm3, %xmm5
        movdqa	%xmm3, %xmm6
        pslld	$31, %xmm4
        pslld	$30, %xmm5
        pslld	$25, %xmm6
        pxor	%xmm5, %xmm4
        pxor	%xmm6, %xmm4
        movdqa	%xmm4, %xmm5
        psrldq	$4, %xmm5
        pslldq	$12, %xmm4
        pxor	%xmm4, %xmm3
        movdqa	%xmm3, %xmm6
        movdqa	%xmm3, %xmm7
        movdqa	%xmm3, %xmm4
        psrld	$0x01, %xmm6
        psrld	$2, %xmm7
        psrld	$7, %xmm4
        pxor	%xmm7, %xmm6
        pxor	%xmm4, %xmm6
        pxor	%xmm5, %xmm6
        pxor	%xmm3, %xmm6
        pxor	%xmm6, %xmm2
L_AES_GCM_decrypt_calc_aad_done:
        movdqu	%xmm2, 96(%esp)
        movl	196(%esp), %esi
        movl	200(%esp), %edi
        # Calculate counter and H
        pshufb	L_aes_gcm_bswap_epi64, %xmm0
        movdqa	%xmm1, %xmm5
        paddd	L_aes_gcm_one, %xmm0
        movdqa	%xmm1, %xmm4
        movdqu	%xmm0, 64(%esp)
        psrlq	$63, %xmm5
        psllq	$0x01, %xmm4
        pslldq	$8, %xmm5
        por	%xmm5, %xmm4
        pshufd	$0xff, %xmm1, %xmm1
        psrad	$31, %xmm1
        pand	L_aes_gcm_mod2_128, %xmm1
        pxor	%xmm4, %xmm1
        xorl	%ebx, %ebx
        cmpl	$0x40, 216(%esp)
        movl	216(%esp), %eax
        jl	L_AES_GCM_decrypt_done_64
        andl	$0xffffffc0, %eax
        movdqa	%xmm2, %xmm6
        # H ^ 1
        movdqu	%xmm1, (%esp)
        # H ^ 2
        pshufd	$0x4e, %xmm1, %xmm5
        pshufd	$0x4e, %xmm1, %xmm6
        movdqa	%xmm1, %xmm7
        movdqa	%xmm1, %xmm4
        pclmulqdq	$0x11, %xmm1, %xmm7
        pclmulqdq	$0x00, %xmm1, %xmm4
        pxor	%xmm1, %xmm5
        pxor	%xmm1, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        movdqa	%xmm7, %xmm0
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm4
        pxor	%xmm5, %xmm0
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        movdqa	%xmm4, %xmm7
        pslld	$31, %xmm5
        pslld	$30, %xmm6
        pslld	$25, %xmm7
        pxor	%xmm6, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm7
        psrldq	$4, %xmm7
        pslldq	$12, %xmm5
        pxor	%xmm5, %xmm4
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        psrld	$0x01, %xmm5
        psrld	$2, %xmm6
        pxor	%xmm6, %xmm5
        pxor	%xmm4, %xmm5
        psrld	$7, %xmm4
        pxor	%xmm7, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm5, %xmm0
        movdqu	%xmm0, 16(%esp)
        # H ^ 3
        pshufd	$0x4e, %xmm1, %xmm5
        pshufd	$0x4e, %xmm0, %xmm6
        movdqa	%xmm0, %xmm7
        movdqa	%xmm0, %xmm4
        pclmulqdq	$0x11, %xmm1, %xmm7
        pclmulqdq	$0x00, %xmm1, %xmm4
        pxor	%xmm1, %xmm5
        pxor	%xmm0, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        movdqa	%xmm7, %xmm3
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm4
        pxor	%xmm5, %xmm3
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        movdqa	%xmm4, %xmm7
        pslld	$31, %xmm5
        pslld	$30, %xmm6
        pslld	$25, %xmm7
        pxor	%xmm6, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm7
        psrldq	$4, %xmm7
        pslldq	$12, %xmm5
        pxor	%xmm5, %xmm4
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        psrld	$0x01, %xmm5
        psrld	$2, %xmm6
        pxor	%xmm6, %xmm5
        pxor	%xmm4, %xmm5
        psrld	$7, %xmm4
        pxor	%xmm7, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm5, %xmm3
        movdqu	%xmm3, 32(%esp)
        # H ^ 4
        pshufd	$0x4e, %xmm0, %xmm5
        pshufd	$0x4e, %xmm0, %xmm6
        movdqa	%xmm0, %xmm7
        movdqa	%xmm0, %xmm4
        pclmulqdq	$0x11, %xmm0, %xmm7
        pclmulqdq	$0x00, %xmm0, %xmm4
        pxor	%xmm0, %xmm5
        pxor	%xmm0, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        movdqa	%xmm7, %xmm3
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm4
        pxor	%xmm5, %xmm3
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        movdqa	%xmm4, %xmm7
        pslld	$31, %xmm5
        pslld	$30, %xmm6
        pslld	$25, %xmm7
        pxor	%xmm6, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm7
        psrldq	$4, %xmm7
        pslldq	$12, %xmm5
        pxor	%xmm5, %xmm4
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        psrld	$0x01, %xmm5
        psrld	$2, %xmm6
        pxor	%xmm6, %xmm5
        pxor	%xmm4, %xmm5
        psrld	$7, %xmm4
        pxor	%xmm7, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm5, %xmm3
        movdqu	%xmm3, 48(%esp)
        cmpl	%esi, %edi
        jne	L_AES_GCM_decrypt_ghash_64
L_AES_GCM_decrypt_ghash_64_inplace:
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        # Encrypt 64 bytes of counter
        movdqu	64(%esp), %xmm4
        movdqa	L_aes_gcm_bswap_epi64, %xmm3
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        movdqa	%xmm4, %xmm7
        pshufb	%xmm3, %xmm4
        paddd	L_aes_gcm_one, %xmm5
        pshufb	%xmm3, %xmm5
        paddd	L_aes_gcm_two, %xmm6
        pshufb	%xmm3, %xmm6
        paddd	L_aes_gcm_three, %xmm7
        pshufb	%xmm3, %xmm7
        movdqu	64(%esp), %xmm3
        paddd	L_aes_gcm_four, %xmm3
        movdqu	%xmm3, 64(%esp)
        movdqa	(%ebp), %xmm3
        pxor	%xmm3, %xmm4
        pxor	%xmm3, %xmm5
        pxor	%xmm3, %xmm6
        pxor	%xmm3, %xmm7
        movdqa	16(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	32(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	48(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	64(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	80(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	96(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	112(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	128(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	144(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        cmpl	$11, 236(%esp)
        movdqa	160(%ebp), %xmm3
        jl	L_AES_GCM_decryptinplace_aesenc_64_ghash_avx_done
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	176(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        cmpl	$13, 236(%esp)
        movdqa	192(%ebp), %xmm3
        jl	L_AES_GCM_decryptinplace_aesenc_64_ghash_avx_done
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	208(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	224(%ebp), %xmm3
L_AES_GCM_decryptinplace_aesenc_64_ghash_avx_done:
        aesenclast	%xmm3, %xmm4
        aesenclast	%xmm3, %xmm5
        movdqu	(%ecx), %xmm0
        movdqu	16(%ecx), %xmm1
        pxor	%xmm0, %xmm4
        pxor	%xmm1, %xmm5
        movdqu	%xmm0, 112(%esp)
        movdqu	%xmm1, 128(%esp)
        movdqu	%xmm4, (%edx)
        movdqu	%xmm5, 16(%edx)
        aesenclast	%xmm3, %xmm6
        aesenclast	%xmm3, %xmm7
        movdqu	32(%ecx), %xmm0
        movdqu	48(%ecx), %xmm1
        pxor	%xmm0, %xmm6
        pxor	%xmm1, %xmm7
        movdqu	%xmm0, 144(%esp)
        movdqu	%xmm1, 160(%esp)
        movdqu	%xmm6, 32(%edx)
        movdqu	%xmm7, 48(%edx)
        # ghash encrypted counter
        movdqu	96(%esp), %xmm6
        movdqu	48(%esp), %xmm3
        movdqu	112(%esp), %xmm4
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        pxor	%xmm6, %xmm4
        pshufd	$0x4e, %xmm3, %xmm5
        pshufd	$0x4e, %xmm4, %xmm1
        pxor	%xmm3, %xmm5
        pxor	%xmm4, %xmm1
        movdqa	%xmm4, %xmm7
        pclmulqdq	$0x11, %xmm3, %xmm7
        movdqa	%xmm4, %xmm6
        pclmulqdq	$0x00, %xmm3, %xmm6
        pclmulqdq	$0x00, %xmm1, %xmm5
        pxor	%xmm6, %xmm5
        pxor	%xmm7, %xmm5
        movdqu	32(%esp), %xmm3
        movdqu	128(%esp), %xmm4
        pshufd	$0x4e, %xmm3, %xmm0
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        pxor	%xmm3, %xmm0
        pshufd	$0x4e, %xmm4, %xmm1
        pxor	%xmm4, %xmm1
        movdqa	%xmm4, %xmm2
        pclmulqdq	$0x11, %xmm3, %xmm2
        pclmulqdq	$0x00, %xmm4, %xmm3
        pclmulqdq	$0x00, %xmm1, %xmm0
        pxor	%xmm3, %xmm5
        pxor	%xmm3, %xmm6
        pxor	%xmm2, %xmm5
        pxor	%xmm2, %xmm7
        pxor	%xmm0, %xmm5
        movdqu	16(%esp), %xmm3
        movdqu	144(%esp), %xmm4
        pshufd	$0x4e, %xmm3, %xmm0
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        pxor	%xmm3, %xmm0
        pshufd	$0x4e, %xmm4, %xmm1
        pxor	%xmm4, %xmm1
        movdqa	%xmm4, %xmm2
        pclmulqdq	$0x11, %xmm3, %xmm2
        pclmulqdq	$0x00, %xmm4, %xmm3
        pclmulqdq	$0x00, %xmm1, %xmm0
        pxor	%xmm3, %xmm5
        pxor	%xmm3, %xmm6
        pxor	%xmm2, %xmm5
        pxor	%xmm2, %xmm7
        pxor	%xmm0, %xmm5
        movdqu	(%esp), %xmm3
        movdqu	160(%esp), %xmm4
        pshufd	$0x4e, %xmm3, %xmm0
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        pxor	%xmm3, %xmm0
        pshufd	$0x4e, %xmm4, %xmm1
        pxor	%xmm4, %xmm1
        movdqa	%xmm4, %xmm2
        pclmulqdq	$0x11, %xmm3, %xmm2
        pclmulqdq	$0x00, %xmm4, %xmm3
        pclmulqdq	$0x00, %xmm1, %xmm0
        pxor	%xmm3, %xmm5
        pxor	%xmm3, %xmm6
        pxor	%xmm2, %xmm5
        pxor	%xmm2, %xmm7
        pxor	%xmm0, %xmm5
        movdqa	%xmm5, %xmm1
        psrldq	$8, %xmm5
        pslldq	$8, %xmm1
        pxor	%xmm1, %xmm6
        pxor	%xmm5, %xmm7
        movdqa	%xmm6, %xmm3
        movdqa	%xmm6, %xmm0
        movdqa	%xmm6, %xmm1
        pslld	$31, %xmm3
        pslld	$30, %xmm0
        pslld	$25, %xmm1
        pxor	%xmm0, %xmm3
        pxor	%xmm1, %xmm3
        movdqa	%xmm3, %xmm0
        pslldq	$12, %xmm3
        psrldq	$4, %xmm0
        pxor	%xmm3, %xmm6
        movdqa	%xmm6, %xmm1
        movdqa	%xmm6, %xmm5
        movdqa	%xmm6, %xmm4
        psrld	$0x01, %xmm1
        psrld	$2, %xmm5
        psrld	$7, %xmm4
        pxor	%xmm5, %xmm1
        pxor	%xmm4, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm1, %xmm6
        pxor	%xmm7, %xmm6
        movdqu	%xmm6, 96(%esp)
        addl	$0x40, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_decrypt_ghash_64_inplace
        jmp	L_AES_GCM_decrypt_ghash_64_done
L_AES_GCM_decrypt_ghash_64:
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        # Encrypt 64 bytes of counter
        movdqu	64(%esp), %xmm4
        movdqa	L_aes_gcm_bswap_epi64, %xmm3
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        movdqa	%xmm4, %xmm7
        pshufb	%xmm3, %xmm4
        paddd	L_aes_gcm_one, %xmm5
        pshufb	%xmm3, %xmm5
        paddd	L_aes_gcm_two, %xmm6
        pshufb	%xmm3, %xmm6
        paddd	L_aes_gcm_three, %xmm7
        pshufb	%xmm3, %xmm7
        movdqu	64(%esp), %xmm3
        paddd	L_aes_gcm_four, %xmm3
        movdqu	%xmm3, 64(%esp)
        movdqa	(%ebp), %xmm3
        pxor	%xmm3, %xmm4
        pxor	%xmm3, %xmm5
        pxor	%xmm3, %xmm6
        pxor	%xmm3, %xmm7
        movdqa	16(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	32(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	48(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	64(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	80(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	96(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	112(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	128(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	144(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        cmpl	$11, 236(%esp)
        movdqa	160(%ebp), %xmm3
        jl	L_AES_GCM_decrypt_aesenc_64_ghash_avx_done
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	176(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        cmpl	$13, 236(%esp)
        movdqa	192(%ebp), %xmm3
        jl	L_AES_GCM_decrypt_aesenc_64_ghash_avx_done
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	208(%ebp), %xmm3
        aesenc	%xmm3, %xmm4
        aesenc	%xmm3, %xmm5
        aesenc	%xmm3, %xmm6
        aesenc	%xmm3, %xmm7
        movdqa	224(%ebp), %xmm3
L_AES_GCM_decrypt_aesenc_64_ghash_avx_done:
        aesenclast	%xmm3, %xmm4
        aesenclast	%xmm3, %xmm5
        movdqu	(%ecx), %xmm0
        movdqu	16(%ecx), %xmm1
        pxor	%xmm0, %xmm4
        pxor	%xmm1, %xmm5
        movdqu	%xmm0, (%ecx)
        movdqu	%xmm1, 16(%ecx)
        movdqu	%xmm4, (%edx)
        movdqu	%xmm5, 16(%edx)
        aesenclast	%xmm3, %xmm6
        aesenclast	%xmm3, %xmm7
        movdqu	32(%ecx), %xmm0
        movdqu	48(%ecx), %xmm1
        pxor	%xmm0, %xmm6
        pxor	%xmm1, %xmm7
        movdqu	%xmm0, 32(%ecx)
        movdqu	%xmm1, 48(%ecx)
        movdqu	%xmm6, 32(%edx)
        movdqu	%xmm7, 48(%edx)
        # ghash encrypted counter
        movdqu	96(%esp), %xmm6
        movdqu	48(%esp), %xmm3
        movdqu	(%ecx), %xmm4
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        pxor	%xmm6, %xmm4
        pshufd	$0x4e, %xmm3, %xmm5
        pshufd	$0x4e, %xmm4, %xmm1
        pxor	%xmm3, %xmm5
        pxor	%xmm4, %xmm1
        movdqa	%xmm4, %xmm7
        pclmulqdq	$0x11, %xmm3, %xmm7
        movdqa	%xmm4, %xmm6
        pclmulqdq	$0x00, %xmm3, %xmm6
        pclmulqdq	$0x00, %xmm1, %xmm5
        pxor	%xmm6, %xmm5
        pxor	%xmm7, %xmm5
        movdqu	32(%esp), %xmm3
        movdqu	16(%ecx), %xmm4
        pshufd	$0x4e, %xmm3, %xmm0
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        pxor	%xmm3, %xmm0
        pshufd	$0x4e, %xmm4, %xmm1
        pxor	%xmm4, %xmm1
        movdqa	%xmm4, %xmm2
        pclmulqdq	$0x11, %xmm3, %xmm2
        pclmulqdq	$0x00, %xmm4, %xmm3
        pclmulqdq	$0x00, %xmm1, %xmm0
        pxor	%xmm3, %xmm5
        pxor	%xmm3, %xmm6
        pxor	%xmm2, %xmm5
        pxor	%xmm2, %xmm7
        pxor	%xmm0, %xmm5
        movdqu	16(%esp), %xmm3
        movdqu	32(%ecx), %xmm4
        pshufd	$0x4e, %xmm3, %xmm0
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        pxor	%xmm3, %xmm0
        pshufd	$0x4e, %xmm4, %xmm1
        pxor	%xmm4, %xmm1
        movdqa	%xmm4, %xmm2
        pclmulqdq	$0x11, %xmm3, %xmm2
        pclmulqdq	$0x00, %xmm4, %xmm3
        pclmulqdq	$0x00, %xmm1, %xmm0
        pxor	%xmm3, %xmm5
        pxor	%xmm3, %xmm6
        pxor	%xmm2, %xmm5
        pxor	%xmm2, %xmm7
        pxor	%xmm0, %xmm5
        movdqu	(%esp), %xmm3
        movdqu	48(%ecx), %xmm4
        pshufd	$0x4e, %xmm3, %xmm0
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        pxor	%xmm3, %xmm0
        pshufd	$0x4e, %xmm4, %xmm1
        pxor	%xmm4, %xmm1
        movdqa	%xmm4, %xmm2
        pclmulqdq	$0x11, %xmm3, %xmm2
        pclmulqdq	$0x00, %xmm4, %xmm3
        pclmulqdq	$0x00, %xmm1, %xmm0
        pxor	%xmm3, %xmm5
        pxor	%xmm3, %xmm6
        pxor	%xmm2, %xmm5
        pxor	%xmm2, %xmm7
        pxor	%xmm0, %xmm5
        movdqa	%xmm5, %xmm1
        psrldq	$8, %xmm5
        pslldq	$8, %xmm1
        pxor	%xmm1, %xmm6
        pxor	%xmm5, %xmm7
        movdqa	%xmm6, %xmm3
        movdqa	%xmm6, %xmm0
        movdqa	%xmm6, %xmm1
        pslld	$31, %xmm3
        pslld	$30, %xmm0
        pslld	$25, %xmm1
        pxor	%xmm0, %xmm3
        pxor	%xmm1, %xmm3
        movdqa	%xmm3, %xmm0
        pslldq	$12, %xmm3
        psrldq	$4, %xmm0
        pxor	%xmm3, %xmm6
        movdqa	%xmm6, %xmm1
        movdqa	%xmm6, %xmm5
        movdqa	%xmm6, %xmm4
        psrld	$0x01, %xmm1
        psrld	$2, %xmm5
        psrld	$7, %xmm4
        pxor	%xmm5, %xmm1
        pxor	%xmm4, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm1, %xmm6
        pxor	%xmm7, %xmm6
        movdqu	%xmm6, 96(%esp)
        addl	$0x40, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_decrypt_ghash_64
L_AES_GCM_decrypt_ghash_64_done:
        movdqa	%xmm6, %xmm2
        movdqu	(%esp), %xmm1
L_AES_GCM_decrypt_done_64:
        movl	216(%esp), %edx
        cmpl	%edx, %ebx
        jge	L_AES_GCM_decrypt_done_dec
        movl	216(%esp), %eax
        andl	$0xfffffff0, %eax
        cmpl	%eax, %ebx
        jge	L_AES_GCM_decrypt_last_block_done
L_AES_GCM_decrypt_last_block_start:
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        movdqu	(%ecx), %xmm5
        pshufb	L_aes_gcm_bswap_mask, %xmm5
        pxor	%xmm2, %xmm5
        movdqu	%xmm5, (%esp)
        movdqu	64(%esp), %xmm4
        movdqa	%xmm4, %xmm5
        pshufb	L_aes_gcm_bswap_epi64, %xmm4
        paddd	L_aes_gcm_one, %xmm5
        pxor	(%ebp), %xmm4
        movdqu	%xmm5, 64(%esp)
        movdqu	(%esp), %xmm0
        pclmulqdq	$16, %xmm1, %xmm0
        aesenc	16(%ebp), %xmm4
        aesenc	32(%ebp), %xmm4
        movdqu	(%esp), %xmm3
        pclmulqdq	$0x01, %xmm1, %xmm3
        aesenc	48(%ebp), %xmm4
        aesenc	64(%ebp), %xmm4
        aesenc	80(%ebp), %xmm4
        movdqu	(%esp), %xmm5
        pclmulqdq	$0x11, %xmm1, %xmm5
        aesenc	96(%ebp), %xmm4
        pxor	%xmm3, %xmm0
        movdqa	%xmm0, %xmm6
        psrldq	$8, %xmm0
        pslldq	$8, %xmm6
        aesenc	112(%ebp), %xmm4
        movdqu	(%esp), %xmm3
        pclmulqdq	$0x00, %xmm1, %xmm3
        pxor	%xmm3, %xmm6
        pxor	%xmm0, %xmm5
        movdqa	L_aes_gcm_mod2_128, %xmm7
        movdqa	%xmm6, %xmm3
        pclmulqdq	$16, %xmm7, %xmm3
        aesenc	128(%ebp), %xmm4
        pshufd	$0x4e, %xmm6, %xmm0
        pxor	%xmm3, %xmm0
        movdqa	%xmm0, %xmm3
        pclmulqdq	$16, %xmm7, %xmm3
        aesenc	144(%ebp), %xmm4
        pshufd	$0x4e, %xmm0, %xmm2
        pxor	%xmm3, %xmm2
        pxor	%xmm5, %xmm2
        cmpl	$11, 236(%esp)
        movdqa	160(%ebp), %xmm5
        jl	L_AES_GCM_decrypt_aesenc_gfmul_last
        aesenc	%xmm5, %xmm4
        aesenc	176(%ebp), %xmm4
        cmpl	$13, 236(%esp)
        movdqa	192(%ebp), %xmm5
        jl	L_AES_GCM_decrypt_aesenc_gfmul_last
        aesenc	%xmm5, %xmm4
        aesenc	208(%ebp), %xmm4
        movdqa	224(%ebp), %xmm5
L_AES_GCM_decrypt_aesenc_gfmul_last:
        aesenclast	%xmm5, %xmm4
        movdqu	(%ecx), %xmm5
        pxor	%xmm5, %xmm4
        movdqu	%xmm4, (%edx)
        addl	$16, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_decrypt_last_block_start
L_AES_GCM_decrypt_last_block_done:
        movl	216(%esp), %ecx
        movl	%ecx, %edx
        andl	$15, %ecx
        jz	L_AES_GCM_decrypt_aesenc_last15_dec_avx_done
        movdqu	64(%esp), %xmm0
        pshufb	L_aes_gcm_bswap_epi64, %xmm0
        pxor	(%ebp), %xmm0
        aesenc	16(%ebp), %xmm0
        aesenc	32(%ebp), %xmm0
        aesenc	48(%ebp), %xmm0
        aesenc	64(%ebp), %xmm0
        aesenc	80(%ebp), %xmm0
        aesenc	96(%ebp), %xmm0
        aesenc	112(%ebp), %xmm0
        aesenc	128(%ebp), %xmm0
        aesenc	144(%ebp), %xmm0
        cmpl	$11, 236(%esp)
        movdqa	160(%ebp), %xmm5
        jl	L_AES_GCM_decrypt_aesenc_last15_dec_avx_aesenc_avx_last
        aesenc	%xmm5, %xmm0
        aesenc	176(%ebp), %xmm0
        cmpl	$13, 236(%esp)
        movdqa	192(%ebp), %xmm5
        jl	L_AES_GCM_decrypt_aesenc_last15_dec_avx_aesenc_avx_last
        aesenc	%xmm5, %xmm0
        aesenc	208(%ebp), %xmm0
        movdqa	224(%ebp), %xmm5
L_AES_GCM_decrypt_aesenc_last15_dec_avx_aesenc_avx_last:
        aesenclast	%xmm5, %xmm0
        subl	$32, %esp
        xorl	%ecx, %ecx
        movdqu	%xmm0, (%esp)
        pxor	%xmm4, %xmm4
        movdqu	%xmm4, 16(%esp)
L_AES_GCM_decrypt_aesenc_last15_dec_avx_loop:
        movzbl	(%esi,%ebx,1), %eax
        movb	%al, 16(%esp,%ecx,1)
        xorb	(%esp,%ecx,1), %al
        movb	%al, (%edi,%ebx,1)
        incl	%ebx
        incl	%ecx
        cmpl	%edx, %ebx
        jl	L_AES_GCM_decrypt_aesenc_last15_dec_avx_loop
        movdqu	16(%esp), %xmm0
        addl	$32, %esp
        pshufb	L_aes_gcm_bswap_mask, %xmm0
        pxor	%xmm0, %xmm2
        pshufd	$0x4e, %xmm1, %xmm5
        pshufd	$0x4e, %xmm2, %xmm6
        movdqa	%xmm2, %xmm7
        movdqa	%xmm2, %xmm4
        pclmulqdq	$0x11, %xmm1, %xmm7
        pclmulqdq	$0x00, %xmm1, %xmm4
        pxor	%xmm1, %xmm5
        pxor	%xmm2, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        movdqa	%xmm7, %xmm2
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm4
        pxor	%xmm5, %xmm2
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        movdqa	%xmm4, %xmm7
        pslld	$31, %xmm5
        pslld	$30, %xmm6
        pslld	$25, %xmm7
        pxor	%xmm6, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm7
        psrldq	$4, %xmm7
        pslldq	$12, %xmm5
        pxor	%xmm5, %xmm4
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        psrld	$0x01, %xmm5
        psrld	$2, %xmm6
        pxor	%xmm6, %xmm5
        pxor	%xmm4, %xmm5
        psrld	$7, %xmm4
        pxor	%xmm7, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm5, %xmm2
L_AES_GCM_decrypt_aesenc_last15_dec_avx_done:
L_AES_GCM_decrypt_done_dec:
        movl	212(%esp), %esi
        movl	228(%esp), %ebp
        movl	216(%esp), %edx
        movl	220(%esp), %ecx
        shll	$3, %edx
        shll	$3, %ecx
        pinsrd	$0x00, %edx, %xmm4
        pinsrd	$2, %ecx, %xmm4
        movl	216(%esp), %edx
        movl	220(%esp), %ecx
        shrl	$29, %edx
        shrl	$29, %ecx
        pinsrd	$0x01, %edx, %xmm4
        pinsrd	$3, %ecx, %xmm4
        pxor	%xmm4, %xmm2
        pshufd	$0x4e, %xmm1, %xmm5
        pshufd	$0x4e, %xmm2, %xmm6
        movdqa	%xmm2, %xmm7
        movdqa	%xmm2, %xmm4
        pclmulqdq	$0x11, %xmm1, %xmm7
        pclmulqdq	$0x00, %xmm1, %xmm4
        pxor	%xmm1, %xmm5
        pxor	%xmm2, %xmm6
        pclmulqdq	$0x00, %xmm6, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm6
        movdqa	%xmm7, %xmm2
        pslldq	$8, %xmm6
        psrldq	$8, %xmm5
        pxor	%xmm6, %xmm4
        pxor	%xmm5, %xmm2
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        movdqa	%xmm4, %xmm7
        pslld	$31, %xmm5
        pslld	$30, %xmm6
        pslld	$25, %xmm7
        pxor	%xmm6, %xmm5
        pxor	%xmm7, %xmm5
        movdqa	%xmm5, %xmm7
        psrldq	$4, %xmm7
        pslldq	$12, %xmm5
        pxor	%xmm5, %xmm4
        movdqa	%xmm4, %xmm5
        movdqa	%xmm4, %xmm6
        psrld	$0x01, %xmm5
        psrld	$2, %xmm6
        pxor	%xmm6, %xmm5
        pxor	%xmm4, %xmm5
        psrld	$7, %xmm4
        pxor	%xmm7, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm5, %xmm2
        pshufb	L_aes_gcm_bswap_mask, %xmm2
        movdqu	80(%esp), %xmm4
        pxor	%xmm2, %xmm4
        movl	240(%esp), %edi
        cmpl	$16, %ebp
        je	L_AES_GCM_decrypt_cmp_tag_16
        subl	$16, %esp
        xorl	%ecx, %ecx
        xorl	%ebx, %ebx
        movdqu	%xmm4, (%esp)
L_AES_GCM_decrypt_cmp_tag_loop:
        movzbl	(%esp,%ecx,1), %eax
        xorb	(%esi,%ecx,1), %al
        orb	%al, %bl
        incl	%ecx
        cmpl	%ebp, %ecx
        jne	L_AES_GCM_decrypt_cmp_tag_loop
        cmpb	$0x00, %bl
        sete	%bl
        addl	$16, %esp
        xorl	%ecx, %ecx
        jmp	L_AES_GCM_decrypt_cmp_tag_done
L_AES_GCM_decrypt_cmp_tag_16:
        movdqu	(%esi), %xmm5
        pcmpeqb	%xmm5, %xmm4
        pmovmskb	%xmm4, %edx
        # %%edx == 0xFFFF then return 1 else => return 0
        xorl	%ebx, %ebx
        cmpl	$0xffff, %edx
        sete	%bl
L_AES_GCM_decrypt_cmp_tag_done:
        movl	%ebx, (%edi)
        addl	$0xb0, %esp
        popl	%ebp
        popl	%edi
        popl	%esi
        popl	%ebx
        ret
.size	AES_GCM_decrypt,.-AES_GCM_decrypt
#ifdef WOLFSSL_AESGCM_STREAM
.text
.globl	AES_GCM_init_aesni
.type	AES_GCM_init_aesni,@function
.align	16
AES_GCM_init_aesni:
        pushl	%ebx
        pushl	%esi
        pushl	%edi
        pushl	%ebp
        subl	$16, %esp
        movl	36(%esp), %ebp
        movl	44(%esp), %esi
        movl	60(%esp), %edi
        pxor	%xmm4, %xmm4
        movl	48(%esp), %edx
        cmpl	$12, %edx
        jne	L_AES_GCM_init_aesni_iv_not_12
        # # Calculate values when IV is 12 bytes
        # Set counter based on IV
        movl	$0x1000000, %ecx
        pinsrd	$0x00, (%esi), %xmm4
        pinsrd	$0x01, 4(%esi), %xmm4
        pinsrd	$2, 8(%esi), %xmm4
        pinsrd	$3, %ecx, %xmm4
        # H = Encrypt X(=0) and T = Encrypt counter
        movdqa	%xmm4, %xmm1
        movdqa	(%ebp), %xmm5
        pxor	%xmm5, %xmm1
        movdqa	16(%ebp), %xmm7
        aesenc	%xmm7, %xmm5
        aesenc	%xmm7, %xmm1
        movdqa	32(%ebp), %xmm7
        aesenc	%xmm7, %xmm5
        aesenc	%xmm7, %xmm1
        movdqa	48(%ebp), %xmm7
        aesenc	%xmm7, %xmm5
        aesenc	%xmm7, %xmm1
        movdqa	64(%ebp), %xmm7
        aesenc	%xmm7, %xmm5
        aesenc	%xmm7, %xmm1
        movdqa	80(%ebp), %xmm7
        aesenc	%xmm7, %xmm5
        aesenc	%xmm7, %xmm1
        movdqa	96(%ebp), %xmm7
        aesenc	%xmm7, %xmm5
        aesenc	%xmm7, %xmm1
        movdqa	112(%ebp), %xmm7
        aesenc	%xmm7, %xmm5
        aesenc	%xmm7, %xmm1
        movdqa	128(%ebp), %xmm7
        aesenc	%xmm7, %xmm5
        aesenc	%xmm7, %xmm1
        movdqa	144(%ebp), %xmm7
        aesenc	%xmm7, %xmm5
        aesenc	%xmm7, %xmm1
        cmpl	$11, 40(%esp)
        movdqa	160(%ebp), %xmm7
        jl	L_AES_GCM_init_aesni_calc_iv_12_last
        aesenc	%xmm7, %xmm5
        aesenc	%xmm7, %xmm1
        movdqa	176(%ebp), %xmm7
        aesenc	%xmm7, %xmm5
        aesenc	%xmm7, %xmm1
        cmpl	$13, 40(%esp)
        movdqa	192(%ebp), %xmm7
        jl	L_AES_GCM_init_aesni_calc_iv_12_last
        aesenc	%xmm7, %xmm5
        aesenc	%xmm7, %xmm1
        movdqa	208(%ebp), %xmm7
        aesenc	%xmm7, %xmm5
        aesenc	%xmm7, %xmm1
        movdqa	224(%ebp), %xmm7
L_AES_GCM_init_aesni_calc_iv_12_last:
        aesenclast	%xmm7, %xmm5
        aesenclast	%xmm7, %xmm1
        pshufb	L_aes_gcm_bswap_mask, %xmm5
        movdqu	%xmm1, (%edi)
        jmp	L_AES_GCM_init_aesni_iv_done
L_AES_GCM_init_aesni_iv_not_12:
        # Calculate values when IV is not 12 bytes
        # H = Encrypt X(=0)
        movdqa	(%ebp), %xmm5
        aesenc	16(%ebp), %xmm5
        aesenc	32(%ebp), %xmm5
        aesenc	48(%ebp), %xmm5
        aesenc	64(%ebp), %xmm5
        aesenc	80(%ebp), %xmm5
        aesenc	96(%ebp), %xmm5
        aesenc	112(%ebp), %xmm5
        aesenc	128(%ebp), %xmm5
        aesenc	144(%ebp), %xmm5
        cmpl	$11, 40(%esp)
        movdqa	160(%ebp), %xmm1
        jl	L_AES_GCM_init_aesni_calc_iv_1_aesenc_avx_last
        aesenc	%xmm1, %xmm5
        aesenc	176(%ebp), %xmm5
        cmpl	$13, 40(%esp)
        movdqa	192(%ebp), %xmm1
        jl	L_AES_GCM_init_aesni_calc_iv_1_aesenc_avx_last
        aesenc	%xmm1, %xmm5
        aesenc	208(%ebp), %xmm5
        movdqa	224(%ebp), %xmm1
L_AES_GCM_init_aesni_calc_iv_1_aesenc_avx_last:
        aesenclast	%xmm1, %xmm5
        pshufb	L_aes_gcm_bswap_mask, %xmm5
        # Calc counter
        # Initialization vector
        cmpl	$0x00, %edx
        movl	$0x00, %ecx
        je	L_AES_GCM_init_aesni_calc_iv_done
        cmpl	$16, %edx
        jl	L_AES_GCM_init_aesni_calc_iv_lt16
        andl	$0xfffffff0, %edx
L_AES_GCM_init_aesni_calc_iv_16_loop:
        movdqu	(%esi,%ecx,1), %xmm0
        pshufb	L_aes_gcm_bswap_mask, %xmm0
        pxor	%xmm0, %xmm4
        pshufd	$0x4e, %xmm4, %xmm1
        pshufd	$0x4e, %xmm5, %xmm2
        movdqa	%xmm5, %xmm3
        movdqa	%xmm5, %xmm0
        pclmulqdq	$0x11, %xmm4, %xmm3
        pclmulqdq	$0x00, %xmm4, %xmm0
        pxor	%xmm4, %xmm1
        pxor	%xmm5, %xmm2
        pclmulqdq	$0x00, %xmm2, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm2
        movdqa	%xmm0, %xmm7
        movdqa	%xmm3, %xmm4
        pslldq	$8, %xmm2
        psrldq	$8, %xmm1
        pxor	%xmm2, %xmm7
        pxor	%xmm1, %xmm4
        movdqa	%xmm7, %xmm0
        movdqa	%xmm4, %xmm1
        psrld	$31, %xmm0
        psrld	$31, %xmm1
        pslld	$0x01, %xmm7
        pslld	$0x01, %xmm4
        movdqa	%xmm0, %xmm2
        pslldq	$4, %xmm0
        psrldq	$12, %xmm2
        pslldq	$4, %xmm1
        por	%xmm2, %xmm4
        por	%xmm0, %xmm7
        por	%xmm1, %xmm4
        movdqa	%xmm7, %xmm0
        movdqa	%xmm7, %xmm1
        movdqa	%xmm7, %xmm2
        pslld	$31, %xmm0
        pslld	$30, %xmm1
        pslld	$25, %xmm2
        pxor	%xmm1, %xmm0
        pxor	%xmm2, %xmm0
        movdqa	%xmm0, %xmm1
        psrldq	$4, %xmm1
        pslldq	$12, %xmm0
        pxor	%xmm0, %xmm7
        movdqa	%xmm7, %xmm2
        movdqa	%xmm7, %xmm3
        movdqa	%xmm7, %xmm0
        psrld	$0x01, %xmm2
        psrld	$2, %xmm3
        psrld	$7, %xmm0
        pxor	%xmm3, %xmm2
        pxor	%xmm0, %xmm2
        pxor	%xmm1, %xmm2
        pxor	%xmm7, %xmm2
        pxor	%xmm2, %xmm4
        addl	$16, %ecx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_init_aesni_calc_iv_16_loop
        movl	48(%esp), %edx
        cmpl	%edx, %ecx
        je	L_AES_GCM_init_aesni_calc_iv_done
L_AES_GCM_init_aesni_calc_iv_lt16:
        subl	$16, %esp
        pxor	%xmm0, %xmm0
        xorl	%ebx, %ebx
        movdqu	%xmm0, (%esp)
L_AES_GCM_init_aesni_calc_iv_loop:
        movzbl	(%esi,%ecx,1), %eax
        movb	%al, (%esp,%ebx,1)
        incl	%ecx
        incl	%ebx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_init_aesni_calc_iv_loop
        movdqu	(%esp), %xmm0
        addl	$16, %esp
        pshufb	L_aes_gcm_bswap_mask, %xmm0
        pxor	%xmm0, %xmm4
        pshufd	$0x4e, %xmm4, %xmm1
        pshufd	$0x4e, %xmm5, %xmm2
        movdqa	%xmm5, %xmm3
        movdqa	%xmm5, %xmm0
        pclmulqdq	$0x11, %xmm4, %xmm3
        pclmulqdq	$0x00, %xmm4, %xmm0
        pxor	%xmm4, %xmm1
        pxor	%xmm5, %xmm2
        pclmulqdq	$0x00, %xmm2, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm2
        movdqa	%xmm0, %xmm7
        movdqa	%xmm3, %xmm4
        pslldq	$8, %xmm2
        psrldq	$8, %xmm1
        pxor	%xmm2, %xmm7
        pxor	%xmm1, %xmm4
        movdqa	%xmm7, %xmm0
        movdqa	%xmm4, %xmm1
        psrld	$31, %xmm0
        psrld	$31, %xmm1
        pslld	$0x01, %xmm7
        pslld	$0x01, %xmm4
        movdqa	%xmm0, %xmm2
        pslldq	$4, %xmm0
        psrldq	$12, %xmm2
        pslldq	$4, %xmm1
        por	%xmm2, %xmm4
        por	%xmm0, %xmm7
        por	%xmm1, %xmm4
        movdqa	%xmm7, %xmm0
        movdqa	%xmm7, %xmm1
        movdqa	%xmm7, %xmm2
        pslld	$31, %xmm0
        pslld	$30, %xmm1
        pslld	$25, %xmm2
        pxor	%xmm1, %xmm0
        pxor	%xmm2, %xmm0
        movdqa	%xmm0, %xmm1
        psrldq	$4, %xmm1
        pslldq	$12, %xmm0
        pxor	%xmm0, %xmm7
        movdqa	%xmm7, %xmm2
        movdqa	%xmm7, %xmm3
        movdqa	%xmm7, %xmm0
        psrld	$0x01, %xmm2
        psrld	$2, %xmm3
        psrld	$7, %xmm0
        pxor	%xmm3, %xmm2
        pxor	%xmm0, %xmm2
        pxor	%xmm1, %xmm2
        pxor	%xmm7, %xmm2
        pxor	%xmm2, %xmm4
L_AES_GCM_init_aesni_calc_iv_done:
        # T = Encrypt counter
        pxor	%xmm0, %xmm0
        shll	$3, %edx
        pinsrd	$0x00, %edx, %xmm0
        pxor	%xmm0, %xmm4
        pshufd	$0x4e, %xmm4, %xmm1
        pshufd	$0x4e, %xmm5, %xmm2
        movdqa	%xmm5, %xmm3
        movdqa	%xmm5, %xmm0
        pclmulqdq	$0x11, %xmm4, %xmm3
        pclmulqdq	$0x00, %xmm4, %xmm0
        pxor	%xmm4, %xmm1
        pxor	%xmm5, %xmm2
        pclmulqdq	$0x00, %xmm2, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm2
        movdqa	%xmm0, %xmm7
        movdqa	%xmm3, %xmm4
        pslldq	$8, %xmm2
        psrldq	$8, %xmm1
        pxor	%xmm2, %xmm7
        pxor	%xmm1, %xmm4
        movdqa	%xmm7, %xmm0
        movdqa	%xmm4, %xmm1
        psrld	$31, %xmm0
        psrld	$31, %xmm1
        pslld	$0x01, %xmm7
        pslld	$0x01, %xmm4
        movdqa	%xmm0, %xmm2
        pslldq	$4, %xmm0
        psrldq	$12, %xmm2
        pslldq	$4, %xmm1
        por	%xmm2, %xmm4
        por	%xmm0, %xmm7
        por	%xmm1, %xmm4
        movdqa	%xmm7, %xmm0
        movdqa	%xmm7, %xmm1
        movdqa	%xmm7, %xmm2
        pslld	$31, %xmm0
        pslld	$30, %xmm1
        pslld	$25, %xmm2
        pxor	%xmm1, %xmm0
        pxor	%xmm2, %xmm0
        movdqa	%xmm0, %xmm1
        psrldq	$4, %xmm1
        pslldq	$12, %xmm0
        pxor	%xmm0, %xmm7
        movdqa	%xmm7, %xmm2
        movdqa	%xmm7, %xmm3
        movdqa	%xmm7, %xmm0
        psrld	$0x01, %xmm2
        psrld	$2, %xmm3
        psrld	$7, %xmm0
        pxor	%xmm3, %xmm2
        pxor	%xmm0, %xmm2
        pxor	%xmm1, %xmm2
        pxor	%xmm7, %xmm2
        pxor	%xmm2, %xmm4
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        #   Encrypt counter
        movdqa	(%ebp), %xmm0
        pxor	%xmm4, %xmm0
        aesenc	16(%ebp), %xmm0
        aesenc	32(%ebp), %xmm0
        aesenc	48(%ebp), %xmm0
        aesenc	64(%ebp), %xmm0
        aesenc	80(%ebp), %xmm0
        aesenc	96(%ebp), %xmm0
        aesenc	112(%ebp), %xmm0
        aesenc	128(%ebp), %xmm0
        aesenc	144(%ebp), %xmm0
        cmpl	$11, 40(%esp)
        movdqa	160(%ebp), %xmm1
        jl	L_AES_GCM_init_aesni_calc_iv_2_aesenc_avx_last
        aesenc	%xmm1, %xmm0
        aesenc	176(%ebp), %xmm0
        cmpl	$13, 40(%esp)
        movdqa	192(%ebp), %xmm1
        jl	L_AES_GCM_init_aesni_calc_iv_2_aesenc_avx_last
        aesenc	%xmm1, %xmm0
        aesenc	208(%ebp), %xmm0
        movdqa	224(%ebp), %xmm1
L_AES_GCM_init_aesni_calc_iv_2_aesenc_avx_last:
        aesenclast	%xmm1, %xmm0
        movdqu	%xmm0, (%edi)
L_AES_GCM_init_aesni_iv_done:
        movl	52(%esp), %ebp
        movl	56(%esp), %edi
        pshufb	L_aes_gcm_bswap_epi64, %xmm4
        paddd	L_aes_gcm_one, %xmm4
        movdqa	%xmm5, (%ebp)
        movdqa	%xmm4, (%edi)
        addl	$16, %esp
        popl	%ebp
        popl	%edi
        popl	%esi
        popl	%ebx
        ret
.size	AES_GCM_init_aesni,.-AES_GCM_init_aesni
.text
.globl	AES_GCM_aad_update_aesni
.type	AES_GCM_aad_update_aesni,@function
.align	16
AES_GCM_aad_update_aesni:
        pushl	%esi
        pushl	%edi
        movl	12(%esp), %esi
        movl	16(%esp), %edx
        movl	20(%esp), %edi
        movl	24(%esp), %eax
        movdqa	(%edi), %xmm5
        movdqa	(%eax), %xmm6
        xorl	%ecx, %ecx
L_AES_GCM_aad_update_aesni_16_loop:
        movdqu	(%esi,%ecx,1), %xmm0
        pshufb	L_aes_gcm_bswap_mask, %xmm0
        pxor	%xmm0, %xmm5
        pshufd	$0x4e, %xmm5, %xmm1
        pshufd	$0x4e, %xmm6, %xmm2
        movdqa	%xmm6, %xmm3
        movdqa	%xmm6, %xmm0
        pclmulqdq	$0x11, %xmm5, %xmm3
        pclmulqdq	$0x00, %xmm5, %xmm0
        pxor	%xmm5, %xmm1
        pxor	%xmm6, %xmm2
        pclmulqdq	$0x00, %xmm2, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm2
        movdqa	%xmm0, %xmm4
        movdqa	%xmm3, %xmm5
        pslldq	$8, %xmm2
        psrldq	$8, %xmm1
        pxor	%xmm2, %xmm4
        pxor	%xmm1, %xmm5
        movdqa	%xmm4, %xmm0
        movdqa	%xmm5, %xmm1
        psrld	$31, %xmm0
        psrld	$31, %xmm1
        pslld	$0x01, %xmm4
        pslld	$0x01, %xmm5
        movdqa	%xmm0, %xmm2
        pslldq	$4, %xmm0
        psrldq	$12, %xmm2
        pslldq	$4, %xmm1
        por	%xmm2, %xmm5
        por	%xmm0, %xmm4
        por	%xmm1, %xmm5
        movdqa	%xmm4, %xmm0
        movdqa	%xmm4, %xmm1
        movdqa	%xmm4, %xmm2
        pslld	$31, %xmm0
        pslld	$30, %xmm1
        pslld	$25, %xmm2
        pxor	%xmm1, %xmm0
        pxor	%xmm2, %xmm0
        movdqa	%xmm0, %xmm1
        psrldq	$4, %xmm1
        pslldq	$12, %xmm0
        pxor	%xmm0, %xmm4
        movdqa	%xmm4, %xmm2
        movdqa	%xmm4, %xmm3
        movdqa	%xmm4, %xmm0
        psrld	$0x01, %xmm2
        psrld	$2, %xmm3
        psrld	$7, %xmm0
        pxor	%xmm3, %xmm2
        pxor	%xmm0, %xmm2
        pxor	%xmm1, %xmm2
        pxor	%xmm4, %xmm2
        pxor	%xmm2, %xmm5
        addl	$16, %ecx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_aad_update_aesni_16_loop
        movdqa	%xmm5, (%edi)
        popl	%edi
        popl	%esi
        ret
.size	AES_GCM_aad_update_aesni,.-AES_GCM_aad_update_aesni
.text
.globl	AES_GCM_encrypt_block_aesni
.type	AES_GCM_encrypt_block_aesni,@function
.align	16
AES_GCM_encrypt_block_aesni:
        pushl	%esi
        pushl	%edi
        movl	12(%esp), %ecx
        movl	16(%esp), %eax
        movl	20(%esp), %edi
        movl	24(%esp), %esi
        movl	28(%esp), %edx
        movdqu	(%edx), %xmm0
        movdqa	%xmm0, %xmm1
        pshufb	L_aes_gcm_bswap_epi64, %xmm0
        paddd	L_aes_gcm_one, %xmm1
        pxor	(%ecx), %xmm0
        movdqu	%xmm1, (%edx)
        aesenc	16(%ecx), %xmm0
        aesenc	32(%ecx), %xmm0
        aesenc	48(%ecx), %xmm0
        aesenc	64(%ecx), %xmm0
        aesenc	80(%ecx), %xmm0
        aesenc	96(%ecx), %xmm0
        aesenc	112(%ecx), %xmm0
        aesenc	128(%ecx), %xmm0
        aesenc	144(%ecx), %xmm0
        cmpl	$11, %eax
        movdqa	160(%ecx), %xmm1
        jl	L_AES_GCM_encrypt_block_aesni_aesenc_block_aesenc_avx_last
        aesenc	%xmm1, %xmm0
        aesenc	176(%ecx), %xmm0
        cmpl	$13, %eax
        movdqa	192(%ecx), %xmm1
        jl	L_AES_GCM_encrypt_block_aesni_aesenc_block_aesenc_avx_last
        aesenc	%xmm1, %xmm0
        aesenc	208(%ecx), %xmm0
        movdqa	224(%ecx), %xmm1
L_AES_GCM_encrypt_block_aesni_aesenc_block_aesenc_avx_last:
        aesenclast	%xmm1, %xmm0
        movdqu	(%esi), %xmm1
        pxor	%xmm1, %xmm0
        movdqu	%xmm0, (%edi)
        pshufb	L_aes_gcm_bswap_mask, %xmm0
        popl	%edi
        popl	%esi
        ret
.size	AES_GCM_encrypt_block_aesni,.-AES_GCM_encrypt_block_aesni
.text
.globl	AES_GCM_ghash_block_aesni
.type	AES_GCM_ghash_block_aesni,@function
.align	16
AES_GCM_ghash_block_aesni:
        movl	4(%esp), %edx
        movl	8(%esp), %eax
        movl	12(%esp), %ecx
        movdqa	(%eax), %xmm4
        movdqa	(%ecx), %xmm5
        movdqu	(%edx), %xmm0
        pshufb	L_aes_gcm_bswap_mask, %xmm0
        pxor	%xmm0, %xmm4
        pshufd	$0x4e, %xmm4, %xmm1
        pshufd	$0x4e, %xmm5, %xmm2
        movdqa	%xmm5, %xmm3
        movdqa	%xmm5, %xmm0
        pclmulqdq	$0x11, %xmm4, %xmm3
        pclmulqdq	$0x00, %xmm4, %xmm0
        pxor	%xmm4, %xmm1
        pxor	%xmm5, %xmm2
        pclmulqdq	$0x00, %xmm2, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm2
        movdqa	%xmm0, %xmm6
        movdqa	%xmm3, %xmm4
        pslldq	$8, %xmm2
        psrldq	$8, %xmm1
        pxor	%xmm2, %xmm6
        pxor	%xmm1, %xmm4
        movdqa	%xmm6, %xmm0
        movdqa	%xmm4, %xmm1
        psrld	$31, %xmm0
        psrld	$31, %xmm1
        pslld	$0x01, %xmm6
        pslld	$0x01, %xmm4
        movdqa	%xmm0, %xmm2
        pslldq	$4, %xmm0
        psrldq	$12, %xmm2
        pslldq	$4, %xmm1
        por	%xmm2, %xmm4
        por	%xmm0, %xmm6
        por	%xmm1, %xmm4
        movdqa	%xmm6, %xmm0
        movdqa	%xmm6, %xmm1
        movdqa	%xmm6, %xmm2
        pslld	$31, %xmm0
        pslld	$30, %xmm1
        pslld	$25, %xmm2
        pxor	%xmm1, %xmm0
        pxor	%xmm2, %xmm0
        movdqa	%xmm0, %xmm1
        psrldq	$4, %xmm1
        pslldq	$12, %xmm0
        pxor	%xmm0, %xmm6
        movdqa	%xmm6, %xmm2
        movdqa	%xmm6, %xmm3
        movdqa	%xmm6, %xmm0
        psrld	$0x01, %xmm2
        psrld	$2, %xmm3
        psrld	$7, %xmm0
        pxor	%xmm3, %xmm2
        pxor	%xmm0, %xmm2
        pxor	%xmm1, %xmm2
        pxor	%xmm6, %xmm2
        pxor	%xmm2, %xmm4
        movdqa	%xmm4, (%eax)
        ret
.size	AES_GCM_ghash_block_aesni,.-AES_GCM_ghash_block_aesni
.text
.globl	AES_GCM_encrypt_update_aesni
.type	AES_GCM_encrypt_update_aesni,@function
.align	16
AES_GCM_encrypt_update_aesni:
        pushl	%ebx
        pushl	%esi
        pushl	%edi
        pushl	%ebp
        subl	$0x60, %esp
        movl	144(%esp), %esi
        movdqa	(%esi), %xmm4
        movdqu	%xmm4, 64(%esp)
        movl	136(%esp), %esi
        movl	140(%esp), %ebp
        movdqa	(%esi), %xmm6
        movdqa	(%ebp), %xmm5
        movdqu	%xmm6, 80(%esp)
        movl	116(%esp), %ebp
        movl	124(%esp), %edi
        movl	128(%esp), %esi
        movdqa	%xmm5, %xmm1
        movdqa	%xmm5, %xmm0
        psrlq	$63, %xmm1
        psllq	$0x01, %xmm0
        pslldq	$8, %xmm1
        por	%xmm1, %xmm0
        pshufd	$0xff, %xmm5, %xmm5
        psrad	$31, %xmm5
        pand	L_aes_gcm_mod2_128, %xmm5
        pxor	%xmm0, %xmm5
        xorl	%ebx, %ebx
        cmpl	$0x40, 132(%esp)
        movl	132(%esp), %eax
        jl	L_AES_GCM_encrypt_update_aesni_done_64
        andl	$0xffffffc0, %eax
        movdqa	%xmm6, %xmm2
        # H ^ 1
        movdqu	%xmm5, (%esp)
        # H ^ 2
        pshufd	$0x4e, %xmm5, %xmm1
        pshufd	$0x4e, %xmm5, %xmm2
        movdqa	%xmm5, %xmm3
        movdqa	%xmm5, %xmm0
        pclmulqdq	$0x11, %xmm5, %xmm3
        pclmulqdq	$0x00, %xmm5, %xmm0
        pxor	%xmm5, %xmm1
        pxor	%xmm5, %xmm2
        pclmulqdq	$0x00, %xmm2, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm2
        movdqa	%xmm3, %xmm4
        pslldq	$8, %xmm2
        psrldq	$8, %xmm1
        pxor	%xmm2, %xmm0
        pxor	%xmm1, %xmm4
        movdqa	%xmm0, %xmm1
        movdqa	%xmm0, %xmm2
        movdqa	%xmm0, %xmm3
        pslld	$31, %xmm1
        pslld	$30, %xmm2
        pslld	$25, %xmm3
        pxor	%xmm2, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm3
        psrldq	$4, %xmm3
        pslldq	$12, %xmm1
        pxor	%xmm1, %xmm0
        movdqa	%xmm0, %xmm1
        movdqa	%xmm0, %xmm2
        psrld	$0x01, %xmm1
        psrld	$2, %xmm2
        pxor	%xmm2, %xmm1
        pxor	%xmm0, %xmm1
        psrld	$7, %xmm0
        pxor	%xmm3, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm1, %xmm4
        movdqu	%xmm4, 16(%esp)
        # H ^ 3
        pshufd	$0x4e, %xmm5, %xmm1
        pshufd	$0x4e, %xmm4, %xmm2
        movdqa	%xmm4, %xmm3
        movdqa	%xmm4, %xmm0
        pclmulqdq	$0x11, %xmm5, %xmm3
        pclmulqdq	$0x00, %xmm5, %xmm0
        pxor	%xmm5, %xmm1
        pxor	%xmm4, %xmm2
        pclmulqdq	$0x00, %xmm2, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm2
        movdqa	%xmm3, %xmm7
        pslldq	$8, %xmm2
        psrldq	$8, %xmm1
        pxor	%xmm2, %xmm0
        pxor	%xmm1, %xmm7
        movdqa	%xmm0, %xmm1
        movdqa	%xmm0, %xmm2
        movdqa	%xmm0, %xmm3
        pslld	$31, %xmm1
        pslld	$30, %xmm2
        pslld	$25, %xmm3
        pxor	%xmm2, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm3
        psrldq	$4, %xmm3
        pslldq	$12, %xmm1
        pxor	%xmm1, %xmm0
        movdqa	%xmm0, %xmm1
        movdqa	%xmm0, %xmm2
        psrld	$0x01, %xmm1
        psrld	$2, %xmm2
        pxor	%xmm2, %xmm1
        pxor	%xmm0, %xmm1
        psrld	$7, %xmm0
        pxor	%xmm3, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm1, %xmm7
        movdqu	%xmm7, 32(%esp)
        # H ^ 4
        pshufd	$0x4e, %xmm4, %xmm1
        pshufd	$0x4e, %xmm4, %xmm2
        movdqa	%xmm4, %xmm3
        movdqa	%xmm4, %xmm0
        pclmulqdq	$0x11, %xmm4, %xmm3
        pclmulqdq	$0x00, %xmm4, %xmm0
        pxor	%xmm4, %xmm1
        pxor	%xmm4, %xmm2
        pclmulqdq	$0x00, %xmm2, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm2
        movdqa	%xmm3, %xmm7
        pslldq	$8, %xmm2
        psrldq	$8, %xmm1
        pxor	%xmm2, %xmm0
        pxor	%xmm1, %xmm7
        movdqa	%xmm0, %xmm1
        movdqa	%xmm0, %xmm2
        movdqa	%xmm0, %xmm3
        pslld	$31, %xmm1
        pslld	$30, %xmm2
        pslld	$25, %xmm3
        pxor	%xmm2, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm3
        psrldq	$4, %xmm3
        pslldq	$12, %xmm1
        pxor	%xmm1, %xmm0
        movdqa	%xmm0, %xmm1
        movdqa	%xmm0, %xmm2
        psrld	$0x01, %xmm1
        psrld	$2, %xmm2
        pxor	%xmm2, %xmm1
        pxor	%xmm0, %xmm1
        psrld	$7, %xmm0
        pxor	%xmm3, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm1, %xmm7
        movdqu	%xmm7, 48(%esp)
        # First 64 bytes of input
        # Encrypt 64 bytes of counter
        movdqu	64(%esp), %xmm0
        movdqa	L_aes_gcm_bswap_epi64, %xmm7
        movdqa	%xmm0, %xmm1
        movdqa	%xmm0, %xmm2
        movdqa	%xmm0, %xmm3
        pshufb	%xmm7, %xmm0
        paddd	L_aes_gcm_one, %xmm1
        pshufb	%xmm7, %xmm1
        paddd	L_aes_gcm_two, %xmm2
        pshufb	%xmm7, %xmm2
        paddd	L_aes_gcm_three, %xmm3
        pshufb	%xmm7, %xmm3
        movdqu	64(%esp), %xmm7
        paddd	L_aes_gcm_four, %xmm7
        movdqu	%xmm7, 64(%esp)
        movdqa	(%ebp), %xmm7
        pxor	%xmm7, %xmm0
        pxor	%xmm7, %xmm1
        pxor	%xmm7, %xmm2
        pxor	%xmm7, %xmm3
        movdqa	16(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	32(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	48(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	64(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	80(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	96(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	112(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	128(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	144(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        cmpl	$11, 120(%esp)
        movdqa	160(%ebp), %xmm7
        jl	L_AES_GCM_encrypt_update_aesni_enc_done
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	176(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        cmpl	$13, 120(%esp)
        movdqa	192(%ebp), %xmm7
        jl	L_AES_GCM_encrypt_update_aesni_enc_done
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	208(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	224(%ebp), %xmm7
L_AES_GCM_encrypt_update_aesni_enc_done:
        aesenclast	%xmm7, %xmm0
        aesenclast	%xmm7, %xmm1
        movdqu	(%esi), %xmm4
        movdqu	16(%esi), %xmm5
        pxor	%xmm4, %xmm0
        pxor	%xmm5, %xmm1
        movdqu	%xmm0, (%edi)
        movdqu	%xmm1, 16(%edi)
        aesenclast	%xmm7, %xmm2
        aesenclast	%xmm7, %xmm3
        movdqu	32(%esi), %xmm4
        movdqu	48(%esi), %xmm5
        pxor	%xmm4, %xmm2
        pxor	%xmm5, %xmm3
        movdqu	%xmm2, 32(%edi)
        movdqu	%xmm3, 48(%edi)
        cmpl	$0x40, %eax
        movl	$0x40, %ebx
        jle	L_AES_GCM_encrypt_update_aesni_end_64
        # More 64 bytes of input
L_AES_GCM_encrypt_update_aesni_ghash_64:
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        # Encrypt 64 bytes of counter
        movdqu	64(%esp), %xmm0
        movdqa	L_aes_gcm_bswap_epi64, %xmm7
        movdqa	%xmm0, %xmm1
        movdqa	%xmm0, %xmm2
        movdqa	%xmm0, %xmm3
        pshufb	%xmm7, %xmm0
        paddd	L_aes_gcm_one, %xmm1
        pshufb	%xmm7, %xmm1
        paddd	L_aes_gcm_two, %xmm2
        pshufb	%xmm7, %xmm2
        paddd	L_aes_gcm_three, %xmm3
        pshufb	%xmm7, %xmm3
        movdqu	64(%esp), %xmm7
        paddd	L_aes_gcm_four, %xmm7
        movdqu	%xmm7, 64(%esp)
        movdqa	(%ebp), %xmm7
        pxor	%xmm7, %xmm0
        pxor	%xmm7, %xmm1
        pxor	%xmm7, %xmm2
        pxor	%xmm7, %xmm3
        movdqa	16(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	32(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	48(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	64(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	80(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	96(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	112(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	128(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	144(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        cmpl	$11, 120(%esp)
        movdqa	160(%ebp), %xmm7
        jl	L_AES_GCM_encrypt_update_aesni_aesenc_64_ghash_avx_done
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	176(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        cmpl	$13, 120(%esp)
        movdqa	192(%ebp), %xmm7
        jl	L_AES_GCM_encrypt_update_aesni_aesenc_64_ghash_avx_done
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	208(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	224(%ebp), %xmm7
L_AES_GCM_encrypt_update_aesni_aesenc_64_ghash_avx_done:
        aesenclast	%xmm7, %xmm0
        aesenclast	%xmm7, %xmm1
        movdqu	(%ecx), %xmm4
        movdqu	16(%ecx), %xmm5
        pxor	%xmm4, %xmm0
        pxor	%xmm5, %xmm1
        movdqu	%xmm0, (%edx)
        movdqu	%xmm1, 16(%edx)
        aesenclast	%xmm7, %xmm2
        aesenclast	%xmm7, %xmm3
        movdqu	32(%ecx), %xmm4
        movdqu	48(%ecx), %xmm5
        pxor	%xmm4, %xmm2
        pxor	%xmm5, %xmm3
        movdqu	%xmm2, 32(%edx)
        movdqu	%xmm3, 48(%edx)
        # ghash encrypted counter
        movdqu	80(%esp), %xmm2
        movdqu	48(%esp), %xmm7
        movdqu	-64(%edx), %xmm0
        pshufb	L_aes_gcm_bswap_mask, %xmm0
        pxor	%xmm2, %xmm0
        pshufd	$0x4e, %xmm7, %xmm1
        pshufd	$0x4e, %xmm0, %xmm5
        pxor	%xmm7, %xmm1
        pxor	%xmm0, %xmm5
        movdqa	%xmm0, %xmm3
        pclmulqdq	$0x11, %xmm7, %xmm3
        movdqa	%xmm0, %xmm2
        pclmulqdq	$0x00, %xmm7, %xmm2
        pclmulqdq	$0x00, %xmm5, %xmm1
        pxor	%xmm2, %xmm1
        pxor	%xmm3, %xmm1
        movdqu	32(%esp), %xmm7
        movdqu	-48(%edx), %xmm0
        pshufd	$0x4e, %xmm7, %xmm4
        pshufb	L_aes_gcm_bswap_mask, %xmm0
        pxor	%xmm7, %xmm4
        pshufd	$0x4e, %xmm0, %xmm5
        pxor	%xmm0, %xmm5
        movdqa	%xmm0, %xmm6
        pclmulqdq	$0x11, %xmm7, %xmm6
        pclmulqdq	$0x00, %xmm0, %xmm7
        pclmulqdq	$0x00, %xmm5, %xmm4
        pxor	%xmm7, %xmm1
        pxor	%xmm7, %xmm2
        pxor	%xmm6, %xmm1
        pxor	%xmm6, %xmm3
        pxor	%xmm4, %xmm1
        movdqu	16(%esp), %xmm7
        movdqu	-32(%edx), %xmm0
        pshufd	$0x4e, %xmm7, %xmm4
        pshufb	L_aes_gcm_bswap_mask, %xmm0
        pxor	%xmm7, %xmm4
        pshufd	$0x4e, %xmm0, %xmm5
        pxor	%xmm0, %xmm5
        movdqa	%xmm0, %xmm6
        pclmulqdq	$0x11, %xmm7, %xmm6
        pclmulqdq	$0x00, %xmm0, %xmm7
        pclmulqdq	$0x00, %xmm5, %xmm4
        pxor	%xmm7, %xmm1
        pxor	%xmm7, %xmm2
        pxor	%xmm6, %xmm1
        pxor	%xmm6, %xmm3
        pxor	%xmm4, %xmm1
        movdqu	(%esp), %xmm7
        movdqu	-16(%edx), %xmm0
        pshufd	$0x4e, %xmm7, %xmm4
        pshufb	L_aes_gcm_bswap_mask, %xmm0
        pxor	%xmm7, %xmm4
        pshufd	$0x4e, %xmm0, %xmm5
        pxor	%xmm0, %xmm5
        movdqa	%xmm0, %xmm6
        pclmulqdq	$0x11, %xmm7, %xmm6
        pclmulqdq	$0x00, %xmm0, %xmm7
        pclmulqdq	$0x00, %xmm5, %xmm4
        pxor	%xmm7, %xmm1
        pxor	%xmm7, %xmm2
        pxor	%xmm6, %xmm1
        pxor	%xmm6, %xmm3
        pxor	%xmm4, %xmm1
        movdqa	%xmm1, %xmm5
        psrldq	$8, %xmm1
        pslldq	$8, %xmm5
        pxor	%xmm5, %xmm2
        pxor	%xmm1, %xmm3
        movdqa	%xmm2, %xmm7
        movdqa	%xmm2, %xmm4
        movdqa	%xmm2, %xmm5
        pslld	$31, %xmm7
        pslld	$30, %xmm4
        pslld	$25, %xmm5
        pxor	%xmm4, %xmm7
        pxor	%xmm5, %xmm7
        movdqa	%xmm7, %xmm4
        pslldq	$12, %xmm7
        psrldq	$4, %xmm4
        pxor	%xmm7, %xmm2
        movdqa	%xmm2, %xmm5
        movdqa	%xmm2, %xmm1
        movdqa	%xmm2, %xmm0
        psrld	$0x01, %xmm5
        psrld	$2, %xmm1
        psrld	$7, %xmm0
        pxor	%xmm1, %xmm5
        pxor	%xmm0, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm5, %xmm2
        pxor	%xmm3, %xmm2
        movdqu	%xmm2, 80(%esp)
        addl	$0x40, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_encrypt_update_aesni_ghash_64
L_AES_GCM_encrypt_update_aesni_end_64:
        movdqu	80(%esp), %xmm6
        # Block 1
        movdqa	L_aes_gcm_bswap_mask, %xmm0
        movdqu	(%edx), %xmm5
        pshufb	%xmm0, %xmm5
        movdqu	48(%esp), %xmm7
        pxor	%xmm6, %xmm5
        pshufd	$0x4e, %xmm5, %xmm1
        pshufd	$0x4e, %xmm7, %xmm2
        movdqa	%xmm7, %xmm3
        movdqa	%xmm7, %xmm0
        pclmulqdq	$0x11, %xmm5, %xmm3
        pclmulqdq	$0x00, %xmm5, %xmm0
        pxor	%xmm5, %xmm1
        pxor	%xmm7, %xmm2
        pclmulqdq	$0x00, %xmm2, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm2
        movdqa	%xmm0, %xmm4
        movdqa	%xmm3, %xmm6
        pslldq	$8, %xmm2
        psrldq	$8, %xmm1
        pxor	%xmm2, %xmm4
        pxor	%xmm1, %xmm6
        # Block 2
        movdqa	L_aes_gcm_bswap_mask, %xmm0
        movdqu	16(%edx), %xmm5
        pshufb	%xmm0, %xmm5
        movdqu	32(%esp), %xmm7
        pshufd	$0x4e, %xmm5, %xmm1
        pshufd	$0x4e, %xmm7, %xmm2
        movdqa	%xmm7, %xmm3
        movdqa	%xmm7, %xmm0
        pclmulqdq	$0x11, %xmm5, %xmm3
        pclmulqdq	$0x00, %xmm5, %xmm0
        pxor	%xmm5, %xmm1
        pxor	%xmm7, %xmm2
        pclmulqdq	$0x00, %xmm2, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm2
        pxor	%xmm0, %xmm4
        pxor	%xmm3, %xmm6
        pslldq	$8, %xmm2
        psrldq	$8, %xmm1
        pxor	%xmm2, %xmm4
        pxor	%xmm1, %xmm6
        # Block 3
        movdqa	L_aes_gcm_bswap_mask, %xmm0
        movdqu	32(%edx), %xmm5
        pshufb	%xmm0, %xmm5
        movdqu	16(%esp), %xmm7
        pshufd	$0x4e, %xmm5, %xmm1
        pshufd	$0x4e, %xmm7, %xmm2
        movdqa	%xmm7, %xmm3
        movdqa	%xmm7, %xmm0
        pclmulqdq	$0x11, %xmm5, %xmm3
        pclmulqdq	$0x00, %xmm5, %xmm0
        pxor	%xmm5, %xmm1
        pxor	%xmm7, %xmm2
        pclmulqdq	$0x00, %xmm2, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm2
        pxor	%xmm0, %xmm4
        pxor	%xmm3, %xmm6
        pslldq	$8, %xmm2
        psrldq	$8, %xmm1
        pxor	%xmm2, %xmm4
        pxor	%xmm1, %xmm6
        # Block 4
        movdqa	L_aes_gcm_bswap_mask, %xmm0
        movdqu	48(%edx), %xmm5
        pshufb	%xmm0, %xmm5
        movdqu	(%esp), %xmm7
        pshufd	$0x4e, %xmm5, %xmm1
        pshufd	$0x4e, %xmm7, %xmm2
        movdqa	%xmm7, %xmm3
        movdqa	%xmm7, %xmm0
        pclmulqdq	$0x11, %xmm5, %xmm3
        pclmulqdq	$0x00, %xmm5, %xmm0
        pxor	%xmm5, %xmm1
        pxor	%xmm7, %xmm2
        pclmulqdq	$0x00, %xmm2, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm2
        pxor	%xmm0, %xmm4
        pxor	%xmm3, %xmm6
        pslldq	$8, %xmm2
        psrldq	$8, %xmm1
        pxor	%xmm2, %xmm4
        pxor	%xmm1, %xmm6
        movdqa	%xmm4, %xmm0
        movdqa	%xmm4, %xmm1
        movdqa	%xmm4, %xmm2
        pslld	$31, %xmm0
        pslld	$30, %xmm1
        pslld	$25, %xmm2
        pxor	%xmm1, %xmm0
        pxor	%xmm2, %xmm0
        movdqa	%xmm0, %xmm1
        psrldq	$4, %xmm1
        pslldq	$12, %xmm0
        pxor	%xmm0, %xmm4
        movdqa	%xmm4, %xmm2
        movdqa	%xmm4, %xmm3
        movdqa	%xmm4, %xmm0
        psrld	$0x01, %xmm2
        psrld	$2, %xmm3
        psrld	$7, %xmm0
        pxor	%xmm3, %xmm2
        pxor	%xmm0, %xmm2
        pxor	%xmm1, %xmm2
        pxor	%xmm4, %xmm2
        pxor	%xmm2, %xmm6
        movdqu	(%esp), %xmm5
L_AES_GCM_encrypt_update_aesni_done_64:
        movl	132(%esp), %edx
        cmpl	%edx, %ebx
        jge	L_AES_GCM_encrypt_update_aesni_done_enc
        movl	132(%esp), %eax
        andl	$0xfffffff0, %eax
        cmpl	%eax, %ebx
        jge	L_AES_GCM_encrypt_update_aesni_last_block_done
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        movdqu	64(%esp), %xmm0
        movdqa	%xmm0, %xmm1
        pshufb	L_aes_gcm_bswap_epi64, %xmm0
        paddd	L_aes_gcm_one, %xmm1
        pxor	(%ebp), %xmm0
        movdqu	%xmm1, 64(%esp)
        aesenc	16(%ebp), %xmm0
        aesenc	32(%ebp), %xmm0
        aesenc	48(%ebp), %xmm0
        aesenc	64(%ebp), %xmm0
        aesenc	80(%ebp), %xmm0
        aesenc	96(%ebp), %xmm0
        aesenc	112(%ebp), %xmm0
        aesenc	128(%ebp), %xmm0
        aesenc	144(%ebp), %xmm0
        cmpl	$11, 120(%esp)
        movdqa	160(%ebp), %xmm1
        jl	L_AES_GCM_encrypt_update_aesni_aesenc_block_aesenc_avx_last
        aesenc	%xmm1, %xmm0
        aesenc	176(%ebp), %xmm0
        cmpl	$13, 120(%esp)
        movdqa	192(%ebp), %xmm1
        jl	L_AES_GCM_encrypt_update_aesni_aesenc_block_aesenc_avx_last
        aesenc	%xmm1, %xmm0
        aesenc	208(%ebp), %xmm0
        movdqa	224(%ebp), %xmm1
L_AES_GCM_encrypt_update_aesni_aesenc_block_aesenc_avx_last:
        aesenclast	%xmm1, %xmm0
        movdqu	(%ecx), %xmm1
        pxor	%xmm1, %xmm0
        movdqu	%xmm0, (%edx)
        pshufb	L_aes_gcm_bswap_mask, %xmm0
        pxor	%xmm0, %xmm6
        addl	$16, %ebx
        cmpl	%eax, %ebx
        jge	L_AES_GCM_encrypt_update_aesni_last_block_ghash
L_AES_GCM_encrypt_update_aesni_last_block_start:
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        movdqu	64(%esp), %xmm0
        movdqa	%xmm0, %xmm1
        pshufb	L_aes_gcm_bswap_epi64, %xmm0
        paddd	L_aes_gcm_one, %xmm1
        pxor	(%ebp), %xmm0
        movdqu	%xmm1, 64(%esp)
        movdqu	%xmm6, %xmm4
        pclmulqdq	$16, %xmm5, %xmm4
        aesenc	16(%ebp), %xmm0
        aesenc	32(%ebp), %xmm0
        movdqu	%xmm6, %xmm7
        pclmulqdq	$0x01, %xmm5, %xmm7
        aesenc	48(%ebp), %xmm0
        aesenc	64(%ebp), %xmm0
        aesenc	80(%ebp), %xmm0
        movdqu	%xmm6, %xmm1
        pclmulqdq	$0x11, %xmm5, %xmm1
        aesenc	96(%ebp), %xmm0
        pxor	%xmm7, %xmm4
        movdqa	%xmm4, %xmm2
        psrldq	$8, %xmm4
        pslldq	$8, %xmm2
        aesenc	112(%ebp), %xmm0
        movdqu	%xmm6, %xmm7
        pclmulqdq	$0x00, %xmm5, %xmm7
        pxor	%xmm7, %xmm2
        pxor	%xmm4, %xmm1
        movdqa	L_aes_gcm_mod2_128, %xmm3
        movdqa	%xmm2, %xmm7
        pclmulqdq	$16, %xmm3, %xmm7
        aesenc	128(%ebp), %xmm0
        pshufd	$0x4e, %xmm2, %xmm4
        pxor	%xmm7, %xmm4
        movdqa	%xmm4, %xmm7
        pclmulqdq	$16, %xmm3, %xmm7
        aesenc	144(%ebp), %xmm0
        pshufd	$0x4e, %xmm4, %xmm6
        pxor	%xmm7, %xmm6
        pxor	%xmm1, %xmm6
        cmpl	$11, 120(%esp)
        movdqa	160(%ebp), %xmm1
        jl	L_AES_GCM_encrypt_update_aesni_aesenc_gfmul_last
        aesenc	%xmm1, %xmm0
        aesenc	176(%ebp), %xmm0
        cmpl	$13, 120(%esp)
        movdqa	192(%ebp), %xmm1
        jl	L_AES_GCM_encrypt_update_aesni_aesenc_gfmul_last
        aesenc	%xmm1, %xmm0
        aesenc	208(%ebp), %xmm0
        movdqa	224(%ebp), %xmm1
L_AES_GCM_encrypt_update_aesni_aesenc_gfmul_last:
        aesenclast	%xmm1, %xmm0
        movdqu	(%ecx), %xmm1
        pxor	%xmm1, %xmm0
        movdqu	%xmm0, (%edx)
        pshufb	L_aes_gcm_bswap_mask, %xmm0
        pxor	%xmm0, %xmm6
        addl	$16, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_encrypt_update_aesni_last_block_start
L_AES_GCM_encrypt_update_aesni_last_block_ghash:
        pshufd	$0x4e, %xmm5, %xmm1
        pshufd	$0x4e, %xmm6, %xmm2
        movdqa	%xmm6, %xmm3
        movdqa	%xmm6, %xmm0
        pclmulqdq	$0x11, %xmm5, %xmm3
        pclmulqdq	$0x00, %xmm5, %xmm0
        pxor	%xmm5, %xmm1
        pxor	%xmm6, %xmm2
        pclmulqdq	$0x00, %xmm2, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm2
        movdqa	%xmm3, %xmm6
        pslldq	$8, %xmm2
        psrldq	$8, %xmm1
        pxor	%xmm2, %xmm0
        pxor	%xmm1, %xmm6
        movdqa	%xmm0, %xmm1
        movdqa	%xmm0, %xmm2
        movdqa	%xmm0, %xmm3
        pslld	$31, %xmm1
        pslld	$30, %xmm2
        pslld	$25, %xmm3
        pxor	%xmm2, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm3
        psrldq	$4, %xmm3
        pslldq	$12, %xmm1
        pxor	%xmm1, %xmm0
        movdqa	%xmm0, %xmm1
        movdqa	%xmm0, %xmm2
        psrld	$0x01, %xmm1
        psrld	$2, %xmm2
        pxor	%xmm2, %xmm1
        pxor	%xmm0, %xmm1
        psrld	$7, %xmm0
        pxor	%xmm3, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm1, %xmm6
L_AES_GCM_encrypt_update_aesni_last_block_done:
L_AES_GCM_encrypt_update_aesni_done_enc:
        movl	136(%esp), %esi
        movl	144(%esp), %edi
        movdqu	64(%esp), %xmm4
        movdqa	%xmm6, (%esi)
        movdqu	%xmm4, (%edi)
        addl	$0x60, %esp
        popl	%ebp
        popl	%edi
        popl	%esi
        popl	%ebx
        ret
.size	AES_GCM_encrypt_update_aesni,.-AES_GCM_encrypt_update_aesni
.text
.globl	AES_GCM_encrypt_final_aesni
.type	AES_GCM_encrypt_final_aesni,@function
.align	16
AES_GCM_encrypt_final_aesni:
        pushl	%esi
        pushl	%edi
        pushl	%ebp
        subl	$16, %esp
        movl	32(%esp), %ebp
        movl	52(%esp), %esi
        movl	56(%esp), %edi
        movdqa	(%ebp), %xmm4
        movdqa	(%esi), %xmm5
        movdqa	(%edi), %xmm6
        movdqa	%xmm5, %xmm1
        movdqa	%xmm5, %xmm0
        psrlq	$63, %xmm1
        psllq	$0x01, %xmm0
        pslldq	$8, %xmm1
        por	%xmm1, %xmm0
        pshufd	$0xff, %xmm5, %xmm5
        psrad	$31, %xmm5
        pand	L_aes_gcm_mod2_128, %xmm5
        pxor	%xmm0, %xmm5
        movl	44(%esp), %edx
        movl	48(%esp), %ecx
        shll	$3, %edx
        shll	$3, %ecx
        pinsrd	$0x00, %edx, %xmm0
        pinsrd	$2, %ecx, %xmm0
        movl	44(%esp), %edx
        movl	48(%esp), %ecx
        shrl	$29, %edx
        shrl	$29, %ecx
        pinsrd	$0x01, %edx, %xmm0
        pinsrd	$3, %ecx, %xmm0
        pxor	%xmm0, %xmm4
        pshufd	$0x4e, %xmm5, %xmm1
        pshufd	$0x4e, %xmm4, %xmm2
        movdqa	%xmm4, %xmm3
        movdqa	%xmm4, %xmm0
        pclmulqdq	$0x11, %xmm5, %xmm3
        pclmulqdq	$0x00, %xmm5, %xmm0
        pxor	%xmm5, %xmm1
        pxor	%xmm4, %xmm2
        pclmulqdq	$0x00, %xmm2, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm2
        movdqa	%xmm3, %xmm4
        pslldq	$8, %xmm2
        psrldq	$8, %xmm1
        pxor	%xmm2, %xmm0
        pxor	%xmm1, %xmm4
        movdqa	%xmm0, %xmm1
        movdqa	%xmm0, %xmm2
        movdqa	%xmm0, %xmm3
        pslld	$31, %xmm1
        pslld	$30, %xmm2
        pslld	$25, %xmm3
        pxor	%xmm2, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm3
        psrldq	$4, %xmm3
        pslldq	$12, %xmm1
        pxor	%xmm1, %xmm0
        movdqa	%xmm0, %xmm1
        movdqa	%xmm0, %xmm2
        psrld	$0x01, %xmm1
        psrld	$2, %xmm2
        pxor	%xmm2, %xmm1
        pxor	%xmm0, %xmm1
        psrld	$7, %xmm0
        pxor	%xmm3, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm1, %xmm4
        pshufb	L_aes_gcm_bswap_mask, %xmm4
        movdqu	%xmm6, %xmm0
        pxor	%xmm4, %xmm0
        movl	36(%esp), %edi
        cmpl	$16, 40(%esp)
        je	L_AES_GCM_encrypt_final_aesni_store_tag_16
        xorl	%ecx, %ecx
        movdqu	%xmm0, (%esp)
L_AES_GCM_encrypt_final_aesni_store_tag_loop:
        movzbl	(%esp,%ecx,1), %eax
        movb	%al, (%edi,%ecx,1)
        incl	%ecx
        cmpl	40(%esp), %ecx
        jne	L_AES_GCM_encrypt_final_aesni_store_tag_loop
        jmp	L_AES_GCM_encrypt_final_aesni_store_tag_done
L_AES_GCM_encrypt_final_aesni_store_tag_16:
        movdqu	%xmm0, (%edi)
L_AES_GCM_encrypt_final_aesni_store_tag_done:
        addl	$16, %esp
        popl	%ebp
        popl	%edi
        popl	%esi
        ret
.size	AES_GCM_encrypt_final_aesni,.-AES_GCM_encrypt_final_aesni
.text
.globl	AES_GCM_decrypt_update_aesni
.type	AES_GCM_decrypt_update_aesni,@function
.align	16
AES_GCM_decrypt_update_aesni:
        pushl	%ebx
        pushl	%esi
        pushl	%edi
        pushl	%ebp
        subl	$0xa0, %esp
        movl	208(%esp), %esi
        movdqa	(%esi), %xmm4
        movdqu	%xmm4, 64(%esp)
        movl	200(%esp), %esi
        movl	204(%esp), %ebp
        movdqa	(%esi), %xmm6
        movdqa	(%ebp), %xmm5
        movdqu	%xmm6, 80(%esp)
        movl	180(%esp), %ebp
        movl	188(%esp), %edi
        movl	192(%esp), %esi
        movdqa	%xmm5, %xmm1
        movdqa	%xmm5, %xmm0
        psrlq	$63, %xmm1
        psllq	$0x01, %xmm0
        pslldq	$8, %xmm1
        por	%xmm1, %xmm0
        pshufd	$0xff, %xmm5, %xmm5
        psrad	$31, %xmm5
        pand	L_aes_gcm_mod2_128, %xmm5
        pxor	%xmm0, %xmm5
        xorl	%ebx, %ebx
        cmpl	$0x40, 196(%esp)
        movl	196(%esp), %eax
        jl	L_AES_GCM_decrypt_update_aesni_done_64
        andl	$0xffffffc0, %eax
        movdqa	%xmm6, %xmm2
        # H ^ 1
        movdqu	%xmm5, (%esp)
        # H ^ 2
        pshufd	$0x4e, %xmm5, %xmm1
        pshufd	$0x4e, %xmm5, %xmm2
        movdqa	%xmm5, %xmm3
        movdqa	%xmm5, %xmm0
        pclmulqdq	$0x11, %xmm5, %xmm3
        pclmulqdq	$0x00, %xmm5, %xmm0
        pxor	%xmm5, %xmm1
        pxor	%xmm5, %xmm2
        pclmulqdq	$0x00, %xmm2, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm2
        movdqa	%xmm3, %xmm4
        pslldq	$8, %xmm2
        psrldq	$8, %xmm1
        pxor	%xmm2, %xmm0
        pxor	%xmm1, %xmm4
        movdqa	%xmm0, %xmm1
        movdqa	%xmm0, %xmm2
        movdqa	%xmm0, %xmm3
        pslld	$31, %xmm1
        pslld	$30, %xmm2
        pslld	$25, %xmm3
        pxor	%xmm2, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm3
        psrldq	$4, %xmm3
        pslldq	$12, %xmm1
        pxor	%xmm1, %xmm0
        movdqa	%xmm0, %xmm1
        movdqa	%xmm0, %xmm2
        psrld	$0x01, %xmm1
        psrld	$2, %xmm2
        pxor	%xmm2, %xmm1
        pxor	%xmm0, %xmm1
        psrld	$7, %xmm0
        pxor	%xmm3, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm1, %xmm4
        movdqu	%xmm4, 16(%esp)
        # H ^ 3
        pshufd	$0x4e, %xmm5, %xmm1
        pshufd	$0x4e, %xmm4, %xmm2
        movdqa	%xmm4, %xmm3
        movdqa	%xmm4, %xmm0
        pclmulqdq	$0x11, %xmm5, %xmm3
        pclmulqdq	$0x00, %xmm5, %xmm0
        pxor	%xmm5, %xmm1
        pxor	%xmm4, %xmm2
        pclmulqdq	$0x00, %xmm2, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm2
        movdqa	%xmm3, %xmm7
        pslldq	$8, %xmm2
        psrldq	$8, %xmm1
        pxor	%xmm2, %xmm0
        pxor	%xmm1, %xmm7
        movdqa	%xmm0, %xmm1
        movdqa	%xmm0, %xmm2
        movdqa	%xmm0, %xmm3
        pslld	$31, %xmm1
        pslld	$30, %xmm2
        pslld	$25, %xmm3
        pxor	%xmm2, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm3
        psrldq	$4, %xmm3
        pslldq	$12, %xmm1
        pxor	%xmm1, %xmm0
        movdqa	%xmm0, %xmm1
        movdqa	%xmm0, %xmm2
        psrld	$0x01, %xmm1
        psrld	$2, %xmm2
        pxor	%xmm2, %xmm1
        pxor	%xmm0, %xmm1
        psrld	$7, %xmm0
        pxor	%xmm3, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm1, %xmm7
        movdqu	%xmm7, 32(%esp)
        # H ^ 4
        pshufd	$0x4e, %xmm4, %xmm1
        pshufd	$0x4e, %xmm4, %xmm2
        movdqa	%xmm4, %xmm3
        movdqa	%xmm4, %xmm0
        pclmulqdq	$0x11, %xmm4, %xmm3
        pclmulqdq	$0x00, %xmm4, %xmm0
        pxor	%xmm4, %xmm1
        pxor	%xmm4, %xmm2
        pclmulqdq	$0x00, %xmm2, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm2
        movdqa	%xmm3, %xmm7
        pslldq	$8, %xmm2
        psrldq	$8, %xmm1
        pxor	%xmm2, %xmm0
        pxor	%xmm1, %xmm7
        movdqa	%xmm0, %xmm1
        movdqa	%xmm0, %xmm2
        movdqa	%xmm0, %xmm3
        pslld	$31, %xmm1
        pslld	$30, %xmm2
        pslld	$25, %xmm3
        pxor	%xmm2, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm3
        psrldq	$4, %xmm3
        pslldq	$12, %xmm1
        pxor	%xmm1, %xmm0
        movdqa	%xmm0, %xmm1
        movdqa	%xmm0, %xmm2
        psrld	$0x01, %xmm1
        psrld	$2, %xmm2
        pxor	%xmm2, %xmm1
        pxor	%xmm0, %xmm1
        psrld	$7, %xmm0
        pxor	%xmm3, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm1, %xmm7
        movdqu	%xmm7, 48(%esp)
        cmpl	%esi, %edi
        jne	L_AES_GCM_decrypt_update_aesni_ghash_64
L_AES_GCM_decrypt_update_aesni_ghash_64_inplace:
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        # Encrypt 64 bytes of counter
        movdqu	64(%esp), %xmm0
        movdqa	L_aes_gcm_bswap_epi64, %xmm7
        movdqa	%xmm0, %xmm1
        movdqa	%xmm0, %xmm2
        movdqa	%xmm0, %xmm3
        pshufb	%xmm7, %xmm0
        paddd	L_aes_gcm_one, %xmm1
        pshufb	%xmm7, %xmm1
        paddd	L_aes_gcm_two, %xmm2
        pshufb	%xmm7, %xmm2
        paddd	L_aes_gcm_three, %xmm3
        pshufb	%xmm7, %xmm3
        movdqu	64(%esp), %xmm7
        paddd	L_aes_gcm_four, %xmm7
        movdqu	%xmm7, 64(%esp)
        movdqa	(%ebp), %xmm7
        pxor	%xmm7, %xmm0
        pxor	%xmm7, %xmm1
        pxor	%xmm7, %xmm2
        pxor	%xmm7, %xmm3
        movdqa	16(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	32(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	48(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	64(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	80(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	96(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	112(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	128(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	144(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        cmpl	$11, 184(%esp)
        movdqa	160(%ebp), %xmm7
        jl	L_AES_GCM_decrypt_update_aesniinplace_aesenc_64_ghash_avx_done
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	176(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        cmpl	$13, 184(%esp)
        movdqa	192(%ebp), %xmm7
        jl	L_AES_GCM_decrypt_update_aesniinplace_aesenc_64_ghash_avx_done
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	208(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	224(%ebp), %xmm7
L_AES_GCM_decrypt_update_aesniinplace_aesenc_64_ghash_avx_done:
        aesenclast	%xmm7, %xmm0
        aesenclast	%xmm7, %xmm1
        movdqu	(%ecx), %xmm4
        movdqu	16(%ecx), %xmm5
        pxor	%xmm4, %xmm0
        pxor	%xmm5, %xmm1
        movdqu	%xmm4, 96(%esp)
        movdqu	%xmm5, 112(%esp)
        movdqu	%xmm0, (%edx)
        movdqu	%xmm1, 16(%edx)
        aesenclast	%xmm7, %xmm2
        aesenclast	%xmm7, %xmm3
        movdqu	32(%ecx), %xmm4
        movdqu	48(%ecx), %xmm5
        pxor	%xmm4, %xmm2
        pxor	%xmm5, %xmm3
        movdqu	%xmm4, 128(%esp)
        movdqu	%xmm5, 144(%esp)
        movdqu	%xmm2, 32(%edx)
        movdqu	%xmm3, 48(%edx)
        # ghash encrypted counter
        movdqu	80(%esp), %xmm2
        movdqu	48(%esp), %xmm7
        movdqu	96(%esp), %xmm0
        pshufb	L_aes_gcm_bswap_mask, %xmm0
        pxor	%xmm2, %xmm0
        pshufd	$0x4e, %xmm7, %xmm1
        pshufd	$0x4e, %xmm0, %xmm5
        pxor	%xmm7, %xmm1
        pxor	%xmm0, %xmm5
        movdqa	%xmm0, %xmm3
        pclmulqdq	$0x11, %xmm7, %xmm3
        movdqa	%xmm0, %xmm2
        pclmulqdq	$0x00, %xmm7, %xmm2
        pclmulqdq	$0x00, %xmm5, %xmm1
        pxor	%xmm2, %xmm1
        pxor	%xmm3, %xmm1
        movdqu	32(%esp), %xmm7
        movdqu	112(%esp), %xmm0
        pshufd	$0x4e, %xmm7, %xmm4
        pshufb	L_aes_gcm_bswap_mask, %xmm0
        pxor	%xmm7, %xmm4
        pshufd	$0x4e, %xmm0, %xmm5
        pxor	%xmm0, %xmm5
        movdqa	%xmm0, %xmm6
        pclmulqdq	$0x11, %xmm7, %xmm6
        pclmulqdq	$0x00, %xmm0, %xmm7
        pclmulqdq	$0x00, %xmm5, %xmm4
        pxor	%xmm7, %xmm1
        pxor	%xmm7, %xmm2
        pxor	%xmm6, %xmm1
        pxor	%xmm6, %xmm3
        pxor	%xmm4, %xmm1
        movdqu	16(%esp), %xmm7
        movdqu	128(%esp), %xmm0
        pshufd	$0x4e, %xmm7, %xmm4
        pshufb	L_aes_gcm_bswap_mask, %xmm0
        pxor	%xmm7, %xmm4
        pshufd	$0x4e, %xmm0, %xmm5
        pxor	%xmm0, %xmm5
        movdqa	%xmm0, %xmm6
        pclmulqdq	$0x11, %xmm7, %xmm6
        pclmulqdq	$0x00, %xmm0, %xmm7
        pclmulqdq	$0x00, %xmm5, %xmm4
        pxor	%xmm7, %xmm1
        pxor	%xmm7, %xmm2
        pxor	%xmm6, %xmm1
        pxor	%xmm6, %xmm3
        pxor	%xmm4, %xmm1
        movdqu	(%esp), %xmm7
        movdqu	144(%esp), %xmm0
        pshufd	$0x4e, %xmm7, %xmm4
        pshufb	L_aes_gcm_bswap_mask, %xmm0
        pxor	%xmm7, %xmm4
        pshufd	$0x4e, %xmm0, %xmm5
        pxor	%xmm0, %xmm5
        movdqa	%xmm0, %xmm6
        pclmulqdq	$0x11, %xmm7, %xmm6
        pclmulqdq	$0x00, %xmm0, %xmm7
        pclmulqdq	$0x00, %xmm5, %xmm4
        pxor	%xmm7, %xmm1
        pxor	%xmm7, %xmm2
        pxor	%xmm6, %xmm1
        pxor	%xmm6, %xmm3
        pxor	%xmm4, %xmm1
        movdqa	%xmm1, %xmm5
        psrldq	$8, %xmm1
        pslldq	$8, %xmm5
        pxor	%xmm5, %xmm2
        pxor	%xmm1, %xmm3
        movdqa	%xmm2, %xmm7
        movdqa	%xmm2, %xmm4
        movdqa	%xmm2, %xmm5
        pslld	$31, %xmm7
        pslld	$30, %xmm4
        pslld	$25, %xmm5
        pxor	%xmm4, %xmm7
        pxor	%xmm5, %xmm7
        movdqa	%xmm7, %xmm4
        pslldq	$12, %xmm7
        psrldq	$4, %xmm4
        pxor	%xmm7, %xmm2
        movdqa	%xmm2, %xmm5
        movdqa	%xmm2, %xmm1
        movdqa	%xmm2, %xmm0
        psrld	$0x01, %xmm5
        psrld	$2, %xmm1
        psrld	$7, %xmm0
        pxor	%xmm1, %xmm5
        pxor	%xmm0, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm5, %xmm2
        pxor	%xmm3, %xmm2
        movdqu	%xmm2, 80(%esp)
        addl	$0x40, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_decrypt_update_aesni_ghash_64_inplace
        jmp	L_AES_GCM_decrypt_update_aesni_ghash_64_done
L_AES_GCM_decrypt_update_aesni_ghash_64:
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        # Encrypt 64 bytes of counter
        movdqu	64(%esp), %xmm0
        movdqa	L_aes_gcm_bswap_epi64, %xmm7
        movdqa	%xmm0, %xmm1
        movdqa	%xmm0, %xmm2
        movdqa	%xmm0, %xmm3
        pshufb	%xmm7, %xmm0
        paddd	L_aes_gcm_one, %xmm1
        pshufb	%xmm7, %xmm1
        paddd	L_aes_gcm_two, %xmm2
        pshufb	%xmm7, %xmm2
        paddd	L_aes_gcm_three, %xmm3
        pshufb	%xmm7, %xmm3
        movdqu	64(%esp), %xmm7
        paddd	L_aes_gcm_four, %xmm7
        movdqu	%xmm7, 64(%esp)
        movdqa	(%ebp), %xmm7
        pxor	%xmm7, %xmm0
        pxor	%xmm7, %xmm1
        pxor	%xmm7, %xmm2
        pxor	%xmm7, %xmm3
        movdqa	16(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	32(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	48(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	64(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	80(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	96(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	112(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	128(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	144(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        cmpl	$11, 184(%esp)
        movdqa	160(%ebp), %xmm7
        jl	L_AES_GCM_decrypt_update_aesni_aesenc_64_ghash_avx_done
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	176(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        cmpl	$13, 184(%esp)
        movdqa	192(%ebp), %xmm7
        jl	L_AES_GCM_decrypt_update_aesni_aesenc_64_ghash_avx_done
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	208(%ebp), %xmm7
        aesenc	%xmm7, %xmm0
        aesenc	%xmm7, %xmm1
        aesenc	%xmm7, %xmm2
        aesenc	%xmm7, %xmm3
        movdqa	224(%ebp), %xmm7
L_AES_GCM_decrypt_update_aesni_aesenc_64_ghash_avx_done:
        aesenclast	%xmm7, %xmm0
        aesenclast	%xmm7, %xmm1
        movdqu	(%ecx), %xmm4
        movdqu	16(%ecx), %xmm5
        pxor	%xmm4, %xmm0
        pxor	%xmm5, %xmm1
        movdqu	%xmm4, (%ecx)
        movdqu	%xmm5, 16(%ecx)
        movdqu	%xmm0, (%edx)
        movdqu	%xmm1, 16(%edx)
        aesenclast	%xmm7, %xmm2
        aesenclast	%xmm7, %xmm3
        movdqu	32(%ecx), %xmm4
        movdqu	48(%ecx), %xmm5
        pxor	%xmm4, %xmm2
        pxor	%xmm5, %xmm3
        movdqu	%xmm4, 32(%ecx)
        movdqu	%xmm5, 48(%ecx)
        movdqu	%xmm2, 32(%edx)
        movdqu	%xmm3, 48(%edx)
        # ghash encrypted counter
        movdqu	80(%esp), %xmm2
        movdqu	48(%esp), %xmm7
        movdqu	(%ecx), %xmm0
        pshufb	L_aes_gcm_bswap_mask, %xmm0
        pxor	%xmm2, %xmm0
        pshufd	$0x4e, %xmm7, %xmm1
        pshufd	$0x4e, %xmm0, %xmm5
        pxor	%xmm7, %xmm1
        pxor	%xmm0, %xmm5
        movdqa	%xmm0, %xmm3
        pclmulqdq	$0x11, %xmm7, %xmm3
        movdqa	%xmm0, %xmm2
        pclmulqdq	$0x00, %xmm7, %xmm2
        pclmulqdq	$0x00, %xmm5, %xmm1
        pxor	%xmm2, %xmm1
        pxor	%xmm3, %xmm1
        movdqu	32(%esp), %xmm7
        movdqu	16(%ecx), %xmm0
        pshufd	$0x4e, %xmm7, %xmm4
        pshufb	L_aes_gcm_bswap_mask, %xmm0
        pxor	%xmm7, %xmm4
        pshufd	$0x4e, %xmm0, %xmm5
        pxor	%xmm0, %xmm5
        movdqa	%xmm0, %xmm6
        pclmulqdq	$0x11, %xmm7, %xmm6
        pclmulqdq	$0x00, %xmm0, %xmm7
        pclmulqdq	$0x00, %xmm5, %xmm4
        pxor	%xmm7, %xmm1
        pxor	%xmm7, %xmm2
        pxor	%xmm6, %xmm1
        pxor	%xmm6, %xmm3
        pxor	%xmm4, %xmm1
        movdqu	16(%esp), %xmm7
        movdqu	32(%ecx), %xmm0
        pshufd	$0x4e, %xmm7, %xmm4
        pshufb	L_aes_gcm_bswap_mask, %xmm0
        pxor	%xmm7, %xmm4
        pshufd	$0x4e, %xmm0, %xmm5
        pxor	%xmm0, %xmm5
        movdqa	%xmm0, %xmm6
        pclmulqdq	$0x11, %xmm7, %xmm6
        pclmulqdq	$0x00, %xmm0, %xmm7
        pclmulqdq	$0x00, %xmm5, %xmm4
        pxor	%xmm7, %xmm1
        pxor	%xmm7, %xmm2
        pxor	%xmm6, %xmm1
        pxor	%xmm6, %xmm3
        pxor	%xmm4, %xmm1
        movdqu	(%esp), %xmm7
        movdqu	48(%ecx), %xmm0
        pshufd	$0x4e, %xmm7, %xmm4
        pshufb	L_aes_gcm_bswap_mask, %xmm0
        pxor	%xmm7, %xmm4
        pshufd	$0x4e, %xmm0, %xmm5
        pxor	%xmm0, %xmm5
        movdqa	%xmm0, %xmm6
        pclmulqdq	$0x11, %xmm7, %xmm6
        pclmulqdq	$0x00, %xmm0, %xmm7
        pclmulqdq	$0x00, %xmm5, %xmm4
        pxor	%xmm7, %xmm1
        pxor	%xmm7, %xmm2
        pxor	%xmm6, %xmm1
        pxor	%xmm6, %xmm3
        pxor	%xmm4, %xmm1
        movdqa	%xmm1, %xmm5
        psrldq	$8, %xmm1
        pslldq	$8, %xmm5
        pxor	%xmm5, %xmm2
        pxor	%xmm1, %xmm3
        movdqa	%xmm2, %xmm7
        movdqa	%xmm2, %xmm4
        movdqa	%xmm2, %xmm5
        pslld	$31, %xmm7
        pslld	$30, %xmm4
        pslld	$25, %xmm5
        pxor	%xmm4, %xmm7
        pxor	%xmm5, %xmm7
        movdqa	%xmm7, %xmm4
        pslldq	$12, %xmm7
        psrldq	$4, %xmm4
        pxor	%xmm7, %xmm2
        movdqa	%xmm2, %xmm5
        movdqa	%xmm2, %xmm1
        movdqa	%xmm2, %xmm0
        psrld	$0x01, %xmm5
        psrld	$2, %xmm1
        psrld	$7, %xmm0
        pxor	%xmm1, %xmm5
        pxor	%xmm0, %xmm5
        pxor	%xmm4, %xmm5
        pxor	%xmm5, %xmm2
        pxor	%xmm3, %xmm2
        movdqu	%xmm2, 80(%esp)
        addl	$0x40, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_decrypt_update_aesni_ghash_64
L_AES_GCM_decrypt_update_aesni_ghash_64_done:
        movdqa	%xmm2, %xmm6
        movdqu	(%esp), %xmm5
L_AES_GCM_decrypt_update_aesni_done_64:
        movl	196(%esp), %edx
        cmpl	%edx, %ebx
        jge	L_AES_GCM_decrypt_update_aesni_done_dec
        movl	196(%esp), %eax
        andl	$0xfffffff0, %eax
        cmpl	%eax, %ebx
        jge	L_AES_GCM_decrypt_update_aesni_last_block_done
L_AES_GCM_decrypt_update_aesni_last_block_start:
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        movdqu	(%ecx), %xmm1
        pshufb	L_aes_gcm_bswap_mask, %xmm1
        pxor	%xmm6, %xmm1
        movdqu	%xmm1, (%esp)
        movdqu	64(%esp), %xmm0
        movdqa	%xmm0, %xmm1
        pshufb	L_aes_gcm_bswap_epi64, %xmm0
        paddd	L_aes_gcm_one, %xmm1
        pxor	(%ebp), %xmm0
        movdqu	%xmm1, 64(%esp)
        movdqu	(%esp), %xmm4
        pclmulqdq	$16, %xmm5, %xmm4
        aesenc	16(%ebp), %xmm0
        aesenc	32(%ebp), %xmm0
        movdqu	(%esp), %xmm7
        pclmulqdq	$0x01, %xmm5, %xmm7
        aesenc	48(%ebp), %xmm0
        aesenc	64(%ebp), %xmm0
        aesenc	80(%ebp), %xmm0
        movdqu	(%esp), %xmm1
        pclmulqdq	$0x11, %xmm5, %xmm1
        aesenc	96(%ebp), %xmm0
        pxor	%xmm7, %xmm4
        movdqa	%xmm4, %xmm2
        psrldq	$8, %xmm4
        pslldq	$8, %xmm2
        aesenc	112(%ebp), %xmm0
        movdqu	(%esp), %xmm7
        pclmulqdq	$0x00, %xmm5, %xmm7
        pxor	%xmm7, %xmm2
        pxor	%xmm4, %xmm1
        movdqa	L_aes_gcm_mod2_128, %xmm3
        movdqa	%xmm2, %xmm7
        pclmulqdq	$16, %xmm3, %xmm7
        aesenc	128(%ebp), %xmm0
        pshufd	$0x4e, %xmm2, %xmm4
        pxor	%xmm7, %xmm4
        movdqa	%xmm4, %xmm7
        pclmulqdq	$16, %xmm3, %xmm7
        aesenc	144(%ebp), %xmm0
        pshufd	$0x4e, %xmm4, %xmm6
        pxor	%xmm7, %xmm6
        pxor	%xmm1, %xmm6
        cmpl	$11, 184(%esp)
        movdqa	160(%ebp), %xmm1
        jl	L_AES_GCM_decrypt_update_aesni_aesenc_gfmul_last
        aesenc	%xmm1, %xmm0
        aesenc	176(%ebp), %xmm0
        cmpl	$13, 184(%esp)
        movdqa	192(%ebp), %xmm1
        jl	L_AES_GCM_decrypt_update_aesni_aesenc_gfmul_last
        aesenc	%xmm1, %xmm0
        aesenc	208(%ebp), %xmm0
        movdqa	224(%ebp), %xmm1
L_AES_GCM_decrypt_update_aesni_aesenc_gfmul_last:
        aesenclast	%xmm1, %xmm0
        movdqu	(%ecx), %xmm1
        pxor	%xmm1, %xmm0
        movdqu	%xmm0, (%edx)
        addl	$16, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_decrypt_update_aesni_last_block_start
L_AES_GCM_decrypt_update_aesni_last_block_done:
L_AES_GCM_decrypt_update_aesni_done_dec:
        movl	200(%esp), %esi
        movl	208(%esp), %edi
        movdqu	64(%esp), %xmm4
        movdqa	%xmm6, (%esi)
        movdqu	%xmm4, (%edi)
        addl	$0xa0, %esp
        popl	%ebp
        popl	%edi
        popl	%esi
        popl	%ebx
        ret
.size	AES_GCM_decrypt_update_aesni,.-AES_GCM_decrypt_update_aesni
.text
.globl	AES_GCM_decrypt_final_aesni
.type	AES_GCM_decrypt_final_aesni,@function
.align	16
AES_GCM_decrypt_final_aesni:
        pushl	%ebx
        pushl	%esi
        pushl	%edi
        pushl	%ebp
        subl	$16, %esp
        movl	36(%esp), %ebp
        movl	56(%esp), %esi
        movl	60(%esp), %edi
        movdqa	(%ebp), %xmm6
        movdqa	(%esi), %xmm5
        movdqa	(%edi), %xmm7
        movdqa	%xmm5, %xmm1
        movdqa	%xmm5, %xmm0
        psrlq	$63, %xmm1
        psllq	$0x01, %xmm0
        pslldq	$8, %xmm1
        por	%xmm1, %xmm0
        pshufd	$0xff, %xmm5, %xmm5
        psrad	$31, %xmm5
        pand	L_aes_gcm_mod2_128, %xmm5
        pxor	%xmm0, %xmm5
        movl	48(%esp), %edx
        movl	52(%esp), %ecx
        shll	$3, %edx
        shll	$3, %ecx
        pinsrd	$0x00, %edx, %xmm0
        pinsrd	$2, %ecx, %xmm0
        movl	48(%esp), %edx
        movl	52(%esp), %ecx
        shrl	$29, %edx
        shrl	$29, %ecx
        pinsrd	$0x01, %edx, %xmm0
        pinsrd	$3, %ecx, %xmm0
        pxor	%xmm0, %xmm6
        pshufd	$0x4e, %xmm5, %xmm1
        pshufd	$0x4e, %xmm6, %xmm2
        movdqa	%xmm6, %xmm3
        movdqa	%xmm6, %xmm0
        pclmulqdq	$0x11, %xmm5, %xmm3
        pclmulqdq	$0x00, %xmm5, %xmm0
        pxor	%xmm5, %xmm1
        pxor	%xmm6, %xmm2
        pclmulqdq	$0x00, %xmm2, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm2
        movdqa	%xmm3, %xmm6
        pslldq	$8, %xmm2
        psrldq	$8, %xmm1
        pxor	%xmm2, %xmm0
        pxor	%xmm1, %xmm6
        movdqa	%xmm0, %xmm1
        movdqa	%xmm0, %xmm2
        movdqa	%xmm0, %xmm3
        pslld	$31, %xmm1
        pslld	$30, %xmm2
        pslld	$25, %xmm3
        pxor	%xmm2, %xmm1
        pxor	%xmm3, %xmm1
        movdqa	%xmm1, %xmm3
        psrldq	$4, %xmm3
        pslldq	$12, %xmm1
        pxor	%xmm1, %xmm0
        movdqa	%xmm0, %xmm1
        movdqa	%xmm0, %xmm2
        psrld	$0x01, %xmm1
        psrld	$2, %xmm2
        pxor	%xmm2, %xmm1
        pxor	%xmm0, %xmm1
        psrld	$7, %xmm0
        pxor	%xmm3, %xmm1
        pxor	%xmm0, %xmm1
        pxor	%xmm1, %xmm6
        pshufb	L_aes_gcm_bswap_mask, %xmm6
        movdqu	%xmm7, %xmm0
        pxor	%xmm6, %xmm0
        movl	40(%esp), %esi
        movl	64(%esp), %edi
        cmpl	$16, 44(%esp)
        je	L_AES_GCM_decrypt_final_aesni_cmp_tag_16
        subl	$16, %esp
        xorl	%ecx, %ecx
        xorl	%ebx, %ebx
        movdqu	%xmm0, (%esp)
L_AES_GCM_decrypt_final_aesni_cmp_tag_loop:
        movzbl	(%esp,%ecx,1), %eax
        xorb	(%esi,%ecx,1), %al
        orb	%al, %bl
        incl	%ecx
        cmpl	44(%esp), %ecx
        jne	L_AES_GCM_decrypt_final_aesni_cmp_tag_loop
        cmpb	$0x00, %bl
        sete	%bl
        addl	$16, %esp
        xorl	%ecx, %ecx
        jmp	L_AES_GCM_decrypt_final_aesni_cmp_tag_done
L_AES_GCM_decrypt_final_aesni_cmp_tag_16:
        movdqu	(%esi), %xmm1
        pcmpeqb	%xmm1, %xmm0
        pmovmskb	%xmm0, %edx
        # %%edx == 0xFFFF then return 1 else => return 0
        xorl	%ebx, %ebx
        cmpl	$0xffff, %edx
        sete	%bl
L_AES_GCM_decrypt_final_aesni_cmp_tag_done:
        movl	%ebx, (%edi)
        addl	$16, %esp
        popl	%ebp
        popl	%edi
        popl	%esi
        popl	%ebx
        ret
.size	AES_GCM_decrypt_final_aesni,.-AES_GCM_decrypt_final_aesni
#endif /* WOLFSSL_AESGCM_STREAM */
#ifdef HAVE_INTEL_AVX1
.text
.globl	AES_GCM_encrypt_avx1
.type	AES_GCM_encrypt_avx1,@function
.align	16
AES_GCM_encrypt_avx1:
        pushl	%ebx
        pushl	%esi
        pushl	%edi
        pushl	%ebp
        subl	$0x70, %esp
        movl	144(%esp), %esi
        movl	168(%esp), %ebp
        movl	160(%esp), %edx
        vpxor	%xmm0, %xmm0, %xmm0
        vpxor	%xmm2, %xmm2, %xmm2
        cmpl	$12, %edx
        jne	L_AES_GCM_encrypt_avx1_iv_not_12
        # # Calculate values when IV is 12 bytes
        # Set counter based on IV
        movl	$0x1000000, %ecx
        vpinsrd	$0x00, (%esi), %xmm0, %xmm0
        vpinsrd	$0x01, 4(%esi), %xmm0, %xmm0
        vpinsrd	$2, 8(%esi), %xmm0, %xmm0
        vpinsrd	$3, %ecx, %xmm0, %xmm0
        # H = Encrypt X(=0) and T = Encrypt counter
        vmovdqa	(%ebp), %xmm1
        vpxor	%xmm1, %xmm0, %xmm5
        vmovdqa	16(%ebp), %xmm3
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        vmovdqa	32(%ebp), %xmm3
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        vmovdqa	48(%ebp), %xmm3
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        vmovdqa	64(%ebp), %xmm3
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        vmovdqa	80(%ebp), %xmm3
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        vmovdqa	96(%ebp), %xmm3
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        vmovdqa	112(%ebp), %xmm3
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        vmovdqa	128(%ebp), %xmm3
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        vmovdqa	144(%ebp), %xmm3
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        cmpl	$11, 172(%esp)
        vmovdqa	160(%ebp), %xmm3
        jl	L_AES_GCM_encrypt_avx1_calc_iv_12_last
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        vmovdqa	176(%ebp), %xmm3
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        cmpl	$13, 172(%esp)
        vmovdqa	192(%ebp), %xmm3
        jl	L_AES_GCM_encrypt_avx1_calc_iv_12_last
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        vmovdqa	208(%ebp), %xmm3
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        vmovdqa	224(%ebp), %xmm3
L_AES_GCM_encrypt_avx1_calc_iv_12_last:
        vaesenclast	%xmm3, %xmm1, %xmm1
        vaesenclast	%xmm3, %xmm5, %xmm5
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm1, %xmm1
        vmovdqu	%xmm5, 80(%esp)
        jmp	L_AES_GCM_encrypt_avx1_iv_done
L_AES_GCM_encrypt_avx1_iv_not_12:
        # Calculate values when IV is not 12 bytes
        # H = Encrypt X(=0)
        vmovdqa	(%ebp), %xmm1
        vaesenc	16(%ebp), %xmm1, %xmm1
        vaesenc	32(%ebp), %xmm1, %xmm1
        vaesenc	48(%ebp), %xmm1, %xmm1
        vaesenc	64(%ebp), %xmm1, %xmm1
        vaesenc	80(%ebp), %xmm1, %xmm1
        vaesenc	96(%ebp), %xmm1, %xmm1
        vaesenc	112(%ebp), %xmm1, %xmm1
        vaesenc	128(%ebp), %xmm1, %xmm1
        vaesenc	144(%ebp), %xmm1, %xmm1
        cmpl	$11, 172(%esp)
        vmovdqa	160(%ebp), %xmm5
        jl	L_AES_GCM_encrypt_avx1_calc_iv_1_aesenc_avx_last
        vaesenc	%xmm5, %xmm1, %xmm1
        vaesenc	176(%ebp), %xmm1, %xmm1
        cmpl	$13, 172(%esp)
        vmovdqa	192(%ebp), %xmm5
        jl	L_AES_GCM_encrypt_avx1_calc_iv_1_aesenc_avx_last
        vaesenc	%xmm5, %xmm1, %xmm1
        vaesenc	208(%ebp), %xmm1, %xmm1
        vmovdqa	224(%ebp), %xmm5
L_AES_GCM_encrypt_avx1_calc_iv_1_aesenc_avx_last:
        vaesenclast	%xmm5, %xmm1, %xmm1
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm1, %xmm1
        # Calc counter
        # Initialization vector
        cmpl	$0x00, %edx
        movl	$0x00, %ecx
        je	L_AES_GCM_encrypt_avx1_calc_iv_done
        cmpl	$16, %edx
        jl	L_AES_GCM_encrypt_avx1_calc_iv_lt16
        andl	$0xfffffff0, %edx
L_AES_GCM_encrypt_avx1_calc_iv_16_loop:
        vmovdqu	(%esi,%ecx,1), %xmm4
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm4, %xmm0, %xmm0
        # ghash_gfmul_avx
        vpshufd	$0x4e, %xmm0, %xmm5
        vpshufd	$0x4e, %xmm1, %xmm6
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm7
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpxor	%xmm0, %xmm5, %xmm5
        vpxor	%xmm1, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vmovdqa	%xmm4, %xmm3
        vmovdqa	%xmm7, %xmm0
        vpslldq	$8, %xmm5, %xmm6
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm6, %xmm3, %xmm3
        vpxor	%xmm5, %xmm0, %xmm0
        vpsrld	$31, %xmm3, %xmm4
        vpsrld	$31, %xmm0, %xmm5
        vpslld	$0x01, %xmm3, %xmm3
        vpslld	$0x01, %xmm0, %xmm0
        vpsrldq	$12, %xmm4, %xmm6
        vpslldq	$4, %xmm4, %xmm4
        vpslldq	$4, %xmm5, %xmm5
        vpor	%xmm6, %xmm0, %xmm0
        vpor	%xmm4, %xmm3, %xmm3
        vpor	%xmm5, %xmm0, %xmm0
        vpslld	$31, %xmm3, %xmm4
        vpslld	$30, %xmm3, %xmm5
        vpslld	$25, %xmm3, %xmm6
        vpxor	%xmm5, %xmm4, %xmm4
        vpxor	%xmm6, %xmm4, %xmm4
        vmovdqa	%xmm4, %xmm5
        vpsrldq	$4, %xmm5, %xmm5
        vpslldq	$12, %xmm4, %xmm4
        vpxor	%xmm4, %xmm3, %xmm3
        vpsrld	$0x01, %xmm3, %xmm6
        vpsrld	$2, %xmm3, %xmm7
        vpsrld	$7, %xmm3, %xmm4
        vpxor	%xmm7, %xmm6, %xmm6
        vpxor	%xmm4, %xmm6, %xmm6
        vpxor	%xmm5, %xmm6, %xmm6
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm6, %xmm0, %xmm0
        addl	$16, %ecx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_encrypt_avx1_calc_iv_16_loop
        movl	160(%esp), %edx
        cmpl	%edx, %ecx
        je	L_AES_GCM_encrypt_avx1_calc_iv_done
L_AES_GCM_encrypt_avx1_calc_iv_lt16:
        subl	$16, %esp
        vpxor	%xmm4, %xmm4, %xmm4
        xorl	%ebx, %ebx
        vmovdqu	%xmm4, (%esp)
L_AES_GCM_encrypt_avx1_calc_iv_loop:
        movzbl	(%esi,%ecx,1), %eax
        movb	%al, (%esp,%ebx,1)
        incl	%ecx
        incl	%ebx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_encrypt_avx1_calc_iv_loop
        vmovdqu	(%esp), %xmm4
        addl	$16, %esp
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm4, %xmm0, %xmm0
        # ghash_gfmul_avx
        vpshufd	$0x4e, %xmm0, %xmm5
        vpshufd	$0x4e, %xmm1, %xmm6
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm7
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpxor	%xmm0, %xmm5, %xmm5
        vpxor	%xmm1, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vmovdqa	%xmm4, %xmm3
        vmovdqa	%xmm7, %xmm0
        vpslldq	$8, %xmm5, %xmm6
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm6, %xmm3, %xmm3
        vpxor	%xmm5, %xmm0, %xmm0
        vpsrld	$31, %xmm3, %xmm4
        vpsrld	$31, %xmm0, %xmm5
        vpslld	$0x01, %xmm3, %xmm3
        vpslld	$0x01, %xmm0, %xmm0
        vpsrldq	$12, %xmm4, %xmm6
        vpslldq	$4, %xmm4, %xmm4
        vpslldq	$4, %xmm5, %xmm5
        vpor	%xmm6, %xmm0, %xmm0
        vpor	%xmm4, %xmm3, %xmm3
        vpor	%xmm5, %xmm0, %xmm0
        vpslld	$31, %xmm3, %xmm4
        vpslld	$30, %xmm3, %xmm5
        vpslld	$25, %xmm3, %xmm6
        vpxor	%xmm5, %xmm4, %xmm4
        vpxor	%xmm6, %xmm4, %xmm4
        vmovdqa	%xmm4, %xmm5
        vpsrldq	$4, %xmm5, %xmm5
        vpslldq	$12, %xmm4, %xmm4
        vpxor	%xmm4, %xmm3, %xmm3
        vpsrld	$0x01, %xmm3, %xmm6
        vpsrld	$2, %xmm3, %xmm7
        vpsrld	$7, %xmm3, %xmm4
        vpxor	%xmm7, %xmm6, %xmm6
        vpxor	%xmm4, %xmm6, %xmm6
        vpxor	%xmm5, %xmm6, %xmm6
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm6, %xmm0, %xmm0
L_AES_GCM_encrypt_avx1_calc_iv_done:
        # T = Encrypt counter
        vpxor	%xmm4, %xmm4, %xmm4
        shll	$3, %edx
        vpinsrd	$0x00, %edx, %xmm4, %xmm4
        vpxor	%xmm4, %xmm0, %xmm0
        # ghash_gfmul_avx
        vpshufd	$0x4e, %xmm0, %xmm5
        vpshufd	$0x4e, %xmm1, %xmm6
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm7
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpxor	%xmm0, %xmm5, %xmm5
        vpxor	%xmm1, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vmovdqa	%xmm4, %xmm3
        vmovdqa	%xmm7, %xmm0
        vpslldq	$8, %xmm5, %xmm6
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm6, %xmm3, %xmm3
        vpxor	%xmm5, %xmm0, %xmm0
        vpsrld	$31, %xmm3, %xmm4
        vpsrld	$31, %xmm0, %xmm5
        vpslld	$0x01, %xmm3, %xmm3
        vpslld	$0x01, %xmm0, %xmm0
        vpsrldq	$12, %xmm4, %xmm6
        vpslldq	$4, %xmm4, %xmm4
        vpslldq	$4, %xmm5, %xmm5
        vpor	%xmm6, %xmm0, %xmm0
        vpor	%xmm4, %xmm3, %xmm3
        vpor	%xmm5, %xmm0, %xmm0
        vpslld	$31, %xmm3, %xmm4
        vpslld	$30, %xmm3, %xmm5
        vpslld	$25, %xmm3, %xmm6
        vpxor	%xmm5, %xmm4, %xmm4
        vpxor	%xmm6, %xmm4, %xmm4
        vmovdqa	%xmm4, %xmm5
        vpsrldq	$4, %xmm5, %xmm5
        vpslldq	$12, %xmm4, %xmm4
        vpxor	%xmm4, %xmm3, %xmm3
        vpsrld	$0x01, %xmm3, %xmm6
        vpsrld	$2, %xmm3, %xmm7
        vpsrld	$7, %xmm3, %xmm4
        vpxor	%xmm7, %xmm6, %xmm6
        vpxor	%xmm4, %xmm6, %xmm6
        vpxor	%xmm5, %xmm6, %xmm6
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm6, %xmm0, %xmm0
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
        #   Encrypt counter
        vmovdqa	(%ebp), %xmm4
        vpxor	%xmm0, %xmm4, %xmm4
        vaesenc	16(%ebp), %xmm4, %xmm4
        vaesenc	32(%ebp), %xmm4, %xmm4
        vaesenc	48(%ebp), %xmm4, %xmm4
        vaesenc	64(%ebp), %xmm4, %xmm4
        vaesenc	80(%ebp), %xmm4, %xmm4
        vaesenc	96(%ebp), %xmm4, %xmm4
        vaesenc	112(%ebp), %xmm4, %xmm4
        vaesenc	128(%ebp), %xmm4, %xmm4
        vaesenc	144(%ebp), %xmm4, %xmm4
        cmpl	$11, 172(%esp)
        vmovdqa	160(%ebp), %xmm5
        jl	L_AES_GCM_encrypt_avx1_calc_iv_2_aesenc_avx_last
        vaesenc	%xmm5, %xmm4, %xmm4
        vaesenc	176(%ebp), %xmm4, %xmm4
        cmpl	$13, 172(%esp)
        vmovdqa	192(%ebp), %xmm5
        jl	L_AES_GCM_encrypt_avx1_calc_iv_2_aesenc_avx_last
        vaesenc	%xmm5, %xmm4, %xmm4
        vaesenc	208(%ebp), %xmm4, %xmm4
        vmovdqa	224(%ebp), %xmm5
L_AES_GCM_encrypt_avx1_calc_iv_2_aesenc_avx_last:
        vaesenclast	%xmm5, %xmm4, %xmm4
        vmovdqu	%xmm4, 80(%esp)
L_AES_GCM_encrypt_avx1_iv_done:
        movl	140(%esp), %esi
        # Additional authentication data
        movl	156(%esp), %edx
        cmpl	$0x00, %edx
        je	L_AES_GCM_encrypt_avx1_calc_aad_done
        xorl	%ecx, %ecx
        cmpl	$16, %edx
        jl	L_AES_GCM_encrypt_avx1_calc_aad_lt16
        andl	$0xfffffff0, %edx
L_AES_GCM_encrypt_avx1_calc_aad_16_loop:
        vmovdqu	(%esi,%ecx,1), %xmm4
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm4, %xmm2, %xmm2
        # ghash_gfmul_avx
        vpshufd	$0x4e, %xmm2, %xmm5
        vpshufd	$0x4e, %xmm1, %xmm6
        vpclmulqdq	$0x11, %xmm2, %xmm1, %xmm7
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm4
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm1, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vmovdqa	%xmm4, %xmm3
        vmovdqa	%xmm7, %xmm2
        vpslldq	$8, %xmm5, %xmm6
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm6, %xmm3, %xmm3
        vpxor	%xmm5, %xmm2, %xmm2
        vpsrld	$31, %xmm3, %xmm4
        vpsrld	$31, %xmm2, %xmm5
        vpslld	$0x01, %xmm3, %xmm3
        vpslld	$0x01, %xmm2, %xmm2
        vpsrldq	$12, %xmm4, %xmm6
        vpslldq	$4, %xmm4, %xmm4
        vpslldq	$4, %xmm5, %xmm5
        vpor	%xmm6, %xmm2, %xmm2
        vpor	%xmm4, %xmm3, %xmm3
        vpor	%xmm5, %xmm2, %xmm2
        vpslld	$31, %xmm3, %xmm4
        vpslld	$30, %xmm3, %xmm5
        vpslld	$25, %xmm3, %xmm6
        vpxor	%xmm5, %xmm4, %xmm4
        vpxor	%xmm6, %xmm4, %xmm4
        vmovdqa	%xmm4, %xmm5
        vpsrldq	$4, %xmm5, %xmm5
        vpslldq	$12, %xmm4, %xmm4
        vpxor	%xmm4, %xmm3, %xmm3
        vpsrld	$0x01, %xmm3, %xmm6
        vpsrld	$2, %xmm3, %xmm7
        vpsrld	$7, %xmm3, %xmm4
        vpxor	%xmm7, %xmm6, %xmm6
        vpxor	%xmm4, %xmm6, %xmm6
        vpxor	%xmm5, %xmm6, %xmm6
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm6, %xmm2, %xmm2
        addl	$16, %ecx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_encrypt_avx1_calc_aad_16_loop
        movl	156(%esp), %edx
        cmpl	%edx, %ecx
        je	L_AES_GCM_encrypt_avx1_calc_aad_done
L_AES_GCM_encrypt_avx1_calc_aad_lt16:
        subl	$16, %esp
        vpxor	%xmm4, %xmm4, %xmm4
        xorl	%ebx, %ebx
        vmovdqu	%xmm4, (%esp)
L_AES_GCM_encrypt_avx1_calc_aad_loop:
        movzbl	(%esi,%ecx,1), %eax
        movb	%al, (%esp,%ebx,1)
        incl	%ecx
        incl	%ebx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_encrypt_avx1_calc_aad_loop
        vmovdqu	(%esp), %xmm4
        addl	$16, %esp
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm4, %xmm2, %xmm2
        # ghash_gfmul_avx
        vpshufd	$0x4e, %xmm2, %xmm5
        vpshufd	$0x4e, %xmm1, %xmm6
        vpclmulqdq	$0x11, %xmm2, %xmm1, %xmm7
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm4
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm1, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vmovdqa	%xmm4, %xmm3
        vmovdqa	%xmm7, %xmm2
        vpslldq	$8, %xmm5, %xmm6
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm6, %xmm3, %xmm3
        vpxor	%xmm5, %xmm2, %xmm2
        vpsrld	$31, %xmm3, %xmm4
        vpsrld	$31, %xmm2, %xmm5
        vpslld	$0x01, %xmm3, %xmm3
        vpslld	$0x01, %xmm2, %xmm2
        vpsrldq	$12, %xmm4, %xmm6
        vpslldq	$4, %xmm4, %xmm4
        vpslldq	$4, %xmm5, %xmm5
        vpor	%xmm6, %xmm2, %xmm2
        vpor	%xmm4, %xmm3, %xmm3
        vpor	%xmm5, %xmm2, %xmm2
        vpslld	$31, %xmm3, %xmm4
        vpslld	$30, %xmm3, %xmm5
        vpslld	$25, %xmm3, %xmm6
        vpxor	%xmm5, %xmm4, %xmm4
        vpxor	%xmm6, %xmm4, %xmm4
        vmovdqa	%xmm4, %xmm5
        vpsrldq	$4, %xmm5, %xmm5
        vpslldq	$12, %xmm4, %xmm4
        vpxor	%xmm4, %xmm3, %xmm3
        vpsrld	$0x01, %xmm3, %xmm6
        vpsrld	$2, %xmm3, %xmm7
        vpsrld	$7, %xmm3, %xmm4
        vpxor	%xmm7, %xmm6, %xmm6
        vpxor	%xmm4, %xmm6, %xmm6
        vpxor	%xmm5, %xmm6, %xmm6
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm6, %xmm2, %xmm2
L_AES_GCM_encrypt_avx1_calc_aad_done:
        vmovdqu	%xmm2, 96(%esp)
        movl	132(%esp), %esi
        movl	136(%esp), %edi
        # Calculate counter and H
        vpsrlq	$63, %xmm1, %xmm5
        vpsllq	$0x01, %xmm1, %xmm4
        vpslldq	$8, %xmm5, %xmm5
        vpor	%xmm5, %xmm4, %xmm4
        vpshufd	$0xff, %xmm1, %xmm1
        vpsrad	$31, %xmm1, %xmm1
        vpshufb	L_aes_gcm_avx1_bswap_epi64, %xmm0, %xmm0
        vpand	L_aes_gcm_avx1_mod2_128, %xmm1, %xmm1
        vpaddd	L_aes_gcm_avx1_one, %xmm0, %xmm0
        vpxor	%xmm4, %xmm1, %xmm1
        vmovdqu	%xmm0, 64(%esp)
        xorl	%ebx, %ebx
        cmpl	$0x40, 152(%esp)
        movl	152(%esp), %eax
        jl	L_AES_GCM_encrypt_avx1_done_64
        andl	$0xffffffc0, %eax
        vmovdqa	%xmm2, %xmm6
        # H ^ 1
        vmovdqu	%xmm1, (%esp)
        # H ^ 2
        vpclmulqdq	$0x00, %xmm1, %xmm1, %xmm4
        vpclmulqdq	$0x11, %xmm1, %xmm1, %xmm0
        vpslld	$31, %xmm4, %xmm5
        vpslld	$30, %xmm4, %xmm6
        vpslld	$25, %xmm4, %xmm7
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vpsrldq	$4, %xmm5, %xmm7
        vpslldq	$12, %xmm5, %xmm5
        vpxor	%xmm5, %xmm4, %xmm4
        vpsrld	$0x01, %xmm4, %xmm5
        vpsrld	$2, %xmm4, %xmm6
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpsrld	$7, %xmm4, %xmm4
        vpxor	%xmm7, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm5, %xmm0, %xmm0
        vmovdqu	%xmm0, 16(%esp)
        # H ^ 3
        # ghash_gfmul_red_avx
        vpshufd	$0x4e, %xmm1, %xmm5
        vpshufd	$0x4e, %xmm0, %xmm6
        vpclmulqdq	$0x11, %xmm1, %xmm0, %xmm7
        vpclmulqdq	$0x00, %xmm1, %xmm0, %xmm4
        vpxor	%xmm1, %xmm5, %xmm5
        vpxor	%xmm0, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vpslldq	$8, %xmm5, %xmm6
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm6, %xmm4, %xmm4
        vpxor	%xmm5, %xmm7, %xmm3
        vpslld	$31, %xmm4, %xmm5
        vpslld	$30, %xmm4, %xmm6
        vpslld	$25, %xmm4, %xmm7
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vpsrldq	$4, %xmm5, %xmm7
        vpslldq	$12, %xmm5, %xmm5
        vpxor	%xmm5, %xmm4, %xmm4
        vpsrld	$0x01, %xmm4, %xmm5
        vpsrld	$2, %xmm4, %xmm6
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpsrld	$7, %xmm4, %xmm4
        vpxor	%xmm7, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm5, %xmm3, %xmm3
        vmovdqu	%xmm3, 32(%esp)
        # H ^ 4
        vpclmulqdq	$0x00, %xmm0, %xmm0, %xmm4
        vpclmulqdq	$0x11, %xmm0, %xmm0, %xmm3
        vpslld	$31, %xmm4, %xmm5
        vpslld	$30, %xmm4, %xmm6
        vpslld	$25, %xmm4, %xmm7
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vpsrldq	$4, %xmm5, %xmm7
        vpslldq	$12, %xmm5, %xmm5
        vpxor	%xmm5, %xmm4, %xmm4
        vpsrld	$0x01, %xmm4, %xmm5
        vpsrld	$2, %xmm4, %xmm6
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpsrld	$7, %xmm4, %xmm4
        vpxor	%xmm7, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm5, %xmm3, %xmm3
        vmovdqu	%xmm3, 48(%esp)
        # First 64 bytes of input
        vmovdqu	64(%esp), %xmm4
        vmovdqa	L_aes_gcm_avx1_bswap_epi64, %xmm3
        vpaddd	L_aes_gcm_avx1_one, %xmm4, %xmm5
        vpshufb	%xmm3, %xmm5, %xmm5
        vpaddd	L_aes_gcm_avx1_two, %xmm4, %xmm6
        vpshufb	%xmm3, %xmm6, %xmm6
        vpaddd	L_aes_gcm_avx1_three, %xmm4, %xmm7
        vpshufb	%xmm3, %xmm7, %xmm7
        vpshufb	%xmm3, %xmm4, %xmm4
        vmovdqu	64(%esp), %xmm3
        vpaddd	L_aes_gcm_avx1_four, %xmm3, %xmm3
        vmovdqu	%xmm3, 64(%esp)
        vmovdqa	(%ebp), %xmm3
        vpxor	%xmm3, %xmm4, %xmm4
        vpxor	%xmm3, %xmm5, %xmm5
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm3, %xmm7, %xmm7
        vmovdqa	16(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	32(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	48(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	64(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	80(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	96(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	112(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	128(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	144(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        cmpl	$11, 172(%esp)
        vmovdqa	160(%ebp), %xmm3
        jl	L_AES_GCM_encrypt_avx1_aesenc_64_enc_done
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	176(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        cmpl	$13, 172(%esp)
        vmovdqa	192(%ebp), %xmm3
        jl	L_AES_GCM_encrypt_avx1_aesenc_64_enc_done
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	208(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	224(%ebp), %xmm3
L_AES_GCM_encrypt_avx1_aesenc_64_enc_done:
        vaesenclast	%xmm3, %xmm4, %xmm4
        vaesenclast	%xmm3, %xmm5, %xmm5
        vmovdqu	(%esi), %xmm0
        vmovdqu	16(%esi), %xmm1
        vpxor	%xmm0, %xmm4, %xmm4
        vpxor	%xmm1, %xmm5, %xmm5
        vmovdqu	%xmm0, (%esi)
        vmovdqu	%xmm1, 16(%esi)
        vmovdqu	%xmm4, (%edi)
        vmovdqu	%xmm5, 16(%edi)
        vaesenclast	%xmm3, %xmm6, %xmm6
        vaesenclast	%xmm3, %xmm7, %xmm7
        vmovdqu	32(%esi), %xmm0
        vmovdqu	48(%esi), %xmm1
        vpxor	%xmm0, %xmm6, %xmm6
        vpxor	%xmm1, %xmm7, %xmm7
        vmovdqu	%xmm0, 32(%esi)
        vmovdqu	%xmm1, 48(%esi)
        vmovdqu	%xmm6, 32(%edi)
        vmovdqu	%xmm7, 48(%edi)
        cmpl	$0x40, %eax
        movl	$0x40, %ebx
        movl	%esi, %ecx
        movl	%edi, %edx
        jle	L_AES_GCM_encrypt_avx1_end_64
        # More 64 bytes of input
L_AES_GCM_encrypt_avx1_ghash_64:
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        vmovdqu	64(%esp), %xmm4
        vmovdqa	L_aes_gcm_avx1_bswap_epi64, %xmm3
        vpaddd	L_aes_gcm_avx1_one, %xmm4, %xmm5
        vpshufb	%xmm3, %xmm5, %xmm5
        vpaddd	L_aes_gcm_avx1_two, %xmm4, %xmm6
        vpshufb	%xmm3, %xmm6, %xmm6
        vpaddd	L_aes_gcm_avx1_three, %xmm4, %xmm7
        vpshufb	%xmm3, %xmm7, %xmm7
        vpshufb	%xmm3, %xmm4, %xmm4
        vmovdqu	64(%esp), %xmm3
        vpaddd	L_aes_gcm_avx1_four, %xmm3, %xmm3
        vmovdqu	%xmm3, 64(%esp)
        vmovdqa	(%ebp), %xmm3
        vpxor	%xmm3, %xmm4, %xmm4
        vpxor	%xmm3, %xmm5, %xmm5
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm3, %xmm7, %xmm7
        vmovdqa	16(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	32(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	48(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	64(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	80(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	96(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	112(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	128(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	144(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        cmpl	$11, 172(%esp)
        vmovdqa	160(%ebp), %xmm3
        jl	L_AES_GCM_encrypt_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	176(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        cmpl	$13, 172(%esp)
        vmovdqa	192(%ebp), %xmm3
        jl	L_AES_GCM_encrypt_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	208(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	224(%ebp), %xmm3
L_AES_GCM_encrypt_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done:
        vaesenclast	%xmm3, %xmm4, %xmm4
        vaesenclast	%xmm3, %xmm5, %xmm5
        vmovdqu	(%ecx), %xmm0
        vmovdqu	16(%ecx), %xmm1
        vpxor	%xmm0, %xmm4, %xmm4
        vpxor	%xmm1, %xmm5, %xmm5
        vmovdqu	%xmm4, (%edx)
        vmovdqu	%xmm5, 16(%edx)
        vaesenclast	%xmm3, %xmm6, %xmm6
        vaesenclast	%xmm3, %xmm7, %xmm7
        vmovdqu	32(%ecx), %xmm0
        vmovdqu	48(%ecx), %xmm1
        vpxor	%xmm0, %xmm6, %xmm6
        vpxor	%xmm1, %xmm7, %xmm7
        vmovdqu	%xmm6, 32(%edx)
        vmovdqu	%xmm7, 48(%edx)
        # ghash encrypted counter
        vmovdqu	96(%esp), %xmm6
        vmovdqu	48(%esp), %xmm3
        vmovdqu	-64(%edx), %xmm4
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm6, %xmm4, %xmm4
        vpshufd	$0x4e, %xmm3, %xmm5
        vpshufd	$0x4e, %xmm4, %xmm1
        vpxor	%xmm3, %xmm5, %xmm5
        vpxor	%xmm4, %xmm1, %xmm1
        vpclmulqdq	$0x11, %xmm3, %xmm4, %xmm7
        vpclmulqdq	$0x00, %xmm3, %xmm4, %xmm6
        vpclmulqdq	$0x00, %xmm1, %xmm5, %xmm5
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vmovdqu	32(%esp), %xmm3
        vmovdqu	-48(%edx), %xmm4
        vpshufd	$0x4e, %xmm3, %xmm0
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm3, %xmm0, %xmm0
        vpshufd	$0x4e, %xmm4, %xmm1
        vpxor	%xmm4, %xmm1, %xmm1
        vpclmulqdq	$0x11, %xmm3, %xmm4, %xmm2
        vpclmulqdq	$0x00, %xmm3, %xmm4, %xmm3
        vpclmulqdq	$0x00, %xmm1, %xmm0, %xmm0
        vpxor	%xmm3, %xmm5, %xmm5
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm2, %xmm7, %xmm7
        vpxor	%xmm0, %xmm5, %xmm5
        vmovdqu	16(%esp), %xmm3
        vmovdqu	-32(%edx), %xmm4
        vpshufd	$0x4e, %xmm3, %xmm0
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm3, %xmm0, %xmm0
        vpshufd	$0x4e, %xmm4, %xmm1
        vpxor	%xmm4, %xmm1, %xmm1
        vpclmulqdq	$0x11, %xmm3, %xmm4, %xmm2
        vpclmulqdq	$0x00, %xmm3, %xmm4, %xmm3
        vpclmulqdq	$0x00, %xmm1, %xmm0, %xmm0
        vpxor	%xmm3, %xmm5, %xmm5
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm2, %xmm7, %xmm7
        vpxor	%xmm0, %xmm5, %xmm5
        vmovdqu	(%esp), %xmm3
        vmovdqu	-16(%edx), %xmm4
        vpshufd	$0x4e, %xmm3, %xmm0
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm3, %xmm0, %xmm0
        vpshufd	$0x4e, %xmm4, %xmm1
        vpxor	%xmm4, %xmm1, %xmm1
        vpclmulqdq	$0x11, %xmm3, %xmm4, %xmm2
        vpclmulqdq	$0x00, %xmm3, %xmm4, %xmm3
        vpclmulqdq	$0x00, %xmm1, %xmm0, %xmm0
        vpxor	%xmm3, %xmm5, %xmm5
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm2, %xmm7, %xmm7
        vpxor	%xmm0, %xmm5, %xmm5
        vpslldq	$8, %xmm5, %xmm1
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm1, %xmm6, %xmm6
        vpxor	%xmm5, %xmm7, %xmm7
        vpslld	$31, %xmm6, %xmm3
        vpslld	$30, %xmm6, %xmm0
        vpslld	$25, %xmm6, %xmm1
        vpxor	%xmm0, %xmm3, %xmm3
        vpxor	%xmm1, %xmm3, %xmm3
        vpsrldq	$4, %xmm3, %xmm0
        vpslldq	$12, %xmm3, %xmm3
        vpxor	%xmm3, %xmm6, %xmm6
        vpsrld	$0x01, %xmm6, %xmm1
        vpsrld	$2, %xmm6, %xmm5
        vpsrld	$7, %xmm6, %xmm4
        vpxor	%xmm5, %xmm1, %xmm1
        vpxor	%xmm4, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm6, %xmm6
        vpxor	%xmm7, %xmm6, %xmm6
        vmovdqu	%xmm6, 96(%esp)
        addl	$0x40, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_encrypt_avx1_ghash_64
L_AES_GCM_encrypt_avx1_end_64:
        vmovdqu	96(%esp), %xmm2
        # Block 1
        vmovdqa	L_aes_gcm_avx1_bswap_mask, %xmm4
        vmovdqa	(%edx), %xmm1
        vpshufb	%xmm4, %xmm1, %xmm1
        vmovdqu	48(%esp), %xmm3
        vpxor	%xmm2, %xmm1, %xmm1
        # ghash_gfmul_avx
        vpshufd	$0x4e, %xmm1, %xmm5
        vpshufd	$0x4e, %xmm3, %xmm6
        vpclmulqdq	$0x11, %xmm1, %xmm3, %xmm7
        vpclmulqdq	$0x00, %xmm1, %xmm3, %xmm4
        vpxor	%xmm1, %xmm5, %xmm5
        vpxor	%xmm3, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vmovdqa	%xmm4, %xmm0
        vmovdqa	%xmm7, %xmm2
        vpslldq	$8, %xmm5, %xmm6
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm6, %xmm0, %xmm0
        vpxor	%xmm5, %xmm2, %xmm2
        # Block 2
        vmovdqa	L_aes_gcm_avx1_bswap_mask, %xmm4
        vmovdqa	16(%edx), %xmm1
        vpshufb	%xmm4, %xmm1, %xmm1
        vmovdqu	32(%esp), %xmm3
        # ghash_gfmul_xor_avx
        vpshufd	$0x4e, %xmm1, %xmm5
        vpshufd	$0x4e, %xmm3, %xmm6
        vpclmulqdq	$0x11, %xmm1, %xmm3, %xmm7
        vpclmulqdq	$0x00, %xmm1, %xmm3, %xmm4
        vpxor	%xmm1, %xmm5, %xmm5
        vpxor	%xmm3, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vpxor	%xmm4, %xmm0, %xmm0
        vpxor	%xmm7, %xmm2, %xmm2
        vpslldq	$8, %xmm5, %xmm6
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm6, %xmm0, %xmm0
        vpxor	%xmm5, %xmm2, %xmm2
        # Block 3
        vmovdqa	L_aes_gcm_avx1_bswap_mask, %xmm4
        vmovdqa	32(%edx), %xmm1
        vpshufb	%xmm4, %xmm1, %xmm1
        vmovdqu	16(%esp), %xmm3
        # ghash_gfmul_xor_avx
        vpshufd	$0x4e, %xmm1, %xmm5
        vpshufd	$0x4e, %xmm3, %xmm6
        vpclmulqdq	$0x11, %xmm1, %xmm3, %xmm7
        vpclmulqdq	$0x00, %xmm1, %xmm3, %xmm4
        vpxor	%xmm1, %xmm5, %xmm5
        vpxor	%xmm3, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vpxor	%xmm4, %xmm0, %xmm0
        vpxor	%xmm7, %xmm2, %xmm2
        vpslldq	$8, %xmm5, %xmm6
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm6, %xmm0, %xmm0
        vpxor	%xmm5, %xmm2, %xmm2
        # Block 4
        vmovdqa	L_aes_gcm_avx1_bswap_mask, %xmm4
        vmovdqa	48(%edx), %xmm1
        vpshufb	%xmm4, %xmm1, %xmm1
        vmovdqu	(%esp), %xmm3
        # ghash_gfmul_xor_avx
        vpshufd	$0x4e, %xmm1, %xmm5
        vpshufd	$0x4e, %xmm3, %xmm6
        vpclmulqdq	$0x11, %xmm1, %xmm3, %xmm7
        vpclmulqdq	$0x00, %xmm1, %xmm3, %xmm4
        vpxor	%xmm1, %xmm5, %xmm5
        vpxor	%xmm3, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vpxor	%xmm4, %xmm0, %xmm0
        vpxor	%xmm7, %xmm2, %xmm2
        vpslldq	$8, %xmm5, %xmm6
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm6, %xmm0, %xmm0
        vpxor	%xmm5, %xmm2, %xmm2
        vpslld	$31, %xmm0, %xmm4
        vpslld	$30, %xmm0, %xmm5
        vpslld	$25, %xmm0, %xmm6
        vpxor	%xmm5, %xmm4, %xmm4
        vpxor	%xmm6, %xmm4, %xmm4
        vmovdqa	%xmm4, %xmm5
        vpsrldq	$4, %xmm5, %xmm5
        vpslldq	$12, %xmm4, %xmm4
        vpxor	%xmm4, %xmm0, %xmm0
        vpsrld	$0x01, %xmm0, %xmm6
        vpsrld	$2, %xmm0, %xmm7
        vpsrld	$7, %xmm0, %xmm4
        vpxor	%xmm7, %xmm6, %xmm6
        vpxor	%xmm4, %xmm6, %xmm6
        vpxor	%xmm5, %xmm6, %xmm6
        vpxor	%xmm0, %xmm6, %xmm6
        vpxor	%xmm6, %xmm2, %xmm2
        vmovdqu	(%esp), %xmm1
L_AES_GCM_encrypt_avx1_done_64:
        movl	152(%esp), %edx
        cmpl	%edx, %ebx
        jge	L_AES_GCM_encrypt_avx1_done_enc
        movl	152(%esp), %eax
        andl	$0xfffffff0, %eax
        cmpl	%eax, %ebx
        jge	L_AES_GCM_encrypt_avx1_last_block_done
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        vmovdqu	64(%esp), %xmm5
        vpshufb	L_aes_gcm_avx1_bswap_epi64, %xmm5, %xmm4
        vpaddd	L_aes_gcm_avx1_one, %xmm5, %xmm5
        vmovdqu	%xmm5, 64(%esp)
        vpxor	(%ebp), %xmm4, %xmm4
        vaesenc	16(%ebp), %xmm4, %xmm4
        vaesenc	32(%ebp), %xmm4, %xmm4
        vaesenc	48(%ebp), %xmm4, %xmm4
        vaesenc	64(%ebp), %xmm4, %xmm4
        vaesenc	80(%ebp), %xmm4, %xmm4
        vaesenc	96(%ebp), %xmm4, %xmm4
        vaesenc	112(%ebp), %xmm4, %xmm4
        vaesenc	128(%ebp), %xmm4, %xmm4
        vaesenc	144(%ebp), %xmm4, %xmm4
        cmpl	$11, 172(%esp)
        vmovdqa	160(%ebp), %xmm5
        jl	L_AES_GCM_encrypt_avx1_aesenc_block_aesenc_avx_last
        vaesenc	%xmm5, %xmm4, %xmm4
        vaesenc	176(%ebp), %xmm4, %xmm4
        cmpl	$13, 172(%esp)
        vmovdqa	192(%ebp), %xmm5
        jl	L_AES_GCM_encrypt_avx1_aesenc_block_aesenc_avx_last
        vaesenc	%xmm5, %xmm4, %xmm4
        vaesenc	208(%ebp), %xmm4, %xmm4
        vmovdqa	224(%ebp), %xmm5
L_AES_GCM_encrypt_avx1_aesenc_block_aesenc_avx_last:
        vaesenclast	%xmm5, %xmm4, %xmm4
        vmovdqu	(%ecx), %xmm5
        vpxor	%xmm5, %xmm4, %xmm4
        vmovdqu	%xmm4, (%edx)
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm4, %xmm2, %xmm2
        addl	$16, %ebx
        cmpl	%eax, %ebx
        jge	L_AES_GCM_encrypt_avx1_last_block_ghash
L_AES_GCM_encrypt_avx1_last_block_start:
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        vmovdqu	64(%esp), %xmm5
        vmovdqu	%xmm2, %xmm7
        vpshufb	L_aes_gcm_avx1_bswap_epi64, %xmm5, %xmm4
        vpaddd	L_aes_gcm_avx1_one, %xmm5, %xmm5
        vmovdqu	%xmm5, 64(%esp)
        vpxor	(%ebp), %xmm4, %xmm4
        vpclmulqdq	$16, %xmm1, %xmm7, %xmm0
        vaesenc	16(%ebp), %xmm4, %xmm4
        vaesenc	32(%ebp), %xmm4, %xmm4
        vpclmulqdq	$0x01, %xmm1, %xmm7, %xmm3
        vaesenc	48(%ebp), %xmm4, %xmm4
        vaesenc	64(%ebp), %xmm4, %xmm4
        vaesenc	80(%ebp), %xmm4, %xmm4
        vpclmulqdq	$0x11, %xmm1, %xmm7, %xmm5
        vaesenc	96(%ebp), %xmm4, %xmm4
        vpxor	%xmm3, %xmm0, %xmm0
        vpslldq	$8, %xmm0, %xmm6
        vpsrldq	$8, %xmm0, %xmm0
        vaesenc	112(%ebp), %xmm4, %xmm4
        vpclmulqdq	$0x00, %xmm1, %xmm7, %xmm3
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm0, %xmm5, %xmm5
        vmovdqa	L_aes_gcm_avx1_mod2_128, %xmm7
        vpclmulqdq	$16, %xmm7, %xmm6, %xmm3
        vaesenc	128(%ebp), %xmm4, %xmm4
        vpshufd	$0x4e, %xmm6, %xmm0
        vpxor	%xmm3, %xmm0, %xmm0
        vpclmulqdq	$16, %xmm7, %xmm0, %xmm3
        vaesenc	144(%ebp), %xmm4, %xmm4
        vpshufd	$0x4e, %xmm0, %xmm2
        vpxor	%xmm3, %xmm2, %xmm2
        vpxor	%xmm5, %xmm2, %xmm2
        cmpl	$11, 172(%esp)
        vmovdqa	160(%ebp), %xmm5
        jl	L_AES_GCM_encrypt_avx1_aesenc_gfmul_last
        vaesenc	%xmm5, %xmm4, %xmm4
        vaesenc	176(%ebp), %xmm4, %xmm4
        cmpl	$13, 172(%esp)
        vmovdqa	192(%ebp), %xmm5
        jl	L_AES_GCM_encrypt_avx1_aesenc_gfmul_last
        vaesenc	%xmm5, %xmm4, %xmm4
        vaesenc	208(%ebp), %xmm4, %xmm4
        vmovdqa	224(%ebp), %xmm5
L_AES_GCM_encrypt_avx1_aesenc_gfmul_last:
        vaesenclast	%xmm5, %xmm4, %xmm4
        vmovdqu	(%ecx), %xmm5
        vpxor	%xmm5, %xmm4, %xmm4
        vmovdqu	%xmm4, (%edx)
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        addl	$16, %ebx
        vpxor	%xmm4, %xmm2, %xmm2
        cmpl	%eax, %ebx
        jl	L_AES_GCM_encrypt_avx1_last_block_start
L_AES_GCM_encrypt_avx1_last_block_ghash:
        # ghash_gfmul_red_avx
        vpshufd	$0x4e, %xmm1, %xmm5
        vpshufd	$0x4e, %xmm2, %xmm6
        vpclmulqdq	$0x11, %xmm1, %xmm2, %xmm7
        vpclmulqdq	$0x00, %xmm1, %xmm2, %xmm4
        vpxor	%xmm1, %xmm5, %xmm5
        vpxor	%xmm2, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vpslldq	$8, %xmm5, %xmm6
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm6, %xmm4, %xmm4
        vpxor	%xmm5, %xmm7, %xmm2
        vpslld	$31, %xmm4, %xmm5
        vpslld	$30, %xmm4, %xmm6
        vpslld	$25, %xmm4, %xmm7
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vpsrldq	$4, %xmm5, %xmm7
        vpslldq	$12, %xmm5, %xmm5
        vpxor	%xmm5, %xmm4, %xmm4
        vpsrld	$0x01, %xmm4, %xmm5
        vpsrld	$2, %xmm4, %xmm6
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpsrld	$7, %xmm4, %xmm4
        vpxor	%xmm7, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm5, %xmm2, %xmm2
L_AES_GCM_encrypt_avx1_last_block_done:
        movl	152(%esp), %ecx
        movl	%ecx, %edx
        andl	$15, %ecx
        jz	L_AES_GCM_encrypt_avx1_aesenc_last15_enc_avx_done
        vmovdqu	64(%esp), %xmm0
        vpshufb	L_aes_gcm_avx1_bswap_epi64, %xmm0, %xmm0
        vpxor	(%ebp), %xmm0, %xmm0
        vaesenc	16(%ebp), %xmm0, %xmm0
        vaesenc	32(%ebp), %xmm0, %xmm0
        vaesenc	48(%ebp), %xmm0, %xmm0
        vaesenc	64(%ebp), %xmm0, %xmm0
        vaesenc	80(%ebp), %xmm0, %xmm0
        vaesenc	96(%ebp), %xmm0, %xmm0
        vaesenc	112(%ebp), %xmm0, %xmm0
        vaesenc	128(%ebp), %xmm0, %xmm0
        vaesenc	144(%ebp), %xmm0, %xmm0
        cmpl	$11, 172(%esp)
        vmovdqa	160(%ebp), %xmm5
        jl	L_AES_GCM_encrypt_avx1_aesenc_last15_enc_avx_aesenc_avx_last
        vaesenc	%xmm5, %xmm0, %xmm0
        vaesenc	176(%ebp), %xmm0, %xmm0
        cmpl	$13, 172(%esp)
        vmovdqa	192(%ebp), %xmm5
        jl	L_AES_GCM_encrypt_avx1_aesenc_last15_enc_avx_aesenc_avx_last
        vaesenc	%xmm5, %xmm0, %xmm0
        vaesenc	208(%ebp), %xmm0, %xmm0
        vmovdqa	224(%ebp), %xmm5
L_AES_GCM_encrypt_avx1_aesenc_last15_enc_avx_aesenc_avx_last:
        vaesenclast	%xmm5, %xmm0, %xmm0
        subl	$16, %esp
        xorl	%ecx, %ecx
        vmovdqu	%xmm0, (%esp)
L_AES_GCM_encrypt_avx1_aesenc_last15_enc_avx_loop:
        movzbl	(%esi,%ebx,1), %eax
        xorb	(%esp,%ecx,1), %al
        movb	%al, (%edi,%ebx,1)
        movb	%al, (%esp,%ecx,1)
        incl	%ebx
        incl	%ecx
        cmpl	%edx, %ebx
        jl	L_AES_GCM_encrypt_avx1_aesenc_last15_enc_avx_loop
        xorl	%eax, %eax
        cmpl	$16, %ecx
        je	L_AES_GCM_encrypt_avx1_aesenc_last15_enc_avx_finish_enc
L_AES_GCM_encrypt_avx1_aesenc_last15_enc_avx_byte_loop:
        movb	%al, (%esp,%ecx,1)
        incl	%ecx
        cmpl	$16, %ecx
        jl	L_AES_GCM_encrypt_avx1_aesenc_last15_enc_avx_byte_loop
L_AES_GCM_encrypt_avx1_aesenc_last15_enc_avx_finish_enc:
        vmovdqu	(%esp), %xmm0
        addl	$16, %esp
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm0, %xmm2, %xmm2
        # ghash_gfmul_red_avx
        vpshufd	$0x4e, %xmm1, %xmm5
        vpshufd	$0x4e, %xmm2, %xmm6
        vpclmulqdq	$0x11, %xmm1, %xmm2, %xmm7
        vpclmulqdq	$0x00, %xmm1, %xmm2, %xmm4
        vpxor	%xmm1, %xmm5, %xmm5
        vpxor	%xmm2, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vpslldq	$8, %xmm5, %xmm6
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm6, %xmm4, %xmm4
        vpxor	%xmm5, %xmm7, %xmm2
        vpslld	$31, %xmm4, %xmm5
        vpslld	$30, %xmm4, %xmm6
        vpslld	$25, %xmm4, %xmm7
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vpsrldq	$4, %xmm5, %xmm7
        vpslldq	$12, %xmm5, %xmm5
        vpxor	%xmm5, %xmm4, %xmm4
        vpsrld	$0x01, %xmm4, %xmm5
        vpsrld	$2, %xmm4, %xmm6
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpsrld	$7, %xmm4, %xmm4
        vpxor	%xmm7, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm5, %xmm2, %xmm2
L_AES_GCM_encrypt_avx1_aesenc_last15_enc_avx_done:
L_AES_GCM_encrypt_avx1_done_enc:
        movl	148(%esp), %edi
        movl	164(%esp), %ebx
        movl	152(%esp), %edx
        movl	156(%esp), %ecx
        shll	$3, %edx
        shll	$3, %ecx
        vpinsrd	$0x00, %edx, %xmm4, %xmm4
        vpinsrd	$2, %ecx, %xmm4, %xmm4
        movl	152(%esp), %edx
        movl	156(%esp), %ecx
        shrl	$29, %edx
        shrl	$29, %ecx
        vpinsrd	$0x01, %edx, %xmm4, %xmm4
        vpinsrd	$3, %ecx, %xmm4, %xmm4
        vpxor	%xmm4, %xmm2, %xmm2
        # ghash_gfmul_red_avx
        vpshufd	$0x4e, %xmm1, %xmm5
        vpshufd	$0x4e, %xmm2, %xmm6
        vpclmulqdq	$0x11, %xmm1, %xmm2, %xmm7
        vpclmulqdq	$0x00, %xmm1, %xmm2, %xmm4
        vpxor	%xmm1, %xmm5, %xmm5
        vpxor	%xmm2, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vpslldq	$8, %xmm5, %xmm6
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm6, %xmm4, %xmm4
        vpxor	%xmm5, %xmm7, %xmm2
        vpslld	$31, %xmm4, %xmm5
        vpslld	$30, %xmm4, %xmm6
        vpslld	$25, %xmm4, %xmm7
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vpsrldq	$4, %xmm5, %xmm7
        vpslldq	$12, %xmm5, %xmm5
        vpxor	%xmm5, %xmm4, %xmm4
        vpsrld	$0x01, %xmm4, %xmm5
        vpsrld	$2, %xmm4, %xmm6
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpsrld	$7, %xmm4, %xmm4
        vpxor	%xmm7, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm5, %xmm2, %xmm2
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm2, %xmm2
        vpxor	80(%esp), %xmm2, %xmm4
        cmpl	$16, %ebx
        je	L_AES_GCM_encrypt_avx1_store_tag_16
        xorl	%ecx, %ecx
        vmovdqu	%xmm4, (%esp)
L_AES_GCM_encrypt_avx1_store_tag_loop:
        movzbl	(%esp,%ecx,1), %eax
        movb	%al, (%edi,%ecx,1)
        incl	%ecx
        cmpl	%ebx, %ecx
        jne	L_AES_GCM_encrypt_avx1_store_tag_loop
        jmp	L_AES_GCM_encrypt_avx1_store_tag_done
L_AES_GCM_encrypt_avx1_store_tag_16:
        vmovdqu	%xmm4, (%edi)
L_AES_GCM_encrypt_avx1_store_tag_done:
        addl	$0x70, %esp
        popl	%ebp
        popl	%edi
        popl	%esi
        popl	%ebx
        ret
.size	AES_GCM_encrypt_avx1,.-AES_GCM_encrypt_avx1
.text
.globl	AES_GCM_decrypt_avx1
.type	AES_GCM_decrypt_avx1,@function
.align	16
AES_GCM_decrypt_avx1:
        pushl	%ebx
        pushl	%esi
        pushl	%edi
        pushl	%ebp
        subl	$0xb0, %esp
        movl	208(%esp), %esi
        movl	232(%esp), %ebp
        movl	224(%esp), %edx
        vpxor	%xmm0, %xmm0, %xmm0
        vpxor	%xmm2, %xmm2, %xmm2
        cmpl	$12, %edx
        jne	L_AES_GCM_decrypt_avx1_iv_not_12
        # # Calculate values when IV is 12 bytes
        # Set counter based on IV
        movl	$0x1000000, %ecx
        vpinsrd	$0x00, (%esi), %xmm0, %xmm0
        vpinsrd	$0x01, 4(%esi), %xmm0, %xmm0
        vpinsrd	$2, 8(%esi), %xmm0, %xmm0
        vpinsrd	$3, %ecx, %xmm0, %xmm0
        # H = Encrypt X(=0) and T = Encrypt counter
        vmovdqa	(%ebp), %xmm1
        vpxor	%xmm1, %xmm0, %xmm5
        vmovdqa	16(%ebp), %xmm3
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        vmovdqa	32(%ebp), %xmm3
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        vmovdqa	48(%ebp), %xmm3
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        vmovdqa	64(%ebp), %xmm3
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        vmovdqa	80(%ebp), %xmm3
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        vmovdqa	96(%ebp), %xmm3
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        vmovdqa	112(%ebp), %xmm3
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        vmovdqa	128(%ebp), %xmm3
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        vmovdqa	144(%ebp), %xmm3
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        cmpl	$11, 236(%esp)
        vmovdqa	160(%ebp), %xmm3
        jl	L_AES_GCM_decrypt_avx1_calc_iv_12_last
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        vmovdqa	176(%ebp), %xmm3
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        cmpl	$13, 236(%esp)
        vmovdqa	192(%ebp), %xmm3
        jl	L_AES_GCM_decrypt_avx1_calc_iv_12_last
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        vmovdqa	208(%ebp), %xmm3
        vaesenc	%xmm3, %xmm1, %xmm1
        vaesenc	%xmm3, %xmm5, %xmm5
        vmovdqa	224(%ebp), %xmm3
L_AES_GCM_decrypt_avx1_calc_iv_12_last:
        vaesenclast	%xmm3, %xmm1, %xmm1
        vaesenclast	%xmm3, %xmm5, %xmm5
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm1, %xmm1
        vmovdqu	%xmm5, 80(%esp)
        jmp	L_AES_GCM_decrypt_avx1_iv_done
L_AES_GCM_decrypt_avx1_iv_not_12:
        # Calculate values when IV is not 12 bytes
        # H = Encrypt X(=0)
        vmovdqa	(%ebp), %xmm1
        vaesenc	16(%ebp), %xmm1, %xmm1
        vaesenc	32(%ebp), %xmm1, %xmm1
        vaesenc	48(%ebp), %xmm1, %xmm1
        vaesenc	64(%ebp), %xmm1, %xmm1
        vaesenc	80(%ebp), %xmm1, %xmm1
        vaesenc	96(%ebp), %xmm1, %xmm1
        vaesenc	112(%ebp), %xmm1, %xmm1
        vaesenc	128(%ebp), %xmm1, %xmm1
        vaesenc	144(%ebp), %xmm1, %xmm1
        cmpl	$11, 236(%esp)
        vmovdqa	160(%ebp), %xmm5
        jl	L_AES_GCM_decrypt_avx1_calc_iv_1_aesenc_avx_last
        vaesenc	%xmm5, %xmm1, %xmm1
        vaesenc	176(%ebp), %xmm1, %xmm1
        cmpl	$13, 236(%esp)
        vmovdqa	192(%ebp), %xmm5
        jl	L_AES_GCM_decrypt_avx1_calc_iv_1_aesenc_avx_last
        vaesenc	%xmm5, %xmm1, %xmm1
        vaesenc	208(%ebp), %xmm1, %xmm1
        vmovdqa	224(%ebp), %xmm5
L_AES_GCM_decrypt_avx1_calc_iv_1_aesenc_avx_last:
        vaesenclast	%xmm5, %xmm1, %xmm1
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm1, %xmm1
        # Calc counter
        # Initialization vector
        cmpl	$0x00, %edx
        movl	$0x00, %ecx
        je	L_AES_GCM_decrypt_avx1_calc_iv_done
        cmpl	$16, %edx
        jl	L_AES_GCM_decrypt_avx1_calc_iv_lt16
        andl	$0xfffffff0, %edx
L_AES_GCM_decrypt_avx1_calc_iv_16_loop:
        vmovdqu	(%esi,%ecx,1), %xmm4
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm4, %xmm0, %xmm0
        # ghash_gfmul_avx
        vpshufd	$0x4e, %xmm0, %xmm5
        vpshufd	$0x4e, %xmm1, %xmm6
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm7
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpxor	%xmm0, %xmm5, %xmm5
        vpxor	%xmm1, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vmovdqa	%xmm4, %xmm3
        vmovdqa	%xmm7, %xmm0
        vpslldq	$8, %xmm5, %xmm6
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm6, %xmm3, %xmm3
        vpxor	%xmm5, %xmm0, %xmm0
        vpsrld	$31, %xmm3, %xmm4
        vpsrld	$31, %xmm0, %xmm5
        vpslld	$0x01, %xmm3, %xmm3
        vpslld	$0x01, %xmm0, %xmm0
        vpsrldq	$12, %xmm4, %xmm6
        vpslldq	$4, %xmm4, %xmm4
        vpslldq	$4, %xmm5, %xmm5
        vpor	%xmm6, %xmm0, %xmm0
        vpor	%xmm4, %xmm3, %xmm3
        vpor	%xmm5, %xmm0, %xmm0
        vpslld	$31, %xmm3, %xmm4
        vpslld	$30, %xmm3, %xmm5
        vpslld	$25, %xmm3, %xmm6
        vpxor	%xmm5, %xmm4, %xmm4
        vpxor	%xmm6, %xmm4, %xmm4
        vmovdqa	%xmm4, %xmm5
        vpsrldq	$4, %xmm5, %xmm5
        vpslldq	$12, %xmm4, %xmm4
        vpxor	%xmm4, %xmm3, %xmm3
        vpsrld	$0x01, %xmm3, %xmm6
        vpsrld	$2, %xmm3, %xmm7
        vpsrld	$7, %xmm3, %xmm4
        vpxor	%xmm7, %xmm6, %xmm6
        vpxor	%xmm4, %xmm6, %xmm6
        vpxor	%xmm5, %xmm6, %xmm6
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm6, %xmm0, %xmm0
        addl	$16, %ecx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_decrypt_avx1_calc_iv_16_loop
        movl	224(%esp), %edx
        cmpl	%edx, %ecx
        je	L_AES_GCM_decrypt_avx1_calc_iv_done
L_AES_GCM_decrypt_avx1_calc_iv_lt16:
        subl	$16, %esp
        vpxor	%xmm4, %xmm4, %xmm4
        xorl	%ebx, %ebx
        vmovdqu	%xmm4, (%esp)
L_AES_GCM_decrypt_avx1_calc_iv_loop:
        movzbl	(%esi,%ecx,1), %eax
        movb	%al, (%esp,%ebx,1)
        incl	%ecx
        incl	%ebx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_decrypt_avx1_calc_iv_loop
        vmovdqu	(%esp), %xmm4
        addl	$16, %esp
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm4, %xmm0, %xmm0
        # ghash_gfmul_avx
        vpshufd	$0x4e, %xmm0, %xmm5
        vpshufd	$0x4e, %xmm1, %xmm6
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm7
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpxor	%xmm0, %xmm5, %xmm5
        vpxor	%xmm1, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vmovdqa	%xmm4, %xmm3
        vmovdqa	%xmm7, %xmm0
        vpslldq	$8, %xmm5, %xmm6
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm6, %xmm3, %xmm3
        vpxor	%xmm5, %xmm0, %xmm0
        vpsrld	$31, %xmm3, %xmm4
        vpsrld	$31, %xmm0, %xmm5
        vpslld	$0x01, %xmm3, %xmm3
        vpslld	$0x01, %xmm0, %xmm0
        vpsrldq	$12, %xmm4, %xmm6
        vpslldq	$4, %xmm4, %xmm4
        vpslldq	$4, %xmm5, %xmm5
        vpor	%xmm6, %xmm0, %xmm0
        vpor	%xmm4, %xmm3, %xmm3
        vpor	%xmm5, %xmm0, %xmm0
        vpslld	$31, %xmm3, %xmm4
        vpslld	$30, %xmm3, %xmm5
        vpslld	$25, %xmm3, %xmm6
        vpxor	%xmm5, %xmm4, %xmm4
        vpxor	%xmm6, %xmm4, %xmm4
        vmovdqa	%xmm4, %xmm5
        vpsrldq	$4, %xmm5, %xmm5
        vpslldq	$12, %xmm4, %xmm4
        vpxor	%xmm4, %xmm3, %xmm3
        vpsrld	$0x01, %xmm3, %xmm6
        vpsrld	$2, %xmm3, %xmm7
        vpsrld	$7, %xmm3, %xmm4
        vpxor	%xmm7, %xmm6, %xmm6
        vpxor	%xmm4, %xmm6, %xmm6
        vpxor	%xmm5, %xmm6, %xmm6
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm6, %xmm0, %xmm0
L_AES_GCM_decrypt_avx1_calc_iv_done:
        # T = Encrypt counter
        vpxor	%xmm4, %xmm4, %xmm4
        shll	$3, %edx
        vpinsrd	$0x00, %edx, %xmm4, %xmm4
        vpxor	%xmm4, %xmm0, %xmm0
        # ghash_gfmul_avx
        vpshufd	$0x4e, %xmm0, %xmm5
        vpshufd	$0x4e, %xmm1, %xmm6
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm7
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpxor	%xmm0, %xmm5, %xmm5
        vpxor	%xmm1, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vmovdqa	%xmm4, %xmm3
        vmovdqa	%xmm7, %xmm0
        vpslldq	$8, %xmm5, %xmm6
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm6, %xmm3, %xmm3
        vpxor	%xmm5, %xmm0, %xmm0
        vpsrld	$31, %xmm3, %xmm4
        vpsrld	$31, %xmm0, %xmm5
        vpslld	$0x01, %xmm3, %xmm3
        vpslld	$0x01, %xmm0, %xmm0
        vpsrldq	$12, %xmm4, %xmm6
        vpslldq	$4, %xmm4, %xmm4
        vpslldq	$4, %xmm5, %xmm5
        vpor	%xmm6, %xmm0, %xmm0
        vpor	%xmm4, %xmm3, %xmm3
        vpor	%xmm5, %xmm0, %xmm0
        vpslld	$31, %xmm3, %xmm4
        vpslld	$30, %xmm3, %xmm5
        vpslld	$25, %xmm3, %xmm6
        vpxor	%xmm5, %xmm4, %xmm4
        vpxor	%xmm6, %xmm4, %xmm4
        vmovdqa	%xmm4, %xmm5
        vpsrldq	$4, %xmm5, %xmm5
        vpslldq	$12, %xmm4, %xmm4
        vpxor	%xmm4, %xmm3, %xmm3
        vpsrld	$0x01, %xmm3, %xmm6
        vpsrld	$2, %xmm3, %xmm7
        vpsrld	$7, %xmm3, %xmm4
        vpxor	%xmm7, %xmm6, %xmm6
        vpxor	%xmm4, %xmm6, %xmm6
        vpxor	%xmm5, %xmm6, %xmm6
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm6, %xmm0, %xmm0
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
        #   Encrypt counter
        vmovdqa	(%ebp), %xmm4
        vpxor	%xmm0, %xmm4, %xmm4
        vaesenc	16(%ebp), %xmm4, %xmm4
        vaesenc	32(%ebp), %xmm4, %xmm4
        vaesenc	48(%ebp), %xmm4, %xmm4
        vaesenc	64(%ebp), %xmm4, %xmm4
        vaesenc	80(%ebp), %xmm4, %xmm4
        vaesenc	96(%ebp), %xmm4, %xmm4
        vaesenc	112(%ebp), %xmm4, %xmm4
        vaesenc	128(%ebp), %xmm4, %xmm4
        vaesenc	144(%ebp), %xmm4, %xmm4
        cmpl	$11, 236(%esp)
        vmovdqa	160(%ebp), %xmm5
        jl	L_AES_GCM_decrypt_avx1_calc_iv_2_aesenc_avx_last
        vaesenc	%xmm5, %xmm4, %xmm4
        vaesenc	176(%ebp), %xmm4, %xmm4
        cmpl	$13, 236(%esp)
        vmovdqa	192(%ebp), %xmm5
        jl	L_AES_GCM_decrypt_avx1_calc_iv_2_aesenc_avx_last
        vaesenc	%xmm5, %xmm4, %xmm4
        vaesenc	208(%ebp), %xmm4, %xmm4
        vmovdqa	224(%ebp), %xmm5
L_AES_GCM_decrypt_avx1_calc_iv_2_aesenc_avx_last:
        vaesenclast	%xmm5, %xmm4, %xmm4
        vmovdqu	%xmm4, 80(%esp)
L_AES_GCM_decrypt_avx1_iv_done:
        movl	204(%esp), %esi
        # Additional authentication data
        movl	220(%esp), %edx
        cmpl	$0x00, %edx
        je	L_AES_GCM_decrypt_avx1_calc_aad_done
        xorl	%ecx, %ecx
        cmpl	$16, %edx
        jl	L_AES_GCM_decrypt_avx1_calc_aad_lt16
        andl	$0xfffffff0, %edx
L_AES_GCM_decrypt_avx1_calc_aad_16_loop:
        vmovdqu	(%esi,%ecx,1), %xmm4
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm4, %xmm2, %xmm2
        # ghash_gfmul_avx
        vpshufd	$0x4e, %xmm2, %xmm5
        vpshufd	$0x4e, %xmm1, %xmm6
        vpclmulqdq	$0x11, %xmm2, %xmm1, %xmm7
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm4
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm1, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vmovdqa	%xmm4, %xmm3
        vmovdqa	%xmm7, %xmm2
        vpslldq	$8, %xmm5, %xmm6
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm6, %xmm3, %xmm3
        vpxor	%xmm5, %xmm2, %xmm2
        vpsrld	$31, %xmm3, %xmm4
        vpsrld	$31, %xmm2, %xmm5
        vpslld	$0x01, %xmm3, %xmm3
        vpslld	$0x01, %xmm2, %xmm2
        vpsrldq	$12, %xmm4, %xmm6
        vpslldq	$4, %xmm4, %xmm4
        vpslldq	$4, %xmm5, %xmm5
        vpor	%xmm6, %xmm2, %xmm2
        vpor	%xmm4, %xmm3, %xmm3
        vpor	%xmm5, %xmm2, %xmm2
        vpslld	$31, %xmm3, %xmm4
        vpslld	$30, %xmm3, %xmm5
        vpslld	$25, %xmm3, %xmm6
        vpxor	%xmm5, %xmm4, %xmm4
        vpxor	%xmm6, %xmm4, %xmm4
        vmovdqa	%xmm4, %xmm5
        vpsrldq	$4, %xmm5, %xmm5
        vpslldq	$12, %xmm4, %xmm4
        vpxor	%xmm4, %xmm3, %xmm3
        vpsrld	$0x01, %xmm3, %xmm6
        vpsrld	$2, %xmm3, %xmm7
        vpsrld	$7, %xmm3, %xmm4
        vpxor	%xmm7, %xmm6, %xmm6
        vpxor	%xmm4, %xmm6, %xmm6
        vpxor	%xmm5, %xmm6, %xmm6
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm6, %xmm2, %xmm2
        addl	$16, %ecx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_decrypt_avx1_calc_aad_16_loop
        movl	220(%esp), %edx
        cmpl	%edx, %ecx
        je	L_AES_GCM_decrypt_avx1_calc_aad_done
L_AES_GCM_decrypt_avx1_calc_aad_lt16:
        subl	$16, %esp
        vpxor	%xmm4, %xmm4, %xmm4
        xorl	%ebx, %ebx
        vmovdqu	%xmm4, (%esp)
L_AES_GCM_decrypt_avx1_calc_aad_loop:
        movzbl	(%esi,%ecx,1), %eax
        movb	%al, (%esp,%ebx,1)
        incl	%ecx
        incl	%ebx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_decrypt_avx1_calc_aad_loop
        vmovdqu	(%esp), %xmm4
        addl	$16, %esp
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm4, %xmm2, %xmm2
        # ghash_gfmul_avx
        vpshufd	$0x4e, %xmm2, %xmm5
        vpshufd	$0x4e, %xmm1, %xmm6
        vpclmulqdq	$0x11, %xmm2, %xmm1, %xmm7
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm4
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm1, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vmovdqa	%xmm4, %xmm3
        vmovdqa	%xmm7, %xmm2
        vpslldq	$8, %xmm5, %xmm6
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm6, %xmm3, %xmm3
        vpxor	%xmm5, %xmm2, %xmm2
        vpsrld	$31, %xmm3, %xmm4
        vpsrld	$31, %xmm2, %xmm5
        vpslld	$0x01, %xmm3, %xmm3
        vpslld	$0x01, %xmm2, %xmm2
        vpsrldq	$12, %xmm4, %xmm6
        vpslldq	$4, %xmm4, %xmm4
        vpslldq	$4, %xmm5, %xmm5
        vpor	%xmm6, %xmm2, %xmm2
        vpor	%xmm4, %xmm3, %xmm3
        vpor	%xmm5, %xmm2, %xmm2
        vpslld	$31, %xmm3, %xmm4
        vpslld	$30, %xmm3, %xmm5
        vpslld	$25, %xmm3, %xmm6
        vpxor	%xmm5, %xmm4, %xmm4
        vpxor	%xmm6, %xmm4, %xmm4
        vmovdqa	%xmm4, %xmm5
        vpsrldq	$4, %xmm5, %xmm5
        vpslldq	$12, %xmm4, %xmm4
        vpxor	%xmm4, %xmm3, %xmm3
        vpsrld	$0x01, %xmm3, %xmm6
        vpsrld	$2, %xmm3, %xmm7
        vpsrld	$7, %xmm3, %xmm4
        vpxor	%xmm7, %xmm6, %xmm6
        vpxor	%xmm4, %xmm6, %xmm6
        vpxor	%xmm5, %xmm6, %xmm6
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm6, %xmm2, %xmm2
L_AES_GCM_decrypt_avx1_calc_aad_done:
        vmovdqu	%xmm2, 96(%esp)
        movl	196(%esp), %esi
        movl	200(%esp), %edi
        # Calculate counter and H
        vpsrlq	$63, %xmm1, %xmm5
        vpsllq	$0x01, %xmm1, %xmm4
        vpslldq	$8, %xmm5, %xmm5
        vpor	%xmm5, %xmm4, %xmm4
        vpshufd	$0xff, %xmm1, %xmm1
        vpsrad	$31, %xmm1, %xmm1
        vpshufb	L_aes_gcm_avx1_bswap_epi64, %xmm0, %xmm0
        vpand	L_aes_gcm_avx1_mod2_128, %xmm1, %xmm1
        vpaddd	L_aes_gcm_avx1_one, %xmm0, %xmm0
        vpxor	%xmm4, %xmm1, %xmm1
        vmovdqu	%xmm0, 64(%esp)
        xorl	%ebx, %ebx
        cmpl	$0x40, 216(%esp)
        movl	216(%esp), %eax
        jl	L_AES_GCM_decrypt_avx1_done_64
        andl	$0xffffffc0, %eax
        vmovdqa	%xmm2, %xmm6
        # H ^ 1
        vmovdqu	%xmm1, (%esp)
        # H ^ 2
        vpclmulqdq	$0x00, %xmm1, %xmm1, %xmm4
        vpclmulqdq	$0x11, %xmm1, %xmm1, %xmm0
        vpslld	$31, %xmm4, %xmm5
        vpslld	$30, %xmm4, %xmm6
        vpslld	$25, %xmm4, %xmm7
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vpsrldq	$4, %xmm5, %xmm7
        vpslldq	$12, %xmm5, %xmm5
        vpxor	%xmm5, %xmm4, %xmm4
        vpsrld	$0x01, %xmm4, %xmm5
        vpsrld	$2, %xmm4, %xmm6
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpsrld	$7, %xmm4, %xmm4
        vpxor	%xmm7, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm5, %xmm0, %xmm0
        vmovdqu	%xmm0, 16(%esp)
        # H ^ 3
        # ghash_gfmul_red_avx
        vpshufd	$0x4e, %xmm1, %xmm5
        vpshufd	$0x4e, %xmm0, %xmm6
        vpclmulqdq	$0x11, %xmm1, %xmm0, %xmm7
        vpclmulqdq	$0x00, %xmm1, %xmm0, %xmm4
        vpxor	%xmm1, %xmm5, %xmm5
        vpxor	%xmm0, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vpslldq	$8, %xmm5, %xmm6
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm6, %xmm4, %xmm4
        vpxor	%xmm5, %xmm7, %xmm3
        vpslld	$31, %xmm4, %xmm5
        vpslld	$30, %xmm4, %xmm6
        vpslld	$25, %xmm4, %xmm7
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vpsrldq	$4, %xmm5, %xmm7
        vpslldq	$12, %xmm5, %xmm5
        vpxor	%xmm5, %xmm4, %xmm4
        vpsrld	$0x01, %xmm4, %xmm5
        vpsrld	$2, %xmm4, %xmm6
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpsrld	$7, %xmm4, %xmm4
        vpxor	%xmm7, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm5, %xmm3, %xmm3
        vmovdqu	%xmm3, 32(%esp)
        # H ^ 4
        vpclmulqdq	$0x00, %xmm0, %xmm0, %xmm4
        vpclmulqdq	$0x11, %xmm0, %xmm0, %xmm3
        vpslld	$31, %xmm4, %xmm5
        vpslld	$30, %xmm4, %xmm6
        vpslld	$25, %xmm4, %xmm7
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vpsrldq	$4, %xmm5, %xmm7
        vpslldq	$12, %xmm5, %xmm5
        vpxor	%xmm5, %xmm4, %xmm4
        vpsrld	$0x01, %xmm4, %xmm5
        vpsrld	$2, %xmm4, %xmm6
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpsrld	$7, %xmm4, %xmm4
        vpxor	%xmm7, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm5, %xmm3, %xmm3
        vmovdqu	%xmm3, 48(%esp)
        cmpl	%esi, %edi
        jne	L_AES_GCM_decrypt_avx1_ghash_64
L_AES_GCM_decrypt_avx1_ghash_64_inplace:
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        vmovdqu	64(%esp), %xmm4
        vmovdqa	L_aes_gcm_avx1_bswap_epi64, %xmm3
        vpaddd	L_aes_gcm_avx1_one, %xmm4, %xmm5
        vpshufb	%xmm3, %xmm5, %xmm5
        vpaddd	L_aes_gcm_avx1_two, %xmm4, %xmm6
        vpshufb	%xmm3, %xmm6, %xmm6
        vpaddd	L_aes_gcm_avx1_three, %xmm4, %xmm7
        vpshufb	%xmm3, %xmm7, %xmm7
        vpshufb	%xmm3, %xmm4, %xmm4
        vmovdqu	64(%esp), %xmm3
        vpaddd	L_aes_gcm_avx1_four, %xmm3, %xmm3
        vmovdqu	%xmm3, 64(%esp)
        vmovdqa	(%ebp), %xmm3
        vpxor	%xmm3, %xmm4, %xmm4
        vpxor	%xmm3, %xmm5, %xmm5
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm3, %xmm7, %xmm7
        vmovdqa	16(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	32(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	48(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	64(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	80(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	96(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	112(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	128(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	144(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        cmpl	$11, 236(%esp)
        vmovdqa	160(%ebp), %xmm3
        jl	L_AES_GCM_decrypt_avx1inplace_aesenc_64_ghash_avx_aesenc_64_enc_done
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	176(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        cmpl	$13, 236(%esp)
        vmovdqa	192(%ebp), %xmm3
        jl	L_AES_GCM_decrypt_avx1inplace_aesenc_64_ghash_avx_aesenc_64_enc_done
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	208(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	224(%ebp), %xmm3
L_AES_GCM_decrypt_avx1inplace_aesenc_64_ghash_avx_aesenc_64_enc_done:
        vaesenclast	%xmm3, %xmm4, %xmm4
        vaesenclast	%xmm3, %xmm5, %xmm5
        vmovdqu	(%ecx), %xmm0
        vmovdqu	16(%ecx), %xmm1
        vpxor	%xmm0, %xmm4, %xmm4
        vpxor	%xmm1, %xmm5, %xmm5
        vmovdqu	%xmm0, 112(%esp)
        vmovdqu	%xmm1, 128(%esp)
        vmovdqu	%xmm4, (%edx)
        vmovdqu	%xmm5, 16(%edx)
        vaesenclast	%xmm3, %xmm6, %xmm6
        vaesenclast	%xmm3, %xmm7, %xmm7
        vmovdqu	32(%ecx), %xmm0
        vmovdqu	48(%ecx), %xmm1
        vpxor	%xmm0, %xmm6, %xmm6
        vpxor	%xmm1, %xmm7, %xmm7
        vmovdqu	%xmm0, 144(%esp)
        vmovdqu	%xmm1, 160(%esp)
        vmovdqu	%xmm6, 32(%edx)
        vmovdqu	%xmm7, 48(%edx)
        # ghash encrypted counter
        vmovdqu	96(%esp), %xmm6
        vmovdqu	48(%esp), %xmm3
        vmovdqu	112(%esp), %xmm4
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm6, %xmm4, %xmm4
        vpshufd	$0x4e, %xmm3, %xmm5
        vpshufd	$0x4e, %xmm4, %xmm1
        vpxor	%xmm3, %xmm5, %xmm5
        vpxor	%xmm4, %xmm1, %xmm1
        vpclmulqdq	$0x11, %xmm3, %xmm4, %xmm7
        vpclmulqdq	$0x00, %xmm3, %xmm4, %xmm6
        vpclmulqdq	$0x00, %xmm1, %xmm5, %xmm5
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vmovdqu	32(%esp), %xmm3
        vmovdqu	128(%esp), %xmm4
        vpshufd	$0x4e, %xmm3, %xmm0
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm3, %xmm0, %xmm0
        vpshufd	$0x4e, %xmm4, %xmm1
        vpxor	%xmm4, %xmm1, %xmm1
        vpclmulqdq	$0x11, %xmm3, %xmm4, %xmm2
        vpclmulqdq	$0x00, %xmm3, %xmm4, %xmm3
        vpclmulqdq	$0x00, %xmm1, %xmm0, %xmm0
        vpxor	%xmm3, %xmm5, %xmm5
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm2, %xmm7, %xmm7
        vpxor	%xmm0, %xmm5, %xmm5
        vmovdqu	16(%esp), %xmm3
        vmovdqu	144(%esp), %xmm4
        vpshufd	$0x4e, %xmm3, %xmm0
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm3, %xmm0, %xmm0
        vpshufd	$0x4e, %xmm4, %xmm1
        vpxor	%xmm4, %xmm1, %xmm1
        vpclmulqdq	$0x11, %xmm3, %xmm4, %xmm2
        vpclmulqdq	$0x00, %xmm3, %xmm4, %xmm3
        vpclmulqdq	$0x00, %xmm1, %xmm0, %xmm0
        vpxor	%xmm3, %xmm5, %xmm5
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm2, %xmm7, %xmm7
        vpxor	%xmm0, %xmm5, %xmm5
        vmovdqu	(%esp), %xmm3
        vmovdqu	160(%esp), %xmm4
        vpshufd	$0x4e, %xmm3, %xmm0
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm3, %xmm0, %xmm0
        vpshufd	$0x4e, %xmm4, %xmm1
        vpxor	%xmm4, %xmm1, %xmm1
        vpclmulqdq	$0x11, %xmm3, %xmm4, %xmm2
        vpclmulqdq	$0x00, %xmm3, %xmm4, %xmm3
        vpclmulqdq	$0x00, %xmm1, %xmm0, %xmm0
        vpxor	%xmm3, %xmm5, %xmm5
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm2, %xmm7, %xmm7
        vpxor	%xmm0, %xmm5, %xmm5
        vpslldq	$8, %xmm5, %xmm1
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm1, %xmm6, %xmm6
        vpxor	%xmm5, %xmm7, %xmm7
        vpslld	$31, %xmm6, %xmm3
        vpslld	$30, %xmm6, %xmm0
        vpslld	$25, %xmm6, %xmm1
        vpxor	%xmm0, %xmm3, %xmm3
        vpxor	%xmm1, %xmm3, %xmm3
        vpsrldq	$4, %xmm3, %xmm0
        vpslldq	$12, %xmm3, %xmm3
        vpxor	%xmm3, %xmm6, %xmm6
        vpsrld	$0x01, %xmm6, %xmm1
        vpsrld	$2, %xmm6, %xmm5
        vpsrld	$7, %xmm6, %xmm4
        vpxor	%xmm5, %xmm1, %xmm1
        vpxor	%xmm4, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm6, %xmm6
        vpxor	%xmm7, %xmm6, %xmm6
        vmovdqu	%xmm6, 96(%esp)
        addl	$0x40, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_decrypt_avx1_ghash_64_inplace
        jmp	L_AES_GCM_decrypt_avx1_ghash_64_done
L_AES_GCM_decrypt_avx1_ghash_64:
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        vmovdqu	64(%esp), %xmm4
        vmovdqa	L_aes_gcm_avx1_bswap_epi64, %xmm3
        vpaddd	L_aes_gcm_avx1_one, %xmm4, %xmm5
        vpshufb	%xmm3, %xmm5, %xmm5
        vpaddd	L_aes_gcm_avx1_two, %xmm4, %xmm6
        vpshufb	%xmm3, %xmm6, %xmm6
        vpaddd	L_aes_gcm_avx1_three, %xmm4, %xmm7
        vpshufb	%xmm3, %xmm7, %xmm7
        vpshufb	%xmm3, %xmm4, %xmm4
        vmovdqu	64(%esp), %xmm3
        vpaddd	L_aes_gcm_avx1_four, %xmm3, %xmm3
        vmovdqu	%xmm3, 64(%esp)
        vmovdqa	(%ebp), %xmm3
        vpxor	%xmm3, %xmm4, %xmm4
        vpxor	%xmm3, %xmm5, %xmm5
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm3, %xmm7, %xmm7
        vmovdqa	16(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	32(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	48(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	64(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	80(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	96(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	112(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	128(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	144(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        cmpl	$11, 236(%esp)
        vmovdqa	160(%ebp), %xmm3
        jl	L_AES_GCM_decrypt_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	176(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        cmpl	$13, 236(%esp)
        vmovdqa	192(%ebp), %xmm3
        jl	L_AES_GCM_decrypt_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	208(%ebp), %xmm3
        vaesenc	%xmm3, %xmm4, %xmm4
        vaesenc	%xmm3, %xmm5, %xmm5
        vaesenc	%xmm3, %xmm6, %xmm6
        vaesenc	%xmm3, %xmm7, %xmm7
        vmovdqa	224(%ebp), %xmm3
L_AES_GCM_decrypt_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done:
        vaesenclast	%xmm3, %xmm4, %xmm4
        vaesenclast	%xmm3, %xmm5, %xmm5
        vmovdqu	(%ecx), %xmm0
        vmovdqu	16(%ecx), %xmm1
        vpxor	%xmm0, %xmm4, %xmm4
        vpxor	%xmm1, %xmm5, %xmm5
        vmovdqu	%xmm0, (%ecx)
        vmovdqu	%xmm1, 16(%ecx)
        vmovdqu	%xmm4, (%edx)
        vmovdqu	%xmm5, 16(%edx)
        vaesenclast	%xmm3, %xmm6, %xmm6
        vaesenclast	%xmm3, %xmm7, %xmm7
        vmovdqu	32(%ecx), %xmm0
        vmovdqu	48(%ecx), %xmm1
        vpxor	%xmm0, %xmm6, %xmm6
        vpxor	%xmm1, %xmm7, %xmm7
        vmovdqu	%xmm0, 32(%ecx)
        vmovdqu	%xmm1, 48(%ecx)
        vmovdqu	%xmm6, 32(%edx)
        vmovdqu	%xmm7, 48(%edx)
        # ghash encrypted counter
        vmovdqu	96(%esp), %xmm6
        vmovdqu	48(%esp), %xmm3
        vmovdqu	(%ecx), %xmm4
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm6, %xmm4, %xmm4
        vpshufd	$0x4e, %xmm3, %xmm5
        vpshufd	$0x4e, %xmm4, %xmm1
        vpxor	%xmm3, %xmm5, %xmm5
        vpxor	%xmm4, %xmm1, %xmm1
        vpclmulqdq	$0x11, %xmm3, %xmm4, %xmm7
        vpclmulqdq	$0x00, %xmm3, %xmm4, %xmm6
        vpclmulqdq	$0x00, %xmm1, %xmm5, %xmm5
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vmovdqu	32(%esp), %xmm3
        vmovdqu	16(%ecx), %xmm4
        vpshufd	$0x4e, %xmm3, %xmm0
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm3, %xmm0, %xmm0
        vpshufd	$0x4e, %xmm4, %xmm1
        vpxor	%xmm4, %xmm1, %xmm1
        vpclmulqdq	$0x11, %xmm3, %xmm4, %xmm2
        vpclmulqdq	$0x00, %xmm3, %xmm4, %xmm3
        vpclmulqdq	$0x00, %xmm1, %xmm0, %xmm0
        vpxor	%xmm3, %xmm5, %xmm5
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm2, %xmm7, %xmm7
        vpxor	%xmm0, %xmm5, %xmm5
        vmovdqu	16(%esp), %xmm3
        vmovdqu	32(%ecx), %xmm4
        vpshufd	$0x4e, %xmm3, %xmm0
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm3, %xmm0, %xmm0
        vpshufd	$0x4e, %xmm4, %xmm1
        vpxor	%xmm4, %xmm1, %xmm1
        vpclmulqdq	$0x11, %xmm3, %xmm4, %xmm2
        vpclmulqdq	$0x00, %xmm3, %xmm4, %xmm3
        vpclmulqdq	$0x00, %xmm1, %xmm0, %xmm0
        vpxor	%xmm3, %xmm5, %xmm5
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm2, %xmm7, %xmm7
        vpxor	%xmm0, %xmm5, %xmm5
        vmovdqu	(%esp), %xmm3
        vmovdqu	48(%ecx), %xmm4
        vpshufd	$0x4e, %xmm3, %xmm0
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm3, %xmm0, %xmm0
        vpshufd	$0x4e, %xmm4, %xmm1
        vpxor	%xmm4, %xmm1, %xmm1
        vpclmulqdq	$0x11, %xmm3, %xmm4, %xmm2
        vpclmulqdq	$0x00, %xmm3, %xmm4, %xmm3
        vpclmulqdq	$0x00, %xmm1, %xmm0, %xmm0
        vpxor	%xmm3, %xmm5, %xmm5
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm2, %xmm7, %xmm7
        vpxor	%xmm0, %xmm5, %xmm5
        vpslldq	$8, %xmm5, %xmm1
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm1, %xmm6, %xmm6
        vpxor	%xmm5, %xmm7, %xmm7
        vpslld	$31, %xmm6, %xmm3
        vpslld	$30, %xmm6, %xmm0
        vpslld	$25, %xmm6, %xmm1
        vpxor	%xmm0, %xmm3, %xmm3
        vpxor	%xmm1, %xmm3, %xmm3
        vpsrldq	$4, %xmm3, %xmm0
        vpslldq	$12, %xmm3, %xmm3
        vpxor	%xmm3, %xmm6, %xmm6
        vpsrld	$0x01, %xmm6, %xmm1
        vpsrld	$2, %xmm6, %xmm5
        vpsrld	$7, %xmm6, %xmm4
        vpxor	%xmm5, %xmm1, %xmm1
        vpxor	%xmm4, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm6, %xmm6
        vpxor	%xmm7, %xmm6, %xmm6
        vmovdqu	%xmm6, 96(%esp)
        addl	$0x40, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_decrypt_avx1_ghash_64
L_AES_GCM_decrypt_avx1_ghash_64_done:
        vmovdqa	%xmm6, %xmm2
        vmovdqu	(%esp), %xmm1
L_AES_GCM_decrypt_avx1_done_64:
        movl	216(%esp), %edx
        cmpl	%edx, %ebx
        jge	L_AES_GCM_decrypt_avx1_done_dec
        movl	216(%esp), %eax
        andl	$0xfffffff0, %eax
        cmpl	%eax, %ebx
        jge	L_AES_GCM_decrypt_avx1_last_block_done
L_AES_GCM_decrypt_avx1_last_block_start:
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        vmovdqu	(%ecx), %xmm7
        pshufb	L_aes_gcm_avx1_bswap_mask, %xmm7
        pxor	%xmm2, %xmm7
        vmovdqu	64(%esp), %xmm5
        vmovdqu	%xmm7, %xmm7
        vpshufb	L_aes_gcm_avx1_bswap_epi64, %xmm5, %xmm4
        vpaddd	L_aes_gcm_avx1_one, %xmm5, %xmm5
        vmovdqu	%xmm5, 64(%esp)
        vpxor	(%ebp), %xmm4, %xmm4
        vpclmulqdq	$16, %xmm1, %xmm7, %xmm0
        vaesenc	16(%ebp), %xmm4, %xmm4
        vaesenc	32(%ebp), %xmm4, %xmm4
        vpclmulqdq	$0x01, %xmm1, %xmm7, %xmm3
        vaesenc	48(%ebp), %xmm4, %xmm4
        vaesenc	64(%ebp), %xmm4, %xmm4
        vaesenc	80(%ebp), %xmm4, %xmm4
        vpclmulqdq	$0x11, %xmm1, %xmm7, %xmm5
        vaesenc	96(%ebp), %xmm4, %xmm4
        vpxor	%xmm3, %xmm0, %xmm0
        vpslldq	$8, %xmm0, %xmm6
        vpsrldq	$8, %xmm0, %xmm0
        vaesenc	112(%ebp), %xmm4, %xmm4
        vpclmulqdq	$0x00, %xmm1, %xmm7, %xmm3
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm0, %xmm5, %xmm5
        vmovdqa	L_aes_gcm_avx1_mod2_128, %xmm7
        vpclmulqdq	$16, %xmm7, %xmm6, %xmm3
        vaesenc	128(%ebp), %xmm4, %xmm4
        vpshufd	$0x4e, %xmm6, %xmm0
        vpxor	%xmm3, %xmm0, %xmm0
        vpclmulqdq	$16, %xmm7, %xmm0, %xmm3
        vaesenc	144(%ebp), %xmm4, %xmm4
        vpshufd	$0x4e, %xmm0, %xmm2
        vpxor	%xmm3, %xmm2, %xmm2
        vpxor	%xmm5, %xmm2, %xmm2
        cmpl	$11, 236(%esp)
        vmovdqa	160(%ebp), %xmm5
        jl	L_AES_GCM_decrypt_avx1_aesenc_gfmul_last
        vaesenc	%xmm5, %xmm4, %xmm4
        vaesenc	176(%ebp), %xmm4, %xmm4
        cmpl	$13, 236(%esp)
        vmovdqa	192(%ebp), %xmm5
        jl	L_AES_GCM_decrypt_avx1_aesenc_gfmul_last
        vaesenc	%xmm5, %xmm4, %xmm4
        vaesenc	208(%ebp), %xmm4, %xmm4
        vmovdqa	224(%ebp), %xmm5
L_AES_GCM_decrypt_avx1_aesenc_gfmul_last:
        vaesenclast	%xmm5, %xmm4, %xmm4
        vmovdqu	(%ecx), %xmm5
        vpxor	%xmm5, %xmm4, %xmm4
        vmovdqu	%xmm4, (%edx)
        addl	$16, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_decrypt_avx1_last_block_start
L_AES_GCM_decrypt_avx1_last_block_done:
        movl	216(%esp), %ecx
        movl	%ecx, %edx
        andl	$15, %ecx
        jz	L_AES_GCM_decrypt_avx1_aesenc_last15_dec_avx_done
        vmovdqu	64(%esp), %xmm0
        vpshufb	L_aes_gcm_avx1_bswap_epi64, %xmm0, %xmm0
        vpxor	(%ebp), %xmm0, %xmm0
        vaesenc	16(%ebp), %xmm0, %xmm0
        vaesenc	32(%ebp), %xmm0, %xmm0
        vaesenc	48(%ebp), %xmm0, %xmm0
        vaesenc	64(%ebp), %xmm0, %xmm0
        vaesenc	80(%ebp), %xmm0, %xmm0
        vaesenc	96(%ebp), %xmm0, %xmm0
        vaesenc	112(%ebp), %xmm0, %xmm0
        vaesenc	128(%ebp), %xmm0, %xmm0
        vaesenc	144(%ebp), %xmm0, %xmm0
        cmpl	$11, 236(%esp)
        vmovdqa	160(%ebp), %xmm5
        jl	L_AES_GCM_decrypt_avx1_aesenc_last15_dec_avx_aesenc_avx_last
        vaesenc	%xmm5, %xmm0, %xmm0
        vaesenc	176(%ebp), %xmm0, %xmm0
        cmpl	$13, 236(%esp)
        vmovdqa	192(%ebp), %xmm5
        jl	L_AES_GCM_decrypt_avx1_aesenc_last15_dec_avx_aesenc_avx_last
        vaesenc	%xmm5, %xmm0, %xmm0
        vaesenc	208(%ebp), %xmm0, %xmm0
        vmovdqa	224(%ebp), %xmm5
L_AES_GCM_decrypt_avx1_aesenc_last15_dec_avx_aesenc_avx_last:
        vaesenclast	%xmm5, %xmm0, %xmm0
        subl	$32, %esp
        xorl	%ecx, %ecx
        vmovdqu	%xmm0, (%esp)
        vpxor	%xmm4, %xmm4, %xmm4
        vmovdqu	%xmm4, 16(%esp)
L_AES_GCM_decrypt_avx1_aesenc_last15_dec_avx_loop:
        movzbl	(%esi,%ebx,1), %eax
        movb	%al, 16(%esp,%ecx,1)
        xorb	(%esp,%ecx,1), %al
        movb	%al, (%edi,%ebx,1)
        incl	%ebx
        incl	%ecx
        cmpl	%edx, %ebx
        jl	L_AES_GCM_decrypt_avx1_aesenc_last15_dec_avx_loop
        vmovdqu	16(%esp), %xmm0
        addl	$32, %esp
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm0, %xmm2, %xmm2
        # ghash_gfmul_red_avx
        vpshufd	$0x4e, %xmm1, %xmm5
        vpshufd	$0x4e, %xmm2, %xmm6
        vpclmulqdq	$0x11, %xmm1, %xmm2, %xmm7
        vpclmulqdq	$0x00, %xmm1, %xmm2, %xmm4
        vpxor	%xmm1, %xmm5, %xmm5
        vpxor	%xmm2, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vpslldq	$8, %xmm5, %xmm6
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm6, %xmm4, %xmm4
        vpxor	%xmm5, %xmm7, %xmm2
        vpslld	$31, %xmm4, %xmm5
        vpslld	$30, %xmm4, %xmm6
        vpslld	$25, %xmm4, %xmm7
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vpsrldq	$4, %xmm5, %xmm7
        vpslldq	$12, %xmm5, %xmm5
        vpxor	%xmm5, %xmm4, %xmm4
        vpsrld	$0x01, %xmm4, %xmm5
        vpsrld	$2, %xmm4, %xmm6
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpsrld	$7, %xmm4, %xmm4
        vpxor	%xmm7, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm5, %xmm2, %xmm2
L_AES_GCM_decrypt_avx1_aesenc_last15_dec_avx_done:
L_AES_GCM_decrypt_avx1_done_dec:
        movl	212(%esp), %esi
        movl	228(%esp), %ebp
        movl	216(%esp), %edx
        movl	220(%esp), %ecx
        shll	$3, %edx
        shll	$3, %ecx
        vpinsrd	$0x00, %edx, %xmm4, %xmm4
        vpinsrd	$2, %ecx, %xmm4, %xmm4
        movl	216(%esp), %edx
        movl	220(%esp), %ecx
        shrl	$29, %edx
        shrl	$29, %ecx
        vpinsrd	$0x01, %edx, %xmm4, %xmm4
        vpinsrd	$3, %ecx, %xmm4, %xmm4
        vpxor	%xmm4, %xmm2, %xmm2
        # ghash_gfmul_red_avx
        vpshufd	$0x4e, %xmm1, %xmm5
        vpshufd	$0x4e, %xmm2, %xmm6
        vpclmulqdq	$0x11, %xmm1, %xmm2, %xmm7
        vpclmulqdq	$0x00, %xmm1, %xmm2, %xmm4
        vpxor	%xmm1, %xmm5, %xmm5
        vpxor	%xmm2, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vpslldq	$8, %xmm5, %xmm6
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm6, %xmm4, %xmm4
        vpxor	%xmm5, %xmm7, %xmm2
        vpslld	$31, %xmm4, %xmm5
        vpslld	$30, %xmm4, %xmm6
        vpslld	$25, %xmm4, %xmm7
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm7, %xmm5, %xmm5
        vpsrldq	$4, %xmm5, %xmm7
        vpslldq	$12, %xmm5, %xmm5
        vpxor	%xmm5, %xmm4, %xmm4
        vpsrld	$0x01, %xmm4, %xmm5
        vpsrld	$2, %xmm4, %xmm6
        vpxor	%xmm6, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpsrld	$7, %xmm4, %xmm4
        vpxor	%xmm7, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm5, %xmm2, %xmm2
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm2, %xmm2
        vpxor	80(%esp), %xmm2, %xmm4
        movl	240(%esp), %edi
        cmpl	$16, %ebp
        je	L_AES_GCM_decrypt_avx1_cmp_tag_16
        subl	$16, %esp
        xorl	%ecx, %ecx
        xorl	%ebx, %ebx
        vmovdqu	%xmm4, (%esp)
L_AES_GCM_decrypt_avx1_cmp_tag_loop:
        movzbl	(%esp,%ecx,1), %eax
        xorb	(%esi,%ecx,1), %al
        orb	%al, %bl
        incl	%ecx
        cmpl	%ebp, %ecx
        jne	L_AES_GCM_decrypt_avx1_cmp_tag_loop
        cmpb	$0x00, %bl
        sete	%bl
        addl	$16, %esp
        xorl	%ecx, %ecx
        jmp	L_AES_GCM_decrypt_avx1_cmp_tag_done
L_AES_GCM_decrypt_avx1_cmp_tag_16:
        vmovdqu	(%esi), %xmm5
        vpcmpeqb	%xmm5, %xmm4, %xmm4
        vpmovmskb	%xmm4, %edx
        # %%edx == 0xFFFF then return 1 else => return 0
        xorl	%ebx, %ebx
        cmpl	$0xffff, %edx
        sete	%bl
L_AES_GCM_decrypt_avx1_cmp_tag_done:
        movl	%ebx, (%edi)
        addl	$0xb0, %esp
        popl	%ebp
        popl	%edi
        popl	%esi
        popl	%ebx
        ret
.size	AES_GCM_decrypt_avx1,.-AES_GCM_decrypt_avx1
#ifdef WOLFSSL_AESGCM_STREAM
.text
.globl	AES_GCM_init_avx1
.type	AES_GCM_init_avx1,@function
.align	16
AES_GCM_init_avx1:
        pushl	%ebx
        pushl	%esi
        pushl	%edi
        pushl	%ebp
        subl	$16, %esp
        movl	36(%esp), %ebp
        movl	44(%esp), %esi
        movl	60(%esp), %edi
        vpxor	%xmm4, %xmm4, %xmm4
        movl	48(%esp), %edx
        cmpl	$12, %edx
        jne	L_AES_GCM_init_avx1_iv_not_12
        # # Calculate values when IV is 12 bytes
        # Set counter based on IV
        movl	$0x1000000, %ecx
        vpinsrd	$0x00, (%esi), %xmm4, %xmm4
        vpinsrd	$0x01, 4(%esi), %xmm4, %xmm4
        vpinsrd	$2, 8(%esi), %xmm4, %xmm4
        vpinsrd	$3, %ecx, %xmm4, %xmm4
        # H = Encrypt X(=0) and T = Encrypt counter
        vmovdqa	(%ebp), %xmm5
        vpxor	%xmm5, %xmm4, %xmm1
        vmovdqa	16(%ebp), %xmm7
        vaesenc	%xmm7, %xmm5, %xmm5
        vaesenc	%xmm7, %xmm1, %xmm1
        vmovdqa	32(%ebp), %xmm7
        vaesenc	%xmm7, %xmm5, %xmm5
        vaesenc	%xmm7, %xmm1, %xmm1
        vmovdqa	48(%ebp), %xmm7
        vaesenc	%xmm7, %xmm5, %xmm5
        vaesenc	%xmm7, %xmm1, %xmm1
        vmovdqa	64(%ebp), %xmm7
        vaesenc	%xmm7, %xmm5, %xmm5
        vaesenc	%xmm7, %xmm1, %xmm1
        vmovdqa	80(%ebp), %xmm7
        vaesenc	%xmm7, %xmm5, %xmm5
        vaesenc	%xmm7, %xmm1, %xmm1
        vmovdqa	96(%ebp), %xmm7
        vaesenc	%xmm7, %xmm5, %xmm5
        vaesenc	%xmm7, %xmm1, %xmm1
        vmovdqa	112(%ebp), %xmm7
        vaesenc	%xmm7, %xmm5, %xmm5
        vaesenc	%xmm7, %xmm1, %xmm1
        vmovdqa	128(%ebp), %xmm7
        vaesenc	%xmm7, %xmm5, %xmm5
        vaesenc	%xmm7, %xmm1, %xmm1
        vmovdqa	144(%ebp), %xmm7
        vaesenc	%xmm7, %xmm5, %xmm5
        vaesenc	%xmm7, %xmm1, %xmm1
        cmpl	$11, 40(%esp)
        vmovdqa	160(%ebp), %xmm7
        jl	L_AES_GCM_init_avx1_calc_iv_12_last
        vaesenc	%xmm7, %xmm5, %xmm5
        vaesenc	%xmm7, %xmm1, %xmm1
        vmovdqa	176(%ebp), %xmm7
        vaesenc	%xmm7, %xmm5, %xmm5
        vaesenc	%xmm7, %xmm1, %xmm1
        cmpl	$13, 40(%esp)
        vmovdqa	192(%ebp), %xmm7
        jl	L_AES_GCM_init_avx1_calc_iv_12_last
        vaesenc	%xmm7, %xmm5, %xmm5
        vaesenc	%xmm7, %xmm1, %xmm1
        vmovdqa	208(%ebp), %xmm7
        vaesenc	%xmm7, %xmm5, %xmm5
        vaesenc	%xmm7, %xmm1, %xmm1
        vmovdqa	224(%ebp), %xmm7
L_AES_GCM_init_avx1_calc_iv_12_last:
        vaesenclast	%xmm7, %xmm5, %xmm5
        vaesenclast	%xmm7, %xmm1, %xmm1
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm5, %xmm5
        vmovdqu	%xmm1, (%edi)
        jmp	L_AES_GCM_init_avx1_iv_done
L_AES_GCM_init_avx1_iv_not_12:
        # Calculate values when IV is not 12 bytes
        # H = Encrypt X(=0)
        vmovdqa	(%ebp), %xmm5
        vaesenc	16(%ebp), %xmm5, %xmm5
        vaesenc	32(%ebp), %xmm5, %xmm5
        vaesenc	48(%ebp), %xmm5, %xmm5
        vaesenc	64(%ebp), %xmm5, %xmm5
        vaesenc	80(%ebp), %xmm5, %xmm5
        vaesenc	96(%ebp), %xmm5, %xmm5
        vaesenc	112(%ebp), %xmm5, %xmm5
        vaesenc	128(%ebp), %xmm5, %xmm5
        vaesenc	144(%ebp), %xmm5, %xmm5
        cmpl	$11, 40(%esp)
        vmovdqa	160(%ebp), %xmm1
        jl	L_AES_GCM_init_avx1_calc_iv_1_aesenc_avx_last
        vaesenc	%xmm1, %xmm5, %xmm5
        vaesenc	176(%ebp), %xmm5, %xmm5
        cmpl	$13, 40(%esp)
        vmovdqa	192(%ebp), %xmm1
        jl	L_AES_GCM_init_avx1_calc_iv_1_aesenc_avx_last
        vaesenc	%xmm1, %xmm5, %xmm5
        vaesenc	208(%ebp), %xmm5, %xmm5
        vmovdqa	224(%ebp), %xmm1
L_AES_GCM_init_avx1_calc_iv_1_aesenc_avx_last:
        vaesenclast	%xmm1, %xmm5, %xmm5
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm5, %xmm5
        # Calc counter
        # Initialization vector
        cmpl	$0x00, %edx
        movl	$0x00, %ecx
        je	L_AES_GCM_init_avx1_calc_iv_done
        cmpl	$16, %edx
        jl	L_AES_GCM_init_avx1_calc_iv_lt16
        andl	$0xfffffff0, %edx
L_AES_GCM_init_avx1_calc_iv_16_loop:
        vmovdqu	(%esi,%ecx,1), %xmm0
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm0, %xmm4, %xmm4
        # ghash_gfmul_avx
        vpshufd	$0x4e, %xmm4, %xmm1
        vpshufd	$0x4e, %xmm5, %xmm2
        vpclmulqdq	$0x11, %xmm4, %xmm5, %xmm3
        vpclmulqdq	$0x00, %xmm4, %xmm5, %xmm0
        vpxor	%xmm4, %xmm1, %xmm1
        vpxor	%xmm5, %xmm2, %xmm2
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vmovdqa	%xmm0, %xmm7
        vmovdqa	%xmm3, %xmm4
        vpslldq	$8, %xmm1, %xmm2
        vpsrldq	$8, %xmm1, %xmm1
        vpxor	%xmm2, %xmm7, %xmm7
        vpxor	%xmm1, %xmm4, %xmm4
        vpsrld	$31, %xmm7, %xmm0
        vpsrld	$31, %xmm4, %xmm1
        vpslld	$0x01, %xmm7, %xmm7
        vpslld	$0x01, %xmm4, %xmm4
        vpsrldq	$12, %xmm0, %xmm2
        vpslldq	$4, %xmm0, %xmm0
        vpslldq	$4, %xmm1, %xmm1
        vpor	%xmm2, %xmm4, %xmm4
        vpor	%xmm0, %xmm7, %xmm7
        vpor	%xmm1, %xmm4, %xmm4
        vpslld	$31, %xmm7, %xmm0
        vpslld	$30, %xmm7, %xmm1
        vpslld	$25, %xmm7, %xmm2
        vpxor	%xmm1, %xmm0, %xmm0
        vpxor	%xmm2, %xmm0, %xmm0
        vmovdqa	%xmm0, %xmm1
        vpsrldq	$4, %xmm1, %xmm1
        vpslldq	$12, %xmm0, %xmm0
        vpxor	%xmm0, %xmm7, %xmm7
        vpsrld	$0x01, %xmm7, %xmm2
        vpsrld	$2, %xmm7, %xmm3
        vpsrld	$7, %xmm7, %xmm0
        vpxor	%xmm3, %xmm2, %xmm2
        vpxor	%xmm0, %xmm2, %xmm2
        vpxor	%xmm1, %xmm2, %xmm2
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm2, %xmm4, %xmm4
        addl	$16, %ecx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_init_avx1_calc_iv_16_loop
        movl	48(%esp), %edx
        cmpl	%edx, %ecx
        je	L_AES_GCM_init_avx1_calc_iv_done
L_AES_GCM_init_avx1_calc_iv_lt16:
        subl	$16, %esp
        vpxor	%xmm0, %xmm0, %xmm0
        xorl	%ebx, %ebx
        vmovdqu	%xmm0, (%esp)
L_AES_GCM_init_avx1_calc_iv_loop:
        movzbl	(%esi,%ecx,1), %eax
        movb	%al, (%esp,%ebx,1)
        incl	%ecx
        incl	%ebx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_init_avx1_calc_iv_loop
        vmovdqu	(%esp), %xmm0
        addl	$16, %esp
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm0, %xmm4, %xmm4
        # ghash_gfmul_avx
        vpshufd	$0x4e, %xmm4, %xmm1
        vpshufd	$0x4e, %xmm5, %xmm2
        vpclmulqdq	$0x11, %xmm4, %xmm5, %xmm3
        vpclmulqdq	$0x00, %xmm4, %xmm5, %xmm0
        vpxor	%xmm4, %xmm1, %xmm1
        vpxor	%xmm5, %xmm2, %xmm2
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vmovdqa	%xmm0, %xmm7
        vmovdqa	%xmm3, %xmm4
        vpslldq	$8, %xmm1, %xmm2
        vpsrldq	$8, %xmm1, %xmm1
        vpxor	%xmm2, %xmm7, %xmm7
        vpxor	%xmm1, %xmm4, %xmm4
        vpsrld	$31, %xmm7, %xmm0
        vpsrld	$31, %xmm4, %xmm1
        vpslld	$0x01, %xmm7, %xmm7
        vpslld	$0x01, %xmm4, %xmm4
        vpsrldq	$12, %xmm0, %xmm2
        vpslldq	$4, %xmm0, %xmm0
        vpslldq	$4, %xmm1, %xmm1
        vpor	%xmm2, %xmm4, %xmm4
        vpor	%xmm0, %xmm7, %xmm7
        vpor	%xmm1, %xmm4, %xmm4
        vpslld	$31, %xmm7, %xmm0
        vpslld	$30, %xmm7, %xmm1
        vpslld	$25, %xmm7, %xmm2
        vpxor	%xmm1, %xmm0, %xmm0
        vpxor	%xmm2, %xmm0, %xmm0
        vmovdqa	%xmm0, %xmm1
        vpsrldq	$4, %xmm1, %xmm1
        vpslldq	$12, %xmm0, %xmm0
        vpxor	%xmm0, %xmm7, %xmm7
        vpsrld	$0x01, %xmm7, %xmm2
        vpsrld	$2, %xmm7, %xmm3
        vpsrld	$7, %xmm7, %xmm0
        vpxor	%xmm3, %xmm2, %xmm2
        vpxor	%xmm0, %xmm2, %xmm2
        vpxor	%xmm1, %xmm2, %xmm2
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm2, %xmm4, %xmm4
L_AES_GCM_init_avx1_calc_iv_done:
        # T = Encrypt counter
        vpxor	%xmm0, %xmm0, %xmm0
        shll	$3, %edx
        vpinsrd	$0x00, %edx, %xmm0, %xmm0
        vpxor	%xmm0, %xmm4, %xmm4
        # ghash_gfmul_avx
        vpshufd	$0x4e, %xmm4, %xmm1
        vpshufd	$0x4e, %xmm5, %xmm2
        vpclmulqdq	$0x11, %xmm4, %xmm5, %xmm3
        vpclmulqdq	$0x00, %xmm4, %xmm5, %xmm0
        vpxor	%xmm4, %xmm1, %xmm1
        vpxor	%xmm5, %xmm2, %xmm2
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vmovdqa	%xmm0, %xmm7
        vmovdqa	%xmm3, %xmm4
        vpslldq	$8, %xmm1, %xmm2
        vpsrldq	$8, %xmm1, %xmm1
        vpxor	%xmm2, %xmm7, %xmm7
        vpxor	%xmm1, %xmm4, %xmm4
        vpsrld	$31, %xmm7, %xmm0
        vpsrld	$31, %xmm4, %xmm1
        vpslld	$0x01, %xmm7, %xmm7
        vpslld	$0x01, %xmm4, %xmm4
        vpsrldq	$12, %xmm0, %xmm2
        vpslldq	$4, %xmm0, %xmm0
        vpslldq	$4, %xmm1, %xmm1
        vpor	%xmm2, %xmm4, %xmm4
        vpor	%xmm0, %xmm7, %xmm7
        vpor	%xmm1, %xmm4, %xmm4
        vpslld	$31, %xmm7, %xmm0
        vpslld	$30, %xmm7, %xmm1
        vpslld	$25, %xmm7, %xmm2
        vpxor	%xmm1, %xmm0, %xmm0
        vpxor	%xmm2, %xmm0, %xmm0
        vmovdqa	%xmm0, %xmm1
        vpsrldq	$4, %xmm1, %xmm1
        vpslldq	$12, %xmm0, %xmm0
        vpxor	%xmm0, %xmm7, %xmm7
        vpsrld	$0x01, %xmm7, %xmm2
        vpsrld	$2, %xmm7, %xmm3
        vpsrld	$7, %xmm7, %xmm0
        vpxor	%xmm3, %xmm2, %xmm2
        vpxor	%xmm0, %xmm2, %xmm2
        vpxor	%xmm1, %xmm2, %xmm2
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm2, %xmm4, %xmm4
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        #   Encrypt counter
        vmovdqa	(%ebp), %xmm0
        vpxor	%xmm4, %xmm0, %xmm0
        vaesenc	16(%ebp), %xmm0, %xmm0
        vaesenc	32(%ebp), %xmm0, %xmm0
        vaesenc	48(%ebp), %xmm0, %xmm0
        vaesenc	64(%ebp), %xmm0, %xmm0
        vaesenc	80(%ebp), %xmm0, %xmm0
        vaesenc	96(%ebp), %xmm0, %xmm0
        vaesenc	112(%ebp), %xmm0, %xmm0
        vaesenc	128(%ebp), %xmm0, %xmm0
        vaesenc	144(%ebp), %xmm0, %xmm0
        cmpl	$11, 40(%esp)
        vmovdqa	160(%ebp), %xmm1
        jl	L_AES_GCM_init_avx1_calc_iv_2_aesenc_avx_last
        vaesenc	%xmm1, %xmm0, %xmm0
        vaesenc	176(%ebp), %xmm0, %xmm0
        cmpl	$13, 40(%esp)
        vmovdqa	192(%ebp), %xmm1
        jl	L_AES_GCM_init_avx1_calc_iv_2_aesenc_avx_last
        vaesenc	%xmm1, %xmm0, %xmm0
        vaesenc	208(%ebp), %xmm0, %xmm0
        vmovdqa	224(%ebp), %xmm1
L_AES_GCM_init_avx1_calc_iv_2_aesenc_avx_last:
        vaesenclast	%xmm1, %xmm0, %xmm0
        vmovdqu	%xmm0, (%edi)
L_AES_GCM_init_avx1_iv_done:
        movl	52(%esp), %ebp
        movl	56(%esp), %edi
        vpshufb	L_aes_gcm_avx1_bswap_epi64, %xmm4, %xmm4
        vpaddd	L_aes_gcm_avx1_one, %xmm4, %xmm4
        vmovdqa	%xmm5, (%ebp)
        vmovdqa	%xmm4, (%edi)
        addl	$16, %esp
        popl	%ebp
        popl	%edi
        popl	%esi
        popl	%ebx
        ret
.size	AES_GCM_init_avx1,.-AES_GCM_init_avx1
.text
.globl	AES_GCM_aad_update_avx1
.type	AES_GCM_aad_update_avx1,@function
.align	16
AES_GCM_aad_update_avx1:
        pushl	%esi
        pushl	%edi
        movl	12(%esp), %esi
        movl	16(%esp), %edx
        movl	20(%esp), %edi
        movl	24(%esp), %eax
        vmovdqa	(%edi), %xmm5
        vmovdqa	(%eax), %xmm6
        xorl	%ecx, %ecx
L_AES_GCM_aad_update_avx1_16_loop:
        vmovdqu	(%esi,%ecx,1), %xmm0
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm0, %xmm5, %xmm5
        # ghash_gfmul_avx
        vpshufd	$0x4e, %xmm5, %xmm1
        vpshufd	$0x4e, %xmm6, %xmm2
        vpclmulqdq	$0x11, %xmm5, %xmm6, %xmm3
        vpclmulqdq	$0x00, %xmm5, %xmm6, %xmm0
        vpxor	%xmm5, %xmm1, %xmm1
        vpxor	%xmm6, %xmm2, %xmm2
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vmovdqa	%xmm0, %xmm4
        vmovdqa	%xmm3, %xmm5
        vpslldq	$8, %xmm1, %xmm2
        vpsrldq	$8, %xmm1, %xmm1
        vpxor	%xmm2, %xmm4, %xmm4
        vpxor	%xmm1, %xmm5, %xmm5
        vpsrld	$31, %xmm4, %xmm0
        vpsrld	$31, %xmm5, %xmm1
        vpslld	$0x01, %xmm4, %xmm4
        vpslld	$0x01, %xmm5, %xmm5
        vpsrldq	$12, %xmm0, %xmm2
        vpslldq	$4, %xmm0, %xmm0
        vpslldq	$4, %xmm1, %xmm1
        vpor	%xmm2, %xmm5, %xmm5
        vpor	%xmm0, %xmm4, %xmm4
        vpor	%xmm1, %xmm5, %xmm5
        vpslld	$31, %xmm4, %xmm0
        vpslld	$30, %xmm4, %xmm1
        vpslld	$25, %xmm4, %xmm2
        vpxor	%xmm1, %xmm0, %xmm0
        vpxor	%xmm2, %xmm0, %xmm0
        vmovdqa	%xmm0, %xmm1
        vpsrldq	$4, %xmm1, %xmm1
        vpslldq	$12, %xmm0, %xmm0
        vpxor	%xmm0, %xmm4, %xmm4
        vpsrld	$0x01, %xmm4, %xmm2
        vpsrld	$2, %xmm4, %xmm3
        vpsrld	$7, %xmm4, %xmm0
        vpxor	%xmm3, %xmm2, %xmm2
        vpxor	%xmm0, %xmm2, %xmm2
        vpxor	%xmm1, %xmm2, %xmm2
        vpxor	%xmm4, %xmm2, %xmm2
        vpxor	%xmm2, %xmm5, %xmm5
        addl	$16, %ecx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_aad_update_avx1_16_loop
        vmovdqa	%xmm5, (%edi)
        popl	%edi
        popl	%esi
        ret
.size	AES_GCM_aad_update_avx1,.-AES_GCM_aad_update_avx1
.text
.globl	AES_GCM_encrypt_block_avx1
.type	AES_GCM_encrypt_block_avx1,@function
.align	16
AES_GCM_encrypt_block_avx1:
        pushl	%esi
        pushl	%edi
        movl	12(%esp), %ecx
        movl	16(%esp), %eax
        movl	20(%esp), %edi
        movl	24(%esp), %esi
        movl	28(%esp), %edx
        vmovdqu	(%edx), %xmm1
        vpshufb	L_aes_gcm_avx1_bswap_epi64, %xmm1, %xmm0
        vpaddd	L_aes_gcm_avx1_one, %xmm1, %xmm1
        vmovdqu	%xmm1, (%edx)
        vpxor	(%ecx), %xmm0, %xmm0
        vaesenc	16(%ecx), %xmm0, %xmm0
        vaesenc	32(%ecx), %xmm0, %xmm0
        vaesenc	48(%ecx), %xmm0, %xmm0
        vaesenc	64(%ecx), %xmm0, %xmm0
        vaesenc	80(%ecx), %xmm0, %xmm0
        vaesenc	96(%ecx), %xmm0, %xmm0
        vaesenc	112(%ecx), %xmm0, %xmm0
        vaesenc	128(%ecx), %xmm0, %xmm0
        vaesenc	144(%ecx), %xmm0, %xmm0
        cmpl	$11, %eax
        vmovdqa	160(%ecx), %xmm1
        jl	L_AES_GCM_encrypt_block_avx1_aesenc_block_aesenc_avx_last
        vaesenc	%xmm1, %xmm0, %xmm0
        vaesenc	176(%ecx), %xmm0, %xmm0
        cmpl	$13, %eax
        vmovdqa	192(%ecx), %xmm1
        jl	L_AES_GCM_encrypt_block_avx1_aesenc_block_aesenc_avx_last
        vaesenc	%xmm1, %xmm0, %xmm0
        vaesenc	208(%ecx), %xmm0, %xmm0
        vmovdqa	224(%ecx), %xmm1
L_AES_GCM_encrypt_block_avx1_aesenc_block_aesenc_avx_last:
        vaesenclast	%xmm1, %xmm0, %xmm0
        vmovdqu	(%esi), %xmm1
        vpxor	%xmm1, %xmm0, %xmm0
        vmovdqu	%xmm0, (%edi)
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
        popl	%edi
        popl	%esi
        ret
.size	AES_GCM_encrypt_block_avx1,.-AES_GCM_encrypt_block_avx1
.text
.globl	AES_GCM_ghash_block_avx1
.type	AES_GCM_ghash_block_avx1,@function
.align	16
AES_GCM_ghash_block_avx1:
        movl	4(%esp), %edx
        movl	8(%esp), %eax
        movl	12(%esp), %ecx
        vmovdqa	(%eax), %xmm4
        vmovdqa	(%ecx), %xmm5
        vmovdqu	(%edx), %xmm0
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm0, %xmm4, %xmm4
        # ghash_gfmul_avx
        vpshufd	$0x4e, %xmm4, %xmm1
        vpshufd	$0x4e, %xmm5, %xmm2
        vpclmulqdq	$0x11, %xmm4, %xmm5, %xmm3
        vpclmulqdq	$0x00, %xmm4, %xmm5, %xmm0
        vpxor	%xmm4, %xmm1, %xmm1
        vpxor	%xmm5, %xmm2, %xmm2
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vmovdqa	%xmm0, %xmm6
        vmovdqa	%xmm3, %xmm4
        vpslldq	$8, %xmm1, %xmm2
        vpsrldq	$8, %xmm1, %xmm1
        vpxor	%xmm2, %xmm6, %xmm6
        vpxor	%xmm1, %xmm4, %xmm4
        vpsrld	$31, %xmm6, %xmm0
        vpsrld	$31, %xmm4, %xmm1
        vpslld	$0x01, %xmm6, %xmm6
        vpslld	$0x01, %xmm4, %xmm4
        vpsrldq	$12, %xmm0, %xmm2
        vpslldq	$4, %xmm0, %xmm0
        vpslldq	$4, %xmm1, %xmm1
        vpor	%xmm2, %xmm4, %xmm4
        vpor	%xmm0, %xmm6, %xmm6
        vpor	%xmm1, %xmm4, %xmm4
        vpslld	$31, %xmm6, %xmm0
        vpslld	$30, %xmm6, %xmm1
        vpslld	$25, %xmm6, %xmm2
        vpxor	%xmm1, %xmm0, %xmm0
        vpxor	%xmm2, %xmm0, %xmm0
        vmovdqa	%xmm0, %xmm1
        vpsrldq	$4, %xmm1, %xmm1
        vpslldq	$12, %xmm0, %xmm0
        vpxor	%xmm0, %xmm6, %xmm6
        vpsrld	$0x01, %xmm6, %xmm2
        vpsrld	$2, %xmm6, %xmm3
        vpsrld	$7, %xmm6, %xmm0
        vpxor	%xmm3, %xmm2, %xmm2
        vpxor	%xmm0, %xmm2, %xmm2
        vpxor	%xmm1, %xmm2, %xmm2
        vpxor	%xmm6, %xmm2, %xmm2
        vpxor	%xmm2, %xmm4, %xmm4
        vmovdqa	%xmm4, (%eax)
        ret
.size	AES_GCM_ghash_block_avx1,.-AES_GCM_ghash_block_avx1
.text
.globl	AES_GCM_encrypt_update_avx1
.type	AES_GCM_encrypt_update_avx1,@function
.align	16
AES_GCM_encrypt_update_avx1:
        pushl	%ebx
        pushl	%esi
        pushl	%edi
        pushl	%ebp
        subl	$0x60, %esp
        movl	144(%esp), %esi
        vmovdqa	(%esi), %xmm4
        vmovdqu	%xmm4, 64(%esp)
        movl	136(%esp), %esi
        movl	140(%esp), %ebp
        vmovdqa	(%esi), %xmm6
        vmovdqa	(%ebp), %xmm5
        vmovdqu	%xmm6, 80(%esp)
        movl	116(%esp), %ebp
        movl	124(%esp), %edi
        movl	128(%esp), %esi
        vpsrlq	$63, %xmm5, %xmm1
        vpsllq	$0x01, %xmm5, %xmm0
        vpslldq	$8, %xmm1, %xmm1
        vpor	%xmm1, %xmm0, %xmm0
        vpshufd	$0xff, %xmm5, %xmm5
        vpsrad	$31, %xmm5, %xmm5
        vpand	L_aes_gcm_avx1_mod2_128, %xmm5, %xmm5
        vpxor	%xmm0, %xmm5, %xmm5
        xorl	%ebx, %ebx
        cmpl	$0x40, 132(%esp)
        movl	132(%esp), %eax
        jl	L_AES_GCM_encrypt_update_avx1_done_64
        andl	$0xffffffc0, %eax
        vmovdqa	%xmm6, %xmm2
        # H ^ 1
        vmovdqu	%xmm5, (%esp)
        # H ^ 2
        vpclmulqdq	$0x00, %xmm5, %xmm5, %xmm0
        vpclmulqdq	$0x11, %xmm5, %xmm5, %xmm4
        vpslld	$31, %xmm0, %xmm1
        vpslld	$30, %xmm0, %xmm2
        vpslld	$25, %xmm0, %xmm3
        vpxor	%xmm2, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vpsrldq	$4, %xmm1, %xmm3
        vpslldq	$12, %xmm1, %xmm1
        vpxor	%xmm1, %xmm0, %xmm0
        vpsrld	$0x01, %xmm0, %xmm1
        vpsrld	$2, %xmm0, %xmm2
        vpxor	%xmm2, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpsrld	$7, %xmm0, %xmm0
        vpxor	%xmm3, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm4, %xmm4
        vmovdqu	%xmm4, 16(%esp)
        # H ^ 3
        # ghash_gfmul_red_avx
        vpshufd	$0x4e, %xmm5, %xmm1
        vpshufd	$0x4e, %xmm4, %xmm2
        vpclmulqdq	$0x11, %xmm5, %xmm4, %xmm3
        vpclmulqdq	$0x00, %xmm5, %xmm4, %xmm0
        vpxor	%xmm5, %xmm1, %xmm1
        vpxor	%xmm4, %xmm2, %xmm2
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vpslldq	$8, %xmm1, %xmm2
        vpsrldq	$8, %xmm1, %xmm1
        vpxor	%xmm2, %xmm0, %xmm0
        vpxor	%xmm1, %xmm3, %xmm7
        vpslld	$31, %xmm0, %xmm1
        vpslld	$30, %xmm0, %xmm2
        vpslld	$25, %xmm0, %xmm3
        vpxor	%xmm2, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vpsrldq	$4, %xmm1, %xmm3
        vpslldq	$12, %xmm1, %xmm1
        vpxor	%xmm1, %xmm0, %xmm0
        vpsrld	$0x01, %xmm0, %xmm1
        vpsrld	$2, %xmm0, %xmm2
        vpxor	%xmm2, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpsrld	$7, %xmm0, %xmm0
        vpxor	%xmm3, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm7, %xmm7
        vmovdqu	%xmm7, 32(%esp)
        # H ^ 4
        vpclmulqdq	$0x00, %xmm4, %xmm4, %xmm0
        vpclmulqdq	$0x11, %xmm4, %xmm4, %xmm7
        vpslld	$31, %xmm0, %xmm1
        vpslld	$30, %xmm0, %xmm2
        vpslld	$25, %xmm0, %xmm3
        vpxor	%xmm2, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vpsrldq	$4, %xmm1, %xmm3
        vpslldq	$12, %xmm1, %xmm1
        vpxor	%xmm1, %xmm0, %xmm0
        vpsrld	$0x01, %xmm0, %xmm1
        vpsrld	$2, %xmm0, %xmm2
        vpxor	%xmm2, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpsrld	$7, %xmm0, %xmm0
        vpxor	%xmm3, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm7, %xmm7
        vmovdqu	%xmm7, 48(%esp)
        # First 64 bytes of input
        vmovdqu	64(%esp), %xmm0
        vmovdqa	L_aes_gcm_avx1_bswap_epi64, %xmm7
        vpaddd	L_aes_gcm_avx1_one, %xmm0, %xmm1
        vpshufb	%xmm7, %xmm1, %xmm1
        vpaddd	L_aes_gcm_avx1_two, %xmm0, %xmm2
        vpshufb	%xmm7, %xmm2, %xmm2
        vpaddd	L_aes_gcm_avx1_three, %xmm0, %xmm3
        vpshufb	%xmm7, %xmm3, %xmm3
        vpshufb	%xmm7, %xmm0, %xmm0
        vmovdqu	64(%esp), %xmm7
        vpaddd	L_aes_gcm_avx1_four, %xmm7, %xmm7
        vmovdqu	%xmm7, 64(%esp)
        vmovdqa	(%ebp), %xmm7
        vpxor	%xmm7, %xmm0, %xmm0
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm7, %xmm3, %xmm3
        vmovdqa	16(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	32(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	48(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	64(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	80(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	96(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	112(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	128(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	144(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$11, 120(%esp)
        vmovdqa	160(%ebp), %xmm7
        jl	L_AES_GCM_encrypt_update_avx1_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	176(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$13, 120(%esp)
        vmovdqa	192(%ebp), %xmm7
        jl	L_AES_GCM_encrypt_update_avx1_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	208(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	224(%ebp), %xmm7
L_AES_GCM_encrypt_update_avx1_aesenc_64_enc_done:
        vaesenclast	%xmm7, %xmm0, %xmm0
        vaesenclast	%xmm7, %xmm1, %xmm1
        vmovdqu	(%esi), %xmm4
        vmovdqu	16(%esi), %xmm5
        vpxor	%xmm4, %xmm0, %xmm0
        vpxor	%xmm5, %xmm1, %xmm1
        vmovdqu	%xmm4, (%esi)
        vmovdqu	%xmm5, 16(%esi)
        vmovdqu	%xmm0, (%edi)
        vmovdqu	%xmm1, 16(%edi)
        vaesenclast	%xmm7, %xmm2, %xmm2
        vaesenclast	%xmm7, %xmm3, %xmm3
        vmovdqu	32(%esi), %xmm4
        vmovdqu	48(%esi), %xmm5
        vpxor	%xmm4, %xmm2, %xmm2
        vpxor	%xmm5, %xmm3, %xmm3
        vmovdqu	%xmm4, 32(%esi)
        vmovdqu	%xmm5, 48(%esi)
        vmovdqu	%xmm2, 32(%edi)
        vmovdqu	%xmm3, 48(%edi)
        cmpl	$0x40, %eax
        movl	$0x40, %ebx
        movl	%esi, %ecx
        movl	%edi, %edx
        jle	L_AES_GCM_encrypt_update_avx1_end_64
        # More 64 bytes of input
L_AES_GCM_encrypt_update_avx1_ghash_64:
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        vmovdqu	64(%esp), %xmm0
        vmovdqa	L_aes_gcm_avx1_bswap_epi64, %xmm7
        vpaddd	L_aes_gcm_avx1_one, %xmm0, %xmm1
        vpshufb	%xmm7, %xmm1, %xmm1
        vpaddd	L_aes_gcm_avx1_two, %xmm0, %xmm2
        vpshufb	%xmm7, %xmm2, %xmm2
        vpaddd	L_aes_gcm_avx1_three, %xmm0, %xmm3
        vpshufb	%xmm7, %xmm3, %xmm3
        vpshufb	%xmm7, %xmm0, %xmm0
        vmovdqu	64(%esp), %xmm7
        vpaddd	L_aes_gcm_avx1_four, %xmm7, %xmm7
        vmovdqu	%xmm7, 64(%esp)
        vmovdqa	(%ebp), %xmm7
        vpxor	%xmm7, %xmm0, %xmm0
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm7, %xmm3, %xmm3
        vmovdqa	16(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	32(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	48(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	64(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	80(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	96(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	112(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	128(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	144(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$11, 120(%esp)
        vmovdqa	160(%ebp), %xmm7
        jl	L_AES_GCM_encrypt_update_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	176(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$13, 120(%esp)
        vmovdqa	192(%ebp), %xmm7
        jl	L_AES_GCM_encrypt_update_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	208(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	224(%ebp), %xmm7
L_AES_GCM_encrypt_update_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done:
        vaesenclast	%xmm7, %xmm0, %xmm0
        vaesenclast	%xmm7, %xmm1, %xmm1
        vmovdqu	(%ecx), %xmm4
        vmovdqu	16(%ecx), %xmm5
        vpxor	%xmm4, %xmm0, %xmm0
        vpxor	%xmm5, %xmm1, %xmm1
        vmovdqu	%xmm0, (%edx)
        vmovdqu	%xmm1, 16(%edx)
        vaesenclast	%xmm7, %xmm2, %xmm2
        vaesenclast	%xmm7, %xmm3, %xmm3
        vmovdqu	32(%ecx), %xmm4
        vmovdqu	48(%ecx), %xmm5
        vpxor	%xmm4, %xmm2, %xmm2
        vpxor	%xmm5, %xmm3, %xmm3
        vmovdqu	%xmm2, 32(%edx)
        vmovdqu	%xmm3, 48(%edx)
        # ghash encrypted counter
        vmovdqu	80(%esp), %xmm2
        vmovdqu	48(%esp), %xmm7
        vmovdqu	-64(%edx), %xmm0
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm2, %xmm0, %xmm0
        vpshufd	$0x4e, %xmm7, %xmm1
        vpshufd	$0x4e, %xmm0, %xmm5
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm0, %xmm5, %xmm5
        vpclmulqdq	$0x11, %xmm7, %xmm0, %xmm3
        vpclmulqdq	$0x00, %xmm7, %xmm0, %xmm2
        vpclmulqdq	$0x00, %xmm5, %xmm1, %xmm1
        vpxor	%xmm2, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vmovdqu	32(%esp), %xmm7
        vmovdqu	-48(%edx), %xmm0
        vpshufd	$0x4e, %xmm7, %xmm4
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm7, %xmm4, %xmm4
        vpshufd	$0x4e, %xmm0, %xmm5
        vpxor	%xmm0, %xmm5, %xmm5
        vpclmulqdq	$0x11, %xmm7, %xmm0, %xmm6
        vpclmulqdq	$0x00, %xmm7, %xmm0, %xmm7
        vpclmulqdq	$0x00, %xmm5, %xmm4, %xmm4
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm6, %xmm1, %xmm1
        vpxor	%xmm6, %xmm3, %xmm3
        vpxor	%xmm4, %xmm1, %xmm1
        vmovdqu	16(%esp), %xmm7
        vmovdqu	-32(%edx), %xmm0
        vpshufd	$0x4e, %xmm7, %xmm4
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm7, %xmm4, %xmm4
        vpshufd	$0x4e, %xmm0, %xmm5
        vpxor	%xmm0, %xmm5, %xmm5
        vpclmulqdq	$0x11, %xmm7, %xmm0, %xmm6
        vpclmulqdq	$0x00, %xmm7, %xmm0, %xmm7
        vpclmulqdq	$0x00, %xmm5, %xmm4, %xmm4
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm6, %xmm1, %xmm1
        vpxor	%xmm6, %xmm3, %xmm3
        vpxor	%xmm4, %xmm1, %xmm1
        vmovdqu	(%esp), %xmm7
        vmovdqu	-16(%edx), %xmm0
        vpshufd	$0x4e, %xmm7, %xmm4
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm7, %xmm4, %xmm4
        vpshufd	$0x4e, %xmm0, %xmm5
        vpxor	%xmm0, %xmm5, %xmm5
        vpclmulqdq	$0x11, %xmm7, %xmm0, %xmm6
        vpclmulqdq	$0x00, %xmm7, %xmm0, %xmm7
        vpclmulqdq	$0x00, %xmm5, %xmm4, %xmm4
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm6, %xmm1, %xmm1
        vpxor	%xmm6, %xmm3, %xmm3
        vpxor	%xmm4, %xmm1, %xmm1
        vpslldq	$8, %xmm1, %xmm5
        vpsrldq	$8, %xmm1, %xmm1
        vpxor	%xmm5, %xmm2, %xmm2
        vpxor	%xmm1, %xmm3, %xmm3
        vpslld	$31, %xmm2, %xmm7
        vpslld	$30, %xmm2, %xmm4
        vpslld	$25, %xmm2, %xmm5
        vpxor	%xmm4, %xmm7, %xmm7
        vpxor	%xmm5, %xmm7, %xmm7
        vpsrldq	$4, %xmm7, %xmm4
        vpslldq	$12, %xmm7, %xmm7
        vpxor	%xmm7, %xmm2, %xmm2
        vpsrld	$0x01, %xmm2, %xmm5
        vpsrld	$2, %xmm2, %xmm1
        vpsrld	$7, %xmm2, %xmm0
        vpxor	%xmm1, %xmm5, %xmm5
        vpxor	%xmm0, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm5, %xmm2, %xmm2
        vpxor	%xmm3, %xmm2, %xmm2
        vmovdqu	%xmm2, 80(%esp)
        addl	$0x40, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_encrypt_update_avx1_ghash_64
L_AES_GCM_encrypt_update_avx1_end_64:
        movdqu	80(%esp), %xmm6
        # Block 1
        vmovdqa	L_aes_gcm_avx1_bswap_mask, %xmm0
        vmovdqu	(%edx), %xmm5
        pshufb	%xmm0, %xmm5
        vmovdqu	48(%esp), %xmm7
        pxor	%xmm6, %xmm5
        # ghash_gfmul_avx
        vpshufd	$0x4e, %xmm5, %xmm1
        vpshufd	$0x4e, %xmm7, %xmm2
        vpclmulqdq	$0x11, %xmm5, %xmm7, %xmm3
        vpclmulqdq	$0x00, %xmm5, %xmm7, %xmm0
        vpxor	%xmm5, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vmovdqa	%xmm0, %xmm4
        vmovdqa	%xmm3, %xmm6
        vpslldq	$8, %xmm1, %xmm2
        vpsrldq	$8, %xmm1, %xmm1
        vpxor	%xmm2, %xmm4, %xmm4
        vpxor	%xmm1, %xmm6, %xmm6
        # Block 2
        vmovdqa	L_aes_gcm_avx1_bswap_mask, %xmm0
        vmovdqu	16(%edx), %xmm5
        pshufb	%xmm0, %xmm5
        vmovdqu	32(%esp), %xmm7
        # ghash_gfmul_xor_avx
        vpshufd	$0x4e, %xmm5, %xmm1
        vpshufd	$0x4e, %xmm7, %xmm2
        vpclmulqdq	$0x11, %xmm5, %xmm7, %xmm3
        vpclmulqdq	$0x00, %xmm5, %xmm7, %xmm0
        vpxor	%xmm5, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vpxor	%xmm0, %xmm4, %xmm4
        vpxor	%xmm3, %xmm6, %xmm6
        vpslldq	$8, %xmm1, %xmm2
        vpsrldq	$8, %xmm1, %xmm1
        vpxor	%xmm2, %xmm4, %xmm4
        vpxor	%xmm1, %xmm6, %xmm6
        # Block 3
        vmovdqa	L_aes_gcm_avx1_bswap_mask, %xmm0
        vmovdqu	32(%edx), %xmm5
        pshufb	%xmm0, %xmm5
        vmovdqu	16(%esp), %xmm7
        # ghash_gfmul_xor_avx
        vpshufd	$0x4e, %xmm5, %xmm1
        vpshufd	$0x4e, %xmm7, %xmm2
        vpclmulqdq	$0x11, %xmm5, %xmm7, %xmm3
        vpclmulqdq	$0x00, %xmm5, %xmm7, %xmm0
        vpxor	%xmm5, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vpxor	%xmm0, %xmm4, %xmm4
        vpxor	%xmm3, %xmm6, %xmm6
        vpslldq	$8, %xmm1, %xmm2
        vpsrldq	$8, %xmm1, %xmm1
        vpxor	%xmm2, %xmm4, %xmm4
        vpxor	%xmm1, %xmm6, %xmm6
        # Block 4
        vmovdqa	L_aes_gcm_avx1_bswap_mask, %xmm0
        vmovdqu	48(%edx), %xmm5
        pshufb	%xmm0, %xmm5
        vmovdqu	(%esp), %xmm7
        # ghash_gfmul_xor_avx
        vpshufd	$0x4e, %xmm5, %xmm1
        vpshufd	$0x4e, %xmm7, %xmm2
        vpclmulqdq	$0x11, %xmm5, %xmm7, %xmm3
        vpclmulqdq	$0x00, %xmm5, %xmm7, %xmm0
        vpxor	%xmm5, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vpxor	%xmm0, %xmm4, %xmm4
        vpxor	%xmm3, %xmm6, %xmm6
        vpslldq	$8, %xmm1, %xmm2
        vpsrldq	$8, %xmm1, %xmm1
        vpxor	%xmm2, %xmm4, %xmm4
        vpxor	%xmm1, %xmm6, %xmm6
        vpslld	$31, %xmm4, %xmm0
        vpslld	$30, %xmm4, %xmm1
        vpslld	$25, %xmm4, %xmm2
        vpxor	%xmm1, %xmm0, %xmm0
        vpxor	%xmm2, %xmm0, %xmm0
        vmovdqa	%xmm0, %xmm1
        vpsrldq	$4, %xmm1, %xmm1
        vpslldq	$12, %xmm0, %xmm0
        vpxor	%xmm0, %xmm4, %xmm4
        vpsrld	$0x01, %xmm4, %xmm2
        vpsrld	$2, %xmm4, %xmm3
        vpsrld	$7, %xmm4, %xmm0
        vpxor	%xmm3, %xmm2, %xmm2
        vpxor	%xmm0, %xmm2, %xmm2
        vpxor	%xmm1, %xmm2, %xmm2
        vpxor	%xmm4, %xmm2, %xmm2
        vpxor	%xmm2, %xmm6, %xmm6
        vmovdqu	(%esp), %xmm5
L_AES_GCM_encrypt_update_avx1_done_64:
        movl	132(%esp), %edx
        cmpl	%edx, %ebx
        jge	L_AES_GCM_encrypt_update_avx1_done_enc
        movl	132(%esp), %eax
        andl	$0xfffffff0, %eax
        cmpl	%eax, %ebx
        jge	L_AES_GCM_encrypt_update_avx1_last_block_done
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        vmovdqu	64(%esp), %xmm1
        vpshufb	L_aes_gcm_avx1_bswap_epi64, %xmm1, %xmm0
        vpaddd	L_aes_gcm_avx1_one, %xmm1, %xmm1
        vmovdqu	%xmm1, 64(%esp)
        vpxor	(%ebp), %xmm0, %xmm0
        vaesenc	16(%ebp), %xmm0, %xmm0
        vaesenc	32(%ebp), %xmm0, %xmm0
        vaesenc	48(%ebp), %xmm0, %xmm0
        vaesenc	64(%ebp), %xmm0, %xmm0
        vaesenc	80(%ebp), %xmm0, %xmm0
        vaesenc	96(%ebp), %xmm0, %xmm0
        vaesenc	112(%ebp), %xmm0, %xmm0
        vaesenc	128(%ebp), %xmm0, %xmm0
        vaesenc	144(%ebp), %xmm0, %xmm0
        cmpl	$11, 120(%esp)
        vmovdqa	160(%ebp), %xmm1
        jl	L_AES_GCM_encrypt_update_avx1_aesenc_block_aesenc_avx_last
        vaesenc	%xmm1, %xmm0, %xmm0
        vaesenc	176(%ebp), %xmm0, %xmm0
        cmpl	$13, 120(%esp)
        vmovdqa	192(%ebp), %xmm1
        jl	L_AES_GCM_encrypt_update_avx1_aesenc_block_aesenc_avx_last
        vaesenc	%xmm1, %xmm0, %xmm0
        vaesenc	208(%ebp), %xmm0, %xmm0
        vmovdqa	224(%ebp), %xmm1
L_AES_GCM_encrypt_update_avx1_aesenc_block_aesenc_avx_last:
        vaesenclast	%xmm1, %xmm0, %xmm0
        vmovdqu	(%ecx), %xmm1
        vpxor	%xmm1, %xmm0, %xmm0
        vmovdqu	%xmm0, (%edx)
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm0, %xmm6, %xmm6
        addl	$16, %ebx
        cmpl	%eax, %ebx
        jge	L_AES_GCM_encrypt_update_avx1_last_block_ghash
L_AES_GCM_encrypt_update_avx1_last_block_start:
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        vmovdqu	64(%esp), %xmm1
        vmovdqu	%xmm6, %xmm3
        vpshufb	L_aes_gcm_avx1_bswap_epi64, %xmm1, %xmm0
        vpaddd	L_aes_gcm_avx1_one, %xmm1, %xmm1
        vmovdqu	%xmm1, 64(%esp)
        vpxor	(%ebp), %xmm0, %xmm0
        vpclmulqdq	$16, %xmm5, %xmm3, %xmm4
        vaesenc	16(%ebp), %xmm0, %xmm0
        vaesenc	32(%ebp), %xmm0, %xmm0
        vpclmulqdq	$0x01, %xmm5, %xmm3, %xmm7
        vaesenc	48(%ebp), %xmm0, %xmm0
        vaesenc	64(%ebp), %xmm0, %xmm0
        vaesenc	80(%ebp), %xmm0, %xmm0
        vpclmulqdq	$0x11, %xmm5, %xmm3, %xmm1
        vaesenc	96(%ebp), %xmm0, %xmm0
        vpxor	%xmm7, %xmm4, %xmm4
        vpslldq	$8, %xmm4, %xmm2
        vpsrldq	$8, %xmm4, %xmm4
        vaesenc	112(%ebp), %xmm0, %xmm0
        vpclmulqdq	$0x00, %xmm5, %xmm3, %xmm7
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm4, %xmm1, %xmm1
        vmovdqa	L_aes_gcm_avx1_mod2_128, %xmm3
        vpclmulqdq	$16, %xmm3, %xmm2, %xmm7
        vaesenc	128(%ebp), %xmm0, %xmm0
        vpshufd	$0x4e, %xmm2, %xmm4
        vpxor	%xmm7, %xmm4, %xmm4
        vpclmulqdq	$16, %xmm3, %xmm4, %xmm7
        vaesenc	144(%ebp), %xmm0, %xmm0
        vpshufd	$0x4e, %xmm4, %xmm6
        vpxor	%xmm7, %xmm6, %xmm6
        vpxor	%xmm1, %xmm6, %xmm6
        cmpl	$11, 120(%esp)
        vmovdqa	160(%ebp), %xmm1
        jl	L_AES_GCM_encrypt_update_avx1_aesenc_gfmul_last
        vaesenc	%xmm1, %xmm0, %xmm0
        vaesenc	176(%ebp), %xmm0, %xmm0
        cmpl	$13, 120(%esp)
        vmovdqa	192(%ebp), %xmm1
        jl	L_AES_GCM_encrypt_update_avx1_aesenc_gfmul_last
        vaesenc	%xmm1, %xmm0, %xmm0
        vaesenc	208(%ebp), %xmm0, %xmm0
        vmovdqa	224(%ebp), %xmm1
L_AES_GCM_encrypt_update_avx1_aesenc_gfmul_last:
        vaesenclast	%xmm1, %xmm0, %xmm0
        vmovdqu	(%ecx), %xmm1
        vpxor	%xmm1, %xmm0, %xmm0
        vmovdqu	%xmm0, (%edx)
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
        addl	$16, %ebx
        vpxor	%xmm0, %xmm6, %xmm6
        cmpl	%eax, %ebx
        jl	L_AES_GCM_encrypt_update_avx1_last_block_start
L_AES_GCM_encrypt_update_avx1_last_block_ghash:
        # ghash_gfmul_red_avx
        vpshufd	$0x4e, %xmm5, %xmm1
        vpshufd	$0x4e, %xmm6, %xmm2
        vpclmulqdq	$0x11, %xmm5, %xmm6, %xmm3
        vpclmulqdq	$0x00, %xmm5, %xmm6, %xmm0
        vpxor	%xmm5, %xmm1, %xmm1
        vpxor	%xmm6, %xmm2, %xmm2
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vpslldq	$8, %xmm1, %xmm2
        vpsrldq	$8, %xmm1, %xmm1
        vpxor	%xmm2, %xmm0, %xmm0
        vpxor	%xmm1, %xmm3, %xmm6
        vpslld	$31, %xmm0, %xmm1
        vpslld	$30, %xmm0, %xmm2
        vpslld	$25, %xmm0, %xmm3
        vpxor	%xmm2, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vpsrldq	$4, %xmm1, %xmm3
        vpslldq	$12, %xmm1, %xmm1
        vpxor	%xmm1, %xmm0, %xmm0
        vpsrld	$0x01, %xmm0, %xmm1
        vpsrld	$2, %xmm0, %xmm2
        vpxor	%xmm2, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpsrld	$7, %xmm0, %xmm0
        vpxor	%xmm3, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm6, %xmm6
L_AES_GCM_encrypt_update_avx1_last_block_done:
L_AES_GCM_encrypt_update_avx1_done_enc:
        movl	136(%esp), %esi
        movl	144(%esp), %edi
        vmovdqu	64(%esp), %xmm4
        vmovdqa	%xmm6, (%esi)
        vmovdqu	%xmm4, (%edi)
        addl	$0x60, %esp
        popl	%ebp
        popl	%edi
        popl	%esi
        popl	%ebx
        ret
.size	AES_GCM_encrypt_update_avx1,.-AES_GCM_encrypt_update_avx1
.text
.globl	AES_GCM_encrypt_final_avx1
.type	AES_GCM_encrypt_final_avx1,@function
.align	16
AES_GCM_encrypt_final_avx1:
        pushl	%esi
        pushl	%edi
        pushl	%ebp
        subl	$16, %esp
        movl	32(%esp), %ebp
        movl	52(%esp), %esi
        movl	56(%esp), %edi
        vmovdqa	(%ebp), %xmm4
        vmovdqa	(%esi), %xmm5
        vmovdqa	(%edi), %xmm6
        vpsrlq	$63, %xmm5, %xmm1
        vpsllq	$0x01, %xmm5, %xmm0
        vpslldq	$8, %xmm1, %xmm1
        vpor	%xmm1, %xmm0, %xmm0
        vpshufd	$0xff, %xmm5, %xmm5
        vpsrad	$31, %xmm5, %xmm5
        vpand	L_aes_gcm_avx1_mod2_128, %xmm5, %xmm5
        vpxor	%xmm0, %xmm5, %xmm5
        movl	44(%esp), %edx
        movl	48(%esp), %ecx
        shll	$3, %edx
        shll	$3, %ecx
        vpinsrd	$0x00, %edx, %xmm0, %xmm0
        vpinsrd	$2, %ecx, %xmm0, %xmm0
        movl	44(%esp), %edx
        movl	48(%esp), %ecx
        shrl	$29, %edx
        shrl	$29, %ecx
        vpinsrd	$0x01, %edx, %xmm0, %xmm0
        vpinsrd	$3, %ecx, %xmm0, %xmm0
        vpxor	%xmm0, %xmm4, %xmm4
        # ghash_gfmul_red_avx
        vpshufd	$0x4e, %xmm5, %xmm1
        vpshufd	$0x4e, %xmm4, %xmm2
        vpclmulqdq	$0x11, %xmm5, %xmm4, %xmm3
        vpclmulqdq	$0x00, %xmm5, %xmm4, %xmm0
        vpxor	%xmm5, %xmm1, %xmm1
        vpxor	%xmm4, %xmm2, %xmm2
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vpslldq	$8, %xmm1, %xmm2
        vpsrldq	$8, %xmm1, %xmm1
        vpxor	%xmm2, %xmm0, %xmm0
        vpxor	%xmm1, %xmm3, %xmm4
        vpslld	$31, %xmm0, %xmm1
        vpslld	$30, %xmm0, %xmm2
        vpslld	$25, %xmm0, %xmm3
        vpxor	%xmm2, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vpsrldq	$4, %xmm1, %xmm3
        vpslldq	$12, %xmm1, %xmm1
        vpxor	%xmm1, %xmm0, %xmm0
        vpsrld	$0x01, %xmm0, %xmm1
        vpsrld	$2, %xmm0, %xmm2
        vpxor	%xmm2, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpsrld	$7, %xmm0, %xmm0
        vpxor	%xmm3, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm4, %xmm4
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm6, %xmm4, %xmm0
        movl	36(%esp), %edi
        cmpl	$16, 40(%esp)
        je	L_AES_GCM_encrypt_final_avx1_store_tag_16
        xorl	%ecx, %ecx
        vmovdqu	%xmm0, (%esp)
L_AES_GCM_encrypt_final_avx1_store_tag_loop:
        movzbl	(%esp,%ecx,1), %eax
        movb	%al, (%edi,%ecx,1)
        incl	%ecx
        cmpl	40(%esp), %ecx
        jne	L_AES_GCM_encrypt_final_avx1_store_tag_loop
        jmp	L_AES_GCM_encrypt_final_avx1_store_tag_done
L_AES_GCM_encrypt_final_avx1_store_tag_16:
        vmovdqu	%xmm0, (%edi)
L_AES_GCM_encrypt_final_avx1_store_tag_done:
        addl	$16, %esp
        popl	%ebp
        popl	%edi
        popl	%esi
        ret
.size	AES_GCM_encrypt_final_avx1,.-AES_GCM_encrypt_final_avx1
.text
.globl	AES_GCM_decrypt_update_avx1
.type	AES_GCM_decrypt_update_avx1,@function
.align	16
AES_GCM_decrypt_update_avx1:
        pushl	%ebx
        pushl	%esi
        pushl	%edi
        pushl	%ebp
        subl	$0xa0, %esp
        movl	208(%esp), %esi
        vmovdqa	(%esi), %xmm4
        vmovdqu	%xmm4, 64(%esp)
        movl	200(%esp), %esi
        movl	204(%esp), %ebp
        vmovdqa	(%esi), %xmm6
        vmovdqa	(%ebp), %xmm5
        vmovdqu	%xmm6, 80(%esp)
        movl	180(%esp), %ebp
        movl	188(%esp), %edi
        movl	192(%esp), %esi
        vpsrlq	$63, %xmm5, %xmm1
        vpsllq	$0x01, %xmm5, %xmm0
        vpslldq	$8, %xmm1, %xmm1
        vpor	%xmm1, %xmm0, %xmm0
        vpshufd	$0xff, %xmm5, %xmm5
        vpsrad	$31, %xmm5, %xmm5
        vpand	L_aes_gcm_avx1_mod2_128, %xmm5, %xmm5
        vpxor	%xmm0, %xmm5, %xmm5
        xorl	%ebx, %ebx
        cmpl	$0x40, 196(%esp)
        movl	196(%esp), %eax
        jl	L_AES_GCM_decrypt_update_avx1_done_64
        andl	$0xffffffc0, %eax
        vmovdqa	%xmm6, %xmm2
        # H ^ 1
        vmovdqu	%xmm5, (%esp)
        # H ^ 2
        vpclmulqdq	$0x00, %xmm5, %xmm5, %xmm0
        vpclmulqdq	$0x11, %xmm5, %xmm5, %xmm4
        vpslld	$31, %xmm0, %xmm1
        vpslld	$30, %xmm0, %xmm2
        vpslld	$25, %xmm0, %xmm3
        vpxor	%xmm2, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vpsrldq	$4, %xmm1, %xmm3
        vpslldq	$12, %xmm1, %xmm1
        vpxor	%xmm1, %xmm0, %xmm0
        vpsrld	$0x01, %xmm0, %xmm1
        vpsrld	$2, %xmm0, %xmm2
        vpxor	%xmm2, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpsrld	$7, %xmm0, %xmm0
        vpxor	%xmm3, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm4, %xmm4
        vmovdqu	%xmm4, 16(%esp)
        # H ^ 3
        # ghash_gfmul_red_avx
        vpshufd	$0x4e, %xmm5, %xmm1
        vpshufd	$0x4e, %xmm4, %xmm2
        vpclmulqdq	$0x11, %xmm5, %xmm4, %xmm3
        vpclmulqdq	$0x00, %xmm5, %xmm4, %xmm0
        vpxor	%xmm5, %xmm1, %xmm1
        vpxor	%xmm4, %xmm2, %xmm2
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vpslldq	$8, %xmm1, %xmm2
        vpsrldq	$8, %xmm1, %xmm1
        vpxor	%xmm2, %xmm0, %xmm0
        vpxor	%xmm1, %xmm3, %xmm7
        vpslld	$31, %xmm0, %xmm1
        vpslld	$30, %xmm0, %xmm2
        vpslld	$25, %xmm0, %xmm3
        vpxor	%xmm2, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vpsrldq	$4, %xmm1, %xmm3
        vpslldq	$12, %xmm1, %xmm1
        vpxor	%xmm1, %xmm0, %xmm0
        vpsrld	$0x01, %xmm0, %xmm1
        vpsrld	$2, %xmm0, %xmm2
        vpxor	%xmm2, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpsrld	$7, %xmm0, %xmm0
        vpxor	%xmm3, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm7, %xmm7
        vmovdqu	%xmm7, 32(%esp)
        # H ^ 4
        vpclmulqdq	$0x00, %xmm4, %xmm4, %xmm0
        vpclmulqdq	$0x11, %xmm4, %xmm4, %xmm7
        vpslld	$31, %xmm0, %xmm1
        vpslld	$30, %xmm0, %xmm2
        vpslld	$25, %xmm0, %xmm3
        vpxor	%xmm2, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vpsrldq	$4, %xmm1, %xmm3
        vpslldq	$12, %xmm1, %xmm1
        vpxor	%xmm1, %xmm0, %xmm0
        vpsrld	$0x01, %xmm0, %xmm1
        vpsrld	$2, %xmm0, %xmm2
        vpxor	%xmm2, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpsrld	$7, %xmm0, %xmm0
        vpxor	%xmm3, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm7, %xmm7
        vmovdqu	%xmm7, 48(%esp)
        cmpl	%esi, %edi
        jne	L_AES_GCM_decrypt_update_avx1_ghash_64
L_AES_GCM_decrypt_update_avx1_ghash_64_inplace:
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        vmovdqu	64(%esp), %xmm0
        vmovdqa	L_aes_gcm_avx1_bswap_epi64, %xmm7
        vpaddd	L_aes_gcm_avx1_one, %xmm0, %xmm1
        vpshufb	%xmm7, %xmm1, %xmm1
        vpaddd	L_aes_gcm_avx1_two, %xmm0, %xmm2
        vpshufb	%xmm7, %xmm2, %xmm2
        vpaddd	L_aes_gcm_avx1_three, %xmm0, %xmm3
        vpshufb	%xmm7, %xmm3, %xmm3
        vpshufb	%xmm7, %xmm0, %xmm0
        vmovdqu	64(%esp), %xmm7
        vpaddd	L_aes_gcm_avx1_four, %xmm7, %xmm7
        vmovdqu	%xmm7, 64(%esp)
        vmovdqa	(%ebp), %xmm7
        vpxor	%xmm7, %xmm0, %xmm0
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm7, %xmm3, %xmm3
        vmovdqa	16(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	32(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	48(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	64(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	80(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	96(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	112(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	128(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	144(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$11, 184(%esp)
        vmovdqa	160(%ebp), %xmm7
        jl	L_AES_GCM_decrypt_update_avx1inplace_aesenc_64_ghash_avx_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	176(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$13, 184(%esp)
        vmovdqa	192(%ebp), %xmm7
        jl	L_AES_GCM_decrypt_update_avx1inplace_aesenc_64_ghash_avx_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	208(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	224(%ebp), %xmm7
L_AES_GCM_decrypt_update_avx1inplace_aesenc_64_ghash_avx_aesenc_64_enc_done:
        vaesenclast	%xmm7, %xmm0, %xmm0
        vaesenclast	%xmm7, %xmm1, %xmm1
        vmovdqu	(%ecx), %xmm4
        vmovdqu	16(%ecx), %xmm5
        vpxor	%xmm4, %xmm0, %xmm0
        vpxor	%xmm5, %xmm1, %xmm1
        vmovdqu	%xmm4, 96(%esp)
        vmovdqu	%xmm5, 112(%esp)
        vmovdqu	%xmm0, (%edx)
        vmovdqu	%xmm1, 16(%edx)
        vaesenclast	%xmm7, %xmm2, %xmm2
        vaesenclast	%xmm7, %xmm3, %xmm3
        vmovdqu	32(%ecx), %xmm4
        vmovdqu	48(%ecx), %xmm5
        vpxor	%xmm4, %xmm2, %xmm2
        vpxor	%xmm5, %xmm3, %xmm3
        vmovdqu	%xmm4, 128(%esp)
        vmovdqu	%xmm5, 144(%esp)
        vmovdqu	%xmm2, 32(%edx)
        vmovdqu	%xmm3, 48(%edx)
        # ghash encrypted counter
        vmovdqu	80(%esp), %xmm2
        vmovdqu	48(%esp), %xmm7
        vmovdqu	96(%esp), %xmm0
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm2, %xmm0, %xmm0
        vpshufd	$0x4e, %xmm7, %xmm1
        vpshufd	$0x4e, %xmm0, %xmm5
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm0, %xmm5, %xmm5
        vpclmulqdq	$0x11, %xmm7, %xmm0, %xmm3
        vpclmulqdq	$0x00, %xmm7, %xmm0, %xmm2
        vpclmulqdq	$0x00, %xmm5, %xmm1, %xmm1
        vpxor	%xmm2, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vmovdqu	32(%esp), %xmm7
        vmovdqu	112(%esp), %xmm0
        vpshufd	$0x4e, %xmm7, %xmm4
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm7, %xmm4, %xmm4
        vpshufd	$0x4e, %xmm0, %xmm5
        vpxor	%xmm0, %xmm5, %xmm5
        vpclmulqdq	$0x11, %xmm7, %xmm0, %xmm6
        vpclmulqdq	$0x00, %xmm7, %xmm0, %xmm7
        vpclmulqdq	$0x00, %xmm5, %xmm4, %xmm4
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm6, %xmm1, %xmm1
        vpxor	%xmm6, %xmm3, %xmm3
        vpxor	%xmm4, %xmm1, %xmm1
        vmovdqu	16(%esp), %xmm7
        vmovdqu	128(%esp), %xmm0
        vpshufd	$0x4e, %xmm7, %xmm4
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm7, %xmm4, %xmm4
        vpshufd	$0x4e, %xmm0, %xmm5
        vpxor	%xmm0, %xmm5, %xmm5
        vpclmulqdq	$0x11, %xmm7, %xmm0, %xmm6
        vpclmulqdq	$0x00, %xmm7, %xmm0, %xmm7
        vpclmulqdq	$0x00, %xmm5, %xmm4, %xmm4
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm6, %xmm1, %xmm1
        vpxor	%xmm6, %xmm3, %xmm3
        vpxor	%xmm4, %xmm1, %xmm1
        vmovdqu	(%esp), %xmm7
        vmovdqu	144(%esp), %xmm0
        vpshufd	$0x4e, %xmm7, %xmm4
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm7, %xmm4, %xmm4
        vpshufd	$0x4e, %xmm0, %xmm5
        vpxor	%xmm0, %xmm5, %xmm5
        vpclmulqdq	$0x11, %xmm7, %xmm0, %xmm6
        vpclmulqdq	$0x00, %xmm7, %xmm0, %xmm7
        vpclmulqdq	$0x00, %xmm5, %xmm4, %xmm4
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm6, %xmm1, %xmm1
        vpxor	%xmm6, %xmm3, %xmm3
        vpxor	%xmm4, %xmm1, %xmm1
        vpslldq	$8, %xmm1, %xmm5
        vpsrldq	$8, %xmm1, %xmm1
        vpxor	%xmm5, %xmm2, %xmm2
        vpxor	%xmm1, %xmm3, %xmm3
        vpslld	$31, %xmm2, %xmm7
        vpslld	$30, %xmm2, %xmm4
        vpslld	$25, %xmm2, %xmm5
        vpxor	%xmm4, %xmm7, %xmm7
        vpxor	%xmm5, %xmm7, %xmm7
        vpsrldq	$4, %xmm7, %xmm4
        vpslldq	$12, %xmm7, %xmm7
        vpxor	%xmm7, %xmm2, %xmm2
        vpsrld	$0x01, %xmm2, %xmm5
        vpsrld	$2, %xmm2, %xmm1
        vpsrld	$7, %xmm2, %xmm0
        vpxor	%xmm1, %xmm5, %xmm5
        vpxor	%xmm0, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm5, %xmm2, %xmm2
        vpxor	%xmm3, %xmm2, %xmm2
        vmovdqu	%xmm2, 80(%esp)
        addl	$0x40, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_decrypt_update_avx1_ghash_64_inplace
        jmp	L_AES_GCM_decrypt_update_avx1_ghash_64_done
L_AES_GCM_decrypt_update_avx1_ghash_64:
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        vmovdqu	64(%esp), %xmm0
        vmovdqa	L_aes_gcm_avx1_bswap_epi64, %xmm7
        vpaddd	L_aes_gcm_avx1_one, %xmm0, %xmm1
        vpshufb	%xmm7, %xmm1, %xmm1
        vpaddd	L_aes_gcm_avx1_two, %xmm0, %xmm2
        vpshufb	%xmm7, %xmm2, %xmm2
        vpaddd	L_aes_gcm_avx1_three, %xmm0, %xmm3
        vpshufb	%xmm7, %xmm3, %xmm3
        vpshufb	%xmm7, %xmm0, %xmm0
        vmovdqu	64(%esp), %xmm7
        vpaddd	L_aes_gcm_avx1_four, %xmm7, %xmm7
        vmovdqu	%xmm7, 64(%esp)
        vmovdqa	(%ebp), %xmm7
        vpxor	%xmm7, %xmm0, %xmm0
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm7, %xmm3, %xmm3
        vmovdqa	16(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	32(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	48(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	64(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	80(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	96(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	112(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	128(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	144(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$11, 184(%esp)
        vmovdqa	160(%ebp), %xmm7
        jl	L_AES_GCM_decrypt_update_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	176(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$13, 184(%esp)
        vmovdqa	192(%ebp), %xmm7
        jl	L_AES_GCM_decrypt_update_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	208(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqa	224(%ebp), %xmm7
L_AES_GCM_decrypt_update_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done:
        vaesenclast	%xmm7, %xmm0, %xmm0
        vaesenclast	%xmm7, %xmm1, %xmm1
        vmovdqu	(%ecx), %xmm4
        vmovdqu	16(%ecx), %xmm5
        vpxor	%xmm4, %xmm0, %xmm0
        vpxor	%xmm5, %xmm1, %xmm1
        vmovdqu	%xmm4, (%ecx)
        vmovdqu	%xmm5, 16(%ecx)
        vmovdqu	%xmm0, (%edx)
        vmovdqu	%xmm1, 16(%edx)
        vaesenclast	%xmm7, %xmm2, %xmm2
        vaesenclast	%xmm7, %xmm3, %xmm3
        vmovdqu	32(%ecx), %xmm4
        vmovdqu	48(%ecx), %xmm5
        vpxor	%xmm4, %xmm2, %xmm2
        vpxor	%xmm5, %xmm3, %xmm3
        vmovdqu	%xmm4, 32(%ecx)
        vmovdqu	%xmm5, 48(%ecx)
        vmovdqu	%xmm2, 32(%edx)
        vmovdqu	%xmm3, 48(%edx)
        # ghash encrypted counter
        vmovdqu	80(%esp), %xmm2
        vmovdqu	48(%esp), %xmm7
        vmovdqu	(%ecx), %xmm0
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm2, %xmm0, %xmm0
        vpshufd	$0x4e, %xmm7, %xmm1
        vpshufd	$0x4e, %xmm0, %xmm5
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm0, %xmm5, %xmm5
        vpclmulqdq	$0x11, %xmm7, %xmm0, %xmm3
        vpclmulqdq	$0x00, %xmm7, %xmm0, %xmm2
        vpclmulqdq	$0x00, %xmm5, %xmm1, %xmm1
        vpxor	%xmm2, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vmovdqu	32(%esp), %xmm7
        vmovdqu	16(%ecx), %xmm0
        vpshufd	$0x4e, %xmm7, %xmm4
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm7, %xmm4, %xmm4
        vpshufd	$0x4e, %xmm0, %xmm5
        vpxor	%xmm0, %xmm5, %xmm5
        vpclmulqdq	$0x11, %xmm7, %xmm0, %xmm6
        vpclmulqdq	$0x00, %xmm7, %xmm0, %xmm7
        vpclmulqdq	$0x00, %xmm5, %xmm4, %xmm4
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm6, %xmm1, %xmm1
        vpxor	%xmm6, %xmm3, %xmm3
        vpxor	%xmm4, %xmm1, %xmm1
        vmovdqu	16(%esp), %xmm7
        vmovdqu	32(%ecx), %xmm0
        vpshufd	$0x4e, %xmm7, %xmm4
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm7, %xmm4, %xmm4
        vpshufd	$0x4e, %xmm0, %xmm5
        vpxor	%xmm0, %xmm5, %xmm5
        vpclmulqdq	$0x11, %xmm7, %xmm0, %xmm6
        vpclmulqdq	$0x00, %xmm7, %xmm0, %xmm7
        vpclmulqdq	$0x00, %xmm5, %xmm4, %xmm4
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm6, %xmm1, %xmm1
        vpxor	%xmm6, %xmm3, %xmm3
        vpxor	%xmm4, %xmm1, %xmm1
        vmovdqu	(%esp), %xmm7
        vmovdqu	48(%ecx), %xmm0
        vpshufd	$0x4e, %xmm7, %xmm4
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm7, %xmm4, %xmm4
        vpshufd	$0x4e, %xmm0, %xmm5
        vpxor	%xmm0, %xmm5, %xmm5
        vpclmulqdq	$0x11, %xmm7, %xmm0, %xmm6
        vpclmulqdq	$0x00, %xmm7, %xmm0, %xmm7
        vpclmulqdq	$0x00, %xmm5, %xmm4, %xmm4
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm6, %xmm1, %xmm1
        vpxor	%xmm6, %xmm3, %xmm3
        vpxor	%xmm4, %xmm1, %xmm1
        vpslldq	$8, %xmm1, %xmm5
        vpsrldq	$8, %xmm1, %xmm1
        vpxor	%xmm5, %xmm2, %xmm2
        vpxor	%xmm1, %xmm3, %xmm3
        vpslld	$31, %xmm2, %xmm7
        vpslld	$30, %xmm2, %xmm4
        vpslld	$25, %xmm2, %xmm5
        vpxor	%xmm4, %xmm7, %xmm7
        vpxor	%xmm5, %xmm7, %xmm7
        vpsrldq	$4, %xmm7, %xmm4
        vpslldq	$12, %xmm7, %xmm7
        vpxor	%xmm7, %xmm2, %xmm2
        vpsrld	$0x01, %xmm2, %xmm5
        vpsrld	$2, %xmm2, %xmm1
        vpsrld	$7, %xmm2, %xmm0
        vpxor	%xmm1, %xmm5, %xmm5
        vpxor	%xmm0, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm5, %xmm2, %xmm2
        vpxor	%xmm3, %xmm2, %xmm2
        vmovdqu	%xmm2, 80(%esp)
        addl	$0x40, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_decrypt_update_avx1_ghash_64
L_AES_GCM_decrypt_update_avx1_ghash_64_done:
        vmovdqa	%xmm2, %xmm6
        vmovdqu	(%esp), %xmm5
L_AES_GCM_decrypt_update_avx1_done_64:
        movl	196(%esp), %edx
        cmpl	%edx, %ebx
        jge	L_AES_GCM_decrypt_update_avx1_done_dec
        movl	196(%esp), %eax
        andl	$0xfffffff0, %eax
        cmpl	%eax, %ebx
        jge	L_AES_GCM_decrypt_update_avx1_last_block_done
L_AES_GCM_decrypt_update_avx1_last_block_start:
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        vmovdqu	(%ecx), %xmm1
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm1, %xmm1
        vpxor	%xmm6, %xmm1, %xmm1
        vmovdqu	%xmm1, (%esp)
        vmovdqu	64(%esp), %xmm1
        vmovdqu	(%esp), %xmm3
        vpshufb	L_aes_gcm_avx1_bswap_epi64, %xmm1, %xmm0
        vpaddd	L_aes_gcm_avx1_one, %xmm1, %xmm1
        vmovdqu	%xmm1, 64(%esp)
        vpxor	(%ebp), %xmm0, %xmm0
        vpclmulqdq	$16, %xmm5, %xmm3, %xmm4
        vaesenc	16(%ebp), %xmm0, %xmm0
        vaesenc	32(%ebp), %xmm0, %xmm0
        vpclmulqdq	$0x01, %xmm5, %xmm3, %xmm7
        vaesenc	48(%ebp), %xmm0, %xmm0
        vaesenc	64(%ebp), %xmm0, %xmm0
        vaesenc	80(%ebp), %xmm0, %xmm0
        vpclmulqdq	$0x11, %xmm5, %xmm3, %xmm1
        vaesenc	96(%ebp), %xmm0, %xmm0
        vpxor	%xmm7, %xmm4, %xmm4
        vpslldq	$8, %xmm4, %xmm2
        vpsrldq	$8, %xmm4, %xmm4
        vaesenc	112(%ebp), %xmm0, %xmm0
        vpclmulqdq	$0x00, %xmm5, %xmm3, %xmm7
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm4, %xmm1, %xmm1
        vmovdqa	L_aes_gcm_avx1_mod2_128, %xmm3
        vpclmulqdq	$16, %xmm3, %xmm2, %xmm7
        vaesenc	128(%ebp), %xmm0, %xmm0
        vpshufd	$0x4e, %xmm2, %xmm4
        vpxor	%xmm7, %xmm4, %xmm4
        vpclmulqdq	$16, %xmm3, %xmm4, %xmm7
        vaesenc	144(%ebp), %xmm0, %xmm0
        vpshufd	$0x4e, %xmm4, %xmm6
        vpxor	%xmm7, %xmm6, %xmm6
        vpxor	%xmm1, %xmm6, %xmm6
        cmpl	$11, 184(%esp)
        vmovdqa	160(%ebp), %xmm1
        jl	L_AES_GCM_decrypt_update_avx1_aesenc_gfmul_last
        vaesenc	%xmm1, %xmm0, %xmm0
        vaesenc	176(%ebp), %xmm0, %xmm0
        cmpl	$13, 184(%esp)
        vmovdqa	192(%ebp), %xmm1
        jl	L_AES_GCM_decrypt_update_avx1_aesenc_gfmul_last
        vaesenc	%xmm1, %xmm0, %xmm0
        vaesenc	208(%ebp), %xmm0, %xmm0
        vmovdqa	224(%ebp), %xmm1
L_AES_GCM_decrypt_update_avx1_aesenc_gfmul_last:
        vaesenclast	%xmm1, %xmm0, %xmm0
        vmovdqu	(%ecx), %xmm1
        vpxor	%xmm1, %xmm0, %xmm0
        vmovdqu	%xmm0, (%edx)
        addl	$16, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_decrypt_update_avx1_last_block_start
L_AES_GCM_decrypt_update_avx1_last_block_done:
L_AES_GCM_decrypt_update_avx1_done_dec:
        movl	200(%esp), %esi
        movl	208(%esp), %edi
        vmovdqu	64(%esp), %xmm4
        vmovdqa	%xmm6, (%esi)
        vmovdqu	%xmm4, (%edi)
        addl	$0xa0, %esp
        popl	%ebp
        popl	%edi
        popl	%esi
        popl	%ebx
        ret
.size	AES_GCM_decrypt_update_avx1,.-AES_GCM_decrypt_update_avx1
.text
.globl	AES_GCM_decrypt_final_avx1
.type	AES_GCM_decrypt_final_avx1,@function
.align	16
AES_GCM_decrypt_final_avx1:
        pushl	%ebx
        pushl	%esi
        pushl	%edi
        pushl	%ebp
        subl	$16, %esp
        movl	36(%esp), %ebp
        movl	56(%esp), %esi
        movl	60(%esp), %edi
        vmovdqa	(%ebp), %xmm6
        vmovdqa	(%esi), %xmm5
        vmovdqa	(%edi), %xmm7
        vpsrlq	$63, %xmm5, %xmm1
        vpsllq	$0x01, %xmm5, %xmm0
        vpslldq	$8, %xmm1, %xmm1
        vpor	%xmm1, %xmm0, %xmm0
        vpshufd	$0xff, %xmm5, %xmm5
        vpsrad	$31, %xmm5, %xmm5
        vpand	L_aes_gcm_avx1_mod2_128, %xmm5, %xmm5
        vpxor	%xmm0, %xmm5, %xmm5
        movl	48(%esp), %edx
        movl	52(%esp), %ecx
        shll	$3, %edx
        shll	$3, %ecx
        vpinsrd	$0x00, %edx, %xmm0, %xmm0
        vpinsrd	$2, %ecx, %xmm0, %xmm0
        movl	48(%esp), %edx
        movl	52(%esp), %ecx
        shrl	$29, %edx
        shrl	$29, %ecx
        vpinsrd	$0x01, %edx, %xmm0, %xmm0
        vpinsrd	$3, %ecx, %xmm0, %xmm0
        vpxor	%xmm0, %xmm6, %xmm6
        # ghash_gfmul_red_avx
        vpshufd	$0x4e, %xmm5, %xmm1
        vpshufd	$0x4e, %xmm6, %xmm2
        vpclmulqdq	$0x11, %xmm5, %xmm6, %xmm3
        vpclmulqdq	$0x00, %xmm5, %xmm6, %xmm0
        vpxor	%xmm5, %xmm1, %xmm1
        vpxor	%xmm6, %xmm2, %xmm2
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vpslldq	$8, %xmm1, %xmm2
        vpsrldq	$8, %xmm1, %xmm1
        vpxor	%xmm2, %xmm0, %xmm0
        vpxor	%xmm1, %xmm3, %xmm6
        vpslld	$31, %xmm0, %xmm1
        vpslld	$30, %xmm0, %xmm2
        vpslld	$25, %xmm0, %xmm3
        vpxor	%xmm2, %xmm1, %xmm1
        vpxor	%xmm3, %xmm1, %xmm1
        vpsrldq	$4, %xmm1, %xmm3
        vpslldq	$12, %xmm1, %xmm1
        vpxor	%xmm1, %xmm0, %xmm0
        vpsrld	$0x01, %xmm0, %xmm1
        vpsrld	$2, %xmm0, %xmm2
        vpxor	%xmm2, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpsrld	$7, %xmm0, %xmm0
        vpxor	%xmm3, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm6, %xmm6
        vpshufb	L_aes_gcm_avx1_bswap_mask, %xmm6, %xmm6
        vpxor	%xmm7, %xmm6, %xmm0
        movl	40(%esp), %esi
        movl	64(%esp), %edi
        cmpl	$16, 44(%esp)
        je	L_AES_GCM_decrypt_final_avx1_cmp_tag_16
        subl	$16, %esp
        xorl	%ecx, %ecx
        xorl	%ebx, %ebx
        vmovdqu	%xmm0, (%esp)
L_AES_GCM_decrypt_final_avx1_cmp_tag_loop:
        movzbl	(%esp,%ecx,1), %eax
        xorb	(%esi,%ecx,1), %al
        orb	%al, %bl
        incl	%ecx
        cmpl	44(%esp), %ecx
        jne	L_AES_GCM_decrypt_final_avx1_cmp_tag_loop
        cmpb	$0x00, %bl
        sete	%bl
        addl	$16, %esp
        xorl	%ecx, %ecx
        jmp	L_AES_GCM_decrypt_final_avx1_cmp_tag_done
L_AES_GCM_decrypt_final_avx1_cmp_tag_16:
        vmovdqu	(%esi), %xmm1
        vpcmpeqb	%xmm1, %xmm0, %xmm0
        vpmovmskb	%xmm0, %edx
        # %%edx == 0xFFFF then return 1 else => return 0
        xorl	%ebx, %ebx
        cmpl	$0xffff, %edx
        sete	%bl
L_AES_GCM_decrypt_final_avx1_cmp_tag_done:
        movl	%ebx, (%edi)
        addl	$16, %esp
        popl	%ebp
        popl	%edi
        popl	%esi
        popl	%ebx
        ret
.size	AES_GCM_decrypt_final_avx1,.-AES_GCM_decrypt_final_avx1
#endif /* WOLFSSL_AESGCM_STREAM */
#endif /* HAVE_INTEL_AVX1 */
#ifdef HAVE_INTEL_AVX2
.text
.globl	AES_GCM_encrypt_avx2
.type	AES_GCM_encrypt_avx2,@function
.align	16
AES_GCM_encrypt_avx2:
        pushl	%ebx
        pushl	%esi
        pushl	%edi
        pushl	%ebp
        subl	$0x70, %esp
        movl	144(%esp), %esi
        movl	168(%esp), %ebp
        movl	160(%esp), %edx
        vpxor	%xmm4, %xmm4, %xmm4
        cmpl	$12, %edx
        je	L_AES_GCM_encrypt_avx2_iv_12
        # Calculate values when IV is not 12 bytes
        # H = Encrypt X(=0)
        vmovdqu	(%ebp), %xmm5
        vaesenc	16(%ebp), %xmm5, %xmm5
        vaesenc	32(%ebp), %xmm5, %xmm5
        vaesenc	48(%ebp), %xmm5, %xmm5
        vaesenc	64(%ebp), %xmm5, %xmm5
        vaesenc	80(%ebp), %xmm5, %xmm5
        vaesenc	96(%ebp), %xmm5, %xmm5
        vaesenc	112(%ebp), %xmm5, %xmm5
        vaesenc	128(%ebp), %xmm5, %xmm5
        vaesenc	144(%ebp), %xmm5, %xmm5
        cmpl	$11, 172(%esp)
        vmovdqu	160(%ebp), %xmm0
        jl	L_AES_GCM_encrypt_avx2_calc_iv_1_aesenc_avx_last
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	176(%ebp), %xmm5, %xmm5
        cmpl	$13, 172(%esp)
        vmovdqu	192(%ebp), %xmm0
        jl	L_AES_GCM_encrypt_avx2_calc_iv_1_aesenc_avx_last
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	208(%ebp), %xmm5, %xmm5
        vmovdqu	224(%ebp), %xmm0
L_AES_GCM_encrypt_avx2_calc_iv_1_aesenc_avx_last:
        vaesenclast	%xmm0, %xmm5, %xmm5
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm5, %xmm5
        # Calc counter
        # Initialization vector
        cmpl	$0x00, %edx
        movl	$0x00, %ecx
        je	L_AES_GCM_encrypt_avx2_calc_iv_done
        cmpl	$16, %edx
        jl	L_AES_GCM_encrypt_avx2_calc_iv_lt16
        andl	$0xfffffff0, %edx
L_AES_GCM_encrypt_avx2_calc_iv_16_loop:
        vmovdqu	(%esi,%ecx,1), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm0, %xmm4, %xmm4
        # ghash_gfmul_avx
        vpclmulqdq	$16, %xmm4, %xmm5, %xmm2
        vpclmulqdq	$0x01, %xmm4, %xmm5, %xmm1
        vpclmulqdq	$0x00, %xmm4, %xmm5, %xmm0
        vpclmulqdq	$0x11, %xmm4, %xmm5, %xmm3
        vpxor	%xmm1, %xmm2, %xmm2
        vpslldq	$8, %xmm2, %xmm1
        vpsrldq	$8, %xmm2, %xmm2
        vpxor	%xmm1, %xmm0, %xmm7
        vpxor	%xmm2, %xmm3, %xmm4
        # ghash_mid
        vpsrld	$31, %xmm7, %xmm0
        vpsrld	$31, %xmm4, %xmm1
        vpslld	$0x01, %xmm7, %xmm7
        vpslld	$0x01, %xmm4, %xmm4
        vpsrldq	$12, %xmm0, %xmm2
        vpslldq	$4, %xmm0, %xmm0
        vpslldq	$4, %xmm1, %xmm1
        vpor	%xmm2, %xmm4, %xmm4
        vpor	%xmm0, %xmm7, %xmm7
        vpor	%xmm1, %xmm4, %xmm4
        # ghash_red
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm2
        vpclmulqdq	$16, %xmm2, %xmm7, %xmm0
        vpshufd	$0x4e, %xmm7, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$16, %xmm2, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm4, %xmm4
        addl	$16, %ecx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_encrypt_avx2_calc_iv_16_loop
        movl	160(%esp), %edx
        cmpl	%edx, %ecx
        je	L_AES_GCM_encrypt_avx2_calc_iv_done
L_AES_GCM_encrypt_avx2_calc_iv_lt16:
        vpxor	%xmm0, %xmm0, %xmm0
        xorl	%ebx, %ebx
        vmovdqu	%xmm0, (%esp)
L_AES_GCM_encrypt_avx2_calc_iv_loop:
        movzbl	(%esi,%ecx,1), %eax
        movb	%al, (%esp,%ebx,1)
        incl	%ecx
        incl	%ebx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_encrypt_avx2_calc_iv_loop
        vmovdqu	(%esp), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm0, %xmm4, %xmm4
        # ghash_gfmul_avx
        vpclmulqdq	$16, %xmm4, %xmm5, %xmm2
        vpclmulqdq	$0x01, %xmm4, %xmm5, %xmm1
        vpclmulqdq	$0x00, %xmm4, %xmm5, %xmm0
        vpclmulqdq	$0x11, %xmm4, %xmm5, %xmm3
        vpxor	%xmm1, %xmm2, %xmm2
        vpslldq	$8, %xmm2, %xmm1
        vpsrldq	$8, %xmm2, %xmm2
        vpxor	%xmm1, %xmm0, %xmm7
        vpxor	%xmm2, %xmm3, %xmm4
        # ghash_mid
        vpsrld	$31, %xmm7, %xmm0
        vpsrld	$31, %xmm4, %xmm1
        vpslld	$0x01, %xmm7, %xmm7
        vpslld	$0x01, %xmm4, %xmm4
        vpsrldq	$12, %xmm0, %xmm2
        vpslldq	$4, %xmm0, %xmm0
        vpslldq	$4, %xmm1, %xmm1
        vpor	%xmm2, %xmm4, %xmm4
        vpor	%xmm0, %xmm7, %xmm7
        vpor	%xmm1, %xmm4, %xmm4
        # ghash_red
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm2
        vpclmulqdq	$16, %xmm2, %xmm7, %xmm0
        vpshufd	$0x4e, %xmm7, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$16, %xmm2, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm4, %xmm4
L_AES_GCM_encrypt_avx2_calc_iv_done:
        # T = Encrypt counter
        vpxor	%xmm0, %xmm0, %xmm0
        shll	$3, %edx
        vpinsrd	$0x00, %edx, %xmm0, %xmm0
        vpxor	%xmm0, %xmm4, %xmm4
        # ghash_gfmul_avx
        vpclmulqdq	$16, %xmm4, %xmm5, %xmm2
        vpclmulqdq	$0x01, %xmm4, %xmm5, %xmm1
        vpclmulqdq	$0x00, %xmm4, %xmm5, %xmm0
        vpclmulqdq	$0x11, %xmm4, %xmm5, %xmm3
        vpxor	%xmm1, %xmm2, %xmm2
        vpslldq	$8, %xmm2, %xmm1
        vpsrldq	$8, %xmm2, %xmm2
        vpxor	%xmm1, %xmm0, %xmm7
        vpxor	%xmm2, %xmm3, %xmm4
        # ghash_mid
        vpsrld	$31, %xmm7, %xmm0
        vpsrld	$31, %xmm4, %xmm1
        vpslld	$0x01, %xmm7, %xmm7
        vpslld	$0x01, %xmm4, %xmm4
        vpsrldq	$12, %xmm0, %xmm2
        vpslldq	$4, %xmm0, %xmm0
        vpslldq	$4, %xmm1, %xmm1
        vpor	%xmm2, %xmm4, %xmm4
        vpor	%xmm0, %xmm7, %xmm7
        vpor	%xmm1, %xmm4, %xmm4
        # ghash_red
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm2
        vpclmulqdq	$16, %xmm2, %xmm7, %xmm0
        vpshufd	$0x4e, %xmm7, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$16, %xmm2, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm4, %xmm4
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm4, %xmm4
        #   Encrypt counter
        vmovdqu	(%ebp), %xmm6
        vpxor	%xmm4, %xmm6, %xmm6
        vaesenc	16(%ebp), %xmm6, %xmm6
        vaesenc	32(%ebp), %xmm6, %xmm6
        vaesenc	48(%ebp), %xmm6, %xmm6
        vaesenc	64(%ebp), %xmm6, %xmm6
        vaesenc	80(%ebp), %xmm6, %xmm6
        vaesenc	96(%ebp), %xmm6, %xmm6
        vaesenc	112(%ebp), %xmm6, %xmm6
        vaesenc	128(%ebp), %xmm6, %xmm6
        vaesenc	144(%ebp), %xmm6, %xmm6
        cmpl	$11, 172(%esp)
        vmovdqu	160(%ebp), %xmm0
        jl	L_AES_GCM_encrypt_avx2_calc_iv_2_aesenc_avx_last
        vaesenc	%xmm0, %xmm6, %xmm6
        vaesenc	176(%ebp), %xmm6, %xmm6
        cmpl	$13, 172(%esp)
        vmovdqu	192(%ebp), %xmm0
        jl	L_AES_GCM_encrypt_avx2_calc_iv_2_aesenc_avx_last
        vaesenc	%xmm0, %xmm6, %xmm6
        vaesenc	208(%ebp), %xmm6, %xmm6
        vmovdqu	224(%ebp), %xmm0
L_AES_GCM_encrypt_avx2_calc_iv_2_aesenc_avx_last:
        vaesenclast	%xmm0, %xmm6, %xmm6
        jmp	L_AES_GCM_encrypt_avx2_iv_done
L_AES_GCM_encrypt_avx2_iv_12:
        # # Calculate values when IV is 12 bytes
        # Set counter based on IV
        vmovdqu	L_avx2_aes_gcm_bswap_one, %xmm4
        vmovdqu	(%ebp), %xmm5
        vpblendd	$7, (%esi), %xmm4, %xmm4
        # H = Encrypt X(=0) and T = Encrypt counter
        vmovdqu	16(%ebp), %xmm7
        vpxor	%xmm5, %xmm4, %xmm6
        vaesenc	%xmm7, %xmm5, %xmm5
        vaesenc	%xmm7, %xmm6, %xmm6
        vmovdqu	32(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        vmovdqu	48(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        vmovdqu	64(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        vmovdqu	80(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        vmovdqu	96(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        vmovdqu	112(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        vmovdqu	128(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        vmovdqu	144(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        cmpl	$11, 172(%esp)
        vmovdqu	160(%ebp), %xmm0
        jl	L_AES_GCM_encrypt_avx2_calc_iv_12_last
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        vmovdqu	176(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        cmpl	$13, 172(%esp)
        vmovdqu	192(%ebp), %xmm0
        jl	L_AES_GCM_encrypt_avx2_calc_iv_12_last
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        vmovdqu	208(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        vmovdqu	224(%ebp), %xmm0
L_AES_GCM_encrypt_avx2_calc_iv_12_last:
        vaesenclast	%xmm0, %xmm5, %xmm5
        vaesenclast	%xmm0, %xmm6, %xmm6
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm5, %xmm5
L_AES_GCM_encrypt_avx2_iv_done:
        vmovdqu	%xmm6, 80(%esp)
        vpxor	%xmm6, %xmm6, %xmm6
        movl	140(%esp), %esi
        # Additional authentication data
        movl	156(%esp), %edx
        cmpl	$0x00, %edx
        je	L_AES_GCM_encrypt_avx2_calc_aad_done
        xorl	%ecx, %ecx
        cmpl	$16, %edx
        jl	L_AES_GCM_encrypt_avx2_calc_aad_lt16
        andl	$0xfffffff0, %edx
L_AES_GCM_encrypt_avx2_calc_aad_16_loop:
        vmovdqu	(%esi,%ecx,1), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm0, %xmm6, %xmm6
        # ghash_gfmul_avx
        vpclmulqdq	$16, %xmm6, %xmm5, %xmm2
        vpclmulqdq	$0x01, %xmm6, %xmm5, %xmm1
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm0
        vpclmulqdq	$0x11, %xmm6, %xmm5, %xmm3
        vpxor	%xmm1, %xmm2, %xmm2
        vpslldq	$8, %xmm2, %xmm1
        vpsrldq	$8, %xmm2, %xmm2
        vpxor	%xmm1, %xmm0, %xmm7
        vpxor	%xmm2, %xmm3, %xmm6
        # ghash_mid
        vpsrld	$31, %xmm7, %xmm0
        vpsrld	$31, %xmm6, %xmm1
        vpslld	$0x01, %xmm7, %xmm7
        vpslld	$0x01, %xmm6, %xmm6
        vpsrldq	$12, %xmm0, %xmm2
        vpslldq	$4, %xmm0, %xmm0
        vpslldq	$4, %xmm1, %xmm1
        vpor	%xmm2, %xmm6, %xmm6
        vpor	%xmm0, %xmm7, %xmm7
        vpor	%xmm1, %xmm6, %xmm6
        # ghash_red
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm2
        vpclmulqdq	$16, %xmm2, %xmm7, %xmm0
        vpshufd	$0x4e, %xmm7, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$16, %xmm2, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm6, %xmm6
        addl	$16, %ecx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_encrypt_avx2_calc_aad_16_loop
        movl	156(%esp), %edx
        cmpl	%edx, %ecx
        je	L_AES_GCM_encrypt_avx2_calc_aad_done
L_AES_GCM_encrypt_avx2_calc_aad_lt16:
        vpxor	%xmm0, %xmm0, %xmm0
        xorl	%ebx, %ebx
        vmovdqu	%xmm0, (%esp)
L_AES_GCM_encrypt_avx2_calc_aad_loop:
        movzbl	(%esi,%ecx,1), %eax
        movb	%al, (%esp,%ebx,1)
        incl	%ecx
        incl	%ebx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_encrypt_avx2_calc_aad_loop
        vmovdqu	(%esp), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm0, %xmm6, %xmm6
        # ghash_gfmul_avx
        vpclmulqdq	$16, %xmm6, %xmm5, %xmm2
        vpclmulqdq	$0x01, %xmm6, %xmm5, %xmm1
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm0
        vpclmulqdq	$0x11, %xmm6, %xmm5, %xmm3
        vpxor	%xmm1, %xmm2, %xmm2
        vpslldq	$8, %xmm2, %xmm1
        vpsrldq	$8, %xmm2, %xmm2
        vpxor	%xmm1, %xmm0, %xmm7
        vpxor	%xmm2, %xmm3, %xmm6
        # ghash_mid
        vpsrld	$31, %xmm7, %xmm0
        vpsrld	$31, %xmm6, %xmm1
        vpslld	$0x01, %xmm7, %xmm7
        vpslld	$0x01, %xmm6, %xmm6
        vpsrldq	$12, %xmm0, %xmm2
        vpslldq	$4, %xmm0, %xmm0
        vpslldq	$4, %xmm1, %xmm1
        vpor	%xmm2, %xmm6, %xmm6
        vpor	%xmm0, %xmm7, %xmm7
        vpor	%xmm1, %xmm6, %xmm6
        # ghash_red
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm2
        vpclmulqdq	$16, %xmm2, %xmm7, %xmm0
        vpshufd	$0x4e, %xmm7, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$16, %xmm2, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm6, %xmm6
L_AES_GCM_encrypt_avx2_calc_aad_done:
        movl	132(%esp), %esi
        movl	136(%esp), %edi
        # Calculate counter and H
        vpsrlq	$63, %xmm5, %xmm1
        vpsllq	$0x01, %xmm5, %xmm0
        vpslldq	$8, %xmm1, %xmm1
        vpor	%xmm1, %xmm0, %xmm0
        vpshufd	$0xff, %xmm5, %xmm5
        vpsrad	$31, %xmm5, %xmm5
        vpshufb	L_aes_gcm_avx2_bswap_epi64, %xmm4, %xmm4
        vpand	L_aes_gcm_avx2_mod2_128, %xmm5, %xmm5
        vpaddd	L_aes_gcm_avx2_one, %xmm4, %xmm4
        vpxor	%xmm0, %xmm5, %xmm5
        xorl	%ebx, %ebx
        cmpl	$0x40, 152(%esp)
        movl	152(%esp), %eax
        jl	L_AES_GCM_encrypt_avx2_done_64
        andl	$0xffffffc0, %eax
        vmovdqu	%xmm4, 64(%esp)
        vmovdqu	%xmm6, 96(%esp)
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm3
        # H ^ 1
        vmovdqu	%xmm5, (%esp)
        vmovdqu	%xmm5, %xmm2
        # H ^ 2
        vpclmulqdq	$0x00, %xmm2, %xmm2, %xmm5
        vpclmulqdq	$0x11, %xmm2, %xmm2, %xmm6
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm5, %xmm6, %xmm0
        vmovdqu	%xmm0, 16(%esp)
        # H ^ 3
        # ghash_gfmul_red
        vpclmulqdq	$16, %xmm0, %xmm2, %xmm6
        vpclmulqdq	$0x01, %xmm0, %xmm2, %xmm5
        vpclmulqdq	$0x00, %xmm0, %xmm2, %xmm4
        vpxor	%xmm5, %xmm6, %xmm6
        vpslldq	$8, %xmm6, %xmm5
        vpsrldq	$8, %xmm6, %xmm6
        vpxor	%xmm4, %xmm5, %xmm5
        vpclmulqdq	$0x11, %xmm0, %xmm2, %xmm1
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm6, %xmm1, %xmm1
        vpxor	%xmm5, %xmm1, %xmm1
        vpxor	%xmm4, %xmm1, %xmm1
        vmovdqu	%xmm1, 32(%esp)
        # H ^ 4
        vpclmulqdq	$0x00, %xmm0, %xmm0, %xmm5
        vpclmulqdq	$0x11, %xmm0, %xmm0, %xmm6
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm5, %xmm6, %xmm2
        vmovdqu	%xmm2, 48(%esp)
        vmovdqu	96(%esp), %xmm6
        # First 64 bytes of input
        # aesenc_64
        # aesenc_ctr
        vmovdqu	64(%esp), %xmm4
        vmovdqu	L_aes_gcm_avx2_bswap_epi64, %xmm7
        vpaddd	L_aes_gcm_avx2_one, %xmm4, %xmm1
        vpshufb	%xmm7, %xmm4, %xmm0
        vpaddd	L_aes_gcm_avx2_two, %xmm4, %xmm2
        vpshufb	%xmm7, %xmm1, %xmm1
        vpaddd	L_aes_gcm_avx2_three, %xmm4, %xmm3
        vpshufb	%xmm7, %xmm2, %xmm2
        vpaddd	L_aes_gcm_avx2_four, %xmm4, %xmm4
        vpshufb	%xmm7, %xmm3, %xmm3
        # aesenc_xor
        vmovdqu	(%ebp), %xmm7
        vmovdqu	%xmm4, 64(%esp)
        vpxor	%xmm7, %xmm0, %xmm0
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm7, %xmm3, %xmm3
        vmovdqu	16(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	32(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	48(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	64(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	80(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	96(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	112(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	128(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	144(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$11, 172(%esp)
        vmovdqu	160(%ebp), %xmm7
        jl	L_AES_GCM_encrypt_avx2_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	176(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$13, 172(%esp)
        vmovdqu	192(%ebp), %xmm7
        jl	L_AES_GCM_encrypt_avx2_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	208(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	224(%ebp), %xmm7
L_AES_GCM_encrypt_avx2_aesenc_64_enc_done:
        # aesenc_last
        vaesenclast	%xmm7, %xmm0, %xmm0
        vaesenclast	%xmm7, %xmm1, %xmm1
        vaesenclast	%xmm7, %xmm2, %xmm2
        vaesenclast	%xmm7, %xmm3, %xmm3
        vmovdqu	(%esi), %xmm7
        vmovdqu	16(%esi), %xmm4
        vpxor	%xmm7, %xmm0, %xmm0
        vpxor	%xmm4, %xmm1, %xmm1
        vmovdqu	%xmm0, (%edi)
        vmovdqu	%xmm1, 16(%edi)
        vmovdqu	32(%esi), %xmm7
        vmovdqu	48(%esi), %xmm4
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm4, %xmm3, %xmm3
        vmovdqu	%xmm2, 32(%edi)
        vmovdqu	%xmm3, 48(%edi)
        cmpl	$0x40, %eax
        movl	$0x40, %ebx
        movl	%esi, %ecx
        movl	%edi, %edx
        jle	L_AES_GCM_encrypt_avx2_end_64
        # More 64 bytes of input
L_AES_GCM_encrypt_avx2_ghash_64:
        # aesenc_64_ghash
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        # aesenc_64
        # aesenc_ctr
        vmovdqu	64(%esp), %xmm4
        vmovdqu	L_aes_gcm_avx2_bswap_epi64, %xmm7
        vpaddd	L_aes_gcm_avx2_one, %xmm4, %xmm1
        vpshufb	%xmm7, %xmm4, %xmm0
        vpaddd	L_aes_gcm_avx2_two, %xmm4, %xmm2
        vpshufb	%xmm7, %xmm1, %xmm1
        vpaddd	L_aes_gcm_avx2_three, %xmm4, %xmm3
        vpshufb	%xmm7, %xmm2, %xmm2
        vpaddd	L_aes_gcm_avx2_four, %xmm4, %xmm4
        vpshufb	%xmm7, %xmm3, %xmm3
        # aesenc_xor
        vmovdqu	(%ebp), %xmm7
        vmovdqu	%xmm4, 64(%esp)
        vpxor	%xmm7, %xmm0, %xmm0
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm7, %xmm3, %xmm3
        vmovdqu	16(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	32(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	48(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	64(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	80(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	96(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	112(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	128(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	144(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$11, 172(%esp)
        vmovdqu	160(%ebp), %xmm7
        jl	L_AES_GCM_encrypt_avx2_aesenc_64_ghash_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	176(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$13, 172(%esp)
        vmovdqu	192(%ebp), %xmm7
        jl	L_AES_GCM_encrypt_avx2_aesenc_64_ghash_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	208(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	224(%ebp), %xmm7
L_AES_GCM_encrypt_avx2_aesenc_64_ghash_aesenc_64_enc_done:
        # aesenc_last
        vaesenclast	%xmm7, %xmm0, %xmm0
        vaesenclast	%xmm7, %xmm1, %xmm1
        vaesenclast	%xmm7, %xmm2, %xmm2
        vaesenclast	%xmm7, %xmm3, %xmm3
        vmovdqu	(%ecx), %xmm7
        vmovdqu	16(%ecx), %xmm4
        vpxor	%xmm7, %xmm0, %xmm0
        vpxor	%xmm4, %xmm1, %xmm1
        vmovdqu	%xmm0, (%edx)
        vmovdqu	%xmm1, 16(%edx)
        vmovdqu	32(%ecx), %xmm7
        vmovdqu	48(%ecx), %xmm4
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm4, %xmm3, %xmm3
        vmovdqu	%xmm2, 32(%edx)
        vmovdqu	%xmm3, 48(%edx)
        # pclmul_1
        vmovdqu	-64(%edx), %xmm1
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vmovdqu	48(%esp), %xmm2
        vpxor	%xmm6, %xmm1, %xmm1
        vpclmulqdq	$16, %xmm2, %xmm1, %xmm5
        vpclmulqdq	$0x01, %xmm2, %xmm1, %xmm3
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm6
        vpclmulqdq	$0x11, %xmm2, %xmm1, %xmm7
        # pclmul_2
        vmovdqu	-48(%edx), %xmm1
        vmovdqu	32(%esp), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vpxor	%xmm3, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm0, %xmm1, %xmm2
        vpclmulqdq	$0x01, %xmm0, %xmm1, %xmm3
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm7, %xmm7
        # pclmul_n
        vmovdqu	-32(%edx), %xmm1
        vmovdqu	16(%esp), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vpxor	%xmm2, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm0, %xmm1, %xmm2
        vpxor	%xmm3, %xmm5, %xmm5
        vpclmulqdq	$0x01, %xmm0, %xmm1, %xmm3
        vpxor	%xmm4, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm7, %xmm7
        # pclmul_n
        vmovdqu	-16(%edx), %xmm1
        vmovdqu	(%esp), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vpxor	%xmm2, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm0, %xmm1, %xmm2
        vpxor	%xmm3, %xmm5, %xmm5
        vpclmulqdq	$0x01, %xmm0, %xmm1, %xmm3
        vpxor	%xmm4, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm7, %xmm7
        # aesenc_pclmul_l
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm4, %xmm6, %xmm6
        vpxor	%xmm3, %xmm5, %xmm5
        vpslldq	$8, %xmm5, %xmm1
        vpsrldq	$8, %xmm5, %xmm5
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm0
        vpxor	%xmm1, %xmm6, %xmm6
        vpxor	%xmm5, %xmm7, %xmm7
        vpclmulqdq	$16, %xmm0, %xmm6, %xmm3
        vpshufd	$0x4e, %xmm6, %xmm6
        vpxor	%xmm3, %xmm6, %xmm6
        vpclmulqdq	$16, %xmm0, %xmm6, %xmm3
        vpshufd	$0x4e, %xmm6, %xmm6
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm7, %xmm6, %xmm6
        # aesenc_64_ghash - end
        addl	$0x40, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_encrypt_avx2_ghash_64
L_AES_GCM_encrypt_avx2_end_64:
        vmovdqu	%xmm6, 96(%esp)
        vmovdqu	48(%edx), %xmm3
        vmovdqu	(%esp), %xmm7
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm3, %xmm3
        vpclmulqdq	$16, %xmm3, %xmm7, %xmm5
        vpclmulqdq	$0x01, %xmm3, %xmm7, %xmm1
        vpclmulqdq	$0x00, %xmm3, %xmm7, %xmm4
        vpclmulqdq	$0x11, %xmm3, %xmm7, %xmm6
        vpxor	%xmm1, %xmm5, %xmm5
        vmovdqu	32(%edx), %xmm3
        vmovdqu	16(%esp), %xmm7
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm3, %xmm3
        vpclmulqdq	$16, %xmm3, %xmm7, %xmm2
        vpclmulqdq	$0x01, %xmm3, %xmm7, %xmm1
        vpclmulqdq	$0x00, %xmm3, %xmm7, %xmm0
        vpclmulqdq	$0x11, %xmm3, %xmm7, %xmm3
        vpxor	%xmm1, %xmm2, %xmm2
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm0, %xmm4, %xmm4
        vmovdqu	16(%edx), %xmm3
        vmovdqu	32(%esp), %xmm7
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm3, %xmm3
        vpclmulqdq	$16, %xmm3, %xmm7, %xmm2
        vpclmulqdq	$0x01, %xmm3, %xmm7, %xmm1
        vpclmulqdq	$0x00, %xmm3, %xmm7, %xmm0
        vpclmulqdq	$0x11, %xmm3, %xmm7, %xmm3
        vpxor	%xmm1, %xmm2, %xmm2
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm0, %xmm4, %xmm4
        vmovdqu	96(%esp), %xmm0
        vmovdqu	(%edx), %xmm3
        vmovdqu	48(%esp), %xmm7
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm3, %xmm3
        vpxor	%xmm0, %xmm3, %xmm3
        vpclmulqdq	$16, %xmm3, %xmm7, %xmm2
        vpclmulqdq	$0x01, %xmm3, %xmm7, %xmm1
        vpclmulqdq	$0x00, %xmm3, %xmm7, %xmm0
        vpclmulqdq	$0x11, %xmm3, %xmm7, %xmm3
        vpxor	%xmm1, %xmm2, %xmm2
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm0, %xmm4, %xmm4
        vpslldq	$8, %xmm5, %xmm7
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm7, %xmm4, %xmm4
        vpxor	%xmm5, %xmm6, %xmm6
        # ghash_red
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm2
        vpclmulqdq	$16, %xmm2, %xmm4, %xmm0
        vpshufd	$0x4e, %xmm4, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$16, %xmm2, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm6, %xmm6
        vmovdqu	(%esp), %xmm5
        vmovdqu	64(%esp), %xmm4
L_AES_GCM_encrypt_avx2_done_64:
        cmpl	152(%esp), %ebx
        je	L_AES_GCM_encrypt_avx2_done_enc
        movl	152(%esp), %eax
        andl	$0xfffffff0, %eax
        cmpl	%eax, %ebx
        jge	L_AES_GCM_encrypt_avx2_last_block_done
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        # aesenc_block
        vmovdqu	%xmm4, %xmm1
        vpshufb	L_aes_gcm_avx2_bswap_epi64, %xmm1, %xmm0
        vpaddd	L_aes_gcm_avx2_one, %xmm1, %xmm1
        vpxor	(%ebp), %xmm0, %xmm0
        vaesenc	16(%ebp), %xmm0, %xmm0
        vaesenc	32(%ebp), %xmm0, %xmm0
        vaesenc	48(%ebp), %xmm0, %xmm0
        vaesenc	64(%ebp), %xmm0, %xmm0
        vaesenc	80(%ebp), %xmm0, %xmm0
        vaesenc	96(%ebp), %xmm0, %xmm0
        vaesenc	112(%ebp), %xmm0, %xmm0
        vaesenc	128(%ebp), %xmm0, %xmm0
        vaesenc	144(%ebp), %xmm0, %xmm0
        cmpl	$11, 172(%esp)
        vmovdqu	160(%ebp), %xmm2
        jl	L_AES_GCM_encrypt_avx2_aesenc_block_aesenc_avx_last
        vaesenc	%xmm2, %xmm0, %xmm0
        vaesenc	176(%ebp), %xmm0, %xmm0
        cmpl	$13, 172(%esp)
        vmovdqu	192(%ebp), %xmm2
        jl	L_AES_GCM_encrypt_avx2_aesenc_block_aesenc_avx_last
        vaesenc	%xmm2, %xmm0, %xmm0
        vaesenc	208(%ebp), %xmm0, %xmm0
        vmovdqu	224(%ebp), %xmm2
L_AES_GCM_encrypt_avx2_aesenc_block_aesenc_avx_last:
        vaesenclast	%xmm2, %xmm0, %xmm0
        vmovdqu	%xmm1, %xmm4
        vmovdqu	(%ecx), %xmm1
        vpxor	%xmm1, %xmm0, %xmm0
        vmovdqu	%xmm0, (%edx)
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm0, %xmm6, %xmm6
        addl	$16, %ebx
        cmpl	%eax, %ebx
        jge	L_AES_GCM_encrypt_avx2_last_block_ghash
L_AES_GCM_encrypt_avx2_last_block_start:
        vpshufb	L_aes_gcm_avx2_bswap_epi64, %xmm4, %xmm7
        vpaddd	L_aes_gcm_avx2_one, %xmm4, %xmm4
        vmovdqu	%xmm4, 64(%esp)
        # aesenc_gfmul_sb
        vpclmulqdq	$0x01, %xmm5, %xmm6, %xmm2
        vpclmulqdq	$16, %xmm5, %xmm6, %xmm3
        vpclmulqdq	$0x00, %xmm5, %xmm6, %xmm1
        vpclmulqdq	$0x11, %xmm5, %xmm6, %xmm4
        vpxor	(%ebp), %xmm7, %xmm7
        vaesenc	16(%ebp), %xmm7, %xmm7
        vpxor	%xmm2, %xmm3, %xmm3
        vpslldq	$8, %xmm3, %xmm2
        vpsrldq	$8, %xmm3, %xmm3
        vaesenc	32(%ebp), %xmm7, %xmm7
        vpxor	%xmm1, %xmm2, %xmm2
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm2, %xmm1
        vaesenc	48(%ebp), %xmm7, %xmm7
        vaesenc	64(%ebp), %xmm7, %xmm7
        vaesenc	80(%ebp), %xmm7, %xmm7
        vpshufd	$0x4e, %xmm2, %xmm2
        vpxor	%xmm1, %xmm2, %xmm2
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm2, %xmm1
        vaesenc	96(%ebp), %xmm7, %xmm7
        vaesenc	112(%ebp), %xmm7, %xmm7
        vaesenc	128(%ebp), %xmm7, %xmm7
        vpshufd	$0x4e, %xmm2, %xmm2
        vaesenc	144(%ebp), %xmm7, %xmm7
        vpxor	%xmm3, %xmm4, %xmm4
        vpxor	%xmm4, %xmm2, %xmm2
        vmovdqu	160(%ebp), %xmm0
        cmpl	$11, 172(%esp)
        jl	L_AES_GCM_encrypt_avx2_aesenc_gfmul_sb_last
        vaesenc	%xmm0, %xmm7, %xmm7
        vaesenc	176(%ebp), %xmm7, %xmm7
        vmovdqu	192(%ebp), %xmm0
        cmpl	$13, 172(%esp)
        jl	L_AES_GCM_encrypt_avx2_aesenc_gfmul_sb_last
        vaesenc	%xmm0, %xmm7, %xmm7
        vaesenc	208(%ebp), %xmm7, %xmm7
        vmovdqu	224(%ebp), %xmm0
L_AES_GCM_encrypt_avx2_aesenc_gfmul_sb_last:
        vaesenclast	%xmm0, %xmm7, %xmm7
        vmovdqu	(%esi,%ebx,1), %xmm3
        vpxor	%xmm1, %xmm2, %xmm6
        vpxor	%xmm3, %xmm7, %xmm7
        vmovdqu	%xmm7, (%edi,%ebx,1)
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm7, %xmm7
        vpxor	%xmm7, %xmm6, %xmm6
        vmovdqu	64(%esp), %xmm4
        addl	$16, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_encrypt_avx2_last_block_start
L_AES_GCM_encrypt_avx2_last_block_ghash:
        # ghash_gfmul_red
        vpclmulqdq	$16, %xmm5, %xmm6, %xmm2
        vpclmulqdq	$0x01, %xmm5, %xmm6, %xmm1
        vpclmulqdq	$0x00, %xmm5, %xmm6, %xmm0
        vpxor	%xmm1, %xmm2, %xmm2
        vpslldq	$8, %xmm2, %xmm1
        vpsrldq	$8, %xmm2, %xmm2
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$0x11, %xmm5, %xmm6, %xmm6
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm2, %xmm6, %xmm6
        vpxor	%xmm1, %xmm6, %xmm6
        vpxor	%xmm0, %xmm6, %xmm6
L_AES_GCM_encrypt_avx2_last_block_done:
        movl	152(%esp), %ecx
        movl	152(%esp), %edx
        andl	$15, %ecx
        jz	L_AES_GCM_encrypt_avx2_done_enc
        # aesenc_last15_enc
        vpshufb	L_aes_gcm_avx2_bswap_epi64, %xmm4, %xmm4
        vpxor	(%ebp), %xmm4, %xmm4
        vaesenc	16(%ebp), %xmm4, %xmm4
        vaesenc	32(%ebp), %xmm4, %xmm4
        vaesenc	48(%ebp), %xmm4, %xmm4
        vaesenc	64(%ebp), %xmm4, %xmm4
        vaesenc	80(%ebp), %xmm4, %xmm4
        vaesenc	96(%ebp), %xmm4, %xmm4
        vaesenc	112(%ebp), %xmm4, %xmm4
        vaesenc	128(%ebp), %xmm4, %xmm4
        vaesenc	144(%ebp), %xmm4, %xmm4
        cmpl	$11, 172(%esp)
        vmovdqu	160(%ebp), %xmm0
        jl	L_AES_GCM_encrypt_avx2_aesenc_last15_enc_avx_aesenc_avx_last
        vaesenc	%xmm0, %xmm4, %xmm4
        vaesenc	176(%ebp), %xmm4, %xmm4
        cmpl	$13, 172(%esp)
        vmovdqu	192(%ebp), %xmm0
        jl	L_AES_GCM_encrypt_avx2_aesenc_last15_enc_avx_aesenc_avx_last
        vaesenc	%xmm0, %xmm4, %xmm4
        vaesenc	208(%ebp), %xmm4, %xmm4
        vmovdqu	224(%ebp), %xmm0
L_AES_GCM_encrypt_avx2_aesenc_last15_enc_avx_aesenc_avx_last:
        vaesenclast	%xmm0, %xmm4, %xmm4
        xorl	%ecx, %ecx
        vpxor	%xmm0, %xmm0, %xmm0
        vmovdqu	%xmm4, (%esp)
        vmovdqu	%xmm0, 16(%esp)
L_AES_GCM_encrypt_avx2_aesenc_last15_enc_avx_loop:
        movzbl	(%esi,%ebx,1), %eax
        xorb	(%esp,%ecx,1), %al
        movb	%al, 16(%esp,%ecx,1)
        movb	%al, (%edi,%ebx,1)
        incl	%ebx
        incl	%ecx
        cmpl	%edx, %ebx
        jl	L_AES_GCM_encrypt_avx2_aesenc_last15_enc_avx_loop
L_AES_GCM_encrypt_avx2_aesenc_last15_enc_avx_finish_enc:
        vmovdqu	16(%esp), %xmm4
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm4, %xmm6, %xmm6
        # ghash_gfmul_red
        vpclmulqdq	$16, %xmm5, %xmm6, %xmm2
        vpclmulqdq	$0x01, %xmm5, %xmm6, %xmm1
        vpclmulqdq	$0x00, %xmm5, %xmm6, %xmm0
        vpxor	%xmm1, %xmm2, %xmm2
        vpslldq	$8, %xmm2, %xmm1
        vpsrldq	$8, %xmm2, %xmm2
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$0x11, %xmm5, %xmm6, %xmm6
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm2, %xmm6, %xmm6
        vpxor	%xmm1, %xmm6, %xmm6
        vpxor	%xmm0, %xmm6, %xmm6
L_AES_GCM_encrypt_avx2_done_enc:
        vmovdqu	80(%esp), %xmm7
        # calc_tag
        movl	152(%esp), %ecx
        shll	$3, %ecx
        vpinsrd	$0x00, %ecx, %xmm0, %xmm0
        movl	156(%esp), %ecx
        shll	$3, %ecx
        vpinsrd	$2, %ecx, %xmm0, %xmm0
        movl	152(%esp), %ecx
        shrl	$29, %ecx
        vpinsrd	$0x01, %ecx, %xmm0, %xmm0
        movl	156(%esp), %ecx
        shrl	$29, %ecx
        vpinsrd	$3, %ecx, %xmm0, %xmm0
        vpxor	%xmm6, %xmm0, %xmm0
        # ghash_gfmul_red
        vpclmulqdq	$16, %xmm5, %xmm0, %xmm4
        vpclmulqdq	$0x01, %xmm5, %xmm0, %xmm3
        vpclmulqdq	$0x00, %xmm5, %xmm0, %xmm2
        vpxor	%xmm3, %xmm4, %xmm4
        vpslldq	$8, %xmm4, %xmm3
        vpsrldq	$8, %xmm4, %xmm4
        vpxor	%xmm2, %xmm3, %xmm3
        vpclmulqdq	$0x11, %xmm5, %xmm0, %xmm0
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm3, %xmm2
        vpshufd	$0x4e, %xmm3, %xmm3
        vpxor	%xmm2, %xmm3, %xmm3
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm3, %xmm2
        vpshufd	$0x4e, %xmm3, %xmm3
        vpxor	%xmm4, %xmm0, %xmm0
        vpxor	%xmm3, %xmm0, %xmm0
        vpxor	%xmm2, %xmm0, %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm7, %xmm0, %xmm0
        movl	148(%esp), %edi
        movl	164(%esp), %ebx
        # store_tag
        cmpl	$16, %ebx
        je	L_AES_GCM_encrypt_avx2_store_tag_16
        xorl	%ecx, %ecx
        vmovdqu	%xmm0, (%esp)
L_AES_GCM_encrypt_avx2_store_tag_loop:
        movzbl	(%esp,%ecx,1), %eax
        movb	%al, (%edi,%ecx,1)
        incl	%ecx
        cmpl	%ebx, %ecx
        jne	L_AES_GCM_encrypt_avx2_store_tag_loop
        jmp	L_AES_GCM_encrypt_avx2_store_tag_done
L_AES_GCM_encrypt_avx2_store_tag_16:
        vmovdqu	%xmm0, (%edi)
L_AES_GCM_encrypt_avx2_store_tag_done:
        addl	$0x70, %esp
        popl	%ebp
        popl	%edi
        popl	%esi
        popl	%ebx
        ret
.size	AES_GCM_encrypt_avx2,.-AES_GCM_encrypt_avx2
.text
.globl	AES_GCM_decrypt_avx2
.type	AES_GCM_decrypt_avx2,@function
.align	16
AES_GCM_decrypt_avx2:
        pushl	%ebx
        pushl	%esi
        pushl	%edi
        pushl	%ebp
        subl	$0xb0, %esp
        movl	208(%esp), %esi
        movl	232(%esp), %ebp
        vpxor	%xmm4, %xmm4, %xmm4
        movl	224(%esp), %edx
        cmpl	$12, %edx
        je	L_AES_GCM_decrypt_avx2_iv_12
        # Calculate values when IV is not 12 bytes
        # H = Encrypt X(=0)
        vmovdqu	(%ebp), %xmm5
        vaesenc	16(%ebp), %xmm5, %xmm5
        vaesenc	32(%ebp), %xmm5, %xmm5
        vaesenc	48(%ebp), %xmm5, %xmm5
        vaesenc	64(%ebp), %xmm5, %xmm5
        vaesenc	80(%ebp), %xmm5, %xmm5
        vaesenc	96(%ebp), %xmm5, %xmm5
        vaesenc	112(%ebp), %xmm5, %xmm5
        vaesenc	128(%ebp), %xmm5, %xmm5
        vaesenc	144(%ebp), %xmm5, %xmm5
        cmpl	$11, 236(%esp)
        vmovdqu	160(%ebp), %xmm0
        jl	L_AES_GCM_decrypt_avx2_calc_iv_1_aesenc_avx_last
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	176(%ebp), %xmm5, %xmm5
        cmpl	$13, 236(%esp)
        vmovdqu	192(%ebp), %xmm0
        jl	L_AES_GCM_decrypt_avx2_calc_iv_1_aesenc_avx_last
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	208(%ebp), %xmm5, %xmm5
        vmovdqu	224(%ebp), %xmm0
L_AES_GCM_decrypt_avx2_calc_iv_1_aesenc_avx_last:
        vaesenclast	%xmm0, %xmm5, %xmm5
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm5, %xmm5
        # Calc counter
        # Initialization vector
        cmpl	$0x00, %edx
        movl	$0x00, %ecx
        je	L_AES_GCM_decrypt_avx2_calc_iv_done
        cmpl	$16, %edx
        jl	L_AES_GCM_decrypt_avx2_calc_iv_lt16
        andl	$0xfffffff0, %edx
L_AES_GCM_decrypt_avx2_calc_iv_16_loop:
        vmovdqu	(%esi,%ecx,1), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm0, %xmm4, %xmm4
        # ghash_gfmul_avx
        vpclmulqdq	$16, %xmm4, %xmm5, %xmm2
        vpclmulqdq	$0x01, %xmm4, %xmm5, %xmm1
        vpclmulqdq	$0x00, %xmm4, %xmm5, %xmm0
        vpclmulqdq	$0x11, %xmm4, %xmm5, %xmm3
        vpxor	%xmm1, %xmm2, %xmm2
        vpslldq	$8, %xmm2, %xmm1
        vpsrldq	$8, %xmm2, %xmm2
        vpxor	%xmm1, %xmm0, %xmm7
        vpxor	%xmm2, %xmm3, %xmm4
        # ghash_mid
        vpsrld	$31, %xmm7, %xmm0
        vpsrld	$31, %xmm4, %xmm1
        vpslld	$0x01, %xmm7, %xmm7
        vpslld	$0x01, %xmm4, %xmm4
        vpsrldq	$12, %xmm0, %xmm2
        vpslldq	$4, %xmm0, %xmm0
        vpslldq	$4, %xmm1, %xmm1
        vpor	%xmm2, %xmm4, %xmm4
        vpor	%xmm0, %xmm7, %xmm7
        vpor	%xmm1, %xmm4, %xmm4
        # ghash_red
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm2
        vpclmulqdq	$16, %xmm2, %xmm7, %xmm0
        vpshufd	$0x4e, %xmm7, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$16, %xmm2, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm4, %xmm4
        addl	$16, %ecx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_decrypt_avx2_calc_iv_16_loop
        movl	224(%esp), %edx
        cmpl	%edx, %ecx
        je	L_AES_GCM_decrypt_avx2_calc_iv_done
L_AES_GCM_decrypt_avx2_calc_iv_lt16:
        vpxor	%xmm0, %xmm0, %xmm0
        xorl	%ebx, %ebx
        vmovdqu	%xmm0, (%esp)
L_AES_GCM_decrypt_avx2_calc_iv_loop:
        movzbl	(%esi,%ecx,1), %eax
        movb	%al, (%esp,%ebx,1)
        incl	%ecx
        incl	%ebx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_decrypt_avx2_calc_iv_loop
        vmovdqu	(%esp), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm0, %xmm4, %xmm4
        # ghash_gfmul_avx
        vpclmulqdq	$16, %xmm4, %xmm5, %xmm2
        vpclmulqdq	$0x01, %xmm4, %xmm5, %xmm1
        vpclmulqdq	$0x00, %xmm4, %xmm5, %xmm0
        vpclmulqdq	$0x11, %xmm4, %xmm5, %xmm3
        vpxor	%xmm1, %xmm2, %xmm2
        vpslldq	$8, %xmm2, %xmm1
        vpsrldq	$8, %xmm2, %xmm2
        vpxor	%xmm1, %xmm0, %xmm7
        vpxor	%xmm2, %xmm3, %xmm4
        # ghash_mid
        vpsrld	$31, %xmm7, %xmm0
        vpsrld	$31, %xmm4, %xmm1
        vpslld	$0x01, %xmm7, %xmm7
        vpslld	$0x01, %xmm4, %xmm4
        vpsrldq	$12, %xmm0, %xmm2
        vpslldq	$4, %xmm0, %xmm0
        vpslldq	$4, %xmm1, %xmm1
        vpor	%xmm2, %xmm4, %xmm4
        vpor	%xmm0, %xmm7, %xmm7
        vpor	%xmm1, %xmm4, %xmm4
        # ghash_red
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm2
        vpclmulqdq	$16, %xmm2, %xmm7, %xmm0
        vpshufd	$0x4e, %xmm7, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$16, %xmm2, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm4, %xmm4
L_AES_GCM_decrypt_avx2_calc_iv_done:
        # T = Encrypt counter
        vpxor	%xmm0, %xmm0, %xmm0
        shll	$3, %edx
        vpinsrd	$0x00, %edx, %xmm0, %xmm0
        vpxor	%xmm0, %xmm4, %xmm4
        # ghash_gfmul_avx
        vpclmulqdq	$16, %xmm4, %xmm5, %xmm2
        vpclmulqdq	$0x01, %xmm4, %xmm5, %xmm1
        vpclmulqdq	$0x00, %xmm4, %xmm5, %xmm0
        vpclmulqdq	$0x11, %xmm4, %xmm5, %xmm3
        vpxor	%xmm1, %xmm2, %xmm2
        vpslldq	$8, %xmm2, %xmm1
        vpsrldq	$8, %xmm2, %xmm2
        vpxor	%xmm1, %xmm0, %xmm7
        vpxor	%xmm2, %xmm3, %xmm4
        # ghash_mid
        vpsrld	$31, %xmm7, %xmm0
        vpsrld	$31, %xmm4, %xmm1
        vpslld	$0x01, %xmm7, %xmm7
        vpslld	$0x01, %xmm4, %xmm4
        vpsrldq	$12, %xmm0, %xmm2
        vpslldq	$4, %xmm0, %xmm0
        vpslldq	$4, %xmm1, %xmm1
        vpor	%xmm2, %xmm4, %xmm4
        vpor	%xmm0, %xmm7, %xmm7
        vpor	%xmm1, %xmm4, %xmm4
        # ghash_red
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm2
        vpclmulqdq	$16, %xmm2, %xmm7, %xmm0
        vpshufd	$0x4e, %xmm7, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$16, %xmm2, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm4, %xmm4
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm4, %xmm4
        #   Encrypt counter
        vmovdqu	(%ebp), %xmm6
        vpxor	%xmm4, %xmm6, %xmm6
        vaesenc	16(%ebp), %xmm6, %xmm6
        vaesenc	32(%ebp), %xmm6, %xmm6
        vaesenc	48(%ebp), %xmm6, %xmm6
        vaesenc	64(%ebp), %xmm6, %xmm6
        vaesenc	80(%ebp), %xmm6, %xmm6
        vaesenc	96(%ebp), %xmm6, %xmm6
        vaesenc	112(%ebp), %xmm6, %xmm6
        vaesenc	128(%ebp), %xmm6, %xmm6
        vaesenc	144(%ebp), %xmm6, %xmm6
        cmpl	$11, 236(%esp)
        vmovdqu	160(%ebp), %xmm0
        jl	L_AES_GCM_decrypt_avx2_calc_iv_2_aesenc_avx_last
        vaesenc	%xmm0, %xmm6, %xmm6
        vaesenc	176(%ebp), %xmm6, %xmm6
        cmpl	$13, 236(%esp)
        vmovdqu	192(%ebp), %xmm0
        jl	L_AES_GCM_decrypt_avx2_calc_iv_2_aesenc_avx_last
        vaesenc	%xmm0, %xmm6, %xmm6
        vaesenc	208(%ebp), %xmm6, %xmm6
        vmovdqu	224(%ebp), %xmm0
L_AES_GCM_decrypt_avx2_calc_iv_2_aesenc_avx_last:
        vaesenclast	%xmm0, %xmm6, %xmm6
        jmp	L_AES_GCM_decrypt_avx2_iv_done
L_AES_GCM_decrypt_avx2_iv_12:
        # # Calculate values when IV is 12 bytes
        # Set counter based on IV
        vmovdqu	L_avx2_aes_gcm_bswap_one, %xmm4
        vmovdqu	(%ebp), %xmm5
        vpblendd	$7, (%esi), %xmm4, %xmm4
        # H = Encrypt X(=0) and T = Encrypt counter
        vmovdqu	16(%ebp), %xmm7
        vpxor	%xmm5, %xmm4, %xmm6
        vaesenc	%xmm7, %xmm5, %xmm5
        vaesenc	%xmm7, %xmm6, %xmm6
        vmovdqu	32(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        vmovdqu	48(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        vmovdqu	64(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        vmovdqu	80(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        vmovdqu	96(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        vmovdqu	112(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        vmovdqu	128(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        vmovdqu	144(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        cmpl	$11, 236(%esp)
        vmovdqu	160(%ebp), %xmm0
        jl	L_AES_GCM_decrypt_avx2_calc_iv_12_last
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        vmovdqu	176(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        cmpl	$13, 236(%esp)
        vmovdqu	192(%ebp), %xmm0
        jl	L_AES_GCM_decrypt_avx2_calc_iv_12_last
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        vmovdqu	208(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm6, %xmm6
        vmovdqu	224(%ebp), %xmm0
L_AES_GCM_decrypt_avx2_calc_iv_12_last:
        vaesenclast	%xmm0, %xmm5, %xmm5
        vaesenclast	%xmm0, %xmm6, %xmm6
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm5, %xmm5
L_AES_GCM_decrypt_avx2_iv_done:
        vmovdqu	%xmm6, 80(%esp)
        vpxor	%xmm6, %xmm6, %xmm6
        movl	204(%esp), %esi
        # Additional authentication data
        movl	220(%esp), %edx
        cmpl	$0x00, %edx
        je	L_AES_GCM_decrypt_avx2_calc_aad_done
        xorl	%ecx, %ecx
        cmpl	$16, %edx
        jl	L_AES_GCM_decrypt_avx2_calc_aad_lt16
        andl	$0xfffffff0, %edx
L_AES_GCM_decrypt_avx2_calc_aad_16_loop:
        vmovdqu	(%esi,%ecx,1), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm0, %xmm6, %xmm6
        # ghash_gfmul_avx
        vpclmulqdq	$16, %xmm6, %xmm5, %xmm2
        vpclmulqdq	$0x01, %xmm6, %xmm5, %xmm1
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm0
        vpclmulqdq	$0x11, %xmm6, %xmm5, %xmm3
        vpxor	%xmm1, %xmm2, %xmm2
        vpslldq	$8, %xmm2, %xmm1
        vpsrldq	$8, %xmm2, %xmm2
        vpxor	%xmm1, %xmm0, %xmm7
        vpxor	%xmm2, %xmm3, %xmm6
        # ghash_mid
        vpsrld	$31, %xmm7, %xmm0
        vpsrld	$31, %xmm6, %xmm1
        vpslld	$0x01, %xmm7, %xmm7
        vpslld	$0x01, %xmm6, %xmm6
        vpsrldq	$12, %xmm0, %xmm2
        vpslldq	$4, %xmm0, %xmm0
        vpslldq	$4, %xmm1, %xmm1
        vpor	%xmm2, %xmm6, %xmm6
        vpor	%xmm0, %xmm7, %xmm7
        vpor	%xmm1, %xmm6, %xmm6
        # ghash_red
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm2
        vpclmulqdq	$16, %xmm2, %xmm7, %xmm0
        vpshufd	$0x4e, %xmm7, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$16, %xmm2, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm6, %xmm6
        addl	$16, %ecx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_decrypt_avx2_calc_aad_16_loop
        movl	220(%esp), %edx
        cmpl	%edx, %ecx
        je	L_AES_GCM_decrypt_avx2_calc_aad_done
L_AES_GCM_decrypt_avx2_calc_aad_lt16:
        vpxor	%xmm0, %xmm0, %xmm0
        xorl	%ebx, %ebx
        vmovdqu	%xmm0, (%esp)
L_AES_GCM_decrypt_avx2_calc_aad_loop:
        movzbl	(%esi,%ecx,1), %eax
        movb	%al, (%esp,%ebx,1)
        incl	%ecx
        incl	%ebx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_decrypt_avx2_calc_aad_loop
        vmovdqu	(%esp), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm0, %xmm6, %xmm6
        # ghash_gfmul_avx
        vpclmulqdq	$16, %xmm6, %xmm5, %xmm2
        vpclmulqdq	$0x01, %xmm6, %xmm5, %xmm1
        vpclmulqdq	$0x00, %xmm6, %xmm5, %xmm0
        vpclmulqdq	$0x11, %xmm6, %xmm5, %xmm3
        vpxor	%xmm1, %xmm2, %xmm2
        vpslldq	$8, %xmm2, %xmm1
        vpsrldq	$8, %xmm2, %xmm2
        vpxor	%xmm1, %xmm0, %xmm7
        vpxor	%xmm2, %xmm3, %xmm6
        # ghash_mid
        vpsrld	$31, %xmm7, %xmm0
        vpsrld	$31, %xmm6, %xmm1
        vpslld	$0x01, %xmm7, %xmm7
        vpslld	$0x01, %xmm6, %xmm6
        vpsrldq	$12, %xmm0, %xmm2
        vpslldq	$4, %xmm0, %xmm0
        vpslldq	$4, %xmm1, %xmm1
        vpor	%xmm2, %xmm6, %xmm6
        vpor	%xmm0, %xmm7, %xmm7
        vpor	%xmm1, %xmm6, %xmm6
        # ghash_red
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm2
        vpclmulqdq	$16, %xmm2, %xmm7, %xmm0
        vpshufd	$0x4e, %xmm7, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$16, %xmm2, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm6, %xmm6
L_AES_GCM_decrypt_avx2_calc_aad_done:
        movl	196(%esp), %esi
        movl	200(%esp), %edi
        # Calculate counter and H
        vpsrlq	$63, %xmm5, %xmm1
        vpsllq	$0x01, %xmm5, %xmm0
        vpslldq	$8, %xmm1, %xmm1
        vpor	%xmm1, %xmm0, %xmm0
        vpshufd	$0xff, %xmm5, %xmm5
        vpsrad	$31, %xmm5, %xmm5
        vpshufb	L_aes_gcm_avx2_bswap_epi64, %xmm4, %xmm4
        vpand	L_aes_gcm_avx2_mod2_128, %xmm5, %xmm5
        vpaddd	L_aes_gcm_avx2_one, %xmm4, %xmm4
        vpxor	%xmm0, %xmm5, %xmm5
        xorl	%ebx, %ebx
        cmpl	$0x40, 216(%esp)
        movl	216(%esp), %eax
        jl	L_AES_GCM_decrypt_avx2_done_64
        andl	$0xffffffc0, %eax
        vmovdqu	%xmm4, 64(%esp)
        vmovdqu	%xmm6, 96(%esp)
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm3
        # H ^ 1
        vmovdqu	%xmm5, (%esp)
        vmovdqu	%xmm5, %xmm2
        # H ^ 2
        vpclmulqdq	$0x00, %xmm2, %xmm2, %xmm5
        vpclmulqdq	$0x11, %xmm2, %xmm2, %xmm6
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm5, %xmm6, %xmm0
        vmovdqu	%xmm0, 16(%esp)
        # H ^ 3
        # ghash_gfmul_red
        vpclmulqdq	$16, %xmm0, %xmm2, %xmm6
        vpclmulqdq	$0x01, %xmm0, %xmm2, %xmm5
        vpclmulqdq	$0x00, %xmm0, %xmm2, %xmm4
        vpxor	%xmm5, %xmm6, %xmm6
        vpslldq	$8, %xmm6, %xmm5
        vpsrldq	$8, %xmm6, %xmm6
        vpxor	%xmm4, %xmm5, %xmm5
        vpclmulqdq	$0x11, %xmm0, %xmm2, %xmm1
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm6, %xmm1, %xmm1
        vpxor	%xmm5, %xmm1, %xmm1
        vpxor	%xmm4, %xmm1, %xmm1
        vmovdqu	%xmm1, 32(%esp)
        # H ^ 4
        vpclmulqdq	$0x00, %xmm0, %xmm0, %xmm5
        vpclmulqdq	$0x11, %xmm0, %xmm0, %xmm6
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm5, %xmm6, %xmm2
        vmovdqu	%xmm2, 48(%esp)
        vmovdqu	96(%esp), %xmm6
        cmpl	%esi, %edi
        jne	L_AES_GCM_decrypt_avx2_ghash_64
L_AES_GCM_decrypt_avx2_ghash_64_inplace:
        # aesenc_64_ghash
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        # aesenc_64
        # aesenc_ctr
        vmovdqu	64(%esp), %xmm4
        vmovdqu	L_aes_gcm_avx2_bswap_epi64, %xmm7
        vpaddd	L_aes_gcm_avx2_one, %xmm4, %xmm1
        vpshufb	%xmm7, %xmm4, %xmm0
        vpaddd	L_aes_gcm_avx2_two, %xmm4, %xmm2
        vpshufb	%xmm7, %xmm1, %xmm1
        vpaddd	L_aes_gcm_avx2_three, %xmm4, %xmm3
        vpshufb	%xmm7, %xmm2, %xmm2
        vpaddd	L_aes_gcm_avx2_four, %xmm4, %xmm4
        vpshufb	%xmm7, %xmm3, %xmm3
        # aesenc_xor
        vmovdqu	(%ebp), %xmm7
        vmovdqu	%xmm4, 64(%esp)
        vpxor	%xmm7, %xmm0, %xmm0
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm7, %xmm3, %xmm3
        vmovdqu	16(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	32(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	48(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	64(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	80(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	96(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	112(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	128(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	144(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$11, 236(%esp)
        vmovdqu	160(%ebp), %xmm7
        jl	L_AES_GCM_decrypt_avx2_inplace_aesenc_64_ghash_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	176(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$13, 236(%esp)
        vmovdqu	192(%ebp), %xmm7
        jl	L_AES_GCM_decrypt_avx2_inplace_aesenc_64_ghash_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	208(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	224(%ebp), %xmm7
L_AES_GCM_decrypt_avx2_inplace_aesenc_64_ghash_aesenc_64_enc_done:
        # aesenc_last
        vaesenclast	%xmm7, %xmm0, %xmm0
        vaesenclast	%xmm7, %xmm1, %xmm1
        vaesenclast	%xmm7, %xmm2, %xmm2
        vaesenclast	%xmm7, %xmm3, %xmm3
        vmovdqu	(%ecx), %xmm7
        vmovdqu	16(%ecx), %xmm4
        vpxor	%xmm7, %xmm0, %xmm0
        vpxor	%xmm4, %xmm1, %xmm1
        vmovdqu	%xmm7, 112(%esp)
        vmovdqu	%xmm4, 128(%esp)
        vmovdqu	%xmm0, (%edx)
        vmovdqu	%xmm1, 16(%edx)
        vmovdqu	32(%ecx), %xmm7
        vmovdqu	48(%ecx), %xmm4
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm4, %xmm3, %xmm3
        vmovdqu	%xmm7, 144(%esp)
        vmovdqu	%xmm4, 160(%esp)
        vmovdqu	%xmm2, 32(%edx)
        vmovdqu	%xmm3, 48(%edx)
        # pclmul_1
        vmovdqu	112(%esp), %xmm1
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vmovdqu	48(%esp), %xmm2
        vpxor	%xmm6, %xmm1, %xmm1
        vpclmulqdq	$16, %xmm2, %xmm1, %xmm5
        vpclmulqdq	$0x01, %xmm2, %xmm1, %xmm3
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm6
        vpclmulqdq	$0x11, %xmm2, %xmm1, %xmm7
        # pclmul_2
        vmovdqu	128(%esp), %xmm1
        vmovdqu	32(%esp), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vpxor	%xmm3, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm0, %xmm1, %xmm2
        vpclmulqdq	$0x01, %xmm0, %xmm1, %xmm3
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm7, %xmm7
        # pclmul_n
        vmovdqu	144(%esp), %xmm1
        vmovdqu	16(%esp), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vpxor	%xmm2, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm0, %xmm1, %xmm2
        vpxor	%xmm3, %xmm5, %xmm5
        vpclmulqdq	$0x01, %xmm0, %xmm1, %xmm3
        vpxor	%xmm4, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm7, %xmm7
        # pclmul_n
        vmovdqu	160(%esp), %xmm1
        vmovdqu	(%esp), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vpxor	%xmm2, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm0, %xmm1, %xmm2
        vpxor	%xmm3, %xmm5, %xmm5
        vpclmulqdq	$0x01, %xmm0, %xmm1, %xmm3
        vpxor	%xmm4, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm7, %xmm7
        # aesenc_pclmul_l
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm4, %xmm6, %xmm6
        vpxor	%xmm3, %xmm5, %xmm5
        vpslldq	$8, %xmm5, %xmm1
        vpsrldq	$8, %xmm5, %xmm5
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm0
        vpxor	%xmm1, %xmm6, %xmm6
        vpxor	%xmm5, %xmm7, %xmm7
        vpclmulqdq	$16, %xmm0, %xmm6, %xmm3
        vpshufd	$0x4e, %xmm6, %xmm6
        vpxor	%xmm3, %xmm6, %xmm6
        vpclmulqdq	$16, %xmm0, %xmm6, %xmm3
        vpshufd	$0x4e, %xmm6, %xmm6
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm7, %xmm6, %xmm6
        # aesenc_64_ghash - end
        addl	$0x40, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_decrypt_avx2_ghash_64_inplace
        jmp	L_AES_GCM_decrypt_avx2_ghash_64_done
L_AES_GCM_decrypt_avx2_ghash_64:
        # aesenc_64_ghash
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        # aesenc_64
        # aesenc_ctr
        vmovdqu	64(%esp), %xmm4
        vmovdqu	L_aes_gcm_avx2_bswap_epi64, %xmm7
        vpaddd	L_aes_gcm_avx2_one, %xmm4, %xmm1
        vpshufb	%xmm7, %xmm4, %xmm0
        vpaddd	L_aes_gcm_avx2_two, %xmm4, %xmm2
        vpshufb	%xmm7, %xmm1, %xmm1
        vpaddd	L_aes_gcm_avx2_three, %xmm4, %xmm3
        vpshufb	%xmm7, %xmm2, %xmm2
        vpaddd	L_aes_gcm_avx2_four, %xmm4, %xmm4
        vpshufb	%xmm7, %xmm3, %xmm3
        # aesenc_xor
        vmovdqu	(%ebp), %xmm7
        vmovdqu	%xmm4, 64(%esp)
        vpxor	%xmm7, %xmm0, %xmm0
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm7, %xmm3, %xmm3
        vmovdqu	16(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	32(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	48(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	64(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	80(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	96(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	112(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	128(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	144(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$11, 236(%esp)
        vmovdqu	160(%ebp), %xmm7
        jl	L_AES_GCM_decrypt_avx2_aesenc_64_ghash_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	176(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$13, 236(%esp)
        vmovdqu	192(%ebp), %xmm7
        jl	L_AES_GCM_decrypt_avx2_aesenc_64_ghash_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	208(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	224(%ebp), %xmm7
L_AES_GCM_decrypt_avx2_aesenc_64_ghash_aesenc_64_enc_done:
        # aesenc_last
        vaesenclast	%xmm7, %xmm0, %xmm0
        vaesenclast	%xmm7, %xmm1, %xmm1
        vaesenclast	%xmm7, %xmm2, %xmm2
        vaesenclast	%xmm7, %xmm3, %xmm3
        vmovdqu	(%ecx), %xmm7
        vmovdqu	16(%ecx), %xmm4
        vpxor	%xmm7, %xmm0, %xmm0
        vpxor	%xmm4, %xmm1, %xmm1
        vmovdqu	%xmm7, (%ecx)
        vmovdqu	%xmm4, 16(%ecx)
        vmovdqu	%xmm0, (%edx)
        vmovdqu	%xmm1, 16(%edx)
        vmovdqu	32(%ecx), %xmm7
        vmovdqu	48(%ecx), %xmm4
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm4, %xmm3, %xmm3
        vmovdqu	%xmm7, 32(%ecx)
        vmovdqu	%xmm4, 48(%ecx)
        vmovdqu	%xmm2, 32(%edx)
        vmovdqu	%xmm3, 48(%edx)
        # pclmul_1
        vmovdqu	(%ecx), %xmm1
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vmovdqu	48(%esp), %xmm2
        vpxor	%xmm6, %xmm1, %xmm1
        vpclmulqdq	$16, %xmm2, %xmm1, %xmm5
        vpclmulqdq	$0x01, %xmm2, %xmm1, %xmm3
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm6
        vpclmulqdq	$0x11, %xmm2, %xmm1, %xmm7
        # pclmul_2
        vmovdqu	16(%ecx), %xmm1
        vmovdqu	32(%esp), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vpxor	%xmm3, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm0, %xmm1, %xmm2
        vpclmulqdq	$0x01, %xmm0, %xmm1, %xmm3
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm7, %xmm7
        # pclmul_n
        vmovdqu	32(%ecx), %xmm1
        vmovdqu	16(%esp), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vpxor	%xmm2, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm0, %xmm1, %xmm2
        vpxor	%xmm3, %xmm5, %xmm5
        vpclmulqdq	$0x01, %xmm0, %xmm1, %xmm3
        vpxor	%xmm4, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm7, %xmm7
        # pclmul_n
        vmovdqu	48(%ecx), %xmm1
        vmovdqu	(%esp), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vpxor	%xmm2, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm0, %xmm1, %xmm2
        vpxor	%xmm3, %xmm5, %xmm5
        vpclmulqdq	$0x01, %xmm0, %xmm1, %xmm3
        vpxor	%xmm4, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm7, %xmm7
        # aesenc_pclmul_l
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm4, %xmm6, %xmm6
        vpxor	%xmm3, %xmm5, %xmm5
        vpslldq	$8, %xmm5, %xmm1
        vpsrldq	$8, %xmm5, %xmm5
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm0
        vpxor	%xmm1, %xmm6, %xmm6
        vpxor	%xmm5, %xmm7, %xmm7
        vpclmulqdq	$16, %xmm0, %xmm6, %xmm3
        vpshufd	$0x4e, %xmm6, %xmm6
        vpxor	%xmm3, %xmm6, %xmm6
        vpclmulqdq	$16, %xmm0, %xmm6, %xmm3
        vpshufd	$0x4e, %xmm6, %xmm6
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm7, %xmm6, %xmm6
        # aesenc_64_ghash - end
        addl	$0x40, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_decrypt_avx2_ghash_64
L_AES_GCM_decrypt_avx2_ghash_64_done:
        vmovdqu	(%esp), %xmm5
        vmovdqu	64(%esp), %xmm4
L_AES_GCM_decrypt_avx2_done_64:
        cmpl	216(%esp), %ebx
        jge	L_AES_GCM_decrypt_avx2_done_dec
        movl	216(%esp), %eax
        andl	$0xfffffff0, %eax
        cmpl	%eax, %ebx
        jge	L_AES_GCM_decrypt_avx2_last_block_done
L_AES_GCM_decrypt_avx2_last_block_start:
        vmovdqu	(%esi,%ebx,1), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_epi64, %xmm4, %xmm7
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
        vpaddd	L_aes_gcm_avx2_one, %xmm4, %xmm4
        vmovdqu	%xmm4, 64(%esp)
        vpxor	%xmm6, %xmm0, %xmm4
        # aesenc_gfmul_sb
        vpclmulqdq	$0x01, %xmm5, %xmm4, %xmm2
        vpclmulqdq	$16, %xmm5, %xmm4, %xmm3
        vpclmulqdq	$0x00, %xmm5, %xmm4, %xmm1
        vpclmulqdq	$0x11, %xmm5, %xmm4, %xmm4
        vpxor	(%ebp), %xmm7, %xmm7
        vaesenc	16(%ebp), %xmm7, %xmm7
        vpxor	%xmm2, %xmm3, %xmm3
        vpslldq	$8, %xmm3, %xmm2
        vpsrldq	$8, %xmm3, %xmm3
        vaesenc	32(%ebp), %xmm7, %xmm7
        vpxor	%xmm1, %xmm2, %xmm2
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm2, %xmm1
        vaesenc	48(%ebp), %xmm7, %xmm7
        vaesenc	64(%ebp), %xmm7, %xmm7
        vaesenc	80(%ebp), %xmm7, %xmm7
        vpshufd	$0x4e, %xmm2, %xmm2
        vpxor	%xmm1, %xmm2, %xmm2
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm2, %xmm1
        vaesenc	96(%ebp), %xmm7, %xmm7
        vaesenc	112(%ebp), %xmm7, %xmm7
        vaesenc	128(%ebp), %xmm7, %xmm7
        vpshufd	$0x4e, %xmm2, %xmm2
        vaesenc	144(%ebp), %xmm7, %xmm7
        vpxor	%xmm3, %xmm4, %xmm4
        vpxor	%xmm4, %xmm2, %xmm2
        vmovdqu	160(%ebp), %xmm0
        cmpl	$11, 236(%esp)
        jl	L_AES_GCM_decrypt_avx2_aesenc_gfmul_sb_last
        vaesenc	%xmm0, %xmm7, %xmm7
        vaesenc	176(%ebp), %xmm7, %xmm7
        vmovdqu	192(%ebp), %xmm0
        cmpl	$13, 236(%esp)
        jl	L_AES_GCM_decrypt_avx2_aesenc_gfmul_sb_last
        vaesenc	%xmm0, %xmm7, %xmm7
        vaesenc	208(%ebp), %xmm7, %xmm7
        vmovdqu	224(%ebp), %xmm0
L_AES_GCM_decrypt_avx2_aesenc_gfmul_sb_last:
        vaesenclast	%xmm0, %xmm7, %xmm7
        vmovdqu	(%esi,%ebx,1), %xmm3
        vpxor	%xmm1, %xmm2, %xmm6
        vpxor	%xmm3, %xmm7, %xmm7
        vmovdqu	%xmm7, (%edi,%ebx,1)
        vmovdqu	64(%esp), %xmm4
        addl	$16, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_decrypt_avx2_last_block_start
L_AES_GCM_decrypt_avx2_last_block_done:
        movl	216(%esp), %ecx
        movl	216(%esp), %edx
        andl	$15, %ecx
        jz	L_AES_GCM_decrypt_avx2_done_dec
        # aesenc_last15_dec
        vpshufb	L_aes_gcm_avx2_bswap_epi64, %xmm4, %xmm4
        vpxor	(%ebp), %xmm4, %xmm4
        vaesenc	16(%ebp), %xmm4, %xmm4
        vaesenc	32(%ebp), %xmm4, %xmm4
        vaesenc	48(%ebp), %xmm4, %xmm4
        vaesenc	64(%ebp), %xmm4, %xmm4
        vaesenc	80(%ebp), %xmm4, %xmm4
        vaesenc	96(%ebp), %xmm4, %xmm4
        vaesenc	112(%ebp), %xmm4, %xmm4
        vaesenc	128(%ebp), %xmm4, %xmm4
        vaesenc	144(%ebp), %xmm4, %xmm4
        cmpl	$11, 236(%esp)
        vmovdqu	160(%ebp), %xmm1
        jl	L_AES_GCM_decrypt_avx2_aesenc_last15_dec_avx_aesenc_avx_last
        vaesenc	%xmm1, %xmm4, %xmm4
        vaesenc	176(%ebp), %xmm4, %xmm4
        cmpl	$13, 236(%esp)
        vmovdqu	192(%ebp), %xmm1
        jl	L_AES_GCM_decrypt_avx2_aesenc_last15_dec_avx_aesenc_avx_last
        vaesenc	%xmm1, %xmm4, %xmm4
        vaesenc	208(%ebp), %xmm4, %xmm4
        vmovdqu	224(%ebp), %xmm1
L_AES_GCM_decrypt_avx2_aesenc_last15_dec_avx_aesenc_avx_last:
        vaesenclast	%xmm1, %xmm4, %xmm4
        xorl	%ecx, %ecx
        vpxor	%xmm0, %xmm0, %xmm0
        vmovdqu	%xmm4, (%esp)
        vmovdqu	%xmm0, 16(%esp)
L_AES_GCM_decrypt_avx2_aesenc_last15_dec_avx_loop:
        movzbl	(%esi,%ebx,1), %eax
        movb	%al, 16(%esp,%ecx,1)
        xorb	(%esp,%ecx,1), %al
        movb	%al, (%edi,%ebx,1)
        incl	%ebx
        incl	%ecx
        cmpl	%edx, %ebx
        jl	L_AES_GCM_decrypt_avx2_aesenc_last15_dec_avx_loop
        vmovdqu	16(%esp), %xmm4
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm4, %xmm4
        vpxor	%xmm4, %xmm6, %xmm6
        # ghash_gfmul_red
        vpclmulqdq	$16, %xmm5, %xmm6, %xmm2
        vpclmulqdq	$0x01, %xmm5, %xmm6, %xmm1
        vpclmulqdq	$0x00, %xmm5, %xmm6, %xmm0
        vpxor	%xmm1, %xmm2, %xmm2
        vpslldq	$8, %xmm2, %xmm1
        vpsrldq	$8, %xmm2, %xmm2
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$0x11, %xmm5, %xmm6, %xmm6
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm2, %xmm6, %xmm6
        vpxor	%xmm1, %xmm6, %xmm6
        vpxor	%xmm0, %xmm6, %xmm6
L_AES_GCM_decrypt_avx2_done_dec:
        vmovdqu	80(%esp), %xmm7
        # calc_tag
        movl	216(%esp), %ecx
        shll	$3, %ecx
        vpinsrd	$0x00, %ecx, %xmm0, %xmm0
        movl	220(%esp), %ecx
        shll	$3, %ecx
        vpinsrd	$2, %ecx, %xmm0, %xmm0
        movl	216(%esp), %ecx
        shrl	$29, %ecx
        vpinsrd	$0x01, %ecx, %xmm0, %xmm0
        movl	220(%esp), %ecx
        shrl	$29, %ecx
        vpinsrd	$3, %ecx, %xmm0, %xmm0
        vpxor	%xmm6, %xmm0, %xmm0
        # ghash_gfmul_red
        vpclmulqdq	$16, %xmm5, %xmm0, %xmm4
        vpclmulqdq	$0x01, %xmm5, %xmm0, %xmm3
        vpclmulqdq	$0x00, %xmm5, %xmm0, %xmm2
        vpxor	%xmm3, %xmm4, %xmm4
        vpslldq	$8, %xmm4, %xmm3
        vpsrldq	$8, %xmm4, %xmm4
        vpxor	%xmm2, %xmm3, %xmm3
        vpclmulqdq	$0x11, %xmm5, %xmm0, %xmm0
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm3, %xmm2
        vpshufd	$0x4e, %xmm3, %xmm3
        vpxor	%xmm2, %xmm3, %xmm3
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm3, %xmm2
        vpshufd	$0x4e, %xmm3, %xmm3
        vpxor	%xmm4, %xmm0, %xmm0
        vpxor	%xmm3, %xmm0, %xmm0
        vpxor	%xmm2, %xmm0, %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm7, %xmm0, %xmm0
        movl	212(%esp), %edi
        movl	228(%esp), %ebx
        movl	240(%esp), %ebp
        # cmp_tag
        cmpl	$16, %ebx
        je	L_AES_GCM_decrypt_avx2_cmp_tag_16
        xorl	%edx, %edx
        xorl	%ecx, %ecx
        vmovdqu	%xmm0, (%esp)
L_AES_GCM_decrypt_avx2_cmp_tag_loop:
        movzbl	(%esp,%edx,1), %eax
        xorb	(%edi,%edx,1), %al
        orb	%al, %cl
        incl	%edx
        cmpl	%ebx, %edx
        jne	L_AES_GCM_decrypt_avx2_cmp_tag_loop
        cmpb	$0x00, %cl
        sete	%cl
        jmp	L_AES_GCM_decrypt_avx2_cmp_tag_done
L_AES_GCM_decrypt_avx2_cmp_tag_16:
        vmovdqu	(%edi), %xmm1
        vpcmpeqb	%xmm1, %xmm0, %xmm0
        vpmovmskb	%xmm0, %edx
        # %%edx == 0xFFFF then return 1 else => return 0
        xorl	%ecx, %ecx
        cmpl	$0xffff, %edx
        sete	%cl
L_AES_GCM_decrypt_avx2_cmp_tag_done:
        movl	%ecx, (%ebp)
        addl	$0xb0, %esp
        popl	%ebp
        popl	%edi
        popl	%esi
        popl	%ebx
        ret
.size	AES_GCM_decrypt_avx2,.-AES_GCM_decrypt_avx2
#ifdef WOLFSSL_AESGCM_STREAM
.text
.globl	AES_GCM_init_avx2
.type	AES_GCM_init_avx2,@function
.align	16
AES_GCM_init_avx2:
        pushl	%ebx
        pushl	%esi
        pushl	%edi
        pushl	%ebp
        subl	$32, %esp
        movl	52(%esp), %ebp
        movl	60(%esp), %esi
        movl	76(%esp), %edi
        vpxor	%xmm4, %xmm4, %xmm4
        movl	64(%esp), %edx
        cmpl	$12, %edx
        je	L_AES_GCM_init_avx2_iv_12
        # Calculate values when IV is not 12 bytes
        # H = Encrypt X(=0)
        vmovdqu	(%ebp), %xmm5
        vaesenc	16(%ebp), %xmm5, %xmm5
        vaesenc	32(%ebp), %xmm5, %xmm5
        vaesenc	48(%ebp), %xmm5, %xmm5
        vaesenc	64(%ebp), %xmm5, %xmm5
        vaesenc	80(%ebp), %xmm5, %xmm5
        vaesenc	96(%ebp), %xmm5, %xmm5
        vaesenc	112(%ebp), %xmm5, %xmm5
        vaesenc	128(%ebp), %xmm5, %xmm5
        vaesenc	144(%ebp), %xmm5, %xmm5
        cmpl	$11, 56(%esp)
        vmovdqu	160(%ebp), %xmm0
        jl	L_AES_GCM_init_avx2_calc_iv_1_aesenc_avx_last
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	176(%ebp), %xmm5, %xmm5
        cmpl	$13, 56(%esp)
        vmovdqu	192(%ebp), %xmm0
        jl	L_AES_GCM_init_avx2_calc_iv_1_aesenc_avx_last
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	208(%ebp), %xmm5, %xmm5
        vmovdqu	224(%ebp), %xmm0
L_AES_GCM_init_avx2_calc_iv_1_aesenc_avx_last:
        vaesenclast	%xmm0, %xmm5, %xmm5
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm5, %xmm5
        # Calc counter
        # Initialization vector
        cmpl	$0x00, %edx
        movl	$0x00, %ecx
        je	L_AES_GCM_init_avx2_calc_iv_done
        cmpl	$16, %edx
        jl	L_AES_GCM_init_avx2_calc_iv_lt16
        andl	$0xfffffff0, %edx
L_AES_GCM_init_avx2_calc_iv_16_loop:
        vmovdqu	(%esi,%ecx,1), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm0, %xmm4, %xmm4
        # ghash_gfmul_avx
        vpclmulqdq	$16, %xmm4, %xmm5, %xmm2
        vpclmulqdq	$0x01, %xmm4, %xmm5, %xmm1
        vpclmulqdq	$0x00, %xmm4, %xmm5, %xmm0
        vpclmulqdq	$0x11, %xmm4, %xmm5, %xmm3
        vpxor	%xmm1, %xmm2, %xmm2
        vpslldq	$8, %xmm2, %xmm1
        vpsrldq	$8, %xmm2, %xmm2
        vpxor	%xmm1, %xmm0, %xmm6
        vpxor	%xmm2, %xmm3, %xmm4
        # ghash_mid
        vpsrld	$31, %xmm6, %xmm0
        vpsrld	$31, %xmm4, %xmm1
        vpslld	$0x01, %xmm6, %xmm6
        vpslld	$0x01, %xmm4, %xmm4
        vpsrldq	$12, %xmm0, %xmm2
        vpslldq	$4, %xmm0, %xmm0
        vpslldq	$4, %xmm1, %xmm1
        vpor	%xmm2, %xmm4, %xmm4
        vpor	%xmm0, %xmm6, %xmm6
        vpor	%xmm1, %xmm4, %xmm4
        # ghash_red
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm2
        vpclmulqdq	$16, %xmm2, %xmm6, %xmm0
        vpshufd	$0x4e, %xmm6, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$16, %xmm2, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm4, %xmm4
        addl	$16, %ecx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_init_avx2_calc_iv_16_loop
        movl	64(%esp), %edx
        cmpl	%edx, %ecx
        je	L_AES_GCM_init_avx2_calc_iv_done
L_AES_GCM_init_avx2_calc_iv_lt16:
        vpxor	%xmm0, %xmm0, %xmm0
        xorl	%ebx, %ebx
        vmovdqu	%xmm0, (%esp)
L_AES_GCM_init_avx2_calc_iv_loop:
        movzbl	(%esi,%ecx,1), %eax
        movb	%al, (%esp,%ebx,1)
        incl	%ecx
        incl	%ebx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_init_avx2_calc_iv_loop
        vmovdqu	(%esp), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm0, %xmm4, %xmm4
        # ghash_gfmul_avx
        vpclmulqdq	$16, %xmm4, %xmm5, %xmm2
        vpclmulqdq	$0x01, %xmm4, %xmm5, %xmm1
        vpclmulqdq	$0x00, %xmm4, %xmm5, %xmm0
        vpclmulqdq	$0x11, %xmm4, %xmm5, %xmm3
        vpxor	%xmm1, %xmm2, %xmm2
        vpslldq	$8, %xmm2, %xmm1
        vpsrldq	$8, %xmm2, %xmm2
        vpxor	%xmm1, %xmm0, %xmm6
        vpxor	%xmm2, %xmm3, %xmm4
        # ghash_mid
        vpsrld	$31, %xmm6, %xmm0
        vpsrld	$31, %xmm4, %xmm1
        vpslld	$0x01, %xmm6, %xmm6
        vpslld	$0x01, %xmm4, %xmm4
        vpsrldq	$12, %xmm0, %xmm2
        vpslldq	$4, %xmm0, %xmm0
        vpslldq	$4, %xmm1, %xmm1
        vpor	%xmm2, %xmm4, %xmm4
        vpor	%xmm0, %xmm6, %xmm6
        vpor	%xmm1, %xmm4, %xmm4
        # ghash_red
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm2
        vpclmulqdq	$16, %xmm2, %xmm6, %xmm0
        vpshufd	$0x4e, %xmm6, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$16, %xmm2, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm4, %xmm4
L_AES_GCM_init_avx2_calc_iv_done:
        # T = Encrypt counter
        vpxor	%xmm0, %xmm0, %xmm0
        shll	$3, %edx
        vpinsrd	$0x00, %edx, %xmm0, %xmm0
        vpxor	%xmm0, %xmm4, %xmm4
        # ghash_gfmul_avx
        vpclmulqdq	$16, %xmm4, %xmm5, %xmm2
        vpclmulqdq	$0x01, %xmm4, %xmm5, %xmm1
        vpclmulqdq	$0x00, %xmm4, %xmm5, %xmm0
        vpclmulqdq	$0x11, %xmm4, %xmm5, %xmm3
        vpxor	%xmm1, %xmm2, %xmm2
        vpslldq	$8, %xmm2, %xmm1
        vpsrldq	$8, %xmm2, %xmm2
        vpxor	%xmm1, %xmm0, %xmm6
        vpxor	%xmm2, %xmm3, %xmm4
        # ghash_mid
        vpsrld	$31, %xmm6, %xmm0
        vpsrld	$31, %xmm4, %xmm1
        vpslld	$0x01, %xmm6, %xmm6
        vpslld	$0x01, %xmm4, %xmm4
        vpsrldq	$12, %xmm0, %xmm2
        vpslldq	$4, %xmm0, %xmm0
        vpslldq	$4, %xmm1, %xmm1
        vpor	%xmm2, %xmm4, %xmm4
        vpor	%xmm0, %xmm6, %xmm6
        vpor	%xmm1, %xmm4, %xmm4
        # ghash_red
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm2
        vpclmulqdq	$16, %xmm2, %xmm6, %xmm0
        vpshufd	$0x4e, %xmm6, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$16, %xmm2, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm4, %xmm4
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm4, %xmm4
        #   Encrypt counter
        vmovdqu	(%ebp), %xmm7
        vpxor	%xmm4, %xmm7, %xmm7
        vaesenc	16(%ebp), %xmm7, %xmm7
        vaesenc	32(%ebp), %xmm7, %xmm7
        vaesenc	48(%ebp), %xmm7, %xmm7
        vaesenc	64(%ebp), %xmm7, %xmm7
        vaesenc	80(%ebp), %xmm7, %xmm7
        vaesenc	96(%ebp), %xmm7, %xmm7
        vaesenc	112(%ebp), %xmm7, %xmm7
        vaesenc	128(%ebp), %xmm7, %xmm7
        vaesenc	144(%ebp), %xmm7, %xmm7
        cmpl	$11, 56(%esp)
        vmovdqu	160(%ebp), %xmm0
        jl	L_AES_GCM_init_avx2_calc_iv_2_aesenc_avx_last
        vaesenc	%xmm0, %xmm7, %xmm7
        vaesenc	176(%ebp), %xmm7, %xmm7
        cmpl	$13, 56(%esp)
        vmovdqu	192(%ebp), %xmm0
        jl	L_AES_GCM_init_avx2_calc_iv_2_aesenc_avx_last
        vaesenc	%xmm0, %xmm7, %xmm7
        vaesenc	208(%ebp), %xmm7, %xmm7
        vmovdqu	224(%ebp), %xmm0
L_AES_GCM_init_avx2_calc_iv_2_aesenc_avx_last:
        vaesenclast	%xmm0, %xmm7, %xmm7
        jmp	L_AES_GCM_init_avx2_iv_done
L_AES_GCM_init_avx2_iv_12:
        # # Calculate values when IV is 12 bytes
        # Set counter based on IV
        vmovdqu	L_avx2_aes_gcm_bswap_one, %xmm4
        vmovdqu	(%ebp), %xmm5
        vpblendd	$7, (%esi), %xmm4, %xmm4
        # H = Encrypt X(=0) and T = Encrypt counter
        vmovdqu	16(%ebp), %xmm6
        vpxor	%xmm5, %xmm4, %xmm7
        vaesenc	%xmm6, %xmm5, %xmm5
        vaesenc	%xmm6, %xmm7, %xmm7
        vmovdqu	32(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm7, %xmm7
        vmovdqu	48(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm7, %xmm7
        vmovdqu	64(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm7, %xmm7
        vmovdqu	80(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm7, %xmm7
        vmovdqu	96(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm7, %xmm7
        vmovdqu	112(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm7, %xmm7
        vmovdqu	128(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm7, %xmm7
        vmovdqu	144(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm7, %xmm7
        cmpl	$11, 56(%esp)
        vmovdqu	160(%ebp), %xmm0
        jl	L_AES_GCM_init_avx2_calc_iv_12_last
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm7, %xmm7
        vmovdqu	176(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm7, %xmm7
        cmpl	$13, 56(%esp)
        vmovdqu	192(%ebp), %xmm0
        jl	L_AES_GCM_init_avx2_calc_iv_12_last
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm7, %xmm7
        vmovdqu	208(%ebp), %xmm0
        vaesenc	%xmm0, %xmm5, %xmm5
        vaesenc	%xmm0, %xmm7, %xmm7
        vmovdqu	224(%ebp), %xmm0
L_AES_GCM_init_avx2_calc_iv_12_last:
        vaesenclast	%xmm0, %xmm5, %xmm5
        vaesenclast	%xmm0, %xmm7, %xmm7
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm5, %xmm5
L_AES_GCM_init_avx2_iv_done:
        vmovdqu	%xmm7, (%edi)
        movl	68(%esp), %ebp
        movl	72(%esp), %edi
        vpshufb	L_aes_gcm_avx2_bswap_epi64, %xmm4, %xmm4
        vpaddd	L_aes_gcm_avx2_one, %xmm4, %xmm4
        vmovdqu	%xmm5, (%ebp)
        vmovdqu	%xmm4, (%edi)
        addl	$32, %esp
        popl	%ebp
        popl	%edi
        popl	%esi
        popl	%ebx
        ret
.size	AES_GCM_init_avx2,.-AES_GCM_init_avx2
.text
.globl	AES_GCM_aad_update_avx2
.type	AES_GCM_aad_update_avx2,@function
.align	16
AES_GCM_aad_update_avx2:
        pushl	%esi
        pushl	%edi
        movl	12(%esp), %esi
        movl	16(%esp), %edx
        movl	20(%esp), %edi
        movl	24(%esp), %eax
        vmovdqu	(%edi), %xmm4
        vmovdqu	(%eax), %xmm5
        xorl	%ecx, %ecx
L_AES_GCM_aad_update_avx2_16_loop:
        vmovdqu	(%esi,%ecx,1), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm0, %xmm4, %xmm4
        # ghash_gfmul_avx
        vpclmulqdq	$16, %xmm4, %xmm5, %xmm2
        vpclmulqdq	$0x01, %xmm4, %xmm5, %xmm1
        vpclmulqdq	$0x00, %xmm4, %xmm5, %xmm0
        vpclmulqdq	$0x11, %xmm4, %xmm5, %xmm3
        vpxor	%xmm1, %xmm2, %xmm2
        vpslldq	$8, %xmm2, %xmm1
        vpsrldq	$8, %xmm2, %xmm2
        vpxor	%xmm1, %xmm0, %xmm6
        vpxor	%xmm2, %xmm3, %xmm4
        # ghash_mid
        vpsrld	$31, %xmm6, %xmm0
        vpsrld	$31, %xmm4, %xmm1
        vpslld	$0x01, %xmm6, %xmm6
        vpslld	$0x01, %xmm4, %xmm4
        vpsrldq	$12, %xmm0, %xmm2
        vpslldq	$4, %xmm0, %xmm0
        vpslldq	$4, %xmm1, %xmm1
        vpor	%xmm2, %xmm4, %xmm4
        vpor	%xmm0, %xmm6, %xmm6
        vpor	%xmm1, %xmm4, %xmm4
        # ghash_red
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm2
        vpclmulqdq	$16, %xmm2, %xmm6, %xmm0
        vpshufd	$0x4e, %xmm6, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$16, %xmm2, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm4, %xmm4
        addl	$16, %ecx
        cmpl	%edx, %ecx
        jl	L_AES_GCM_aad_update_avx2_16_loop
        vmovdqu	%xmm4, (%edi)
        popl	%edi
        popl	%esi
        ret
.size	AES_GCM_aad_update_avx2,.-AES_GCM_aad_update_avx2
.text
.globl	AES_GCM_encrypt_block_avx2
.type	AES_GCM_encrypt_block_avx2,@function
.align	16
AES_GCM_encrypt_block_avx2:
        pushl	%esi
        pushl	%edi
        movl	12(%esp), %ecx
        movl	16(%esp), %eax
        movl	20(%esp), %edi
        movl	24(%esp), %esi
        movl	28(%esp), %edx
        vmovdqu	(%edx), %xmm3
        # aesenc_block
        vmovdqu	%xmm3, %xmm1
        vpshufb	L_aes_gcm_avx2_bswap_epi64, %xmm1, %xmm0
        vpaddd	L_aes_gcm_avx2_one, %xmm1, %xmm1
        vpxor	(%ecx), %xmm0, %xmm0
        vaesenc	16(%ecx), %xmm0, %xmm0
        vaesenc	32(%ecx), %xmm0, %xmm0
        vaesenc	48(%ecx), %xmm0, %xmm0
        vaesenc	64(%ecx), %xmm0, %xmm0
        vaesenc	80(%ecx), %xmm0, %xmm0
        vaesenc	96(%ecx), %xmm0, %xmm0
        vaesenc	112(%ecx), %xmm0, %xmm0
        vaesenc	128(%ecx), %xmm0, %xmm0
        vaesenc	144(%ecx), %xmm0, %xmm0
        cmpl	$11, %eax
        vmovdqu	160(%ecx), %xmm2
        jl	L_AES_GCM_encrypt_block_avx2_aesenc_block_aesenc_avx_last
        vaesenc	%xmm2, %xmm0, %xmm0
        vaesenc	176(%ecx), %xmm0, %xmm0
        cmpl	$13, %eax
        vmovdqu	192(%ecx), %xmm2
        jl	L_AES_GCM_encrypt_block_avx2_aesenc_block_aesenc_avx_last
        vaesenc	%xmm2, %xmm0, %xmm0
        vaesenc	208(%ecx), %xmm0, %xmm0
        vmovdqu	224(%ecx), %xmm2
L_AES_GCM_encrypt_block_avx2_aesenc_block_aesenc_avx_last:
        vaesenclast	%xmm2, %xmm0, %xmm0
        vmovdqu	%xmm1, %xmm3
        vmovdqu	(%esi), %xmm1
        vpxor	%xmm1, %xmm0, %xmm0
        vmovdqu	%xmm0, (%edi)
        vmovdqu	%xmm3, (%edx)
        popl	%edi
        popl	%esi
        ret
.size	AES_GCM_encrypt_block_avx2,.-AES_GCM_encrypt_block_avx2
.text
.globl	AES_GCM_ghash_block_avx2
.type	AES_GCM_ghash_block_avx2,@function
.align	16
AES_GCM_ghash_block_avx2:
        movl	4(%esp), %edx
        movl	8(%esp), %eax
        movl	12(%esp), %ecx
        vmovdqu	(%eax), %xmm4
        vmovdqu	(%ecx), %xmm5
        vmovdqu	(%edx), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm0, %xmm4, %xmm4
        # ghash_gfmul_avx
        vpclmulqdq	$16, %xmm4, %xmm5, %xmm2
        vpclmulqdq	$0x01, %xmm4, %xmm5, %xmm1
        vpclmulqdq	$0x00, %xmm4, %xmm5, %xmm0
        vpclmulqdq	$0x11, %xmm4, %xmm5, %xmm3
        vpxor	%xmm1, %xmm2, %xmm2
        vpslldq	$8, %xmm2, %xmm1
        vpsrldq	$8, %xmm2, %xmm2
        vpxor	%xmm1, %xmm0, %xmm6
        vpxor	%xmm2, %xmm3, %xmm4
        # ghash_mid
        vpsrld	$31, %xmm6, %xmm0
        vpsrld	$31, %xmm4, %xmm1
        vpslld	$0x01, %xmm6, %xmm6
        vpslld	$0x01, %xmm4, %xmm4
        vpsrldq	$12, %xmm0, %xmm2
        vpslldq	$4, %xmm0, %xmm0
        vpslldq	$4, %xmm1, %xmm1
        vpor	%xmm2, %xmm4, %xmm4
        vpor	%xmm0, %xmm6, %xmm6
        vpor	%xmm1, %xmm4, %xmm4
        # ghash_red
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm2
        vpclmulqdq	$16, %xmm2, %xmm6, %xmm0
        vpshufd	$0x4e, %xmm6, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$16, %xmm2, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm4, %xmm4
        vmovdqu	%xmm4, (%eax)
        ret
.size	AES_GCM_ghash_block_avx2,.-AES_GCM_ghash_block_avx2
.text
.globl	AES_GCM_encrypt_update_avx2
.type	AES_GCM_encrypt_update_avx2,@function
.align	16
AES_GCM_encrypt_update_avx2:
        pushl	%ebx
        pushl	%esi
        pushl	%edi
        pushl	%ebp
        subl	$0x60, %esp
        movl	144(%esp), %esi
        vmovdqu	(%esi), %xmm4
        vmovdqu	%xmm4, 64(%esp)
        movl	136(%esp), %esi
        movl	140(%esp), %ebp
        vmovdqu	(%esi), %xmm6
        vmovdqu	(%ebp), %xmm5
        vmovdqu	%xmm6, 80(%esp)
        movl	116(%esp), %ebp
        movl	124(%esp), %edi
        movl	128(%esp), %esi
        # Calculate H
        vpsrlq	$63, %xmm5, %xmm1
        vpsllq	$0x01, %xmm5, %xmm0
        vpslldq	$8, %xmm1, %xmm1
        vpor	%xmm1, %xmm0, %xmm0
        vpshufd	$0xff, %xmm5, %xmm5
        vpsrad	$31, %xmm5, %xmm5
        vpand	L_aes_gcm_avx2_mod2_128, %xmm5, %xmm5
        vpxor	%xmm0, %xmm5, %xmm5
        xorl	%ebx, %ebx
        cmpl	$0x40, 132(%esp)
        movl	132(%esp), %eax
        jl	L_AES_GCM_encrypt_update_avx2_done_64
        andl	$0xffffffc0, %eax
        vmovdqu	%xmm4, 64(%esp)
        vmovdqu	%xmm6, 80(%esp)
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm3
        # H ^ 1
        vmovdqu	%xmm5, (%esp)
        vmovdqu	%xmm5, %xmm2
        # H ^ 2
        vpclmulqdq	$0x00, %xmm2, %xmm2, %xmm5
        vpclmulqdq	$0x11, %xmm2, %xmm2, %xmm6
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm5, %xmm6, %xmm0
        vmovdqu	%xmm0, 16(%esp)
        # H ^ 3
        # ghash_gfmul_red
        vpclmulqdq	$16, %xmm0, %xmm2, %xmm6
        vpclmulqdq	$0x01, %xmm0, %xmm2, %xmm5
        vpclmulqdq	$0x00, %xmm0, %xmm2, %xmm4
        vpxor	%xmm5, %xmm6, %xmm6
        vpslldq	$8, %xmm6, %xmm5
        vpsrldq	$8, %xmm6, %xmm6
        vpxor	%xmm4, %xmm5, %xmm5
        vpclmulqdq	$0x11, %xmm0, %xmm2, %xmm1
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm6, %xmm1, %xmm1
        vpxor	%xmm5, %xmm1, %xmm1
        vpxor	%xmm4, %xmm1, %xmm1
        vmovdqu	%xmm1, 32(%esp)
        # H ^ 4
        vpclmulqdq	$0x00, %xmm0, %xmm0, %xmm5
        vpclmulqdq	$0x11, %xmm0, %xmm0, %xmm6
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm5, %xmm6, %xmm2
        vmovdqu	%xmm2, 48(%esp)
        vmovdqu	80(%esp), %xmm6
        # First 64 bytes of input
        # aesenc_64
        # aesenc_ctr
        vmovdqu	64(%esp), %xmm4
        vmovdqu	L_aes_gcm_avx2_bswap_epi64, %xmm7
        vpaddd	L_aes_gcm_avx2_one, %xmm4, %xmm1
        vpshufb	%xmm7, %xmm4, %xmm0
        vpaddd	L_aes_gcm_avx2_two, %xmm4, %xmm2
        vpshufb	%xmm7, %xmm1, %xmm1
        vpaddd	L_aes_gcm_avx2_three, %xmm4, %xmm3
        vpshufb	%xmm7, %xmm2, %xmm2
        vpaddd	L_aes_gcm_avx2_four, %xmm4, %xmm4
        vpshufb	%xmm7, %xmm3, %xmm3
        # aesenc_xor
        vmovdqu	(%ebp), %xmm7
        vmovdqu	%xmm4, 64(%esp)
        vpxor	%xmm7, %xmm0, %xmm0
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm7, %xmm3, %xmm3
        vmovdqu	16(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	32(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	48(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	64(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	80(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	96(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	112(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	128(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	144(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$11, 120(%esp)
        vmovdqu	160(%ebp), %xmm7
        jl	L_AES_GCM_encrypt_update_avx2_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	176(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$13, 120(%esp)
        vmovdqu	192(%ebp), %xmm7
        jl	L_AES_GCM_encrypt_update_avx2_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	208(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	224(%ebp), %xmm7
L_AES_GCM_encrypt_update_avx2_aesenc_64_enc_done:
        # aesenc_last
        vaesenclast	%xmm7, %xmm0, %xmm0
        vaesenclast	%xmm7, %xmm1, %xmm1
        vaesenclast	%xmm7, %xmm2, %xmm2
        vaesenclast	%xmm7, %xmm3, %xmm3
        vmovdqu	(%esi), %xmm7
        vmovdqu	16(%esi), %xmm4
        vpxor	%xmm7, %xmm0, %xmm0
        vpxor	%xmm4, %xmm1, %xmm1
        vmovdqu	%xmm0, (%edi)
        vmovdqu	%xmm1, 16(%edi)
        vmovdqu	32(%esi), %xmm7
        vmovdqu	48(%esi), %xmm4
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm4, %xmm3, %xmm3
        vmovdqu	%xmm2, 32(%edi)
        vmovdqu	%xmm3, 48(%edi)
        cmpl	$0x40, %eax
        movl	$0x40, %ebx
        movl	%esi, %ecx
        movl	%edi, %edx
        jle	L_AES_GCM_encrypt_update_avx2_end_64
        # More 64 bytes of input
L_AES_GCM_encrypt_update_avx2_ghash_64:
        # aesenc_64_ghash
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        # aesenc_64
        # aesenc_ctr
        vmovdqu	64(%esp), %xmm4
        vmovdqu	L_aes_gcm_avx2_bswap_epi64, %xmm7
        vpaddd	L_aes_gcm_avx2_one, %xmm4, %xmm1
        vpshufb	%xmm7, %xmm4, %xmm0
        vpaddd	L_aes_gcm_avx2_two, %xmm4, %xmm2
        vpshufb	%xmm7, %xmm1, %xmm1
        vpaddd	L_aes_gcm_avx2_three, %xmm4, %xmm3
        vpshufb	%xmm7, %xmm2, %xmm2
        vpaddd	L_aes_gcm_avx2_four, %xmm4, %xmm4
        vpshufb	%xmm7, %xmm3, %xmm3
        # aesenc_xor
        vmovdqu	(%ebp), %xmm7
        vmovdqu	%xmm4, 64(%esp)
        vpxor	%xmm7, %xmm0, %xmm0
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm7, %xmm3, %xmm3
        vmovdqu	16(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	32(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	48(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	64(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	80(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	96(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	112(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	128(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	144(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$11, 120(%esp)
        vmovdqu	160(%ebp), %xmm7
        jl	L_AES_GCM_encrypt_update_avx2_aesenc_64_ghash_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	176(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$13, 120(%esp)
        vmovdqu	192(%ebp), %xmm7
        jl	L_AES_GCM_encrypt_update_avx2_aesenc_64_ghash_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	208(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	224(%ebp), %xmm7
L_AES_GCM_encrypt_update_avx2_aesenc_64_ghash_aesenc_64_enc_done:
        # aesenc_last
        vaesenclast	%xmm7, %xmm0, %xmm0
        vaesenclast	%xmm7, %xmm1, %xmm1
        vaesenclast	%xmm7, %xmm2, %xmm2
        vaesenclast	%xmm7, %xmm3, %xmm3
        vmovdqu	(%ecx), %xmm7
        vmovdqu	16(%ecx), %xmm4
        vpxor	%xmm7, %xmm0, %xmm0
        vpxor	%xmm4, %xmm1, %xmm1
        vmovdqu	%xmm0, (%edx)
        vmovdqu	%xmm1, 16(%edx)
        vmovdqu	32(%ecx), %xmm7
        vmovdqu	48(%ecx), %xmm4
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm4, %xmm3, %xmm3
        vmovdqu	%xmm2, 32(%edx)
        vmovdqu	%xmm3, 48(%edx)
        # pclmul_1
        vmovdqu	-64(%edx), %xmm1
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vmovdqu	48(%esp), %xmm2
        vpxor	%xmm6, %xmm1, %xmm1
        vpclmulqdq	$16, %xmm2, %xmm1, %xmm5
        vpclmulqdq	$0x01, %xmm2, %xmm1, %xmm3
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm6
        vpclmulqdq	$0x11, %xmm2, %xmm1, %xmm7
        # pclmul_2
        vmovdqu	-48(%edx), %xmm1
        vmovdqu	32(%esp), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vpxor	%xmm3, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm0, %xmm1, %xmm2
        vpclmulqdq	$0x01, %xmm0, %xmm1, %xmm3
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm7, %xmm7
        # pclmul_n
        vmovdqu	-32(%edx), %xmm1
        vmovdqu	16(%esp), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vpxor	%xmm2, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm0, %xmm1, %xmm2
        vpxor	%xmm3, %xmm5, %xmm5
        vpclmulqdq	$0x01, %xmm0, %xmm1, %xmm3
        vpxor	%xmm4, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm7, %xmm7
        # pclmul_n
        vmovdqu	-16(%edx), %xmm1
        vmovdqu	(%esp), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vpxor	%xmm2, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm0, %xmm1, %xmm2
        vpxor	%xmm3, %xmm5, %xmm5
        vpclmulqdq	$0x01, %xmm0, %xmm1, %xmm3
        vpxor	%xmm4, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm7, %xmm7
        # aesenc_pclmul_l
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm4, %xmm6, %xmm6
        vpxor	%xmm3, %xmm5, %xmm5
        vpslldq	$8, %xmm5, %xmm1
        vpsrldq	$8, %xmm5, %xmm5
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm0
        vpxor	%xmm1, %xmm6, %xmm6
        vpxor	%xmm5, %xmm7, %xmm7
        vpclmulqdq	$16, %xmm0, %xmm6, %xmm3
        vpshufd	$0x4e, %xmm6, %xmm6
        vpxor	%xmm3, %xmm6, %xmm6
        vpclmulqdq	$16, %xmm0, %xmm6, %xmm3
        vpshufd	$0x4e, %xmm6, %xmm6
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm7, %xmm6, %xmm6
        # aesenc_64_ghash - end
        addl	$0x40, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_encrypt_update_avx2_ghash_64
L_AES_GCM_encrypt_update_avx2_end_64:
        vmovdqu	%xmm6, 80(%esp)
        vmovdqu	48(%edx), %xmm3
        vmovdqu	(%esp), %xmm7
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm3, %xmm3
        vpclmulqdq	$16, %xmm3, %xmm7, %xmm5
        vpclmulqdq	$0x01, %xmm3, %xmm7, %xmm1
        vpclmulqdq	$0x00, %xmm3, %xmm7, %xmm4
        vpclmulqdq	$0x11, %xmm3, %xmm7, %xmm6
        vpxor	%xmm1, %xmm5, %xmm5
        vmovdqu	32(%edx), %xmm3
        vmovdqu	16(%esp), %xmm7
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm3, %xmm3
        vpclmulqdq	$16, %xmm3, %xmm7, %xmm2
        vpclmulqdq	$0x01, %xmm3, %xmm7, %xmm1
        vpclmulqdq	$0x00, %xmm3, %xmm7, %xmm0
        vpclmulqdq	$0x11, %xmm3, %xmm7, %xmm3
        vpxor	%xmm1, %xmm2, %xmm2
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm0, %xmm4, %xmm4
        vmovdqu	16(%edx), %xmm3
        vmovdqu	32(%esp), %xmm7
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm3, %xmm3
        vpclmulqdq	$16, %xmm3, %xmm7, %xmm2
        vpclmulqdq	$0x01, %xmm3, %xmm7, %xmm1
        vpclmulqdq	$0x00, %xmm3, %xmm7, %xmm0
        vpclmulqdq	$0x11, %xmm3, %xmm7, %xmm3
        vpxor	%xmm1, %xmm2, %xmm2
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm0, %xmm4, %xmm4
        vmovdqu	80(%esp), %xmm0
        vmovdqu	(%edx), %xmm3
        vmovdqu	48(%esp), %xmm7
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm3, %xmm3
        vpxor	%xmm0, %xmm3, %xmm3
        vpclmulqdq	$16, %xmm3, %xmm7, %xmm2
        vpclmulqdq	$0x01, %xmm3, %xmm7, %xmm1
        vpclmulqdq	$0x00, %xmm3, %xmm7, %xmm0
        vpclmulqdq	$0x11, %xmm3, %xmm7, %xmm3
        vpxor	%xmm1, %xmm2, %xmm2
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm0, %xmm4, %xmm4
        vpslldq	$8, %xmm5, %xmm7
        vpsrldq	$8, %xmm5, %xmm5
        vpxor	%xmm7, %xmm4, %xmm4
        vpxor	%xmm5, %xmm6, %xmm6
        # ghash_red
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm2
        vpclmulqdq	$16, %xmm2, %xmm4, %xmm0
        vpshufd	$0x4e, %xmm4, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$16, %xmm2, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm6, %xmm6
        vmovdqu	(%esp), %xmm5
        vmovdqu	64(%esp), %xmm4
L_AES_GCM_encrypt_update_avx2_done_64:
        cmpl	132(%esp), %ebx
        je	L_AES_GCM_encrypt_update_avx2_done_enc
        movl	132(%esp), %eax
        andl	$0xfffffff0, %eax
        cmpl	%eax, %ebx
        jge	L_AES_GCM_encrypt_update_avx2_last_block_done
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        # aesenc_block
        vmovdqu	%xmm4, %xmm1
        vpshufb	L_aes_gcm_avx2_bswap_epi64, %xmm1, %xmm0
        vpaddd	L_aes_gcm_avx2_one, %xmm1, %xmm1
        vpxor	(%ebp), %xmm0, %xmm0
        vaesenc	16(%ebp), %xmm0, %xmm0
        vaesenc	32(%ebp), %xmm0, %xmm0
        vaesenc	48(%ebp), %xmm0, %xmm0
        vaesenc	64(%ebp), %xmm0, %xmm0
        vaesenc	80(%ebp), %xmm0, %xmm0
        vaesenc	96(%ebp), %xmm0, %xmm0
        vaesenc	112(%ebp), %xmm0, %xmm0
        vaesenc	128(%ebp), %xmm0, %xmm0
        vaesenc	144(%ebp), %xmm0, %xmm0
        cmpl	$11, 120(%esp)
        vmovdqu	160(%ebp), %xmm2
        jl	L_AES_GCM_encrypt_update_avx2_aesenc_block_aesenc_avx_last
        vaesenc	%xmm2, %xmm0, %xmm0
        vaesenc	176(%ebp), %xmm0, %xmm0
        cmpl	$13, 120(%esp)
        vmovdqu	192(%ebp), %xmm2
        jl	L_AES_GCM_encrypt_update_avx2_aesenc_block_aesenc_avx_last
        vaesenc	%xmm2, %xmm0, %xmm0
        vaesenc	208(%ebp), %xmm0, %xmm0
        vmovdqu	224(%ebp), %xmm2
L_AES_GCM_encrypt_update_avx2_aesenc_block_aesenc_avx_last:
        vaesenclast	%xmm2, %xmm0, %xmm0
        vmovdqu	%xmm1, %xmm4
        vmovdqu	(%ecx), %xmm1
        vpxor	%xmm1, %xmm0, %xmm0
        vmovdqu	%xmm0, (%edx)
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm0, %xmm6, %xmm6
        addl	$16, %ebx
        cmpl	%eax, %ebx
        jge	L_AES_GCM_encrypt_update_avx2_last_block_ghash
L_AES_GCM_encrypt_update_avx2_last_block_start:
        vpshufb	L_aes_gcm_avx2_bswap_epi64, %xmm4, %xmm7
        vpaddd	L_aes_gcm_avx2_one, %xmm4, %xmm4
        vmovdqu	%xmm4, 64(%esp)
        # aesenc_gfmul_sb
        vpclmulqdq	$0x01, %xmm5, %xmm6, %xmm2
        vpclmulqdq	$16, %xmm5, %xmm6, %xmm3
        vpclmulqdq	$0x00, %xmm5, %xmm6, %xmm1
        vpclmulqdq	$0x11, %xmm5, %xmm6, %xmm4
        vpxor	(%ebp), %xmm7, %xmm7
        vaesenc	16(%ebp), %xmm7, %xmm7
        vpxor	%xmm2, %xmm3, %xmm3
        vpslldq	$8, %xmm3, %xmm2
        vpsrldq	$8, %xmm3, %xmm3
        vaesenc	32(%ebp), %xmm7, %xmm7
        vpxor	%xmm1, %xmm2, %xmm2
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm2, %xmm1
        vaesenc	48(%ebp), %xmm7, %xmm7
        vaesenc	64(%ebp), %xmm7, %xmm7
        vaesenc	80(%ebp), %xmm7, %xmm7
        vpshufd	$0x4e, %xmm2, %xmm2
        vpxor	%xmm1, %xmm2, %xmm2
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm2, %xmm1
        vaesenc	96(%ebp), %xmm7, %xmm7
        vaesenc	112(%ebp), %xmm7, %xmm7
        vaesenc	128(%ebp), %xmm7, %xmm7
        vpshufd	$0x4e, %xmm2, %xmm2
        vaesenc	144(%ebp), %xmm7, %xmm7
        vpxor	%xmm3, %xmm4, %xmm4
        vpxor	%xmm4, %xmm2, %xmm2
        vmovdqu	160(%ebp), %xmm0
        cmpl	$11, 120(%esp)
        jl	L_AES_GCM_encrypt_update_avx2_aesenc_gfmul_sb_last
        vaesenc	%xmm0, %xmm7, %xmm7
        vaesenc	176(%ebp), %xmm7, %xmm7
        vmovdqu	192(%ebp), %xmm0
        cmpl	$13, 120(%esp)
        jl	L_AES_GCM_encrypt_update_avx2_aesenc_gfmul_sb_last
        vaesenc	%xmm0, %xmm7, %xmm7
        vaesenc	208(%ebp), %xmm7, %xmm7
        vmovdqu	224(%ebp), %xmm0
L_AES_GCM_encrypt_update_avx2_aesenc_gfmul_sb_last:
        vaesenclast	%xmm0, %xmm7, %xmm7
        vmovdqu	(%esi,%ebx,1), %xmm3
        vpxor	%xmm1, %xmm2, %xmm6
        vpxor	%xmm3, %xmm7, %xmm7
        vmovdqu	%xmm7, (%edi,%ebx,1)
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm7, %xmm7
        vpxor	%xmm7, %xmm6, %xmm6
        vmovdqu	64(%esp), %xmm4
        addl	$16, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_encrypt_update_avx2_last_block_start
L_AES_GCM_encrypt_update_avx2_last_block_ghash:
        # ghash_gfmul_red
        vpclmulqdq	$16, %xmm5, %xmm6, %xmm2
        vpclmulqdq	$0x01, %xmm5, %xmm6, %xmm1
        vpclmulqdq	$0x00, %xmm5, %xmm6, %xmm0
        vpxor	%xmm1, %xmm2, %xmm2
        vpslldq	$8, %xmm2, %xmm1
        vpsrldq	$8, %xmm2, %xmm2
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$0x11, %xmm5, %xmm6, %xmm6
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm0, %xmm1, %xmm1
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm1, %xmm0
        vpshufd	$0x4e, %xmm1, %xmm1
        vpxor	%xmm2, %xmm6, %xmm6
        vpxor	%xmm1, %xmm6, %xmm6
        vpxor	%xmm0, %xmm6, %xmm6
L_AES_GCM_encrypt_update_avx2_last_block_done:
L_AES_GCM_encrypt_update_avx2_done_enc:
        movl	136(%esp), %esi
        movl	144(%esp), %edi
        vmovdqu	%xmm6, (%esi)
        vmovdqu	%xmm4, (%edi)
        addl	$0x60, %esp
        popl	%ebp
        popl	%edi
        popl	%esi
        popl	%ebx
        ret
.size	AES_GCM_encrypt_update_avx2,.-AES_GCM_encrypt_update_avx2
.text
.globl	AES_GCM_encrypt_final_avx2
.type	AES_GCM_encrypt_final_avx2,@function
.align	16
AES_GCM_encrypt_final_avx2:
        pushl	%esi
        pushl	%edi
        pushl	%ebp
        subl	$16, %esp
        movl	32(%esp), %ebp
        movl	52(%esp), %esi
        movl	56(%esp), %edi
        vmovdqu	(%ebp), %xmm4
        vmovdqu	(%esi), %xmm5
        vmovdqu	(%edi), %xmm6
        vpsrlq	$63, %xmm5, %xmm1
        vpsllq	$0x01, %xmm5, %xmm0
        vpslldq	$8, %xmm1, %xmm1
        vpor	%xmm1, %xmm0, %xmm0
        vpshufd	$0xff, %xmm5, %xmm5
        vpsrad	$31, %xmm5, %xmm5
        vpand	L_aes_gcm_avx2_mod2_128, %xmm5, %xmm5
        vpxor	%xmm0, %xmm5, %xmm5
        # calc_tag
        movl	44(%esp), %ecx
        shll	$3, %ecx
        vpinsrd	$0x00, %ecx, %xmm0, %xmm0
        movl	48(%esp), %ecx
        shll	$3, %ecx
        vpinsrd	$2, %ecx, %xmm0, %xmm0
        movl	44(%esp), %ecx
        shrl	$29, %ecx
        vpinsrd	$0x01, %ecx, %xmm0, %xmm0
        movl	48(%esp), %ecx
        shrl	$29, %ecx
        vpinsrd	$3, %ecx, %xmm0, %xmm0
        vpxor	%xmm4, %xmm0, %xmm0
        # ghash_gfmul_red
        vpclmulqdq	$16, %xmm5, %xmm0, %xmm7
        vpclmulqdq	$0x01, %xmm5, %xmm0, %xmm3
        vpclmulqdq	$0x00, %xmm5, %xmm0, %xmm2
        vpxor	%xmm3, %xmm7, %xmm7
        vpslldq	$8, %xmm7, %xmm3
        vpsrldq	$8, %xmm7, %xmm7
        vpxor	%xmm2, %xmm3, %xmm3
        vpclmulqdq	$0x11, %xmm5, %xmm0, %xmm0
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm3, %xmm2
        vpshufd	$0x4e, %xmm3, %xmm3
        vpxor	%xmm2, %xmm3, %xmm3
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm3, %xmm2
        vpshufd	$0x4e, %xmm3, %xmm3
        vpxor	%xmm7, %xmm0, %xmm0
        vpxor	%xmm3, %xmm0, %xmm0
        vpxor	%xmm2, %xmm0, %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm6, %xmm0, %xmm0
        movl	36(%esp), %edi
        # store_tag
        cmpl	$16, 40(%esp)
        je	L_AES_GCM_encrypt_final_avx2_store_tag_16
        xorl	%ecx, %ecx
        vmovdqu	%xmm0, (%esp)
L_AES_GCM_encrypt_final_avx2_store_tag_loop:
        movzbl	(%esp,%ecx,1), %eax
        movb	%al, (%edi,%ecx,1)
        incl	%ecx
        cmpl	40(%esp), %ecx
        jne	L_AES_GCM_encrypt_final_avx2_store_tag_loop
        jmp	L_AES_GCM_encrypt_final_avx2_store_tag_done
L_AES_GCM_encrypt_final_avx2_store_tag_16:
        vmovdqu	%xmm0, (%edi)
L_AES_GCM_encrypt_final_avx2_store_tag_done:
        addl	$16, %esp
        popl	%ebp
        popl	%edi
        popl	%esi
        ret
.size	AES_GCM_encrypt_final_avx2,.-AES_GCM_encrypt_final_avx2
.text
.globl	AES_GCM_decrypt_update_avx2
.type	AES_GCM_decrypt_update_avx2,@function
.align	16
AES_GCM_decrypt_update_avx2:
        pushl	%ebx
        pushl	%esi
        pushl	%edi
        pushl	%ebp
        subl	$0xa0, %esp
        movl	208(%esp), %esi
        vmovdqu	(%esi), %xmm4
        movl	200(%esp), %esi
        movl	204(%esp), %ebp
        vmovdqu	(%esi), %xmm6
        vmovdqu	(%ebp), %xmm5
        movl	180(%esp), %ebp
        movl	188(%esp), %edi
        movl	192(%esp), %esi
        # Calculate H
        vpsrlq	$63, %xmm5, %xmm1
        vpsllq	$0x01, %xmm5, %xmm0
        vpslldq	$8, %xmm1, %xmm1
        vpor	%xmm1, %xmm0, %xmm0
        vpshufd	$0xff, %xmm5, %xmm5
        vpsrad	$31, %xmm5, %xmm5
        vpand	L_aes_gcm_avx2_mod2_128, %xmm5, %xmm5
        vpxor	%xmm0, %xmm5, %xmm5
        xorl	%ebx, %ebx
        cmpl	$0x40, 196(%esp)
        movl	196(%esp), %eax
        jl	L_AES_GCM_decrypt_update_avx2_done_64
        andl	$0xffffffc0, %eax
        vmovdqu	%xmm4, 64(%esp)
        vmovdqu	%xmm6, 80(%esp)
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm3
        # H ^ 1
        vmovdqu	%xmm5, (%esp)
        vmovdqu	%xmm5, %xmm2
        # H ^ 2
        vpclmulqdq	$0x00, %xmm2, %xmm2, %xmm5
        vpclmulqdq	$0x11, %xmm2, %xmm2, %xmm6
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm5, %xmm6, %xmm0
        vmovdqu	%xmm0, 16(%esp)
        # H ^ 3
        # ghash_gfmul_red
        vpclmulqdq	$16, %xmm0, %xmm2, %xmm6
        vpclmulqdq	$0x01, %xmm0, %xmm2, %xmm5
        vpclmulqdq	$0x00, %xmm0, %xmm2, %xmm4
        vpxor	%xmm5, %xmm6, %xmm6
        vpslldq	$8, %xmm6, %xmm5
        vpsrldq	$8, %xmm6, %xmm6
        vpxor	%xmm4, %xmm5, %xmm5
        vpclmulqdq	$0x11, %xmm0, %xmm2, %xmm1
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm6, %xmm1, %xmm1
        vpxor	%xmm5, %xmm1, %xmm1
        vpxor	%xmm4, %xmm1, %xmm1
        vmovdqu	%xmm1, 32(%esp)
        # H ^ 4
        vpclmulqdq	$0x00, %xmm0, %xmm0, %xmm5
        vpclmulqdq	$0x11, %xmm0, %xmm0, %xmm6
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm3, %xmm5, %xmm4
        vpshufd	$0x4e, %xmm5, %xmm5
        vpxor	%xmm4, %xmm5, %xmm5
        vpxor	%xmm5, %xmm6, %xmm2
        vmovdqu	%xmm2, 48(%esp)
        vmovdqu	80(%esp), %xmm6
        cmpl	%esi, %edi
        jne	L_AES_GCM_decrypt_update_avx2_ghash_64
L_AES_GCM_decrypt_update_avx2_ghash_64_inplace:
        # aesenc_64_ghash
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        # aesenc_64
        # aesenc_ctr
        vmovdqu	64(%esp), %xmm4
        vmovdqu	L_aes_gcm_avx2_bswap_epi64, %xmm7
        vpaddd	L_aes_gcm_avx2_one, %xmm4, %xmm1
        vpshufb	%xmm7, %xmm4, %xmm0
        vpaddd	L_aes_gcm_avx2_two, %xmm4, %xmm2
        vpshufb	%xmm7, %xmm1, %xmm1
        vpaddd	L_aes_gcm_avx2_three, %xmm4, %xmm3
        vpshufb	%xmm7, %xmm2, %xmm2
        vpaddd	L_aes_gcm_avx2_four, %xmm4, %xmm4
        vpshufb	%xmm7, %xmm3, %xmm3
        # aesenc_xor
        vmovdqu	(%ebp), %xmm7
        vmovdqu	%xmm4, 64(%esp)
        vpxor	%xmm7, %xmm0, %xmm0
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm7, %xmm3, %xmm3
        vmovdqu	16(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	32(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	48(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	64(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	80(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	96(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	112(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	128(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	144(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$11, 184(%esp)
        vmovdqu	160(%ebp), %xmm7
        jl	L_AES_GCM_decrypt_update_avx2_inplace_aesenc_64_ghash_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	176(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$13, 184(%esp)
        vmovdqu	192(%ebp), %xmm7
        jl	L_AES_GCM_decrypt_update_avx2_inplace_aesenc_64_ghash_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	208(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	224(%ebp), %xmm7
L_AES_GCM_decrypt_update_avx2_inplace_aesenc_64_ghash_aesenc_64_enc_done:
        # aesenc_last
        vaesenclast	%xmm7, %xmm0, %xmm0
        vaesenclast	%xmm7, %xmm1, %xmm1
        vaesenclast	%xmm7, %xmm2, %xmm2
        vaesenclast	%xmm7, %xmm3, %xmm3
        vmovdqu	(%ecx), %xmm7
        vmovdqu	16(%ecx), %xmm4
        vpxor	%xmm7, %xmm0, %xmm0
        vpxor	%xmm4, %xmm1, %xmm1
        vmovdqu	%xmm7, 96(%esp)
        vmovdqu	%xmm4, 112(%esp)
        vmovdqu	%xmm0, (%edx)
        vmovdqu	%xmm1, 16(%edx)
        vmovdqu	32(%ecx), %xmm7
        vmovdqu	48(%ecx), %xmm4
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm4, %xmm3, %xmm3
        vmovdqu	%xmm7, 128(%esp)
        vmovdqu	%xmm4, 144(%esp)
        vmovdqu	%xmm2, 32(%edx)
        vmovdqu	%xmm3, 48(%edx)
        # pclmul_1
        vmovdqu	96(%esp), %xmm1
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vmovdqu	48(%esp), %xmm2
        vpxor	%xmm6, %xmm1, %xmm1
        vpclmulqdq	$16, %xmm2, %xmm1, %xmm5
        vpclmulqdq	$0x01, %xmm2, %xmm1, %xmm3
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm6
        vpclmulqdq	$0x11, %xmm2, %xmm1, %xmm7
        # pclmul_2
        vmovdqu	112(%esp), %xmm1
        vmovdqu	32(%esp), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vpxor	%xmm3, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm0, %xmm1, %xmm2
        vpclmulqdq	$0x01, %xmm0, %xmm1, %xmm3
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm7, %xmm7
        # pclmul_n
        vmovdqu	128(%esp), %xmm1
        vmovdqu	16(%esp), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vpxor	%xmm2, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm0, %xmm1, %xmm2
        vpxor	%xmm3, %xmm5, %xmm5
        vpclmulqdq	$0x01, %xmm0, %xmm1, %xmm3
        vpxor	%xmm4, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm7, %xmm7
        # pclmul_n
        vmovdqu	144(%esp), %xmm1
        vmovdqu	(%esp), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vpxor	%xmm2, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm0, %xmm1, %xmm2
        vpxor	%xmm3, %xmm5, %xmm5
        vpclmulqdq	$0x01, %xmm0, %xmm1, %xmm3
        vpxor	%xmm4, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm7, %xmm7
        # aesenc_pclmul_l
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm4, %xmm6, %xmm6
        vpxor	%xmm3, %xmm5, %xmm5
        vpslldq	$8, %xmm5, %xmm1
        vpsrldq	$8, %xmm5, %xmm5
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm0
        vpxor	%xmm1, %xmm6, %xmm6
        vpxor	%xmm5, %xmm7, %xmm7
        vpclmulqdq	$16, %xmm0, %xmm6, %xmm3
        vpshufd	$0x4e, %xmm6, %xmm6
        vpxor	%xmm3, %xmm6, %xmm6
        vpclmulqdq	$16, %xmm0, %xmm6, %xmm3
        vpshufd	$0x4e, %xmm6, %xmm6
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm7, %xmm6, %xmm6
        # aesenc_64_ghash - end
        addl	$0x40, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_decrypt_update_avx2_ghash_64_inplace
        jmp	L_AES_GCM_decrypt_update_avx2_ghash_64_done
L_AES_GCM_decrypt_update_avx2_ghash_64:
        # aesenc_64_ghash
        leal	(%esi,%ebx,1), %ecx
        leal	(%edi,%ebx,1), %edx
        # aesenc_64
        # aesenc_ctr
        vmovdqu	64(%esp), %xmm4
        vmovdqu	L_aes_gcm_avx2_bswap_epi64, %xmm7
        vpaddd	L_aes_gcm_avx2_one, %xmm4, %xmm1
        vpshufb	%xmm7, %xmm4, %xmm0
        vpaddd	L_aes_gcm_avx2_two, %xmm4, %xmm2
        vpshufb	%xmm7, %xmm1, %xmm1
        vpaddd	L_aes_gcm_avx2_three, %xmm4, %xmm3
        vpshufb	%xmm7, %xmm2, %xmm2
        vpaddd	L_aes_gcm_avx2_four, %xmm4, %xmm4
        vpshufb	%xmm7, %xmm3, %xmm3
        # aesenc_xor
        vmovdqu	(%ebp), %xmm7
        vmovdqu	%xmm4, 64(%esp)
        vpxor	%xmm7, %xmm0, %xmm0
        vpxor	%xmm7, %xmm1, %xmm1
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm7, %xmm3, %xmm3
        vmovdqu	16(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	32(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	48(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	64(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	80(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	96(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	112(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	128(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	144(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$11, 184(%esp)
        vmovdqu	160(%ebp), %xmm7
        jl	L_AES_GCM_decrypt_update_avx2_aesenc_64_ghash_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	176(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        cmpl	$13, 184(%esp)
        vmovdqu	192(%ebp), %xmm7
        jl	L_AES_GCM_decrypt_update_avx2_aesenc_64_ghash_aesenc_64_enc_done
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	208(%ebp), %xmm7
        vaesenc	%xmm7, %xmm0, %xmm0
        vaesenc	%xmm7, %xmm1, %xmm1
        vaesenc	%xmm7, %xmm2, %xmm2
        vaesenc	%xmm7, %xmm3, %xmm3
        vmovdqu	224(%ebp), %xmm7
L_AES_GCM_decrypt_update_avx2_aesenc_64_ghash_aesenc_64_enc_done:
        # aesenc_last
        vaesenclast	%xmm7, %xmm0, %xmm0
        vaesenclast	%xmm7, %xmm1, %xmm1
        vaesenclast	%xmm7, %xmm2, %xmm2
        vaesenclast	%xmm7, %xmm3, %xmm3
        vmovdqu	(%ecx), %xmm7
        vmovdqu	16(%ecx), %xmm4
        vpxor	%xmm7, %xmm0, %xmm0
        vpxor	%xmm4, %xmm1, %xmm1
        vmovdqu	%xmm7, (%ecx)
        vmovdqu	%xmm4, 16(%ecx)
        vmovdqu	%xmm0, (%edx)
        vmovdqu	%xmm1, 16(%edx)
        vmovdqu	32(%ecx), %xmm7
        vmovdqu	48(%ecx), %xmm4
        vpxor	%xmm7, %xmm2, %xmm2
        vpxor	%xmm4, %xmm3, %xmm3
        vmovdqu	%xmm7, 32(%ecx)
        vmovdqu	%xmm4, 48(%ecx)
        vmovdqu	%xmm2, 32(%edx)
        vmovdqu	%xmm3, 48(%edx)
        # pclmul_1
        vmovdqu	(%ecx), %xmm1
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vmovdqu	48(%esp), %xmm2
        vpxor	%xmm6, %xmm1, %xmm1
        vpclmulqdq	$16, %xmm2, %xmm1, %xmm5
        vpclmulqdq	$0x01, %xmm2, %xmm1, %xmm3
        vpclmulqdq	$0x00, %xmm2, %xmm1, %xmm6
        vpclmulqdq	$0x11, %xmm2, %xmm1, %xmm7
        # pclmul_2
        vmovdqu	16(%ecx), %xmm1
        vmovdqu	32(%esp), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vpxor	%xmm3, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm0, %xmm1, %xmm2
        vpclmulqdq	$0x01, %xmm0, %xmm1, %xmm3
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm7, %xmm7
        # pclmul_n
        vmovdqu	32(%ecx), %xmm1
        vmovdqu	16(%esp), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vpxor	%xmm2, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm0, %xmm1, %xmm2
        vpxor	%xmm3, %xmm5, %xmm5
        vpclmulqdq	$0x01, %xmm0, %xmm1, %xmm3
        vpxor	%xmm4, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm7, %xmm7
        # pclmul_n
        vmovdqu	48(%ecx), %xmm1
        vmovdqu	(%esp), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
        vpxor	%xmm2, %xmm5, %xmm5
        vpclmulqdq	$16, %xmm0, %xmm1, %xmm2
        vpxor	%xmm3, %xmm5, %xmm5
        vpclmulqdq	$0x01, %xmm0, %xmm1, %xmm3
        vpxor	%xmm4, %xmm6, %xmm6
        vpclmulqdq	$0x00, %xmm0, %xmm1, %xmm4
        vpclmulqdq	$0x11, %xmm0, %xmm1, %xmm1
        vpxor	%xmm1, %xmm7, %xmm7
        # aesenc_pclmul_l
        vpxor	%xmm2, %xmm5, %xmm5
        vpxor	%xmm4, %xmm6, %xmm6
        vpxor	%xmm3, %xmm5, %xmm5
        vpslldq	$8, %xmm5, %xmm1
        vpsrldq	$8, %xmm5, %xmm5
        vmovdqu	L_aes_gcm_avx2_mod2_128, %xmm0
        vpxor	%xmm1, %xmm6, %xmm6
        vpxor	%xmm5, %xmm7, %xmm7
        vpclmulqdq	$16, %xmm0, %xmm6, %xmm3
        vpshufd	$0x4e, %xmm6, %xmm6
        vpxor	%xmm3, %xmm6, %xmm6
        vpclmulqdq	$16, %xmm0, %xmm6, %xmm3
        vpshufd	$0x4e, %xmm6, %xmm6
        vpxor	%xmm3, %xmm6, %xmm6
        vpxor	%xmm7, %xmm6, %xmm6
        # aesenc_64_ghash - end
        addl	$0x40, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_decrypt_update_avx2_ghash_64
L_AES_GCM_decrypt_update_avx2_ghash_64_done:
        vmovdqu	(%esp), %xmm5
        vmovdqu	64(%esp), %xmm4
L_AES_GCM_decrypt_update_avx2_done_64:
        cmpl	196(%esp), %ebx
        jge	L_AES_GCM_decrypt_update_avx2_done_dec
        movl	196(%esp), %eax
        andl	$0xfffffff0, %eax
        cmpl	%eax, %ebx
        jge	L_AES_GCM_decrypt_update_avx2_last_block_done
L_AES_GCM_decrypt_update_avx2_last_block_start:
        vmovdqu	(%esi,%ebx,1), %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_epi64, %xmm4, %xmm7
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
        vpaddd	L_aes_gcm_avx2_one, %xmm4, %xmm4
        vmovdqu	%xmm4, 64(%esp)
        vpxor	%xmm6, %xmm0, %xmm4
        # aesenc_gfmul_sb
        vpclmulqdq	$0x01, %xmm5, %xmm4, %xmm2
        vpclmulqdq	$16, %xmm5, %xmm4, %xmm3
        vpclmulqdq	$0x00, %xmm5, %xmm4, %xmm1
        vpclmulqdq	$0x11, %xmm5, %xmm4, %xmm4
        vpxor	(%ebp), %xmm7, %xmm7
        vaesenc	16(%ebp), %xmm7, %xmm7
        vpxor	%xmm2, %xmm3, %xmm3
        vpslldq	$8, %xmm3, %xmm2
        vpsrldq	$8, %xmm3, %xmm3
        vaesenc	32(%ebp), %xmm7, %xmm7
        vpxor	%xmm1, %xmm2, %xmm2
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm2, %xmm1
        vaesenc	48(%ebp), %xmm7, %xmm7
        vaesenc	64(%ebp), %xmm7, %xmm7
        vaesenc	80(%ebp), %xmm7, %xmm7
        vpshufd	$0x4e, %xmm2, %xmm2
        vpxor	%xmm1, %xmm2, %xmm2
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm2, %xmm1
        vaesenc	96(%ebp), %xmm7, %xmm7
        vaesenc	112(%ebp), %xmm7, %xmm7
        vaesenc	128(%ebp), %xmm7, %xmm7
        vpshufd	$0x4e, %xmm2, %xmm2
        vaesenc	144(%ebp), %xmm7, %xmm7
        vpxor	%xmm3, %xmm4, %xmm4
        vpxor	%xmm4, %xmm2, %xmm2
        vmovdqu	160(%ebp), %xmm0
        cmpl	$11, 184(%esp)
        jl	L_AES_GCM_decrypt_update_avx2_aesenc_gfmul_sb_last
        vaesenc	%xmm0, %xmm7, %xmm7
        vaesenc	176(%ebp), %xmm7, %xmm7
        vmovdqu	192(%ebp), %xmm0
        cmpl	$13, 184(%esp)
        jl	L_AES_GCM_decrypt_update_avx2_aesenc_gfmul_sb_last
        vaesenc	%xmm0, %xmm7, %xmm7
        vaesenc	208(%ebp), %xmm7, %xmm7
        vmovdqu	224(%ebp), %xmm0
L_AES_GCM_decrypt_update_avx2_aesenc_gfmul_sb_last:
        vaesenclast	%xmm0, %xmm7, %xmm7
        vmovdqu	(%esi,%ebx,1), %xmm3
        vpxor	%xmm1, %xmm2, %xmm6
        vpxor	%xmm3, %xmm7, %xmm7
        vmovdqu	%xmm7, (%edi,%ebx,1)
        vmovdqu	64(%esp), %xmm4
        addl	$16, %ebx
        cmpl	%eax, %ebx
        jl	L_AES_GCM_decrypt_update_avx2_last_block_start
L_AES_GCM_decrypt_update_avx2_last_block_done:
L_AES_GCM_decrypt_update_avx2_done_dec:
        movl	200(%esp), %esi
        movl	208(%esp), %edi
        vmovdqu	64(%esp), %xmm4
        vmovdqu	%xmm6, (%esi)
        vmovdqu	%xmm4, (%edi)
        addl	$0xa0, %esp
        popl	%ebp
        popl	%edi
        popl	%esi
        popl	%ebx
        ret
.size	AES_GCM_decrypt_update_avx2,.-AES_GCM_decrypt_update_avx2
.text
.globl	AES_GCM_decrypt_final_avx2
.type	AES_GCM_decrypt_final_avx2,@function
.align	16
AES_GCM_decrypt_final_avx2:
        pushl	%ebx
        pushl	%esi
        pushl	%edi
        pushl	%ebp
        subl	$16, %esp
        movl	36(%esp), %ebp
        movl	56(%esp), %esi
        movl	60(%esp), %edi
        vmovdqu	(%ebp), %xmm4
        vmovdqu	(%esi), %xmm5
        vmovdqu	(%edi), %xmm6
        vpsrlq	$63, %xmm5, %xmm1
        vpsllq	$0x01, %xmm5, %xmm0
        vpslldq	$8, %xmm1, %xmm1
        vpor	%xmm1, %xmm0, %xmm0
        vpshufd	$0xff, %xmm5, %xmm5
        vpsrad	$31, %xmm5, %xmm5
        vpand	L_aes_gcm_avx2_mod2_128, %xmm5, %xmm5
        vpxor	%xmm0, %xmm5, %xmm5
        # calc_tag
        movl	48(%esp), %ecx
        shll	$3, %ecx
        vpinsrd	$0x00, %ecx, %xmm0, %xmm0
        movl	52(%esp), %ecx
        shll	$3, %ecx
        vpinsrd	$2, %ecx, %xmm0, %xmm0
        movl	48(%esp), %ecx
        shrl	$29, %ecx
        vpinsrd	$0x01, %ecx, %xmm0, %xmm0
        movl	52(%esp), %ecx
        shrl	$29, %ecx
        vpinsrd	$3, %ecx, %xmm0, %xmm0
        vpxor	%xmm4, %xmm0, %xmm0
        # ghash_gfmul_red
        vpclmulqdq	$16, %xmm5, %xmm0, %xmm7
        vpclmulqdq	$0x01, %xmm5, %xmm0, %xmm3
        vpclmulqdq	$0x00, %xmm5, %xmm0, %xmm2
        vpxor	%xmm3, %xmm7, %xmm7
        vpslldq	$8, %xmm7, %xmm3
        vpsrldq	$8, %xmm7, %xmm7
        vpxor	%xmm2, %xmm3, %xmm3
        vpclmulqdq	$0x11, %xmm5, %xmm0, %xmm0
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm3, %xmm2
        vpshufd	$0x4e, %xmm3, %xmm3
        vpxor	%xmm2, %xmm3, %xmm3
        vpclmulqdq	$16, L_aes_gcm_avx2_mod2_128, %xmm3, %xmm2
        vpshufd	$0x4e, %xmm3, %xmm3
        vpxor	%xmm7, %xmm0, %xmm0
        vpxor	%xmm3, %xmm0, %xmm0
        vpxor	%xmm2, %xmm0, %xmm0
        vpshufb	L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
        vpxor	%xmm6, %xmm0, %xmm0
        movl	40(%esp), %esi
        movl	64(%esp), %edi
        # cmp_tag
        cmpl	$16, 44(%esp)
        je	L_AES_GCM_decrypt_final_avx2_cmp_tag_16
        xorl	%ecx, %ecx
        xorl	%edx, %edx
        vmovdqu	%xmm0, (%esp)
L_AES_GCM_decrypt_final_avx2_cmp_tag_loop:
        movzbl	(%esp,%ecx,1), %eax
        xorb	(%esi,%ecx,1), %al
        orb	%al, %dl
        incl	%ecx
        cmpl	44(%esp), %ecx
        jne	L_AES_GCM_decrypt_final_avx2_cmp_tag_loop
        cmpb	$0x00, %dl
        sete	%dl
        jmp	L_AES_GCM_decrypt_final_avx2_cmp_tag_done
L_AES_GCM_decrypt_final_avx2_cmp_tag_16:
        vmovdqu	(%esi), %xmm1
        vpcmpeqb	%xmm1, %xmm0, %xmm0
        vpmovmskb	%xmm0, %ecx
        # %%edx == 0xFFFF then return 1 else => return 0
        xorl	%edx, %edx
        cmpl	$0xffff, %ecx
        sete	%dl
L_AES_GCM_decrypt_final_avx2_cmp_tag_done:
        movl	%edx, (%edi)
        addl	$16, %esp
        popl	%ebp
        popl	%edi
        popl	%esi
        popl	%ebx
        ret
.size	AES_GCM_decrypt_final_avx2,.-AES_GCM_decrypt_final_avx2
#endif /* WOLFSSL_AESGCM_STREAM */
#endif /* HAVE_INTEL_AVX2 */

#if defined(__linux__) && defined(__ELF__)
.section	.note.GNU-stack,"",%progbits
#endif
