nexmon – Rev 1

Subversion Repositories:
Rev:
#if defined(__x86_64__)
.text   





.p2align        6
_bsaes_encrypt8:
        leaq    L$BS0(%rip),%r11

        movdqa  (%rax),%xmm8
        leaq    16(%rax),%rax
        movdqa  80(%r11),%xmm7
        pxor    %xmm8,%xmm15
        pxor    %xmm8,%xmm0
        pxor    %xmm8,%xmm1
        pxor    %xmm8,%xmm2
.byte   102,68,15,56,0,255
.byte   102,15,56,0,199
        pxor    %xmm8,%xmm3
        pxor    %xmm8,%xmm4
.byte   102,15,56,0,207
.byte   102,15,56,0,215
        pxor    %xmm8,%xmm5
        pxor    %xmm8,%xmm6
.byte   102,15,56,0,223
.byte   102,15,56,0,231
.byte   102,15,56,0,239
.byte   102,15,56,0,247
_bsaes_encrypt8_bitslice:
        movdqa  0(%r11),%xmm7
        movdqa  16(%r11),%xmm8
        movdqa  %xmm5,%xmm9
        psrlq   $1,%xmm5
        movdqa  %xmm3,%xmm10
        psrlq   $1,%xmm3
        pxor    %xmm6,%xmm5
        pxor    %xmm4,%xmm3
        pand    %xmm7,%xmm5
        pand    %xmm7,%xmm3
        pxor    %xmm5,%xmm6
        psllq   $1,%xmm5
        pxor    %xmm3,%xmm4
        psllq   $1,%xmm3
        pxor    %xmm9,%xmm5
        pxor    %xmm10,%xmm3
        movdqa  %xmm1,%xmm9
        psrlq   $1,%xmm1
        movdqa  %xmm15,%xmm10
        psrlq   $1,%xmm15
        pxor    %xmm2,%xmm1
        pxor    %xmm0,%xmm15
        pand    %xmm7,%xmm1
        pand    %xmm7,%xmm15
        pxor    %xmm1,%xmm2
        psllq   $1,%xmm1
        pxor    %xmm15,%xmm0
        psllq   $1,%xmm15
        pxor    %xmm9,%xmm1
        pxor    %xmm10,%xmm15
        movdqa  32(%r11),%xmm7
        movdqa  %xmm4,%xmm9
        psrlq   $2,%xmm4
        movdqa  %xmm3,%xmm10
        psrlq   $2,%xmm3
        pxor    %xmm6,%xmm4
        pxor    %xmm5,%xmm3
        pand    %xmm8,%xmm4
        pand    %xmm8,%xmm3
        pxor    %xmm4,%xmm6
        psllq   $2,%xmm4
        pxor    %xmm3,%xmm5
        psllq   $2,%xmm3
        pxor    %xmm9,%xmm4
        pxor    %xmm10,%xmm3
        movdqa  %xmm0,%xmm9
        psrlq   $2,%xmm0
        movdqa  %xmm15,%xmm10
        psrlq   $2,%xmm15
        pxor    %xmm2,%xmm0
        pxor    %xmm1,%xmm15
        pand    %xmm8,%xmm0
        pand    %xmm8,%xmm15
        pxor    %xmm0,%xmm2
        psllq   $2,%xmm0
        pxor    %xmm15,%xmm1
        psllq   $2,%xmm15
        pxor    %xmm9,%xmm0
        pxor    %xmm10,%xmm15
        movdqa  %xmm2,%xmm9
        psrlq   $4,%xmm2
        movdqa  %xmm1,%xmm10
        psrlq   $4,%xmm1
        pxor    %xmm6,%xmm2
        pxor    %xmm5,%xmm1
        pand    %xmm7,%xmm2
        pand    %xmm7,%xmm1
        pxor    %xmm2,%xmm6
        psllq   $4,%xmm2
        pxor    %xmm1,%xmm5
        psllq   $4,%xmm1
        pxor    %xmm9,%xmm2
        pxor    %xmm10,%xmm1
        movdqa  %xmm0,%xmm9
        psrlq   $4,%xmm0
        movdqa  %xmm15,%xmm10
        psrlq   $4,%xmm15
        pxor    %xmm4,%xmm0
        pxor    %xmm3,%xmm15
        pand    %xmm7,%xmm0
        pand    %xmm7,%xmm15
        pxor    %xmm0,%xmm4
        psllq   $4,%xmm0
        pxor    %xmm15,%xmm3
        psllq   $4,%xmm15
        pxor    %xmm9,%xmm0
        pxor    %xmm10,%xmm15
        decl    %r10d
        jmp     L$enc_sbox
.p2align        4
L$enc_loop:
        pxor    0(%rax),%xmm15
        pxor    16(%rax),%xmm0
        pxor    32(%rax),%xmm1
        pxor    48(%rax),%xmm2
.byte   102,68,15,56,0,255
.byte   102,15,56,0,199
        pxor    64(%rax),%xmm3
        pxor    80(%rax),%xmm4
.byte   102,15,56,0,207
.byte   102,15,56,0,215
        pxor    96(%rax),%xmm5
        pxor    112(%rax),%xmm6
.byte   102,15,56,0,223
.byte   102,15,56,0,231
.byte   102,15,56,0,239
.byte   102,15,56,0,247
        leaq    128(%rax),%rax
L$enc_sbox:
        pxor    %xmm5,%xmm4
        pxor    %xmm0,%xmm1
        pxor    %xmm15,%xmm2
        pxor    %xmm1,%xmm5
        pxor    %xmm15,%xmm4

        pxor    %xmm2,%xmm5
        pxor    %xmm6,%xmm2
        pxor    %xmm4,%xmm6
        pxor    %xmm3,%xmm2
        pxor    %xmm4,%xmm3
        pxor    %xmm0,%xmm2

        pxor    %xmm6,%xmm1
        pxor    %xmm4,%xmm0
        movdqa  %xmm6,%xmm10
        movdqa  %xmm0,%xmm9
        movdqa  %xmm4,%xmm8
        movdqa  %xmm1,%xmm12
        movdqa  %xmm5,%xmm11

        pxor    %xmm3,%xmm10
        pxor    %xmm1,%xmm9
        pxor    %xmm2,%xmm8
        movdqa  %xmm10,%xmm13
        pxor    %xmm3,%xmm12
        movdqa  %xmm9,%xmm7
        pxor    %xmm15,%xmm11
        movdqa  %xmm10,%xmm14

        por     %xmm8,%xmm9
        por     %xmm11,%xmm10
        pxor    %xmm7,%xmm14
        pand    %xmm11,%xmm13
        pxor    %xmm8,%xmm11
        pand    %xmm8,%xmm7
        pand    %xmm11,%xmm14
        movdqa  %xmm2,%xmm11
        pxor    %xmm15,%xmm11
        pand    %xmm11,%xmm12
        pxor    %xmm12,%xmm10
        pxor    %xmm12,%xmm9
        movdqa  %xmm6,%xmm12
        movdqa  %xmm4,%xmm11
        pxor    %xmm0,%xmm12
        pxor    %xmm5,%xmm11
        movdqa  %xmm12,%xmm8
        pand    %xmm11,%xmm12
        por     %xmm11,%xmm8
        pxor    %xmm12,%xmm7
        pxor    %xmm14,%xmm10
        pxor    %xmm13,%xmm9
        pxor    %xmm14,%xmm8
        movdqa  %xmm1,%xmm11
        pxor    %xmm13,%xmm7
        movdqa  %xmm3,%xmm12
        pxor    %xmm13,%xmm8
        movdqa  %xmm0,%xmm13
        pand    %xmm2,%xmm11
        movdqa  %xmm6,%xmm14
        pand    %xmm15,%xmm12
        pand    %xmm4,%xmm13
        por     %xmm5,%xmm14
        pxor    %xmm11,%xmm10
        pxor    %xmm12,%xmm9
        pxor    %xmm13,%xmm8
        pxor    %xmm14,%xmm7





        movdqa  %xmm10,%xmm11
        pand    %xmm8,%xmm10
        pxor    %xmm9,%xmm11

        movdqa  %xmm7,%xmm13
        movdqa  %xmm11,%xmm14
        pxor    %xmm10,%xmm13
        pand    %xmm13,%xmm14

        movdqa  %xmm8,%xmm12
        pxor    %xmm9,%xmm14
        pxor    %xmm7,%xmm12

        pxor    %xmm9,%xmm10

        pand    %xmm10,%xmm12

        movdqa  %xmm13,%xmm9
        pxor    %xmm7,%xmm12

        pxor    %xmm12,%xmm9
        pxor    %xmm12,%xmm8

        pand    %xmm7,%xmm9

        pxor    %xmm9,%xmm13
        pxor    %xmm9,%xmm8

        pand    %xmm14,%xmm13

        pxor    %xmm11,%xmm13
        movdqa  %xmm5,%xmm11
        movdqa  %xmm4,%xmm7
        movdqa  %xmm14,%xmm9
        pxor    %xmm13,%xmm9
        pand    %xmm5,%xmm9
        pxor    %xmm4,%xmm5
        pand    %xmm14,%xmm4
        pand    %xmm13,%xmm5
        pxor    %xmm4,%xmm5
        pxor    %xmm9,%xmm4
        pxor    %xmm15,%xmm11
        pxor    %xmm2,%xmm7
        pxor    %xmm12,%xmm14
        pxor    %xmm8,%xmm13
        movdqa  %xmm14,%xmm10
        movdqa  %xmm12,%xmm9
        pxor    %xmm13,%xmm10
        pxor    %xmm8,%xmm9
        pand    %xmm11,%xmm10
        pand    %xmm15,%xmm9
        pxor    %xmm7,%xmm11
        pxor    %xmm2,%xmm15
        pand    %xmm14,%xmm7
        pand    %xmm12,%xmm2
        pand    %xmm13,%xmm11
        pand    %xmm8,%xmm15
        pxor    %xmm11,%xmm7
        pxor    %xmm2,%xmm15
        pxor    %xmm10,%xmm11
        pxor    %xmm9,%xmm2
        pxor    %xmm11,%xmm5
        pxor    %xmm11,%xmm15
        pxor    %xmm7,%xmm4
        pxor    %xmm7,%xmm2

        movdqa  %xmm6,%xmm11
        movdqa  %xmm0,%xmm7
        pxor    %xmm3,%xmm11
        pxor    %xmm1,%xmm7
        movdqa  %xmm14,%xmm10
        movdqa  %xmm12,%xmm9
        pxor    %xmm13,%xmm10
        pxor    %xmm8,%xmm9
        pand    %xmm11,%xmm10
        pand    %xmm3,%xmm9
        pxor    %xmm7,%xmm11
        pxor    %xmm1,%xmm3
        pand    %xmm14,%xmm7
        pand    %xmm12,%xmm1
        pand    %xmm13,%xmm11
        pand    %xmm8,%xmm3
        pxor    %xmm11,%xmm7
        pxor    %xmm1,%xmm3
        pxor    %xmm10,%xmm11
        pxor    %xmm9,%xmm1
        pxor    %xmm12,%xmm14
        pxor    %xmm8,%xmm13
        movdqa  %xmm14,%xmm10
        pxor    %xmm13,%xmm10
        pand    %xmm6,%xmm10
        pxor    %xmm0,%xmm6
        pand    %xmm14,%xmm0
        pand    %xmm13,%xmm6
        pxor    %xmm0,%xmm6
        pxor    %xmm10,%xmm0
        pxor    %xmm11,%xmm6
        pxor    %xmm11,%xmm3
        pxor    %xmm7,%xmm0
        pxor    %xmm7,%xmm1
        pxor    %xmm15,%xmm6
        pxor    %xmm5,%xmm0
        pxor    %xmm6,%xmm3
        pxor    %xmm15,%xmm5
        pxor    %xmm0,%xmm15

        pxor    %xmm4,%xmm0
        pxor    %xmm1,%xmm4
        pxor    %xmm2,%xmm1
        pxor    %xmm4,%xmm2
        pxor    %xmm4,%xmm3

        pxor    %xmm2,%xmm5
        decl    %r10d
        jl      L$enc_done
        pshufd  $0x93,%xmm15,%xmm7
        pshufd  $0x93,%xmm0,%xmm8
        pxor    %xmm7,%xmm15
        pshufd  $0x93,%xmm3,%xmm9
        pxor    %xmm8,%xmm0
        pshufd  $0x93,%xmm5,%xmm10
        pxor    %xmm9,%xmm3
        pshufd  $0x93,%xmm2,%xmm11
        pxor    %xmm10,%xmm5
        pshufd  $0x93,%xmm6,%xmm12
        pxor    %xmm11,%xmm2
        pshufd  $0x93,%xmm1,%xmm13
        pxor    %xmm12,%xmm6
        pshufd  $0x93,%xmm4,%xmm14
        pxor    %xmm13,%xmm1
        pxor    %xmm14,%xmm4

        pxor    %xmm15,%xmm8
        pxor    %xmm4,%xmm7
        pxor    %xmm4,%xmm8
        pshufd  $0x4E,%xmm15,%xmm15
        pxor    %xmm0,%xmm9
        pshufd  $0x4E,%xmm0,%xmm0
        pxor    %xmm2,%xmm12
        pxor    %xmm7,%xmm15
        pxor    %xmm6,%xmm13
        pxor    %xmm8,%xmm0
        pxor    %xmm5,%xmm11
        pshufd  $0x4E,%xmm2,%xmm7
        pxor    %xmm1,%xmm14
        pshufd  $0x4E,%xmm6,%xmm8
        pxor    %xmm3,%xmm10
        pshufd  $0x4E,%xmm5,%xmm2
        pxor    %xmm4,%xmm10
        pshufd  $0x4E,%xmm4,%xmm6
        pxor    %xmm4,%xmm11
        pshufd  $0x4E,%xmm1,%xmm5
        pxor    %xmm11,%xmm7
        pshufd  $0x4E,%xmm3,%xmm1
        pxor    %xmm12,%xmm8
        pxor    %xmm10,%xmm2
        pxor    %xmm14,%xmm6
        pxor    %xmm13,%xmm5
        movdqa  %xmm7,%xmm3
        pxor    %xmm9,%xmm1
        movdqa  %xmm8,%xmm4
        movdqa  48(%r11),%xmm7
        jnz     L$enc_loop
        movdqa  64(%r11),%xmm7
        jmp     L$enc_loop
.p2align        4
L$enc_done:
        movdqa  0(%r11),%xmm7
        movdqa  16(%r11),%xmm8
        movdqa  %xmm1,%xmm9
        psrlq   $1,%xmm1
        movdqa  %xmm2,%xmm10
        psrlq   $1,%xmm2
        pxor    %xmm4,%xmm1
        pxor    %xmm6,%xmm2
        pand    %xmm7,%xmm1
        pand    %xmm7,%xmm2
        pxor    %xmm1,%xmm4
        psllq   $1,%xmm1
        pxor    %xmm2,%xmm6
        psllq   $1,%xmm2
        pxor    %xmm9,%xmm1
        pxor    %xmm10,%xmm2
        movdqa  %xmm3,%xmm9
        psrlq   $1,%xmm3
        movdqa  %xmm15,%xmm10
        psrlq   $1,%xmm15
        pxor    %xmm5,%xmm3
        pxor    %xmm0,%xmm15
        pand    %xmm7,%xmm3
        pand    %xmm7,%xmm15
        pxor    %xmm3,%xmm5
        psllq   $1,%xmm3
        pxor    %xmm15,%xmm0
        psllq   $1,%xmm15
        pxor    %xmm9,%xmm3
        pxor    %xmm10,%xmm15
        movdqa  32(%r11),%xmm7
        movdqa  %xmm6,%xmm9
        psrlq   $2,%xmm6
        movdqa  %xmm2,%xmm10
        psrlq   $2,%xmm2
        pxor    %xmm4,%xmm6
        pxor    %xmm1,%xmm2
        pand    %xmm8,%xmm6
        pand    %xmm8,%xmm2
        pxor    %xmm6,%xmm4
        psllq   $2,%xmm6
        pxor    %xmm2,%xmm1
        psllq   $2,%xmm2
        pxor    %xmm9,%xmm6
        pxor    %xmm10,%xmm2
        movdqa  %xmm0,%xmm9
        psrlq   $2,%xmm0
        movdqa  %xmm15,%xmm10
        psrlq   $2,%xmm15
        pxor    %xmm5,%xmm0
        pxor    %xmm3,%xmm15
        pand    %xmm8,%xmm0
        pand    %xmm8,%xmm15
        pxor    %xmm0,%xmm5
        psllq   $2,%xmm0
        pxor    %xmm15,%xmm3
        psllq   $2,%xmm15
        pxor    %xmm9,%xmm0
        pxor    %xmm10,%xmm15
        movdqa  %xmm5,%xmm9
        psrlq   $4,%xmm5
        movdqa  %xmm3,%xmm10
        psrlq   $4,%xmm3
        pxor    %xmm4,%xmm5
        pxor    %xmm1,%xmm3
        pand    %xmm7,%xmm5
        pand    %xmm7,%xmm3
        pxor    %xmm5,%xmm4
        psllq   $4,%xmm5
        pxor    %xmm3,%xmm1
        psllq   $4,%xmm3
        pxor    %xmm9,%xmm5
        pxor    %xmm10,%xmm3
        movdqa  %xmm0,%xmm9
        psrlq   $4,%xmm0
        movdqa  %xmm15,%xmm10
        psrlq   $4,%xmm15
        pxor    %xmm6,%xmm0
        pxor    %xmm2,%xmm15
        pand    %xmm7,%xmm0
        pand    %xmm7,%xmm15
        pxor    %xmm0,%xmm6
        psllq   $4,%xmm0
        pxor    %xmm15,%xmm2
        psllq   $4,%xmm15
        pxor    %xmm9,%xmm0
        pxor    %xmm10,%xmm15
        movdqa  (%rax),%xmm7
        pxor    %xmm7,%xmm3
        pxor    %xmm7,%xmm5
        pxor    %xmm7,%xmm2
        pxor    %xmm7,%xmm6
        pxor    %xmm7,%xmm1
        pxor    %xmm7,%xmm4
        pxor    %xmm7,%xmm15
        pxor    %xmm7,%xmm0
        .byte   0xf3,0xc3



.p2align        6
_bsaes_decrypt8:
        leaq    L$BS0(%rip),%r11

        movdqa  (%rax),%xmm8
        leaq    16(%rax),%rax
        movdqa  -48(%r11),%xmm7
        pxor    %xmm8,%xmm15
        pxor    %xmm8,%xmm0
        pxor    %xmm8,%xmm1
        pxor    %xmm8,%xmm2
.byte   102,68,15,56,0,255
.byte   102,15,56,0,199
        pxor    %xmm8,%xmm3
        pxor    %xmm8,%xmm4
.byte   102,15,56,0,207
.byte   102,15,56,0,215
        pxor    %xmm8,%xmm5
        pxor    %xmm8,%xmm6
.byte   102,15,56,0,223
.byte   102,15,56,0,231
.byte   102,15,56,0,239
.byte   102,15,56,0,247
        movdqa  0(%r11),%xmm7
        movdqa  16(%r11),%xmm8
        movdqa  %xmm5,%xmm9
        psrlq   $1,%xmm5
        movdqa  %xmm3,%xmm10
        psrlq   $1,%xmm3
        pxor    %xmm6,%xmm5
        pxor    %xmm4,%xmm3
        pand    %xmm7,%xmm5
        pand    %xmm7,%xmm3
        pxor    %xmm5,%xmm6
        psllq   $1,%xmm5
        pxor    %xmm3,%xmm4
        psllq   $1,%xmm3
        pxor    %xmm9,%xmm5
        pxor    %xmm10,%xmm3
        movdqa  %xmm1,%xmm9
        psrlq   $1,%xmm1
        movdqa  %xmm15,%xmm10
        psrlq   $1,%xmm15
        pxor    %xmm2,%xmm1
        pxor    %xmm0,%xmm15
        pand    %xmm7,%xmm1
        pand    %xmm7,%xmm15
        pxor    %xmm1,%xmm2
        psllq   $1,%xmm1
        pxor    %xmm15,%xmm0
        psllq   $1,%xmm15
        pxor    %xmm9,%xmm1
        pxor    %xmm10,%xmm15
        movdqa  32(%r11),%xmm7
        movdqa  %xmm4,%xmm9
        psrlq   $2,%xmm4
        movdqa  %xmm3,%xmm10
        psrlq   $2,%xmm3
        pxor    %xmm6,%xmm4
        pxor    %xmm5,%xmm3
        pand    %xmm8,%xmm4
        pand    %xmm8,%xmm3
        pxor    %xmm4,%xmm6
        psllq   $2,%xmm4
        pxor    %xmm3,%xmm5
        psllq   $2,%xmm3
        pxor    %xmm9,%xmm4
        pxor    %xmm10,%xmm3
        movdqa  %xmm0,%xmm9
        psrlq   $2,%xmm0
        movdqa  %xmm15,%xmm10
        psrlq   $2,%xmm15
        pxor    %xmm2,%xmm0
        pxor    %xmm1,%xmm15
        pand    %xmm8,%xmm0
        pand    %xmm8,%xmm15
        pxor    %xmm0,%xmm2
        psllq   $2,%xmm0
        pxor    %xmm15,%xmm1
        psllq   $2,%xmm15
        pxor    %xmm9,%xmm0
        pxor    %xmm10,%xmm15
        movdqa  %xmm2,%xmm9
        psrlq   $4,%xmm2
        movdqa  %xmm1,%xmm10
        psrlq   $4,%xmm1
        pxor    %xmm6,%xmm2
        pxor    %xmm5,%xmm1
        pand    %xmm7,%xmm2
        pand    %xmm7,%xmm1
        pxor    %xmm2,%xmm6
        psllq   $4,%xmm2
        pxor    %xmm1,%xmm5
        psllq   $4,%xmm1
        pxor    %xmm9,%xmm2
        pxor    %xmm10,%xmm1
        movdqa  %xmm0,%xmm9
        psrlq   $4,%xmm0
        movdqa  %xmm15,%xmm10
        psrlq   $4,%xmm15
        pxor    %xmm4,%xmm0
        pxor    %xmm3,%xmm15
        pand    %xmm7,%xmm0
        pand    %xmm7,%xmm15
        pxor    %xmm0,%xmm4
        psllq   $4,%xmm0
        pxor    %xmm15,%xmm3
        psllq   $4,%xmm15
        pxor    %xmm9,%xmm0
        pxor    %xmm10,%xmm15
        decl    %r10d
        jmp     L$dec_sbox
.p2align        4
L$dec_loop:
        pxor    0(%rax),%xmm15
        pxor    16(%rax),%xmm0
        pxor    32(%rax),%xmm1
        pxor    48(%rax),%xmm2
.byte   102,68,15,56,0,255
.byte   102,15,56,0,199
        pxor    64(%rax),%xmm3
        pxor    80(%rax),%xmm4
.byte   102,15,56,0,207
.byte   102,15,56,0,215
        pxor    96(%rax),%xmm5
        pxor    112(%rax),%xmm6
.byte   102,15,56,0,223
.byte   102,15,56,0,231
.byte   102,15,56,0,239
.byte   102,15,56,0,247
        leaq    128(%rax),%rax
L$dec_sbox:
        pxor    %xmm3,%xmm2

        pxor    %xmm6,%xmm3
        pxor    %xmm6,%xmm1
        pxor    %xmm3,%xmm5
        pxor    %xmm5,%xmm6
        pxor    %xmm6,%xmm0

        pxor    %xmm0,%xmm15
        pxor    %xmm4,%xmm1
        pxor    %xmm15,%xmm2
        pxor    %xmm15,%xmm4
        pxor    %xmm2,%xmm0
        movdqa  %xmm2,%xmm10
        movdqa  %xmm6,%xmm9
        movdqa  %xmm0,%xmm8
        movdqa  %xmm3,%xmm12
        movdqa  %xmm4,%xmm11

        pxor    %xmm15,%xmm10
        pxor    %xmm3,%xmm9
        pxor    %xmm5,%xmm8
        movdqa  %xmm10,%xmm13
        pxor    %xmm15,%xmm12
        movdqa  %xmm9,%xmm7
        pxor    %xmm1,%xmm11
        movdqa  %xmm10,%xmm14

        por     %xmm8,%xmm9
        por     %xmm11,%xmm10
        pxor    %xmm7,%xmm14
        pand    %xmm11,%xmm13
        pxor    %xmm8,%xmm11
        pand    %xmm8,%xmm7
        pand    %xmm11,%xmm14
        movdqa  %xmm5,%xmm11
        pxor    %xmm1,%xmm11
        pand    %xmm11,%xmm12
        pxor    %xmm12,%xmm10
        pxor    %xmm12,%xmm9
        movdqa  %xmm2,%xmm12
        movdqa  %xmm0,%xmm11
        pxor    %xmm6,%xmm12
        pxor    %xmm4,%xmm11
        movdqa  %xmm12,%xmm8
        pand    %xmm11,%xmm12
        por     %xmm11,%xmm8
        pxor    %xmm12,%xmm7
        pxor    %xmm14,%xmm10
        pxor    %xmm13,%xmm9
        pxor    %xmm14,%xmm8
        movdqa  %xmm3,%xmm11
        pxor    %xmm13,%xmm7
        movdqa  %xmm15,%xmm12
        pxor    %xmm13,%xmm8
        movdqa  %xmm6,%xmm13
        pand    %xmm5,%xmm11
        movdqa  %xmm2,%xmm14
        pand    %xmm1,%xmm12
        pand    %xmm0,%xmm13
        por     %xmm4,%xmm14
        pxor    %xmm11,%xmm10
        pxor    %xmm12,%xmm9
        pxor    %xmm13,%xmm8
        pxor    %xmm14,%xmm7





        movdqa  %xmm10,%xmm11
        pand    %xmm8,%xmm10
        pxor    %xmm9,%xmm11

        movdqa  %xmm7,%xmm13
        movdqa  %xmm11,%xmm14
        pxor    %xmm10,%xmm13
        pand    %xmm13,%xmm14

        movdqa  %xmm8,%xmm12
        pxor    %xmm9,%xmm14
        pxor    %xmm7,%xmm12

        pxor    %xmm9,%xmm10

        pand    %xmm10,%xmm12

        movdqa  %xmm13,%xmm9
        pxor    %xmm7,%xmm12

        pxor    %xmm12,%xmm9
        pxor    %xmm12,%xmm8

        pand    %xmm7,%xmm9

        pxor    %xmm9,%xmm13
        pxor    %xmm9,%xmm8

        pand    %xmm14,%xmm13

        pxor    %xmm11,%xmm13
        movdqa  %xmm4,%xmm11
        movdqa  %xmm0,%xmm7
        movdqa  %xmm14,%xmm9
        pxor    %xmm13,%xmm9
        pand    %xmm4,%xmm9
        pxor    %xmm0,%xmm4
        pand    %xmm14,%xmm0
        pand    %xmm13,%xmm4
        pxor    %xmm0,%xmm4
        pxor    %xmm9,%xmm0
        pxor    %xmm1,%xmm11
        pxor    %xmm5,%xmm7
        pxor    %xmm12,%xmm14
        pxor    %xmm8,%xmm13
        movdqa  %xmm14,%xmm10
        movdqa  %xmm12,%xmm9
        pxor    %xmm13,%xmm10
        pxor    %xmm8,%xmm9
        pand    %xmm11,%xmm10
        pand    %xmm1,%xmm9
        pxor    %xmm7,%xmm11
        pxor    %xmm5,%xmm1
        pand    %xmm14,%xmm7
        pand    %xmm12,%xmm5
        pand    %xmm13,%xmm11
        pand    %xmm8,%xmm1
        pxor    %xmm11,%xmm7
        pxor    %xmm5,%xmm1
        pxor    %xmm10,%xmm11
        pxor    %xmm9,%xmm5
        pxor    %xmm11,%xmm4
        pxor    %xmm11,%xmm1
        pxor    %xmm7,%xmm0
        pxor    %xmm7,%xmm5

        movdqa  %xmm2,%xmm11
        movdqa  %xmm6,%xmm7
        pxor    %xmm15,%xmm11
        pxor    %xmm3,%xmm7
        movdqa  %xmm14,%xmm10
        movdqa  %xmm12,%xmm9
        pxor    %xmm13,%xmm10
        pxor    %xmm8,%xmm9
        pand    %xmm11,%xmm10
        pand    %xmm15,%xmm9
        pxor    %xmm7,%xmm11
        pxor    %xmm3,%xmm15
        pand    %xmm14,%xmm7
        pand    %xmm12,%xmm3
        pand    %xmm13,%xmm11
        pand    %xmm8,%xmm15
        pxor    %xmm11,%xmm7
        pxor    %xmm3,%xmm15
        pxor    %xmm10,%xmm11
        pxor    %xmm9,%xmm3
        pxor    %xmm12,%xmm14
        pxor    %xmm8,%xmm13
        movdqa  %xmm14,%xmm10
        pxor    %xmm13,%xmm10
        pand    %xmm2,%xmm10
        pxor    %xmm6,%xmm2
        pand    %xmm14,%xmm6
        pand    %xmm13,%xmm2
        pxor    %xmm6,%xmm2
        pxor    %xmm10,%xmm6
        pxor    %xmm11,%xmm2
        pxor    %xmm11,%xmm15
        pxor    %xmm7,%xmm6
        pxor    %xmm7,%xmm3
        pxor    %xmm6,%xmm0
        pxor    %xmm4,%xmm5

        pxor    %xmm0,%xmm3
        pxor    %xmm6,%xmm1
        pxor    %xmm6,%xmm4
        pxor    %xmm1,%xmm3
        pxor    %xmm15,%xmm6
        pxor    %xmm4,%xmm3
        pxor    %xmm5,%xmm2
        pxor    %xmm0,%xmm5
        pxor    %xmm3,%xmm2

        pxor    %xmm15,%xmm3
        pxor    %xmm2,%xmm6
        decl    %r10d
        jl      L$dec_done

        pshufd  $0x4E,%xmm15,%xmm7
        pshufd  $0x4E,%xmm2,%xmm13
        pxor    %xmm15,%xmm7
        pshufd  $0x4E,%xmm4,%xmm14
        pxor    %xmm2,%xmm13
        pshufd  $0x4E,%xmm0,%xmm8
        pxor    %xmm4,%xmm14
        pshufd  $0x4E,%xmm5,%xmm9
        pxor    %xmm0,%xmm8
        pshufd  $0x4E,%xmm3,%xmm10
        pxor    %xmm5,%xmm9
        pxor    %xmm13,%xmm15
        pxor    %xmm13,%xmm0
        pshufd  $0x4E,%xmm1,%xmm11
        pxor    %xmm3,%xmm10
        pxor    %xmm7,%xmm5
        pxor    %xmm8,%xmm3
        pshufd  $0x4E,%xmm6,%xmm12
        pxor    %xmm1,%xmm11
        pxor    %xmm14,%xmm0
        pxor    %xmm9,%xmm1
        pxor    %xmm6,%xmm12

        pxor    %xmm14,%xmm5
        pxor    %xmm13,%xmm3
        pxor    %xmm13,%xmm1
        pxor    %xmm10,%xmm6
        pxor    %xmm11,%xmm2
        pxor    %xmm14,%xmm1
        pxor    %xmm14,%xmm6
        pxor    %xmm12,%xmm4
        pshufd  $0x93,%xmm15,%xmm7
        pshufd  $0x93,%xmm0,%xmm8
        pxor    %xmm7,%xmm15
        pshufd  $0x93,%xmm5,%xmm9
        pxor    %xmm8,%xmm0
        pshufd  $0x93,%xmm3,%xmm10
        pxor    %xmm9,%xmm5
        pshufd  $0x93,%xmm1,%xmm11
        pxor    %xmm10,%xmm3
        pshufd  $0x93,%xmm6,%xmm12
        pxor    %xmm11,%xmm1
        pshufd  $0x93,%xmm2,%xmm13
        pxor    %xmm12,%xmm6
        pshufd  $0x93,%xmm4,%xmm14
        pxor    %xmm13,%xmm2
        pxor    %xmm14,%xmm4

        pxor    %xmm15,%xmm8
        pxor    %xmm4,%xmm7
        pxor    %xmm4,%xmm8
        pshufd  $0x4E,%xmm15,%xmm15
        pxor    %xmm0,%xmm9
        pshufd  $0x4E,%xmm0,%xmm0
        pxor    %xmm1,%xmm12
        pxor    %xmm7,%xmm15
        pxor    %xmm6,%xmm13
        pxor    %xmm8,%xmm0
        pxor    %xmm3,%xmm11
        pshufd  $0x4E,%xmm1,%xmm7
        pxor    %xmm2,%xmm14
        pshufd  $0x4E,%xmm6,%xmm8
        pxor    %xmm5,%xmm10
        pshufd  $0x4E,%xmm3,%xmm1
        pxor    %xmm4,%xmm10
        pshufd  $0x4E,%xmm4,%xmm6
        pxor    %xmm4,%xmm11
        pshufd  $0x4E,%xmm2,%xmm3
        pxor    %xmm11,%xmm7
        pshufd  $0x4E,%xmm5,%xmm2
        pxor    %xmm12,%xmm8
        pxor    %xmm1,%xmm10
        pxor    %xmm14,%xmm6
        pxor    %xmm3,%xmm13
        movdqa  %xmm7,%xmm3
        pxor    %xmm9,%xmm2
        movdqa  %xmm13,%xmm5
        movdqa  %xmm8,%xmm4
        movdqa  %xmm2,%xmm1
        movdqa  %xmm10,%xmm2
        movdqa  -16(%r11),%xmm7
        jnz     L$dec_loop
        movdqa  -32(%r11),%xmm7
        jmp     L$dec_loop
.p2align        4
L$dec_done:
        movdqa  0(%r11),%xmm7
        movdqa  16(%r11),%xmm8
        movdqa  %xmm2,%xmm9
        psrlq   $1,%xmm2
        movdqa  %xmm1,%xmm10
        psrlq   $1,%xmm1
        pxor    %xmm4,%xmm2
        pxor    %xmm6,%xmm1
        pand    %xmm7,%xmm2
        pand    %xmm7,%xmm1
        pxor    %xmm2,%xmm4
        psllq   $1,%xmm2
        pxor    %xmm1,%xmm6
        psllq   $1,%xmm1
        pxor    %xmm9,%xmm2
        pxor    %xmm10,%xmm1
        movdqa  %xmm5,%xmm9
        psrlq   $1,%xmm5
        movdqa  %xmm15,%xmm10
        psrlq   $1,%xmm15
        pxor    %xmm3,%xmm5
        pxor    %xmm0,%xmm15
        pand    %xmm7,%xmm5
        pand    %xmm7,%xmm15
        pxor    %xmm5,%xmm3
        psllq   $1,%xmm5
        pxor    %xmm15,%xmm0
        psllq   $1,%xmm15
        pxor    %xmm9,%xmm5
        pxor    %xmm10,%xmm15
        movdqa  32(%r11),%xmm7
        movdqa  %xmm6,%xmm9
        psrlq   $2,%xmm6
        movdqa  %xmm1,%xmm10
        psrlq   $2,%xmm1
        pxor    %xmm4,%xmm6
        pxor    %xmm2,%xmm1
        pand    %xmm8,%xmm6
        pand    %xmm8,%xmm1
        pxor    %xmm6,%xmm4
        psllq   $2,%xmm6
        pxor    %xmm1,%xmm2
        psllq   $2,%xmm1
        pxor    %xmm9,%xmm6
        pxor    %xmm10,%xmm1
        movdqa  %xmm0,%xmm9
        psrlq   $2,%xmm0
        movdqa  %xmm15,%xmm10
        psrlq   $2,%xmm15
        pxor    %xmm3,%xmm0
        pxor    %xmm5,%xmm15
        pand    %xmm8,%xmm0
        pand    %xmm8,%xmm15
        pxor    %xmm0,%xmm3
        psllq   $2,%xmm0
        pxor    %xmm15,%xmm5
        psllq   $2,%xmm15
        pxor    %xmm9,%xmm0
        pxor    %xmm10,%xmm15
        movdqa  %xmm3,%xmm9
        psrlq   $4,%xmm3
        movdqa  %xmm5,%xmm10
        psrlq   $4,%xmm5
        pxor    %xmm4,%xmm3
        pxor    %xmm2,%xmm5
        pand    %xmm7,%xmm3
        pand    %xmm7,%xmm5
        pxor    %xmm3,%xmm4
        psllq   $4,%xmm3
        pxor    %xmm5,%xmm2
        psllq   $4,%xmm5
        pxor    %xmm9,%xmm3
        pxor    %xmm10,%xmm5
        movdqa  %xmm0,%xmm9
        psrlq   $4,%xmm0
        movdqa  %xmm15,%xmm10
        psrlq   $4,%xmm15
        pxor    %xmm6,%xmm0
        pxor    %xmm1,%xmm15
        pand    %xmm7,%xmm0
        pand    %xmm7,%xmm15
        pxor    %xmm0,%xmm6
        psllq   $4,%xmm0
        pxor    %xmm15,%xmm1
        psllq   $4,%xmm15
        pxor    %xmm9,%xmm0
        pxor    %xmm10,%xmm15
        movdqa  (%rax),%xmm7
        pxor    %xmm7,%xmm5
        pxor    %xmm7,%xmm3
        pxor    %xmm7,%xmm1
        pxor    %xmm7,%xmm6
        pxor    %xmm7,%xmm2
        pxor    %xmm7,%xmm4
        pxor    %xmm7,%xmm15
        pxor    %xmm7,%xmm0
        .byte   0xf3,0xc3


.p2align        4
_bsaes_key_convert:
        leaq    L$masks(%rip),%r11
        movdqu  (%rcx),%xmm7
        leaq    16(%rcx),%rcx
        movdqa  0(%r11),%xmm0
        movdqa  16(%r11),%xmm1
        movdqa  32(%r11),%xmm2
        movdqa  48(%r11),%xmm3
        movdqa  64(%r11),%xmm4
        pcmpeqd %xmm5,%xmm5

        movdqu  (%rcx),%xmm6
        movdqa  %xmm7,(%rax)
        leaq    16(%rax),%rax
        decl    %r10d
        jmp     L$key_loop
.p2align        4
L$key_loop:
.byte   102,15,56,0,244

        movdqa  %xmm0,%xmm8
        movdqa  %xmm1,%xmm9

        pand    %xmm6,%xmm8
        pand    %xmm6,%xmm9
        movdqa  %xmm2,%xmm10
        pcmpeqb %xmm0,%xmm8
        psllq   $4,%xmm0
        movdqa  %xmm3,%xmm11
        pcmpeqb %xmm1,%xmm9
        psllq   $4,%xmm1

        pand    %xmm6,%xmm10
        pand    %xmm6,%xmm11
        movdqa  %xmm0,%xmm12
        pcmpeqb %xmm2,%xmm10
        psllq   $4,%xmm2
        movdqa  %xmm1,%xmm13
        pcmpeqb %xmm3,%xmm11
        psllq   $4,%xmm3

        movdqa  %xmm2,%xmm14
        movdqa  %xmm3,%xmm15
        pxor    %xmm5,%xmm8
        pxor    %xmm5,%xmm9

        pand    %xmm6,%xmm12
        pand    %xmm6,%xmm13
        movdqa  %xmm8,0(%rax)
        pcmpeqb %xmm0,%xmm12
        psrlq   $4,%xmm0
        movdqa  %xmm9,16(%rax)
        pcmpeqb %xmm1,%xmm13
        psrlq   $4,%xmm1
        leaq    16(%rcx),%rcx

        pand    %xmm6,%xmm14
        pand    %xmm6,%xmm15
        movdqa  %xmm10,32(%rax)
        pcmpeqb %xmm2,%xmm14
        psrlq   $4,%xmm2
        movdqa  %xmm11,48(%rax)
        pcmpeqb %xmm3,%xmm15
        psrlq   $4,%xmm3
        movdqu  (%rcx),%xmm6

        pxor    %xmm5,%xmm13
        pxor    %xmm5,%xmm14
        movdqa  %xmm12,64(%rax)
        movdqa  %xmm13,80(%rax)
        movdqa  %xmm14,96(%rax)
        movdqa  %xmm15,112(%rax)
        leaq    128(%rax),%rax
        decl    %r10d
        jnz     L$key_loop

        movdqa  80(%r11),%xmm7

        .byte   0xf3,0xc3


.globl  _bsaes_cbc_encrypt
.private_extern _bsaes_cbc_encrypt

.p2align        4
_bsaes_cbc_encrypt:
        cmpl    $0,%r9d
        jne     _asm_AES_cbc_encrypt
        cmpq    $128,%rdx
        jb      _asm_AES_cbc_encrypt

        movq    %rsp,%rax
L$cbc_dec_prologue:
        pushq   %rbp
        pushq   %rbx
        pushq   %r12
        pushq   %r13
        pushq   %r14
        pushq   %r15
        leaq    -72(%rsp),%rsp
        movq    %rsp,%rbp
        movl    240(%rcx),%eax
        movq    %rdi,%r12
        movq    %rsi,%r13
        movq    %rdx,%r14
        movq    %rcx,%r15
        movq    %r8,%rbx
        shrq    $4,%r14

        movl    %eax,%edx
        shlq    $7,%rax
        subq    $96,%rax
        subq    %rax,%rsp

        movq    %rsp,%rax
        movq    %r15,%rcx
        movl    %edx,%r10d
        call    _bsaes_key_convert
        pxor    (%rsp),%xmm7
        movdqa  %xmm6,(%rax)
        movdqa  %xmm7,(%rsp)

        movdqu  (%rbx),%xmm14
        subq    $8,%r14
L$cbc_dec_loop:
        movdqu  0(%r12),%xmm15
        movdqu  16(%r12),%xmm0
        movdqu  32(%r12),%xmm1
        movdqu  48(%r12),%xmm2
        movdqu  64(%r12),%xmm3
        movdqu  80(%r12),%xmm4
        movq    %rsp,%rax
        movdqu  96(%r12),%xmm5
        movl    %edx,%r10d
        movdqu  112(%r12),%xmm6
        movdqa  %xmm14,32(%rbp)

        call    _bsaes_decrypt8

        pxor    32(%rbp),%xmm15
        movdqu  0(%r12),%xmm7
        movdqu  16(%r12),%xmm8
        pxor    %xmm7,%xmm0
        movdqu  32(%r12),%xmm9
        pxor    %xmm8,%xmm5
        movdqu  48(%r12),%xmm10
        pxor    %xmm9,%xmm3
        movdqu  64(%r12),%xmm11
        pxor    %xmm10,%xmm1
        movdqu  80(%r12),%xmm12
        pxor    %xmm11,%xmm6
        movdqu  96(%r12),%xmm13
        pxor    %xmm12,%xmm2
        movdqu  112(%r12),%xmm14
        pxor    %xmm13,%xmm4
        movdqu  %xmm15,0(%r13)
        leaq    128(%r12),%r12
        movdqu  %xmm0,16(%r13)
        movdqu  %xmm5,32(%r13)
        movdqu  %xmm3,48(%r13)
        movdqu  %xmm1,64(%r13)
        movdqu  %xmm6,80(%r13)
        movdqu  %xmm2,96(%r13)
        movdqu  %xmm4,112(%r13)
        leaq    128(%r13),%r13
        subq    $8,%r14
        jnc     L$cbc_dec_loop

        addq    $8,%r14
        jz      L$cbc_dec_done

        movdqu  0(%r12),%xmm15
        movq    %rsp,%rax
        movl    %edx,%r10d
        cmpq    $2,%r14
        jb      L$cbc_dec_one
        movdqu  16(%r12),%xmm0
        je      L$cbc_dec_two
        movdqu  32(%r12),%xmm1
        cmpq    $4,%r14
        jb      L$cbc_dec_three
        movdqu  48(%r12),%xmm2
        je      L$cbc_dec_four
        movdqu  64(%r12),%xmm3
        cmpq    $6,%r14
        jb      L$cbc_dec_five
        movdqu  80(%r12),%xmm4
        je      L$cbc_dec_six
        movdqu  96(%r12),%xmm5
        movdqa  %xmm14,32(%rbp)
        call    _bsaes_decrypt8
        pxor    32(%rbp),%xmm15
        movdqu  0(%r12),%xmm7
        movdqu  16(%r12),%xmm8
        pxor    %xmm7,%xmm0
        movdqu  32(%r12),%xmm9
        pxor    %xmm8,%xmm5
        movdqu  48(%r12),%xmm10
        pxor    %xmm9,%xmm3
        movdqu  64(%r12),%xmm11
        pxor    %xmm10,%xmm1
        movdqu  80(%r12),%xmm12
        pxor    %xmm11,%xmm6
        movdqu  96(%r12),%xmm14
        pxor    %xmm12,%xmm2
        movdqu  %xmm15,0(%r13)
        movdqu  %xmm0,16(%r13)
        movdqu  %xmm5,32(%r13)
        movdqu  %xmm3,48(%r13)
        movdqu  %xmm1,64(%r13)
        movdqu  %xmm6,80(%r13)
        movdqu  %xmm2,96(%r13)
        jmp     L$cbc_dec_done
.p2align        4
L$cbc_dec_six:
        movdqa  %xmm14,32(%rbp)
        call    _bsaes_decrypt8
        pxor    32(%rbp),%xmm15
        movdqu  0(%r12),%xmm7
        movdqu  16(%r12),%xmm8
        pxor    %xmm7,%xmm0
        movdqu  32(%r12),%xmm9
        pxor    %xmm8,%xmm5
        movdqu  48(%r12),%xmm10
        pxor    %xmm9,%xmm3
        movdqu  64(%r12),%xmm11
        pxor    %xmm10,%xmm1
        movdqu  80(%r12),%xmm14
        pxor    %xmm11,%xmm6
        movdqu  %xmm15,0(%r13)
        movdqu  %xmm0,16(%r13)
        movdqu  %xmm5,32(%r13)
        movdqu  %xmm3,48(%r13)
        movdqu  %xmm1,64(%r13)
        movdqu  %xmm6,80(%r13)
        jmp     L$cbc_dec_done
.p2align        4
L$cbc_dec_five:
        movdqa  %xmm14,32(%rbp)
        call    _bsaes_decrypt8
        pxor    32(%rbp),%xmm15
        movdqu  0(%r12),%xmm7
        movdqu  16(%r12),%xmm8
        pxor    %xmm7,%xmm0
        movdqu  32(%r12),%xmm9
        pxor    %xmm8,%xmm5
        movdqu  48(%r12),%xmm10
        pxor    %xmm9,%xmm3
        movdqu  64(%r12),%xmm14
        pxor    %xmm10,%xmm1
        movdqu  %xmm15,0(%r13)
        movdqu  %xmm0,16(%r13)
        movdqu  %xmm5,32(%r13)
        movdqu  %xmm3,48(%r13)
        movdqu  %xmm1,64(%r13)
        jmp     L$cbc_dec_done
.p2align        4
L$cbc_dec_four:
        movdqa  %xmm14,32(%rbp)
        call    _bsaes_decrypt8
        pxor    32(%rbp),%xmm15
        movdqu  0(%r12),%xmm7
        movdqu  16(%r12),%xmm8
        pxor    %xmm7,%xmm0
        movdqu  32(%r12),%xmm9
        pxor    %xmm8,%xmm5
        movdqu  48(%r12),%xmm14
        pxor    %xmm9,%xmm3
        movdqu  %xmm15,0(%r13)
        movdqu  %xmm0,16(%r13)
        movdqu  %xmm5,32(%r13)
        movdqu  %xmm3,48(%r13)
        jmp     L$cbc_dec_done
.p2align        4
L$cbc_dec_three:
        movdqa  %xmm14,32(%rbp)
        call    _bsaes_decrypt8
        pxor    32(%rbp),%xmm15
        movdqu  0(%r12),%xmm7
        movdqu  16(%r12),%xmm8
        pxor    %xmm7,%xmm0
        movdqu  32(%r12),%xmm14
        pxor    %xmm8,%xmm5
        movdqu  %xmm15,0(%r13)
        movdqu  %xmm0,16(%r13)
        movdqu  %xmm5,32(%r13)
        jmp     L$cbc_dec_done
.p2align        4
L$cbc_dec_two:
        movdqa  %xmm14,32(%rbp)
        call    _bsaes_decrypt8
        pxor    32(%rbp),%xmm15
        movdqu  0(%r12),%xmm7
        movdqu  16(%r12),%xmm14
        pxor    %xmm7,%xmm0
        movdqu  %xmm15,0(%r13)
        movdqu  %xmm0,16(%r13)
        jmp     L$cbc_dec_done
.p2align        4
L$cbc_dec_one:
        leaq    (%r12),%rdi
        leaq    32(%rbp),%rsi
        leaq    (%r15),%rdx
        call    _asm_AES_decrypt
        pxor    32(%rbp),%xmm14
        movdqu  %xmm14,(%r13)
        movdqa  %xmm15,%xmm14

L$cbc_dec_done:
        movdqu  %xmm14,(%rbx)
        leaq    (%rsp),%rax
        pxor    %xmm0,%xmm0
L$cbc_dec_bzero:
        movdqa  %xmm0,0(%rax)
        movdqa  %xmm0,16(%rax)
        leaq    32(%rax),%rax
        cmpq    %rax,%rbp
        ja      L$cbc_dec_bzero

        leaq    (%rbp),%rsp
        movq    72(%rsp),%r15
        movq    80(%rsp),%r14
        movq    88(%rsp),%r13
        movq    96(%rsp),%r12
        movq    104(%rsp),%rbx
        movq    112(%rsp),%rax
        leaq    120(%rsp),%rsp
        movq    %rax,%rbp
L$cbc_dec_epilogue:
        .byte   0xf3,0xc3


.globl  _bsaes_ctr32_encrypt_blocks
.private_extern _bsaes_ctr32_encrypt_blocks

.p2align        4
_bsaes_ctr32_encrypt_blocks:
        movq    %rsp,%rax
L$ctr_enc_prologue:
        pushq   %rbp
        pushq   %rbx
        pushq   %r12
        pushq   %r13
        pushq   %r14
        pushq   %r15
        leaq    -72(%rsp),%rsp
        movq    %rsp,%rbp
        movdqu  (%r8),%xmm0
        movl    240(%rcx),%eax
        movq    %rdi,%r12
        movq    %rsi,%r13
        movq    %rdx,%r14
        movq    %rcx,%r15
        movdqa  %xmm0,32(%rbp)
        cmpq    $8,%rdx
        jb      L$ctr_enc_short

        movl    %eax,%ebx
        shlq    $7,%rax
        subq    $96,%rax
        subq    %rax,%rsp

        movq    %rsp,%rax
        movq    %r15,%rcx
        movl    %ebx,%r10d
        call    _bsaes_key_convert
        pxor    %xmm6,%xmm7
        movdqa  %xmm7,(%rax)

        movdqa  (%rsp),%xmm8
        leaq    L$ADD1(%rip),%r11
        movdqa  32(%rbp),%xmm15
        movdqa  -32(%r11),%xmm7
.byte   102,68,15,56,0,199
.byte   102,68,15,56,0,255
        movdqa  %xmm8,(%rsp)
        jmp     L$ctr_enc_loop
.p2align        4
L$ctr_enc_loop:
        movdqa  %xmm15,32(%rbp)
        movdqa  %xmm15,%xmm0
        movdqa  %xmm15,%xmm1
        paddd   0(%r11),%xmm0
        movdqa  %xmm15,%xmm2
        paddd   16(%r11),%xmm1
        movdqa  %xmm15,%xmm3
        paddd   32(%r11),%xmm2
        movdqa  %xmm15,%xmm4
        paddd   48(%r11),%xmm3
        movdqa  %xmm15,%xmm5
        paddd   64(%r11),%xmm4
        movdqa  %xmm15,%xmm6
        paddd   80(%r11),%xmm5
        paddd   96(%r11),%xmm6



        movdqa  (%rsp),%xmm8
        leaq    16(%rsp),%rax
        movdqa  -16(%r11),%xmm7
        pxor    %xmm8,%xmm15
        pxor    %xmm8,%xmm0
        pxor    %xmm8,%xmm1
        pxor    %xmm8,%xmm2
.byte   102,68,15,56,0,255
.byte   102,15,56,0,199
        pxor    %xmm8,%xmm3
        pxor    %xmm8,%xmm4
.byte   102,15,56,0,207
.byte   102,15,56,0,215
        pxor    %xmm8,%xmm5
        pxor    %xmm8,%xmm6
.byte   102,15,56,0,223
.byte   102,15,56,0,231
.byte   102,15,56,0,239
.byte   102,15,56,0,247
        leaq    L$BS0(%rip),%r11
        movl    %ebx,%r10d

        call    _bsaes_encrypt8_bitslice

        subq    $8,%r14
        jc      L$ctr_enc_loop_done

        movdqu  0(%r12),%xmm7
        movdqu  16(%r12),%xmm8
        movdqu  32(%r12),%xmm9
        movdqu  48(%r12),%xmm10
        movdqu  64(%r12),%xmm11
        movdqu  80(%r12),%xmm12
        movdqu  96(%r12),%xmm13
        movdqu  112(%r12),%xmm14
        leaq    128(%r12),%r12
        pxor    %xmm15,%xmm7
        movdqa  32(%rbp),%xmm15
        pxor    %xmm8,%xmm0
        movdqu  %xmm7,0(%r13)
        pxor    %xmm9,%xmm3
        movdqu  %xmm0,16(%r13)
        pxor    %xmm10,%xmm5
        movdqu  %xmm3,32(%r13)
        pxor    %xmm11,%xmm2
        movdqu  %xmm5,48(%r13)
        pxor    %xmm12,%xmm6
        movdqu  %xmm2,64(%r13)
        pxor    %xmm13,%xmm1
        movdqu  %xmm6,80(%r13)
        pxor    %xmm14,%xmm4
        movdqu  %xmm1,96(%r13)
        leaq    L$ADD1(%rip),%r11
        movdqu  %xmm4,112(%r13)
        leaq    128(%r13),%r13
        paddd   112(%r11),%xmm15
        jnz     L$ctr_enc_loop

        jmp     L$ctr_enc_done
.p2align        4
L$ctr_enc_loop_done:
        addq    $8,%r14
        movdqu  0(%r12),%xmm7
        pxor    %xmm7,%xmm15
        movdqu  %xmm15,0(%r13)
        cmpq    $2,%r14
        jb      L$ctr_enc_done
        movdqu  16(%r12),%xmm8
        pxor    %xmm8,%xmm0
        movdqu  %xmm0,16(%r13)
        je      L$ctr_enc_done
        movdqu  32(%r12),%xmm9
        pxor    %xmm9,%xmm3
        movdqu  %xmm3,32(%r13)
        cmpq    $4,%r14
        jb      L$ctr_enc_done
        movdqu  48(%r12),%xmm10
        pxor    %xmm10,%xmm5
        movdqu  %xmm5,48(%r13)
        je      L$ctr_enc_done
        movdqu  64(%r12),%xmm11
        pxor    %xmm11,%xmm2
        movdqu  %xmm2,64(%r13)
        cmpq    $6,%r14
        jb      L$ctr_enc_done
        movdqu  80(%r12),%xmm12
        pxor    %xmm12,%xmm6
        movdqu  %xmm6,80(%r13)
        je      L$ctr_enc_done
        movdqu  96(%r12),%xmm13
        pxor    %xmm13,%xmm1
        movdqu  %xmm1,96(%r13)
        jmp     L$ctr_enc_done

.p2align        4
L$ctr_enc_short:
        leaq    32(%rbp),%rdi
        leaq    48(%rbp),%rsi
        leaq    (%r15),%rdx
        call    _asm_AES_encrypt
        movdqu  (%r12),%xmm0
        leaq    16(%r12),%r12
        movl    44(%rbp),%eax
        bswapl  %eax
        pxor    48(%rbp),%xmm0
        incl    %eax
        movdqu  %xmm0,(%r13)
        bswapl  %eax
        leaq    16(%r13),%r13
        movl    %eax,44(%rsp)
        decq    %r14
        jnz     L$ctr_enc_short

L$ctr_enc_done:
        leaq    (%rsp),%rax
        pxor    %xmm0,%xmm0
L$ctr_enc_bzero:
        movdqa  %xmm0,0(%rax)
        movdqa  %xmm0,16(%rax)
        leaq    32(%rax),%rax
        cmpq    %rax,%rbp
        ja      L$ctr_enc_bzero

        leaq    (%rbp),%rsp
        movq    72(%rsp),%r15
        movq    80(%rsp),%r14
        movq    88(%rsp),%r13
        movq    96(%rsp),%r12
        movq    104(%rsp),%rbx
        movq    112(%rsp),%rax
        leaq    120(%rsp),%rsp
        movq    %rax,%rbp
L$ctr_enc_epilogue:
        .byte   0xf3,0xc3

.globl  _bsaes_xts_encrypt
.private_extern _bsaes_xts_encrypt

.p2align        4
_bsaes_xts_encrypt:
        movq    %rsp,%rax
L$xts_enc_prologue:
        pushq   %rbp
        pushq   %rbx
        pushq   %r12
        pushq   %r13
        pushq   %r14
        pushq   %r15
        leaq    -72(%rsp),%rsp
        movq    %rsp,%rbp
        movq    %rdi,%r12
        movq    %rsi,%r13
        movq    %rdx,%r14
        movq    %rcx,%r15

        leaq    (%r9),%rdi
        leaq    32(%rbp),%rsi
        leaq    (%r8),%rdx
        call    _asm_AES_encrypt

        movl    240(%r15),%eax
        movq    %r14,%rbx

        movl    %eax,%edx
        shlq    $7,%rax
        subq    $96,%rax
        subq    %rax,%rsp

        movq    %rsp,%rax
        movq    %r15,%rcx
        movl    %edx,%r10d
        call    _bsaes_key_convert
        pxor    %xmm6,%xmm7
        movdqa  %xmm7,(%rax)

        andq    $-16,%r14
        subq    $0x80,%rsp
        movdqa  32(%rbp),%xmm6

        pxor    %xmm14,%xmm14
        movdqa  L$xts_magic(%rip),%xmm12
        pcmpgtd %xmm6,%xmm14

        subq    $0x80,%r14
        jc      L$xts_enc_short
        jmp     L$xts_enc_loop

.p2align        4
L$xts_enc_loop:
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm15
        movdqa  %xmm6,0(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm0
        movdqa  %xmm6,16(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  0(%r12),%xmm7
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm1
        movdqa  %xmm6,32(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  16(%r12),%xmm8
        pxor    %xmm7,%xmm15
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm2
        movdqa  %xmm6,48(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  32(%r12),%xmm9
        pxor    %xmm8,%xmm0
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm3
        movdqa  %xmm6,64(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  48(%r12),%xmm10
        pxor    %xmm9,%xmm1
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm4
        movdqa  %xmm6,80(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  64(%r12),%xmm11
        pxor    %xmm10,%xmm2
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm5
        movdqa  %xmm6,96(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  80(%r12),%xmm12
        pxor    %xmm11,%xmm3
        movdqu  96(%r12),%xmm13
        pxor    %xmm12,%xmm4
        movdqu  112(%r12),%xmm14
        leaq    128(%r12),%r12
        movdqa  %xmm6,112(%rsp)
        pxor    %xmm13,%xmm5
        leaq    128(%rsp),%rax
        pxor    %xmm14,%xmm6
        movl    %edx,%r10d

        call    _bsaes_encrypt8

        pxor    0(%rsp),%xmm15
        pxor    16(%rsp),%xmm0
        movdqu  %xmm15,0(%r13)
        pxor    32(%rsp),%xmm3
        movdqu  %xmm0,16(%r13)
        pxor    48(%rsp),%xmm5
        movdqu  %xmm3,32(%r13)
        pxor    64(%rsp),%xmm2
        movdqu  %xmm5,48(%r13)
        pxor    80(%rsp),%xmm6
        movdqu  %xmm2,64(%r13)
        pxor    96(%rsp),%xmm1
        movdqu  %xmm6,80(%r13)
        pxor    112(%rsp),%xmm4
        movdqu  %xmm1,96(%r13)
        movdqu  %xmm4,112(%r13)
        leaq    128(%r13),%r13

        movdqa  112(%rsp),%xmm6
        pxor    %xmm14,%xmm14
        movdqa  L$xts_magic(%rip),%xmm12
        pcmpgtd %xmm6,%xmm14
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6

        subq    $0x80,%r14
        jnc     L$xts_enc_loop

L$xts_enc_short:
        addq    $0x80,%r14
        jz      L$xts_enc_done
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm15
        movdqa  %xmm6,0(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm0
        movdqa  %xmm6,16(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  0(%r12),%xmm7
        cmpq    $16,%r14
        je      L$xts_enc_1
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm1
        movdqa  %xmm6,32(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  16(%r12),%xmm8
        cmpq    $32,%r14
        je      L$xts_enc_2
        pxor    %xmm7,%xmm15
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm2
        movdqa  %xmm6,48(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  32(%r12),%xmm9
        cmpq    $48,%r14
        je      L$xts_enc_3
        pxor    %xmm8,%xmm0
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm3
        movdqa  %xmm6,64(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  48(%r12),%xmm10
        cmpq    $64,%r14
        je      L$xts_enc_4
        pxor    %xmm9,%xmm1
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm4
        movdqa  %xmm6,80(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  64(%r12),%xmm11
        cmpq    $80,%r14
        je      L$xts_enc_5
        pxor    %xmm10,%xmm2
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm5
        movdqa  %xmm6,96(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  80(%r12),%xmm12
        cmpq    $96,%r14
        je      L$xts_enc_6
        pxor    %xmm11,%xmm3
        movdqu  96(%r12),%xmm13
        pxor    %xmm12,%xmm4
        movdqa  %xmm6,112(%rsp)
        leaq    112(%r12),%r12
        pxor    %xmm13,%xmm5
        leaq    128(%rsp),%rax
        movl    %edx,%r10d

        call    _bsaes_encrypt8

        pxor    0(%rsp),%xmm15
        pxor    16(%rsp),%xmm0
        movdqu  %xmm15,0(%r13)
        pxor    32(%rsp),%xmm3
        movdqu  %xmm0,16(%r13)
        pxor    48(%rsp),%xmm5
        movdqu  %xmm3,32(%r13)
        pxor    64(%rsp),%xmm2
        movdqu  %xmm5,48(%r13)
        pxor    80(%rsp),%xmm6
        movdqu  %xmm2,64(%r13)
        pxor    96(%rsp),%xmm1
        movdqu  %xmm6,80(%r13)
        movdqu  %xmm1,96(%r13)
        leaq    112(%r13),%r13

        movdqa  112(%rsp),%xmm6
        jmp     L$xts_enc_done
.p2align        4
L$xts_enc_6:
        pxor    %xmm11,%xmm3
        leaq    96(%r12),%r12
        pxor    %xmm12,%xmm4
        leaq    128(%rsp),%rax
        movl    %edx,%r10d

        call    _bsaes_encrypt8

        pxor    0(%rsp),%xmm15
        pxor    16(%rsp),%xmm0
        movdqu  %xmm15,0(%r13)
        pxor    32(%rsp),%xmm3
        movdqu  %xmm0,16(%r13)
        pxor    48(%rsp),%xmm5
        movdqu  %xmm3,32(%r13)
        pxor    64(%rsp),%xmm2
        movdqu  %xmm5,48(%r13)
        pxor    80(%rsp),%xmm6
        movdqu  %xmm2,64(%r13)
        movdqu  %xmm6,80(%r13)
        leaq    96(%r13),%r13

        movdqa  96(%rsp),%xmm6
        jmp     L$xts_enc_done
.p2align        4
L$xts_enc_5:
        pxor    %xmm10,%xmm2
        leaq    80(%r12),%r12
        pxor    %xmm11,%xmm3
        leaq    128(%rsp),%rax
        movl    %edx,%r10d

        call    _bsaes_encrypt8

        pxor    0(%rsp),%xmm15
        pxor    16(%rsp),%xmm0
        movdqu  %xmm15,0(%r13)
        pxor    32(%rsp),%xmm3
        movdqu  %xmm0,16(%r13)
        pxor    48(%rsp),%xmm5
        movdqu  %xmm3,32(%r13)
        pxor    64(%rsp),%xmm2
        movdqu  %xmm5,48(%r13)
        movdqu  %xmm2,64(%r13)
        leaq    80(%r13),%r13

        movdqa  80(%rsp),%xmm6
        jmp     L$xts_enc_done
.p2align        4
L$xts_enc_4:
        pxor    %xmm9,%xmm1
        leaq    64(%r12),%r12
        pxor    %xmm10,%xmm2
        leaq    128(%rsp),%rax
        movl    %edx,%r10d

        call    _bsaes_encrypt8

        pxor    0(%rsp),%xmm15
        pxor    16(%rsp),%xmm0
        movdqu  %xmm15,0(%r13)
        pxor    32(%rsp),%xmm3
        movdqu  %xmm0,16(%r13)
        pxor    48(%rsp),%xmm5
        movdqu  %xmm3,32(%r13)
        movdqu  %xmm5,48(%r13)
        leaq    64(%r13),%r13

        movdqa  64(%rsp),%xmm6
        jmp     L$xts_enc_done
.p2align        4
L$xts_enc_3:
        pxor    %xmm8,%xmm0
        leaq    48(%r12),%r12
        pxor    %xmm9,%xmm1
        leaq    128(%rsp),%rax
        movl    %edx,%r10d

        call    _bsaes_encrypt8

        pxor    0(%rsp),%xmm15
        pxor    16(%rsp),%xmm0
        movdqu  %xmm15,0(%r13)
        pxor    32(%rsp),%xmm3
        movdqu  %xmm0,16(%r13)
        movdqu  %xmm3,32(%r13)
        leaq    48(%r13),%r13

        movdqa  48(%rsp),%xmm6
        jmp     L$xts_enc_done
.p2align        4
L$xts_enc_2:
        pxor    %xmm7,%xmm15
        leaq    32(%r12),%r12
        pxor    %xmm8,%xmm0
        leaq    128(%rsp),%rax
        movl    %edx,%r10d

        call    _bsaes_encrypt8

        pxor    0(%rsp),%xmm15
        pxor    16(%rsp),%xmm0
        movdqu  %xmm15,0(%r13)
        movdqu  %xmm0,16(%r13)
        leaq    32(%r13),%r13

        movdqa  32(%rsp),%xmm6
        jmp     L$xts_enc_done
.p2align        4
L$xts_enc_1:
        pxor    %xmm15,%xmm7
        leaq    16(%r12),%r12
        movdqa  %xmm7,32(%rbp)
        leaq    32(%rbp),%rdi
        leaq    32(%rbp),%rsi
        leaq    (%r15),%rdx
        call    _asm_AES_encrypt
        pxor    32(%rbp),%xmm15





        movdqu  %xmm15,0(%r13)
        leaq    16(%r13),%r13

        movdqa  16(%rsp),%xmm6

L$xts_enc_done:
        andl    $15,%ebx
        jz      L$xts_enc_ret
        movq    %r13,%rdx

L$xts_enc_steal:
        movzbl  (%r12),%eax
        movzbl  -16(%rdx),%ecx
        leaq    1(%r12),%r12
        movb    %al,-16(%rdx)
        movb    %cl,0(%rdx)
        leaq    1(%rdx),%rdx
        subl    $1,%ebx
        jnz     L$xts_enc_steal

        movdqu  -16(%r13),%xmm15
        leaq    32(%rbp),%rdi
        pxor    %xmm6,%xmm15
        leaq    32(%rbp),%rsi
        movdqa  %xmm15,32(%rbp)
        leaq    (%r15),%rdx
        call    _asm_AES_encrypt
        pxor    32(%rbp),%xmm6
        movdqu  %xmm6,-16(%r13)

L$xts_enc_ret:
        leaq    (%rsp),%rax
        pxor    %xmm0,%xmm0
L$xts_enc_bzero:
        movdqa  %xmm0,0(%rax)
        movdqa  %xmm0,16(%rax)
        leaq    32(%rax),%rax
        cmpq    %rax,%rbp
        ja      L$xts_enc_bzero

        leaq    (%rbp),%rsp
        movq    72(%rsp),%r15
        movq    80(%rsp),%r14
        movq    88(%rsp),%r13
        movq    96(%rsp),%r12
        movq    104(%rsp),%rbx
        movq    112(%rsp),%rax
        leaq    120(%rsp),%rsp
        movq    %rax,%rbp
L$xts_enc_epilogue:
        .byte   0xf3,0xc3


.globl  _bsaes_xts_decrypt
.private_extern _bsaes_xts_decrypt

.p2align        4
_bsaes_xts_decrypt:
        movq    %rsp,%rax
L$xts_dec_prologue:
        pushq   %rbp
        pushq   %rbx
        pushq   %r12
        pushq   %r13
        pushq   %r14
        pushq   %r15
        leaq    -72(%rsp),%rsp
        movq    %rsp,%rbp
        movq    %rdi,%r12
        movq    %rsi,%r13
        movq    %rdx,%r14
        movq    %rcx,%r15

        leaq    (%r9),%rdi
        leaq    32(%rbp),%rsi
        leaq    (%r8),%rdx
        call    _asm_AES_encrypt

        movl    240(%r15),%eax
        movq    %r14,%rbx

        movl    %eax,%edx
        shlq    $7,%rax
        subq    $96,%rax
        subq    %rax,%rsp

        movq    %rsp,%rax
        movq    %r15,%rcx
        movl    %edx,%r10d
        call    _bsaes_key_convert
        pxor    (%rsp),%xmm7
        movdqa  %xmm6,(%rax)
        movdqa  %xmm7,(%rsp)

        xorl    %eax,%eax
        andq    $-16,%r14
        testl   $15,%ebx
        setnz   %al
        shlq    $4,%rax
        subq    %rax,%r14

        subq    $0x80,%rsp
        movdqa  32(%rbp),%xmm6

        pxor    %xmm14,%xmm14
        movdqa  L$xts_magic(%rip),%xmm12
        pcmpgtd %xmm6,%xmm14

        subq    $0x80,%r14
        jc      L$xts_dec_short
        jmp     L$xts_dec_loop

.p2align        4
L$xts_dec_loop:
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm15
        movdqa  %xmm6,0(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm0
        movdqa  %xmm6,16(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  0(%r12),%xmm7
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm1
        movdqa  %xmm6,32(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  16(%r12),%xmm8
        pxor    %xmm7,%xmm15
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm2
        movdqa  %xmm6,48(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  32(%r12),%xmm9
        pxor    %xmm8,%xmm0
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm3
        movdqa  %xmm6,64(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  48(%r12),%xmm10
        pxor    %xmm9,%xmm1
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm4
        movdqa  %xmm6,80(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  64(%r12),%xmm11
        pxor    %xmm10,%xmm2
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm5
        movdqa  %xmm6,96(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  80(%r12),%xmm12
        pxor    %xmm11,%xmm3
        movdqu  96(%r12),%xmm13
        pxor    %xmm12,%xmm4
        movdqu  112(%r12),%xmm14
        leaq    128(%r12),%r12
        movdqa  %xmm6,112(%rsp)
        pxor    %xmm13,%xmm5
        leaq    128(%rsp),%rax
        pxor    %xmm14,%xmm6
        movl    %edx,%r10d

        call    _bsaes_decrypt8

        pxor    0(%rsp),%xmm15
        pxor    16(%rsp),%xmm0
        movdqu  %xmm15,0(%r13)
        pxor    32(%rsp),%xmm5
        movdqu  %xmm0,16(%r13)
        pxor    48(%rsp),%xmm3
        movdqu  %xmm5,32(%r13)
        pxor    64(%rsp),%xmm1
        movdqu  %xmm3,48(%r13)
        pxor    80(%rsp),%xmm6
        movdqu  %xmm1,64(%r13)
        pxor    96(%rsp),%xmm2
        movdqu  %xmm6,80(%r13)
        pxor    112(%rsp),%xmm4
        movdqu  %xmm2,96(%r13)
        movdqu  %xmm4,112(%r13)
        leaq    128(%r13),%r13

        movdqa  112(%rsp),%xmm6
        pxor    %xmm14,%xmm14
        movdqa  L$xts_magic(%rip),%xmm12
        pcmpgtd %xmm6,%xmm14
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6

        subq    $0x80,%r14
        jnc     L$xts_dec_loop

L$xts_dec_short:
        addq    $0x80,%r14
        jz      L$xts_dec_done
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm15
        movdqa  %xmm6,0(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm0
        movdqa  %xmm6,16(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  0(%r12),%xmm7
        cmpq    $16,%r14
        je      L$xts_dec_1
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm1
        movdqa  %xmm6,32(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  16(%r12),%xmm8
        cmpq    $32,%r14
        je      L$xts_dec_2
        pxor    %xmm7,%xmm15
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm2
        movdqa  %xmm6,48(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  32(%r12),%xmm9
        cmpq    $48,%r14
        je      L$xts_dec_3
        pxor    %xmm8,%xmm0
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm3
        movdqa  %xmm6,64(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  48(%r12),%xmm10
        cmpq    $64,%r14
        je      L$xts_dec_4
        pxor    %xmm9,%xmm1
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm4
        movdqa  %xmm6,80(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  64(%r12),%xmm11
        cmpq    $80,%r14
        je      L$xts_dec_5
        pxor    %xmm10,%xmm2
        pshufd  $0x13,%xmm14,%xmm13
        pxor    %xmm14,%xmm14
        movdqa  %xmm6,%xmm5
        movdqa  %xmm6,96(%rsp)
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        pcmpgtd %xmm6,%xmm14
        pxor    %xmm13,%xmm6
        movdqu  80(%r12),%xmm12
        cmpq    $96,%r14
        je      L$xts_dec_6
        pxor    %xmm11,%xmm3
        movdqu  96(%r12),%xmm13
        pxor    %xmm12,%xmm4
        movdqa  %xmm6,112(%rsp)
        leaq    112(%r12),%r12
        pxor    %xmm13,%xmm5
        leaq    128(%rsp),%rax
        movl    %edx,%r10d

        call    _bsaes_decrypt8

        pxor    0(%rsp),%xmm15
        pxor    16(%rsp),%xmm0
        movdqu  %xmm15,0(%r13)
        pxor    32(%rsp),%xmm5
        movdqu  %xmm0,16(%r13)
        pxor    48(%rsp),%xmm3
        movdqu  %xmm5,32(%r13)
        pxor    64(%rsp),%xmm1
        movdqu  %xmm3,48(%r13)
        pxor    80(%rsp),%xmm6
        movdqu  %xmm1,64(%r13)
        pxor    96(%rsp),%xmm2
        movdqu  %xmm6,80(%r13)
        movdqu  %xmm2,96(%r13)
        leaq    112(%r13),%r13

        movdqa  112(%rsp),%xmm6
        jmp     L$xts_dec_done
.p2align        4
L$xts_dec_6:
        pxor    %xmm11,%xmm3
        leaq    96(%r12),%r12
        pxor    %xmm12,%xmm4
        leaq    128(%rsp),%rax
        movl    %edx,%r10d

        call    _bsaes_decrypt8

        pxor    0(%rsp),%xmm15
        pxor    16(%rsp),%xmm0
        movdqu  %xmm15,0(%r13)
        pxor    32(%rsp),%xmm5
        movdqu  %xmm0,16(%r13)
        pxor    48(%rsp),%xmm3
        movdqu  %xmm5,32(%r13)
        pxor    64(%rsp),%xmm1
        movdqu  %xmm3,48(%r13)
        pxor    80(%rsp),%xmm6
        movdqu  %xmm1,64(%r13)
        movdqu  %xmm6,80(%r13)
        leaq    96(%r13),%r13

        movdqa  96(%rsp),%xmm6
        jmp     L$xts_dec_done
.p2align        4
L$xts_dec_5:
        pxor    %xmm10,%xmm2
        leaq    80(%r12),%r12
        pxor    %xmm11,%xmm3
        leaq    128(%rsp),%rax
        movl    %edx,%r10d

        call    _bsaes_decrypt8

        pxor    0(%rsp),%xmm15
        pxor    16(%rsp),%xmm0
        movdqu  %xmm15,0(%r13)
        pxor    32(%rsp),%xmm5
        movdqu  %xmm0,16(%r13)
        pxor    48(%rsp),%xmm3
        movdqu  %xmm5,32(%r13)
        pxor    64(%rsp),%xmm1
        movdqu  %xmm3,48(%r13)
        movdqu  %xmm1,64(%r13)
        leaq    80(%r13),%r13

        movdqa  80(%rsp),%xmm6
        jmp     L$xts_dec_done
.p2align        4
L$xts_dec_4:
        pxor    %xmm9,%xmm1
        leaq    64(%r12),%r12
        pxor    %xmm10,%xmm2
        leaq    128(%rsp),%rax
        movl    %edx,%r10d

        call    _bsaes_decrypt8

        pxor    0(%rsp),%xmm15
        pxor    16(%rsp),%xmm0
        movdqu  %xmm15,0(%r13)
        pxor    32(%rsp),%xmm5
        movdqu  %xmm0,16(%r13)
        pxor    48(%rsp),%xmm3
        movdqu  %xmm5,32(%r13)
        movdqu  %xmm3,48(%r13)
        leaq    64(%r13),%r13

        movdqa  64(%rsp),%xmm6
        jmp     L$xts_dec_done
.p2align        4
L$xts_dec_3:
        pxor    %xmm8,%xmm0
        leaq    48(%r12),%r12
        pxor    %xmm9,%xmm1
        leaq    128(%rsp),%rax
        movl    %edx,%r10d

        call    _bsaes_decrypt8

        pxor    0(%rsp),%xmm15
        pxor    16(%rsp),%xmm0
        movdqu  %xmm15,0(%r13)
        pxor    32(%rsp),%xmm5
        movdqu  %xmm0,16(%r13)
        movdqu  %xmm5,32(%r13)
        leaq    48(%r13),%r13

        movdqa  48(%rsp),%xmm6
        jmp     L$xts_dec_done
.p2align        4
L$xts_dec_2:
        pxor    %xmm7,%xmm15
        leaq    32(%r12),%r12
        pxor    %xmm8,%xmm0
        leaq    128(%rsp),%rax
        movl    %edx,%r10d

        call    _bsaes_decrypt8

        pxor    0(%rsp),%xmm15
        pxor    16(%rsp),%xmm0
        movdqu  %xmm15,0(%r13)
        movdqu  %xmm0,16(%r13)
        leaq    32(%r13),%r13

        movdqa  32(%rsp),%xmm6
        jmp     L$xts_dec_done
.p2align        4
L$xts_dec_1:
        pxor    %xmm15,%xmm7
        leaq    16(%r12),%r12
        movdqa  %xmm7,32(%rbp)
        leaq    32(%rbp),%rdi
        leaq    32(%rbp),%rsi
        leaq    (%r15),%rdx
        call    _asm_AES_decrypt
        pxor    32(%rbp),%xmm15





        movdqu  %xmm15,0(%r13)
        leaq    16(%r13),%r13

        movdqa  16(%rsp),%xmm6

L$xts_dec_done:
        andl    $15,%ebx
        jz      L$xts_dec_ret

        pxor    %xmm14,%xmm14
        movdqa  L$xts_magic(%rip),%xmm12
        pcmpgtd %xmm6,%xmm14
        pshufd  $0x13,%xmm14,%xmm13
        movdqa  %xmm6,%xmm5
        paddq   %xmm6,%xmm6
        pand    %xmm12,%xmm13
        movdqu  (%r12),%xmm15
        pxor    %xmm13,%xmm6

        leaq    32(%rbp),%rdi
        pxor    %xmm6,%xmm15
        leaq    32(%rbp),%rsi
        movdqa  %xmm15,32(%rbp)
        leaq    (%r15),%rdx
        call    _asm_AES_decrypt
        pxor    32(%rbp),%xmm6
        movq    %r13,%rdx
        movdqu  %xmm6,(%r13)

L$xts_dec_steal:
        movzbl  16(%r12),%eax
        movzbl  (%rdx),%ecx
        leaq    1(%r12),%r12
        movb    %al,(%rdx)
        movb    %cl,16(%rdx)
        leaq    1(%rdx),%rdx
        subl    $1,%ebx
        jnz     L$xts_dec_steal

        movdqu  (%r13),%xmm15
        leaq    32(%rbp),%rdi
        pxor    %xmm5,%xmm15
        leaq    32(%rbp),%rsi
        movdqa  %xmm15,32(%rbp)
        leaq    (%r15),%rdx
        call    _asm_AES_decrypt
        pxor    32(%rbp),%xmm5
        movdqu  %xmm5,(%r13)

L$xts_dec_ret:
        leaq    (%rsp),%rax
        pxor    %xmm0,%xmm0
L$xts_dec_bzero:
        movdqa  %xmm0,0(%rax)
        movdqa  %xmm0,16(%rax)
        leaq    32(%rax),%rax
        cmpq    %rax,%rbp
        ja      L$xts_dec_bzero

        leaq    (%rbp),%rsp
        movq    72(%rsp),%r15
        movq    80(%rsp),%r14
        movq    88(%rsp),%r13
        movq    96(%rsp),%r12
        movq    104(%rsp),%rbx
        movq    112(%rsp),%rax
        leaq    120(%rsp),%rsp
        movq    %rax,%rbp
L$xts_dec_epilogue:
        .byte   0xf3,0xc3


.p2align        6
_bsaes_const:
L$M0ISR:
.quad   0x0a0e0206070b0f03, 0x0004080c0d010509
L$ISRM0:
.quad   0x01040b0e0205080f, 0x0306090c00070a0d
L$ISR:
.quad   0x0504070602010003, 0x0f0e0d0c080b0a09
L$BS0:
.quad   0x5555555555555555, 0x5555555555555555
L$BS1:
.quad   0x3333333333333333, 0x3333333333333333
L$BS2:
.quad   0x0f0f0f0f0f0f0f0f, 0x0f0f0f0f0f0f0f0f
L$SR:
.quad   0x0504070600030201, 0x0f0e0d0c0a09080b
L$SRM0:
.quad   0x0304090e00050a0f, 0x01060b0c0207080d
L$M0SR:
.quad   0x0a0e02060f03070b, 0x0004080c05090d01
L$SWPUP:
.quad   0x0706050403020100, 0x0c0d0e0f0b0a0908
L$SWPUPM0SR:
.quad   0x0a0d02060c03070b, 0x0004080f05090e01
L$ADD1:
.quad   0x0000000000000000, 0x0000000100000000
L$ADD2:
.quad   0x0000000000000000, 0x0000000200000000
L$ADD3:
.quad   0x0000000000000000, 0x0000000300000000
L$ADD4:
.quad   0x0000000000000000, 0x0000000400000000
L$ADD5:
.quad   0x0000000000000000, 0x0000000500000000
L$ADD6:
.quad   0x0000000000000000, 0x0000000600000000
L$ADD7:
.quad   0x0000000000000000, 0x0000000700000000
L$ADD8:
.quad   0x0000000000000000, 0x0000000800000000
L$xts_magic:
.long   0x87,0,1,0
L$masks:
.quad   0x0101010101010101, 0x0101010101010101
.quad   0x0202020202020202, 0x0202020202020202
.quad   0x0404040404040404, 0x0404040404040404
.quad   0x0808080808080808, 0x0808080808080808
L$M0:
.quad   0x02060a0e03070b0f, 0x0004080c0105090d
L$63:
.quad   0x6363636363636363, 0x6363636363636363
.byte   66,105,116,45,115,108,105,99,101,100,32,65,69,83,32,102,111,114,32,120,56,54,95,54,52,47,83,83,83,69,51,44,32,69,109,105,108,105,97,32,75,195,164,115,112,101,114,44,32,80,101,116,101,114,32,83,99,104,119,97,98,101,44,32,65,110,100,121,32,80,111,108,121,97,107,111,118,0
.p2align        6

#endif