default rel
%define XMMWORD
%define YMMWORD
%define ZMMWORD
section .text code align=64

EXTERN  OPENSSL_ia32cap_P
global  aesni_encrypt

ALIGN   16
aesni_encrypt:

DB      243,15,30,250
        movups  xmm2,XMMWORD[rcx]
        mov     eax,DWORD[240+r8]
        movups  xmm0,XMMWORD[r8]
        movups  xmm1,XMMWORD[16+r8]
        lea     r8,[32+r8]
        xorps   xmm2,xmm0
$L$oop_enc1_1:
DB      102,15,56,220,209
        dec     eax
        movups  xmm1,XMMWORD[r8]
        lea     r8,[16+r8]
        jnz     NEAR $L$oop_enc1_1
DB      102,15,56,221,209
        pxor    xmm0,xmm0
        pxor    xmm1,xmm1
        movups  XMMWORD[rdx],xmm2
        pxor    xmm2,xmm2
        DB      0F3h,0C3h               ;repret



global  aesni_decrypt

ALIGN   16
aesni_decrypt:

DB      243,15,30,250
        movups  xmm2,XMMWORD[rcx]
        mov     eax,DWORD[240+r8]
        movups  xmm0,XMMWORD[r8]
        movups  xmm1,XMMWORD[16+r8]
        lea     r8,[32+r8]
        xorps   xmm2,xmm0
$L$oop_dec1_2:
DB      102,15,56,222,209
        dec     eax
        movups  xmm1,XMMWORD[r8]
        lea     r8,[16+r8]
        jnz     NEAR $L$oop_dec1_2
DB      102,15,56,223,209
        pxor    xmm0,xmm0
        pxor    xmm1,xmm1
        movups  XMMWORD[rdx],xmm2
        pxor    xmm2,xmm2
        DB      0F3h,0C3h               ;repret



ALIGN   16
_aesni_encrypt2:

        movups  xmm0,XMMWORD[rcx]
        shl     eax,4
        movups  xmm1,XMMWORD[16+rcx]
        xorps   xmm2,xmm0
        xorps   xmm3,xmm0
        movups  xmm0,XMMWORD[32+rcx]
        lea     rcx,[32+rax*1+rcx]
        neg     rax
        add     rax,16

$L$enc_loop2:
DB      102,15,56,220,209
DB      102,15,56,220,217
        movups  xmm1,XMMWORD[rax*1+rcx]
        add     rax,32
DB      102,15,56,220,208
DB      102,15,56,220,216
        movups  xmm0,XMMWORD[((-16))+rax*1+rcx]
        jnz     NEAR $L$enc_loop2

DB      102,15,56,220,209
DB      102,15,56,220,217
DB      102,15,56,221,208
DB      102,15,56,221,216
        DB      0F3h,0C3h               ;repret



ALIGN   16
_aesni_decrypt2:

        movups  xmm0,XMMWORD[rcx]
        shl     eax,4
        movups  xmm1,XMMWORD[16+rcx]
        xorps   xmm2,xmm0
        xorps   xmm3,xmm0
        movups  xmm0,XMMWORD[32+rcx]
        lea     rcx,[32+rax*1+rcx]
        neg     rax
        add     rax,16

$L$dec_loop2:
DB      102,15,56,222,209
DB      102,15,56,222,217
        movups  xmm1,XMMWORD[rax*1+rcx]
        add     rax,32
DB      102,15,56,222,208
DB      102,15,56,222,216
        movups  xmm0,XMMWORD[((-16))+rax*1+rcx]
        jnz     NEAR $L$dec_loop2

DB      102,15,56,222,209
DB      102,15,56,222,217
DB      102,15,56,223,208
DB      102,15,56,223,216
        DB      0F3h,0C3h               ;repret



ALIGN   16
_aesni_encrypt3:

        movups  xmm0,XMMWORD[rcx]
        shl     eax,4
        movups  xmm1,XMMWORD[16+rcx]
        xorps   xmm2,xmm0
        xorps   xmm3,xmm0
        xorps   xmm4,xmm0
        movups  xmm0,XMMWORD[32+rcx]
        lea     rcx,[32+rax*1+rcx]
        neg     rax
        add     rax,16

$L$enc_loop3:
DB      102,15,56,220,209
DB      102,15,56,220,217
DB      102,15,56,220,225
        movups  xmm1,XMMWORD[rax*1+rcx]
        add     rax,32
DB      102,15,56,220,208
DB      102,15,56,220,216
DB      102,15,56,220,224
        movups  xmm0,XMMWORD[((-16))+rax*1+rcx]
        jnz     NEAR $L$enc_loop3

DB      102,15,56,220,209
DB      102,15,56,220,217
DB      102,15,56,220,225
DB      102,15,56,221,208
DB      102,15,56,221,216
DB      102,15,56,221,224
        DB      0F3h,0C3h               ;repret



ALIGN   16
_aesni_decrypt3:

        movups  xmm0,XMMWORD[rcx]
        shl     eax,4
        movups  xmm1,XMMWORD[16+rcx]
        xorps   xmm2,xmm0
        xorps   xmm3,xmm0
        xorps   xmm4,xmm0
        movups  xmm0,XMMWORD[32+rcx]
        lea     rcx,[32+rax*1+rcx]
        neg     rax
        add     rax,16

$L$dec_loop3:
DB      102,15,56,222,209
DB      102,15,56,222,217
DB      102,15,56,222,225
        movups  xmm1,XMMWORD[rax*1+rcx]
        add     rax,32
DB      102,15,56,222,208
DB      102,15,56,222,216
DB      102,15,56,222,224
        movups  xmm0,XMMWORD[((-16))+rax*1+rcx]
        jnz     NEAR $L$dec_loop3

DB      102,15,56,222,209
DB      102,15,56,222,217
DB      102,15,56,222,225
DB      102,15,56,223,208
DB      102,15,56,223,216
DB      102,15,56,223,224
        DB      0F3h,0C3h               ;repret



ALIGN   16
_aesni_encrypt4:

        movups  xmm0,XMMWORD[rcx]
        shl     eax,4
        movups  xmm1,XMMWORD[16+rcx]
        xorps   xmm2,xmm0
        xorps   xmm3,xmm0
        xorps   xmm4,xmm0
        xorps   xmm5,xmm0
        movups  xmm0,XMMWORD[32+rcx]
        lea     rcx,[32+rax*1+rcx]
        neg     rax
DB      0x0f,0x1f,0x00
        add     rax,16

$L$enc_loop4:
DB      102,15,56,220,209
DB      102,15,56,220,217
DB      102,15,56,220,225
DB      102,15,56,220,233
        movups  xmm1,XMMWORD[rax*1+rcx]
        add     rax,32
DB      102,15,56,220,208
DB      102,15,56,220,216
DB      102,15,56,220,224
DB      102,15,56,220,232
        movups  xmm0,XMMWORD[((-16))+rax*1+rcx]
        jnz     NEAR $L$enc_loop4

DB      102,15,56,220,209
DB      102,15,56,220,217
DB      102,15,56,220,225
DB      102,15,56,220,233
DB      102,15,56,221,208
DB      102,15,56,221,216
DB      102,15,56,221,224
DB      102,15,56,221,232
        DB      0F3h,0C3h               ;repret



ALIGN   16
_aesni_decrypt4:

        movups  xmm0,XMMWORD[rcx]
        shl     eax,4
        movups  xmm1,XMMWORD[16+rcx]
        xorps   xmm2,xmm0
        xorps   xmm3,xmm0
        xorps   xmm4,xmm0
        xorps   xmm5,xmm0
        movups  xmm0,XMMWORD[32+rcx]
        lea     rcx,[32+rax*1+rcx]
        neg     rax
DB      0x0f,0x1f,0x00
        add     rax,16

$L$dec_loop4:
DB      102,15,56,222,209
DB      102,15,56,222,217
DB      102,15,56,222,225
DB      102,15,56,222,233
        movups  xmm1,XMMWORD[rax*1+rcx]
        add     rax,32
DB      102,15,56,222,208
DB      102,15,56,222,216
DB      102,15,56,222,224
DB      102,15,56,222,232
        movups  xmm0,XMMWORD[((-16))+rax*1+rcx]
        jnz     NEAR $L$dec_loop4

DB      102,15,56,222,209
DB      102,15,56,222,217
DB      102,15,56,222,225
DB      102,15,56,222,233
DB      102,15,56,223,208
DB      102,15,56,223,216
DB      102,15,56,223,224
DB      102,15,56,223,232
        DB      0F3h,0C3h               ;repret



ALIGN   16
_aesni_encrypt6:

        movups  xmm0,XMMWORD[rcx]
        shl     eax,4
        movups  xmm1,XMMWORD[16+rcx]
        xorps   xmm2,xmm0
        pxor    xmm3,xmm0
        pxor    xmm4,xmm0
DB      102,15,56,220,209
        lea     rcx,[32+rax*1+rcx]
        neg     rax
DB      102,15,56,220,217
        pxor    xmm5,xmm0
        pxor    xmm6,xmm0
DB      102,15,56,220,225
        pxor    xmm7,xmm0
        movups  xmm0,XMMWORD[rax*1+rcx]
        add     rax,16
        jmp     NEAR $L$enc_loop6_enter
ALIGN   16
$L$enc_loop6:
DB      102,15,56,220,209
DB      102,15,56,220,217
DB      102,15,56,220,225
$L$enc_loop6_enter:
DB      102,15,56,220,233
DB      102,15,56,220,241
DB      102,15,56,220,249
        movups  xmm1,XMMWORD[rax*1+rcx]
        add     rax,32
DB      102,15,56,220,208
DB      102,15,56,220,216
DB      102,15,56,220,224
DB      102,15,56,220,232
DB      102,15,56,220,240
DB      102,15,56,220,248
        movups  xmm0,XMMWORD[((-16))+rax*1+rcx]
        jnz     NEAR $L$enc_loop6

DB      102,15,56,220,209
DB      102,15,56,220,217
DB      102,15,56,220,225
DB      102,15,56,220,233
DB      102,15,56,220,241
DB      102,15,56,220,249
DB      102,15,56,221,208
DB      102,15,56,221,216
DB      102,15,56,221,224
DB      102,15,56,221,232
DB      102,15,56,221,240
DB      102,15,56,221,248
        DB      0F3h,0C3h               ;repret



ALIGN   16
_aesni_decrypt6:

        movups  xmm0,XMMWORD[rcx]
        shl     eax,4
        movups  xmm1,XMMWORD[16+rcx]
        xorps   xmm2,xmm0
        pxor    xmm3,xmm0
        pxor    xmm4,xmm0
DB      102,15,56,222,209
        lea     rcx,[32+rax*1+rcx]
        neg     rax
DB      102,15,56,222,217
        pxor    xmm5,xmm0
        pxor    xmm6,xmm0
DB      102,15,56,222,225
        pxor    xmm7,xmm0
        movups  xmm0,XMMWORD[rax*1+rcx]
        add     rax,16
        jmp     NEAR $L$dec_loop6_enter
ALIGN   16
$L$dec_loop6:
DB      102,15,56,222,209
DB      102,15,56,222,217
DB      102,15,56,222,225
$L$dec_loop6_enter:
DB      102,15,56,222,233
DB      102,15,56,222,241
DB      102,15,56,222,249
        movups  xmm1,XMMWORD[rax*1+rcx]
        add     rax,32
DB      102,15,56,222,208
DB      102,15,56,222,216
DB      102,15,56,222,224
DB      102,15,56,222,232
DB      102,15,56,222,240
DB      102,15,56,222,248
        movups  xmm0,XMMWORD[((-16))+rax*1+rcx]
        jnz     NEAR $L$dec_loop6

DB      102,15,56,222,209
DB      102,15,56,222,217
DB      102,15,56,222,225
DB      102,15,56,222,233
DB      102,15,56,222,241
DB      102,15,56,222,249
DB      102,15,56,223,208
DB      102,15,56,223,216
DB      102,15,56,223,224
DB      102,15,56,223,232
DB      102,15,56,223,240
DB      102,15,56,223,248
        DB      0F3h,0C3h               ;repret



ALIGN   16
_aesni_encrypt8:

        movups  xmm0,XMMWORD[rcx]
        shl     eax,4
        movups  xmm1,XMMWORD[16+rcx]
        xorps   xmm2,xmm0
        xorps   xmm3,xmm0
        pxor    xmm4,xmm0
        pxor    xmm5,xmm0
        pxor    xmm6,xmm0
        lea     rcx,[32+rax*1+rcx]
        neg     rax
DB      102,15,56,220,209
        pxor    xmm7,xmm0
        pxor    xmm8,xmm0
DB      102,15,56,220,217
        pxor    xmm9,xmm0
        movups  xmm0,XMMWORD[rax*1+rcx]
        add     rax,16
        jmp     NEAR $L$enc_loop8_inner
ALIGN   16
$L$enc_loop8:
DB      102,15,56,220,209
DB      102,15,56,220,217
$L$enc_loop8_inner:
DB      102,15,56,220,225
DB      102,15,56,220,233
DB      102,15,56,220,241
DB      102,15,56,220,249
DB      102,68,15,56,220,193
DB      102,68,15,56,220,201
$L$enc_loop8_enter:
        movups  xmm1,XMMWORD[rax*1+rcx]
        add     rax,32
DB      102,15,56,220,208
DB      102,15,56,220,216
DB      102,15,56,220,224
DB      102,15,56,220,232
DB      102,15,56,220,240
DB      102,15,56,220,248
DB      102,68,15,56,220,192
DB      102,68,15,56,220,200
        movups  xmm0,XMMWORD[((-16))+rax*1+rcx]
        jnz     NEAR $L$enc_loop8

DB      102,15,56,220,209
DB      102,15,56,220,217
DB      102,15,56,220,225
DB      102,15,56,220,233
DB      102,15,56,220,241
DB      102,15,56,220,249
DB      102,68,15,56,220,193
DB      102,68,15,56,220,201
DB      102,15,56,221,208
DB      102,15,56,221,216
DB      102,15,56,221,224
DB      102,15,56,221,232
DB      102,15,56,221,240
DB      102,15,56,221,248
DB      102,68,15,56,221,192
DB      102,68,15,56,221,200
        DB      0F3h,0C3h               ;repret



ALIGN   16
_aesni_decrypt8:

        movups  xmm0,XMMWORD[rcx]
        shl     eax,4
        movups  xmm1,XMMWORD[16+rcx]
        xorps   xmm2,xmm0
        xorps   xmm3,xmm0
        pxor    xmm4,xmm0
        pxor    xmm5,xmm0
        pxor    xmm6,xmm0
        lea     rcx,[32+rax*1+rcx]
        neg     rax
DB      102,15,56,222,209
        pxor    xmm7,xmm0
        pxor    xmm8,xmm0
DB      102,15,56,222,217
        pxor    xmm9,xmm0
        movups  xmm0,XMMWORD[rax*1+rcx]
        add     rax,16
        jmp     NEAR $L$dec_loop8_inner
ALIGN   16
$L$dec_loop8:
DB      102,15,56,222,209
DB      102,15,56,222,217
$L$dec_loop8_inner:
DB      102,15,56,222,225
DB      102,15,56,222,233
DB      102,15,56,222,241
DB      102,15,56,222,249
DB      102,68,15,56,222,193
DB      102,68,15,56,222,201
$L$dec_loop8_enter:
        movups  xmm1,XMMWORD[rax*1+rcx]
        add     rax,32
DB      102,15,56,222,208
DB      102,15,56,222,216
DB      102,15,56,222,224
DB      102,15,56,222,232
DB      102,15,56,222,240
DB      102,15,56,222,248
DB      102,68,15,56,222,192
DB      102,68,15,56,222,200
        movups  xmm0,XMMWORD[((-16))+rax*1+rcx]
        jnz     NEAR $L$dec_loop8

DB      102,15,56,222,209
DB      102,15,56,222,217
DB      102,15,56,222,225
DB      102,15,56,222,233
DB      102,15,56,222,241
DB      102,15,56,222,249
DB      102,68,15,56,222,193
DB      102,68,15,56,222,201
DB      102,15,56,223,208
DB      102,15,56,223,216
DB      102,15,56,223,224
DB      102,15,56,223,232
DB      102,15,56,223,240
DB      102,15,56,223,248
DB      102,68,15,56,223,192
DB      102,68,15,56,223,200
        DB      0F3h,0C3h               ;repret


global  aesni_ecb_encrypt

ALIGN   16
aesni_ecb_encrypt:
        mov     QWORD[8+rsp],rdi        ;WIN64 prologue
        mov     QWORD[16+rsp],rsi
        mov     rax,rsp
$L$SEH_begin_aesni_ecb_encrypt:
        mov     rdi,rcx
        mov     rsi,rdx
        mov     rdx,r8
        mov     rcx,r9
        mov     r8,QWORD[40+rsp]



DB      243,15,30,250
        lea     rsp,[((-88))+rsp]
        movaps  XMMWORD[rsp],xmm6
        movaps  XMMWORD[16+rsp],xmm7
        movaps  XMMWORD[32+rsp],xmm8
        movaps  XMMWORD[48+rsp],xmm9
$L$ecb_enc_body:
        and     rdx,-16
        jz      NEAR $L$ecb_ret

        mov     eax,DWORD[240+rcx]
        movups  xmm0,XMMWORD[rcx]
        mov     r11,rcx
        mov     r10d,eax
        test    r8d,r8d
        jz      NEAR $L$ecb_decrypt

        cmp     rdx,0x80
        jb      NEAR $L$ecb_enc_tail

        movdqu  xmm2,XMMWORD[rdi]
        movdqu  xmm3,XMMWORD[16+rdi]
        movdqu  xmm4,XMMWORD[32+rdi]
        movdqu  xmm5,XMMWORD[48+rdi]
        movdqu  xmm6,XMMWORD[64+rdi]
        movdqu  xmm7,XMMWORD[80+rdi]
        movdqu  xmm8,XMMWORD[96+rdi]
        movdqu  xmm9,XMMWORD[112+rdi]
        lea     rdi,[128+rdi]
        sub     rdx,0x80
        jmp     NEAR $L$ecb_enc_loop8_enter
ALIGN   16
$L$ecb_enc_loop8:
        movups  XMMWORD[rsi],xmm2
        mov     rcx,r11
        movdqu  xmm2,XMMWORD[rdi]
        mov     eax,r10d
        movups  XMMWORD[16+rsi],xmm3
        movdqu  xmm3,XMMWORD[16+rdi]
        movups  XMMWORD[32+rsi],xmm4
        movdqu  xmm4,XMMWORD[32+rdi]
        movups  XMMWORD[48+rsi],xmm5
        movdqu  xmm5,XMMWORD[48+rdi]
        movups  XMMWORD[64+rsi],xmm6
        movdqu  xmm6,XMMWORD[64+rdi]
        movups  XMMWORD[80+rsi],xmm7
        movdqu  xmm7,XMMWORD[80+rdi]
        movups  XMMWORD[96+rsi],xmm8
        movdqu  xmm8,XMMWORD[96+rdi]
        movups  XMMWORD[112+rsi],xmm9
        lea     rsi,[128+rsi]
        movdqu  xmm9,XMMWORD[112+rdi]
        lea     rdi,[128+rdi]
$L$ecb_enc_loop8_enter:

        call    _aesni_encrypt8

        sub     rdx,0x80
        jnc     NEAR $L$ecb_enc_loop8

        movups  XMMWORD[rsi],xmm2
        mov     rcx,r11
        movups  XMMWORD[16+rsi],xmm3
        mov     eax,r10d
        movups  XMMWORD[32+rsi],xmm4
        movups  XMMWORD[48+rsi],xmm5
        movups  XMMWORD[64+rsi],xmm6
        movups  XMMWORD[80+rsi],xmm7
        movups  XMMWORD[96+rsi],xmm8
        movups  XMMWORD[112+rsi],xmm9
        lea     rsi,[128+rsi]
        add     rdx,0x80
        jz      NEAR $L$ecb_ret

$L$ecb_enc_tail:
        movups  xmm2,XMMWORD[rdi]
        cmp     rdx,0x20
        jb      NEAR $L$ecb_enc_one
        movups  xmm3,XMMWORD[16+rdi]
        je      NEAR $L$ecb_enc_two
        movups  xmm4,XMMWORD[32+rdi]
        cmp     rdx,0x40
        jb      NEAR $L$ecb_enc_three
        movups  xmm5,XMMWORD[48+rdi]
        je      NEAR $L$ecb_enc_four
        movups  xmm6,XMMWORD[64+rdi]
        cmp     rdx,0x60
        jb      NEAR $L$ecb_enc_five
        movups  xmm7,XMMWORD[80+rdi]
        je      NEAR $L$ecb_enc_six
        movdqu  xmm8,XMMWORD[96+rdi]
        xorps   xmm9,xmm9
        call    _aesni_encrypt8
        movups  XMMWORD[rsi],xmm2
        movups  XMMWORD[16+rsi],xmm3
        movups  XMMWORD[32+rsi],xmm4
        movups  XMMWORD[48+rsi],xmm5
        movups  XMMWORD[64+rsi],xmm6
        movups  XMMWORD[80+rsi],xmm7
        movups  XMMWORD[96+rsi],xmm8
        jmp     NEAR $L$ecb_ret
ALIGN   16
$L$ecb_enc_one:
        movups  xmm0,XMMWORD[rcx]
        movups  xmm1,XMMWORD[16+rcx]
        lea     rcx,[32+rcx]
        xorps   xmm2,xmm0
$L$oop_enc1_3:
DB      102,15,56,220,209
        dec     eax
        movups  xmm1,XMMWORD[rcx]
        lea     rcx,[16+rcx]
        jnz     NEAR $L$oop_enc1_3
DB      102,15,56,221,209
        movups  XMMWORD[rsi],xmm2
        jmp     NEAR $L$ecb_ret
ALIGN   16
$L$ecb_enc_two:
        call    _aesni_encrypt2
        movups  XMMWORD[rsi],xmm2
        movups  XMMWORD[16+rsi],xmm3
        jmp     NEAR $L$ecb_ret
ALIGN   16
$L$ecb_enc_three:
        call    _aesni_encrypt3
        movups  XMMWORD[rsi],xmm2
        movups  XMMWORD[16+rsi],xmm3
        movups  XMMWORD[32+rsi],xmm4
        jmp     NEAR $L$ecb_ret
ALIGN   16
$L$ecb_enc_four:
        call    _aesni_encrypt4
        movups  XMMWORD[rsi],xmm2
        movups  XMMWORD[16+rsi],xmm3
        movups  XMMWORD[32+rsi],xmm4
        movups  XMMWORD[48+rsi],xmm5
        jmp     NEAR $L$ecb_ret
ALIGN   16
$L$ecb_enc_five:
        xorps   xmm7,xmm7
        call    _aesni_encrypt6
        movups  XMMWORD[rsi],xmm2
        movups  XMMWORD[16+rsi],xmm3
        movups  XMMWORD[32+rsi],xmm4
        movups  XMMWORD[48+rsi],xmm5
        movups  XMMWORD[64+rsi],xmm6
        jmp     NEAR $L$ecb_ret
ALIGN   16
$L$ecb_enc_six:
        call    _aesni_encrypt6
        movups  XMMWORD[rsi],xmm2
        movups  XMMWORD[16+rsi],xmm3
        movups  XMMWORD[32+rsi],xmm4
        movups  XMMWORD[48+rsi],xmm5
        movups  XMMWORD[64+rsi],xmm6
        movups  XMMWORD[80+rsi],xmm7
        jmp     NEAR $L$ecb_ret

ALIGN   16
$L$ecb_decrypt:
        cmp     rdx,0x80
        jb      NEAR $L$ecb_dec_tail

        movdqu  xmm2,XMMWORD[rdi]
        movdqu  xmm3,XMMWORD[16+rdi]
        movdqu  xmm4,XMMWORD[32+rdi]
        movdqu  xmm5,XMMWORD[48+rdi]
        movdqu  xmm6,XMMWORD[64+rdi]
        movdqu  xmm7,XMMWORD[80+rdi]
        movdqu  xmm8,XMMWORD[96+rdi]
        movdqu  xmm9,XMMWORD[112+rdi]
        lea     rdi,[128+rdi]
        sub     rdx,0x80
        jmp     NEAR $L$ecb_dec_loop8_enter
ALIGN   16
$L$ecb_dec_loop8:
        movups  XMMWORD[rsi],xmm2
        mov     rcx,r11
        movdqu  xmm2,XMMWORD[rdi]
        mov     eax,r10d
        movups  XMMWORD[16+rsi],xmm3
        movdqu  xmm3,XMMWORD[16+rdi]
        movups  XMMWORD[32+rsi],xmm4
        movdqu  xmm4,XMMWORD[32+rdi]
        movups  XMMWORD[48+rsi],xmm5
        movdqu  xmm5,XMMWORD[48+rdi]
        movups  XMMWORD[64+rsi],xmm6
        movdqu  xmm6,XMMWORD[64+rdi]
        movups  XMMWORD[80+rsi],xmm7
        movdqu  xmm7,XMMWORD[80+rdi]
        movups  XMMWORD[96+rsi],xmm8
        movdqu  xmm8,XMMWORD[96+rdi]
        movups  XMMWORD[112+rsi],xmm9
        lea     rsi,[128+rsi]
        movdqu  xmm9,XMMWORD[112+rdi]
        lea     rdi,[128+rdi]
$L$ecb_dec_loop8_enter:

        call    _aesni_decrypt8

        movups  xmm0,XMMWORD[r11]
        sub     rdx,0x80
        jnc     NEAR $L$ecb_dec_loop8

        movups  XMMWORD[rsi],xmm2
        pxor    xmm2,xmm2
        mov     rcx,r11
        movups  XMMWORD[16+rsi],xmm3
        pxor    xmm3,xmm3
        mov     eax,r10d
        movups  XMMWORD[32+rsi],xmm4
        pxor    xmm4,xmm4
        movups  XMMWORD[48+rsi],xmm5
        pxor    xmm5,xmm5
        movups  XMMWORD[64+rsi],xmm6
        pxor    xmm6,xmm6
        movups  XMMWORD[80+rsi],xmm7
        pxor    xmm7,xmm7
        movups  XMMWORD[96+rsi],xmm8
        pxor    xmm8,xmm8
        movups  XMMWORD[112+rsi],xmm9
        pxor    xmm9,xmm9
        lea     rsi,[128+rsi]
        add     rdx,0x80
        jz      NEAR $L$ecb_ret

$L$ecb_dec_tail:
        movups  xmm2,XMMWORD[rdi]
        cmp     rdx,0x20
        jb      NEAR $L$ecb_dec_one
        movups  xmm3,XMMWORD[16+rdi]
        je      NEAR $L$ecb_dec_two
        movups  xmm4,XMMWORD[32+rdi]
        cmp     rdx,0x40
        jb      NEAR $L$ecb_dec_three
        movups  xmm5,XMMWORD[48+rdi]
        je      NEAR $L$ecb_dec_four
        movups  xmm6,XMMWORD[64+rdi]
        cmp     rdx,0x60
        jb      NEAR $L$ecb_dec_five
        movups  xmm7,XMMWORD[80+rdi]
        je      NEAR $L$ecb_dec_six
        movups  xmm8,XMMWORD[96+rdi]
        movups  xmm0,XMMWORD[rcx]
        xorps   xmm9,xmm9
        call    _aesni_decrypt8
        movups  XMMWORD[rsi],xmm2
        pxor    xmm2,xmm2
        movups  XMMWORD[16+rsi],xmm3
        pxor    xmm3,xmm3
        movups  XMMWORD[32+rsi],xmm4
        pxor    xmm4,xmm4
        movups  XMMWORD[48+rsi],xmm5
        pxor    xmm5,xmm5
        movups  XMMWORD[64+rsi],xmm6
        pxor    xmm6,xmm6
        movups  XMMWORD[80+rsi],xmm7
        pxor    xmm7,xmm7
        movups  XMMWORD[96+rsi],xmm8
        pxor    xmm8,xmm8
        pxor    xmm9,xmm9
        jmp     NEAR $L$ecb_ret
ALIGN   16
$L$ecb_dec_one:
        movups  xmm0,XMMWORD[rcx]
        movups  xmm1,XMMWORD[16+rcx]
        lea     rcx,[32+rcx]
        xorps   xmm2,xmm0
$L$oop_dec1_4:
DB      102,15,56,222,209
        dec     eax
        movups  xmm1,XMMWORD[rcx]
        lea     rcx,[16+rcx]
        jnz     NEAR $L$oop_dec1_4
DB      102,15,56,223,209
        movups  XMMWORD[rsi],xmm2
        pxor    xmm2,xmm2
        jmp     NEAR $L$ecb_ret
ALIGN   16
$L$ecb_dec_two:
        call    _aesni_decrypt2
        movups  XMMWORD[rsi],xmm2
        pxor    xmm2,xmm2
        movups  XMMWORD[16+rsi],xmm3
        pxor    xmm3,xmm3
        jmp     NEAR $L$ecb_ret
ALIGN   16
$L$ecb_dec_three:
        call    _aesni_decrypt3
        movups  XMMWORD[rsi],xmm2
        pxor    xmm2,xmm2
        movups  XMMWORD[16+rsi],xmm3
        pxor    xmm3,xmm3
        movups  XMMWORD[32+rsi],xmm4
        pxor    xmm4,xmm4
        jmp     NEAR $L$ecb_ret
ALIGN   16
$L$ecb_dec_four:
        call    _aesni_decrypt4
        movups  XMMWORD[rsi],xmm2
        pxor    xmm2,xmm2
        movups  XMMWORD[16+rsi],xmm3
        pxor    xmm3,xmm3
        movups  XMMWORD[32+rsi],xmm4
        pxor    xmm4,xmm4
        movups  XMMWORD[48+rsi],xmm5
        pxor    xmm5,xmm5
        jmp     NEAR $L$ecb_ret
ALIGN   16
$L$ecb_dec_five:
        xorps   xmm7,xmm7
        call    _aesni_decrypt6
        movups  XMMWORD[rsi],xmm2
        pxor    xmm2,xmm2
        movups  XMMWORD[16+rsi],xmm3
        pxor    xmm3,xmm3
        movups  XMMWORD[32+rsi],xmm4
        pxor    xmm4,xmm4
        movups  XMMWORD[48+rsi],xmm5
        pxor    xmm5,xmm5
        movups  XMMWORD[64+rsi],xmm6
        pxor    xmm6,xmm6
        pxor    xmm7,xmm7
        jmp     NEAR $L$ecb_ret
ALIGN   16
$L$ecb_dec_six:
        call    _aesni_decrypt6
        movups  XMMWORD[rsi],xmm2
        pxor    xmm2,xmm2
        movups  XMMWORD[16+rsi],xmm3
        pxor    xmm3,xmm3
        movups  XMMWORD[32+rsi],xmm4
        pxor    xmm4,xmm4
        movups  XMMWORD[48+rsi],xmm5
        pxor    xmm5,xmm5
        movups  XMMWORD[64+rsi],xmm6
        pxor    xmm6,xmm6
        movups  XMMWORD[80+rsi],xmm7
        pxor    xmm7,xmm7

$L$ecb_ret:
        xorps   xmm0,xmm0
        pxor    xmm1,xmm1
        movaps  xmm6,XMMWORD[rsp]
        movaps  XMMWORD[rsp],xmm0
        movaps  xmm7,XMMWORD[16+rsp]
        movaps  XMMWORD[16+rsp],xmm0
        movaps  xmm8,XMMWORD[32+rsp]
        movaps  XMMWORD[32+rsp],xmm0
        movaps  xmm9,XMMWORD[48+rsp]
        movaps  XMMWORD[48+rsp],xmm0
        lea     rsp,[88+rsp]
$L$ecb_enc_ret:
        mov     rdi,QWORD[8+rsp]        ;WIN64 epilogue
        mov     rsi,QWORD[16+rsp]
        DB      0F3h,0C3h               ;repret

$L$SEH_end_aesni_ecb_encrypt:
global  aesni_ccm64_encrypt_blocks

ALIGN   16
aesni_ccm64_encrypt_blocks:
        mov     QWORD[8+rsp],rdi        ;WIN64 prologue
        mov     QWORD[16+rsp],rsi
        mov     rax,rsp
$L$SEH_begin_aesni_ccm64_encrypt_blocks:
        mov     rdi,rcx
        mov     rsi,rdx
        mov     rdx,r8
        mov     rcx,r9
        mov     r8,QWORD[40+rsp]
        mov     r9,QWORD[48+rsp]



DB      243,15,30,250
        lea     rsp,[((-88))+rsp]
        movaps  XMMWORD[rsp],xmm6
        movaps  XMMWORD[16+rsp],xmm7
        movaps  XMMWORD[32+rsp],xmm8
        movaps  XMMWORD[48+rsp],xmm9
$L$ccm64_enc_body:
        mov     eax,DWORD[240+rcx]
        movdqu  xmm6,XMMWORD[r8]
        movdqa  xmm9,XMMWORD[$L$increment64]
        movdqa  xmm7,XMMWORD[$L$bswap_mask]

        shl     eax,4
        mov     r10d,16
        lea     r11,[rcx]
        movdqu  xmm3,XMMWORD[r9]
        movdqa  xmm2,xmm6
        lea     rcx,[32+rax*1+rcx]
DB      102,15,56,0,247
        sub     r10,rax
        jmp     NEAR $L$ccm64_enc_outer
ALIGN   16
$L$ccm64_enc_outer:
        movups  xmm0,XMMWORD[r11]
        mov     rax,r10
        movups  xmm8,XMMWORD[rdi]

        xorps   xmm2,xmm0
        movups  xmm1,XMMWORD[16+r11]
        xorps   xmm0,xmm8
        xorps   xmm3,xmm0
        movups  xmm0,XMMWORD[32+r11]

$L$ccm64_enc2_loop:
DB      102,15,56,220,209
DB      102,15,56,220,217
        movups  xmm1,XMMWORD[rax*1+rcx]
        add     rax,32
DB      102,15,56,220,208
DB      102,15,56,220,216
        movups  xmm0,XMMWORD[((-16))+rax*1+rcx]
        jnz     NEAR $L$ccm64_enc2_loop
DB      102,15,56,220,209
DB      102,15,56,220,217
        paddq   xmm6,xmm9
        dec     rdx
DB      102,15,56,221,208
DB      102,15,56,221,216

        lea     rdi,[16+rdi]
        xorps   xmm8,xmm2
        movdqa  xmm2,xmm6
        movups  XMMWORD[rsi],xmm8
DB      102,15,56,0,215
        lea     rsi,[16+rsi]
        jnz     NEAR $L$ccm64_enc_outer

        pxor    xmm0,xmm0
        pxor    xmm1,xmm1
        pxor    xmm2,xmm2
        movups  XMMWORD[r9],xmm3
        pxor    xmm3,xmm3
        pxor    xmm8,xmm8
        pxor    xmm6,xmm6
        movaps  xmm6,XMMWORD[rsp]
        movaps  XMMWORD[rsp],xmm0
        movaps  xmm7,XMMWORD[16+rsp]
        movaps  XMMWORD[16+rsp],xmm0
        movaps  xmm8,XMMWORD[32+rsp]
        movaps  XMMWORD[32+rsp],xmm0
        movaps  xmm9,XMMWORD[48+rsp]
        movaps  XMMWORD[48+rsp],xmm0
        lea     rsp,[88+rsp]
$L$ccm64_enc_ret:
        mov     rdi,QWORD[8+rsp]        ;WIN64 epilogue
        mov     rsi,QWORD[16+rsp]
        DB      0F3h,0C3h               ;repret

$L$SEH_end_aesni_ccm64_encrypt_blocks:
global  aesni_ccm64_decrypt_blocks

ALIGN   16
aesni_ccm64_decrypt_blocks:
        mov     QWORD[8+rsp],rdi        ;WIN64 prologue
        mov     QWORD[16+rsp],rsi
        mov     rax,rsp
$L$SEH_begin_aesni_ccm64_decrypt_blocks:
        mov     rdi,rcx
        mov     rsi,rdx
        mov     rdx,r8
        mov     rcx,r9
        mov     r8,QWORD[40+rsp]
        mov     r9,QWORD[48+rsp]



DB      243,15,30,250
        lea     rsp,[((-88))+rsp]
        movaps  XMMWORD[rsp],xmm6
        movaps  XMMWORD[16+rsp],xmm7
        movaps  XMMWORD[32+rsp],xmm8
        movaps  XMMWORD[48+rsp],xmm9
$L$ccm64_dec_body:
        mov     eax,DWORD[240+rcx]
        movups  xmm6,XMMWORD[r8]
        movdqu  xmm3,XMMWORD[r9]
        movdqa  xmm9,XMMWORD[$L$increment64]
        movdqa  xmm7,XMMWORD[$L$bswap_mask]

        movaps  xmm2,xmm6
        mov     r10d,eax
        mov     r11,rcx
DB      102,15,56,0,247
        movups  xmm0,XMMWORD[rcx]
        movups  xmm1,XMMWORD[16+rcx]
        lea     rcx,[32+rcx]
        xorps   xmm2,xmm0
$L$oop_enc1_5:
DB      102,15,56,220,209
        dec     eax
        movups  xmm1,XMMWORD[rcx]
        lea     rcx,[16+rcx]
        jnz     NEAR $L$oop_enc1_5
DB      102,15,56,221,209
        shl     r10d,4
        mov     eax,16
        movups  xmm8,XMMWORD[rdi]
        paddq   xmm6,xmm9
        lea     rdi,[16+rdi]
        sub     rax,r10
        lea     rcx,[32+r10*1+r11]
        mov     r10,rax
        jmp     NEAR $L$ccm64_dec_outer
ALIGN   16
$L$ccm64_dec_outer:
        xorps   xmm8,xmm2
        movdqa  xmm2,xmm6
        movups  XMMWORD[rsi],xmm8
        lea     rsi,[16+rsi]
DB      102,15,56,0,215

        sub     rdx,1
        jz      NEAR $L$ccm64_dec_break

        movups  xmm0,XMMWORD[r11]
        mov     rax,r10
        movups  xmm1,XMMWORD[16+r11]
        xorps   xmm8,xmm0
        xorps   xmm2,xmm0
        xorps   xmm3,xmm8
        movups  xmm0,XMMWORD[32+r11]
        jmp     NEAR $L$ccm64_dec2_loop
ALIGN   16
$L$ccm64_dec2_loop:
DB      102,15,56,220,209
DB      102,15,56,220,217
        movups  xmm1,XMMWORD[rax*1+rcx]
        add     rax,32
DB      102,15,56,220,208
DB      102,15,56,220,216
        movups  xmm0,XMMWORD[((-16))+rax*1+rcx]
        jnz     NEAR $L$ccm64_dec2_loop
        movups  xmm8,XMMWORD[rdi]
        paddq   xmm6,xmm9
DB      102,15,56,220,209
DB      102,15,56,220,217
DB      102,15,56,221,208
DB      102,15,56,221,216
        lea     rdi,[16+rdi]
        jmp     NEAR $L$ccm64_dec_outer

ALIGN   16
$L$ccm64_dec_break:

        mov     eax,DWORD[240+r11]
        movups  xmm0,XMMWORD[r11]
        movups  xmm1,XMMWORD[16+r11]
        xorps   xmm8,xmm0
        lea     r11,[32+r11]
        xorps   xmm3,xmm8
$L$oop_enc1_6:
DB      102,15,56,220,217
        dec     eax
        movups  xmm1,XMMWORD[r11]
        lea     r11,[16+r11]
        jnz     NEAR $L$oop_enc1_6
DB      102,15,56,221,217
        pxor    xmm0,xmm0
        pxor    xmm1,xmm1
        pxor    xmm2,xmm2
        movups  XMMWORD[r9],xmm3
        pxor    xmm3,xmm3
        pxor    xmm8,xmm8
        pxor    xmm6,xmm6
        movaps  xmm6,XMMWORD[rsp]
        movaps  XMMWORD[rsp],xmm0
        movaps  xmm7,XMMWORD[16+rsp]
        movaps  XMMWORD[16+rsp],xmm0
        movaps  xmm8,XMMWORD[32+rsp]
        movaps  XMMWORD[32+rsp],xmm0
        movaps  xmm9,XMMWORD[48+rsp]
        movaps  XMMWORD[48+rsp],xmm0
        lea     rsp,[88+rsp]
$L$ccm64_dec_ret:
        mov     rdi,QWORD[8+rsp]        ;WIN64 epilogue
        mov     rsi,QWORD[16+rsp]
        DB      0F3h,0C3h               ;repret

$L$SEH_end_aesni_ccm64_decrypt_blocks:
global  aesni_ctr32_encrypt_blocks

ALIGN   16
aesni_ctr32_encrypt_blocks:
        mov     QWORD[8+rsp],rdi        ;WIN64 prologue
        mov     QWORD[16+rsp],rsi
        mov     rax,rsp
$L$SEH_begin_aesni_ctr32_encrypt_blocks:
        mov     rdi,rcx
        mov     rsi,rdx
        mov     rdx,r8
        mov     rcx,r9
        mov     r8,QWORD[40+rsp]



DB      243,15,30,250
        cmp     rdx,1
        jne     NEAR $L$ctr32_bulk



        movups  xmm2,XMMWORD[r8]
        movups  xmm3,XMMWORD[rdi]
        mov     edx,DWORD[240+rcx]
        movups  xmm0,XMMWORD[rcx]
        movups  xmm1,XMMWORD[16+rcx]
        lea     rcx,[32+rcx]
        xorps   xmm2,xmm0
$L$oop_enc1_7:
DB      102,15,56,220,209
        dec     edx
        movups  xmm1,XMMWORD[rcx]
        lea     rcx,[16+rcx]
        jnz     NEAR $L$oop_enc1_7
DB      102,15,56,221,209
        pxor    xmm0,xmm0
        pxor    xmm1,xmm1
        xorps   xmm2,xmm3
        pxor    xmm3,xmm3
        movups  XMMWORD[rsi],xmm2
        xorps   xmm2,xmm2
        jmp     NEAR $L$ctr32_epilogue

ALIGN   16
$L$ctr32_bulk:
        lea     r11,[rsp]

        push    rbp

        sub     rsp,288
        and     rsp,-16
        movaps  XMMWORD[(-168)+r11],xmm6
        movaps  XMMWORD[(-152)+r11],xmm7
        movaps  XMMWORD[(-136)+r11],xmm8
        movaps  XMMWORD[(-120)+r11],xmm9
        movaps  XMMWORD[(-104)+r11],xmm10
        movaps  XMMWORD[(-88)+r11],xmm11
        movaps  XMMWORD[(-72)+r11],xmm12
        movaps  XMMWORD[(-56)+r11],xmm13
        movaps  XMMWORD[(-40)+r11],xmm14
        movaps  XMMWORD[(-24)+r11],xmm15
$L$ctr32_body:




        movdqu  xmm2,XMMWORD[r8]
        movdqu  xmm0,XMMWORD[rcx]
        mov     r8d,DWORD[12+r8]
        pxor    xmm2,xmm0
        mov     ebp,DWORD[12+rcx]
        movdqa  XMMWORD[rsp],xmm2
        bswap   r8d
        movdqa  xmm3,xmm2
        movdqa  xmm4,xmm2
        movdqa  xmm5,xmm2
        movdqa  XMMWORD[64+rsp],xmm2
        movdqa  XMMWORD[80+rsp],xmm2
        movdqa  XMMWORD[96+rsp],xmm2
        mov     r10,rdx
        movdqa  XMMWORD[112+rsp],xmm2

        lea     rax,[1+r8]
        lea     rdx,[2+r8]
        bswap   eax
        bswap   edx
        xor     eax,ebp
        xor     edx,ebp
DB      102,15,58,34,216,3
        lea     rax,[3+r8]
        movdqa  XMMWORD[16+rsp],xmm3
DB      102,15,58,34,226,3
        bswap   eax
        mov     rdx,r10
        lea     r10,[4+r8]
        movdqa  XMMWORD[32+rsp],xmm4
        xor     eax,ebp
        bswap   r10d
DB      102,15,58,34,232,3
        xor     r10d,ebp
        movdqa  XMMWORD[48+rsp],xmm5
        lea     r9,[5+r8]
        mov     DWORD[((64+12))+rsp],r10d
        bswap   r9d
        lea     r10,[6+r8]
        mov     eax,DWORD[240+rcx]
        xor     r9d,ebp
        bswap   r10d
        mov     DWORD[((80+12))+rsp],r9d
        xor     r10d,ebp
        lea     r9,[7+r8]
        mov     DWORD[((96+12))+rsp],r10d
        bswap   r9d
        mov     r10d,DWORD[((OPENSSL_ia32cap_P+4))]
        xor     r9d,ebp
        and     r10d,71303168
        mov     DWORD[((112+12))+rsp],r9d

        movups  xmm1,XMMWORD[16+rcx]

        movdqa  xmm6,XMMWORD[64+rsp]
        movdqa  xmm7,XMMWORD[80+rsp]

        cmp     rdx,8
        jb      NEAR $L$ctr32_tail

        sub     rdx,6
        cmp     r10d,4194304
        je      NEAR $L$ctr32_6x

        lea     rcx,[128+rcx]
        sub     rdx,2
        jmp     NEAR $L$ctr32_loop8

ALIGN   16
$L$ctr32_6x:
        shl     eax,4
        mov     r10d,48
        bswap   ebp
        lea     rcx,[32+rax*1+rcx]
        sub     r10,rax
        jmp     NEAR $L$ctr32_loop6

ALIGN   16
$L$ctr32_loop6:
        add     r8d,6
        movups  xmm0,XMMWORD[((-48))+r10*1+rcx]
DB      102,15,56,220,209
        mov     eax,r8d
        xor     eax,ebp
DB      102,15,56,220,217
DB      0x0f,0x38,0xf1,0x44,0x24,12
        lea     eax,[1+r8]
DB      102,15,56,220,225
        xor     eax,ebp
DB      0x0f,0x38,0xf1,0x44,0x24,28
DB      102,15,56,220,233
        lea     eax,[2+r8]
        xor     eax,ebp
DB      102,15,56,220,241
DB      0x0f,0x38,0xf1,0x44,0x24,44
        lea     eax,[3+r8]
DB      102,15,56,220,249
        movups  xmm1,XMMWORD[((-32))+r10*1+rcx]
        xor     eax,ebp

DB      102,15,56,220,208
DB      0x0f,0x38,0xf1,0x44,0x24,60
        lea     eax,[4+r8]
DB      102,15,56,220,216
        xor     eax,ebp
DB      0x0f,0x38,0xf1,0x44,0x24,76
DB      102,15,56,220,224
        lea     eax,[5+r8]
        xor     eax,ebp
DB      102,15,56,220,232
DB      0x0f,0x38,0xf1,0x44,0x24,92
        mov     rax,r10
DB      102,15,56,220,240
DB      102,15,56,220,248
        movups  xmm0,XMMWORD[((-16))+r10*1+rcx]

        call    $L$enc_loop6

        movdqu  xmm8,XMMWORD[rdi]
        movdqu  xmm9,XMMWORD[16+rdi]
        movdqu  xmm10,XMMWORD[32+rdi]
        movdqu  xmm11,XMMWORD[48+rdi]
        movdqu  xmm12,XMMWORD[64+rdi]
        movdqu  xmm13,XMMWORD[80+rdi]
        lea     rdi,[96+rdi]
        movups  xmm1,XMMWORD[((-64))+r10*1+rcx]
        pxor    xmm8,xmm2
        movaps  xmm2,XMMWORD[rsp]
        pxor    xmm9,xmm3
        movaps  xmm3,XMMWORD[16+rsp]
        pxor    xmm10,xmm4
        movaps  xmm4,XMMWORD[32+rsp]
        pxor    xmm11,xmm5
        movaps  xmm5,XMMWORD[48+rsp]
        pxor    xmm12,xmm6
        movaps  xmm6,XMMWORD[64+rsp]
        pxor    xmm13,xmm7
        movaps  xmm7,XMMWORD[80+rsp]
        movdqu  XMMWORD[rsi],xmm8
        movdqu  XMMWORD[16+rsi],xmm9
        movdqu  XMMWORD[32+rsi],xmm10
        movdqu  XMMWORD[48+rsi],xmm11
        movdqu  XMMWORD[64+rsi],xmm12
        movdqu  XMMWORD[80+rsi],xmm13
        lea     rsi,[96+rsi]

        sub     rdx,6
        jnc     NEAR $L$ctr32_loop6

        add     rdx,6
        jz      NEAR $L$ctr32_done

        lea     eax,[((-48))+r10]
        lea     rcx,[((-80))+r10*1+rcx]
        neg     eax
        shr     eax,4
        jmp     NEAR $L$ctr32_tail

ALIGN   32
$L$ctr32_loop8:
        add     r8d,8
        movdqa  xmm8,XMMWORD[96+rsp]
DB      102,15,56,220,209
        mov     r9d,r8d
        movdqa  xmm9,XMMWORD[112+rsp]
DB      102,15,56,220,217
        bswap   r9d
        movups  xmm0,XMMWORD[((32-128))+rcx]
DB      102,15,56,220,225
        xor     r9d,ebp
        nop
DB      102,15,56,220,233
        mov     DWORD[((0+12))+rsp],r9d
        lea     r9,[1+r8]
DB      102,15,56,220,241
DB      102,15,56,220,249
DB      102,68,15,56,220,193
DB      102,68,15,56,220,201
        movups  xmm1,XMMWORD[((48-128))+rcx]
        bswap   r9d
DB      102,15,56,220,208
DB      102,15,56,220,216
        xor     r9d,ebp
DB      0x66,0x90
DB      102,15,56,220,224
DB      102,15,56,220,232
        mov     DWORD[((16+12))+rsp],r9d
        lea     r9,[2+r8]
DB      102,15,56,220,240
DB      102,15,56,220,248
DB      102,68,15,56,220,192
DB      102,68,15,56,220,200
        movups  xmm0,XMMWORD[((64-128))+rcx]
        bswap   r9d
DB      102,15,56,220,209
DB      102,15,56,220,217
        xor     r9d,ebp
DB      0x66,0x90
DB      102,15,56,220,225
DB      102,15,56,220,233
        mov     DWORD[((32+12))+rsp],r9d
        lea     r9,[3+r8]
DB      102,15,56,220,241
DB      102,15,56,220,249
DB      102,68,15,56,220,193
DB      102,68,15,56,220,201
        movups  xmm1,XMMWORD[((80-128))+rcx]
        bswap   r9d
DB      102,15,56,220,208
DB      102,15,56,220,216
        xor     r9d,ebp
DB      0x66,0x90
DB      102,15,56,220,224
DB      102,15,56,220,232
        mov     DWORD[((48+12))+rsp],r9d
        lea     r9,[4+r8]
DB      102,15,56,220,240
DB      102,15,56,220,248
DB      102,68,15,56,220,192
DB      102,68,15,56,220,200
        movups  xmm0,XMMWORD[((96-128))+rcx]
        bswap   r9d
DB      102,15,56,220,209
DB      102,15,56,220,217
        xor     r9d,ebp
DB      0x66,0x90
DB      102,15,56,220,225
DB      102,15,56,220,233
        mov     DWORD[((64+12))+rsp],r9d
        lea     r9,[5+r8]
DB      102,15,56,220,241
DB      102,15,56,220,249
DB      102,68,15,56,220,193
DB      102,68,15,56,220,201
        movups  xmm1,XMMWORD[((112-128))+rcx]
        bswap   r9d
DB      102,15,56,220,208
DB      102,15,56,220,216
        xor     r9d,ebp
DB      0x66,0x90
DB      102,15,56,220,224
DB      102,15,56,220,232
        mov     DWORD[((80+12))+rsp],r9d
        lea     r9,[6+r8]
DB      102,15,56,220,240
DB      102,15,56,220,248
DB      102,68,15,56,220,192
DB      102,68,15,56,220,200
        movups  xmm0,XMMWORD[((128-128))+rcx]
        bswap   r9d
DB      102,15,56,220,209
DB      102,15,56,220,217
        xor     r9d,ebp
DB      0x66,0x90
DB      102,15,56,220,225
DB      102,15,56,220,233
        mov     DWORD[((96+12))+rsp],r9d
        lea     r9,[7+r8]
DB      102,15,56,220,241
DB      102,15,56,220,249
DB      102,68,15,56,220,193
DB      102,68,15,56,220,201
        movups  xmm1,XMMWORD[((144-128))+rcx]
        bswap   r9d
DB      102,15,56,220,208
DB      102,15,56,220,216
DB      102,15,56,220,224
        xor     r9d,ebp
        movdqu  xmm10,XMMWORD[rdi]
DB      102,15,56,220,232
        mov     DWORD[((112+12))+rsp],r9d
        cmp     eax,11
DB      102,15,56,220,240
DB      102,15,56,220,248
DB      102,68,15,56,220,192
DB      102,68,15,56,220,200
        movups  xmm0,XMMWORD[((160-128))+rcx]

        jb      NEAR $L$ctr32_enc_done

DB      102,15,56,220,209
DB      102,15,56,220,217
DB      102,15,56,220,225
DB      102,15,56,220,233
DB      102,15,56,220,241
DB      102,15,56,220,249
DB      102,68,15,56,220,193
DB      102,68,15,56,220,201
        movups  xmm1,XMMWORD[((176-128))+rcx]

DB      102,15,56,220,208
DB      102,15,56,220,216
DB      102,15,56,220,224
DB      102,15,56,220,232
DB      102,15,56,220,240
DB      102,15,56,220,248
DB      102,68,15,56,220,192
DB      102,68,15,56,220,200
        movups  xmm0,XMMWORD[((192-128))+rcx]
        je      NEAR $L$ctr32_enc_done

DB      102,15,56,220,209
DB      102,15,56,220,217
DB      102,15,56,220,225
DB      102,15,56,220,233
DB      102,15,56,220,241
DB      102,15,56,220,249
DB      102,68,15,56,220,193
DB      102,68,15,56,220,201
        movups  xmm1,XMMWORD[((208-128))+rcx]

DB      102,15,56,220,208
DB      102,15,56,220,216
DB      102,15,56,220,224
DB      102,15,56,220,232
DB      102,15,56,220,240
DB      102,15,56,220,248
DB      102,68,15,56,220,192
DB      102,68,15,56,220,200
        movups  xmm0,XMMWORD[((224-128))+rcx]
        jmp     NEAR $L$ctr32_enc_done

ALIGN   16
$L$ctr32_enc_done:
        movdqu  xmm11,XMMWORD[16+rdi]
        pxor    xmm10,xmm0
        movdqu  xmm12,XMMWORD[32+rdi]
        pxor    xmm11,xmm0
        movdqu  xmm13,XMMWORD[48+rdi]
        pxor    xmm12,xmm0
        movdqu  xmm14,XMMWORD[64+rdi]
        pxor    xmm13,xmm0
        movdqu  xmm15,XMMWORD[80+rdi]
        pxor    xmm14,xmm0
        pxor    xmm15,xmm0
DB      102,15,56,220,209
DB      102,15,56,220,217
DB      102,15,56,220,225
DB      102,15,56,220,233
DB      102,15,56,220,241
DB      102,15,56,220,249
DB      102,68,15,56,220,193
DB      102,68,15,56,220,201
        movdqu  xmm1,XMMWORD[96+rdi]
        lea     rdi,[128+rdi]

DB      102,65,15,56,221,210
        pxor    xmm1,xmm0
        movdqu  xmm10,XMMWORD[((112-128))+rdi]
DB      102,65,15,56,221,219
        pxor    xmm10,xmm0
        movdqa  xmm11,XMMWORD[rsp]
DB      102,65,15,56,221,228
DB      102,65,15,56,221,237
        movdqa  xmm12,XMMWORD[16+rsp]
        movdqa  xmm13,XMMWORD[32+rsp]
DB      102,65,15,56,221,246
DB      102,65,15,56,221,255
        movdqa  xmm14,XMMWORD[48+rsp]
        movdqa  xmm15,XMMWORD[64+rsp]
DB      102,68,15,56,221,193
        movdqa  xmm0,XMMWORD[80+rsp]
        movups  xmm1,XMMWORD[((16-128))+rcx]
DB      102,69,15,56,221,202

        movups  XMMWORD[rsi],xmm2
        movdqa  xmm2,xmm11
        movups  XMMWORD[16+rsi],xmm3
        movdqa  xmm3,xmm12
        movups  XMMWORD[32+rsi],xmm4
        movdqa  xmm4,xmm13
        movups  XMMWORD[48+rsi],xmm5
        movdqa  xmm5,xmm14
        movups  XMMWORD[64+rsi],xmm6
        movdqa  xmm6,xmm15
        movups  XMMWORD[80+rsi],xmm7
        movdqa  xmm7,xmm0
        movups  XMMWORD[96+rsi],xmm8
        movups  XMMWORD[112+rsi],xmm9
        lea     rsi,[128+rsi]

        sub     rdx,8
        jnc     NEAR $L$ctr32_loop8

        add     rdx,8
        jz      NEAR $L$ctr32_done
        lea     rcx,[((-128))+rcx]

$L$ctr32_tail:


        lea     rcx,[16+rcx]
        cmp     rdx,4
        jb      NEAR $L$ctr32_loop3
        je      NEAR $L$ctr32_loop4


        shl     eax,4
        movdqa  xmm8,XMMWORD[96+rsp]
        pxor    xmm9,xmm9

        movups  xmm0,XMMWORD[16+rcx]
DB      102,15,56,220,209
DB      102,15,56,220,217
        lea     rcx,[((32-16))+rax*1+rcx]
        neg     rax
DB      102,15,56,220,225
        add     rax,16
        movups  xmm10,XMMWORD[rdi]
DB      102,15,56,220,233
DB      102,15,56,220,241
        movups  xmm11,XMMWORD[16+rdi]
        movups  xmm12,XMMWORD[32+rdi]
DB      102,15,56,220,249
DB      102,68,15,56,220,193

        call    $L$enc_loop8_enter

        movdqu  xmm13,XMMWORD[48+rdi]
        pxor    xmm2,xmm10
        movdqu  xmm10,XMMWORD[64+rdi]
        pxor    xmm3,xmm11
        movdqu  XMMWORD[rsi],xmm2
        pxor    xmm4,xmm12
        movdqu  XMMWORD[16+rsi],xmm3
        pxor    xmm5,xmm13
        movdqu  XMMWORD[32+rsi],xmm4
        pxor    xmm6,xmm10
        movdqu  XMMWORD[48+rsi],xmm5
        movdqu  XMMWORD[64+rsi],xmm6
        cmp     rdx,6
        jb      NEAR $L$ctr32_done

        movups  xmm11,XMMWORD[80+rdi]
        xorps   xmm7,xmm11
        movups  XMMWORD[80+rsi],xmm7
        je      NEAR $L$ctr32_done

        movups  xmm12,XMMWORD[96+rdi]
        xorps   xmm8,xmm12
        movups  XMMWORD[96+rsi],xmm8
        jmp     NEAR $L$ctr32_done

ALIGN   32
$L$ctr32_loop4:
DB      102,15,56,220,209
        lea     rcx,[16+rcx]
        dec     eax
DB      102,15,56,220,217
DB      102,15,56,220,225
DB      102,15,56,220,233
        movups  xmm1,XMMWORD[rcx]
        jnz     NEAR $L$ctr32_loop4
DB      102,15,56,221,209
DB      102,15,56,221,217
        movups  xmm10,XMMWORD[rdi]
        movups  xmm11,XMMWORD[16+rdi]
DB      102,15,56,221,225
DB      102,15,56,221,233
        movups  xmm12,XMMWORD[32+rdi]
        movups  xmm13,XMMWORD[48+rdi]

        xorps   xmm2,xmm10
        movups  XMMWORD[rsi],xmm2
        xorps   xmm3,xmm11
        movups  XMMWORD[16+rsi],xmm3
        pxor    xmm4,xmm12
        movdqu  XMMWORD[32+rsi],xmm4
        pxor    xmm5,xmm13
        movdqu  XMMWORD[48+rsi],xmm5
        jmp     NEAR $L$ctr32_done

ALIGN   32
$L$ctr32_loop3:
DB      102,15,56,220,209
        lea     rcx,[16+rcx]
        dec     eax
DB      102,15,56,220,217
DB      102,15,56,220,225
        movups  xmm1,XMMWORD[rcx]
        jnz     NEAR $L$ctr32_loop3
DB      102,15,56,221,209
DB      102,15,56,221,217
DB      102,15,56,221,225

        movups  xmm10,XMMWORD[rdi]
        xorps   xmm2,xmm10
        movups  XMMWORD[rsi],xmm2
        cmp     rdx,2
        jb      NEAR $L$ctr32_done

        movups  xmm11,XMMWORD[16+rdi]
        xorps   xmm3,xmm11
        movups  XMMWORD[16+rsi],xmm3
        je      NEAR $L$ctr32_done

        movups  xmm12,XMMWORD[32+rdi]
        xorps   xmm4,xmm12
        movups  XMMWORD[32+rsi],xmm4

$L$ctr32_done:
        xorps   xmm0,xmm0
        xor     ebp,ebp
        pxor    xmm1,xmm1
        pxor    xmm2,xmm2
        pxor    xmm3,xmm3
        pxor    xmm4,xmm4
        pxor    xmm5,xmm5
        movaps  xmm6,XMMWORD[((-168))+r11]
        movaps  XMMWORD[(-168)+r11],xmm0
        movaps  xmm7,XMMWORD[((-152))+r11]
        movaps  XMMWORD[(-152)+r11],xmm0
        movaps  xmm8,XMMWORD[((-136))+r11]
        movaps  XMMWORD[(-136)+r11],xmm0
        movaps  xmm9,XMMWORD[((-120))+r11]
        movaps  XMMWORD[(-120)+r11],xmm0
        movaps  xmm10,XMMWORD[((-104))+r11]
        movaps  XMMWORD[(-104)+r11],xmm0
        movaps  xmm11,XMMWORD[((-88))+r11]
        movaps  XMMWORD[(-88)+r11],xmm0
        movaps  xmm12,XMMWORD[((-72))+r11]
        movaps  XMMWORD[(-72)+r11],xmm0
        movaps  xmm13,XMMWORD[((-56))+r11]
        movaps  XMMWORD[(-56)+r11],xmm0
        movaps  xmm14,XMMWORD[((-40))+r11]
        movaps  XMMWORD[(-40)+r11],xmm0
        movaps  xmm15,XMMWORD[((-24))+r11]
        movaps  XMMWORD[(-24)+r11],xmm0
        movaps  XMMWORD[rsp],xmm0
        movaps  XMMWORD[16+rsp],xmm0
        movaps  XMMWORD[32+rsp],xmm0
        movaps  XMMWORD[48+rsp],xmm0
        movaps  XMMWORD[64+rsp],xmm0
        movaps  XMMWORD[80+rsp],xmm0
        movaps  XMMWORD[96+rsp],xmm0
        movaps  XMMWORD[112+rsp],xmm0
        mov     rbp,QWORD[((-8))+r11]

        lea     rsp,[r11]

$L$ctr32_epilogue:
        mov     rdi,QWORD[8+rsp]        ;WIN64 epilogue
        mov     rsi,QWORD[16+rsp]
        DB      0F3h,0C3h               ;repret

$L$SEH_end_aesni_ctr32_encrypt_blocks:
global  aesni_xts_encrypt

ALIGN   16
aesni_xts_encrypt:
        mov     QWORD[8+rsp],rdi        ;WIN64 prologue
        mov     QWORD[16+rsp],rsi
        mov     rax,rsp
$L$SEH_begin_aesni_xts_encrypt:
        mov     rdi,rcx
        mov     rsi,rdx
        mov     rdx,r8
        mov     rcx,r9
        mov     r8,QWORD[40+rsp]
        mov     r9,QWORD[48+rsp]



DB      243,15,30,250
        lea     r11,[rsp]

        push    rbp

        sub     rsp,272
        and     rsp,-16
        movaps  XMMWORD[(-168)+r11],xmm6
        movaps  XMMWORD[(-152)+r11],xmm7
        movaps  XMMWORD[(-136)+r11],xmm8
        movaps  XMMWORD[(-120)+r11],xmm9
        movaps  XMMWORD[(-104)+r11],xmm10
        movaps  XMMWORD[(-88)+r11],xmm11
        movaps  XMMWORD[(-72)+r11],xmm12
        movaps  XMMWORD[(-56)+r11],xmm13
        movaps  XMMWORD[(-40)+r11],xmm14
        movaps  XMMWORD[(-24)+r11],xmm15
$L$xts_enc_body:
        movups  xmm2,XMMWORD[r9]
        mov     eax,DWORD[240+r8]
        mov     r10d,DWORD[240+rcx]
        movups  xmm0,XMMWORD[r8]
        movups  xmm1,XMMWORD[16+r8]
        lea     r8,[32+r8]
        xorps   xmm2,xmm0
$L$oop_enc1_8:
DB      102,15,56,220,209
        dec     eax
        movups  xmm1,XMMWORD[r8]
        lea     r8,[16+r8]
        jnz     NEAR $L$oop_enc1_8
DB      102,15,56,221,209
        movups  xmm0,XMMWORD[rcx]
        mov     rbp,rcx
        mov     eax,r10d
        shl     r10d,4
        mov     r9,rdx
        and     rdx,-16

        movups  xmm1,XMMWORD[16+r10*1+rcx]

        movdqa  xmm8,XMMWORD[$L$xts_magic]
        movdqa  xmm15,xmm2
        pshufd  xmm9,xmm2,0x5f
        pxor    xmm1,xmm0
        movdqa  xmm14,xmm9
        paddd   xmm9,xmm9
        movdqa  xmm10,xmm15
        psrad   xmm14,31
        paddq   xmm15,xmm15
        pand    xmm14,xmm8
        pxor    xmm10,xmm0
        pxor    xmm15,xmm14
        movdqa  xmm14,xmm9
        paddd   xmm9,xmm9
        movdqa  xmm11,xmm15
        psrad   xmm14,31
        paddq   xmm15,xmm15
        pand    xmm14,xmm8
        pxor    xmm11,xmm0
        pxor    xmm15,xmm14
        movdqa  xmm14,xmm9
        paddd   xmm9,xmm9
        movdqa  xmm12,xmm15
        psrad   xmm14,31
        paddq   xmm15,xmm15
        pand    xmm14,xmm8
        pxor    xmm12,xmm0
        pxor    xmm15,xmm14
        movdqa  xmm14,xmm9
        paddd   xmm9,xmm9
        movdqa  xmm13,xmm15
        psrad   xmm14,31
        paddq   xmm15,xmm15
        pand    xmm14,xmm8
        pxor    xmm13,xmm0
        pxor    xmm15,xmm14
        movdqa  xmm14,xmm15
        psrad   xmm9,31
        paddq   xmm15,xmm15
        pand    xmm9,xmm8
        pxor    xmm14,xmm0
        pxor    xmm15,xmm9
        movaps  XMMWORD[96+rsp],xmm1

        sub     rdx,16*6
        jc      NEAR $L$xts_enc_short

        mov     eax,16+96
        lea     rcx,[32+r10*1+rbp]
        sub     rax,r10
        movups  xmm1,XMMWORD[16+rbp]
        mov     r10,rax
        lea     r8,[$L$xts_magic]
        jmp     NEAR $L$xts_enc_grandloop

ALIGN   32
$L$xts_enc_grandloop:
        movdqu  xmm2,XMMWORD[rdi]
        movdqa  xmm8,xmm0
        movdqu  xmm3,XMMWORD[16+rdi]
        pxor    xmm2,xmm10
        movdqu  xmm4,XMMWORD[32+rdi]
        pxor    xmm3,xmm11
DB      102,15,56,220,209
        movdqu  xmm5,XMMWORD[48+rdi]
        pxor    xmm4,xmm12
DB      102,15,56,220,217
        movdqu  xmm6,XMMWORD[64+rdi]
        pxor    xmm5,xmm13
DB      102,15,56,220,225
        movdqu  xmm7,XMMWORD[80+rdi]
        pxor    xmm8,xmm15
        movdqa  xmm9,XMMWORD[96+rsp]
        pxor    xmm6,xmm14
DB      102,15,56,220,233
        movups  xmm0,XMMWORD[32+rbp]
        lea     rdi,[96+rdi]
        pxor    xmm7,xmm8

        pxor    xmm10,xmm9
DB      102,15,56,220,241
        pxor    xmm11,xmm9
        movdqa  XMMWORD[rsp],xmm10
DB      102,15,56,220,249
        movups  xmm1,XMMWORD[48+rbp]
        pxor    xmm12,xmm9

DB      102,15,56,220,208
        pxor    xmm13,xmm9
        movdqa  XMMWORD[16+rsp],xmm11
DB      102,15,56,220,216
        pxor    xmm14,xmm9
        movdqa  XMMWORD[32+rsp],xmm12
DB      102,15,56,220,224
DB      102,15,56,220,232
        pxor    xmm8,xmm9
        movdqa  XMMWORD[64+rsp],xmm14
DB      102,15,56,220,240
DB      102,15,56,220,248
        movups  xmm0,XMMWORD[64+rbp]
        movdqa  XMMWORD[80+rsp],xmm8
        pshufd  xmm9,xmm15,0x5f
        jmp     NEAR $L$xts_enc_loop6
ALIGN   32
$L$xts_enc_loop6:
DB      102,15,56,220,209
DB      102,15,56,220,217
DB      102,15,56,220,225
DB      102,15,56,220,233
DB      102,15,56,220,241
DB      102,15,56,220,249
        movups  xmm1,XMMWORD[((-64))+rax*1+rcx]
        add     rax,32

DB      102,15,56,220,208
DB      102,15,56,220,216
DB      102,15,56,220,224
DB      102,15,56,220,232
DB      102,15,56,220,240
DB      102,15,56,220,248
        movups  xmm0,XMMWORD[((-80))+rax*1+rcx]
        jnz     NEAR $L$xts_enc_loop6

        movdqa  xmm8,XMMWORD[r8]
        movdqa  xmm14,xmm9
        paddd   xmm9,xmm9
DB      102,15,56,220,209
        paddq   xmm15,xmm15
        psrad   xmm14,31
DB      102,15,56,220,217
        pand    xmm14,xmm8
        movups  xmm10,XMMWORD[rbp]
DB      102,15,56,220,225
DB      102,15,56,220,233
DB      102,15,56,220,241
        pxor    xmm15,xmm14
        movaps  xmm11,xmm10
DB      102,15,56,220,249
        movups  xmm1,XMMWORD[((-64))+rcx]

        movdqa  xmm14,xmm9
DB      102,15,56,220,208
        paddd   xmm9,xmm9
        pxor    xmm10,xmm15
DB      102,15,56,220,216
        psrad   xmm14,31
        paddq   xmm15,xmm15
DB      102,15,56,220,224
DB      102,15,56,220,232
        pand    xmm14,xmm8
        movaps  xmm12,xmm11
DB      102,15,56,220,240
        pxor    xmm15,xmm14
        movdqa  xmm14,xmm9
DB      102,15,56,220,248
        movups  xmm0,XMMWORD[((-48))+rcx]

        paddd   xmm9,xmm9
DB      102,15,56,220,209
        pxor    xmm11,xmm15
        psrad   xmm14,31
DB      102,15,56,220,217
        paddq   xmm15,xmm15
        pand    xmm14,xmm8
DB      102,15,56,220,225
DB      102,15,56,220,233
        movdqa  XMMWORD[48+rsp],xmm13
        pxor    xmm15,xmm14
DB      102,15,56,220,241
        movaps  xmm13,xmm12
        movdqa  xmm14,xmm9
DB      102,15,56,220,249
        movups  xmm1,XMMWORD[((-32))+rcx]

        paddd   xmm9,xmm9
DB      102,15,56,220,208
        pxor    xmm12,xmm15
        psrad   xmm14,31
DB      102,15,56,220,216
        paddq   xmm15,xmm15
        pand    xmm14,xmm8
DB      102,15,56,220,224
DB      102,15,56,220,232
DB      102,15,56,220,240
        pxor    xmm15,xmm14
        movaps  xmm14,xmm13
DB      102,15,56,220,248

        movdqa  xmm0,xmm9
        paddd   xmm9,xmm9
DB      102,15,56,220,209
        pxor    xmm13,xmm15
        psrad   xmm0,31
DB      102,15,56,220,217
        paddq   xmm15,xmm15
        pand    xmm0,xmm8
DB      102,15,56,220,225
DB      102,15,56,220,233
        pxor    xmm15,xmm0
        movups  xmm0,XMMWORD[rbp]
DB      102,15,56,220,241
DB      102,15,56,220,249
        movups  xmm1,XMMWORD[16+rbp]

        pxor    xmm14,xmm15
DB      102,15,56,221,84,36,0
        psrad   xmm9,31
        paddq   xmm15,xmm15
DB      102,15,56,221,92,36,16
DB      102,15,56,221,100,36,32
        pand    xmm9,xmm8
        mov     rax,r10
DB      102,15,56,221,108,36,48
DB      102,15,56,221,116,36,64
DB      102,15,56,221,124,36,80
        pxor    xmm15,xmm9

        lea     rsi,[96+rsi]
        movups  XMMWORD[(-96)+rsi],xmm2
        movups  XMMWORD[(-80)+rsi],xmm3
        movups  XMMWORD[(-64)+rsi],xmm4
        movups  XMMWORD[(-48)+rsi],xmm5
        movups  XMMWORD[(-32)+rsi],xmm6
        movups  XMMWORD[(-16)+rsi],xmm7
        sub     rdx,16*6
        jnc     NEAR $L$xts_enc_grandloop

        mov     eax,16+96
        sub     eax,r10d
        mov     rcx,rbp
        shr     eax,4

$L$xts_enc_short:

        mov     r10d,eax
        pxor    xmm10,xmm0
        add     rdx,16*6
        jz      NEAR $L$xts_enc_done

        pxor    xmm11,xmm0
        cmp     rdx,0x20
        jb      NEAR $L$xts_enc_one
        pxor    xmm12,xmm0
        je      NEAR $L$xts_enc_two

        pxor    xmm13,xmm0
        cmp     rdx,0x40
        jb      NEAR $L$xts_enc_three
        pxor    xmm14,xmm0
        je      NEAR $L$xts_enc_four

        movdqu  xmm2,XMMWORD[rdi]
        movdqu  xmm3,XMMWORD[16+rdi]
        movdqu  xmm4,XMMWORD[32+rdi]
        pxor    xmm2,xmm10
        movdqu  xmm5,XMMWORD[48+rdi]
        pxor    xmm3,xmm11
        movdqu  xmm6,XMMWORD[64+rdi]
        lea     rdi,[80+rdi]
        pxor    xmm4,xmm12
        pxor    xmm5,xmm13
        pxor    xmm6,xmm14
        pxor    xmm7,xmm7

        call    _aesni_encrypt6

        xorps   xmm2,xmm10
        movdqa  xmm10,xmm15
        xorps   xmm3,xmm11
        xorps   xmm4,xmm12
        movdqu  XMMWORD[rsi],xmm2
        xorps   xmm5,xmm13
        movdqu  XMMWORD[16+rsi],xmm3
        xorps   xmm6,xmm14
        movdqu  XMMWORD[32+rsi],xmm4
        movdqu  XMMWORD[48+rsi],xmm5
        movdqu  XMMWORD[64+rsi],xmm6
        lea     rsi,[80+rsi]
        jmp     NEAR $L$xts_enc_done

ALIGN   16
$L$xts_enc_one:
        movups  xmm2,XMMWORD[rdi]
        lea     rdi,[16+rdi]
        xorps   xmm2,xmm10
        movups  xmm0,XMMWORD[rcx]
        movups  xmm1,XMMWORD[16+rcx]
        lea     rcx,[32+rcx]
        xorps   xmm2,xmm0
$L$oop_enc1_9:
DB      102,15,56,220,209
        dec     eax
        movups  xmm1,XMMWORD[rcx]
        lea     rcx,[16+rcx]
        jnz     NEAR $L$oop_enc1_9
DB      102,15,56,221,209
        xorps   xmm2,xmm10
        movdqa  xmm10,xmm11
        movups  XMMWORD[rsi],xmm2
        lea     rsi,[16+rsi]
        jmp     NEAR $L$xts_enc_done

ALIGN   16
$L$xts_enc_two:
        movups  xmm2,XMMWORD[rdi]
        movups  xmm3,XMMWORD[16+rdi]
        lea     rdi,[32+rdi]
        xorps   xmm2,xmm10
        xorps   xmm3,xmm11

        call    _aesni_encrypt2

        xorps   xmm2,xmm10
        movdqa  xmm10,xmm12
        xorps   xmm3,xmm11
        movups  XMMWORD[rsi],xmm2
        movups  XMMWORD[16+rsi],xmm3
        lea     rsi,[32+rsi]
        jmp     NEAR $L$xts_enc_done

ALIGN   16
$L$xts_enc_three:
        movups  xmm2,XMMWORD[rdi]
        movups  xmm3,XMMWORD[16+rdi]
        movups  xmm4,XMMWORD[32+rdi]
        lea     rdi,[48+rdi]
        xorps   xmm2,xmm10
        xorps   xmm3,xmm11
        xorps   xmm4,xmm12

        call    _aesni_encrypt3

        xorps   xmm2,xmm10
        movdqa  xmm10,xmm13
        xorps   xmm3,xmm11
        xorps   xmm4,xmm12
        movups  XMMWORD[rsi],xmm2
        movups  XMMWORD[16+rsi],xmm3
        movups  XMMWORD[32+rsi],xmm4
        lea     rsi,[48+rsi]
        jmp     NEAR $L$xts_enc_done

ALIGN   16
$L$xts_enc_four:
        movups  xmm2,XMMWORD[rdi]
        movups  xmm3,XMMWORD[16+rdi]
        movups  xmm4,XMMWORD[32+rdi]
        xorps   xmm2,xmm10
        movups  xmm5,XMMWORD[48+rdi]
        lea     rdi,[64+rdi]
        xorps   xmm3,xmm11
        xorps   xmm4,xmm12
        xorps   xmm5,xmm13

        call    _aesni_encrypt4

        pxor    xmm2,xmm10
        movdqa  xmm10,xmm14
        pxor    xmm3,xmm11
        pxor    xmm4,xmm12
        movdqu  XMMWORD[rsi],xmm2
        pxor    xmm5,xmm13
        movdqu  XMMWORD[16+rsi],xmm3
        movdqu  XMMWORD[32+rsi],xmm4
        movdqu  XMMWORD[48+rsi],xmm5
        lea     rsi,[64+rsi]
        jmp     NEAR $L$xts_enc_done

ALIGN   16
$L$xts_enc_done:
        and     r9,15
        jz      NEAR $L$xts_enc_ret
        mov     rdx,r9

$L$xts_enc_steal:
        movzx   eax,BYTE[rdi]
        movzx   ecx,BYTE[((-16))+rsi]
        lea     rdi,[1+rdi]
        mov     BYTE[((-16))+rsi],al
        mov     BYTE[rsi],cl
        lea     rsi,[1+rsi]
        sub     rdx,1
        jnz     NEAR $L$xts_enc_steal

        sub     rsi,r9
        mov     rcx,rbp
        mov     eax,r10d

        movups  xmm2,XMMWORD[((-16))+rsi]
        xorps   xmm2,xmm10
        movups  xmm0,XMMWORD[rcx]
        movups  xmm1,XMMWORD[16+rcx]
        lea     rcx,[32+rcx]
        xorps   xmm2,xmm0
$L$oop_enc1_10:
DB      102,15,56,220,209
        dec     eax
        movups  xmm1,XMMWORD[rcx]
        lea     rcx,[16+rcx]
        jnz     NEAR $L$oop_enc1_10
DB      102,15,56,221,209
        xorps   xmm2,xmm10
        movups  XMMWORD[(-16)+rsi],xmm2

$L$xts_enc_ret:
        xorps   xmm0,xmm0
        pxor    xmm1,xmm1
        pxor    xmm2,xmm2
        pxor    xmm3,xmm3
        pxor    xmm4,xmm4
        pxor    xmm5,xmm5
        movaps  xmm6,XMMWORD[((-168))+r11]
        movaps  XMMWORD[(-168)+r11],xmm0
        movaps  xmm7,XMMWORD[((-152))+r11]
        movaps  XMMWORD[(-152)+r11],xmm0
        movaps  xmm8,XMMWORD[((-136))+r11]
        movaps  XMMWORD[(-136)+r11],xmm0
        movaps  xmm9,XMMWORD[((-120))+r11]
        movaps  XMMWORD[(-120)+r11],xmm0
        movaps  xmm10,XMMWORD[((-104))+r11]
        movaps  XMMWORD[(-104)+r11],xmm0
        movaps  xmm11,XMMWORD[((-88))+r11]
        movaps  XMMWORD[(-88)+r11],xmm0
        movaps  xmm12,XMMWORD[((-72))+r11]
        movaps  XMMWORD[(-72)+r11],xmm0
        movaps  xmm13,XMMWORD[((-56))+r11]
        movaps  XMMWORD[(-56)+r11],xmm0
        movaps  xmm14,XMMWORD[((-40))+r11]
        movaps  XMMWORD[(-40)+r11],xmm0
        movaps  xmm15,XMMWORD[((-24))+r11]
        movaps  XMMWORD[(-24)+r11],xmm0
        movaps  XMMWORD[rsp],xmm0
        movaps  XMMWORD[16+rsp],xmm0
        movaps  XMMWORD[32+rsp],xmm0
        movaps  XMMWORD[48+rsp],xmm0
        movaps  XMMWORD[64+rsp],xmm0
        movaps  XMMWORD[80+rsp],xmm0
        movaps  XMMWORD[96+rsp],xmm0
        mov     rbp,QWORD[((-8))+r11]

        lea     rsp,[r11]

$L$xts_enc_epilogue:
        mov     rdi,QWORD[8+rsp]        ;WIN64 epilogue
        mov     rsi,QWORD[16+rsp]
        DB      0F3h,0C3h               ;repret

$L$SEH_end_aesni_xts_encrypt:
global  aesni_xts_decrypt

ALIGN   16
aesni_xts_decrypt:
        mov     QWORD[8+rsp],rdi        ;WIN64 prologue
        mov     QWORD[16+rsp],rsi
        mov     rax,rsp
$L$SEH_begin_aesni_xts_decrypt:
        mov     rdi,rcx
        mov     rsi,rdx
        mov     rdx,r8
        mov     rcx,r9
        mov     r8,QWORD[40+rsp]
        mov     r9,QWORD[48+rsp]



DB      243,15,30,250
        lea     r11,[rsp]

        push    rbp

        sub     rsp,272
        and     rsp,-16
        movaps  XMMWORD[(-168)+r11],xmm6
        movaps  XMMWORD[(-152)+r11],xmm7
        movaps  XMMWORD[(-136)+r11],xmm8
        movaps  XMMWORD[(-120)+r11],xmm9
        movaps  XMMWORD[(-104)+r11],xmm10
        movaps  XMMWORD[(-88)+r11],xmm11
        movaps  XMMWORD[(-72)+r11],xmm12
        movaps  XMMWORD[(-56)+r11],xmm13
        movaps  XMMWORD[(-40)+r11],xmm14
        movaps  XMMWORD[(-24)+r11],xmm15
$L$xts_dec_body:
        movups  xmm2,XMMWORD[r9]
        mov     eax,DWORD[240+r8]
        mov     r10d,DWORD[240+rcx]
        movups  xmm0,XMMWORD[r8]
        movups  xmm1,XMMWORD[16+r8]
        lea     r8,[32+r8]
        xorps   xmm2,xmm0
$L$oop_enc1_11:
DB      102,15,56,220,209
        dec     eax
        movups  xmm1,XMMWORD[r8]
        lea     r8,[16+r8]
        jnz     NEAR $L$oop_enc1_11
DB      102,15,56,221,209
        xor     eax,eax
        test    rdx,15
        setnz   al
        shl     rax,4
        sub     rdx,rax

        movups  xmm0,XMMWORD[rcx]
        mov     rbp,rcx
        mov     eax,r10d
        shl     r10d,4
        mov     r9,rdx
        and     rdx,-16

        movups  xmm1,XMMWORD[16+r10*1+rcx]

        movdqa  xmm8,XMMWORD[$L$xts_magic]
        movdqa  xmm15,xmm2
        pshufd  xmm9,xmm2,0x5f
        pxor    xmm1,xmm0
        movdqa  xmm14,xmm9
        paddd   xmm9,xmm9
        movdqa  xmm10,xmm15
        psrad   xmm14,31
        paddq   xmm15,xmm15
        pand    xmm14,xmm8
        pxor    xmm10,xmm0
        pxor    xmm15,xmm14
        movdqa  xmm14,xmm9
        paddd   xmm9,xmm9
        movdqa  xmm11,xmm15
        psrad   xmm14,31
        paddq   xmm15,xmm15
        pand    xmm14,xmm8
        pxor    xmm11,xmm0
        pxor    xmm15,xmm14
        movdqa  xmm14,xmm9
        paddd   xmm9,xmm9
        movdqa  xmm12,xmm15
        psrad   xmm14,31
        paddq   xmm15,xmm15
        pand    xmm14,xmm8
        pxor    xmm12,xmm0
        pxor    xmm15,xmm14
        movdqa  xmm14,xmm9
        paddd   xmm9,xmm9
        movdqa  xmm13,xmm15
        psrad   xmm14,31
        paddq   xmm15,xmm15
        pand    xmm14,xmm8
        pxor    xmm13,xmm0
        pxor    xmm15,xmm14
        movdqa  xmm14,xmm15
        psrad   xmm9,31
        paddq   xmm15,xmm15
        pand    xmm9,xmm8
        pxor    xmm14,xmm0
        pxor    xmm15,xmm9
        movaps  XMMWORD[96+rsp],xmm1

        sub     rdx,16*6
        jc      NEAR $L$xts_dec_short

        mov     eax,16+96
        lea     rcx,[32+r10*1+rbp]
        sub     rax,r10
        movups  xmm1,XMMWORD[16+rbp]
        mov     r10,rax
        lea     r8,[$L$xts_magic]
        jmp     NEAR $L$xts_dec_grandloop

ALIGN   32
$L$xts_dec_grandloop:
        movdqu  xmm2,XMMWORD[rdi]
        movdqa  xmm8,xmm0
        movdqu  xmm3,XMMWORD[16+rdi]
        pxor    xmm2,xmm10
        movdqu  xmm4,XMMWORD[32+rdi]
        pxor    xmm3,xmm11
DB      102,15,56,222,209
        movdqu  xmm5,XMMWORD[48+rdi]
        pxor    xmm4,xmm12
DB      102,15,56,222,217
        movdqu  xmm6,XMMWORD[64+rdi]
        pxor    xmm5,xmm13
DB      102,15,56,222,225
        movdqu  xmm7,XMMWORD[80+rdi]
        pxor    xmm8,xmm15
        movdqa  xmm9,XMMWORD[96+rsp]
        pxor    xmm6,xmm14
DB      102,15,56,222,233
        movups  xmm0,XMMWORD[32+rbp]
        lea     rdi,[96+rdi]
        pxor    xmm7,xmm8

        pxor    xmm10,xmm9
DB      102,15,56,222,241
        pxor    xmm11,xmm9
        movdqa  XMMWORD[rsp],xmm10
DB      102,15,56,222,249
        movups  xmm1,XMMWORD[48+rbp]
        pxor    xmm12,xmm9

DB      102,15,56,222,208
        pxor    xmm13,xmm9
        movdqa  XMMWORD[16+rsp],xmm11
DB      102,15,56,222,216
        pxor    xmm14,xmm9
        movdqa  XMMWORD[32+rsp],xmm12
DB      102,15,56,222,224
DB      102,15,56,222,232
        pxor    xmm8,xmm9
        movdqa  XMMWORD[64+rsp],xmm14
DB      102,15,56,222,240
DB      102,15,56,222,248
        movups  xmm0,XMMWORD[64+rbp]
        movdqa  XMMWORD[80+rsp],xmm8
        pshufd  xmm9,xmm15,0x5f
        jmp     NEAR $L$xts_dec_loop6
ALIGN   32
$L$xts_dec_loop6:
DB      102,15,56,222,209
DB      102,15,56,222,217
DB      102,15,56,222,225
DB      102,15,56,222,233
DB      102,15,56,222,241
DB      102,15,56,222,249
        movups  xmm1,XMMWORD[((-64))+rax*1+rcx]
        add     rax,32

DB      102,15,56,222,208
DB      102,15,56,222,216
DB      102,15,56,222,224
DB      102,15,56,222,232
DB      102,15,56,222,240
DB      102,15,56,222,248
        movups  xmm0,XMMWORD[((-80))+rax*1+rcx]
        jnz     NEAR $L$xts_dec_loop6

        movdqa  xmm8,XMMWORD[r8]
        movdqa  xmm14,xmm9
        paddd   xmm9,xmm9
DB      102,15,56,222,209
        paddq   xmm15,xmm15
        psrad   xmm14,31
DB      102,15,56,222,217
        pand    xmm14,xmm8
        movups  xmm10,XMMWORD[rbp]
DB      102,15,56,222,225
DB      102,15,56,222,233
DB      102,15,56,222,241
        pxor    xmm15,xmm14
        movaps  xmm11,xmm10
DB      102,15,56,222,249
        movups  xmm1,XMMWORD[((-64))+rcx]

        movdqa  xmm14,xmm9
DB      102,15,56,222,208
        paddd   xmm9,xmm9
        pxor    xmm10,xmm15
DB      102,15,56,222,216
        psrad   xmm14,31
        paddq   xmm15,xmm15
DB      102,15,56,222,224
DB      102,15,56,222,232
        pand    xmm14,xmm8
        movaps  xmm12,xmm11
DB      102,15,56,222,240
        pxor    xmm15,xmm14
        movdqa  xmm14,xmm9
DB      102,15,56,222,248
        movups  xmm0,XMMWORD[((-48))+rcx]

        paddd   xmm9,xmm9
DB      102,15,56,222,209
        pxor    xmm11,xmm15
        psrad   xmm14,31
DB      102,15,56,222,217
        paddq   xmm15,xmm15
        pand    xmm14,xmm8
DB      102,15,56,222,225
DB      102,15,56,222,233
        movdqa  XMMWORD[48+rsp],xmm13
        pxor    xmm15,xmm14
DB      102,15,56,222,241
        movaps  xmm13,xmm12
        movdqa  xmm14,xmm9
DB      102,15,56,222,249
        movups  xmm1,XMMWORD[((-32))+rcx]

        paddd   xmm9,xmm9
DB      102,15,56,222,208
        pxor    xmm12,xmm15
        psrad   xmm14,31
DB      102,15,56,222,216
        paddq   xmm15,xmm15
        pand    xmm14,xmm8
DB      102,15,56,222,224
DB      102,15,56,222,232
DB      102,15,56,222,240
        pxor    xmm15,xmm14
        movaps  xmm14,xmm13
DB      102,15,56,222,248

        movdqa  xmm0,xmm9
        paddd   xmm9,xmm9
DB      102,15,56,222,209
        pxor    xmm13,xmm15
        psrad   xmm0,31
DB      102,15,56,222,217
        paddq   xmm15,xmm15
        pand    xmm0,xmm8
DB      102,15,56,222,225
DB      102,15,56,222,233
        pxor    xmm15,xmm0
        movups  xmm0,XMMWORD[rbp]
DB      102,15,56,222,241
DB      102,15,56,222,249
        movups  xmm1,XMMWORD[16+rbp]

        pxor    xmm14,xmm15
DB      102,15,56,223,84,36,0
        psrad   xmm9,31
        paddq   xmm15,xmm15
DB      102,15,56,223,92,36,16
DB      102,15,56,223,100,36,32
        pand    xmm9,xmm8
        mov     rax,r10
DB      102,15,56,223,108,36,48
DB      102,15,56,223,116,36,64
DB      102,15,56,223,124,36,80
        pxor    xmm15,xmm9

        lea     rsi,[96+rsi]
        movups  XMMWORD[(-96)+rsi],xmm2
        movups  XMMWORD[(-80)+rsi],xmm3
        movups  XMMWORD[(-64)+rsi],xmm4
        movups  XMMWORD[(-48)+rsi],xmm5
        movups  XMMWORD[(-32)+rsi],xmm6
        movups  XMMWORD[(-16)+rsi],xmm7
        sub     rdx,16*6
        jnc     NEAR $L$xts_dec_grandloop

        mov     eax,16+96
        sub     eax,r10d
        mov     rcx,rbp
        shr     eax,4

$L$xts_dec_short:

        mov     r10d,eax
        pxor    xmm10,xmm0
        pxor    xmm11,xmm0
        add     rdx,16*6
        jz      NEAR $L$xts_dec_done

        pxor    xmm12,xmm0
        cmp     rdx,0x20
        jb      NEAR $L$xts_dec_one
        pxor    xmm13,xmm0
        je      NEAR $L$xts_dec_two

        pxor    xmm14,xmm0
        cmp     rdx,0x40
        jb      NEAR $L$xts_dec_three
        je      NEAR $L$xts_dec_four

        movdqu  xmm2,XMMWORD[rdi]
        movdqu  xmm3,XMMWORD[16+rdi]
        movdqu  xmm4,XMMWORD[32+rdi]
        pxor    xmm2,xmm10
        movdqu  xmm5,XMMWORD[48+rdi]
        pxor    xmm3,xmm11
        movdqu  xmm6,XMMWORD[64+rdi]
        lea     rdi,[80+rdi]
        pxor    xmm4,xmm12
        pxor    xmm5,xmm13
        pxor    xmm6,xmm14

        call    _aesni_decrypt6

        xorps   xmm2,xmm10
        xorps   xmm3,xmm11
        xorps   xmm4,xmm12
        movdqu  XMMWORD[rsi],xmm2
        xorps   xmm5,xmm13
        movdqu  XMMWORD[16+rsi],xmm3
        xorps   xmm6,xmm14
        movdqu  XMMWORD[32+rsi],xmm4
        pxor    xmm14,xmm14
        movdqu  XMMWORD[48+rsi],xmm5
        pcmpgtd xmm14,xmm15
        movdqu  XMMWORD[64+rsi],xmm6
        lea     rsi,[80+rsi]
        pshufd  xmm11,xmm14,0x13
        and     r9,15
        jz      NEAR $L$xts_dec_ret

        movdqa  xmm10,xmm15
        paddq   xmm15,xmm15
        pand    xmm11,xmm8
        pxor    xmm11,xmm15
        jmp     NEAR $L$xts_dec_done2

ALIGN   16
$L$xts_dec_one:
        movups  xmm2,XMMWORD[rdi]
        lea     rdi,[16+rdi]
        xorps   xmm2,xmm10
        movups  xmm0,XMMWORD[rcx]
        movups  xmm1,XMMWORD[16+rcx]
        lea     rcx,[32+rcx]
        xorps   xmm2,xmm0
$L$oop_dec1_12:
DB      102,15,56,222,209
        dec     eax
        movups  xmm1,XMMWORD[rcx]
        lea     rcx,[16+rcx]
        jnz     NEAR $L$oop_dec1_12
DB      102,15,56,223,209
        xorps   xmm2,xmm10
        movdqa  xmm10,xmm11
        movups  XMMWORD[rsi],xmm2
        movdqa  xmm11,xmm12
        lea     rsi,[16+rsi]
        jmp     NEAR $L$xts_dec_done

ALIGN   16
$L$xts_dec_two:
        movups  xmm2,XMMWORD[rdi]
        movups  xmm3,XMMWORD[16+rdi]
        lea     rdi,[32+rdi]
        xorps   xmm2,xmm10
        xorps   xmm3,xmm11

        call    _aesni_decrypt2

        xorps   xmm2,xmm10
        movdqa  xmm10,xmm12
        xorps   xmm3,xmm11
        movdqa  xmm11,xmm13
        movups  XMMWORD[rsi],xmm2
        movups  XMMWORD[16+rsi],xmm3
        lea     rsi,[32+rsi]
        jmp     NEAR $L$xts_dec_done

ALIGN   16
$L$xts_dec_three:
        movups  xmm2,XMMWORD[rdi]
        movups  xmm3,XMMWORD[16+rdi]
        movups  xmm4,XMMWORD[32+rdi]
        lea     rdi,[48+rdi]
        xorps   xmm2,xmm10
        xorps   xmm3,xmm11
        xorps   xmm4,xmm12

        call    _aesni_decrypt3

        xorps   xmm2,xmm10
        movdqa  xmm10,xmm13
        xorps   xmm3,xmm11
        movdqa  xmm11,xmm14
        xorps   xmm4,xmm12
        movups  XMMWORD[rsi],xmm2
        movups  XMMWORD[16+rsi],xmm3
        movups  XMMWORD[32+rsi],xmm4
        lea     rsi,[48+rsi]
        jmp     NEAR $L$xts_dec_done

ALIGN   16
$L$xts_dec_four:
        movups  xmm2,XMMWORD[rdi]
        movups  xmm3,XMMWORD[16+rdi]
        movups  xmm4,XMMWORD[32+rdi]
        xorps   xmm2,xmm10
        movups  xmm5,XMMWORD[48+rdi]
        lea     rdi,[64+rdi]
        xorps   xmm3,xmm11
        xorps   xmm4,xmm12
        xorps   xmm5,xmm13

        call    _aesni_decrypt4

        pxor    xmm2,xmm10
        movdqa  xmm10,xmm14
        pxor    xmm3,xmm11
        movdqa  xmm11,xmm15
        pxor    xmm4,xmm12
        movdqu  XMMWORD[rsi],xmm2
        pxor    xmm5,xmm13
        movdqu  XMMWORD[16+rsi],xmm3
        movdqu  XMMWORD[32+rsi],xmm4
        movdqu  XMMWORD[48+rsi],xmm5
        lea     rsi,[64+rsi]
        jmp     NEAR $L$xts_dec_done

ALIGN   16
$L$xts_dec_done:
        and     r9,15
        jz      NEAR $L$xts_dec_ret
$L$xts_dec_done2:
        mov     rdx,r9
        mov     rcx,rbp
        mov     eax,r10d

        movups  xmm2,XMMWORD[rdi]
        xorps   xmm2,xmm11
        movups  xmm0,XMMWORD[rcx]
        movups  xmm1,XMMWORD[16+rcx]
        lea     rcx,[32+rcx]
        xorps   xmm2,xmm0
$L$oop_dec1_13:
DB      102,15,56,222,209
        dec     eax
        movups  xmm1,XMMWORD[rcx]
        lea     rcx,[16+rcx]
        jnz     NEAR $L$oop_dec1_13
DB      102,15,56,223,209
        xorps   xmm2,xmm11
        movups  XMMWORD[rsi],xmm2

$L$xts_dec_steal:
        movzx   eax,BYTE[16+rdi]
        movzx   ecx,BYTE[rsi]
        lea     rdi,[1+rdi]
        mov     BYTE[rsi],al
        mov     BYTE[16+rsi],cl
        lea     rsi,[1+rsi]
        sub     rdx,1
        jnz     NEAR $L$xts_dec_steal

        sub     rsi,r9
        mov     rcx,rbp
        mov     eax,r10d

        movups  xmm2,XMMWORD[rsi]
        xorps   xmm2,xmm10
        movups  xmm0,XMMWORD[rcx]
        movups  xmm1,XMMWORD[16+rcx]
        lea     rcx,[32+rcx]
        xorps   xmm2,xmm0
$L$oop_dec1_14:
DB      102,15,56,222,209
        dec     eax
        movups  xmm1,XMMWORD[rcx]
        lea     rcx,[16+rcx]
        jnz     NEAR $L$oop_dec1_14
DB      102,15,56,223,209
        xorps   xmm2,xmm10
        movups  XMMWORD[rsi],xmm2

$L$xts_dec_ret:
        xorps   xmm0,xmm0
        pxor    xmm1,xmm1
        pxor    xmm2,xmm2
        pxor    xmm3,xmm3
        pxor    xmm4,xmm4
        pxor    xmm5,xmm5
        movaps  xmm6,XMMWORD[((-168))+r11]
        movaps  XMMWORD[(-168)+r11],xmm0
        movaps  xmm7,XMMWORD[((-152))+r11]
        movaps  XMMWORD[(-152)+r11],xmm0
        movaps  xmm8,XMMWORD[((-136))+r11]
        movaps  XMMWORD[(-136)+r11],xmm0
        movaps  xmm9,XMMWORD[((-120))+r11]
        movaps  XMMWORD[(-120)+r11],xmm0
        movaps  xmm10,XMMWORD[((-104))+r11]
        movaps  XMMWORD[(-104)+r11],xmm0
        movaps  xmm11,XMMWORD[((-88))+r11]
        movaps  XMMWORD[(-88)+r11],xmm0
        movaps  xmm12,XMMWORD[((-72))+r11]
        movaps  XMMWORD[(-72)+r11],xmm0
        movaps  xmm13,XMMWORD[((-56))+r11]
        movaps  XMMWORD[(-56)+r11],xmm0
        movaps  xmm14,XMMWORD[((-40))+r11]
        movaps  XMMWORD[(-40)+r11],xmm0
        movaps  xmm15,XMMWORD[((-24))+r11]
        movaps  XMMWORD[(-24)+r11],xmm0
        movaps  XMMWORD[rsp],xmm0
        movaps  XMMWORD[16+rsp],xmm0
        movaps  XMMWORD[32+rsp],xmm0
        movaps  XMMWORD[48+rsp],xmm0
        movaps  XMMWORD[64+rsp],xmm0
        movaps  XMMWORD[80+rsp],xmm0
        movaps  XMMWORD[96+rsp],xmm0
        mov     rbp,QWORD[((-8))+r11]

        lea     rsp,[r11]

$L$xts_dec_epilogue:
        mov     rdi,QWORD[8+rsp]        ;WIN64 epilogue
        mov     rsi,QWORD[16+rsp]
        DB      0F3h,0C3h               ;repret

$L$SEH_end_aesni_xts_decrypt:
global  aesni_ocb_encrypt

ALIGN   32
aesni_ocb_encrypt:
        mov     QWORD[8+rsp],rdi        ;WIN64 prologue
        mov     QWORD[16+rsp],rsi
        mov     rax,rsp
$L$SEH_begin_aesni_ocb_encrypt:
        mov     rdi,rcx
        mov     rsi,rdx
        mov     rdx,r8
        mov     rcx,r9
        mov     r8,QWORD[40+rsp]
        mov     r9,QWORD[48+rsp]



DB      243,15,30,250
        lea     rax,[rsp]
        push    rbx

        push    rbp

        push    r12

        push    r13

        push    r14

        lea     rsp,[((-160))+rsp]
        movaps  XMMWORD[rsp],xmm6
        movaps  XMMWORD[16+rsp],xmm7
        movaps  XMMWORD[32+rsp],xmm8
        movaps  XMMWORD[48+rsp],xmm9
        movaps  XMMWORD[64+rsp],xmm10
        movaps  XMMWORD[80+rsp],xmm11
        movaps  XMMWORD[96+rsp],xmm12
        movaps  XMMWORD[112+rsp],xmm13
        movaps  XMMWORD[128+rsp],xmm14
        movaps  XMMWORD[144+rsp],xmm15
$L$ocb_enc_body:
        mov     rbx,QWORD[56+rax]
        mov     rbp,QWORD[((56+8))+rax]

        mov     r10d,DWORD[240+rcx]
        mov     r11,rcx
        shl     r10d,4
        movups  xmm9,XMMWORD[rcx]
        movups  xmm1,XMMWORD[16+r10*1+rcx]

        movdqu  xmm15,XMMWORD[r9]
        pxor    xmm9,xmm1
        pxor    xmm15,xmm1

        mov     eax,16+32
        lea     rcx,[32+r10*1+r11]
        movups  xmm1,XMMWORD[16+r11]
        sub     rax,r10
        mov     r10,rax

        movdqu  xmm10,XMMWORD[rbx]
        movdqu  xmm8,XMMWORD[rbp]

        test    r8,1
        jnz     NEAR $L$ocb_enc_odd

        bsf     r12,r8
        add     r8,1
        shl     r12,4
        movdqu  xmm7,XMMWORD[r12*1+rbx]
        movdqu  xmm2,XMMWORD[rdi]
        lea     rdi,[16+rdi]

        call    __ocb_encrypt1

        movdqa  xmm15,xmm7
        movups  XMMWORD[rsi],xmm2
        lea     rsi,[16+rsi]
        sub     rdx,1
        jz      NEAR $L$ocb_enc_done

$L$ocb_enc_odd:
        lea     r12,[1+r8]
        lea     r13,[3+r8]
        lea     r14,[5+r8]
        lea     r8,[6+r8]
        bsf     r12,r12
        bsf     r13,r13
        bsf     r14,r14
        shl     r12,4
        shl     r13,4
        shl     r14,4

        sub     rdx,6
        jc      NEAR $L$ocb_enc_short
        jmp     NEAR $L$ocb_enc_grandloop

ALIGN   32
$L$ocb_enc_grandloop:
        movdqu  xmm2,XMMWORD[rdi]
        movdqu  xmm3,XMMWORD[16+rdi]
        movdqu  xmm4,XMMWORD[32+rdi]
        movdqu  xmm5,XMMWORD[48+rdi]
        movdqu  xmm6,XMMWORD[64+rdi]
        movdqu  xmm7,XMMWORD[80+rdi]
        lea     rdi,[96+rdi]

        call    __ocb_encrypt6

        movups  XMMWORD[rsi],xmm2
        movups  XMMWORD[16+rsi],xmm3
        movups  XMMWORD[32+rsi],xmm4
        movups  XMMWORD[48+rsi],xmm5
        movups  XMMWORD[64+rsi],xmm6
        movups  XMMWORD[80+rsi],xmm7
        lea     rsi,[96+rsi]
        sub     rdx,6
        jnc     NEAR $L$ocb_enc_grandloop

$L$ocb_enc_short:
        add     rdx,6
        jz      NEAR $L$ocb_enc_done

        movdqu  xmm2,XMMWORD[rdi]
        cmp     rdx,2
        jb      NEAR $L$ocb_enc_one
        movdqu  xmm3,XMMWORD[16+rdi]
        je      NEAR $L$ocb_enc_two

        movdqu  xmm4,XMMWORD[32+rdi]
        cmp     rdx,4
        jb      NEAR $L$ocb_enc_three
        movdqu  xmm5,XMMWORD[48+rdi]
        je      NEAR $L$ocb_enc_four

        movdqu  xmm6,XMMWORD[64+rdi]
        pxor    xmm7,xmm7

        call    __ocb_encrypt6

        movdqa  xmm15,xmm14
        movups  XMMWORD[rsi],xmm2
        movups  XMMWORD[16+rsi],xmm3
        movups  XMMWORD[32+rsi],xmm4
        movups  XMMWORD[48+rsi],xmm5
        movups  XMMWORD[64+rsi],xmm6

        jmp     NEAR $L$ocb_enc_done

ALIGN   16
$L$ocb_enc_one:
        movdqa  xmm7,xmm10

        call    __ocb_encrypt1

        movdqa  xmm15,xmm7
        movups  XMMWORD[rsi],xmm2
        jmp     NEAR $L$ocb_enc_done

ALIGN   16
$L$ocb_enc_two:
        pxor    xmm4,xmm4
        pxor    xmm5,xmm5

        call    __ocb_encrypt4

        movdqa  xmm15,xmm11
        movups  XMMWORD[rsi],xmm2
        movups  XMMWORD[16+rsi],xmm3

        jmp     NEAR $L$ocb_enc_done

ALIGN   16
$L$ocb_enc_three:
        pxor    xmm5,xmm5

        call    __ocb_encrypt4

        movdqa  xmm15,xmm12
        movups  XMMWORD[rsi],xmm2
        movups  XMMWORD[16+rsi],xmm3
        movups  XMMWORD[32+rsi],xmm4

        jmp     NEAR $L$ocb_enc_done

ALIGN   16
$L$ocb_enc_four:
        call    __ocb_encrypt4

        movdqa  xmm15,xmm13
        movups  XMMWORD[rsi],xmm2
        movups  XMMWORD[16+rsi],xmm3
        movups  XMMWORD[32+rsi],xmm4
        movups  XMMWORD[48+rsi],xmm5

$L$ocb_enc_done:
        pxor    xmm15,xmm0
        movdqu  XMMWORD[rbp],xmm8
        movdqu  XMMWORD[r9],xmm15

        xorps   xmm0,xmm0
        pxor    xmm1,xmm1
        pxor    xmm2,xmm2
        pxor    xmm3,xmm3
        pxor    xmm4,xmm4
        pxor    xmm5,xmm5
        movaps  xmm6,XMMWORD[rsp]
        movaps  XMMWORD[rsp],xmm0
        movaps  xmm7,XMMWORD[16+rsp]
        movaps  XMMWORD[16+rsp],xmm0
        movaps  xmm8,XMMWORD[32+rsp]
        movaps  XMMWORD[32+rsp],xmm0
        movaps  xmm9,XMMWORD[48+rsp]
        movaps  XMMWORD[48+rsp],xmm0
        movaps  xmm10,XMMWORD[64+rsp]
        movaps  XMMWORD[64+rsp],xmm0
        movaps  xmm11,XMMWORD[80+rsp]
        movaps  XMMWORD[80+rsp],xmm0
        movaps  xmm12,XMMWORD[96+rsp]
        movaps  XMMWORD[96+rsp],xmm0
        movaps  xmm13,XMMWORD[112+rsp]
        movaps  XMMWORD[112+rsp],xmm0
        movaps  xmm14,XMMWORD[128+rsp]
        movaps  XMMWORD[128+rsp],xmm0
        movaps  xmm15,XMMWORD[144+rsp]
        movaps  XMMWORD[144+rsp],xmm0
        lea     rax,[((160+40))+rsp]
$L$ocb_enc_pop:
        mov     r14,QWORD[((-40))+rax]

        mov     r13,QWORD[((-32))+rax]

        mov     r12,QWORD[((-24))+rax]

        mov     rbp,QWORD[((-16))+rax]

        mov     rbx,QWORD[((-8))+rax]

        lea     rsp,[rax]

$L$ocb_enc_epilogue:
        mov     rdi,QWORD[8+rsp]        ;WIN64 epilogue
        mov     rsi,QWORD[16+rsp]
        DB      0F3h,0C3h               ;repret

$L$SEH_end_aesni_ocb_encrypt:


ALIGN   32
__ocb_encrypt6:

        pxor    xmm15,xmm9
        movdqu  xmm11,XMMWORD[r12*1+rbx]
        movdqa  xmm12,xmm10
        movdqu  xmm13,XMMWORD[r13*1+rbx]
        movdqa  xmm14,xmm10
        pxor    xmm10,xmm15
        movdqu  xmm15,XMMWORD[r14*1+rbx]
        pxor    xmm11,xmm10
        pxor    xmm8,xmm2
        pxor    xmm2,xmm10
        pxor    xmm12,xmm11
        pxor    xmm8,xmm3
        pxor    xmm3,xmm11
        pxor    xmm13,xmm12
        pxor    xmm8,xmm4
        pxor    xmm4,xmm12
        pxor    xmm14,xmm13
        pxor    xmm8,xmm5
        pxor    xmm5,xmm13
        pxor    xmm15,xmm14
        pxor    xmm8,xmm6
        pxor    xmm6,xmm14
        pxor    xmm8,xmm7
        pxor    xmm7,xmm15
        movups  xmm0,XMMWORD[32+r11]

        lea     r12,[1+r8]
        lea     r13,[3+r8]
        lea     r14,[5+r8]
        add     r8,6
        pxor    xmm10,xmm9
        bsf     r12,r12
        bsf     r13,r13
        bsf     r14,r14

DB      102,15,56,220,209
DB      102,15,56,220,217
DB      102,15,56,220,225
DB      102,15,56,220,233
        pxor    xmm11,xmm9
        pxor    xmm12,xmm9
DB      102,15,56,220,241
        pxor    xmm13,xmm9
        pxor    xmm14,xmm9
DB      102,15,56,220,249
        movups  xmm1,XMMWORD[48+r11]
        pxor    xmm15,xmm9

DB      102,15,56,220,208
DB      102,15,56,220,216
DB      102,15,56,220,224
DB      102,15,56,220,232
DB      102,15,56,220,240
DB      102,15,56,220,248
        movups  xmm0,XMMWORD[64+r11]
        shl     r12,4
        shl     r13,4
        jmp     NEAR $L$ocb_enc_loop6

ALIGN   32
$L$ocb_enc_loop6:
DB      102,15,56,220,209
DB      102,15,56,220,217
DB      102,15,56,220,225
DB      102,15,56,220,233
DB      102,15,56,220,241
DB      102,15,56,220,249
        movups  xmm1,XMMWORD[rax*1+rcx]
        add     rax,32

DB      102,15,56,220,208
DB      102,15,56,220,216
DB      102,15,56,220,224
DB      102,15,56,220,232
DB      102,15,56,220,240
DB      102,15,56,220,248
        movups  xmm0,XMMWORD[((-16))+rax*1+rcx]
        jnz     NEAR $L$ocb_enc_loop6

DB      102,15,56,220,209
DB      102,15,56,220,217
DB      102,15,56,220,225
DB      102,15,56,220,233
DB      102,15,56,220,241
DB      102,15,56,220,249
        movups  xmm1,XMMWORD[16+r11]
        shl     r14,4

DB      102,65,15,56,221,210
        movdqu  xmm10,XMMWORD[rbx]
        mov     rax,r10
DB      102,65,15,56,221,219
DB      102,65,15,56,221,228
DB      102,65,15,56,221,237
DB      102,65,15,56,221,246
DB      102,65,15,56,221,255
        DB      0F3h,0C3h               ;repret




ALIGN   32
__ocb_encrypt4:

        pxor    xmm15,xmm9
        movdqu  xmm11,XMMWORD[r12*1+rbx]
        movdqa  xmm12,xmm10
        movdqu  xmm13,XMMWORD[r13*1+rbx]
        pxor    xmm10,xmm15
        pxor    xmm11,xmm10
        pxor    xmm8,xmm2
        pxor    xmm2,xmm10
        pxor    xmm12,xmm11
        pxor    xmm8,xmm3
        pxor    xmm3,xmm11
        pxor    xmm13,xmm12
        pxor    xmm8,xmm4
        pxor    xmm4,xmm12
        pxor    xmm8,xmm5
        pxor    xmm5,xmm13
        movups  xmm0,XMMWORD[32+r11]

        pxor    xmm10,xmm9
        pxor    xmm11,xmm9
        pxor    xmm12,xmm9
        pxor    xmm13,xmm9

DB      102,15,56,220,209
DB      102,15,56,220,217
DB      102,15,56,220,225
DB      102,15,56,220,233
        movups  xmm1,XMMWORD[48+r11]

DB      102,15,56,220,208
DB      102,15,56,220,216
DB      102,15,56,220,224
DB      102,15,56,220,232
        movups  xmm0,XMMWORD[64+r11]
        jmp     NEAR $L$ocb_enc_loop4

ALIGN   32
$L$ocb_enc_loop4:
DB      102,15,56,220,209
DB      102,15,56,220,217
DB      102,15,56,220,225
DB      102,15,56,220,233
        movups  xmm1,XMMWORD[rax*1+rcx]
        add     rax,32

DB      102,15,56,220,208
DB      102,15,56,220,216
DB      102,15,56,220,224
DB      102,15,56,220,232
        movups  xmm0,XMMWORD[((-16))+rax*1+rcx]
        jnz     NEAR $L$ocb_enc_loop4

DB      102,15,56,220,209
DB      102,15,56,220,217
DB      102,15,56,220,225
DB      102,15,56,220,233
        movups  xmm1,XMMWORD[16+r11]
        mov     rax,r10

DB      102,65,15,56,221,210
DB      102,65,15,56,221,219
DB      102,65,15,56,221,228
DB      102,65,15,56,221,237
        DB      0F3h,0C3h               ;repret




ALIGN   32
__ocb_encrypt1:

        pxor    xmm7,xmm15
        pxor    xmm7,xmm9
        pxor    xmm8,xmm2
        pxor    xmm2,xmm7
        movups  xmm0,XMMWORD[32+r11]

DB      102,15,56,220,209
        movups  xmm1,XMMWORD[48+r11]
        pxor    xmm7,xmm9

DB      102,15,56,220,208
        movups  xmm0,XMMWORD[64+r11]
        jmp     NEAR $L$ocb_enc_loop1

ALIGN   32
$L$ocb_enc_loop1:
DB      102,15,56,220,209
        movups  xmm1,XMMWORD[rax*1+rcx]
        add     rax,32

DB      102,15,56,220,208
        movups  xmm0,XMMWORD[((-16))+rax*1+rcx]
        jnz     NEAR $L$ocb_enc_loop1

DB      102,15,56,220,209
        movups  xmm1,XMMWORD[16+r11]
        mov     rax,r10

DB      102,15,56,221,215
        DB      0F3h,0C3h               ;repret



global  aesni_ocb_decrypt

ALIGN   32
aesni_ocb_decrypt:
        mov     QWORD[8+rsp],rdi        ;WIN64 prologue
        mov     QWORD[16+rsp],rsi
        mov     rax,rsp
$L$SEH_begin_aesni_ocb_decrypt:
        mov     rdi,rcx
        mov     rsi,rdx
        mov     rdx,r8
        mov     rcx,r9
        mov     r8,QWORD[40+rsp]
        mov     r9,QWORD[48+rsp]



DB      243,15,30,250
        lea     rax,[rsp]
        push    rbx

        push    rbp

        push    r12

        push    r13

        push    r14

        lea     rsp,[((-160))+rsp]
        movaps  XMMWORD[rsp],xmm6
        movaps  XMMWORD[16+rsp],xmm7
        movaps  XMMWORD[32+rsp],xmm8
        movaps  XMMWORD[48+rsp],xmm9
        movaps  XMMWORD[64+rsp],xmm10
        movaps  XMMWORD[80+rsp],xmm11
        movaps  XMMWORD[96+rsp],xmm12
        movaps  XMMWORD[112+rsp],xmm13
        movaps  XMMWORD[128+rsp],xmm14
        movaps  XMMWORD[144+rsp],xmm15
$L$ocb_dec_body:
        mov     rbx,QWORD[56+rax]
        mov     rbp,QWORD[((56+8))+rax]

        mov     r10d,DWORD[240+rcx]
        mov     r11,rcx
        shl     r10d,4
        movups  xmm9,XMMWORD[rcx]
        movups  xmm1,XMMWORD[16+r10*1+rcx]

        movdqu  xmm15,XMMWORD[r9]
        pxor    xmm9,xmm1
        pxor    xmm15,xmm1

        mov     eax,16+32
        lea     rcx,[32+r10*1+r11]
        movups  xmm1,XMMWORD[16+r11]
        sub     rax,r10
        mov     r10,rax

        movdqu  xmm10,XMMWORD[rbx]
        movdqu  xmm8,XMMWORD[rbp]

        test    r8,1
        jnz     NEAR $L$ocb_dec_odd

        bsf     r12,r8
        add     r8,1
        shl     r12,4
        movdqu  xmm7,XMMWORD[r12*1+rbx]
        movdqu  xmm2,XMMWORD[rdi]
        lea     rdi,[16+rdi]

        call    __ocb_decrypt1

        movdqa  xmm15,xmm7
        movups  XMMWORD[rsi],xmm2
        xorps   xmm8,xmm2
        lea     rsi,[16+rsi]
        sub     rdx,1
        jz      NEAR $L$ocb_dec_done

$L$ocb_dec_odd:
        lea     r12,[1+r8]
        lea     r13,[3+r8]
        lea     r14,[5+r8]
        lea     r8,[6+r8]
        bsf     r12,r12
        bsf     r13,r13
        bsf     r14,r14
        shl     r12,4
        shl     r13,4
        shl     r14,4

        sub     rdx,6
        jc      NEAR $L$ocb_dec_short
        jmp     NEAR $L$ocb_dec_grandloop

ALIGN   32
$L$ocb_dec_grandloop:
        movdqu  xmm2,XMMWORD[rdi]
        movdqu  xmm3,XMMWORD[16+rdi]
        movdqu  xmm4,XMMWORD[32+rdi]
        movdqu  xmm5,XMMWORD[48+rdi]
        movdqu  xmm6,XMMWORD[64+rdi]
        movdqu  xmm7,XMMWORD[80+rdi]
        lea     rdi,[96+rdi]

        call    __ocb_decrypt6

        movups  XMMWORD[rsi],xmm2
        pxor    xmm8,xmm2
        movups  XMMWORD[16+rsi],xmm3
        pxor    xmm8,xmm3
        movups  XMMWORD[32+rsi],xmm4
        pxor    xmm8,xmm4
        movups  XMMWORD[48+rsi],xmm5
        pxor    xmm8,xmm5
        movups  XMMWORD[64+rsi],xmm6
        pxor    xmm8,xmm6
        movups  XMMWORD[80+rsi],xmm7
        pxor    xmm8,xmm7
        lea     rsi,[96+rsi]
        sub     rdx,6
        jnc     NEAR $L$ocb_dec_grandloop

$L$ocb_dec_short:
        add     rdx,6
        jz      NEAR $L$ocb_dec_done

        movdqu  xmm2,XMMWORD[rdi]
        cmp     rdx,2
        jb      NEAR $L$ocb_dec_one
        movdqu  xmm3,XMMWORD[16+rdi]
        je      NEAR $L$ocb_dec_two

        movdqu  xmm4,XMMWORD[32+rdi]
        cmp     rdx,4
        jb      NEAR $L$ocb_dec_three
        movdqu  xmm5,XMMWORD[48+rdi]
        je      NEAR $L$ocb_dec_four

        movdqu  xmm6,XMMWORD[64+rdi]
        pxor    xmm7,xmm7

        call    __ocb_decrypt6

        movdqa  xmm15,xmm14
        movups  XMMWORD[rsi],xmm2
        pxor    xmm8,xmm2
        movups  XMMWORD[16+rsi],xmm3
        pxor    xmm8,xmm3
        movups  XMMWORD[32+rsi],xmm4
        pxor    xmm8,xmm4
        movups  XMMWORD[48+rsi],xmm5
        pxor    xmm8,xmm5
        movups  XMMWORD[64+rsi],xmm6
        pxor    xmm8,xmm6

        jmp     NEAR $L$ocb_dec_done

ALIGN   16
$L$ocb_dec_one:
        movdqa  xmm7,xmm10

        call    __ocb_decrypt1

        movdqa  xmm15,xmm7
        movups  XMMWORD[rsi],xmm2
        xorps   xmm8,xmm2
        jmp     NEAR $L$ocb_dec_done

ALIGN   16
$L$ocb_dec_two:
        pxor    xmm4,xmm4
        pxor    xmm5,xmm5

        call    __ocb_decrypt4

        movdqa  xmm15,xmm11
        movups  XMMWORD[rsi],xmm2
        xorps   xmm8,xmm2
        movups  XMMWORD[16+rsi],xmm3
        xorps   xmm8,xmm3

        jmp     NEAR $L$ocb_dec_done

ALIGN   16
$L$ocb_dec_three:
        pxor    xmm5,xmm5

        call    __ocb_decrypt4

        movdqa  xmm15,xmm12
        movups  XMMWORD[rsi],xmm2
        xorps   xmm8,xmm2
        movups  XMMWORD[16+rsi],xmm3
        xorps   xmm8,xmm3
        movups  XMMWORD[32+rsi],xmm4
        xorps   xmm8,xmm4

        jmp     NEAR $L$ocb_dec_done

ALIGN   16
$L$ocb_dec_four:
        call    __ocb_decrypt4

        movdqa  xmm15,xmm13
        movups  XMMWORD[rsi],xmm2
        pxor    xmm8,xmm2
        movups  XMMWORD[16+rsi],xmm3
        pxor    xmm8,xmm3
        movups  XMMWORD[32+rsi],xmm4
        pxor    xmm8,xmm4
        movups  XMMWORD[48+rsi],xmm5
        pxor    xmm8,xmm5

$L$ocb_dec_done:
        pxor    xmm15,xmm0
        movdqu  XMMWORD[rbp],xmm8
        movdqu  XMMWORD[r9],xmm15

        xorps   xmm0,xmm0
        pxor    xmm1,xmm1
        pxor    xmm2,xmm2
        pxor    xmm3,xmm3
        pxor    xmm4,xmm4
        pxor    xmm5,xmm5
        movaps  xmm6,XMMWORD[rsp]
        movaps  XMMWORD[rsp],xmm0
        movaps  xmm7,XMMWORD[16+rsp]
        movaps  XMMWORD[16+rsp],xmm0
        movaps  xmm8,XMMWORD[32+rsp]
        movaps  XMMWORD[32+rsp],xmm0
        movaps  xmm9,XMMWORD[48+rsp]
        movaps  XMMWORD[48+rsp],xmm0
        movaps  xmm10,XMMWORD[64+rsp]
        movaps  XMMWORD[64+rsp],xmm0
        movaps  xmm11,XMMWORD[80+rsp]
        movaps  XMMWORD[80+rsp],xmm0
        movaps  xmm12,XMMWORD[96+rsp]
        movaps  XMMWORD[96+rsp],xmm0
        movaps  xmm13,XMMWORD[112+rsp]
        movaps  XMMWORD[112+rsp],xmm0
        movaps  xmm14,XMMWORD[128+rsp]
        movaps  XMMWORD[128+rsp],xmm0
        movaps  xmm15,XMMWORD[144+rsp]
        movaps  XMMWORD[144+rsp],xmm0
        lea     rax,[((160+40))+rsp]
$L$ocb_dec_pop:
        mov     r14,QWORD[((-40))+rax]

        mov     r13,QWORD[((-32))+rax]

        mov     r12,QWORD[((-24))+rax]

        mov     rbp,QWORD[((-16))+rax]

        mov     rbx,QWORD[((-8))+rax]

        lea     rsp,[rax]

$L$ocb_dec_epilogue:
        mov     rdi,QWORD[8+rsp]        ;WIN64 epilogue
        mov     rsi,QWORD[16+rsp]
        DB      0F3h,0C3h               ;repret

$L$SEH_end_aesni_ocb_decrypt:


ALIGN   32
__ocb_decrypt6:

        pxor    xmm15,xmm9
        movdqu  xmm11,XMMWORD[r12*1+rbx]
        movdqa  xmm12,xmm10
        movdqu  xmm13,XMMWORD[r13*1+rbx]
        movdqa  xmm14,xmm10
        pxor    xmm10,xmm15
        movdqu  xmm15,XMMWORD[r14*1+rbx]
        pxor    xmm11,xmm10
        pxor    xmm2,xmm10
        pxor    xmm12,xmm11
        pxor    xmm3,xmm11
        pxor    xmm13,xmm12
        pxor    xmm4,xmm12
        pxor    xmm14,xmm13
        pxor    xmm5,xmm13
        pxor    xmm15,xmm14
        pxor    xmm6,xmm14
        pxor    xmm7,xmm15
        movups  xmm0,XMMWORD[32+r11]

        lea     r12,[1+r8]
        lea     r13,[3+r8]
        lea     r14,[5+r8]
        add     r8,6
        pxor    xmm10,xmm9
        bsf     r12,r12
        bsf     r13,r13
        bsf     r14,r14

DB      102,15,56,222,209
DB      102,15,56,222,217
DB      102,15,56,222,225
DB      102,15,56,222,233
        pxor    xmm11,xmm9
        pxor    xmm12,xmm9
DB      102,15,56,222,241
        pxor    xmm13,xmm9
        pxor    xmm14,xmm9
DB      102,15,56,222,249
        movups  xmm1,XMMWORD[48+r11]
        pxor    xmm15,xmm9

DB      102,15,56,222,208
DB      102,15,56,222,216
DB      102,15,56,222,224
DB      102,15,56,222,232
DB      102,15,56,222,240
DB      102,15,56,222,248
        movups  xmm0,XMMWORD[64+r11]
        shl     r12,4
        shl     r13,4
        jmp     NEAR $L$ocb_dec_loop6

ALIGN   32
$L$ocb_dec_loop6:
DB      102,15,56,222,209
DB      102,15,56,222,217
DB      102,15,56,222,225
DB      102,15,56,222,233
DB      102,15,56,222,241
DB      102,15,56,222,249
        movups  xmm1,XMMWORD[rax*1+rcx]
        add     rax,32

DB      102,15,56,222,208
DB      102,15,56,222,216
DB      102,15,56,222,224
DB      102,15,56,222,232
DB      102,15,56,222,240
DB      102,15,56,222,248
        movups  xmm0,XMMWORD[((-16))+rax*1+rcx]
        jnz     NEAR $L$ocb_dec_loop6

DB      102,15,56,222,209
DB      102,15,56,222,217
DB      102,15,56,222,225
DB      102,15,56,222,233
DB      102,15,56,222,241
DB      102,15,56,222,249
        movups  xmm1,XMMWORD[16+r11]
        shl     r14,4

DB      102,65,15,56,223,210
        movdqu  xmm10,XMMWORD[rbx]
        mov     rax,r10
DB      102,65,15,56,223,219
DB      102,65,15,56,223,228
DB      102,65,15,56,223,237
DB      102,65,15,56,223,246
DB      102,65,15,56,223,255
        DB      0F3h,0C3h               ;repret




ALIGN   32
__ocb_decrypt4:

        pxor    xmm15,xmm9
        movdqu  xmm11,XMMWORD[r12*1+rbx]
        movdqa  xmm12,xmm10
        movdqu  xmm13,XMMWORD[r13*1+rbx]
        pxor    xmm10,xmm15
        pxor    xmm11,xmm10
        pxor    xmm2,xmm10
        pxor    xmm12,xmm11
        pxor    xmm3,xmm11
        pxor    xmm13,xmm12
        pxor    xmm4,xmm12
        pxor    xmm5,xmm13
        movups  xmm0,XMMWORD[32+r11]

        pxor    xmm10,xmm9
        pxor    xmm11,xmm9
        pxor    xmm12,xmm9
        pxor    xmm13,xmm9

DB      102,15,56,222,209
DB      102,15,56,222,217
DB      102,15,56,222,225
DB      102,15,56,222,233
        movups  xmm1,XMMWORD[48+r11]

DB      102,15,56,222,208
DB      102,15,56,222,216
DB      102,15,56,222,224
DB      102,15,56,222,232
        movups  xmm0,XMMWORD[64+r11]
        jmp     NEAR $L$ocb_dec_loop4

ALIGN   32
$L$ocb_dec_loop4:
DB      102,15,56,222,209
DB      102,15,56,222,217
DB      102,15,56,222,225
DB      102,15,56,222,233
        movups  xmm1,XMMWORD[rax*1+rcx]
        add     rax,32

DB      102,15,56,222,208
DB      102,15,56,222,216
DB      102,15,56,222,224
DB      102,15,56,222,232
        movups  xmm0,XMMWORD[((-16))+rax*1+rcx]
        jnz     NEAR $L$ocb_dec_loop4

DB      102,15,56,222,209
DB      102,15,56,222,217
DB      102,15,56,222,225
DB      102,15,56,222,233
        movups  xmm1,XMMWORD[16+r11]
        mov     rax,r10

DB      102,65,15,56,223,210
DB      102,65,15,56,223,219
DB      102,65,15,56,223,228
DB      102,65,15,56,223,237
        DB      0F3h,0C3h               ;repret




ALIGN   32
__ocb_decrypt1:

        pxor    xmm7,xmm15
        pxor    xmm7,xmm9
        pxor    xmm2,xmm7
        movups  xmm0,XMMWORD[32+r11]

DB      102,15,56,222,209
        movups  xmm1,XMMWORD[48+r11]
        pxor    xmm7,xmm9

DB      102,15,56,222,208
        movups  xmm0,XMMWORD[64+r11]
        jmp     NEAR $L$ocb_dec_loop1

ALIGN   32
$L$ocb_dec_loop1:
DB      102,15,56,222,209
        movups  xmm1,XMMWORD[rax*1+rcx]
        add     rax,32

DB      102,15,56,222,208
        movups  xmm0,XMMWORD[((-16))+rax*1+rcx]
        jnz     NEAR $L$ocb_dec_loop1

DB      102,15,56,222,209
        movups  xmm1,XMMWORD[16+r11]
        mov     rax,r10

DB      102,15,56,223,215
        DB      0F3h,0C3h               ;repret


global  aesni_cbc_encrypt

ALIGN   16
aesni_cbc_encrypt:
        mov     QWORD[8+rsp],rdi        ;WIN64 prologue
        mov     QWORD[16+rsp],rsi
        mov     rax,rsp
$L$SEH_begin_aesni_cbc_encrypt:
        mov     rdi,rcx
        mov     rsi,rdx
        mov     rdx,r8
        mov     rcx,r9
        mov     r8,QWORD[40+rsp]
        mov     r9,QWORD[48+rsp]



DB      243,15,30,250
        test    rdx,rdx
        jz      NEAR $L$cbc_ret

        mov     r10d,DWORD[240+rcx]
        mov     r11,rcx
        test    r9d,r9d
        jz      NEAR $L$cbc_decrypt

        movups  xmm2,XMMWORD[r8]
        mov     eax,r10d
        cmp     rdx,16
        jb      NEAR $L$cbc_enc_tail
        sub     rdx,16
        jmp     NEAR $L$cbc_enc_loop
ALIGN   16
$L$cbc_enc_loop:
        movups  xmm3,XMMWORD[rdi]
        lea     rdi,[16+rdi]

        movups  xmm0,XMMWORD[rcx]
        movups  xmm1,XMMWORD[16+rcx]
        xorps   xmm3,xmm0
        lea     rcx,[32+rcx]
        xorps   xmm2,xmm3
$L$oop_enc1_15:
DB      102,15,56,220,209
        dec     eax
        movups  xmm1,XMMWORD[rcx]
        lea     rcx,[16+rcx]
        jnz     NEAR $L$oop_enc1_15
DB      102,15,56,221,209
        mov     eax,r10d
        mov     rcx,r11
        movups  XMMWORD[rsi],xmm2
        lea     rsi,[16+rsi]
        sub     rdx,16
        jnc     NEAR $L$cbc_enc_loop
        add     rdx,16
        jnz     NEAR $L$cbc_enc_tail
        pxor    xmm0,xmm0
        pxor    xmm1,xmm1
        movups  XMMWORD[r8],xmm2
        pxor    xmm2,xmm2
        pxor    xmm3,xmm3
        jmp     NEAR $L$cbc_ret

$L$cbc_enc_tail:
        mov     rcx,rdx
        xchg    rsi,rdi
        DD      0x9066A4F3
        mov     ecx,16
        sub     rcx,rdx
        xor     eax,eax
        DD      0x9066AAF3
        lea     rdi,[((-16))+rdi]
        mov     eax,r10d
        mov     rsi,rdi
        mov     rcx,r11
        xor     rdx,rdx
        jmp     NEAR $L$cbc_enc_loop

ALIGN   16
$L$cbc_decrypt:
        cmp     rdx,16
        jne     NEAR $L$cbc_decrypt_bulk



        movdqu  xmm2,XMMWORD[rdi]
        movdqu  xmm3,XMMWORD[r8]
        movdqa  xmm4,xmm2
        movups  xmm0,XMMWORD[rcx]
        movups  xmm1,XMMWORD[16+rcx]
        lea     rcx,[32+rcx]
        xorps   xmm2,xmm0
$L$oop_dec1_16:
DB      102,15,56,222,209
        dec     r10d
        movups  xmm1,XMMWORD[rcx]
        lea     rcx,[16+rcx]
        jnz     NEAR $L$oop_dec1_16
DB      102,15,56,223,209
        pxor    xmm0,xmm0
        pxor    xmm1,xmm1
        movdqu  XMMWORD[r8],xmm4
        xorps   xmm2,xmm3
        pxor    xmm3,xmm3
        movups  XMMWORD[rsi],xmm2
        pxor    xmm2,xmm2
        jmp     NEAR $L$cbc_ret
ALIGN   16
$L$cbc_decrypt_bulk:
        lea     r11,[rsp]

        push    rbp

        sub     rsp,176
        and     rsp,-16
        movaps  XMMWORD[16+rsp],xmm6
        movaps  XMMWORD[32+rsp],xmm7
        movaps  XMMWORD[48+rsp],xmm8
        movaps  XMMWORD[64+rsp],xmm9
        movaps  XMMWORD[80+rsp],xmm10
        movaps  XMMWORD[96+rsp],xmm11
        movaps  XMMWORD[112+rsp],xmm12
        movaps  XMMWORD[128+rsp],xmm13
        movaps  XMMWORD[144+rsp],xmm14
        movaps  XMMWORD[160+rsp],xmm15
$L$cbc_decrypt_body:
        mov     rbp,rcx
        movups  xmm10,XMMWORD[r8]
        mov     eax,r10d
        cmp     rdx,0x50
        jbe     NEAR $L$cbc_dec_tail

        movups  xmm0,XMMWORD[rcx]
        movdqu  xmm2,XMMWORD[rdi]
        movdqu  xmm3,XMMWORD[16+rdi]
        movdqa  xmm11,xmm2
        movdqu  xmm4,XMMWORD[32+rdi]
        movdqa  xmm12,xmm3
        movdqu  xmm5,XMMWORD[48+rdi]
        movdqa  xmm13,xmm4
        movdqu  xmm6,XMMWORD[64+rdi]
        movdqa  xmm14,xmm5
        movdqu  xmm7,XMMWORD[80+rdi]
        movdqa  xmm15,xmm6
        mov     r9d,DWORD[((OPENSSL_ia32cap_P+4))]
        cmp     rdx,0x70
        jbe     NEAR $L$cbc_dec_six_or_seven

        and     r9d,71303168
        sub     rdx,0x50
        cmp     r9d,4194304
        je      NEAR $L$cbc_dec_loop6_enter
        sub     rdx,0x20
        lea     rcx,[112+rcx]
        jmp     NEAR $L$cbc_dec_loop8_enter
ALIGN   16
$L$cbc_dec_loop8:
        movups  XMMWORD[rsi],xmm9
        lea     rsi,[16+rsi]
$L$cbc_dec_loop8_enter:
        movdqu  xmm8,XMMWORD[96+rdi]
        pxor    xmm2,xmm0
        movdqu  xmm9,XMMWORD[112+rdi]
        pxor    xmm3,xmm0
        movups  xmm1,XMMWORD[((16-112))+rcx]
        pxor    xmm4,xmm0
        mov     rbp,-1
        cmp     rdx,0x70
        pxor    xmm5,xmm0
        pxor    xmm6,xmm0
        pxor    xmm7,xmm0
        pxor    xmm8,xmm0

DB      102,15,56,222,209
        pxor    xmm9,xmm0
        movups  xmm0,XMMWORD[((32-112))+rcx]
DB      102,15,56,222,217
DB      102,15,56,222,225
DB      102,15,56,222,233
DB      102,15,56,222,241
DB      102,15,56,222,249
DB      102,68,15,56,222,193
        adc     rbp,0
        and     rbp,128
DB      102,68,15,56,222,201
        add     rbp,rdi
        movups  xmm1,XMMWORD[((48-112))+rcx]
DB      102,15,56,222,208
DB      102,15,56,222,216
DB      102,15,56,222,224
DB      102,15,56,222,232
DB      102,15,56,222,240
DB      102,15,56,222,248
DB      102,68,15,56,222,192
DB      102,68,15,56,222,200
        movups  xmm0,XMMWORD[((64-112))+rcx]
        nop
DB      102,15,56,222,209
DB      102,15,56,222,217
DB      102,15,56,222,225
DB      102,15,56,222,233
DB      102,15,56,222,241
DB      102,15,56,222,249
DB      102,68,15,56,222,193
DB      102,68,15,56,222,201
        movups  xmm1,XMMWORD[((80-112))+rcx]
        nop
DB      102,15,56,222,208
DB      102,15,56,222,216
DB      102,15,56,222,224
DB      102,15,56,222,232
DB      102,15,56,222,240
DB      102,15,56,222,248
DB      102,68,15,56,222,192
DB      102,68,15,56,222,200
        movups  xmm0,XMMWORD[((96-112))+rcx]
        nop
DB      102,15,56,222,209
DB      102,15,56,222,217
DB      102,15,56,222,225
DB      102,15,56,222,233
DB      102,15,56,222,241
DB      102,15,56,222,249
DB      102,68,15,56,222,193
DB      102,68,15,56,222,201
        movups  xmm1,XMMWORD[((112-112))+rcx]
        nop
DB      102,15,56,222,208
DB      102,15,56,222,216
DB      102,15,56,222,224
DB      102,15,56,222,232
DB      102,15,56,222,240
DB      102,15,56,222,248
DB      102,68,15,56,222,192
DB      102,68,15,56,222,200
        movups  xmm0,XMMWORD[((128-112))+rcx]
        nop
DB      102,15,56,222,209
DB      102,15,56,222,217
DB      102,15,56,222,225
DB      102,15,56,222,233
DB      102,15,56,222,241
DB      102,15,56,222,249
DB      102,68,15,56,222,193
DB      102,68,15,56,222,201
        movups  xmm1,XMMWORD[((144-112))+rcx]
        cmp     eax,11
DB      102,15,56,222,208
DB      102,15,56,222,216
DB      102,15,56,222,224
DB      102,15,56,222,232
DB      102,15,56,222,240
DB      102,15,56,222,248
DB      102,68,15,56,222,192
DB      102,68,15,56,222,200
        movups  xmm0,XMMWORD[((160-112))+rcx]
        jb      NEAR $L$cbc_dec_done
DB      102,15,56,222,209
DB      102,15,56,222,217
DB      102,15,56,222,225
DB      102,15,56,222,233
DB      102,15,56,222,241
DB      102,15,56,222,249
DB      102,68,15,56,222,193
DB      102,68,15,56,222,201
        movups  xmm1,XMMWORD[((176-112))+rcx]
        nop
DB      102,15,56,222,208
DB      102,15,56,222,216
DB      102,15,56,222,224
DB      102,15,56,222,232
DB      102,15,56,222,240
DB      102,15,56,222,248
DB      102,68,15,56,222,192
DB      102,68,15,56,222,200
        movups  xmm0,XMMWORD[((192-112))+rcx]
        je      NEAR $L$cbc_dec_done
DB      102,15,56,222,209
DB      102,15,56,222,217
DB      102,15,56,222,225
DB      102,15,56,222,233
DB      102,15,56,222,241
DB      102,15,56,222,249
DB      102,68,15,56,222,193
DB      102,68,15,56,222,201
        movups  xmm1,XMMWORD[((208-112))+rcx]
        nop
DB      102,15,56,222,208
DB      102,15,56,222,216
DB      102,15,56,222,224
DB      102,15,56,222,232
DB      102,15,56,222,240
DB      102,15,56,222,248
DB      102,68,15,56,222,192
DB      102,68,15,56,222,200
        movups  xmm0,XMMWORD[((224-112))+rcx]
        jmp     NEAR $L$cbc_dec_done
ALIGN   16
$L$cbc_dec_done:
DB      102,15,56,222,209
DB      102,15,56,222,217
        pxor    xmm10,xmm0
        pxor    xmm11,xmm0
DB      102,15,56,222,225
DB      102,15,56,222,233
        pxor    xmm12,xmm0
        pxor    xmm13,xmm0
DB      102,15,56,222,241
DB      102,15,56,222,249
        pxor    xmm14,xmm0
        pxor    xmm15,xmm0
DB      102,68,15,56,222,193
DB      102,68,15,56,222,201
        movdqu  xmm1,XMMWORD[80+rdi]

DB      102,65,15,56,223,210
        movdqu  xmm10,XMMWORD[96+rdi]
        pxor    xmm1,xmm0
DB      102,65,15,56,223,219
        pxor    xmm10,xmm0
        movdqu  xmm0,XMMWORD[112+rdi]
DB      102,65,15,56,223,228
        lea     rdi,[128+rdi]
        movdqu  xmm11,XMMWORD[rbp]
DB      102,65,15,56,223,237
DB      102,65,15,56,223,246
        movdqu  xmm12,XMMWORD[16+rbp]
        movdqu  xmm13,XMMWORD[32+rbp]
DB      102,65,15,56,223,255
DB      102,68,15,56,223,193
        movdqu  xmm14,XMMWORD[48+rbp]
        movdqu  xmm15,XMMWORD[64+rbp]
DB      102,69,15,56,223,202
        movdqa  xmm10,xmm0
        movdqu  xmm1,XMMWORD[80+rbp]
        movups  xmm0,XMMWORD[((-112))+rcx]

        movups  XMMWORD[rsi],xmm2
        movdqa  xmm2,xmm11
        movups  XMMWORD[16+rsi],xmm3
        movdqa  xmm3,xmm12
        movups  XMMWORD[32+rsi],xmm4
        movdqa  xmm4,xmm13
        movups  XMMWORD[48+rsi],xmm5
        movdqa  xmm5,xmm14
        movups  XMMWORD[64+rsi],xmm6
        movdqa  xmm6,xmm15
        movups  XMMWORD[80+rsi],xmm7
        movdqa  xmm7,xmm1
        movups  XMMWORD[96+rsi],xmm8
        lea     rsi,[112+rsi]

        sub     rdx,0x80
        ja      NEAR $L$cbc_dec_loop8

        movaps  xmm2,xmm9
        lea     rcx,[((-112))+rcx]
        add     rdx,0x70
        jle     NEAR $L$cbc_dec_clear_tail_collected
        movups  XMMWORD[rsi],xmm9
        lea     rsi,[16+rsi]
        cmp     rdx,0x50
        jbe     NEAR $L$cbc_dec_tail

        movaps  xmm2,xmm11
$L$cbc_dec_six_or_seven:
        cmp     rdx,0x60
        ja      NEAR $L$cbc_dec_seven

        movaps  xmm8,xmm7
        call    _aesni_decrypt6
        pxor    xmm2,xmm10
        movaps  xmm10,xmm8
        pxor    xmm3,xmm11
        movdqu  XMMWORD[rsi],xmm2
        pxor    xmm4,xmm12
        movdqu  XMMWORD[16+rsi],xmm3
        pxor    xmm3,xmm3
        pxor    xmm5,xmm13
        movdqu  XMMWORD[32+rsi],xmm4
        pxor    xmm4,xmm4
        pxor    xmm6,xmm14
        movdqu  XMMWORD[48+rsi],xmm5
        pxor    xmm5,xmm5
        pxor    xmm7,xmm15
        movdqu  XMMWORD[64+rsi],xmm6
        pxor    xmm6,xmm6
        lea     rsi,[80+rsi]
        movdqa  xmm2,xmm7
        pxor    xmm7,xmm7
        jmp     NEAR $L$cbc_dec_tail_collected

ALIGN   16
$L$cbc_dec_seven:
        movups  xmm8,XMMWORD[96+rdi]
        xorps   xmm9,xmm9
        call    _aesni_decrypt8
        movups  xmm9,XMMWORD[80+rdi]
        pxor    xmm2,xmm10
        movups  xmm10,XMMWORD[96+rdi]
        pxor    xmm3,xmm11
        movdqu  XMMWORD[rsi],xmm2
        pxor    xmm4,xmm12
        movdqu  XMMWORD[16+rsi],xmm3
        pxor    xmm3,xmm3
        pxor    xmm5,xmm13
        movdqu  XMMWORD[32+rsi],xmm4
        pxor    xmm4,xmm4
        pxor    xmm6,xmm14
        movdqu  XMMWORD[48+rsi],xmm5
        pxor    xmm5,xmm5
        pxor    xmm7,xmm15
        movdqu  XMMWORD[64+rsi],xmm6
        pxor    xmm6,xmm6
        pxor    xmm8,xmm9
        movdqu  XMMWORD[80+rsi],xmm7
        pxor    xmm7,xmm7
        lea     rsi,[96+rsi]
        movdqa  xmm2,xmm8
        pxor    xmm8,xmm8
        pxor    xmm9,xmm9
        jmp     NEAR $L$cbc_dec_tail_collected

ALIGN   16
$L$cbc_dec_loop6:
        movups  XMMWORD[rsi],xmm7
        lea     rsi,[16+rsi]
        movdqu  xmm2,XMMWORD[rdi]
        movdqu  xmm3,XMMWORD[16+rdi]
        movdqa  xmm11,xmm2
        movdqu  xmm4,XMMWORD[32+rdi]
        movdqa  xmm12,xmm3
        movdqu  xmm5,XMMWORD[48+rdi]
        movdqa  xmm13,xmm4
        movdqu  xmm6,XMMWORD[64+rdi]
        movdqa  xmm14,xmm5
        movdqu  xmm7,XMMWORD[80+rdi]
        movdqa  xmm15,xmm6
$L$cbc_dec_loop6_enter:
        lea     rdi,[96+rdi]
        movdqa  xmm8,xmm7

        call    _aesni_decrypt6

        pxor    xmm2,xmm10
        movdqa  xmm10,xmm8
        pxor    xmm3,xmm11
        movdqu  XMMWORD[rsi],xmm2
        pxor    xmm4,xmm12
        movdqu  XMMWORD[16+rsi],xmm3
        pxor    xmm5,xmm13
        movdqu  XMMWORD[32+rsi],xmm4
        pxor    xmm6,xmm14
        mov     rcx,rbp
        movdqu  XMMWORD[48+rsi],xmm5
        pxor    xmm7,xmm15
        mov     eax,r10d
        movdqu  XMMWORD[64+rsi],xmm6
        lea     rsi,[80+rsi]
        sub     rdx,0x60
        ja      NEAR $L$cbc_dec_loop6

        movdqa  xmm2,xmm7
        add     rdx,0x50
        jle     NEAR $L$cbc_dec_clear_tail_collected
        movups  XMMWORD[rsi],xmm7
        lea     rsi,[16+rsi]

$L$cbc_dec_tail:
        movups  xmm2,XMMWORD[rdi]
        sub     rdx,0x10
        jbe     NEAR $L$cbc_dec_one

        movups  xmm3,XMMWORD[16+rdi]
        movaps  xmm11,xmm2
        sub     rdx,0x10
        jbe     NEAR $L$cbc_dec_two

        movups  xmm4,XMMWORD[32+rdi]
        movaps  xmm12,xmm3
        sub     rdx,0x10
        jbe     NEAR $L$cbc_dec_three

        movups  xmm5,XMMWORD[48+rdi]
        movaps  xmm13,xmm4
        sub     rdx,0x10
        jbe     NEAR $L$cbc_dec_four

        movups  xmm6,XMMWORD[64+rdi]
        movaps  xmm14,xmm5
        movaps  xmm15,xmm6
        xorps   xmm7,xmm7
        call    _aesni_decrypt6
        pxor    xmm2,xmm10
        movaps  xmm10,xmm15
        pxor    xmm3,xmm11
        movdqu  XMMWORD[rsi],xmm2
        pxor    xmm4,xmm12
        movdqu  XMMWORD[16+rsi],xmm3
        pxor    xmm3,xmm3
        pxor    xmm5,xmm13
        movdqu  XMMWORD[32+rsi],xmm4
        pxor    xmm4,xmm4
        pxor    xmm6,xmm14
        movdqu  XMMWORD[48+rsi],xmm5
        pxor    xmm5,xmm5
        lea     rsi,[64+rsi]
        movdqa  xmm2,xmm6
        pxor    xmm6,xmm6
        pxor    xmm7,xmm7
        sub     rdx,0x10
        jmp     NEAR $L$cbc_dec_tail_collected

ALIGN   16
$L$cbc_dec_one:
        movaps  xmm11,xmm2
        movups  xmm0,XMMWORD[rcx]
        movups  xmm1,XMMWORD[16+rcx]
        lea     rcx,[32+rcx]
        xorps   xmm2,xmm0
$L$oop_dec1_17:
DB      102,15,56,222,209
        dec     eax
        movups  xmm1,XMMWORD[rcx]
        lea     rcx,[16+rcx]
        jnz     NEAR $L$oop_dec1_17
DB      102,15,56,223,209
        xorps   xmm2,xmm10
        movaps  xmm10,xmm11
        jmp     NEAR $L$cbc_dec_tail_collected
ALIGN   16
$L$cbc_dec_two:
        movaps  xmm12,xmm3
        call    _aesni_decrypt2
        pxor    xmm2,xmm10
        movaps  xmm10,xmm12
        pxor    xmm3,xmm11
        movdqu  XMMWORD[rsi],xmm2
        movdqa  xmm2,xmm3
        pxor    xmm3,xmm3
        lea     rsi,[16+rsi]
        jmp     NEAR $L$cbc_dec_tail_collected
ALIGN   16
$L$cbc_dec_three:
        movaps  xmm13,xmm4
        call    _aesni_decrypt3
        pxor    xmm2,xmm10
        movaps  xmm10,xmm13
        pxor    xmm3,xmm11
        movdqu  XMMWORD[rsi],xmm2
        pxor    xmm4,xmm12
        movdqu  XMMWORD[16+rsi],xmm3
        pxor    xmm3,xmm3
        movdqa  xmm2,xmm4
        pxor    xmm4,xmm4
        lea     rsi,[32+rsi]
        jmp     NEAR $L$cbc_dec_tail_collected
ALIGN   16
$L$cbc_dec_four:
        movaps  xmm14,xmm5
        call    _aesni_decrypt4
        pxor    xmm2,xmm10
        movaps  xmm10,xmm14
        pxor    xmm3,xmm11
        movdqu  XMMWORD[rsi],xmm2
        pxor    xmm4,xmm12
        movdqu  XMMWORD[16+rsi],xmm3
        pxor    xmm3,xmm3
        pxor    xmm5,xmm13
        movdqu  XMMWORD[32+rsi],xmm4
        pxor    xmm4,xmm4
        movdqa  xmm2,xmm5
        pxor    xmm5,xmm5
        lea     rsi,[48+rsi]
        jmp     NEAR $L$cbc_dec_tail_collected

ALIGN   16
$L$cbc_dec_clear_tail_collected:
        pxor    xmm3,xmm3
        pxor    xmm4,xmm4
        pxor    xmm5,xmm5
$L$cbc_dec_tail_collected:
        movups  XMMWORD[r8],xmm10
        and     rdx,15
        jnz     NEAR $L$cbc_dec_tail_partial
        movups  XMMWORD[rsi],xmm2
        pxor    xmm2,xmm2
        jmp     NEAR $L$cbc_dec_ret
ALIGN   16
$L$cbc_dec_tail_partial:
        movaps  XMMWORD[rsp],xmm2
        pxor    xmm2,xmm2
        mov     rcx,16
        mov     rdi,rsi
        sub     rcx,rdx
        lea     rsi,[rsp]
        DD      0x9066A4F3
        movdqa  XMMWORD[rsp],xmm2

$L$cbc_dec_ret:
        xorps   xmm0,xmm0
        pxor    xmm1,xmm1
        movaps  xmm6,XMMWORD[16+rsp]
        movaps  XMMWORD[16+rsp],xmm0
        movaps  xmm7,XMMWORD[32+rsp]
        movaps  XMMWORD[32+rsp],xmm0
        movaps  xmm8,XMMWORD[48+rsp]
        movaps  XMMWORD[48+rsp],xmm0
        movaps  xmm9,XMMWORD[64+rsp]
        movaps  XMMWORD[64+rsp],xmm0
        movaps  xmm10,XMMWORD[80+rsp]
        movaps  XMMWORD[80+rsp],xmm0
        movaps  xmm11,XMMWORD[96+rsp]
        movaps  XMMWORD[96+rsp],xmm0
        movaps  xmm12,XMMWORD[112+rsp]
        movaps  XMMWORD[112+rsp],xmm0
        movaps  xmm13,XMMWORD[128+rsp]
        movaps  XMMWORD[128+rsp],xmm0
        movaps  xmm14,XMMWORD[144+rsp]
        movaps  XMMWORD[144+rsp],xmm0
        movaps  xmm15,XMMWORD[160+rsp]
        movaps  XMMWORD[160+rsp],xmm0
        mov     rbp,QWORD[((-8))+r11]

        lea     rsp,[r11]

$L$cbc_ret:
        mov     rdi,QWORD[8+rsp]        ;WIN64 epilogue
        mov     rsi,QWORD[16+rsp]
        DB      0F3h,0C3h               ;repret

$L$SEH_end_aesni_cbc_encrypt:
global  aesni_set_decrypt_key

ALIGN   16
aesni_set_decrypt_key:

DB      0x48,0x83,0xEC,0x08

        call    __aesni_set_encrypt_key
        shl     edx,4
        test    eax,eax
        jnz     NEAR $L$dec_key_ret
        lea     rcx,[16+rdx*1+r8]

        movups  xmm0,XMMWORD[r8]
        movups  xmm1,XMMWORD[rcx]
        movups  XMMWORD[rcx],xmm0
        movups  XMMWORD[r8],xmm1
        lea     r8,[16+r8]
        lea     rcx,[((-16))+rcx]

$L$dec_key_inverse:
        movups  xmm0,XMMWORD[r8]
        movups  xmm1,XMMWORD[rcx]
DB      102,15,56,219,192
DB      102,15,56,219,201
        lea     r8,[16+r8]
        lea     rcx,[((-16))+rcx]
        movups  XMMWORD[16+rcx],xmm0
        movups  XMMWORD[(-16)+r8],xmm1
        cmp     rcx,r8
        ja      NEAR $L$dec_key_inverse

        movups  xmm0,XMMWORD[r8]
DB      102,15,56,219,192
        pxor    xmm1,xmm1
        movups  XMMWORD[rcx],xmm0
        pxor    xmm0,xmm0
$L$dec_key_ret:
        add     rsp,8

        DB      0F3h,0C3h               ;repret

$L$SEH_end_set_decrypt_key:

global  aesni_set_encrypt_key

ALIGN   16
aesni_set_encrypt_key:
__aesni_set_encrypt_key:

DB      0x48,0x83,0xEC,0x08

        mov     rax,-1
        test    rcx,rcx
        jz      NEAR $L$enc_key_ret
        test    r8,r8
        jz      NEAR $L$enc_key_ret

        mov     r10d,268437504
        movups  xmm0,XMMWORD[rcx]
        xorps   xmm4,xmm4
        and     r10d,DWORD[((OPENSSL_ia32cap_P+4))]
        lea     rax,[16+r8]
        cmp     edx,256
        je      NEAR $L$14rounds
        cmp     edx,192
        je      NEAR $L$12rounds
        cmp     edx,128
        jne     NEAR $L$bad_keybits

$L$10rounds:
        mov     edx,9
        cmp     r10d,268435456
        je      NEAR $L$10rounds_alt

        movups  XMMWORD[r8],xmm0
DB      102,15,58,223,200,1
        call    $L$key_expansion_128_cold
DB      102,15,58,223,200,2
        call    $L$key_expansion_128
DB      102,15,58,223,200,4
        call    $L$key_expansion_128
DB      102,15,58,223,200,8
        call    $L$key_expansion_128
DB      102,15,58,223,200,16
        call    $L$key_expansion_128
DB      102,15,58,223,200,32
        call    $L$key_expansion_128
DB      102,15,58,223,200,64
        call    $L$key_expansion_128
DB      102,15,58,223,200,128
        call    $L$key_expansion_128
DB      102,15,58,223,200,27
        call    $L$key_expansion_128
DB      102,15,58,223,200,54
        call    $L$key_expansion_128
        movups  XMMWORD[rax],xmm0
        mov     DWORD[80+rax],edx
        xor     eax,eax
        jmp     NEAR $L$enc_key_ret

ALIGN   16
$L$10rounds_alt:
        movdqa  xmm5,XMMWORD[$L$key_rotate]
        mov     r10d,8
        movdqa  xmm4,XMMWORD[$L$key_rcon1]
        movdqa  xmm2,xmm0
        movdqu  XMMWORD[r8],xmm0
        jmp     NEAR $L$oop_key128

ALIGN   16
$L$oop_key128:
DB      102,15,56,0,197
DB      102,15,56,221,196
        pslld   xmm4,1
        lea     rax,[16+rax]

        movdqa  xmm3,xmm2
        pslldq  xmm2,4
        pxor    xmm3,xmm2
        pslldq  xmm2,4
        pxor    xmm3,xmm2
        pslldq  xmm2,4
        pxor    xmm2,xmm3

        pxor    xmm0,xmm2
        movdqu  XMMWORD[(-16)+rax],xmm0
        movdqa  xmm2,xmm0

        dec     r10d
        jnz     NEAR $L$oop_key128

        movdqa  xmm4,XMMWORD[$L$key_rcon1b]

DB      102,15,56,0,197
DB      102,15,56,221,196
        pslld   xmm4,1

        movdqa  xmm3,xmm2
        pslldq  xmm2,4
        pxor    xmm3,xmm2
        pslldq  xmm2,4
        pxor    xmm3,xmm2
        pslldq  xmm2,4
        pxor    xmm2,xmm3

        pxor    xmm0,xmm2
        movdqu  XMMWORD[rax],xmm0

        movdqa  xmm2,xmm0
DB      102,15,56,0,197
DB      102,15,56,221,196

        movdqa  xmm3,xmm2
        pslldq  xmm2,4
        pxor    xmm3,xmm2
        pslldq  xmm2,4
        pxor    xmm3,xmm2
        pslldq  xmm2,4
        pxor    xmm2,xmm3

        pxor    xmm0,xmm2
        movdqu  XMMWORD[16+rax],xmm0

        mov     DWORD[96+rax],edx
        xor     eax,eax
        jmp     NEAR $L$enc_key_ret

ALIGN   16
$L$12rounds:
        movq    xmm2,QWORD[16+rcx]
        mov     edx,11
        cmp     r10d,268435456
        je      NEAR $L$12rounds_alt

        movups  XMMWORD[r8],xmm0
DB      102,15,58,223,202,1
        call    $L$key_expansion_192a_cold
DB      102,15,58,223,202,2
        call    $L$key_expansion_192b
DB      102,15,58,223,202,4
        call    $L$key_expansion_192a
DB      102,15,58,223,202,8
        call    $L$key_expansion_192b
DB      102,15,58,223,202,16
        call    $L$key_expansion_192a
DB      102,15,58,223,202,32
        call    $L$key_expansion_192b
DB      102,15,58,223,202,64
        call    $L$key_expansion_192a
DB      102,15,58,223,202,128
        call    $L$key_expansion_192b
        movups  XMMWORD[rax],xmm0
        mov     DWORD[48+rax],edx
        xor     rax,rax
        jmp     NEAR $L$enc_key_ret

ALIGN   16
$L$12rounds_alt:
        movdqa  xmm5,XMMWORD[$L$key_rotate192]
        movdqa  xmm4,XMMWORD[$L$key_rcon1]
        mov     r10d,8
        movdqu  XMMWORD[r8],xmm0
        jmp     NEAR $L$oop_key192

ALIGN   16
$L$oop_key192:
        movq    QWORD[rax],xmm2
        movdqa  xmm1,xmm2
DB      102,15,56,0,213
DB      102,15,56,221,212
        pslld   xmm4,1
        lea     rax,[24+rax]

        movdqa  xmm3,xmm0
        pslldq  xmm0,4
        pxor    xmm3,xmm0
        pslldq  xmm0,4
        pxor    xmm3,xmm0
        pslldq  xmm0,4
        pxor    xmm0,xmm3

        pshufd  xmm3,xmm0,0xff
        pxor    xmm3,xmm1
        pslldq  xmm1,4
        pxor    xmm3,xmm1

        pxor    xmm0,xmm2
        pxor    xmm2,xmm3
        movdqu  XMMWORD[(-16)+rax],xmm0

        dec     r10d
        jnz     NEAR $L$oop_key192

        mov     DWORD[32+rax],edx
        xor     eax,eax
        jmp     NEAR $L$enc_key_ret

ALIGN   16
$L$14rounds:
        movups  xmm2,XMMWORD[16+rcx]
        mov     edx,13
        lea     rax,[16+rax]
        cmp     r10d,268435456
        je      NEAR $L$14rounds_alt

        movups  XMMWORD[r8],xmm0
        movups  XMMWORD[16+r8],xmm2
DB      102,15,58,223,202,1
        call    $L$key_expansion_256a_cold
DB      102,15,58,223,200,1
        call    $L$key_expansion_256b
DB      102,15,58,223,202,2
        call    $L$key_expansion_256a
DB      102,15,58,223,200,2
        call    $L$key_expansion_256b
DB      102,15,58,223,202,4
        call    $L$key_expansion_256a
DB      102,15,58,223,200,4
        call    $L$key_expansion_256b
DB      102,15,58,223,202,8
        call    $L$key_expansion_256a
DB      102,15,58,223,200,8
        call    $L$key_expansion_256b
DB      102,15,58,223,202,16
        call    $L$key_expansion_256a
DB      102,15,58,223,200,16
        call    $L$key_expansion_256b
DB      102,15,58,223,202,32
        call    $L$key_expansion_256a
DB      102,15,58,223,200,32
        call    $L$key_expansion_256b
DB      102,15,58,223,202,64
        call    $L$key_expansion_256a
        movups  XMMWORD[rax],xmm0
        mov     DWORD[16+rax],edx
        xor     rax,rax
        jmp     NEAR $L$enc_key_ret

ALIGN   16
$L$14rounds_alt:
        movdqa  xmm5,XMMWORD[$L$key_rotate]
        movdqa  xmm4,XMMWORD[$L$key_rcon1]
        mov     r10d,7
        movdqu  XMMWORD[r8],xmm0
        movdqa  xmm1,xmm2
        movdqu  XMMWORD[16+r8],xmm2
        jmp     NEAR $L$oop_key256

ALIGN   16
$L$oop_key256:
DB      102,15,56,0,213
DB      102,15,56,221,212

        movdqa  xmm3,xmm0
        pslldq  xmm0,4
        pxor    xmm3,xmm0
        pslldq  xmm0,4
        pxor    xmm3,xmm0
        pslldq  xmm0,4
        pxor    xmm0,xmm3
        pslld   xmm4,1

        pxor    xmm0,xmm2
        movdqu  XMMWORD[rax],xmm0

        dec     r10d
        jz      NEAR $L$done_key256

        pshufd  xmm2,xmm0,0xff
        pxor    xmm3,xmm3
DB      102,15,56,221,211

        movdqa  xmm3,xmm1
        pslldq  xmm1,4
        pxor    xmm3,xmm1
        pslldq  xmm1,4
        pxor    xmm3,xmm1
        pslldq  xmm1,4
        pxor    xmm1,xmm3

        pxor    xmm2,xmm1
        movdqu  XMMWORD[16+rax],xmm2
        lea     rax,[32+rax]
        movdqa  xmm1,xmm2

        jmp     NEAR $L$oop_key256

$L$done_key256:
        mov     DWORD[16+rax],edx
        xor     eax,eax
        jmp     NEAR $L$enc_key_ret

ALIGN   16
$L$bad_keybits:
        mov     rax,-2
$L$enc_key_ret:
        pxor    xmm0,xmm0
        pxor    xmm1,xmm1
        pxor    xmm2,xmm2
        pxor    xmm3,xmm3
        pxor    xmm4,xmm4
        pxor    xmm5,xmm5
        add     rsp,8

        DB      0F3h,0C3h               ;repret
$L$SEH_end_set_encrypt_key:

ALIGN   16
$L$key_expansion_128:
        movups  XMMWORD[rax],xmm0
        lea     rax,[16+rax]
$L$key_expansion_128_cold:
        shufps  xmm4,xmm0,16
        xorps   xmm0,xmm4
        shufps  xmm4,xmm0,140
        xorps   xmm0,xmm4
        shufps  xmm1,xmm1,255
        xorps   xmm0,xmm1
        DB      0F3h,0C3h               ;repret

ALIGN   16
$L$key_expansion_192a:
        movups  XMMWORD[rax],xmm0
        lea     rax,[16+rax]
$L$key_expansion_192a_cold:
        movaps  xmm5,xmm2
$L$key_expansion_192b_warm:
        shufps  xmm4,xmm0,16
        movdqa  xmm3,xmm2
        xorps   xmm0,xmm4
        shufps  xmm4,xmm0,140
        pslldq  xmm3,4
        xorps   xmm0,xmm4
        pshufd  xmm1,xmm1,85
        pxor    xmm2,xmm3
        pxor    xmm0,xmm1
        pshufd  xmm3,xmm0,255
        pxor    xmm2,xmm3
        DB      0F3h,0C3h               ;repret

ALIGN   16
$L$key_expansion_192b:
        movaps  xmm3,xmm0
        shufps  xmm5,xmm0,68
        movups  XMMWORD[rax],xmm5
        shufps  xmm3,xmm2,78
        movups  XMMWORD[16+rax],xmm3
        lea     rax,[32+rax]
        jmp     NEAR $L$key_expansion_192b_warm

ALIGN   16
$L$key_expansion_256a:
        movups  XMMWORD[rax],xmm2
        lea     rax,[16+rax]
$L$key_expansion_256a_cold:
        shufps  xmm4,xmm0,16
        xorps   xmm0,xmm4
        shufps  xmm4,xmm0,140
        xorps   xmm0,xmm4
        shufps  xmm1,xmm1,255
        xorps   xmm0,xmm1
        DB      0F3h,0C3h               ;repret

ALIGN   16
$L$key_expansion_256b:
        movups  XMMWORD[rax],xmm0
        lea     rax,[16+rax]

        shufps  xmm4,xmm2,16
        xorps   xmm2,xmm4
        shufps  xmm4,xmm2,140
        xorps   xmm2,xmm4
        shufps  xmm1,xmm1,170
        xorps   xmm2,xmm1
        DB      0F3h,0C3h               ;repret



section .rdata rdata align=64
ALIGN   64
$L$bswap_mask:
DB      15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
$L$increment32:
        DD      6,6,6,0
$L$increment64:
        DD      1,0,0,0
$L$xts_magic:
        DD      0x87,0,1,0
$L$increment1:
DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
$L$key_rotate:
        DD      0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d
$L$key_rotate192:
        DD      0x04070605,0x04070605,0x04070605,0x04070605
$L$key_rcon1:
        DD      1,1,1,1
$L$key_rcon1b:
        DD      0x1b,0x1b,0x1b,0x1b

DB      65,69,83,32,102,111,114,32,73,110,116,101,108,32,65,69
DB      83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83
DB      32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115
DB      115,108,46,111,114,103,62,0
ALIGN   64
section .text
EXTERN  __imp_RtlVirtualUnwind

ALIGN   16
ecb_ccm64_se_handler:
        push    rsi
        push    rdi
        push    rbx
        push    rbp
        push    r12
        push    r13
        push    r14
        push    r15
        pushfq
        sub     rsp,64

        mov     rax,QWORD[120+r8]
        mov     rbx,QWORD[248+r8]

        mov     rsi,QWORD[8+r9]
        mov     r11,QWORD[56+r9]

        mov     r10d,DWORD[r11]
        lea     r10,[r10*1+rsi]
        cmp     rbx,r10
        jb      NEAR $L$common_seh_tail

        mov     rax,QWORD[152+r8]

        mov     r10d,DWORD[4+r11]
        lea     r10,[r10*1+rsi]
        cmp     rbx,r10
        jae     NEAR $L$common_seh_tail

        lea     rsi,[rax]
        lea     rdi,[512+r8]
        mov     ecx,8
        DD      0xa548f3fc
        lea     rax,[88+rax]

        jmp     NEAR $L$common_seh_tail



ALIGN   16
ctr_xts_se_handler:
        push    rsi
        push    rdi
        push    rbx
        push    rbp
        push    r12
        push    r13
        push    r14
        push    r15
        pushfq
        sub     rsp,64

        mov     rax,QWORD[120+r8]
        mov     rbx,QWORD[248+r8]

        mov     rsi,QWORD[8+r9]
        mov     r11,QWORD[56+r9]

        mov     r10d,DWORD[r11]
        lea     r10,[r10*1+rsi]
        cmp     rbx,r10
        jb      NEAR $L$common_seh_tail

        mov     rax,QWORD[152+r8]

        mov     r10d,DWORD[4+r11]
        lea     r10,[r10*1+rsi]
        cmp     rbx,r10
        jae     NEAR $L$common_seh_tail

        mov     rax,QWORD[208+r8]

        lea     rsi,[((-168))+rax]
        lea     rdi,[512+r8]
        mov     ecx,20
        DD      0xa548f3fc

        mov     rbp,QWORD[((-8))+rax]
        mov     QWORD[160+r8],rbp
        jmp     NEAR $L$common_seh_tail



ALIGN   16
ocb_se_handler:
        push    rsi
        push    rdi
        push    rbx
        push    rbp
        push    r12
        push    r13
        push    r14
        push    r15
        pushfq
        sub     rsp,64

        mov     rax,QWORD[120+r8]
        mov     rbx,QWORD[248+r8]

        mov     rsi,QWORD[8+r9]
        mov     r11,QWORD[56+r9]

        mov     r10d,DWORD[r11]
        lea     r10,[r10*1+rsi]
        cmp     rbx,r10
        jb      NEAR $L$common_seh_tail

        mov     r10d,DWORD[4+r11]
        lea     r10,[r10*1+rsi]
        cmp     rbx,r10
        jae     NEAR $L$common_seh_tail

        mov     r10d,DWORD[8+r11]
        lea     r10,[r10*1+rsi]
        cmp     rbx,r10
        jae     NEAR $L$ocb_no_xmm

        mov     rax,QWORD[152+r8]

        lea     rsi,[rax]
        lea     rdi,[512+r8]
        mov     ecx,20
        DD      0xa548f3fc
        lea     rax,[((160+40))+rax]

$L$ocb_no_xmm:
        mov     rbx,QWORD[((-8))+rax]
        mov     rbp,QWORD[((-16))+rax]
        mov     r12,QWORD[((-24))+rax]
        mov     r13,QWORD[((-32))+rax]
        mov     r14,QWORD[((-40))+rax]

        mov     QWORD[144+r8],rbx
        mov     QWORD[160+r8],rbp
        mov     QWORD[216+r8],r12
        mov     QWORD[224+r8],r13
        mov     QWORD[232+r8],r14

        jmp     NEAR $L$common_seh_tail


ALIGN   16
cbc_se_handler:
        push    rsi
        push    rdi
        push    rbx
        push    rbp
        push    r12
        push    r13
        push    r14
        push    r15
        pushfq
        sub     rsp,64

        mov     rax,QWORD[152+r8]
        mov     rbx,QWORD[248+r8]

        lea     r10,[$L$cbc_decrypt_bulk]
        cmp     rbx,r10
        jb      NEAR $L$common_seh_tail

        mov     rax,QWORD[120+r8]

        lea     r10,[$L$cbc_decrypt_body]
        cmp     rbx,r10
        jb      NEAR $L$common_seh_tail

        mov     rax,QWORD[152+r8]

        lea     r10,[$L$cbc_ret]
        cmp     rbx,r10
        jae     NEAR $L$common_seh_tail

        lea     rsi,[16+rax]
        lea     rdi,[512+r8]
        mov     ecx,20
        DD      0xa548f3fc

        mov     rax,QWORD[208+r8]

        mov     rbp,QWORD[((-8))+rax]
        mov     QWORD[160+r8],rbp

$L$common_seh_tail:
        mov     rdi,QWORD[8+rax]
        mov     rsi,QWORD[16+rax]
        mov     QWORD[152+r8],rax
        mov     QWORD[168+r8],rsi
        mov     QWORD[176+r8],rdi

        mov     rdi,QWORD[40+r9]
        mov     rsi,r8
        mov     ecx,154
        DD      0xa548f3fc

        mov     rsi,r9
        xor     rcx,rcx
        mov     rdx,QWORD[8+rsi]
        mov     r8,QWORD[rsi]
        mov     r9,QWORD[16+rsi]
        mov     r10,QWORD[40+rsi]
        lea     r11,[56+rsi]
        lea     r12,[24+rsi]
        mov     QWORD[32+rsp],r10
        mov     QWORD[40+rsp],r11
        mov     QWORD[48+rsp],r12
        mov     QWORD[56+rsp],rcx
        call    QWORD[__imp_RtlVirtualUnwind]

        mov     eax,1
        add     rsp,64
        popfq
        pop     r15
        pop     r14
        pop     r13
        pop     r12
        pop     rbp
        pop     rbx
        pop     rdi
        pop     rsi
        DB      0F3h,0C3h               ;repret


section .pdata rdata align=4
ALIGN   4
        DD      $L$SEH_begin_aesni_ecb_encrypt wrt ..imagebase
        DD      $L$SEH_end_aesni_ecb_encrypt wrt ..imagebase
        DD      $L$SEH_info_ecb wrt ..imagebase

        DD      $L$SEH_begin_aesni_ccm64_encrypt_blocks wrt ..imagebase
        DD      $L$SEH_end_aesni_ccm64_encrypt_blocks wrt ..imagebase
        DD      $L$SEH_info_ccm64_enc wrt ..imagebase

        DD      $L$SEH_begin_aesni_ccm64_decrypt_blocks wrt ..imagebase
        DD      $L$SEH_end_aesni_ccm64_decrypt_blocks wrt ..imagebase
        DD      $L$SEH_info_ccm64_dec wrt ..imagebase

        DD      $L$SEH_begin_aesni_ctr32_encrypt_blocks wrt ..imagebase
        DD      $L$SEH_end_aesni_ctr32_encrypt_blocks wrt ..imagebase
        DD      $L$SEH_info_ctr32 wrt ..imagebase

        DD      $L$SEH_begin_aesni_xts_encrypt wrt ..imagebase
        DD      $L$SEH_end_aesni_xts_encrypt wrt ..imagebase
        DD      $L$SEH_info_xts_enc wrt ..imagebase

        DD      $L$SEH_begin_aesni_xts_decrypt wrt ..imagebase
        DD      $L$SEH_end_aesni_xts_decrypt wrt ..imagebase
        DD      $L$SEH_info_xts_dec wrt ..imagebase

        DD      $L$SEH_begin_aesni_ocb_encrypt wrt ..imagebase
        DD      $L$SEH_end_aesni_ocb_encrypt wrt ..imagebase
        DD      $L$SEH_info_ocb_enc wrt ..imagebase

        DD      $L$SEH_begin_aesni_ocb_decrypt wrt ..imagebase
        DD      $L$SEH_end_aesni_ocb_decrypt wrt ..imagebase
        DD      $L$SEH_info_ocb_dec wrt ..imagebase
        DD      $L$SEH_begin_aesni_cbc_encrypt wrt ..imagebase
        DD      $L$SEH_end_aesni_cbc_encrypt wrt ..imagebase
        DD      $L$SEH_info_cbc wrt ..imagebase

        DD      aesni_set_decrypt_key wrt ..imagebase
        DD      $L$SEH_end_set_decrypt_key wrt ..imagebase
        DD      $L$SEH_info_key wrt ..imagebase

        DD      aesni_set_encrypt_key wrt ..imagebase
        DD      $L$SEH_end_set_encrypt_key wrt ..imagebase
        DD      $L$SEH_info_key wrt ..imagebase
section .xdata rdata align=8
ALIGN   8
$L$SEH_info_ecb:
DB      9,0,0,0
        DD      ecb_ccm64_se_handler wrt ..imagebase
        DD      $L$ecb_enc_body wrt ..imagebase,$L$ecb_enc_ret wrt ..imagebase
$L$SEH_info_ccm64_enc:
DB      9,0,0,0
        DD      ecb_ccm64_se_handler wrt ..imagebase
        DD      $L$ccm64_enc_body wrt ..imagebase,$L$ccm64_enc_ret wrt ..imagebase
$L$SEH_info_ccm64_dec:
DB      9,0,0,0
        DD      ecb_ccm64_se_handler wrt ..imagebase
        DD      $L$ccm64_dec_body wrt ..imagebase,$L$ccm64_dec_ret wrt ..imagebase
$L$SEH_info_ctr32:
DB      9,0,0,0
        DD      ctr_xts_se_handler wrt ..imagebase
        DD      $L$ctr32_body wrt ..imagebase,$L$ctr32_epilogue wrt ..imagebase
$L$SEH_info_xts_enc:
DB      9,0,0,0
        DD      ctr_xts_se_handler wrt ..imagebase
        DD      $L$xts_enc_body wrt ..imagebase,$L$xts_enc_epilogue wrt ..imagebase
$L$SEH_info_xts_dec:
DB      9,0,0,0
        DD      ctr_xts_se_handler wrt ..imagebase
        DD      $L$xts_dec_body wrt ..imagebase,$L$xts_dec_epilogue wrt ..imagebase
$L$SEH_info_ocb_enc:
DB      9,0,0,0
        DD      ocb_se_handler wrt ..imagebase
        DD      $L$ocb_enc_body wrt ..imagebase,$L$ocb_enc_epilogue wrt ..imagebase
        DD      $L$ocb_enc_pop wrt ..imagebase
        DD      0
$L$SEH_info_ocb_dec:
DB      9,0,0,0
        DD      ocb_se_handler wrt ..imagebase
        DD      $L$ocb_dec_body wrt ..imagebase,$L$ocb_dec_epilogue wrt ..imagebase
        DD      $L$ocb_dec_pop wrt ..imagebase
        DD      0
$L$SEH_info_cbc:
DB      9,0,0,0
        DD      cbc_se_handler wrt ..imagebase
$L$SEH_info_key:
DB      0x01,0x04,0x01,0x00
DB      0x04,0x02,0x00,0x00
