]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
added coff files for mingw64
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Tue, 25 Oct 2011 18:08:28 +0000 (20:08 +0200)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Tue, 25 Oct 2011 18:08:28 +0000 (20:08 +0200)
configure.ac
lib/accelerated/x86/Makefile.am
lib/accelerated/x86/asm-coff/appro-aes-gcm-x86-64-coff.s [new file with mode: 0644]
lib/accelerated/x86/asm-coff/appro-aes-x86-64-coff.s [new file with mode: 0644]
lib/accelerated/x86/asm-coff/cpuid-x86-64-coff.s [new file with mode: 0644]
lib/accelerated/x86/asm-coff/padlock-x86-64-coff.s [new file with mode: 0644]

index c881664b75965385e4474c2103467b066822d9ae..eaf7518f9cf624b4ca5986560b146c8c1e070beb 100644 (file)
@@ -70,14 +70,14 @@ AM_CONDITIONAL(WANT_TEST_SUITE, [test -f tests/suite/mini-eagain2.c])
 
 dnl Detect windows build
 case "$host" in
-  *-*-mingw32*)
-    have_win32=yes
+  *-*-mingw32* | *-*-mingw64*)
+    have_win=yes
   ;;
   *)
   ;;
 esac
 
-AM_CONDITIONAL(WIN32, test "$have_win32" = yes)
+AM_CONDITIONAL(WINDOWS, test "$have_win" = yes)
 
 dnl Hardware Acceleration
 AC_ARG_ENABLE(hardware-acceleration,
index 550bdca99496eae47887fd72c0c045644579d2d3..79acf96089416f98d612ee6ef1074fd3f6b77612 100644 (file)
@@ -39,14 +39,18 @@ noinst_LTLIBRARIES = libx86.la
 libx86_la_SOURCES = sha-padlock.c hmac-padlock.c aes-x86.c aes-padlock.c aes-gcm-padlock.c aes-padlock.h aes-x86.h x86.h sha-padlock.h
 
 if ASM_X86_64
-
 AM_CFLAGS += -DASM_X86_64 -DASM_X86
-libx86_la_SOURCES += asm/appro-aes-x86-64.s asm/appro-aes-gcm-x86-64.s aes-gcm-x86.c asm/padlock-x86-64.s asm/cpuid-x86-64.s
 
+if WINDOWS
+libx86_la_SOURCES += asm-coff/appro-aes-x86-64-coff.s asm-coff/padlock-x86-64-coff.s asm-coff/cpuid-x86-64-coff.s asm-coff/appro-aes-gcm-x86-64-coff.s
 else
+libx86_la_SOURCES += asm/appro-aes-x86-64.s asm/appro-aes-gcm-x86-64.s aes-gcm-x86.c asm/padlock-x86-64.s asm/cpuid-x86-64.s
+endif
 
+else
 AM_CFLAGS += -DASM_X86_32 -DASM_X86
-if WIN32
+
+if WINDOWS
 libx86_la_SOURCES += asm-coff/appro-aes-x86-coff.s asm-coff/padlock-x86-coff.s asm-coff/cpuid-x86-coff.s
 else
 libx86_la_SOURCES += asm/appro-aes-x86.s asm/padlock-x86.s asm/cpuid-x86.s
diff --git a/lib/accelerated/x86/asm-coff/appro-aes-gcm-x86-64-coff.s b/lib/accelerated/x86/asm-coff/appro-aes-gcm-x86-64-coff.s
new file mode 100644 (file)
index 0000000..201a790
--- /dev/null
@@ -0,0 +1,1211 @@
+# Copyright (c) 2011, Andy Polyakov by <appro@openssl.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 
+#     * Redistributions of source code must retain copyright notices,
+#      this list of conditions and the following disclaimer.
+#
+#     * Redistributions in binary form must reproduce the above
+#      copyright notice, this list of conditions and the following
+#      disclaimer in the documentation and/or other materials
+#      provided with the distribution.
+#
+#     * Neither the name of the Andy Polyakov nor the names of its
+#      copyright holder and contributors may be used to endorse or
+#      promote products derived from this software without specific
+#      prior written permission.
+#
+# ALTERNATIVELY, provided that this notice is retained in full, this
+# product may be distributed under the terms of the GNU General Public
+# License (GPL), in which case the provisions of the GPL apply INSTEAD OF
+# those given above.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+.text  
+
+.globl gcm_gmult_4bit
+.def   gcm_gmult_4bit; .scl 2; .type 32;       .endef
+.p2align       4
+gcm_gmult_4bit:
+       movq    %rdi,8(%rsp)
+       movq    %rsi,16(%rsp)
+       movq    %rsp,%rax
+.LSEH_begin_gcm_gmult_4bit:
+       movq    %rcx,%rdi
+       movq    %rdx,%rsi
+
+       pushq   %rbx
+       pushq   %rbp
+       pushq   %r12
+.Lgmult_prologue:
+
+       movzbq  15(%rdi),%r8
+       leaq    .Lrem_4bit(%rip),%r11
+       xorq    %rax,%rax
+       xorq    %rbx,%rbx
+       movb    %r8b,%al
+       movb    %r8b,%bl
+       shlb    $4,%al
+       movq    $14,%rcx
+       movq    8(%rsi,%rax,1),%r8
+       movq    (%rsi,%rax,1),%r9
+       andb    $240,%bl
+       movq    %r8,%rdx
+       jmp     .Loop1
+
+.p2align       4
+.Loop1:
+       shrq    $4,%r8
+       andq    $15,%rdx
+       movq    %r9,%r10
+       movb    (%rdi,%rcx,1),%al
+       shrq    $4,%r9
+       xorq    8(%rsi,%rbx,1),%r8
+       shlq    $60,%r10
+       xorq    (%rsi,%rbx,1),%r9
+       movb    %al,%bl
+       xorq    (%r11,%rdx,8),%r9
+       movq    %r8,%rdx
+       shlb    $4,%al
+       xorq    %r10,%r8
+       decq    %rcx
+       js      .Lbreak1
+
+       shrq    $4,%r8
+       andq    $15,%rdx
+       movq    %r9,%r10
+       shrq    $4,%r9
+       xorq    8(%rsi,%rax,1),%r8
+       shlq    $60,%r10
+       xorq    (%rsi,%rax,1),%r9
+       andb    $240,%bl
+       xorq    (%r11,%rdx,8),%r9
+       movq    %r8,%rdx
+       xorq    %r10,%r8
+       jmp     .Loop1
+
+.p2align       4
+.Lbreak1:
+       shrq    $4,%r8
+       andq    $15,%rdx
+       movq    %r9,%r10
+       shrq    $4,%r9
+       xorq    8(%rsi,%rax,1),%r8
+       shlq    $60,%r10
+       xorq    (%rsi,%rax,1),%r9
+       andb    $240,%bl
+       xorq    (%r11,%rdx,8),%r9
+       movq    %r8,%rdx
+       xorq    %r10,%r8
+
+       shrq    $4,%r8
+       andq    $15,%rdx
+       movq    %r9,%r10
+       shrq    $4,%r9
+       xorq    8(%rsi,%rbx,1),%r8
+       shlq    $60,%r10
+       xorq    (%rsi,%rbx,1),%r9
+       xorq    %r10,%r8
+       xorq    (%r11,%rdx,8),%r9
+
+       bswapq  %r8
+       bswapq  %r9
+       movq    %r8,8(%rdi)
+       movq    %r9,(%rdi)
+
+       movq    16(%rsp),%rbx
+       leaq    24(%rsp),%rsp
+.Lgmult_epilogue:
+       movq    8(%rsp),%rdi
+       movq    16(%rsp),%rsi
+       .byte   0xf3,0xc3
+.LSEH_end_gcm_gmult_4bit:
+.globl gcm_ghash_4bit
+.def   gcm_ghash_4bit; .scl 2; .type 32;       .endef
+.p2align       4
+gcm_ghash_4bit:
+       movq    %rdi,8(%rsp)
+       movq    %rsi,16(%rsp)
+       movq    %rsp,%rax
+.LSEH_begin_gcm_ghash_4bit:
+       movq    %rcx,%rdi
+       movq    %rdx,%rsi
+       movq    %r8,%rdx
+       movq    %r9,%rcx
+
+       pushq   %rbx
+       pushq   %rbp
+       pushq   %r12
+       pushq   %r13
+       pushq   %r14
+       pushq   %r15
+       subq    $280,%rsp
+.Lghash_prologue:
+       movq    %rdx,%r14
+       movq    %rcx,%r15
+       subq    $-128,%rsi
+       leaq    16+128(%rsp),%rbp
+       xorl    %edx,%edx
+       movq    0+0-128(%rsi),%r8
+       movq    0+8-128(%rsi),%rax
+       movb    %al,%dl
+       shrq    $4,%rax
+       movq    %r8,%r10
+       shrq    $4,%r8
+       movq    16+0-128(%rsi),%r9
+       shlb    $4,%dl
+       movq    16+8-128(%rsi),%rbx
+       shlq    $60,%r10
+       movb    %dl,0(%rsp)
+       orq     %r10,%rax
+       movb    %bl,%dl
+       shrq    $4,%rbx
+       movq    %r9,%r10
+       shrq    $4,%r9
+       movq    %r8,0(%rbp)
+       movq    32+0-128(%rsi),%r8
+       shlb    $4,%dl
+       movq    %rax,0-128(%rbp)
+       movq    32+8-128(%rsi),%rax
+       shlq    $60,%r10
+       movb    %dl,1(%rsp)
+       orq     %r10,%rbx
+       movb    %al,%dl
+       shrq    $4,%rax
+       movq    %r8,%r10
+       shrq    $4,%r8
+       movq    %r9,8(%rbp)
+       movq    48+0-128(%rsi),%r9
+       shlb    $4,%dl
+       movq    %rbx,8-128(%rbp)
+       movq    48+8-128(%rsi),%rbx
+       shlq    $60,%r10
+       movb    %dl,2(%rsp)
+       orq     %r10,%rax
+       movb    %bl,%dl
+       shrq    $4,%rbx
+       movq    %r9,%r10
+       shrq    $4,%r9
+       movq    %r8,16(%rbp)
+       movq    64+0-128(%rsi),%r8
+       shlb    $4,%dl
+       movq    %rax,16-128(%rbp)
+       movq    64+8-128(%rsi),%rax
+       shlq    $60,%r10
+       movb    %dl,3(%rsp)
+       orq     %r10,%rbx
+       movb    %al,%dl
+       shrq    $4,%rax
+       movq    %r8,%r10
+       shrq    $4,%r8
+       movq    %r9,24(%rbp)
+       movq    80+0-128(%rsi),%r9
+       shlb    $4,%dl
+       movq    %rbx,24-128(%rbp)
+       movq    80+8-128(%rsi),%rbx
+       shlq    $60,%r10
+       movb    %dl,4(%rsp)
+       orq     %r10,%rax
+       movb    %bl,%dl
+       shrq    $4,%rbx
+       movq    %r9,%r10
+       shrq    $4,%r9
+       movq    %r8,32(%rbp)
+       movq    96+0-128(%rsi),%r8
+       shlb    $4,%dl
+       movq    %rax,32-128(%rbp)
+       movq    96+8-128(%rsi),%rax
+       shlq    $60,%r10
+       movb    %dl,5(%rsp)
+       orq     %r10,%rbx
+       movb    %al,%dl
+       shrq    $4,%rax
+       movq    %r8,%r10
+       shrq    $4,%r8
+       movq    %r9,40(%rbp)
+       movq    112+0-128(%rsi),%r9
+       shlb    $4,%dl
+       movq    %rbx,40-128(%rbp)
+       movq    112+8-128(%rsi),%rbx
+       shlq    $60,%r10
+       movb    %dl,6(%rsp)
+       orq     %r10,%rax
+       movb    %bl,%dl
+       shrq    $4,%rbx
+       movq    %r9,%r10
+       shrq    $4,%r9
+       movq    %r8,48(%rbp)
+       movq    128+0-128(%rsi),%r8
+       shlb    $4,%dl
+       movq    %rax,48-128(%rbp)
+       movq    128+8-128(%rsi),%rax
+       shlq    $60,%r10
+       movb    %dl,7(%rsp)
+       orq     %r10,%rbx
+       movb    %al,%dl
+       shrq    $4,%rax
+       movq    %r8,%r10
+       shrq    $4,%r8
+       movq    %r9,56(%rbp)
+       movq    144+0-128(%rsi),%r9
+       shlb    $4,%dl
+       movq    %rbx,56-128(%rbp)
+       movq    144+8-128(%rsi),%rbx
+       shlq    $60,%r10
+       movb    %dl,8(%rsp)
+       orq     %r10,%rax
+       movb    %bl,%dl
+       shrq    $4,%rbx
+       movq    %r9,%r10
+       shrq    $4,%r9
+       movq    %r8,64(%rbp)
+       movq    160+0-128(%rsi),%r8
+       shlb    $4,%dl
+       movq    %rax,64-128(%rbp)
+       movq    160+8-128(%rsi),%rax
+       shlq    $60,%r10
+       movb    %dl,9(%rsp)
+       orq     %r10,%rbx
+       movb    %al,%dl
+       shrq    $4,%rax
+       movq    %r8,%r10
+       shrq    $4,%r8
+       movq    %r9,72(%rbp)
+       movq    176+0-128(%rsi),%r9
+       shlb    $4,%dl
+       movq    %rbx,72-128(%rbp)
+       movq    176+8-128(%rsi),%rbx
+       shlq    $60,%r10
+       movb    %dl,10(%rsp)
+       orq     %r10,%rax
+       movb    %bl,%dl
+       shrq    $4,%rbx
+       movq    %r9,%r10
+       shrq    $4,%r9
+       movq    %r8,80(%rbp)
+       movq    192+0-128(%rsi),%r8
+       shlb    $4,%dl
+       movq    %rax,80-128(%rbp)
+       movq    192+8-128(%rsi),%rax
+       shlq    $60,%r10
+       movb    %dl,11(%rsp)
+       orq     %r10,%rbx
+       movb    %al,%dl
+       shrq    $4,%rax
+       movq    %r8,%r10
+       shrq    $4,%r8
+       movq    %r9,88(%rbp)
+       movq    208+0-128(%rsi),%r9
+       shlb    $4,%dl
+       movq    %rbx,88-128(%rbp)
+       movq    208+8-128(%rsi),%rbx
+       shlq    $60,%r10
+       movb    %dl,12(%rsp)
+       orq     %r10,%rax
+       movb    %bl,%dl
+       shrq    $4,%rbx
+       movq    %r9,%r10
+       shrq    $4,%r9
+       movq    %r8,96(%rbp)
+       movq    224+0-128(%rsi),%r8
+       shlb    $4,%dl
+       movq    %rax,96-128(%rbp)
+       movq    224+8-128(%rsi),%rax
+       shlq    $60,%r10
+       movb    %dl,13(%rsp)
+       orq     %r10,%rbx
+       movb    %al,%dl
+       shrq    $4,%rax
+       movq    %r8,%r10
+       shrq    $4,%r8
+       movq    %r9,104(%rbp)
+       movq    240+0-128(%rsi),%r9
+       shlb    $4,%dl
+       movq    %rbx,104-128(%rbp)
+       movq    240+8-128(%rsi),%rbx
+       shlq    $60,%r10
+       movb    %dl,14(%rsp)
+       orq     %r10,%rax
+       movb    %bl,%dl
+       shrq    $4,%rbx
+       movq    %r9,%r10
+       shrq    $4,%r9
+       movq    %r8,112(%rbp)
+       shlb    $4,%dl
+       movq    %rax,112-128(%rbp)
+       shlq    $60,%r10
+       movb    %dl,15(%rsp)
+       orq     %r10,%rbx
+       movq    %r9,120(%rbp)
+       movq    %rbx,120-128(%rbp)
+       addq    $-128,%rsi
+       movq    8(%rdi),%r8
+       movq    0(%rdi),%r9
+       addq    %r14,%r15
+       leaq    .Lrem_8bit(%rip),%r11
+       jmp     .Louter_loop
+.p2align       4
+.Louter_loop:
+       xorq    (%r14),%r9
+       movq    8(%r14),%rdx
+       leaq    16(%r14),%r14
+       xorq    %r8,%rdx
+       movq    %r9,(%rdi)
+       movq    %rdx,8(%rdi)
+       shrq    $32,%rdx
+       xorq    %rax,%rax
+       roll    $8,%edx
+       movb    %dl,%al
+       movzbl  %dl,%ebx
+       shlb    $4,%al
+       shrl    $4,%ebx
+       roll    $8,%edx
+       movq    8(%rsi,%rax,1),%r8
+       movq    (%rsi,%rax,1),%r9
+       movb    %dl,%al
+       movzbl  %dl,%ecx
+       shlb    $4,%al
+       movzbq  (%rsp,%rbx,1),%r12
+       shrl    $4,%ecx
+       xorq    %r8,%r12
+       movq    %r9,%r10
+       shrq    $8,%r8
+       movzbq  %r12b,%r12
+       shrq    $8,%r9
+       xorq    -128(%rbp,%rbx,8),%r8
+       shlq    $56,%r10
+       xorq    (%rbp,%rbx,8),%r9
+       roll    $8,%edx
+       xorq    8(%rsi,%rax,1),%r8
+       xorq    (%rsi,%rax,1),%r9
+       movb    %dl,%al
+       xorq    %r10,%r8
+       movzwq  (%r11,%r12,2),%r12
+       movzbl  %dl,%ebx
+       shlb    $4,%al
+       movzbq  (%rsp,%rcx,1),%r13
+       shrl    $4,%ebx
+       shlq    $48,%r12
+       xorq    %r8,%r13
+       movq    %r9,%r10
+       xorq    %r12,%r9
+       shrq    $8,%r8
+       movzbq  %r13b,%r13
+       shrq    $8,%r9
+       xorq    -128(%rbp,%rcx,8),%r8
+       shlq    $56,%r10
+       xorq    (%rbp,%rcx,8),%r9
+       roll    $8,%edx
+       xorq    8(%rsi,%rax,1),%r8
+       xorq    (%rsi,%rax,1),%r9
+       movb    %dl,%al
+       xorq    %r10,%r8
+       movzwq  (%r11,%r13,2),%r13
+       movzbl  %dl,%ecx
+       shlb    $4,%al
+       movzbq  (%rsp,%rbx,1),%r12
+       shrl    $4,%ecx
+       shlq    $48,%r13
+       xorq    %r8,%r12
+       movq    %r9,%r10
+       xorq    %r13,%r9
+       shrq    $8,%r8
+       movzbq  %r12b,%r12
+       movl    8(%rdi),%edx
+       shrq    $8,%r9
+       xorq    -128(%rbp,%rbx,8),%r8
+       shlq    $56,%r10
+       xorq    (%rbp,%rbx,8),%r9
+       roll    $8,%edx
+       xorq    8(%rsi,%rax,1),%r8
+       xorq    (%rsi,%rax,1),%r9
+       movb    %dl,%al
+       xorq    %r10,%r8
+       movzwq  (%r11,%r12,2),%r12
+       movzbl  %dl,%ebx
+       shlb    $4,%al
+       movzbq  (%rsp,%rcx,1),%r13
+       shrl    $4,%ebx
+       shlq    $48,%r12
+       xorq    %r8,%r13
+       movq    %r9,%r10
+       xorq    %r12,%r9
+       shrq    $8,%r8
+       movzbq  %r13b,%r13
+       shrq    $8,%r9
+       xorq    -128(%rbp,%rcx,8),%r8
+       shlq    $56,%r10
+       xorq    (%rbp,%rcx,8),%r9
+       roll    $8,%edx
+       xorq    8(%rsi,%rax,1),%r8
+       xorq    (%rsi,%rax,1),%r9
+       movb    %dl,%al
+       xorq    %r10,%r8
+       movzwq  (%r11,%r13,2),%r13
+       movzbl  %dl,%ecx
+       shlb    $4,%al
+       movzbq  (%rsp,%rbx,1),%r12
+       shrl    $4,%ecx
+       shlq    $48,%r13
+       xorq    %r8,%r12
+       movq    %r9,%r10
+       xorq    %r13,%r9
+       shrq    $8,%r8
+       movzbq  %r12b,%r12
+       shrq    $8,%r9
+       xorq    -128(%rbp,%rbx,8),%r8
+       shlq    $56,%r10
+       xorq    (%rbp,%rbx,8),%r9
+       roll    $8,%edx
+       xorq    8(%rsi,%rax,1),%r8
+       xorq    (%rsi,%rax,1),%r9
+       movb    %dl,%al
+       xorq    %r10,%r8
+       movzwq  (%r11,%r12,2),%r12
+       movzbl  %dl,%ebx
+       shlb    $4,%al
+       movzbq  (%rsp,%rcx,1),%r13
+       shrl    $4,%ebx
+       shlq    $48,%r12
+       xorq    %r8,%r13
+       movq    %r9,%r10
+       xorq    %r12,%r9
+       shrq    $8,%r8
+       movzbq  %r13b,%r13
+       shrq    $8,%r9
+       xorq    -128(%rbp,%rcx,8),%r8
+       shlq    $56,%r10
+       xorq    (%rbp,%rcx,8),%r9
+       roll    $8,%edx
+       xorq    8(%rsi,%rax,1),%r8
+       xorq    (%rsi,%rax,1),%r9
+       movb    %dl,%al
+       xorq    %r10,%r8
+       movzwq  (%r11,%r13,2),%r13
+       movzbl  %dl,%ecx
+       shlb    $4,%al
+       movzbq  (%rsp,%rbx,1),%r12
+       shrl    $4,%ecx
+       shlq    $48,%r13
+       xorq    %r8,%r12
+       movq    %r9,%r10
+       xorq    %r13,%r9
+       shrq    $8,%r8
+       movzbq  %r12b,%r12
+       movl    4(%rdi),%edx
+       shrq    $8,%r9
+       xorq    -128(%rbp,%rbx,8),%r8
+       shlq    $56,%r10
+       xorq    (%rbp,%rbx,8),%r9
+       roll    $8,%edx
+       xorq    8(%rsi,%rax,1),%r8
+       xorq    (%rsi,%rax,1),%r9
+       movb    %dl,%al
+       xorq    %r10,%r8
+       movzwq  (%r11,%r12,2),%r12
+       movzbl  %dl,%ebx
+       shlb    $4,%al
+       movzbq  (%rsp,%rcx,1),%r13
+       shrl    $4,%ebx
+       shlq    $48,%r12
+       xorq    %r8,%r13
+       movq    %r9,%r10
+       xorq    %r12,%r9
+       shrq    $8,%r8
+       movzbq  %r13b,%r13
+       shrq    $8,%r9
+       xorq    -128(%rbp,%rcx,8),%r8
+       shlq    $56,%r10
+       xorq    (%rbp,%rcx,8),%r9
+       roll    $8,%edx
+       xorq    8(%rsi,%rax,1),%r8
+       xorq    (%rsi,%rax,1),%r9
+       movb    %dl,%al
+       xorq    %r10,%r8
+       movzwq  (%r11,%r13,2),%r13
+       movzbl  %dl,%ecx
+       shlb    $4,%al
+       movzbq  (%rsp,%rbx,1),%r12
+       shrl    $4,%ecx
+       shlq    $48,%r13
+       xorq    %r8,%r12
+       movq    %r9,%r10
+       xorq    %r13,%r9
+       shrq    $8,%r8
+       movzbq  %r12b,%r12
+       shrq    $8,%r9
+       xorq    -128(%rbp,%rbx,8),%r8
+       shlq    $56,%r10
+       xorq    (%rbp,%rbx,8),%r9
+       roll    $8,%edx
+       xorq    8(%rsi,%rax,1),%r8
+       xorq    (%rsi,%rax,1),%r9
+       movb    %dl,%al
+       xorq    %r10,%r8
+       movzwq  (%r11,%r12,2),%r12
+       movzbl  %dl,%ebx
+       shlb    $4,%al
+       movzbq  (%rsp,%rcx,1),%r13
+       shrl    $4,%ebx
+       shlq    $48,%r12
+       xorq    %r8,%r13
+       movq    %r9,%r10
+       xorq    %r12,%r9
+       shrq    $8,%r8
+       movzbq  %r13b,%r13
+       shrq    $8,%r9
+       xorq    -128(%rbp,%rcx,8),%r8
+       shlq    $56,%r10
+       xorq    (%rbp,%rcx,8),%r9
+       roll    $8,%edx
+       xorq    8(%rsi,%rax,1),%r8
+       xorq    (%rsi,%rax,1),%r9
+       movb    %dl,%al
+       xorq    %r10,%r8
+       movzwq  (%r11,%r13,2),%r13
+       movzbl  %dl,%ecx
+       shlb    $4,%al
+       movzbq  (%rsp,%rbx,1),%r12
+       shrl    $4,%ecx
+       shlq    $48,%r13
+       xorq    %r8,%r12
+       movq    %r9,%r10
+       xorq    %r13,%r9
+       shrq    $8,%r8
+       movzbq  %r12b,%r12
+       movl    0(%rdi),%edx
+       shrq    $8,%r9
+       xorq    -128(%rbp,%rbx,8),%r8
+       shlq    $56,%r10
+       xorq    (%rbp,%rbx,8),%r9
+       roll    $8,%edx
+       xorq    8(%rsi,%rax,1),%r8
+       xorq    (%rsi,%rax,1),%r9
+       movb    %dl,%al
+       xorq    %r10,%r8
+       movzwq  (%r11,%r12,2),%r12
+       movzbl  %dl,%ebx
+       shlb    $4,%al
+       movzbq  (%rsp,%rcx,1),%r13
+       shrl    $4,%ebx
+       shlq    $48,%r12
+       xorq    %r8,%r13
+       movq    %r9,%r10
+       xorq    %r12,%r9
+       shrq    $8,%r8
+       movzbq  %r13b,%r13
+       shrq    $8,%r9
+       xorq    -128(%rbp,%rcx,8),%r8
+       shlq    $56,%r10
+       xorq    (%rbp,%rcx,8),%r9
+       roll    $8,%edx
+       xorq    8(%rsi,%rax,1),%r8
+       xorq    (%rsi,%rax,1),%r9
+       movb    %dl,%al
+       xorq    %r10,%r8
+       movzwq  (%r11,%r13,2),%r13
+       movzbl  %dl,%ecx
+       shlb    $4,%al
+       movzbq  (%rsp,%rbx,1),%r12
+       shrl    $4,%ecx
+       shlq    $48,%r13
+       xorq    %r8,%r12
+       movq    %r9,%r10
+       xorq    %r13,%r9
+       shrq    $8,%r8
+       movzbq  %r12b,%r12
+       shrq    $8,%r9
+       xorq    -128(%rbp,%rbx,8),%r8
+       shlq    $56,%r10
+       xorq    (%rbp,%rbx,8),%r9
+       roll    $8,%edx
+       xorq    8(%rsi,%rax,1),%r8
+       xorq    (%rsi,%rax,1),%r9
+       movb    %dl,%al
+       xorq    %r10,%r8
+       movzwq  (%r11,%r12,2),%r12
+       movzbl  %dl,%ebx
+       shlb    $4,%al
+       movzbq  (%rsp,%rcx,1),%r13
+       shrl    $4,%ebx
+       shlq    $48,%r12
+       xorq    %r8,%r13
+       movq    %r9,%r10
+       xorq    %r12,%r9
+       shrq    $8,%r8
+       movzbq  %r13b,%r13
+       shrq    $8,%r9
+       xorq    -128(%rbp,%rcx,8),%r8
+       shlq    $56,%r10
+       xorq    (%rbp,%rcx,8),%r9
+       roll    $8,%edx
+       xorq    8(%rsi,%rax,1),%r8
+       xorq    (%rsi,%rax,1),%r9
+       movb    %dl,%al
+       xorq    %r10,%r8
+       movzwq  (%r11,%r13,2),%r13
+       movzbl  %dl,%ecx
+       shlb    $4,%al
+       movzbq  (%rsp,%rbx,1),%r12
+       andl    $240,%ecx
+       shlq    $48,%r13
+       xorq    %r8,%r12
+       movq    %r9,%r10
+       xorq    %r13,%r9
+       shrq    $8,%r8
+       movzbq  %r12b,%r12
+       movl    -4(%rdi),%edx
+       shrq    $8,%r9
+       xorq    -128(%rbp,%rbx,8),%r8
+       shlq    $56,%r10
+       xorq    (%rbp,%rbx,8),%r9
+       movzwq  (%r11,%r12,2),%r12
+       xorq    8(%rsi,%rax,1),%r8
+       xorq    (%rsi,%rax,1),%r9
+       shlq    $48,%r12
+       xorq    %r10,%r8
+       xorq    %r12,%r9
+       movzbq  %r8b,%r13
+       shrq    $4,%r8
+       movq    %r9,%r10
+       shlb    $4,%r13b
+       shrq    $4,%r9
+       xorq    8(%rsi,%rcx,1),%r8
+       movzwq  (%r11,%r13,2),%r13
+       shlq    $60,%r10
+       xorq    (%rsi,%rcx,1),%r9
+       xorq    %r10,%r8
+       shlq    $48,%r13
+       bswapq  %r8
+       xorq    %r13,%r9
+       bswapq  %r9
+       cmpq    %r15,%r14
+       jb      .Louter_loop
+       movq    %r8,8(%rdi)
+       movq    %r9,(%rdi)
+
+       leaq    280(%rsp),%rsi
+       movq    0(%rsi),%r15
+       movq    8(%rsi),%r14
+       movq    16(%rsi),%r13
+       movq    24(%rsi),%r12
+       movq    32(%rsi),%rbp
+       movq    40(%rsi),%rbx
+       leaq    48(%rsi),%rsp
+.Lghash_epilogue:
+       movq    8(%rsp),%rdi
+       movq    16(%rsp),%rsi
+       .byte   0xf3,0xc3
+.LSEH_end_gcm_ghash_4bit:
+.globl gcm_init_clmul
+.def   gcm_init_clmul; .scl 2; .type 32;       .endef
+.p2align       4
+gcm_init_clmul:
+       movdqu  (%rdx),%xmm2
+       pshufd  $78,%xmm2,%xmm2
+
+
+       pshufd  $255,%xmm2,%xmm4
+       movdqa  %xmm2,%xmm3
+       psllq   $1,%xmm2
+       pxor    %xmm5,%xmm5
+       psrlq   $63,%xmm3
+       pcmpgtd %xmm4,%xmm5
+       pslldq  $8,%xmm3
+       por     %xmm3,%xmm2
+
+
+       pand    .L0x1c2_polynomial(%rip),%xmm5
+       pxor    %xmm5,%xmm2
+
+
+       movdqa  %xmm2,%xmm0
+       movdqa  %xmm0,%xmm1
+       pshufd  $78,%xmm0,%xmm3
+       pshufd  $78,%xmm2,%xmm4
+       pxor    %xmm0,%xmm3
+       pxor    %xmm2,%xmm4
+.byte  102,15,58,68,194,0
+.byte  102,15,58,68,202,17
+.byte  102,15,58,68,220,0
+       pxor    %xmm0,%xmm3
+       pxor    %xmm1,%xmm3
+
+       movdqa  %xmm3,%xmm4
+       psrldq  $8,%xmm3
+       pslldq  $8,%xmm4
+       pxor    %xmm3,%xmm1
+       pxor    %xmm4,%xmm0
+
+       movdqa  %xmm0,%xmm3
+       psllq   $1,%xmm0
+       pxor    %xmm3,%xmm0
+       psllq   $5,%xmm0
+       pxor    %xmm3,%xmm0
+       psllq   $57,%xmm0
+       movdqa  %xmm0,%xmm4
+       pslldq  $8,%xmm0
+       psrldq  $8,%xmm4
+       pxor    %xmm3,%xmm0
+       pxor    %xmm4,%xmm1
+
+
+       movdqa  %xmm0,%xmm4
+       psrlq   $5,%xmm0
+       pxor    %xmm4,%xmm0
+       psrlq   $1,%xmm0
+       pxor    %xmm4,%xmm0
+       pxor    %xmm1,%xmm4
+       psrlq   $1,%xmm0
+       pxor    %xmm4,%xmm0
+       movdqu  %xmm2,(%rcx)
+       movdqu  %xmm0,16(%rcx)
+       .byte   0xf3,0xc3
+
+.globl gcm_gmult_clmul
+.def   gcm_gmult_clmul;        .scl 2; .type 32;       .endef
+.p2align       4
+gcm_gmult_clmul:
+       movdqu  (%rcx),%xmm0
+       movdqa  .Lbswap_mask(%rip),%xmm5
+       movdqu  (%rdx),%xmm2
+.byte  102,15,56,0,197
+       movdqa  %xmm0,%xmm1
+       pshufd  $78,%xmm0,%xmm3
+       pshufd  $78,%xmm2,%xmm4
+       pxor    %xmm0,%xmm3
+       pxor    %xmm2,%xmm4
+.byte  102,15,58,68,194,0
+.byte  102,15,58,68,202,17
+.byte  102,15,58,68,220,0
+       pxor    %xmm0,%xmm3
+       pxor    %xmm1,%xmm3
+
+       movdqa  %xmm3,%xmm4
+       psrldq  $8,%xmm3
+       pslldq  $8,%xmm4
+       pxor    %xmm3,%xmm1
+       pxor    %xmm4,%xmm0
+
+       movdqa  %xmm0,%xmm3
+       psllq   $1,%xmm0
+       pxor    %xmm3,%xmm0
+       psllq   $5,%xmm0
+       pxor    %xmm3,%xmm0
+       psllq   $57,%xmm0
+       movdqa  %xmm0,%xmm4
+       pslldq  $8,%xmm0
+       psrldq  $8,%xmm4
+       pxor    %xmm3,%xmm0
+       pxor    %xmm4,%xmm1
+
+
+       movdqa  %xmm0,%xmm4
+       psrlq   $5,%xmm0
+       pxor    %xmm4,%xmm0
+       psrlq   $1,%xmm0
+       pxor    %xmm4,%xmm0
+       pxor    %xmm1,%xmm4
+       psrlq   $1,%xmm0
+       pxor    %xmm4,%xmm0
+.byte  102,15,56,0,197
+       movdqu  %xmm0,(%rcx)
+       .byte   0xf3,0xc3
+
+.globl gcm_ghash_clmul
+.def   gcm_ghash_clmul;        .scl 2; .type 32;       .endef
+.p2align       4
+gcm_ghash_clmul:
+.LSEH_begin_gcm_ghash_clmul:
+
+.byte  0x48,0x83,0xec,0x58             
+.byte  0x0f,0x29,0x34,0x24             
+.byte  0x0f,0x29,0x7c,0x24,0x10        
+.byte  0x44,0x0f,0x29,0x44,0x24,0x20   
+.byte  0x44,0x0f,0x29,0x4c,0x24,0x30   
+.byte  0x44,0x0f,0x29,0x54,0x24,0x40   
+       movdqa  .Lbswap_mask(%rip),%xmm5
+
+       movdqu  (%rcx),%xmm0
+       movdqu  (%rdx),%xmm2
+.byte  102,15,56,0,197
+
+       subq    $16,%r9
+       jz      .Lodd_tail
+
+       movdqu  16(%rdx),%xmm8
+
+
+
+
+
+       movdqu  (%r8),%xmm3
+       movdqu  16(%r8),%xmm6
+.byte  102,15,56,0,221
+.byte  102,15,56,0,245
+       pxor    %xmm3,%xmm0
+       movdqa  %xmm6,%xmm7
+       pshufd  $78,%xmm6,%xmm3
+       pshufd  $78,%xmm2,%xmm4
+       pxor    %xmm6,%xmm3
+       pxor    %xmm2,%xmm4
+.byte  102,15,58,68,242,0
+.byte  102,15,58,68,250,17
+.byte  102,15,58,68,220,0
+       pxor    %xmm6,%xmm3
+       pxor    %xmm7,%xmm3
+
+       movdqa  %xmm3,%xmm4
+       psrldq  $8,%xmm3
+       pslldq  $8,%xmm4
+       pxor    %xmm3,%xmm7
+       pxor    %xmm4,%xmm6
+       movdqa  %xmm0,%xmm1
+       pshufd  $78,%xmm0,%xmm3
+       pshufd  $78,%xmm8,%xmm4
+       pxor    %xmm0,%xmm3
+       pxor    %xmm8,%xmm4
+
+       leaq    32(%r8),%r8
+       subq    $32,%r9
+       jbe     .Leven_tail
+
+.Lmod_loop:
+.byte  102,65,15,58,68,192,0
+.byte  102,65,15,58,68,200,17
+.byte  102,15,58,68,220,0
+       pxor    %xmm0,%xmm3
+       pxor    %xmm1,%xmm3
+
+       movdqa  %xmm3,%xmm4
+       psrldq  $8,%xmm3
+       pslldq  $8,%xmm4
+       pxor    %xmm3,%xmm1
+       pxor    %xmm4,%xmm0
+       movdqu  (%r8),%xmm3
+       pxor    %xmm6,%xmm0
+       pxor    %xmm7,%xmm1
+
+       movdqu  16(%r8),%xmm6
+.byte  102,15,56,0,221
+.byte  102,15,56,0,245
+
+       movdqa  %xmm6,%xmm7
+       pshufd  $78,%xmm6,%xmm9
+       pshufd  $78,%xmm2,%xmm10
+       pxor    %xmm6,%xmm9
+       pxor    %xmm2,%xmm10
+       pxor    %xmm3,%xmm1
+
+       movdqa  %xmm0,%xmm3
+       psllq   $1,%xmm0
+       pxor    %xmm3,%xmm0
+       psllq   $5,%xmm0
+       pxor    %xmm3,%xmm0
+.byte  102,15,58,68,242,0
+       psllq   $57,%xmm0
+       movdqa  %xmm0,%xmm4
+       pslldq  $8,%xmm0
+       psrldq  $8,%xmm4
+       pxor    %xmm3,%xmm0
+       pxor    %xmm4,%xmm1
+
+.byte  102,15,58,68,250,17
+       movdqa  %xmm0,%xmm4
+       psrlq   $5,%xmm0
+       pxor    %xmm4,%xmm0
+       psrlq   $1,%xmm0
+       pxor    %xmm4,%xmm0
+       pxor    %xmm1,%xmm4
+       psrlq   $1,%xmm0
+       pxor    %xmm4,%xmm0
+
+.byte  102,69,15,58,68,202,0
+       movdqa  %xmm0,%xmm1
+       pshufd  $78,%xmm0,%xmm3
+       pshufd  $78,%xmm8,%xmm4
+       pxor    %xmm0,%xmm3
+       pxor    %xmm8,%xmm4
+
+       pxor    %xmm6,%xmm9
+       pxor    %xmm7,%xmm9
+       movdqa  %xmm9,%xmm10
+       psrldq  $8,%xmm9
+       pslldq  $8,%xmm10
+       pxor    %xmm9,%xmm7
+       pxor    %xmm10,%xmm6
+
+       leaq    32(%r8),%r8
+       subq    $32,%r9
+       ja      .Lmod_loop
+
+.Leven_tail:
+.byte  102,65,15,58,68,192,0
+.byte  102,65,15,58,68,200,17
+.byte  102,15,58,68,220,0
+       pxor    %xmm0,%xmm3
+       pxor    %xmm1,%xmm3
+
+       movdqa  %xmm3,%xmm4
+       psrldq  $8,%xmm3
+       pslldq  $8,%xmm4
+       pxor    %xmm3,%xmm1
+       pxor    %xmm4,%xmm0
+       pxor    %xmm6,%xmm0
+       pxor    %xmm7,%xmm1
+
+       movdqa  %xmm0,%xmm3
+       psllq   $1,%xmm0
+       pxor    %xmm3,%xmm0
+       psllq   $5,%xmm0
+       pxor    %xmm3,%xmm0
+       psllq   $57,%xmm0
+       movdqa  %xmm0,%xmm4
+       pslldq  $8,%xmm0
+       psrldq  $8,%xmm4
+       pxor    %xmm3,%xmm0
+       pxor    %xmm4,%xmm1
+
+
+       movdqa  %xmm0,%xmm4
+       psrlq   $5,%xmm0
+       pxor    %xmm4,%xmm0
+       psrlq   $1,%xmm0
+       pxor    %xmm4,%xmm0
+       pxor    %xmm1,%xmm4
+       psrlq   $1,%xmm0
+       pxor    %xmm4,%xmm0
+       testq   %r9,%r9
+       jnz     .Ldone
+
+.Lodd_tail:
+       movdqu  (%r8),%xmm3
+.byte  102,15,56,0,221
+       pxor    %xmm3,%xmm0
+       movdqa  %xmm0,%xmm1
+       pshufd  $78,%xmm0,%xmm3
+       pshufd  $78,%xmm2,%xmm4
+       pxor    %xmm0,%xmm3
+       pxor    %xmm2,%xmm4
+.byte  102,15,58,68,194,0
+.byte  102,15,58,68,202,17
+.byte  102,15,58,68,220,0
+       pxor    %xmm0,%xmm3
+       pxor    %xmm1,%xmm3
+
+       movdqa  %xmm3,%xmm4
+       psrldq  $8,%xmm3
+       pslldq  $8,%xmm4
+       pxor    %xmm3,%xmm1
+       pxor    %xmm4,%xmm0
+
+       movdqa  %xmm0,%xmm3
+       psllq   $1,%xmm0
+       pxor    %xmm3,%xmm0
+       psllq   $5,%xmm0
+       pxor    %xmm3,%xmm0
+       psllq   $57,%xmm0
+       movdqa  %xmm0,%xmm4
+       pslldq  $8,%xmm0
+       psrldq  $8,%xmm4
+       pxor    %xmm3,%xmm0
+       pxor    %xmm4,%xmm1
+
+
+       movdqa  %xmm0,%xmm4
+       psrlq   $5,%xmm0
+       pxor    %xmm4,%xmm0
+       psrlq   $1,%xmm0
+       pxor    %xmm4,%xmm0
+       pxor    %xmm1,%xmm4
+       psrlq   $1,%xmm0
+       pxor    %xmm4,%xmm0
+.Ldone:
+.byte  102,15,56,0,197
+       movdqu  %xmm0,(%rcx)
+       movaps  (%rsp),%xmm6
+       movaps  16(%rsp),%xmm7
+       movaps  32(%rsp),%xmm8
+       movaps  48(%rsp),%xmm9
+       movaps  64(%rsp),%xmm10
+       addq    $88,%rsp
+       .byte   0xf3,0xc3
+.LSEH_end_gcm_ghash_clmul:
+
+.p2align       6
+.Lbswap_mask:
+.byte  15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
+.L0x1c2_polynomial:
+.byte  1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2
+.p2align       6
+
+.Lrem_4bit:
+.long  0,0,0,471859200,0,943718400,0,610271232
+.long  0,1887436800,0,1822425088,0,1220542464,0,1423966208
+.long  0,3774873600,0,4246732800,0,3644850176,0,3311403008
+.long  0,2441084928,0,2376073216,0,2847932416,0,3051356160
+
+.Lrem_8bit:
+.value 0x0000,0x01C2,0x0384,0x0246,0x0708,0x06CA,0x048C,0x054E
+.value 0x0E10,0x0FD2,0x0D94,0x0C56,0x0918,0x08DA,0x0A9C,0x0B5E
+.value 0x1C20,0x1DE2,0x1FA4,0x1E66,0x1B28,0x1AEA,0x18AC,0x196E
+.value 0x1230,0x13F2,0x11B4,0x1076,0x1538,0x14FA,0x16BC,0x177E
+.value 0x3840,0x3982,0x3BC4,0x3A06,0x3F48,0x3E8A,0x3CCC,0x3D0E
+.value 0x3650,0x3792,0x35D4,0x3416,0x3158,0x309A,0x32DC,0x331E
+.value 0x2460,0x25A2,0x27E4,0x2626,0x2368,0x22AA,0x20EC,0x212E
+.value 0x2A70,0x2BB2,0x29F4,0x2836,0x2D78,0x2CBA,0x2EFC,0x2F3E
+.value 0x7080,0x7142,0x7304,0x72C6,0x7788,0x764A,0x740C,0x75CE
+.value 0x7E90,0x7F52,0x7D14,0x7CD6,0x7998,0x785A,0x7A1C,0x7BDE
+.value 0x6CA0,0x6D62,0x6F24,0x6EE6,0x6BA8,0x6A6A,0x682C,0x69EE
+.value 0x62B0,0x6372,0x6134,0x60F6,0x65B8,0x647A,0x663C,0x67FE
+.value 0x48C0,0x4902,0x4B44,0x4A86,0x4FC8,0x4E0A,0x4C4C,0x4D8E
+.value 0x46D0,0x4712,0x4554,0x4496,0x41D8,0x401A,0x425C,0x439E
+.value 0x54E0,0x5522,0x5764,0x56A6,0x53E8,0x522A,0x506C,0x51AE
+.value 0x5AF0,0x5B32,0x5974,0x58B6,0x5DF8,0x5C3A,0x5E7C,0x5FBE
+.value 0xE100,0xE0C2,0xE284,0xE346,0xE608,0xE7CA,0xE58C,0xE44E
+.value 0xEF10,0xEED2,0xEC94,0xED56,0xE818,0xE9DA,0xEB9C,0xEA5E
+.value 0xFD20,0xFCE2,0xFEA4,0xFF66,0xFA28,0xFBEA,0xF9AC,0xF86E
+.value 0xF330,0xF2F2,0xF0B4,0xF176,0xF438,0xF5FA,0xF7BC,0xF67E
+.value 0xD940,0xD882,0xDAC4,0xDB06,0xDE48,0xDF8A,0xDDCC,0xDC0E
+.value 0xD750,0xD692,0xD4D4,0xD516,0xD058,0xD19A,0xD3DC,0xD21E
+.value 0xC560,0xC4A2,0xC6E4,0xC726,0xC268,0xC3AA,0xC1EC,0xC02E
+.value 0xCB70,0xCAB2,0xC8F4,0xC936,0xCC78,0xCDBA,0xCFFC,0xCE3E
+.value 0x9180,0x9042,0x9204,0x93C6,0x9688,0x974A,0x950C,0x94CE
+.value 0x9F90,0x9E52,0x9C14,0x9DD6,0x9898,0x995A,0x9B1C,0x9ADE
+.value 0x8DA0,0x8C62,0x8E24,0x8FE6,0x8AA8,0x8B6A,0x892C,0x88EE
+.value 0x83B0,0x8272,0x8034,0x81F6,0x84B8,0x857A,0x873C,0x86FE
+.value 0xA9C0,0xA802,0xAA44,0xAB86,0xAEC8,0xAF0A,0xAD4C,0xAC8E
+.value 0xA7D0,0xA612,0xA454,0xA596,0xA0D8,0xA11A,0xA35C,0xA29E
+.value 0xB5E0,0xB422,0xB664,0xB7A6,0xB2E8,0xB32A,0xB16C,0xB0AE
+.value 0xBBF0,0xBA32,0xB874,0xB9B6,0xBCF8,0xBD3A,0xBF7C,0xBEBE
+
+.byte  71,72,65,83,72,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
+.p2align       6
+
+.def   se_handler;     .scl 3; .type 32;       .endef
+.p2align       4
+se_handler:
+       pushq   %rsi
+       pushq   %rdi
+       pushq   %rbx
+       pushq   %rbp
+       pushq   %r12
+       pushq   %r13
+       pushq   %r14
+       pushq   %r15
+       pushfq
+       subq    $64,%rsp
+
+       movq    120(%r8),%rax
+       movq    248(%r8),%rbx
+
+       movq    8(%r9),%rsi
+       movq    56(%r9),%r11
+
+       movl    0(%r11),%r10d
+       leaq    (%rsi,%r10,1),%r10
+       cmpq    %r10,%rbx
+       jb      .Lin_prologue
+
+       movq    152(%r8),%rax
+
+       movl    4(%r11),%r10d
+       leaq    (%rsi,%r10,1),%r10
+       cmpq    %r10,%rbx
+       jae     .Lin_prologue
+
+       leaq    24(%rax),%rax
+
+       movq    -8(%rax),%rbx
+       movq    -16(%rax),%rbp
+       movq    -24(%rax),%r12
+       movq    %rbx,144(%r8)
+       movq    %rbp,160(%r8)
+       movq    %r12,216(%r8)
+
+.Lin_prologue:
+       movq    8(%rax),%rdi
+       movq    16(%rax),%rsi
+       movq    %rax,152(%r8)
+       movq    %rsi,168(%r8)
+       movq    %rdi,176(%r8)
+
+       movq    40(%r9),%rdi
+       movq    %r8,%rsi
+       movl    $154,%ecx
+.long  0xa548f3fc              
+
+       movq    %r9,%rsi
+       xorq    %rcx,%rcx
+       movq    8(%rsi),%rdx
+       movq    0(%rsi),%r8
+       movq    16(%rsi),%r9
+       movq    40(%rsi),%r10
+       leaq    56(%rsi),%r11
+       leaq    24(%rsi),%r12
+       movq    %r10,32(%rsp)
+       movq    %r11,40(%rsp)
+       movq    %r12,48(%rsp)
+       movq    %rcx,56(%rsp)
+       call    *__imp_RtlVirtualUnwind(%rip)
+
+       movl    $1,%eax
+       addq    $64,%rsp
+       popfq
+       popq    %r15
+       popq    %r14
+       popq    %r13
+       popq    %r12
+       popq    %rbp
+       popq    %rbx
+       popq    %rdi
+       popq    %rsi
+       .byte   0xf3,0xc3
+
+
+.section       .pdata
+.p2align       2
+.rva   .LSEH_begin_gcm_gmult_4bit
+.rva   .LSEH_end_gcm_gmult_4bit
+.rva   .LSEH_info_gcm_gmult_4bit
+
+.rva   .LSEH_begin_gcm_ghash_4bit
+.rva   .LSEH_end_gcm_ghash_4bit
+.rva   .LSEH_info_gcm_ghash_4bit
+
+.rva   .LSEH_begin_gcm_ghash_clmul
+.rva   .LSEH_end_gcm_ghash_clmul
+.rva   .LSEH_info_gcm_ghash_clmul
+
+.section       .xdata
+.p2align       3
+.LSEH_info_gcm_gmult_4bit:
+.byte  9,0,0,0
+.rva   se_handler
+.rva   .Lgmult_prologue,.Lgmult_epilogue       
+.LSEH_info_gcm_ghash_4bit:
+.byte  9,0,0,0
+.rva   se_handler
+.rva   .Lghash_prologue,.Lghash_epilogue       
+.LSEH_info_gcm_ghash_clmul:
+.byte  0x01,0x1f,0x0b,0x00
+.byte  0x1f,0xa8,0x04,0x00     
+.byte  0x19,0x98,0x03,0x00     
+.byte  0x13,0x88,0x02,0x00     
+.byte  0x0d,0x78,0x01,0x00     
+.byte  0x08,0x68,0x00,0x00     
+.byte  0x04,0xa2,0x00,0x00     
diff --git a/lib/accelerated/x86/asm-coff/appro-aes-x86-64-coff.s b/lib/accelerated/x86/asm-coff/appro-aes-x86-64-coff.s
new file mode 100644 (file)
index 0000000..5a69465
--- /dev/null
@@ -0,0 +1,3044 @@
+# Copyright (c) 2011, Andy Polyakov by <appro@openssl.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 
+#     * Redistributions of source code must retain copyright notices,
+#      this list of conditions and the following disclaimer.
+#
+#     * Redistributions in binary form must reproduce the above
+#      copyright notice, this list of conditions and the following
+#      disclaimer in the documentation and/or other materials
+#      provided with the distribution.
+#
+#     * Neither the name of the Andy Polyakov nor the names of its
+#      copyright holder and contributors may be used to endorse or
+#      promote products derived from this software without specific
+#      prior written permission.
+#
+# ALTERNATIVELY, provided that this notice is retained in full, this
+# product may be distributed under the terms of the GNU General Public
+# License (GPL), in which case the provisions of the GPL apply INSTEAD OF
+# those given above.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+.text  
+.globl aesni_encrypt
+.def   aesni_encrypt;  .scl 2; .type 32;       .endef
+.p2align       4
+aesni_encrypt:
+       movups  (%rcx),%xmm2
+       movl    240(%r8),%eax
+       movups  (%r8),%xmm0
+       movups  16(%r8),%xmm1
+       leaq    32(%r8),%r8
+       xorps   %xmm0,%xmm2
+.Loop_enc1_1:
+.byte  102,15,56,220,209
+       decl    %eax
+       movups  (%r8),%xmm1
+       leaq    16(%r8),%r8
+       jnz     .Loop_enc1_1    
+.byte  102,15,56,221,209
+       movups  %xmm2,(%rdx)
+       .byte   0xf3,0xc3
+
+
+.globl aesni_decrypt
+.def   aesni_decrypt;  .scl 2; .type 32;       .endef
+.p2align       4
+aesni_decrypt:
+       movups  (%rcx),%xmm2
+       movl    240(%r8),%eax
+       movups  (%r8),%xmm0
+       movups  16(%r8),%xmm1
+       leaq    32(%r8),%r8
+       xorps   %xmm0,%xmm2
+.Loop_dec1_2:
+.byte  102,15,56,222,209
+       decl    %eax
+       movups  (%r8),%xmm1
+       leaq    16(%r8),%r8
+       jnz     .Loop_dec1_2    
+.byte  102,15,56,223,209
+       movups  %xmm2,(%rdx)
+       .byte   0xf3,0xc3
+
+.def   _aesni_encrypt3;        .scl 3; .type 32;       .endef
+.p2align       4
+_aesni_encrypt3:
+       movups  (%rcx),%xmm0
+       shrl    $1,%eax
+       movups  16(%rcx),%xmm1
+       leaq    32(%rcx),%rcx
+       xorps   %xmm0,%xmm2
+       xorps   %xmm0,%xmm3
+       xorps   %xmm0,%xmm4
+       movups  (%rcx),%xmm0
+
+.Lenc_loop3:
+.byte  102,15,56,220,209
+.byte  102,15,56,220,217
+       decl    %eax
+.byte  102,15,56,220,225
+       movups  16(%rcx),%xmm1
+.byte  102,15,56,220,208
+.byte  102,15,56,220,216
+       leaq    32(%rcx),%rcx
+.byte  102,15,56,220,224
+       movups  (%rcx),%xmm0
+       jnz     .Lenc_loop3
+
+.byte  102,15,56,220,209
+.byte  102,15,56,220,217
+.byte  102,15,56,220,225
+.byte  102,15,56,221,208
+.byte  102,15,56,221,216
+.byte  102,15,56,221,224
+       .byte   0xf3,0xc3
+
+.def   _aesni_decrypt3;        .scl 3; .type 32;       .endef
+.p2align       4
+_aesni_decrypt3:
+       movups  (%rcx),%xmm0
+       shrl    $1,%eax
+       movups  16(%rcx),%xmm1
+       leaq    32(%rcx),%rcx
+       xorps   %xmm0,%xmm2
+       xorps   %xmm0,%xmm3
+       xorps   %xmm0,%xmm4
+       movups  (%rcx),%xmm0
+
+.Ldec_loop3:
+.byte  102,15,56,222,209
+.byte  102,15,56,222,217
+       decl    %eax
+.byte  102,15,56,222,225
+       movups  16(%rcx),%xmm1
+.byte  102,15,56,222,208
+.byte  102,15,56,222,216
+       leaq    32(%rcx),%rcx
+.byte  102,15,56,222,224
+       movups  (%rcx),%xmm0
+       jnz     .Ldec_loop3
+
+.byte  102,15,56,222,209
+.byte  102,15,56,222,217
+.byte  102,15,56,222,225
+.byte  102,15,56,223,208
+.byte  102,15,56,223,216
+.byte  102,15,56,223,224
+       .byte   0xf3,0xc3
+
+.def   _aesni_encrypt4;        .scl 3; .type 32;       .endef
+.p2align       4
+_aesni_encrypt4:
+       movups  (%rcx),%xmm0
+       shrl    $1,%eax
+       movups  16(%rcx),%xmm1
+       leaq    32(%rcx),%rcx
+       xorps   %xmm0,%xmm2
+       xorps   %xmm0,%xmm3
+       xorps   %xmm0,%xmm4
+       xorps   %xmm0,%xmm5
+       movups  (%rcx),%xmm0
+
+.Lenc_loop4:
+.byte  102,15,56,220,209
+.byte  102,15,56,220,217
+       decl    %eax
+.byte  102,15,56,220,225
+.byte  102,15,56,220,233
+       movups  16(%rcx),%xmm1
+.byte  102,15,56,220,208
+.byte  102,15,56,220,216
+       leaq    32(%rcx),%rcx
+.byte  102,15,56,220,224
+.byte  102,15,56,220,232
+       movups  (%rcx),%xmm0
+       jnz     .Lenc_loop4
+
+.byte  102,15,56,220,209
+.byte  102,15,56,220,217
+.byte  102,15,56,220,225
+.byte  102,15,56,220,233
+.byte  102,15,56,221,208
+.byte  102,15,56,221,216
+.byte  102,15,56,221,224
+.byte  102,15,56,221,232
+       .byte   0xf3,0xc3
+
+.def   _aesni_decrypt4;        .scl 3; .type 32;       .endef
+.p2align       4
+_aesni_decrypt4:
+       movups  (%rcx),%xmm0
+       shrl    $1,%eax
+       movups  16(%rcx),%xmm1
+       leaq    32(%rcx),%rcx
+       xorps   %xmm0,%xmm2
+       xorps   %xmm0,%xmm3
+       xorps   %xmm0,%xmm4
+       xorps   %xmm0,%xmm5
+       movups  (%rcx),%xmm0
+
+.Ldec_loop4:
+.byte  102,15,56,222,209
+.byte  102,15,56,222,217
+       decl    %eax
+.byte  102,15,56,222,225
+.byte  102,15,56,222,233
+       movups  16(%rcx),%xmm1
+.byte  102,15,56,222,208
+.byte  102,15,56,222,216
+       leaq    32(%rcx),%rcx
+.byte  102,15,56,222,224
+.byte  102,15,56,222,232
+       movups  (%rcx),%xmm0
+       jnz     .Ldec_loop4
+
+.byte  102,15,56,222,209
+.byte  102,15,56,222,217
+.byte  102,15,56,222,225
+.byte  102,15,56,222,233
+.byte  102,15,56,223,208
+.byte  102,15,56,223,216
+.byte  102,15,56,223,224
+.byte  102,15,56,223,232
+       .byte   0xf3,0xc3
+
+.def   _aesni_encrypt6;        .scl 3; .type 32;       .endef
+.p2align       4
+_aesni_encrypt6:
+       movups  (%rcx),%xmm0
+       shrl    $1,%eax
+       movups  16(%rcx),%xmm1
+       leaq    32(%rcx),%rcx
+       xorps   %xmm0,%xmm2
+       pxor    %xmm0,%xmm3
+.byte  102,15,56,220,209
+       pxor    %xmm0,%xmm4
+.byte  102,15,56,220,217
+       pxor    %xmm0,%xmm5
+.byte  102,15,56,220,225
+       pxor    %xmm0,%xmm6
+.byte  102,15,56,220,233
+       pxor    %xmm0,%xmm7
+       decl    %eax
+.byte  102,15,56,220,241
+       movups  (%rcx),%xmm0
+.byte  102,15,56,220,249
+       jmp     .Lenc_loop6_enter
+.p2align       4
+.Lenc_loop6:
+.byte  102,15,56,220,209
+.byte  102,15,56,220,217
+       decl    %eax
+.byte  102,15,56,220,225
+.byte  102,15,56,220,233
+.byte  102,15,56,220,241
+.byte  102,15,56,220,249
+.Lenc_loop6_enter:
+       movups  16(%rcx),%xmm1
+.byte  102,15,56,220,208
+.byte  102,15,56,220,216
+       leaq    32(%rcx),%rcx
+.byte  102,15,56,220,224
+.byte  102,15,56,220,232
+.byte  102,15,56,220,240
+.byte  102,15,56,220,248
+       movups  (%rcx),%xmm0
+       jnz     .Lenc_loop6
+
+.byte  102,15,56,220,209
+.byte  102,15,56,220,217
+.byte  102,15,56,220,225
+.byte  102,15,56,220,233
+.byte  102,15,56,220,241
+.byte  102,15,56,220,249
+.byte  102,15,56,221,208
+.byte  102,15,56,221,216
+.byte  102,15,56,221,224
+.byte  102,15,56,221,232
+.byte  102,15,56,221,240
+.byte  102,15,56,221,248
+       .byte   0xf3,0xc3
+
+.def   _aesni_decrypt6;        .scl 3; .type 32;       .endef
+.p2align       4
+_aesni_decrypt6:
+       movups  (%rcx),%xmm0
+       shrl    $1,%eax
+       movups  16(%rcx),%xmm1
+       leaq    32(%rcx),%rcx
+       xorps   %xmm0,%xmm2
+       pxor    %xmm0,%xmm3
+.byte  102,15,56,222,209
+       pxor    %xmm0,%xmm4
+.byte  102,15,56,222,217
+       pxor    %xmm0,%xmm5
+.byte  102,15,56,222,225
+       pxor    %xmm0,%xmm6
+.byte  102,15,56,222,233
+       pxor    %xmm0,%xmm7
+       decl    %eax
+.byte  102,15,56,222,241
+       movups  (%rcx),%xmm0
+.byte  102,15,56,222,249
+       jmp     .Ldec_loop6_enter
+.p2align       4
+.Ldec_loop6:
+.byte  102,15,56,222,209
+.byte  102,15,56,222,217
+       decl    %eax
+.byte  102,15,56,222,225
+.byte  102,15,56,222,233
+.byte  102,15,56,222,241
+.byte  102,15,56,222,249
+.Ldec_loop6_enter:
+       movups  16(%rcx),%xmm1
+.byte  102,15,56,222,208
+.byte  102,15,56,222,216
+       leaq    32(%rcx),%rcx
+.byte  102,15,56,222,224
+.byte  102,15,56,222,232
+.byte  102,15,56,222,240
+.byte  102,15,56,222,248
+       movups  (%rcx),%xmm0
+       jnz     .Ldec_loop6
+
+.byte  102,15,56,222,209
+.byte  102,15,56,222,217
+.byte  102,15,56,222,225
+.byte  102,15,56,222,233
+.byte  102,15,56,222,241
+.byte  102,15,56,222,249
+.byte  102,15,56,223,208
+.byte  102,15,56,223,216
+.byte  102,15,56,223,224
+.byte  102,15,56,223,232
+.byte  102,15,56,223,240
+.byte  102,15,56,223,248
+       .byte   0xf3,0xc3
+
+.def   _aesni_encrypt8;        .scl 3; .type 32;       .endef
+.p2align       4
+_aesni_encrypt8:
+       movups  (%rcx),%xmm0
+       shrl    $1,%eax
+       movups  16(%rcx),%xmm1
+       leaq    32(%rcx),%rcx
+       xorps   %xmm0,%xmm2
+       xorps   %xmm0,%xmm3
+.byte  102,15,56,220,209
+       pxor    %xmm0,%xmm4
+.byte  102,15,56,220,217
+       pxor    %xmm0,%xmm5
+.byte  102,15,56,220,225
+       pxor    %xmm0,%xmm6
+.byte  102,15,56,220,233
+       pxor    %xmm0,%xmm7
+       decl    %eax
+.byte  102,15,56,220,241
+       pxor    %xmm0,%xmm8
+.byte  102,15,56,220,249
+       pxor    %xmm0,%xmm9
+       movups  (%rcx),%xmm0
+.byte  102,68,15,56,220,193
+.byte  102,68,15,56,220,201
+       movups  16(%rcx),%xmm1
+       jmp     .Lenc_loop8_enter
+.p2align       4
+.Lenc_loop8:
+.byte  102,15,56,220,209
+.byte  102,15,56,220,217
+       decl    %eax
+.byte  102,15,56,220,225
+.byte  102,15,56,220,233
+.byte  102,15,56,220,241
+.byte  102,15,56,220,249
+.byte  102,68,15,56,220,193
+.byte  102,68,15,56,220,201
+       movups  16(%rcx),%xmm1
+.Lenc_loop8_enter:
+.byte  102,15,56,220,208
+.byte  102,15,56,220,216
+       leaq    32(%rcx),%rcx
+.byte  102,15,56,220,224
+.byte  102,15,56,220,232
+.byte  102,15,56,220,240
+.byte  102,15,56,220,248
+.byte  102,68,15,56,220,192
+.byte  102,68,15,56,220,200
+       movups  (%rcx),%xmm0
+       jnz     .Lenc_loop8
+
+.byte  102,15,56,220,209
+.byte  102,15,56,220,217
+.byte  102,15,56,220,225
+.byte  102,15,56,220,233
+.byte  102,15,56,220,241
+.byte  102,15,56,220,249
+.byte  102,68,15,56,220,193
+.byte  102,68,15,56,220,201
+.byte  102,15,56,221,208
+.byte  102,15,56,221,216
+.byte  102,15,56,221,224
+.byte  102,15,56,221,232
+.byte  102,15,56,221,240
+.byte  102,15,56,221,248
+.byte  102,68,15,56,221,192
+.byte  102,68,15,56,221,200
+       .byte   0xf3,0xc3
+
+.def   _aesni_decrypt8;        .scl 3; .type 32;       .endef
+.p2align       4
+_aesni_decrypt8:
+       movups  (%rcx),%xmm0
+       shrl    $1,%eax
+       movups  16(%rcx),%xmm1
+       leaq    32(%rcx),%rcx
+       xorps   %xmm0,%xmm2
+       xorps   %xmm0,%xmm3
+.byte  102,15,56,222,209
+       pxor    %xmm0,%xmm4
+.byte  102,15,56,222,217
+       pxor    %xmm0,%xmm5
+.byte  102,15,56,222,225
+       pxor    %xmm0,%xmm6
+.byte  102,15,56,222,233
+       pxor    %xmm0,%xmm7
+       decl    %eax
+.byte  102,15,56,222,241
+       pxor    %xmm0,%xmm8
+.byte  102,15,56,222,249
+       pxor    %xmm0,%xmm9
+       movups  (%rcx),%xmm0
+.byte  102,68,15,56,222,193
+.byte  102,68,15,56,222,201
+       movups  16(%rcx),%xmm1
+       jmp     .Ldec_loop8_enter
+.p2align       4
+.Ldec_loop8:
+.byte  102,15,56,222,209
+.byte  102,15,56,222,217
+       decl    %eax
+.byte  102,15,56,222,225
+.byte  102,15,56,222,233
+.byte  102,15,56,222,241
+.byte  102,15,56,222,249
+.byte  102,68,15,56,222,193
+.byte  102,68,15,56,222,201
+       movups  16(%rcx),%xmm1
+.Ldec_loop8_enter:
+.byte  102,15,56,222,208
+.byte  102,15,56,222,216
+       leaq    32(%rcx),%rcx
+.byte  102,15,56,222,224
+.byte  102,15,56,222,232
+.byte  102,15,56,222,240
+.byte  102,15,56,222,248
+.byte  102,68,15,56,222,192
+.byte  102,68,15,56,222,200
+       movups  (%rcx),%xmm0
+       jnz     .Ldec_loop8
+
+.byte  102,15,56,222,209
+.byte  102,15,56,222,217
+.byte  102,15,56,222,225
+.byte  102,15,56,222,233
+.byte  102,15,56,222,241
+.byte  102,15,56,222,249
+.byte  102,68,15,56,222,193
+.byte  102,68,15,56,222,201
+.byte  102,15,56,223,208
+.byte  102,15,56,223,216
+.byte  102,15,56,223,224
+.byte  102,15,56,223,232
+.byte  102,15,56,223,240
+.byte  102,15,56,223,248
+.byte  102,68,15,56,223,192
+.byte  102,68,15,56,223,200
+       .byte   0xf3,0xc3
+
+.globl aesni_ecb_encrypt
+.def   aesni_ecb_encrypt;      .scl 2; .type 32;       .endef
+.p2align       4
+aesni_ecb_encrypt:
+       movq    %rdi,8(%rsp)
+       movq    %rsi,16(%rsp)
+       movq    %rsp,%rax
+.LSEH_begin_aesni_ecb_encrypt:
+       movq    %rcx,%rdi
+       movq    %rdx,%rsi
+       movq    %r8,%rdx
+       movq    %r9,%rcx
+       movq    40(%rsp),%r8
+
+       andq    $-16,%rdx
+       jz      .Lecb_ret
+
+       movl    240(%rcx),%eax
+       movups  (%rcx),%xmm0
+       movq    %rcx,%r11
+       movl    %eax,%r10d
+       testl   %r8d,%r8d
+       jz      .Lecb_decrypt
+
+       cmpq    $128,%rdx
+       jb      .Lecb_enc_tail
+
+       movdqu  (%rdi),%xmm2
+       movdqu  16(%rdi),%xmm3
+       movdqu  32(%rdi),%xmm4
+       movdqu  48(%rdi),%xmm5
+       movdqu  64(%rdi),%xmm6
+       movdqu  80(%rdi),%xmm7
+       movdqu  96(%rdi),%xmm8
+       movdqu  112(%rdi),%xmm9
+       leaq    128(%rdi),%rdi
+       subq    $128,%rdx
+       jmp     .Lecb_enc_loop8_enter
+.p2align       4
+.Lecb_enc_loop8:
+       movups  %xmm2,(%rsi)
+       movq    %r11,%rcx
+       movdqu  (%rdi),%xmm2
+       movl    %r10d,%eax
+       movups  %xmm3,16(%rsi)
+       movdqu  16(%rdi),%xmm3
+       movups  %xmm4,32(%rsi)
+       movdqu  32(%rdi),%xmm4
+       movups  %xmm5,48(%rsi)
+       movdqu  48(%rdi),%xmm5
+       movups  %xmm6,64(%rsi)
+       movdqu  64(%rdi),%xmm6
+       movups  %xmm7,80(%rsi)
+       movdqu  80(%rdi),%xmm7
+       movups  %xmm8,96(%rsi)
+       movdqu  96(%rdi),%xmm8
+       movups  %xmm9,112(%rsi)
+       leaq    128(%rsi),%rsi
+       movdqu  112(%rdi),%xmm9
+       leaq    128(%rdi),%rdi
+.Lecb_enc_loop8_enter:
+
+       call    _aesni_encrypt8
+
+       subq    $128,%rdx
+       jnc     .Lecb_enc_loop8
+
+       movups  %xmm2,(%rsi)
+       movq    %r11,%rcx
+       movups  %xmm3,16(%rsi)
+       movl    %r10d,%eax
+       movups  %xmm4,32(%rsi)
+       movups  %xmm5,48(%rsi)
+       movups  %xmm6,64(%rsi)
+       movups  %xmm7,80(%rsi)
+       movups  %xmm8,96(%rsi)
+       movups  %xmm9,112(%rsi)
+       leaq    128(%rsi),%rsi
+       addq    $128,%rdx
+       jz      .Lecb_ret
+
+.Lecb_enc_tail:
+       movups  (%rdi),%xmm2
+       cmpq    $32,%rdx
+       jb      .Lecb_enc_one
+       movups  16(%rdi),%xmm3
+       je      .Lecb_enc_two
+       movups  32(%rdi),%xmm4
+       cmpq    $64,%rdx
+       jb      .Lecb_enc_three
+       movups  48(%rdi),%xmm5
+       je      .Lecb_enc_four
+       movups  64(%rdi),%xmm6
+       cmpq    $96,%rdx
+       jb      .Lecb_enc_five
+       movups  80(%rdi),%xmm7
+       je      .Lecb_enc_six
+       movdqu  96(%rdi),%xmm8
+       call    _aesni_encrypt8
+       movups  %xmm2,(%rsi)
+       movups  %xmm3,16(%rsi)
+       movups  %xmm4,32(%rsi)
+       movups  %xmm5,48(%rsi)
+       movups  %xmm6,64(%rsi)
+       movups  %xmm7,80(%rsi)
+       movups  %xmm8,96(%rsi)
+       jmp     .Lecb_ret
+.p2align       4
+.Lecb_enc_one:
+       movups  (%rcx),%xmm0
+       movups  16(%rcx),%xmm1
+       leaq    32(%rcx),%rcx
+       xorps   %xmm0,%xmm2
+.Loop_enc1_3:
+.byte  102,15,56,220,209
+       decl    %eax
+       movups  (%rcx),%xmm1
+       leaq    16(%rcx),%rcx
+       jnz     .Loop_enc1_3    
+.byte  102,15,56,221,209
+       movups  %xmm2,(%rsi)
+       jmp     .Lecb_ret
+.p2align       4
+.Lecb_enc_two:
+       xorps   %xmm4,%xmm4
+       call    _aesni_encrypt3
+       movups  %xmm2,(%rsi)
+       movups  %xmm3,16(%rsi)
+       jmp     .Lecb_ret
+.p2align       4
+.Lecb_enc_three:
+       call    _aesni_encrypt3
+       movups  %xmm2,(%rsi)
+       movups  %xmm3,16(%rsi)
+       movups  %xmm4,32(%rsi)
+       jmp     .Lecb_ret
+.p2align       4
+.Lecb_enc_four:
+       call    _aesni_encrypt4
+       movups  %xmm2,(%rsi)
+       movups  %xmm3,16(%rsi)
+       movups  %xmm4,32(%rsi)
+       movups  %xmm5,48(%rsi)
+       jmp     .Lecb_ret
+.p2align       4
+.Lecb_enc_five:
+       xorps   %xmm7,%xmm7
+       call    _aesni_encrypt6
+       movups  %xmm2,(%rsi)
+       movups  %xmm3,16(%rsi)
+       movups  %xmm4,32(%rsi)
+       movups  %xmm5,48(%rsi)
+       movups  %xmm6,64(%rsi)
+       jmp     .Lecb_ret
+.p2align       4
+.Lecb_enc_six:
+       call    _aesni_encrypt6
+       movups  %xmm2,(%rsi)
+       movups  %xmm3,16(%rsi)
+       movups  %xmm4,32(%rsi)
+       movups  %xmm5,48(%rsi)
+       movups  %xmm6,64(%rsi)
+       movups  %xmm7,80(%rsi)
+       jmp     .Lecb_ret
+
+.p2align       4
+.Lecb_decrypt:
+       cmpq    $128,%rdx
+       jb      .Lecb_dec_tail
+
+       movdqu  (%rdi),%xmm2
+       movdqu  16(%rdi),%xmm3
+       movdqu  32(%rdi),%xmm4
+       movdqu  48(%rdi),%xmm5
+       movdqu  64(%rdi),%xmm6
+       movdqu  80(%rdi),%xmm7
+       movdqu  96(%rdi),%xmm8
+       movdqu  112(%rdi),%xmm9
+       leaq    128(%rdi),%rdi
+       subq    $128,%rdx
+       jmp     .Lecb_dec_loop8_enter
+.p2align       4
+.Lecb_dec_loop8:
+       movups  %xmm2,(%rsi)
+       movq    %r11,%rcx
+       movdqu  (%rdi),%xmm2
+       movl    %r10d,%eax
+       movups  %xmm3,16(%rsi)
+       movdqu  16(%rdi),%xmm3
+       movups  %xmm4,32(%rsi)
+       movdqu  32(%rdi),%xmm4
+       movups  %xmm5,48(%rsi)
+       movdqu  48(%rdi),%xmm5
+       movups  %xmm6,64(%rsi)
+       movdqu  64(%rdi),%xmm6
+       movups  %xmm7,80(%rsi)
+       movdqu  80(%rdi),%xmm7
+       movups  %xmm8,96(%rsi)
+       movdqu  96(%rdi),%xmm8
+       movups  %xmm9,112(%rsi)
+       leaq    128(%rsi),%rsi
+       movdqu  112(%rdi),%xmm9
+       leaq    128(%rdi),%rdi
+.Lecb_dec_loop8_enter:
+
+       call    _aesni_decrypt8
+
+       movups  (%r11),%xmm0
+       subq    $128,%rdx
+       jnc     .Lecb_dec_loop8
+
+       movups  %xmm2,(%rsi)
+       movq    %r11,%rcx
+       movups  %xmm3,16(%rsi)
+       movl    %r10d,%eax
+       movups  %xmm4,32(%rsi)
+       movups  %xmm5,48(%rsi)
+       movups  %xmm6,64(%rsi)
+       movups  %xmm7,80(%rsi)
+       movups  %xmm8,96(%rsi)
+       movups  %xmm9,112(%rsi)
+       leaq    128(%rsi),%rsi
+       addq    $128,%rdx
+       jz      .Lecb_ret
+
+.Lecb_dec_tail:
+       movups  (%rdi),%xmm2
+       cmpq    $32,%rdx
+       jb      .Lecb_dec_one
+       movups  16(%rdi),%xmm3
+       je      .Lecb_dec_two
+       movups  32(%rdi),%xmm4
+       cmpq    $64,%rdx
+       jb      .Lecb_dec_three
+       movups  48(%rdi),%xmm5
+       je      .Lecb_dec_four
+       movups  64(%rdi),%xmm6
+       cmpq    $96,%rdx
+       jb      .Lecb_dec_five
+       movups  80(%rdi),%xmm7
+       je      .Lecb_dec_six
+       movups  96(%rdi),%xmm8
+       movups  (%rcx),%xmm0
+       call    _aesni_decrypt8
+       movups  %xmm2,(%rsi)
+       movups  %xmm3,16(%rsi)
+       movups  %xmm4,32(%rsi)
+       movups  %xmm5,48(%rsi)
+       movups  %xmm6,64(%rsi)
+       movups  %xmm7,80(%rsi)
+       movups  %xmm8,96(%rsi)
+       jmp     .Lecb_ret
+.p2align       4
+.Lecb_dec_one:
+       movups  (%rcx),%xmm0
+       movups  16(%rcx),%xmm1
+       leaq    32(%rcx),%rcx
+       xorps   %xmm0,%xmm2
+.Loop_dec1_4:
+.byte  102,15,56,222,209
+       decl    %eax
+       movups  (%rcx),%xmm1
+       leaq    16(%rcx),%rcx
+       jnz     .Loop_dec1_4    
+.byte  102,15,56,223,209
+       movups  %xmm2,(%rsi)
+       jmp     .Lecb_ret
+.p2align       4
+.Lecb_dec_two:
+       xorps   %xmm4,%xmm4
+       call    _aesni_decrypt3
+       movups  %xmm2,(%rsi)
+       movups  %xmm3,16(%rsi)
+       jmp     .Lecb_ret
+.p2align       4
+.Lecb_dec_three:
+       call    _aesni_decrypt3
+       movups  %xmm2,(%rsi)
+       movups  %xmm3,16(%rsi)
+       movups  %xmm4,32(%rsi)
+       jmp     .Lecb_ret
+.p2align       4
+.Lecb_dec_four:
+       call    _aesni_decrypt4
+       movups  %xmm2,(%rsi)
+       movups  %xmm3,16(%rsi)
+       movups  %xmm4,32(%rsi)
+       movups  %xmm5,48(%rsi)
+       jmp     .Lecb_ret
+.p2align       4
+.Lecb_dec_five:
+       xorps   %xmm7,%xmm7
+       call    _aesni_decrypt6
+       movups  %xmm2,(%rsi)
+       movups  %xmm3,16(%rsi)
+       movups  %xmm4,32(%rsi)
+       movups  %xmm5,48(%rsi)
+       movups  %xmm6,64(%rsi)
+       jmp     .Lecb_ret
+.p2align       4
+.Lecb_dec_six:
+       call    _aesni_decrypt6
+       movups  %xmm2,(%rsi)
+       movups  %xmm3,16(%rsi)
+       movups  %xmm4,32(%rsi)
+       movups  %xmm5,48(%rsi)
+       movups  %xmm6,64(%rsi)
+       movups  %xmm7,80(%rsi)
+
+.Lecb_ret:
+       movq    8(%rsp),%rdi
+       movq    16(%rsp),%rsi
+       .byte   0xf3,0xc3
+.LSEH_end_aesni_ecb_encrypt:
+.globl aesni_ccm64_encrypt_blocks
+.def   aesni_ccm64_encrypt_blocks;     .scl 2; .type 32;       .endef
+.p2align       4
+aesni_ccm64_encrypt_blocks:
+       movq    %rdi,8(%rsp)
+       movq    %rsi,16(%rsp)
+       movq    %rsp,%rax
+.LSEH_begin_aesni_ccm64_encrypt_blocks:
+       movq    %rcx,%rdi
+       movq    %rdx,%rsi
+       movq    %r8,%rdx
+       movq    %r9,%rcx
+       movq    40(%rsp),%r8
+       movq    48(%rsp),%r9
+
+       leaq    -88(%rsp),%rsp
+       movaps  %xmm6,(%rsp)
+       movaps  %xmm7,16(%rsp)
+       movaps  %xmm8,32(%rsp)
+       movaps  %xmm9,48(%rsp)
+.Lccm64_enc_body:
+       movl    240(%rcx),%eax
+       movdqu  (%r8),%xmm9
+       movdqa  .Lincrement64(%rip),%xmm6
+       movdqa  .Lbswap_mask(%rip),%xmm7
+
+       shrl    $1,%eax
+       leaq    0(%rcx),%r11
+       movdqu  (%r9),%xmm3
+       movdqa  %xmm9,%xmm2
+       movl    %eax,%r10d
+.byte  102,68,15,56,0,207
+       jmp     .Lccm64_enc_outer
+.p2align       4
+.Lccm64_enc_outer:
+       movups  (%r11),%xmm0
+       movl    %r10d,%eax
+       movups  (%rdi),%xmm8
+
+       xorps   %xmm0,%xmm2
+       movups  16(%r11),%xmm1
+       xorps   %xmm8,%xmm0
+       leaq    32(%r11),%rcx
+       xorps   %xmm0,%xmm3
+       movups  (%rcx),%xmm0
+
+.Lccm64_enc2_loop:
+.byte  102,15,56,220,209
+       decl    %eax
+.byte  102,15,56,220,217
+       movups  16(%rcx),%xmm1
+.byte  102,15,56,220,208
+       leaq    32(%rcx),%rcx
+.byte  102,15,56,220,216
+       movups  0(%rcx),%xmm0
+       jnz     .Lccm64_enc2_loop
+.byte  102,15,56,220,209
+.byte  102,15,56,220,217
+       paddq   %xmm6,%xmm9
+.byte  102,15,56,221,208
+.byte  102,15,56,221,216
+
+       decq    %rdx
+       leaq    16(%rdi),%rdi
+       xorps   %xmm2,%xmm8
+       movdqa  %xmm9,%xmm2
+       movups  %xmm8,(%rsi)
+       leaq    16(%rsi),%rsi
+.byte  102,15,56,0,215
+       jnz     .Lccm64_enc_outer
+
+       movups  %xmm3,(%r9)
+       movaps  (%rsp),%xmm6
+       movaps  16(%rsp),%xmm7
+       movaps  32(%rsp),%xmm8
+       movaps  48(%rsp),%xmm9
+       leaq    88(%rsp),%rsp
+.Lccm64_enc_ret:
+       movq    8(%rsp),%rdi
+       movq    16(%rsp),%rsi
+       .byte   0xf3,0xc3
+.LSEH_end_aesni_ccm64_encrypt_blocks:
+.globl aesni_ccm64_decrypt_blocks
+.def   aesni_ccm64_decrypt_blocks;     .scl 2; .type 32;       .endef
+.p2align       4
+aesni_ccm64_decrypt_blocks:
+       movq    %rdi,8(%rsp)
+       movq    %rsi,16(%rsp)
+       movq    %rsp,%rax
+.LSEH_begin_aesni_ccm64_decrypt_blocks:
+       movq    %rcx,%rdi
+       movq    %rdx,%rsi
+       movq    %r8,%rdx
+       movq    %r9,%rcx
+       movq    40(%rsp),%r8
+       movq    48(%rsp),%r9
+
+       leaq    -88(%rsp),%rsp
+       movaps  %xmm6,(%rsp)
+       movaps  %xmm7,16(%rsp)
+       movaps  %xmm8,32(%rsp)
+       movaps  %xmm9,48(%rsp)
+.Lccm64_dec_body:
+       movl    240(%rcx),%eax
+       movups  (%r8),%xmm9
+       movdqu  (%r9),%xmm3
+       movdqa  .Lincrement64(%rip),%xmm6
+       movdqa  .Lbswap_mask(%rip),%xmm7
+
+       movaps  %xmm9,%xmm2
+       movl    %eax,%r10d
+       movq    %rcx,%r11
+.byte  102,68,15,56,0,207
+       movups  (%rcx),%xmm0
+       movups  16(%rcx),%xmm1
+       leaq    32(%rcx),%rcx
+       xorps   %xmm0,%xmm2
+.Loop_enc1_5:
+.byte  102,15,56,220,209
+       decl    %eax
+       movups  (%rcx),%xmm1
+       leaq    16(%rcx),%rcx
+       jnz     .Loop_enc1_5    
+.byte  102,15,56,221,209
+       movups  (%rdi),%xmm8
+       paddq   %xmm6,%xmm9
+       leaq    16(%rdi),%rdi
+       jmp     .Lccm64_dec_outer
+.p2align       4
+.Lccm64_dec_outer:
+       xorps   %xmm2,%xmm8
+       movdqa  %xmm9,%xmm2
+       movl    %r10d,%eax
+       movups  %xmm8,(%rsi)
+       leaq    16(%rsi),%rsi
+.byte  102,15,56,0,215
+
+       subq    $1,%rdx
+       jz      .Lccm64_dec_break
+
+       movups  (%r11),%xmm0
+       shrl    $1,%eax
+       movups  16(%r11),%xmm1
+       xorps   %xmm0,%xmm8
+       leaq    32(%r11),%rcx
+       xorps   %xmm0,%xmm2
+       xorps   %xmm8,%xmm3
+       movups  (%rcx),%xmm0
+
+.Lccm64_dec2_loop:
+.byte  102,15,56,220,209
+       decl    %eax
+.byte  102,15,56,220,217
+       movups  16(%rcx),%xmm1
+.byte  102,15,56,220,208
+       leaq    32(%rcx),%rcx
+.byte  102,15,56,220,216
+       movups  0(%rcx),%xmm0
+       jnz     .Lccm64_dec2_loop
+       movups  (%rdi),%xmm8
+       paddq   %xmm6,%xmm9
+.byte  102,15,56,220,209
+.byte  102,15,56,220,217
+       leaq    16(%rdi),%rdi
+.byte  102,15,56,221,208
+.byte  102,15,56,221,216
+       jmp     .Lccm64_dec_outer
+
+.p2align       4
+.Lccm64_dec_break:
+
+       movups  (%r11),%xmm0
+       movups  16(%r11),%xmm1
+       xorps   %xmm0,%xmm8
+       leaq    32(%r11),%r11
+       xorps   %xmm8,%xmm3
+.Loop_enc1_6:
+.byte  102,15,56,220,217
+       decl    %eax
+       movups  (%r11),%xmm1
+       leaq    16(%r11),%r11
+       jnz     .Loop_enc1_6    
+.byte  102,15,56,221,217
+       movups  %xmm3,(%r9)
+       movaps  (%rsp),%xmm6
+       movaps  16(%rsp),%xmm7
+       movaps  32(%rsp),%xmm8
+       movaps  48(%rsp),%xmm9
+       leaq    88(%rsp),%rsp
+.Lccm64_dec_ret:
+       movq    8(%rsp),%rdi
+       movq    16(%rsp),%rsi
+       .byte   0xf3,0xc3
+.LSEH_end_aesni_ccm64_decrypt_blocks:
+.globl aesni_ctr32_encrypt_blocks
+.def   aesni_ctr32_encrypt_blocks;     .scl 2; .type 32;       .endef
+.p2align       4
+aesni_ctr32_encrypt_blocks:
+       movq    %rdi,8(%rsp)
+       movq    %rsi,16(%rsp)
+       movq    %rsp,%rax
+.LSEH_begin_aesni_ctr32_encrypt_blocks:
+       movq    %rcx,%rdi
+       movq    %rdx,%rsi
+       movq    %r8,%rdx
+       movq    %r9,%rcx
+       movq    40(%rsp),%r8
+
+       leaq    -200(%rsp),%rsp
+       movaps  %xmm6,32(%rsp)
+       movaps  %xmm7,48(%rsp)
+       movaps  %xmm8,64(%rsp)
+       movaps  %xmm9,80(%rsp)
+       movaps  %xmm10,96(%rsp)
+       movaps  %xmm11,112(%rsp)
+       movaps  %xmm12,128(%rsp)
+       movaps  %xmm13,144(%rsp)
+       movaps  %xmm14,160(%rsp)
+       movaps  %xmm15,176(%rsp)
+.Lctr32_body:
+       cmpq    $1,%rdx
+       je      .Lctr32_one_shortcut
+
+       movdqu  (%r8),%xmm14
+       movdqa  .Lbswap_mask(%rip),%xmm15
+       xorl    %eax,%eax
+.byte  102,69,15,58,22,242,3
+.byte  102,68,15,58,34,240,3
+
+       movl    240(%rcx),%eax
+       bswapl  %r10d
+       pxor    %xmm12,%xmm12
+       pxor    %xmm13,%xmm13
+.byte  102,69,15,58,34,226,0
+       leaq    3(%r10),%r11
+.byte  102,69,15,58,34,235,0
+       incl    %r10d
+.byte  102,69,15,58,34,226,1
+       incq    %r11
+.byte  102,69,15,58,34,235,1
+       incl    %r10d
+.byte  102,69,15,58,34,226,2
+       incq    %r11
+.byte  102,69,15,58,34,235,2
+       movdqa  %xmm12,0(%rsp)
+.byte  102,69,15,56,0,231
+       movdqa  %xmm13,16(%rsp)
+.byte  102,69,15,56,0,239
+
+       pshufd  $192,%xmm12,%xmm2
+       pshufd  $128,%xmm12,%xmm3
+       pshufd  $64,%xmm12,%xmm4
+       cmpq    $6,%rdx
+       jb      .Lctr32_tail
+       shrl    $1,%eax
+       movq    %rcx,%r11
+       movl    %eax,%r10d
+       subq    $6,%rdx
+       jmp     .Lctr32_loop6
+
+.p2align       4
+.Lctr32_loop6:
+       pshufd  $192,%xmm13,%xmm5
+       por     %xmm14,%xmm2
+       movups  (%r11),%xmm0
+       pshufd  $128,%xmm13,%xmm6
+       por     %xmm14,%xmm3
+       movups  16(%r11),%xmm1
+       pshufd  $64,%xmm13,%xmm7
+       por     %xmm14,%xmm4
+       por     %xmm14,%xmm5
+       xorps   %xmm0,%xmm2
+       por     %xmm14,%xmm6
+       por     %xmm14,%xmm7
+
+
+
+
+       pxor    %xmm0,%xmm3
+.byte  102,15,56,220,209
+       leaq    32(%r11),%rcx
+       pxor    %xmm0,%xmm4
+.byte  102,15,56,220,217
+       movdqa  .Lincrement32(%rip),%xmm13
+       pxor    %xmm0,%xmm5
+.byte  102,15,56,220,225
+       movdqa  0(%rsp),%xmm12
+       pxor    %xmm0,%xmm6
+.byte  102,15,56,220,233
+       pxor    %xmm0,%xmm7
+       movups  (%rcx),%xmm0
+       decl    %eax
+.byte  102,15,56,220,241
+.byte  102,15,56,220,249
+       jmp     .Lctr32_enc_loop6_enter
+.p2align       4
+.Lctr32_enc_loop6:
+.byte  102,15,56,220,209
+.byte  102,15,56,220,217
+       decl    %eax
+.byte  102,15,56,220,225
+.byte  102,15,56,220,233
+.byte  102,15,56,220,241
+.byte  102,15,56,220,249
+.Lctr32_enc_loop6_enter:
+       movups  16(%rcx),%xmm1
+.byte  102,15,56,220,208
+.byte  102,15,56,220,216
+       leaq    32(%rcx),%rcx
+.byte  102,15,56,220,224
+.byte  102,15,56,220,232
+.byte  102,15,56,220,240
+.byte  102,15,56,220,248
+       movups  (%rcx),%xmm0
+       jnz     .Lctr32_enc_loop6
+
+.byte  102,15,56,220,209
+       paddd   %xmm13,%xmm12
+.byte  102,15,56,220,217
+       paddd   16(%rsp),%xmm13
+.byte  102,15,56,220,225
+       movdqa  %xmm12,0(%rsp)
+.byte  102,15,56,220,233
+       movdqa  %xmm13,16(%rsp)
+.byte  102,15,56,220,241
+.byte  102,69,15,56,0,231
+.byte  102,15,56,220,249
+.byte  102,69,15,56,0,239
+
+.byte  102,15,56,221,208
+       movups  (%rdi),%xmm8
+.byte  102,15,56,221,216
+       movups  16(%rdi),%xmm9
+.byte  102,15,56,221,224
+       movups  32(%rdi),%xmm10
+.byte  102,15,56,221,232
+       movups  48(%rdi),%xmm11
+.byte  102,15,56,221,240
+       movups  64(%rdi),%xmm1
+.byte  102,15,56,221,248
+       movups  80(%rdi),%xmm0
+       leaq    96(%rdi),%rdi
+
+       xorps   %xmm2,%xmm8
+       pshufd  $192,%xmm12,%xmm2
+       xorps   %xmm3,%xmm9
+       pshufd  $128,%xmm12,%xmm3
+       movups  %xmm8,(%rsi)
+       xorps   %xmm4,%xmm10
+       pshufd  $64,%xmm12,%xmm4
+       movups  %xmm9,16(%rsi)
+       xorps   %xmm5,%xmm11
+       movups  %xmm10,32(%rsi)
+       xorps   %xmm6,%xmm1
+       movups  %xmm11,48(%rsi)
+       xorps   %xmm7,%xmm0
+       movups  %xmm1,64(%rsi)
+       movups  %xmm0,80(%rsi)
+       leaq    96(%rsi),%rsi
+       movl    %r10d,%eax
+       subq    $6,%rdx
+       jnc     .Lctr32_loop6
+
+       addq    $6,%rdx
+       jz      .Lctr32_done
+       movq    %r11,%rcx
+       leal    1(%rax,%rax,1),%eax
+
+.Lctr32_tail:
+       por     %xmm14,%xmm2
+       movups  (%rdi),%xmm8
+       cmpq    $2,%rdx
+       jb      .Lctr32_one
+
+       por     %xmm14,%xmm3
+       movups  16(%rdi),%xmm9
+       je      .Lctr32_two
+
+       pshufd  $192,%xmm13,%xmm5
+       por     %xmm14,%xmm4
+       movups  32(%rdi),%xmm10
+       cmpq    $4,%rdx
+       jb      .Lctr32_three
+
+       pshufd  $128,%xmm13,%xmm6
+       por     %xmm14,%xmm5
+       movups  48(%rdi),%xmm11
+       je      .Lctr32_four
+
+       por     %xmm14,%xmm6
+       xorps   %xmm7,%xmm7
+
+       call    _aesni_encrypt6
+
+       movups  64(%rdi),%xmm1
+       xorps   %xmm2,%xmm8
+       xorps   %xmm3,%xmm9
+       movups  %xmm8,(%rsi)
+       xorps   %xmm4,%xmm10
+       movups  %xmm9,16(%rsi)
+       xorps   %xmm5,%xmm11
+       movups  %xmm10,32(%rsi)
+       xorps   %xmm6,%xmm1
+       movups  %xmm11,48(%rsi)
+       movups  %xmm1,64(%rsi)
+       jmp     .Lctr32_done
+
+.p2align       4
+.Lctr32_one_shortcut:
+       movups  (%r8),%xmm2
+       movups  (%rdi),%xmm8
+       movl    240(%rcx),%eax
+.Lctr32_one:
+       movups  (%rcx),%xmm0
+       movups  16(%rcx),%xmm1
+       leaq    32(%rcx),%rcx
+       xorps   %xmm0,%xmm2
+.Loop_enc1_7:
+.byte  102,15,56,220,209
+       decl    %eax
+       movups  (%rcx),%xmm1
+       leaq    16(%rcx),%rcx
+       jnz     .Loop_enc1_7    
+.byte  102,15,56,221,209
+       xorps   %xmm2,%xmm8
+       movups  %xmm8,(%rsi)
+       jmp     .Lctr32_done
+
+.p2align       4
+.Lctr32_two:
+       xorps   %xmm4,%xmm4
+       call    _aesni_encrypt3
+       xorps   %xmm2,%xmm8
+       xorps   %xmm3,%xmm9
+       movups  %xmm8,(%rsi)
+       movups  %xmm9,16(%rsi)
+       jmp     .Lctr32_done
+
+.p2align       4
+.Lctr32_three:
+       call    _aesni_encrypt3
+       xorps   %xmm2,%xmm8
+       xorps   %xmm3,%xmm9
+       movups  %xmm8,(%rsi)
+       xorps   %xmm4,%xmm10
+       movups  %xmm9,16(%rsi)
+       movups  %xmm10,32(%rsi)
+       jmp     .Lctr32_done
+
+.p2align       4
+.Lctr32_four:
+       call    _aesni_encrypt4
+       xorps   %xmm2,%xmm8
+       xorps   %xmm3,%xmm9
+       movups  %xmm8,(%rsi)
+       xorps   %xmm4,%xmm10
+       movups  %xmm9,16(%rsi)
+       xorps   %xmm5,%xmm11
+       movups  %xmm10,32(%rsi)
+       movups  %xmm11,48(%rsi)
+
+.Lctr32_done:
+       movaps  32(%rsp),%xmm6
+       movaps  48(%rsp),%xmm7
+       movaps  64(%rsp),%xmm8
+       movaps  80(%rsp),%xmm9
+       movaps  96(%rsp),%xmm10
+       movaps  112(%rsp),%xmm11
+       movaps  128(%rsp),%xmm12
+       movaps  144(%rsp),%xmm13
+       movaps  160(%rsp),%xmm14
+       movaps  176(%rsp),%xmm15
+       leaq    200(%rsp),%rsp
+.Lctr32_ret:
+       movq    8(%rsp),%rdi
+       movq    16(%rsp),%rsi
+       .byte   0xf3,0xc3
+.LSEH_end_aesni_ctr32_encrypt_blocks:
+.globl aesni_xts_encrypt
+.def   aesni_xts_encrypt;      .scl 2; .type 32;       .endef
+.p2align       4
+aesni_xts_encrypt:
+       movq    %rdi,8(%rsp)
+       movq    %rsi,16(%rsp)
+       movq    %rsp,%rax
+.LSEH_begin_aesni_xts_encrypt:
+       movq    %rcx,%rdi
+       movq    %rdx,%rsi
+       movq    %r8,%rdx
+       movq    %r9,%rcx
+       movq    40(%rsp),%r8
+       movq    48(%rsp),%r9
+
+       leaq    -264(%rsp),%rsp
+       movaps  %xmm6,96(%rsp)
+       movaps  %xmm7,112(%rsp)
+       movaps  %xmm8,128(%rsp)
+       movaps  %xmm9,144(%rsp)
+       movaps  %xmm10,160(%rsp)
+       movaps  %xmm11,176(%rsp)
+       movaps  %xmm12,192(%rsp)
+       movaps  %xmm13,208(%rsp)
+       movaps  %xmm14,224(%rsp)
+       movaps  %xmm15,240(%rsp)
+.Lxts_enc_body:
+       movups  (%r9),%xmm15
+       movl    240(%r8),%eax
+       movl    240(%rcx),%r10d
+       movups  (%r8),%xmm0
+       movups  16(%r8),%xmm1
+       leaq    32(%r8),%r8
+       xorps   %xmm0,%xmm15
+.Loop_enc1_8:
+.byte  102,68,15,56,220,249
+       decl    %eax
+       movups  (%r8),%xmm1
+       leaq    16(%r8),%r8
+       jnz     .Loop_enc1_8    
+.byte  102,68,15,56,221,249
+       movq    %rcx,%r11
+       movl    %r10d,%eax
+       movq    %rdx,%r9
+       andq    $-16,%rdx
+
+       movdqa  .Lxts_magic(%rip),%xmm8
+       pxor    %xmm14,%xmm14
+       pcmpgtd %xmm15,%xmm14
+       pshufd  $19,%xmm14,%xmm9
+       pxor    %xmm14,%xmm14
+       movdqa  %xmm15,%xmm10
+       paddq   %xmm15,%xmm15
+       pand    %xmm8,%xmm9
+       pcmpgtd %xmm15,%xmm14
+       pxor    %xmm9,%xmm15
+       pshufd  $19,%xmm14,%xmm9
+       pxor    %xmm14,%xmm14
+       movdqa  %xmm15,%xmm11
+       paddq   %xmm15,%xmm15
+       pand    %xmm8,%xmm9
+       pcmpgtd %xmm15,%xmm14
+       pxor    %xmm9,%xmm15
+       pshufd  $19,%xmm14,%xmm9
+       pxor    %xmm14,%xmm14
+       movdqa  %xmm15,%xmm12
+       paddq   %xmm15,%xmm15
+       pand    %xmm8,%xmm9
+       pcmpgtd %xmm15,%xmm14
+       pxor    %xmm9,%xmm15
+       pshufd  $19,%xmm14,%xmm9
+       pxor    %xmm14,%xmm14
+       movdqa  %xmm15,%xmm13
+       paddq   %xmm15,%xmm15
+       pand    %xmm8,%xmm9
+       pcmpgtd %xmm15,%xmm14
+       pxor    %xmm9,%xmm15
+       subq    $96,%rdx
+       jc      .Lxts_enc_short
+
+       shrl    $1,%eax
+       subl    $1,%eax
+       movl    %eax,%r10d
+       jmp     .Lxts_enc_grandloop
+
+.p2align       4
+.Lxts_enc_grandloop:
+       pshufd  $19,%xmm14,%xmm9
+       movdqa  %xmm15,%xmm14
+       paddq   %xmm15,%xmm15
+       movdqu  0(%rdi),%xmm2
+       pand    %xmm8,%xmm9
+       movdqu  16(%rdi),%xmm3
+       pxor    %xmm9,%xmm15
+
+       movdqu  32(%rdi),%xmm4
+       pxor    %xmm10,%xmm2
+       movdqu  48(%rdi),%xmm5
+       pxor    %xmm11,%xmm3
+       movdqu  64(%rdi),%xmm6
+       pxor    %xmm12,%xmm4
+       movdqu  80(%rdi),%xmm7
+       leaq    96(%rdi),%rdi
+       pxor    %xmm13,%xmm5
+       movups  (%r11),%xmm0
+       pxor    %xmm14,%xmm6
+       pxor    %xmm15,%xmm7
+
+
+
+       movups  16(%r11),%xmm1
+       pxor    %xmm0,%xmm2
+       pxor    %xmm0,%xmm3
+       movdqa  %xmm10,0(%rsp)
+.byte  102,15,56,220,209
+       leaq    32(%r11),%rcx
+       pxor    %xmm0,%xmm4
+       movdqa  %xmm11,16(%rsp)
+.byte  102,15,56,220,217
+       pxor    %xmm0,%xmm5
+       movdqa  %xmm12,32(%rsp)
+.byte  102,15,56,220,225
+       pxor    %xmm0,%xmm6
+       movdqa  %xmm13,48(%rsp)
+.byte  102,15,56,220,233
+       pxor    %xmm0,%xmm7
+       movups  (%rcx),%xmm0
+       decl    %eax
+       movdqa  %xmm14,64(%rsp)
+.byte  102,15,56,220,241
+       movdqa  %xmm15,80(%rsp)
+.byte  102,15,56,220,249
+       pxor    %xmm14,%xmm14
+       pcmpgtd %xmm15,%xmm14
+       jmp     .Lxts_enc_loop6_enter
+
+.p2align       4
+.Lxts_enc_loop6:
+.byte  102,15,56,220,209
+.byte  102,15,56,220,217
+       decl    %eax
+.byte  102,15,56,220,225
+.byte  102,15,56,220,233
+.byte  102,15,56,220,241
+.byte  102,15,56,220,249
+.Lxts_enc_loop6_enter:
+       movups  16(%rcx),%xmm1
+.byte  102,15,56,220,208
+.byte  102,15,56,220,216
+       leaq    32(%rcx),%rcx
+.byte  102,15,56,220,224
+.byte  102,15,56,220,232
+.byte  102,15,56,220,240
+.byte  102,15,56,220,248
+       movups  (%rcx),%xmm0
+       jnz     .Lxts_enc_loop6
+
+       pshufd  $19,%xmm14,%xmm9
+       pxor    %xmm14,%xmm14
+       paddq   %xmm15,%xmm15
+.byte  102,15,56,220,209
+       pand    %xmm8,%xmm9
+.byte  102,15,56,220,217
+       pcmpgtd %xmm15,%xmm14
+.byte  102,15,56,220,225
+       pxor    %xmm9,%xmm15
+.byte  102,15,56,220,233
+.byte  102,15,56,220,241
+.byte  102,15,56,220,249
+       movups  16(%rcx),%xmm1
+
+       pshufd  $19,%xmm14,%xmm9
+       pxor    %xmm14,%xmm14
+       movdqa  %xmm15,%xmm10
+       paddq   %xmm15,%xmm15
+.byte  102,15,56,220,208
+       pand    %xmm8,%xmm9
+.byte  102,15,56,220,216
+       pcmpgtd %xmm15,%xmm14
+.byte  102,15,56,220,224
+       pxor    %xmm9,%xmm15
+.byte  102,15,56,220,232
+.byte  102,15,56,220,240
+.byte  102,15,56,220,248
+       movups  32(%rcx),%xmm0
+
+       pshufd  $19,%xmm14,%xmm9
+       pxor    %xmm14,%xmm14
+       movdqa  %xmm15,%xmm11
+       paddq   %xmm15,%xmm15
+.byte  102,15,56,220,209
+       pand    %xmm8,%xmm9
+.byte  102,15,56,220,217
+       pcmpgtd %xmm15,%xmm14
+.byte  102,15,56,220,225
+       pxor    %xmm9,%xmm15
+.byte  102,15,56,220,233
+.byte  102,15,56,220,241
+.byte  102,15,56,220,249
+
+       pshufd  $19,%xmm14,%xmm9
+       pxor    %xmm14,%xmm14
+       movdqa  %xmm15,%xmm12
+       paddq   %xmm15,%xmm15
+.byte  102,15,56,221,208
+       pand    %xmm8,%xmm9
+.byte  102,15,56,221,216
+       pcmpgtd %xmm15,%xmm14
+.byte  102,15,56,221,224
+       pxor    %xmm9,%xmm15
+.byte  102,15,56,221,232
+.byte  102,15,56,221,240
+.byte  102,15,56,221,248
+
+       pshufd  $19,%xmm14,%xmm9
+       pxor    %xmm14,%xmm14
+       movdqa  %xmm15,%xmm13
+       paddq   %xmm15,%xmm15
+       xorps   0(%rsp),%xmm2
+       pand    %xmm8,%xmm9
+       xorps   16(%rsp),%xmm3
+       pcmpgtd %xmm15,%xmm14
+       pxor    %xmm9,%xmm15
+
+       xorps   32(%rsp),%xmm4
+       movups  %xmm2,0(%rsi)
+       xorps   48(%rsp),%xmm5
+       movups  %xmm3,16(%rsi)
+       xorps   64(%rsp),%xmm6
+       movups  %xmm4,32(%rsi)
+       xorps   80(%rsp),%xmm7
+       movups  %xmm5,48(%rsi)
+       movl    %r10d,%eax
+       movups  %xmm6,64(%rsi)
+       movups  %xmm7,80(%rsi)
+       leaq    96(%rsi),%rsi
+       subq    $96,%rdx
+       jnc     .Lxts_enc_grandloop
+
+       leal    3(%rax,%rax,1),%eax
+       movq    %r11,%rcx
+       movl    %eax,%r10d
+
+.Lxts_enc_short:
+       addq    $96,%rdx
+       jz      .Lxts_enc_done
+
+       cmpq    $32,%rdx
+       jb      .Lxts_enc_one
+       je      .Lxts_enc_two
+
+       cmpq    $64,%rdx
+       jb      .Lxts_enc_three
+       je      .Lxts_enc_four
+
+       pshufd  $19,%xmm14,%xmm9
+       movdqa  %xmm15,%xmm14
+       paddq   %xmm15,%xmm15
+       movdqu  (%rdi),%xmm2
+       pand    %xmm8,%xmm9
+       movdqu  16(%rdi),%xmm3
+       pxor    %xmm9,%xmm15
+
+       movdqu  32(%rdi),%xmm4
+       pxor    %xmm10,%xmm2
+       movdqu  48(%rdi),%xmm5
+       pxor    %xmm11,%xmm3
+       movdqu  64(%rdi),%xmm6
+       leaq    80(%rdi),%rdi
+       pxor    %xmm12,%xmm4
+       pxor    %xmm13,%xmm5
+       pxor    %xmm14,%xmm6
+
+       call    _aesni_encrypt6
+
+       xorps   %xmm10,%xmm2
+       movdqa  %xmm15,%xmm10
+       xorps   %xmm11,%xmm3
+       xorps   %xmm12,%xmm4
+       movdqu  %xmm2,(%rsi)
+       xorps   %xmm13,%xmm5
+       movdqu  %xmm3,16(%rsi)
+       xorps   %xmm14,%xmm6
+       movdqu  %xmm4,32(%rsi)
+       movdqu  %xmm5,48(%rsi)
+       movdqu  %xmm6,64(%rsi)
+       leaq    80(%rsi),%rsi
+       jmp     .Lxts_enc_done
+
+.p2align       4
+.Lxts_enc_one:
+       movups  (%rdi),%xmm2
+       leaq    16(%rdi),%rdi
+       xorps   %xmm10,%xmm2
+       movups  (%rcx),%xmm0
+       movups  16(%rcx),%xmm1
+       leaq    32(%rcx),%rcx
+       xorps   %xmm0,%xmm2
+.Loop_enc1_9:
+.byte  102,15,56,220,209
+       decl    %eax
+       movups  (%rcx),%xmm1
+       leaq    16(%rcx),%rcx
+       jnz     .Loop_enc1_9    
+.byte  102,15,56,221,209
+       xorps   %xmm10,%xmm2
+       movdqa  %xmm11,%xmm10
+       movups  %xmm2,(%rsi)
+       leaq    16(%rsi),%rsi
+       jmp     .Lxts_enc_done
+
+.p2align       4
+.Lxts_enc_two:
+       movups  (%rdi),%xmm2
+       movups  16(%rdi),%xmm3
+       leaq    32(%rdi),%rdi
+       xorps   %xmm10,%xmm2
+       xorps   %xmm11,%xmm3
+
+       call    _aesni_encrypt3
+
+       xorps   %xmm10,%xmm2
+       movdqa  %xmm12,%xmm10
+       xorps   %xmm11,%xmm3
+       movups  %xmm2,(%rsi)
+       movups  %xmm3,16(%rsi)
+       leaq    32(%rsi),%rsi
+       jmp     .Lxts_enc_done
+
+.p2align       4
+.Lxts_enc_three:
+       movups  (%rdi),%xmm2
+       movups  16(%rdi),%xmm3
+       movups  32(%rdi),%xmm4
+       leaq    48(%rdi),%rdi
+       xorps   %xmm10,%xmm2
+       xorps   %xmm11,%xmm3
+       xorps   %xmm12,%xmm4
+
+       call    _aesni_encrypt3
+
+       xorps   %xmm10,%xmm2
+       movdqa  %xmm13,%xmm10
+       xorps   %xmm11,%xmm3
+       xorps   %xmm12,%xmm4
+       movups  %xmm2,(%rsi)
+       movups  %xmm3,16(%rsi)
+       movups  %xmm4,32(%rsi)
+       leaq    48(%rsi),%rsi
+       jmp     .Lxts_enc_done
+
+.p2align       4
+.Lxts_enc_four:
+       movups  (%rdi),%xmm2
+       movups  16(%rdi),%xmm3
+       movups  32(%rdi),%xmm4
+       xorps   %xmm10,%xmm2
+       movups  48(%rdi),%xmm5
+       leaq    64(%rdi),%rdi
+       xorps   %xmm11,%xmm3
+       xorps   %xmm12,%xmm4
+       xorps   %xmm13,%xmm5
+
+       call    _aesni_encrypt4
+
+       xorps   %xmm10,%xmm2
+       movdqa  %xmm15,%xmm10
+       xorps   %xmm11,%xmm3
+       xorps   %xmm12,%xmm4
+       movups  %xmm2,(%rsi)
+       xorps   %xmm13,%xmm5
+       movups  %xmm3,16(%rsi)
+       movups  %xmm4,32(%rsi)
+       movups  %xmm5,48(%rsi)
+       leaq    64(%rsi),%rsi
+       jmp     .Lxts_enc_done
+
+.p2align       4
+.Lxts_enc_done:
+       andq    $15,%r9
+       jz      .Lxts_enc_ret
+       movq    %r9,%rdx
+
+.Lxts_enc_steal:
+       movzbl  (%rdi),%eax
+       movzbl  -16(%rsi),%ecx
+       leaq    1(%rdi),%rdi
+       movb    %al,-16(%rsi)
+       movb    %cl,0(%rsi)
+       leaq    1(%rsi),%rsi
+       subq    $1,%rdx
+       jnz     .Lxts_enc_steal
+
+       subq    %r9,%rsi
+       movq    %r11,%rcx
+       movl    %r10d,%eax
+
+       movups  -16(%rsi),%xmm2
+       xorps   %xmm10,%xmm2
+       movups  (%rcx),%xmm0
+       movups  16(%rcx),%xmm1
+       leaq    32(%rcx),%rcx
+       xorps   %xmm0,%xmm2
+.Loop_enc1_10:
+.byte  102,15,56,220,209
+       decl    %eax
+       movups  (%rcx),%xmm1
+       leaq    16(%rcx),%rcx
+       jnz     .Loop_enc1_10   
+.byte  102,15,56,221,209
+       xorps   %xmm10,%xmm2
+       movups  %xmm2,-16(%rsi)
+
+.Lxts_enc_ret:
+       movaps  96(%rsp),%xmm6
+       movaps  112(%rsp),%xmm7
+       movaps  128(%rsp),%xmm8
+       movaps  144(%rsp),%xmm9
+       movaps  160(%rsp),%xmm10
+       movaps  176(%rsp),%xmm11
+       movaps  192(%rsp),%xmm12
+       movaps  208(%rsp),%xmm13
+       movaps  224(%rsp),%xmm14
+       movaps  240(%rsp),%xmm15
+       leaq    264(%rsp),%rsp
+.Lxts_enc_epilogue:
+       movq    8(%rsp),%rdi
+       movq    16(%rsp),%rsi
+       .byte   0xf3,0xc3
+.LSEH_end_aesni_xts_encrypt:
+.globl aesni_xts_decrypt
+.def   aesni_xts_decrypt;      .scl 2; .type 32;       .endef
+.p2align       4
+aesni_xts_decrypt:
+       movq    %rdi,8(%rsp)
+       movq    %rsi,16(%rsp)
+       movq    %rsp,%rax
+.LSEH_begin_aesni_xts_decrypt:
+       movq    %rcx,%rdi
+       movq    %rdx,%rsi
+       movq    %r8,%rdx
+       movq    %r9,%rcx
+       movq    40(%rsp),%r8
+       movq    48(%rsp),%r9
+
+       leaq    -264(%rsp),%rsp
+       movaps  %xmm6,96(%rsp)
+       movaps  %xmm7,112(%rsp)
+       movaps  %xmm8,128(%rsp)
+       movaps  %xmm9,144(%rsp)
+       movaps  %xmm10,160(%rsp)
+       movaps  %xmm11,176(%rsp)
+       movaps  %xmm12,192(%rsp)
+       movaps  %xmm13,208(%rsp)
+       movaps  %xmm14,224(%rsp)
+       movaps  %xmm15,240(%rsp)
+.Lxts_dec_body:
+       movups  (%r9),%xmm15
+       movl    240(%r8),%eax
+       movl    240(%rcx),%r10d
+       movups  (%r8),%xmm0
+       movups  16(%r8),%xmm1
+       leaq    32(%r8),%r8
+       xorps   %xmm0,%xmm15
+.Loop_enc1_11:
+.byte  102,68,15,56,220,249
+       decl    %eax
+       movups  (%r8),%xmm1
+       leaq    16(%r8),%r8
+       jnz     .Loop_enc1_11   
+.byte  102,68,15,56,221,249
+       xorl    %eax,%eax
+       testq   $15,%rdx
+       setnz   %al
+       shlq    $4,%rax
+       subq    %rax,%rdx
+
+       movq    %rcx,%r11
+       movl    %r10d,%eax
+       movq    %rdx,%r9
+       andq    $-16,%rdx
+
+       movdqa  .Lxts_magic(%rip),%xmm8
+       pxor    %xmm14,%xmm14
+       pcmpgtd %xmm15,%xmm14
+       pshufd  $19,%xmm14,%xmm9
+       pxor    %xmm14,%xmm14
+       movdqa  %xmm15,%xmm10
+       paddq   %xmm15,%xmm15
+       pand    %xmm8,%xmm9
+       pcmpgtd %xmm15,%xmm14
+       pxor    %xmm9,%xmm15
+       pshufd  $19,%xmm14,%xmm9
+       pxor    %xmm14,%xmm14
+       movdqa  %xmm15,%xmm11
+       paddq   %xmm15,%xmm15
+       pand    %xmm8,%xmm9
+       pcmpgtd %xmm15,%xmm14
+       pxor    %xmm9,%xmm15
+       pshufd  $19,%xmm14,%xmm9
+       pxor    %xmm14,%xmm14
+       movdqa  %xmm15,%xmm12
+       paddq   %xmm15,%xmm15
+       pand    %xmm8,%xmm9
+       pcmpgtd %xmm15,%xmm14
+       pxor    %xmm9,%xmm15
+       pshufd  $19,%xmm14,%xmm9
+       pxor    %xmm14,%xmm14
+       movdqa  %xmm15,%xmm13
+       paddq   %xmm15,%xmm15
+       pand    %xmm8,%xmm9
+       pcmpgtd %xmm15,%xmm14
+       pxor    %xmm9,%xmm15
+       subq    $96,%rdx
+       jc      .Lxts_dec_short
+
+       shrl    $1,%eax
+       subl    $1,%eax
+       movl    %eax,%r10d
+       jmp     .Lxts_dec_grandloop
+
+.p2align       4
+.Lxts_dec_grandloop:
+       pshufd  $19,%xmm14,%xmm9
+       movdqa  %xmm15,%xmm14
+       paddq   %xmm15,%xmm15
+       movdqu  0(%rdi),%xmm2
+       pand    %xmm8,%xmm9
+       movdqu  16(%rdi),%xmm3
+       pxor    %xmm9,%xmm15
+
+       movdqu  32(%rdi),%xmm4
+       pxor    %xmm10,%xmm2
+       movdqu  48(%rdi),%xmm5
+       pxor    %xmm11,%xmm3
+       movdqu  64(%rdi),%xmm6
+       pxor    %xmm12,%xmm4
+       movdqu  80(%rdi),%xmm7
+       leaq    96(%rdi),%rdi
+       pxor    %xmm13,%xmm5
+       movups  (%r11),%xmm0
+       pxor    %xmm14,%xmm6
+       pxor    %xmm15,%xmm7
+
+
+
+       movups  16(%r11),%xmm1
+       pxor    %xmm0,%xmm2
+       pxor    %xmm0,%xmm3
+       movdqa  %xmm10,0(%rsp)
+.byte  102,15,56,222,209
+       leaq    32(%r11),%rcx
+       pxor    %xmm0,%xmm4
+       movdqa  %xmm11,16(%rsp)
+.byte  102,15,56,222,217
+       pxor    %xmm0,%xmm5
+       movdqa  %xmm12,32(%rsp)
+.byte  102,15,56,222,225
+       pxor    %xmm0,%xmm6
+       movdqa  %xmm13,48(%rsp)
+.byte  102,15,56,222,233
+       pxor    %xmm0,%xmm7
+       movups  (%rcx),%xmm0
+       decl    %eax
+       movdqa  %xmm14,64(%rsp)
+.byte  102,15,56,222,241
+       movdqa  %xmm15,80(%rsp)
+.byte  102,15,56,222,249
+       pxor    %xmm14,%xmm14
+       pcmpgtd %xmm15,%xmm14
+       jmp     .Lxts_dec_loop6_enter
+
+.p2align       4
+.Lxts_dec_loop6:
+.byte  102,15,56,222,209
+.byte  102,15,56,222,217
+       decl    %eax
+.byte  102,15,56,222,225
+.byte  102,15,56,222,233
+.byte  102,15,56,222,241
+.byte  102,15,56,222,249
+.Lxts_dec_loop6_enter:
+       movups  16(%rcx),%xmm1
+.byte  102,15,56,222,208
+.byte  102,15,56,222,216
+       leaq    32(%rcx),%rcx
+.byte  102,15,56,222,224
+.byte  102,15,56,222,232
+.byte  102,15,56,222,240
+.byte  102,15,56,222,248
+       movups  (%rcx),%xmm0
+       jnz     .Lxts_dec_loop6
+
+       pshufd  $19,%xmm14,%xmm9
+       pxor    %xmm14,%xmm14
+       paddq   %xmm15,%xmm15
+.byte  102,15,56,222,209
+       pand    %xmm8,%xmm9
+.byte  102,15,56,222,217
+       pcmpgtd %xmm15,%xmm14
+.byte  102,15,56,222,225
+       pxor    %xmm9,%xmm15
+.byte  102,15,56,222,233
+.byte  102,15,56,222,241
+.byte  102,15,56,222,249
+       movups  16(%rcx),%xmm1
+
+       pshufd  $19,%xmm14,%xmm9
+       pxor    %xmm14,%xmm14
+       movdqa  %xmm15,%xmm10
+       paddq   %xmm15,%xmm15
+.byte  102,15,56,222,208
+       pand    %xmm8,%xmm9
+.byte  102,15,56,222,216
+       pcmpgtd %xmm15,%xmm14
+.byte  102,15,56,222,224
+       pxor    %xmm9,%xmm15
+.byte  102,15,56,222,232
+.byte  102,15,56,222,240
+.byte  102,15,56,222,248
+       movups  32(%rcx),%xmm0
+
+       pshufd  $19,%xmm14,%xmm9
+       pxor    %xmm14,%xmm14
+       movdqa  %xmm15,%xmm11
+       paddq   %xmm15,%xmm15
+.byte  102,15,56,222,209
+       pand    %xmm8,%xmm9
+.byte  102,15,56,222,217
+       pcmpgtd %xmm15,%xmm14
+.byte  102,15,56,222,225
+       pxor    %xmm9,%xmm15
+.byte  102,15,56,222,233
+.byte  102,15,56,222,241
+.byte  102,15,56,222,249
+
+       pshufd  $19,%xmm14,%xmm9
+       pxor    %xmm14,%xmm14
+       movdqa  %xmm15,%xmm12
+       paddq   %xmm15,%xmm15
+.byte  102,15,56,223,208
+       pand    %xmm8,%xmm9
+.byte  102,15,56,223,216
+       pcmpgtd %xmm15,%xmm14
+.byte  102,15,56,223,224
+       pxor    %xmm9,%xmm15
+.byte  102,15,56,223,232
+.byte  102,15,56,223,240
+.byte  102,15,56,223,248
+
+       pshufd  $19,%xmm14,%xmm9
+       pxor    %xmm14,%xmm14
+       movdqa  %xmm15,%xmm13
+       paddq   %xmm15,%xmm15
+       xorps   0(%rsp),%xmm2
+       pand    %xmm8,%xmm9
+       xorps   16(%rsp),%xmm3
+       pcmpgtd %xmm15,%xmm14
+       pxor    %xmm9,%xmm15
+
+       xorps   32(%rsp),%xmm4
+       movups  %xmm2,0(%rsi)
+       xorps   48(%rsp),%xmm5
+       movups  %xmm3,16(%rsi)
+       xorps   64(%rsp),%xmm6
+       movups  %xmm4,32(%rsi)
+       xorps   80(%rsp),%xmm7
+       movups  %xmm5,48(%rsi)
+       movl    %r10d,%eax
+       movups  %xmm6,64(%rsi)
+       movups  %xmm7,80(%rsi)
+       leaq    96(%rsi),%rsi
+       subq    $96,%rdx
+       jnc     .Lxts_dec_grandloop
+
+       leal    3(%rax,%rax,1),%eax
+       movq    %r11,%rcx
+       movl    %eax,%r10d
+
+.Lxts_dec_short:
+       addq    $96,%rdx
+       jz      .Lxts_dec_done
+
+       cmpq    $32,%rdx
+       jb      .Lxts_dec_one
+       je      .Lxts_dec_two
+
+       cmpq    $64,%rdx
+       jb      .Lxts_dec_three
+       je      .Lxts_dec_four
+
+       pshufd  $19,%xmm14,%xmm9
+       movdqa  %xmm15,%xmm14
+       paddq   %xmm15,%xmm15
+       movdqu  (%rdi),%xmm2
+       pand    %xmm8,%xmm9
+       movdqu  16(%rdi),%xmm3
+       pxor    %xmm9,%xmm15
+
+       movdqu  32(%rdi),%xmm4
+       pxor    %xmm10,%xmm2
+       movdqu  48(%rdi),%xmm5
+       pxor    %xmm11,%xmm3
+       movdqu  64(%rdi),%xmm6
+       leaq    80(%rdi),%rdi
+       pxor    %xmm12,%xmm4
+       pxor    %xmm13,%xmm5
+       pxor    %xmm14,%xmm6
+
+       call    _aesni_decrypt6
+
+       xorps   %xmm10,%xmm2
+       xorps   %xmm11,%xmm3
+       xorps   %xmm12,%xmm4
+       movdqu  %xmm2,(%rsi)
+       xorps   %xmm13,%xmm5
+       movdqu  %xmm3,16(%rsi)
+       xorps   %xmm14,%xmm6
+       movdqu  %xmm4,32(%rsi)
+       pxor    %xmm14,%xmm14
+       movdqu  %xmm5,48(%rsi)
+       pcmpgtd %xmm15,%xmm14
+       movdqu  %xmm6,64(%rsi)
+       leaq    80(%rsi),%rsi
+       pshufd  $19,%xmm14,%xmm11
+       andq    $15,%r9
+       jz      .Lxts_dec_ret
+
+       movdqa  %xmm15,%xmm10
+       paddq   %xmm15,%xmm15
+       pand    %xmm8,%xmm11
+       pxor    %xmm15,%xmm11
+       jmp     .Lxts_dec_done2
+
+.p2align       4
+.Lxts_dec_one:
+       movups  (%rdi),%xmm2
+       leaq    16(%rdi),%rdi
+       xorps   %xmm10,%xmm2
+       movups  (%rcx),%xmm0
+       movups  16(%rcx),%xmm1
+       leaq    32(%rcx),%rcx
+       xorps   %xmm0,%xmm2
+.Loop_dec1_12:
+.byte  102,15,56,222,209
+       decl    %eax
+       movups  (%rcx),%xmm1
+       leaq    16(%rcx),%rcx
+       jnz     .Loop_dec1_12   
+.byte  102,15,56,223,209
+       xorps   %xmm10,%xmm2
+       movdqa  %xmm11,%xmm10
+       movups  %xmm2,(%rsi)
+       movdqa  %xmm12,%xmm11
+       leaq    16(%rsi),%rsi
+       jmp     .Lxts_dec_done
+
+.p2align       4
+.Lxts_dec_two:
+       movups  (%rdi),%xmm2
+       movups  16(%rdi),%xmm3
+       leaq    32(%rdi),%rdi
+       xorps   %xmm10,%xmm2
+       xorps   %xmm11,%xmm3
+
+       call    _aesni_decrypt3
+
+       xorps   %xmm10,%xmm2
+       movdqa  %xmm12,%xmm10
+       xorps   %xmm11,%xmm3
+       movdqa  %xmm13,%xmm11
+       movups  %xmm2,(%rsi)
+       movups  %xmm3,16(%rsi)
+       leaq    32(%rsi),%rsi
+       jmp     .Lxts_dec_done
+
+.p2align       4
+.Lxts_dec_three:
+       movups  (%rdi),%xmm2
+       movups  16(%rdi),%xmm3
+       movups  32(%rdi),%xmm4
+       leaq    48(%rdi),%rdi
+       xorps   %xmm10,%xmm2
+       xorps   %xmm11,%xmm3
+       xorps   %xmm12,%xmm4
+
+       call    _aesni_decrypt3
+
+       xorps   %xmm10,%xmm2
+       movdqa  %xmm13,%xmm10
+       xorps   %xmm11,%xmm3
+       movdqa  %xmm15,%xmm11
+       xorps   %xmm12,%xmm4
+       movups  %xmm2,(%rsi)
+       movups  %xmm3,16(%rsi)
+       movups  %xmm4,32(%rsi)
+       leaq    48(%rsi),%rsi
+       jmp     .Lxts_dec_done
+
+.p2align       4
+.Lxts_dec_four:
+       pshufd  $19,%xmm14,%xmm9
+       movdqa  %xmm15,%xmm14
+       paddq   %xmm15,%xmm15
+       movups  (%rdi),%xmm2
+       pand    %xmm8,%xmm9
+       movups  16(%rdi),%xmm3
+       pxor    %xmm9,%xmm15
+
+       movups  32(%rdi),%xmm4
+       xorps   %xmm10,%xmm2
+       movups  48(%rdi),%xmm5
+       leaq    64(%rdi),%rdi
+       xorps   %xmm11,%xmm3
+       xorps   %xmm12,%xmm4
+       xorps   %xmm13,%xmm5
+
+       call    _aesni_decrypt4
+
+       xorps   %xmm10,%xmm2
+       movdqa  %xmm14,%xmm10
+       xorps   %xmm11,%xmm3
+       movdqa  %xmm15,%xmm11
+       xorps   %xmm12,%xmm4
+       movups  %xmm2,(%rsi)
+       xorps   %xmm13,%xmm5
+       movups  %xmm3,16(%rsi)
+       movups  %xmm4,32(%rsi)
+       movups  %xmm5,48(%rsi)
+       leaq    64(%rsi),%rsi
+       jmp     .Lxts_dec_done
+
+.p2align       4
+.Lxts_dec_done:
+       andq    $15,%r9
+       jz      .Lxts_dec_ret
+.Lxts_dec_done2:
+       movq    %r9,%rdx
+       movq    %r11,%rcx
+       movl    %r10d,%eax
+
+       movups  (%rdi),%xmm2
+       xorps   %xmm11,%xmm2
+       movups  (%rcx),%xmm0
+       movups  16(%rcx),%xmm1
+       leaq    32(%rcx),%rcx
+       xorps   %xmm0,%xmm2
+.Loop_dec1_13:
+.byte  102,15,56,222,209
+       decl    %eax
+       movups  (%rcx),%xmm1
+       leaq    16(%rcx),%rcx
+       jnz     .Loop_dec1_13   
+.byte  102,15,56,223,209
+       xorps   %xmm11,%xmm2
+       movups  %xmm2,(%rsi)
+
+.Lxts_dec_steal:
+       movzbl  16(%rdi),%eax
+       movzbl  (%rsi),%ecx
+       leaq    1(%rdi),%rdi
+       movb    %al,(%rsi)
+       movb    %cl,16(%rsi)
+       leaq    1(%rsi),%rsi
+       subq    $1,%rdx
+       jnz     .Lxts_dec_steal
+
+       subq    %r9,%rsi
+       movq    %r11,%rcx
+       movl    %r10d,%eax
+
+       movups  (%rsi),%xmm2
+       xorps   %xmm10,%xmm2
+       movups  (%rcx),%xmm0
+       movups  16(%rcx),%xmm1
+       leaq    32(%rcx),%rcx
+       xorps   %xmm0,%xmm2
+.Loop_dec1_14:
+.byte  102,15,56,222,209
+       decl    %eax
+       movups  (%rcx),%xmm1
+       leaq    16(%rcx),%rcx
+       jnz     .Loop_dec1_14   
+.byte  102,15,56,223,209
+       xorps   %xmm10,%xmm2
+       movups  %xmm2,(%rsi)
+
+.Lxts_dec_ret:
+       movaps  96(%rsp),%xmm6
+       movaps  112(%rsp),%xmm7
+       movaps  128(%rsp),%xmm8
+       movaps  144(%rsp),%xmm9
+       movaps  160(%rsp),%xmm10
+       movaps  176(%rsp),%xmm11
+       movaps  192(%rsp),%xmm12
+       movaps  208(%rsp),%xmm13
+       movaps  224(%rsp),%xmm14
+       movaps  240(%rsp),%xmm15
+       leaq    264(%rsp),%rsp
+.Lxts_dec_epilogue:
+       movq    8(%rsp),%rdi
+       movq    16(%rsp),%rsi
+       .byte   0xf3,0xc3
+.LSEH_end_aesni_xts_decrypt:
+.globl aesni_cbc_encrypt
+.def   aesni_cbc_encrypt;      .scl 2; .type 32;       .endef
+.p2align       4
+aesni_cbc_encrypt:
+       movq    %rdi,8(%rsp)
+       movq    %rsi,16(%rsp)
+       movq    %rsp,%rax
+.LSEH_begin_aesni_cbc_encrypt:
+       movq    %rcx,%rdi
+       movq    %rdx,%rsi
+       movq    %r8,%rdx
+       movq    %r9,%rcx
+       movq    40(%rsp),%r8
+       movq    48(%rsp),%r9
+
+       testq   %rdx,%rdx
+       jz      .Lcbc_ret
+
+       movl    240(%rcx),%r10d
+       movq    %rcx,%r11
+       testl   %r9d,%r9d
+       jz      .Lcbc_decrypt
+
+       movups  (%r8),%xmm2
+       movl    %r10d,%eax
+       cmpq    $16,%rdx
+       jb      .Lcbc_enc_tail
+       subq    $16,%rdx
+       jmp     .Lcbc_enc_loop
+.p2align       4
+.Lcbc_enc_loop:
+       movups  (%rdi),%xmm3
+       leaq    16(%rdi),%rdi
+
+       movups  (%rcx),%xmm0
+       movups  16(%rcx),%xmm1
+       xorps   %xmm0,%xmm3
+       leaq    32(%rcx),%rcx
+       xorps   %xmm3,%xmm2
+.Loop_enc1_15:
+.byte  102,15,56,220,209
+       decl    %eax
+       movups  (%rcx),%xmm1
+       leaq    16(%rcx),%rcx
+       jnz     .Loop_enc1_15   
+.byte  102,15,56,221,209
+       movl    %r10d,%eax
+       movq    %r11,%rcx
+       movups  %xmm2,0(%rsi)
+       leaq    16(%rsi),%rsi
+       subq    $16,%rdx
+       jnc     .Lcbc_enc_loop
+       addq    $16,%rdx
+       jnz     .Lcbc_enc_tail
+       movups  %xmm2,(%r8)
+       jmp     .Lcbc_ret
+
+.Lcbc_enc_tail:
+       movq    %rdx,%rcx
+       xchgq   %rdi,%rsi
+.long  0x9066A4F3      
+       movl    $16,%ecx
+       subq    %rdx,%rcx
+       xorl    %eax,%eax
+.long  0x9066AAF3      
+       leaq    -16(%rdi),%rdi
+       movl    %r10d,%eax
+       movq    %rdi,%rsi
+       movq    %r11,%rcx
+       xorq    %rdx,%rdx
+       jmp     .Lcbc_enc_loop  
+
+.p2align       4
+.Lcbc_decrypt:
+       leaq    -88(%rsp),%rsp
+       movaps  %xmm6,(%rsp)
+       movaps  %xmm7,16(%rsp)
+       movaps  %xmm8,32(%rsp)
+       movaps  %xmm9,48(%rsp)
+.Lcbc_decrypt_body:
+       movups  (%r8),%xmm9
+       movl    %r10d,%eax
+       cmpq    $112,%rdx
+       jbe     .Lcbc_dec_tail
+       shrl    $1,%r10d
+       subq    $112,%rdx
+       movl    %r10d,%eax
+       movaps  %xmm9,64(%rsp)
+       jmp     .Lcbc_dec_loop8_enter
+.p2align       4
+.Lcbc_dec_loop8:
+       movaps  %xmm0,64(%rsp)
+       movups  %xmm9,(%rsi)
+       leaq    16(%rsi),%rsi
+.Lcbc_dec_loop8_enter:
+       movups  (%rcx),%xmm0
+       movups  (%rdi),%xmm2
+       movups  16(%rdi),%xmm3
+       movups  16(%rcx),%xmm1
+
+       leaq    32(%rcx),%rcx
+       movdqu  32(%rdi),%xmm4
+       xorps   %xmm0,%xmm2
+       movdqu  48(%rdi),%xmm5
+       xorps   %xmm0,%xmm3
+       movdqu  64(%rdi),%xmm6
+.byte  102,15,56,222,209
+       pxor    %xmm0,%xmm4
+       movdqu  80(%rdi),%xmm7
+.byte  102,15,56,222,217
+       pxor    %xmm0,%xmm5
+       movdqu  96(%rdi),%xmm8
+.byte  102,15,56,222,225
+       pxor    %xmm0,%xmm6
+       movdqu  112(%rdi),%xmm9
+.byte  102,15,56,222,233
+       pxor    %xmm0,%xmm7
+       decl    %eax
+.byte  102,15,56,222,241
+       pxor    %xmm0,%xmm8
+.byte  102,15,56,222,249
+       pxor    %xmm0,%xmm9
+       movups  (%rcx),%xmm0
+.byte  102,68,15,56,222,193
+.byte  102,68,15,56,222,201
+       movups  16(%rcx),%xmm1
+
+       call    .Ldec_loop8_enter
+
+       movups  (%rdi),%xmm1
+       movups  16(%rdi),%xmm0
+       xorps   64(%rsp),%xmm2
+       xorps   %xmm1,%xmm3
+       movups  32(%rdi),%xmm1
+       xorps   %xmm0,%xmm4
+       movups  48(%rdi),%xmm0
+       xorps   %xmm1,%xmm5
+       movups  64(%rdi),%xmm1
+       xorps   %xmm0,%xmm6
+       movups  80(%rdi),%xmm0
+       xorps   %xmm1,%xmm7
+       movups  96(%rdi),%xmm1
+       xorps   %xmm0,%xmm8
+       movups  112(%rdi),%xmm0
+       xorps   %xmm1,%xmm9
+       movups  %xmm2,(%rsi)
+       movups  %xmm3,16(%rsi)
+       movups  %xmm4,32(%rsi)
+       movups  %xmm5,48(%rsi)
+       movl    %r10d,%eax
+       movups  %xmm6,64(%rsi)
+       movq    %r11,%rcx
+       movups  %xmm7,80(%rsi)
+       leaq    128(%rdi),%rdi
+       movups  %xmm8,96(%rsi)
+       leaq    112(%rsi),%rsi
+       subq    $128,%rdx
+       ja      .Lcbc_dec_loop8
+
+       movaps  %xmm9,%xmm2
+       movaps  %xmm0,%xmm9
+       addq    $112,%rdx
+       jle     .Lcbc_dec_tail_collected
+       movups  %xmm2,(%rsi)
+       leal    1(%r10,%r10,1),%eax
+       leaq    16(%rsi),%rsi
+.Lcbc_dec_tail:
+       movups  (%rdi),%xmm2
+       movaps  %xmm2,%xmm8
+       cmpq    $16,%rdx
+       jbe     .Lcbc_dec_one
+
+       movups  16(%rdi),%xmm3
+       movaps  %xmm3,%xmm7
+       cmpq    $32,%rdx
+       jbe     .Lcbc_dec_two
+
+       movups  32(%rdi),%xmm4
+       movaps  %xmm4,%xmm6
+       cmpq    $48,%rdx
+       jbe     .Lcbc_dec_three
+
+       movups  48(%rdi),%xmm5
+       cmpq    $64,%rdx
+       jbe     .Lcbc_dec_four
+
+       movups  64(%rdi),%xmm6
+       cmpq    $80,%rdx
+       jbe     .Lcbc_dec_five
+
+       movups  80(%rdi),%xmm7
+       cmpq    $96,%rdx
+       jbe     .Lcbc_dec_six
+
+       movups  96(%rdi),%xmm8
+       movaps  %xmm9,64(%rsp)
+       call    _aesni_decrypt8
+       movups  (%rdi),%xmm1
+       movups  16(%rdi),%xmm0
+       xorps   64(%rsp),%xmm2
+       xorps   %xmm1,%xmm3
+       movups  32(%rdi),%xmm1
+       xorps   %xmm0,%xmm4
+       movups  48(%rdi),%xmm0
+       xorps   %xmm1,%xmm5
+       movups  64(%rdi),%xmm1
+       xorps   %xmm0,%xmm6
+       movups  80(%rdi),%xmm0
+       xorps   %xmm1,%xmm7
+       movups  96(%rdi),%xmm9
+       xorps   %xmm0,%xmm8
+       movups  %xmm2,(%rsi)
+       movups  %xmm3,16(%rsi)
+       movups  %xmm4,32(%rsi)
+       movups  %xmm5,48(%rsi)
+       movups  %xmm6,64(%rsi)
+       movups  %xmm7,80(%rsi)
+       leaq    96(%rsi),%rsi
+       movaps  %xmm8,%xmm2
+       subq    $112,%rdx
+       jmp     .Lcbc_dec_tail_collected
+.p2align       4
+.Lcbc_dec_one:
+       movups  (%rcx),%xmm0
+       movups  16(%rcx),%xmm1
+       leaq    32(%rcx),%rcx
+       xorps   %xmm0,%xmm2
+.Loop_dec1_16:
+.byte  102,15,56,222,209
+       decl    %eax
+       movups  (%rcx),%xmm1
+       leaq    16(%rcx),%rcx
+       jnz     .Loop_dec1_16   
+.byte  102,15,56,223,209
+       xorps   %xmm9,%xmm2
+       movaps  %xmm8,%xmm9
+       subq    $16,%rdx
+       jmp     .Lcbc_dec_tail_collected
+.p2align       4
+.Lcbc_dec_two:
+       xorps   %xmm4,%xmm4
+       call    _aesni_decrypt3
+       xorps   %xmm9,%xmm2
+       xorps   %xmm8,%xmm3
+       movups  %xmm2,(%rsi)
+       movaps  %xmm7,%xmm9
+       movaps  %xmm3,%xmm2
+       leaq    16(%rsi),%rsi
+       subq    $32,%rdx
+       jmp     .Lcbc_dec_tail_collected
+.p2align       4
+.Lcbc_dec_three:
+       call    _aesni_decrypt3
+       xorps   %xmm9,%xmm2
+       xorps   %xmm8,%xmm3
+       movups  %xmm2,(%rsi)
+       xorps   %xmm7,%xmm4
+       movups  %xmm3,16(%rsi)
+       movaps  %xmm6,%xmm9
+       movaps  %xmm4,%xmm2
+       leaq    32(%rsi),%rsi
+       subq    $48,%rdx
+       jmp     .Lcbc_dec_tail_collected
+.p2align       4
+.Lcbc_dec_four:
+       call    _aesni_decrypt4
+       xorps   %xmm9,%xmm2
+       movups  48(%rdi),%xmm9
+       xorps   %xmm8,%xmm3
+       movups  %xmm2,(%rsi)
+       xorps   %xmm7,%xmm4
+       movups  %xmm3,16(%rsi)
+       xorps   %xmm6,%xmm5
+       movups  %xmm4,32(%rsi)
+       movaps  %xmm5,%xmm2
+       leaq    48(%rsi),%rsi
+       subq    $64,%rdx
+       jmp     .Lcbc_dec_tail_collected
+.p2align       4
+.Lcbc_dec_five:
+       xorps   %xmm7,%xmm7
+       call    _aesni_decrypt6
+       movups  16(%rdi),%xmm1
+       movups  32(%rdi),%xmm0
+       xorps   %xmm9,%xmm2
+       xorps   %xmm8,%xmm3
+       xorps   %xmm1,%xmm4
+       movups  48(%rdi),%xmm1
+       xorps   %xmm0,%xmm5
+       movups  64(%rdi),%xmm9
+       xorps   %xmm1,%xmm6
+       movups  %xmm2,(%rsi)
+       movups  %xmm3,16(%rsi)
+       movups  %xmm4,32(%rsi)
+       movups  %xmm5,48(%rsi)
+       leaq    64(%rsi),%rsi
+       movaps  %xmm6,%xmm2
+       subq    $80,%rdx
+       jmp     .Lcbc_dec_tail_collected
+.p2align       4
+.Lcbc_dec_six:
+       call    _aesni_decrypt6
+       movups  16(%rdi),%xmm1
+       movups  32(%rdi),%xmm0
+       xorps   %xmm9,%xmm2
+       xorps   %xmm8,%xmm3
+       xorps   %xmm1,%xmm4
+       movups  48(%rdi),%xmm1
+       xorps   %xmm0,%xmm5
+       movups  64(%rdi),%xmm0
+       xorps   %xmm1,%xmm6
+       movups  80(%rdi),%xmm9
+       xorps   %xmm0,%xmm7
+       movups  %xmm2,(%rsi)
+       movups  %xmm3,16(%rsi)
+       movups  %xmm4,32(%rsi)
+       movups  %xmm5,48(%rsi)
+       movups  %xmm6,64(%rsi)
+       leaq    80(%rsi),%rsi
+       movaps  %xmm7,%xmm2
+       subq    $96,%rdx
+       jmp     .Lcbc_dec_tail_collected
+.p2align       4
+.Lcbc_dec_tail_collected:
+       andq    $15,%rdx
+       movups  %xmm9,(%r8)
+       jnz     .Lcbc_dec_tail_partial
+       movups  %xmm2,(%rsi)
+       jmp     .Lcbc_dec_ret
+.p2align       4
+.Lcbc_dec_tail_partial:
+       movaps  %xmm2,64(%rsp)
+       movq    $16,%rcx
+       movq    %rsi,%rdi
+       subq    %rdx,%rcx
+       leaq    64(%rsp),%rsi
+.long  0x9066A4F3      
+
+.Lcbc_dec_ret:
+       movaps  (%rsp),%xmm6
+       movaps  16(%rsp),%xmm7
+       movaps  32(%rsp),%xmm8
+       movaps  48(%rsp),%xmm9
+       leaq    88(%rsp),%rsp
+.Lcbc_ret:
+       movq    8(%rsp),%rdi
+       movq    16(%rsp),%rsi
+       .byte   0xf3,0xc3
+.LSEH_end_aesni_cbc_encrypt:
+.globl aesni_set_decrypt_key
+.def   aesni_set_decrypt_key;  .scl 2; .type 32;       .endef
+.p2align       4
+aesni_set_decrypt_key:
+.byte  0x48,0x83,0xEC,0x08     
+       call    __aesni_set_encrypt_key
+       shll    $4,%edx
+       testl   %eax,%eax
+       jnz     .Ldec_key_ret
+       leaq    16(%r8,%rdx,1),%rcx
+
+       movups  (%r8),%xmm0
+       movups  (%rcx),%xmm1
+       movups  %xmm0,(%rcx)
+       movups  %xmm1,(%r8)
+       leaq    16(%r8),%r8
+       leaq    -16(%rcx),%rcx
+
+.Ldec_key_inverse:
+       movups  (%r8),%xmm0
+       movups  (%rcx),%xmm1
+.byte  102,15,56,219,192
+.byte  102,15,56,219,201
+       leaq    16(%r8),%r8
+       leaq    -16(%rcx),%rcx
+       movups  %xmm0,16(%rcx)
+       movups  %xmm1,-16(%r8)
+       cmpq    %r8,%rcx
+       ja      .Ldec_key_inverse
+
+       movups  (%r8),%xmm0
+.byte  102,15,56,219,192
+       movups  %xmm0,(%rcx)
+.Ldec_key_ret:
+       addq    $8,%rsp
+       .byte   0xf3,0xc3
+.LSEH_end_set_decrypt_key:
+
+.globl aesni_set_encrypt_key
+.def   aesni_set_encrypt_key;  .scl 2; .type 32;       .endef
+.p2align       4
+aesni_set_encrypt_key:
+__aesni_set_encrypt_key:
+.byte  0x48,0x83,0xEC,0x08     
+       movq    $-1,%rax
+       testq   %rcx,%rcx
+       jz      .Lenc_key_ret
+       testq   %r8,%r8
+       jz      .Lenc_key_ret
+
+       movups  (%rcx),%xmm0
+       xorps   %xmm4,%xmm4
+       leaq    16(%r8),%rax
+       cmpl    $256,%edx
+       je      .L14rounds
+       cmpl    $192,%edx
+       je      .L12rounds
+       cmpl    $128,%edx
+       jne     .Lbad_keybits
+
+.L10rounds:
+       movl    $9,%edx
+       movups  %xmm0,(%r8)
+.byte  102,15,58,223,200,1
+       call    .Lkey_expansion_128_cold
+.byte  102,15,58,223,200,2
+       call    .Lkey_expansion_128
+.byte  102,15,58,223,200,4
+       call    .Lkey_expansion_128
+.byte  102,15,58,223,200,8
+       call    .Lkey_expansion_128
+.byte  102,15,58,223,200,16
+       call    .Lkey_expansion_128
+.byte  102,15,58,223,200,32
+       call    .Lkey_expansion_128
+.byte  102,15,58,223,200,64
+       call    .Lkey_expansion_128
+.byte  102,15,58,223,200,128
+       call    .Lkey_expansion_128
+.byte  102,15,58,223,200,27
+       call    .Lkey_expansion_128
+.byte  102,15,58,223,200,54
+       call    .Lkey_expansion_128
+       movups  %xmm0,(%rax)
+       movl    %edx,80(%rax)
+       xorl    %eax,%eax
+       jmp     .Lenc_key_ret
+
+.p2align       4
+.L12rounds:
+       movq    16(%rcx),%xmm2
+       movl    $11,%edx
+       movups  %xmm0,(%r8)
+.byte  102,15,58,223,202,1
+       call    .Lkey_expansion_192a_cold
+.byte  102,15,58,223,202,2
+       call    .Lkey_expansion_192b
+.byte  102,15,58,223,202,4
+       call    .Lkey_expansion_192a
+.byte  102,15,58,223,202,8
+       call    .Lkey_expansion_192b
+.byte  102,15,58,223,202,16
+       call    .Lkey_expansion_192a
+.byte  102,15,58,223,202,32
+       call    .Lkey_expansion_192b
+.byte  102,15,58,223,202,64
+       call    .Lkey_expansion_192a
+.byte  102,15,58,223,202,128
+       call    .Lkey_expansion_192b
+       movups  %xmm0,(%rax)
+       movl    %edx,48(%rax)
+       xorq    %rax,%rax
+       jmp     .Lenc_key_ret
+
+.p2align       4
+.L14rounds:
+       movups  16(%rcx),%xmm2
+       movl    $13,%edx
+       leaq    16(%rax),%rax
+       movups  %xmm0,(%r8)
+       movups  %xmm2,16(%r8)
+.byte  102,15,58,223,202,1
+       call    .Lkey_expansion_256a_cold
+.byte  102,15,58,223,200,1
+       call    .Lkey_expansion_256b
+.byte  102,15,58,223,202,2
+       call    .Lkey_expansion_256a
+.byte  102,15,58,223,200,2
+       call    .Lkey_expansion_256b
+.byte  102,15,58,223,202,4
+       call    .Lkey_expansion_256a
+.byte  102,15,58,223,200,4
+       call    .Lkey_expansion_256b
+.byte  102,15,58,223,202,8
+       call    .Lkey_expansion_256a
+.byte  102,15,58,223,200,8
+       call    .Lkey_expansion_256b
+.byte  102,15,58,223,202,16
+       call    .Lkey_expansion_256a
+.byte  102,15,58,223,200,16
+       call    .Lkey_expansion_256b
+.byte  102,15,58,223,202,32
+       call    .Lkey_expansion_256a
+.byte  102,15,58,223,200,32
+       call    .Lkey_expansion_256b
+.byte  102,15,58,223,202,64
+       call    .Lkey_expansion_256a
+       movups  %xmm0,(%rax)
+       movl    %edx,16(%rax)
+       xorq    %rax,%rax
+       jmp     .Lenc_key_ret
+
+.p2align       4
+.Lbad_keybits:
+       movq    $-2,%rax
+.Lenc_key_ret:
+       addq    $8,%rsp
+       .byte   0xf3,0xc3
+.LSEH_end_set_encrypt_key:
+
+.p2align       4
+.Lkey_expansion_128:
+       movups  %xmm0,(%rax)
+       leaq    16(%rax),%rax
+.Lkey_expansion_128_cold:
+       shufps  $16,%xmm0,%xmm4
+       xorps   %xmm4,%xmm0
+       shufps  $140,%xmm0,%xmm4
+       xorps   %xmm4,%xmm0
+       shufps  $255,%xmm1,%xmm1
+       xorps   %xmm1,%xmm0
+       .byte   0xf3,0xc3
+
+.p2align       4
+.Lkey_expansion_192a:
+       movups  %xmm0,(%rax)
+       leaq    16(%rax),%rax
+.Lkey_expansion_192a_cold:
+       movaps  %xmm2,%xmm5
+.Lkey_expansion_192b_warm:
+       shufps  $16,%xmm0,%xmm4
+       movdqa  %xmm2,%xmm3
+       xorps   %xmm4,%xmm0
+       shufps  $140,%xmm0,%xmm4
+       pslldq  $4,%xmm3
+       xorps   %xmm4,%xmm0
+       pshufd  $85,%xmm1,%xmm1
+       pxor    %xmm3,%xmm2
+       pxor    %xmm1,%xmm0
+       pshufd  $255,%xmm0,%xmm3
+       pxor    %xmm3,%xmm2
+       .byte   0xf3,0xc3
+
+.p2align       4
+.Lkey_expansion_192b:
+       movaps  %xmm0,%xmm3
+       shufps  $68,%xmm0,%xmm5
+       movups  %xmm5,(%rax)
+       shufps  $78,%xmm2,%xmm3
+       movups  %xmm3,16(%rax)
+       leaq    32(%rax),%rax
+       jmp     .Lkey_expansion_192b_warm
+
+.p2align       4
+.Lkey_expansion_256a:
+       movups  %xmm2,(%rax)
+       leaq    16(%rax),%rax
+.Lkey_expansion_256a_cold:
+       shufps  $16,%xmm0,%xmm4
+       xorps   %xmm4,%xmm0
+       shufps  $140,%xmm0,%xmm4
+       xorps   %xmm4,%xmm0
+       shufps  $255,%xmm1,%xmm1
+       xorps   %xmm1,%xmm0
+       .byte   0xf3,0xc3
+
+.p2align       4
+.Lkey_expansion_256b:
+       movups  %xmm0,(%rax)
+       leaq    16(%rax),%rax
+
+       shufps  $16,%xmm2,%xmm4
+       xorps   %xmm4,%xmm2
+       shufps  $140,%xmm2,%xmm4
+       xorps   %xmm4,%xmm2
+       shufps  $170,%xmm1,%xmm1
+       xorps   %xmm1,%xmm2
+       .byte   0xf3,0xc3
+
+
+.p2align       6
+.Lbswap_mask:
+.byte  15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
+.Lincrement32:
+.long  6,6,6,0
+.Lincrement64:
+.long  1,0,0,0
+.Lxts_magic:
+.long  0x87,0,1,0
+
+.byte  65,69,83,32,102,111,114,32,73,110,116,101,108,32,65,69,83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
+.p2align       6
+
+.def   ecb_se_handler; .scl 3; .type 32;       .endef
+.p2align       4
+ecb_se_handler:
+       pushq   %rsi
+       pushq   %rdi
+       pushq   %rbx
+       pushq   %rbp
+       pushq   %r12
+       pushq   %r13
+       pushq   %r14
+       pushq   %r15
+       pushfq
+       subq    $64,%rsp
+
+       movq    152(%r8),%rax
+
+       jmp     .Lcommon_seh_tail
+
+
+.def   ccm64_se_handler;       .scl 3; .type 32;       .endef
+.p2align       4
+ccm64_se_handler:
+       pushq   %rsi
+       pushq   %rdi
+       pushq   %rbx
+       pushq   %rbp
+       pushq   %r12
+       pushq   %r13
+       pushq   %r14
+       pushq   %r15
+       pushfq
+       subq    $64,%rsp
+
+       movq    120(%r8),%rax
+       movq    248(%r8),%rbx
+
+       movq    8(%r9),%rsi
+       movq    56(%r9),%r11
+
+       movl    0(%r11),%r10d
+       leaq    (%rsi,%r10,1),%r10
+       cmpq    %r10,%rbx
+       jb      .Lcommon_seh_tail
+
+       movq    152(%r8),%rax
+
+       movl    4(%r11),%r10d
+       leaq    (%rsi,%r10,1),%r10
+       cmpq    %r10,%rbx
+       jae     .Lcommon_seh_tail
+
+       leaq    0(%rax),%rsi
+       leaq    512(%r8),%rdi
+       movl    $8,%ecx
+.long  0xa548f3fc              
+       leaq    88(%rax),%rax
+
+       jmp     .Lcommon_seh_tail
+
+
+.def   ctr32_se_handler;       .scl 3; .type 32;       .endef
+.p2align       4
+ctr32_se_handler:
+       pushq   %rsi
+       pushq   %rdi
+       pushq   %rbx
+       pushq   %rbp
+       pushq   %r12
+       pushq   %r13
+       pushq   %r14
+       pushq   %r15
+       pushfq
+       subq    $64,%rsp
+
+       movq    120(%r8),%rax
+       movq    248(%r8),%rbx
+
+       leaq    .Lctr32_body(%rip),%r10
+       cmpq    %r10,%rbx
+       jb      .Lcommon_seh_tail
+
+       movq    152(%r8),%rax
+
+       leaq    .Lctr32_ret(%rip),%r10
+       cmpq    %r10,%rbx
+       jae     .Lcommon_seh_tail
+
+       leaq    32(%rax),%rsi
+       leaq    512(%r8),%rdi
+       movl    $20,%ecx
+.long  0xa548f3fc              
+       leaq    200(%rax),%rax
+
+       jmp     .Lcommon_seh_tail
+
+
+.def   xts_se_handler; .scl 3; .type 32;       .endef
+.p2align       4
+xts_se_handler:
+       pushq   %rsi
+       pushq   %rdi
+       pushq   %rbx
+       pushq   %rbp
+       pushq   %r12
+       pushq   %r13
+       pushq   %r14
+       pushq   %r15
+       pushfq
+       subq    $64,%rsp
+
+       movq    120(%r8),%rax
+       movq    248(%r8),%rbx
+
+       movq    8(%r9),%rsi
+       movq    56(%r9),%r11
+
+       movl    0(%r11),%r10d
+       leaq    (%rsi,%r10,1),%r10
+       cmpq    %r10,%rbx
+       jb      .Lcommon_seh_tail
+
+       movq    152(%r8),%rax
+
+       movl    4(%r11),%r10d
+       leaq    (%rsi,%r10,1),%r10
+       cmpq    %r10,%rbx
+       jae     .Lcommon_seh_tail
+
+       leaq    96(%rax),%rsi
+       leaq    512(%r8),%rdi
+       movl    $20,%ecx
+.long  0xa548f3fc              
+       leaq    104+160(%rax),%rax
+
+       jmp     .Lcommon_seh_tail
+
+.def   cbc_se_handler; .scl 3; .type 32;       .endef
+.p2align       4
+cbc_se_handler:
+       pushq   %rsi
+       pushq   %rdi
+       pushq   %rbx
+       pushq   %rbp
+       pushq   %r12
+       pushq   %r13
+       pushq   %r14
+       pushq   %r15
+       pushfq
+       subq    $64,%rsp
+
+       movq    152(%r8),%rax
+       movq    248(%r8),%rbx
+
+       leaq    .Lcbc_decrypt(%rip),%r10
+       cmpq    %r10,%rbx
+       jb      .Lcommon_seh_tail
+
+       leaq    .Lcbc_decrypt_body(%rip),%r10
+       cmpq    %r10,%rbx
+       jb      .Lrestore_cbc_rax
+
+       leaq    .Lcbc_ret(%rip),%r10
+       cmpq    %r10,%rbx
+       jae     .Lcommon_seh_tail
+
+       leaq    0(%rax),%rsi
+       leaq    512(%r8),%rdi
+       movl    $8,%ecx
+.long  0xa548f3fc              
+       leaq    88(%rax),%rax
+       jmp     .Lcommon_seh_tail
+
+.Lrestore_cbc_rax:
+       movq    120(%r8),%rax
+
+.Lcommon_seh_tail:
+       movq    8(%rax),%rdi
+       movq    16(%rax),%rsi
+       movq    %rax,152(%r8)
+       movq    %rsi,168(%r8)
+       movq    %rdi,176(%r8)
+
+       movq    40(%r9),%rdi
+       movq    %r8,%rsi
+       movl    $154,%ecx
+.long  0xa548f3fc              
+
+       movq    %r9,%rsi
+       xorq    %rcx,%rcx
+       movq    8(%rsi),%rdx
+       movq    0(%rsi),%r8
+       movq    16(%rsi),%r9
+       movq    40(%rsi),%r10
+       leaq    56(%rsi),%r11
+       leaq    24(%rsi),%r12
+       movq    %r10,32(%rsp)
+       movq    %r11,40(%rsp)
+       movq    %r12,48(%rsp)
+       movq    %rcx,56(%rsp)
+       call    *__imp_RtlVirtualUnwind(%rip)
+
+       movl    $1,%eax
+       addq    $64,%rsp
+       popfq
+       popq    %r15
+       popq    %r14
+       popq    %r13
+       popq    %r12
+       popq    %rbp
+       popq    %rbx
+       popq    %rdi
+       popq    %rsi
+       .byte   0xf3,0xc3
+
+
+.section       .pdata
+.p2align       2
+.rva   .LSEH_begin_aesni_ecb_encrypt
+.rva   .LSEH_end_aesni_ecb_encrypt
+.rva   .LSEH_info_ecb
+
+.rva   .LSEH_begin_aesni_ccm64_encrypt_blocks
+.rva   .LSEH_end_aesni_ccm64_encrypt_blocks
+.rva   .LSEH_info_ccm64_enc
+
+.rva   .LSEH_begin_aesni_ccm64_decrypt_blocks
+.rva   .LSEH_end_aesni_ccm64_decrypt_blocks
+.rva   .LSEH_info_ccm64_dec
+
+.rva   .LSEH_begin_aesni_ctr32_encrypt_blocks
+.rva   .LSEH_end_aesni_ctr32_encrypt_blocks
+.rva   .LSEH_info_ctr32
+
+.rva   .LSEH_begin_aesni_xts_encrypt
+.rva   .LSEH_end_aesni_xts_encrypt
+.rva   .LSEH_info_xts_enc
+
+.rva   .LSEH_begin_aesni_xts_decrypt
+.rva   .LSEH_end_aesni_xts_decrypt
+.rva   .LSEH_info_xts_dec
+.rva   .LSEH_begin_aesni_cbc_encrypt
+.rva   .LSEH_end_aesni_cbc_encrypt
+.rva   .LSEH_info_cbc
+
+.rva   aesni_set_decrypt_key
+.rva   .LSEH_end_set_decrypt_key
+.rva   .LSEH_info_key
+
+.rva   aesni_set_encrypt_key
+.rva   .LSEH_end_set_encrypt_key
+.rva   .LSEH_info_key
+.section       .xdata
+.p2align       3
+.LSEH_info_ecb:
+.byte  9,0,0,0
+.rva   ecb_se_handler
+.LSEH_info_ccm64_enc:
+.byte  9,0,0,0
+.rva   ccm64_se_handler
+.rva   .Lccm64_enc_body,.Lccm64_enc_ret        
+.LSEH_info_ccm64_dec:
+.byte  9,0,0,0
+.rva   ccm64_se_handler
+.rva   .Lccm64_dec_body,.Lccm64_dec_ret        
+.LSEH_info_ctr32:
+.byte  9,0,0,0
+.rva   ctr32_se_handler
+.LSEH_info_xts_enc:
+.byte  9,0,0,0
+.rva   xts_se_handler
+.rva   .Lxts_enc_body,.Lxts_enc_epilogue       
+.LSEH_info_xts_dec:
+.byte  9,0,0,0
+.rva   xts_se_handler
+.rva   .Lxts_dec_body,.Lxts_dec_epilogue       
+.LSEH_info_cbc:
+.byte  9,0,0,0
+.rva   cbc_se_handler
+.LSEH_info_key:
+.byte  0x01,0x04,0x01,0x00
+.byte  0x04,0x02,0x00,0x00     
diff --git a/lib/accelerated/x86/asm-coff/cpuid-x86-64-coff.s b/lib/accelerated/x86/asm-coff/cpuid-x86-64-coff.s
new file mode 100644 (file)
index 0000000..eb3c839
--- /dev/null
@@ -0,0 +1,56 @@
+#
+# Copyright (C) 2011 Free Software Foundation, Inc.
+#
+# Author: Nikos Mavrogiannopoulos
+#
+# This file is part of GnuTLS.
+#
+# The GnuTLS is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public License
+# as published by the Free Software Foundation; either version 3 of
+# the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+
+       .file "cpuid.asm"
+        
+       .text
+.globl _gnutls_cpuid
+.def   _gnutls_cpuid;  .scl 2; .type 32;       .endef
+.p2align 4
+_gnutls_cpuid:
+       pushq   %rbp
+       movq    %rsp, %rbp
+       pushq   %rbx
+       movl    %edi, -12(%rbp)
+       movq    %rsi, -24(%rbp)
+       movq    %rdx, -32(%rbp)
+       movq    %rcx, -40(%rbp)
+       movq    %r8, -48(%rbp)
+       movl    -12(%rbp), %eax
+       movl    %eax, -60(%rbp)
+       movl    -60(%rbp), %eax
+       cpuid
+       movl    %edx, -56(%rbp)
+       movl    %ecx, %esi
+       movl    %eax, -52(%rbp)
+       movq    -24(%rbp), %rax
+       movl    -52(%rbp), %edx
+       movl    %edx, (%rax)
+       movq    -32(%rbp), %rax
+       movl    %ebx, (%rax)
+       movq    -40(%rbp), %rax
+       movl    %esi, (%rax)
+       movq    -48(%rbp), %rax
+       movl    -56(%rbp), %ecx
+       movl    %ecx, (%rax)
+       popq    %rbx
+       leave
+       ret
diff --git a/lib/accelerated/x86/asm-coff/padlock-x86-64-coff.s b/lib/accelerated/x86/asm-coff/padlock-x86-64-coff.s
new file mode 100644 (file)
index 0000000..4701809
--- /dev/null
@@ -0,0 +1,606 @@
+# Copyright (c) 2011, Andy Polyakov by <appro@openssl.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 
+#     * Redistributions of source code must retain copyright notices,
+#      this list of conditions and the following disclaimer.
+#
+#     * Redistributions in binary form must reproduce the above
+#      copyright notice, this list of conditions and the following
+#      disclaimer in the documentation and/or other materials
+#      provided with the distribution.
+#
+#     * Neither the name of the Andy Polyakov nor the names of its
+#      copyright holder and contributors may be used to endorse or
+#      promote products derived from this software without specific
+#      prior written permission.
+#
+# ALTERNATIVELY, provided that this notice is retained in full, this
+# product may be distributed under the terms of the GNU General Public
+# License (GPL), in which case the provisions of the GPL apply INSTEAD OF
+# those given above.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+.text  
+.globl padlock_capability
+.def   padlock_capability;     .scl 2; .type 32;       .endef
+.p2align       4
+padlock_capability:
+       movq    %rbx,%r8
+       xorl    %eax,%eax
+       cpuid
+       xorl    %eax,%eax
+       cmpl    $1953391939,%ebx
+       jne     .Lnoluck
+       cmpl    $1215460705,%edx
+       jne     .Lnoluck
+       cmpl    $1936487777,%ecx
+       jne     .Lnoluck
+       movl    $3221225472,%eax
+       cpuid
+       movl    %eax,%edx
+       xorl    %eax,%eax
+       cmpl    $3221225473,%edx
+       jb      .Lnoluck
+       movl    $3221225473,%eax
+       cpuid
+       movl    %edx,%eax
+       andl    $4294967279,%eax
+       orl     $16,%eax
+.Lnoluck:
+       movq    %r8,%rbx
+       .byte   0xf3,0xc3
+
+
+.globl padlock_key_bswap
+.def   padlock_key_bswap;      .scl 2; .type 32;       .endef
+.p2align       4
+padlock_key_bswap:
+       movl    240(%rcx),%edx
+.Lbswap_loop:
+       movl    (%rcx),%eax
+       bswapl  %eax
+       movl    %eax,(%rcx)
+       leaq    4(%rcx),%rcx
+       subl    $1,%edx
+       jnz     .Lbswap_loop
+       .byte   0xf3,0xc3
+
+
+.globl padlock_verify_context
+.def   padlock_verify_context; .scl 2; .type 32;       .endef
+.p2align       4
+padlock_verify_context:
+       movq    %rcx,%rdx
+       pushf
+       leaq    .Lpadlock_saved_context(%rip),%rax
+       call    _padlock_verify_ctx
+       leaq    8(%rsp),%rsp
+       .byte   0xf3,0xc3
+
+
+.def   _padlock_verify_ctx;    .scl 3; .type 32;       .endef
+.p2align       4
+_padlock_verify_ctx:
+       movq    8(%rsp),%r8
+       btq     $30,%r8
+       jnc     .Lverified
+       cmpq    (%rax),%rdx
+       je      .Lverified
+       pushf
+       popf
+.Lverified:
+       movq    %rdx,(%rax)
+       .byte   0xf3,0xc3
+
+
+.globl padlock_reload_key
+.def   padlock_reload_key;     .scl 2; .type 32;       .endef
+.p2align       4
+padlock_reload_key:
+       pushf
+       popf
+       .byte   0xf3,0xc3
+
+
+.globl padlock_aes_block
+.def   padlock_aes_block;      .scl 2; .type 32;       .endef
+.p2align       4
+padlock_aes_block:
+       movq    %rdi,8(%rsp)
+       movq    %rsi,16(%rsp)
+       movq    %rsp,%rax
+.LSEH_begin_padlock_aes_block:
+       movq    %rcx,%rdi
+       movq    %rdx,%rsi
+       movq    %r8,%rdx
+
+       movq    %rbx,%r8
+       movq    $1,%rcx
+       leaq    32(%rdx),%rbx
+       leaq    16(%rdx),%rdx
+.byte  0xf3,0x0f,0xa7,0xc8     
+       movq    %r8,%rbx
+       movq    8(%rsp),%rdi
+       movq    16(%rsp),%rsi
+       .byte   0xf3,0xc3
+.LSEH_end_padlock_aes_block:
+
+.globl padlock_xstore
+.def   padlock_xstore; .scl 2; .type 32;       .endef
+.p2align       4
+padlock_xstore:
+       movq    %rdi,8(%rsp)
+       movq    %rsi,16(%rsp)
+       movq    %rsp,%rax
+.LSEH_begin_padlock_xstore:
+       movq    %rcx,%rdi
+       movq    %rdx,%rsi
+
+       movl    %esi,%edx
+.byte  0x0f,0xa7,0xc0          
+       movq    8(%rsp),%rdi
+       movq    16(%rsp),%rsi
+       .byte   0xf3,0xc3
+.LSEH_end_padlock_xstore:
+
+.globl padlock_sha1_oneshot
+.def   padlock_sha1_oneshot;   .scl 2; .type 32;       .endef
+.p2align       4
+padlock_sha1_oneshot:
+       movq    %rdi,8(%rsp)
+       movq    %rsi,16(%rsp)
+       movq    %rsp,%rax
+.LSEH_begin_padlock_sha1_oneshot:
+       movq    %rcx,%rdi
+       movq    %rdx,%rsi
+       movq    %r8,%rdx
+
+       movq    %rdx,%rcx
+       movq    %rdi,%rdx
+       movups  (%rdi),%xmm0
+       subq    $128+8,%rsp
+       movl    16(%rdi),%eax
+       movaps  %xmm0,(%rsp)
+       movq    %rsp,%rdi
+       movl    %eax,16(%rsp)
+       xorq    %rax,%rax
+.byte  0xf3,0x0f,0xa6,0xc8     
+       movaps  (%rsp),%xmm0
+       movl    16(%rsp),%eax
+       addq    $128+8,%rsp
+       movups  %xmm0,(%rdx)
+       movl    %eax,16(%rdx)
+       movq    8(%rsp),%rdi
+       movq    16(%rsp),%rsi
+       .byte   0xf3,0xc3
+.LSEH_end_padlock_sha1_oneshot:
+
+.globl padlock_sha1_blocks
+.def   padlock_sha1_blocks;    .scl 2; .type 32;       .endef
+.p2align       4
+padlock_sha1_blocks:
+       movq    %rdi,8(%rsp)
+       movq    %rsi,16(%rsp)
+       movq    %rsp,%rax
+.LSEH_begin_padlock_sha1_blocks:
+       movq    %rcx,%rdi
+       movq    %rdx,%rsi
+       movq    %r8,%rdx
+
+       movq    %rdx,%rcx
+       movq    %rdi,%rdx
+       movups  (%rdi),%xmm0
+       subq    $128+8,%rsp
+       movl    16(%rdi),%eax
+       movaps  %xmm0,(%rsp)
+       movq    %rsp,%rdi
+       movl    %eax,16(%rsp)
+       movq    $-1,%rax
+.byte  0xf3,0x0f,0xa6,0xc8     
+       movaps  (%rsp),%xmm0
+       movl    16(%rsp),%eax
+       addq    $128+8,%rsp
+       movups  %xmm0,(%rdx)
+       movl    %eax,16(%rdx)
+       movq    8(%rsp),%rdi
+       movq    16(%rsp),%rsi
+       .byte   0xf3,0xc3
+.LSEH_end_padlock_sha1_blocks:
+
+.globl padlock_sha256_oneshot
+.def   padlock_sha256_oneshot; .scl 2; .type 32;       .endef
+.p2align       4
+padlock_sha256_oneshot:
+       movq    %rdi,8(%rsp)
+       movq    %rsi,16(%rsp)
+       movq    %rsp,%rax
+.LSEH_begin_padlock_sha256_oneshot:
+       movq    %rcx,%rdi
+       movq    %rdx,%rsi
+       movq    %r8,%rdx
+
+       movq    %rdx,%rcx
+       movq    %rdi,%rdx
+       movups  (%rdi),%xmm0
+       subq    $128+8,%rsp
+       movups  16(%rdi),%xmm1
+       movaps  %xmm0,(%rsp)
+       movq    %rsp,%rdi
+       movaps  %xmm1,16(%rsp)
+       xorq    %rax,%rax
+.byte  0xf3,0x0f,0xa6,0xd0     
+       movaps  (%rsp),%xmm0
+       movaps  16(%rsp),%xmm1
+       addq    $128+8,%rsp
+       movups  %xmm0,(%rdx)
+       movups  %xmm1,16(%rdx)
+       movq    8(%rsp),%rdi
+       movq    16(%rsp),%rsi
+       .byte   0xf3,0xc3
+.LSEH_end_padlock_sha256_oneshot:
+
+.globl padlock_sha256_blocks
+.def   padlock_sha256_blocks;  .scl 2; .type 32;       .endef
+.p2align       4
+padlock_sha256_blocks:
+       movq    %rdi,8(%rsp)
+       movq    %rsi,16(%rsp)
+       movq    %rsp,%rax
+.LSEH_begin_padlock_sha256_blocks:
+       movq    %rcx,%rdi
+       movq    %rdx,%rsi
+       movq    %r8,%rdx
+
+       movq    %rdx,%rcx
+       movq    %rdi,%rdx
+       movups  (%rdi),%xmm0
+       subq    $128+8,%rsp
+       movups  16(%rdi),%xmm1
+       movaps  %xmm0,(%rsp)
+       movq    %rsp,%rdi
+       movaps  %xmm1,16(%rsp)
+       movq    $-1,%rax
+.byte  0xf3,0x0f,0xa6,0xd0     
+       movaps  (%rsp),%xmm0
+       movaps  16(%rsp),%xmm1
+       addq    $128+8,%rsp
+       movups  %xmm0,(%rdx)
+       movups  %xmm1,16(%rdx)
+       movq    8(%rsp),%rdi
+       movq    16(%rsp),%rsi
+       .byte   0xf3,0xc3
+.LSEH_end_padlock_sha256_blocks:
+
+.globl padlock_sha512_blocks
+.def   padlock_sha512_blocks;  .scl 2; .type 32;       .endef
+.p2align       4
+padlock_sha512_blocks:
+       movq    %rdi,8(%rsp)
+       movq    %rsi,16(%rsp)
+       movq    %rsp,%rax
+.LSEH_begin_padlock_sha512_blocks:
+       movq    %rcx,%rdi
+       movq    %rdx,%rsi
+       movq    %r8,%rdx
+
+       movq    %rdx,%rcx
+       movq    %rdi,%rdx
+       movups  (%rdi),%xmm0
+       subq    $128+8,%rsp
+       movups  16(%rdi),%xmm1
+       movups  32(%rdi),%xmm2
+       movups  48(%rdi),%xmm3
+       movaps  %xmm0,(%rsp)
+       movq    %rsp,%rdi
+       movaps  %xmm1,16(%rsp)
+       movaps  %xmm2,32(%rsp)
+       movaps  %xmm3,48(%rsp)
+.byte  0xf3,0x0f,0xa6,0xe0     
+       movaps  (%rsp),%xmm0
+       movaps  16(%rsp),%xmm1
+       movaps  32(%rsp),%xmm2
+       movaps  48(%rsp),%xmm3
+       addq    $128+8,%rsp
+       movups  %xmm0,(%rdx)
+       movups  %xmm1,16(%rdx)
+       movups  %xmm2,32(%rdx)
+       movups  %xmm3,48(%rdx)
+       movq    8(%rsp),%rdi
+       movq    16(%rsp),%rsi
+       .byte   0xf3,0xc3
+.LSEH_end_padlock_sha512_blocks:
+.globl padlock_ecb_encrypt
+.def   padlock_ecb_encrypt;    .scl 2; .type 32;       .endef
+.p2align       4
+padlock_ecb_encrypt:
+       movq    %rdi,8(%rsp)
+       movq    %rsi,16(%rsp)
+       movq    %rsp,%rax
+.LSEH_begin_padlock_ecb_encrypt:
+       movq    %rcx,%rdi
+       movq    %rdx,%rsi
+       movq    %r8,%rdx
+       movq    %r9,%rcx
+
+       pushq   %rbp
+       pushq   %rbx
+
+       xorl    %eax,%eax
+       testq   $15,%rdx
+       jnz     .Lecb_abort
+       testq   $15,%rcx
+       jnz     .Lecb_abort
+       leaq    .Lpadlock_saved_context(%rip),%rax
+       pushf
+       cld
+       call    _padlock_verify_ctx
+       leaq    16(%rdx),%rdx
+       xorl    %eax,%eax
+       xorl    %ebx,%ebx
+       cmpq    $128,%rcx
+       jbe     .Lecb_short
+       testl   $32,(%rdx)
+       jnz     .Lecb_aligned
+       testq   $15,%rdi
+       setz    %al
+       testq   $15,%rsi
+       setz    %bl
+       testl   %ebx,%eax
+       jnz     .Lecb_aligned
+       negq    %rax
+       movq    $512,%rbx
+       notq    %rax
+       leaq    (%rsp),%rbp
+       cmpq    %rbx,%rcx
+       cmovcq  %rcx,%rbx
+       andq    %rbx,%rax
+       movq    %rcx,%rbx
+       negq    %rax
+       andq    $512-1,%rbx
+       leaq    (%rax,%rbp,1),%rsp
+       jmp     .Lecb_loop
+.p2align       4
+.Lecb_loop:
+       cmpq    %rcx,%rbx
+       cmovaq  %rcx,%rbx
+       movq    %rdi,%r8
+       movq    %rsi,%r9
+       movq    %rcx,%r10
+       movq    %rbx,%rcx
+       movq    %rbx,%r11
+       testq   $15,%rdi
+       cmovnzq %rsp,%rdi
+       testq   $15,%rsi
+       jz      .Lecb_inp_aligned
+       shrq    $3,%rcx
+.byte  0xf3,0x48,0xa5          
+       subq    %rbx,%rdi
+       movq    %rbx,%rcx
+       movq    %rdi,%rsi
+.Lecb_inp_aligned:
+       leaq    -16(%rdx),%rax
+       leaq    16(%rdx),%rbx
+       shrq    $4,%rcx
+.byte  0xf3,0x0f,0xa7,200      
+       movq    %r8,%rdi
+       movq    %r11,%rbx
+       testq   $15,%rdi
+       jz      .Lecb_out_aligned
+       movq    %rbx,%rcx
+       shrq    $3,%rcx
+       leaq    (%rsp),%rsi
+.byte  0xf3,0x48,0xa5          
+       subq    %rbx,%rdi
+.Lecb_out_aligned:
+       movq    %r9,%rsi
+       movq    %r10,%rcx
+       addq    %rbx,%rdi
+       addq    %rbx,%rsi
+       subq    %rbx,%rcx
+       movq    $512,%rbx
+       jnz     .Lecb_loop
+
+       cmpq    %rsp,%rbp
+       je      .Lecb_done
+
+       pxor    %xmm0,%xmm0
+       leaq    (%rsp),%rax
+.Lecb_bzero:
+       movaps  %xmm0,(%rax)
+       leaq    16(%rax),%rax
+       cmpq    %rax,%rbp
+       ja      .Lecb_bzero
+
+.Lecb_done:
+       leaq    (%rbp),%rsp
+       jmp     .Lecb_exit
+.p2align       4
+.Lecb_short:
+       movq    %rsp,%rbp
+       subq    %rcx,%rsp
+       xorq    %rbx,%rbx
+.Lecb_short_copy:
+       movups  (%rsi,%rbx,1),%xmm0
+       leaq    16(%rbx),%rbx
+       cmpq    %rbx,%rcx
+       movaps  %xmm0,-16(%rsp,%rbx,1)
+       ja      .Lecb_short_copy
+       movq    %rsp,%rsi
+       movq    %rcx,%rbx
+       jmp     .Lecb_loop
+.p2align       4
+.Lecb_aligned:
+       leaq    -16(%rdx),%rax
+       leaq    16(%rdx),%rbx
+       shrq    $4,%rcx
+.byte  0xf3,0x0f,0xa7,200      
+.Lecb_exit:
+       movl    $1,%eax
+       leaq    8(%rsp),%rsp
+.Lecb_abort:
+       popq    %rbx
+       popq    %rbp
+       movq    8(%rsp),%rdi
+       movq    16(%rsp),%rsi
+       .byte   0xf3,0xc3
+.LSEH_end_padlock_ecb_encrypt:
+.globl padlock_cbc_encrypt
+.def   padlock_cbc_encrypt;    .scl 2; .type 32;       .endef
+.p2align       4
+padlock_cbc_encrypt:
+       movq    %rdi,8(%rsp)
+       movq    %rsi,16(%rsp)
+       movq    %rsp,%rax
+.LSEH_begin_padlock_cbc_encrypt:
+       movq    %rcx,%rdi
+       movq    %rdx,%rsi
+       movq    %r8,%rdx
+       movq    %r9,%rcx
+
+       pushq   %rbp
+       pushq   %rbx
+
+       xorl    %eax,%eax
+       testq   $15,%rdx
+       jnz     .Lcbc_abort
+       testq   $15,%rcx
+       jnz     .Lcbc_abort
+       leaq    .Lpadlock_saved_context(%rip),%rax
+       pushf
+       cld
+       call    _padlock_verify_ctx
+       leaq    16(%rdx),%rdx
+       xorl    %eax,%eax
+       xorl    %ebx,%ebx
+       cmpq    $64,%rcx
+       jbe     .Lcbc_short
+       testl   $32,(%rdx)
+       jnz     .Lcbc_aligned
+       testq   $15,%rdi
+       setz    %al
+       testq   $15,%rsi
+       setz    %bl
+       testl   %ebx,%eax
+       jnz     .Lcbc_aligned
+       negq    %rax
+       movq    $512,%rbx
+       notq    %rax
+       leaq    (%rsp),%rbp
+       cmpq    %rbx,%rcx
+       cmovcq  %rcx,%rbx
+       andq    %rbx,%rax
+       movq    %rcx,%rbx
+       negq    %rax
+       andq    $512-1,%rbx
+       leaq    (%rax,%rbp,1),%rsp
+       jmp     .Lcbc_loop
+.p2align       4
+.Lcbc_loop:
+       cmpq    %rcx,%rbx
+       cmovaq  %rcx,%rbx
+       movq    %rdi,%r8
+       movq    %rsi,%r9
+       movq    %rcx,%r10
+       movq    %rbx,%rcx
+       movq    %rbx,%r11
+       testq   $15,%rdi
+       cmovnzq %rsp,%rdi
+       testq   $15,%rsi
+       jz      .Lcbc_inp_aligned
+       shrq    $3,%rcx
+.byte  0xf3,0x48,0xa5          
+       subq    %rbx,%rdi
+       movq    %rbx,%rcx
+       movq    %rdi,%rsi
+.Lcbc_inp_aligned:
+       leaq    -16(%rdx),%rax
+       leaq    16(%rdx),%rbx
+       shrq    $4,%rcx
+.byte  0xf3,0x0f,0xa7,208      
+       movdqa  (%rax),%xmm0
+       movdqa  %xmm0,-16(%rdx)
+       movq    %r8,%rdi
+       movq    %r11,%rbx
+       testq   $15,%rdi
+       jz      .Lcbc_out_aligned
+       movq    %rbx,%rcx
+       shrq    $3,%rcx
+       leaq    (%rsp),%rsi
+.byte  0xf3,0x48,0xa5          
+       subq    %rbx,%rdi
+.Lcbc_out_aligned:
+       movq    %r9,%rsi
+       movq    %r10,%rcx
+       addq    %rbx,%rdi
+       addq    %rbx,%rsi
+       subq    %rbx,%rcx
+       movq    $512,%rbx
+       jnz     .Lcbc_loop
+
+       cmpq    %rsp,%rbp
+       je      .Lcbc_done
+
+       pxor    %xmm0,%xmm0
+       leaq    (%rsp),%rax
+.Lcbc_bzero:
+       movaps  %xmm0,(%rax)
+       leaq    16(%rax),%rax
+       cmpq    %rax,%rbp
+       ja      .Lcbc_bzero
+
+.Lcbc_done:
+       leaq    (%rbp),%rsp
+       jmp     .Lcbc_exit
+.p2align       4
+.Lcbc_short:
+       movq    %rsp,%rbp
+       subq    %rcx,%rsp
+       xorq    %rbx,%rbx
+.Lcbc_short_copy:
+       movups  (%rsi,%rbx,1),%xmm0
+       leaq    16(%rbx),%rbx
+       cmpq    %rbx,%rcx
+       movaps  %xmm0,-16(%rsp,%rbx,1)
+       ja      .Lcbc_short_copy
+       movq    %rsp,%rsi
+       movq    %rcx,%rbx
+       jmp     .Lcbc_loop
+.p2align       4
+.Lcbc_aligned:
+       leaq    -16(%rdx),%rax
+       leaq    16(%rdx),%rbx
+       shrq    $4,%rcx
+.byte  0xf3,0x0f,0xa7,208      
+       movdqa  (%rax),%xmm0
+       movdqa  %xmm0,-16(%rdx)
+.Lcbc_exit:
+       movl    $1,%eax
+       leaq    8(%rsp),%rsp
+.Lcbc_abort:
+       popq    %rbx
+       popq    %rbp
+       movq    8(%rsp),%rdi
+       movq    16(%rsp),%rsi
+       .byte   0xf3,0xc3
+.LSEH_end_padlock_cbc_encrypt:
+.byte  86,73,65,32,80,97,100,108,111,99,107,32,120,56,54,95,54,52,32,109,111,100,117,108,101,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
+.p2align       4
+.data  
+.p2align       3
+.Lpadlock_saved_context:
+.quad  0