OPTION	DOTNAME
#include "x86_arch.h"
.text$	SEGMENT ALIGN(64) 'CODE'

EXTERN	asm_AES_encrypt:NEAR
EXTERN	asm_AES_decrypt:NEAR


ALIGN	64
_bsaes_encrypt8	PROC PRIVATE
	lea	r11,QWORD PTR[$L$BS0]

	movdqa	xmm8,XMMWORD PTR[rax]
	lea	rax,QWORD PTR[16+rax]
	movdqa	xmm7,XMMWORD PTR[80+r11]
	pxor	xmm15,xmm8
	pxor	xmm0,xmm8
DB	102,68,15,56,0,255
	pxor	xmm1,xmm8
DB	102,15,56,0,199
	pxor	xmm2,xmm8
DB	102,15,56,0,207
	pxor	xmm3,xmm8
DB	102,15,56,0,215
	pxor	xmm4,xmm8
DB	102,15,56,0,223
	pxor	xmm5,xmm8
DB	102,15,56,0,231
	pxor	xmm6,xmm8
DB	102,15,56,0,239
DB	102,15,56,0,247
_bsaes_encrypt8_bitslice::
	movdqa	xmm7,XMMWORD PTR[r11]
	movdqa	xmm8,XMMWORD PTR[16+r11]
	movdqa	xmm9,xmm5
	psrlq	xmm5,1
	movdqa	xmm10,xmm3
	psrlq	xmm3,1
	pxor	xmm5,xmm6
	pxor	xmm3,xmm4
	pand	xmm5,xmm7
	pand	xmm3,xmm7
	pxor	xmm6,xmm5
	psllq	xmm5,1
	pxor	xmm4,xmm3
	psllq	xmm3,1
	pxor	xmm5,xmm9
	pxor	xmm3,xmm10
	movdqa	xmm9,xmm1
	psrlq	xmm1,1
	movdqa	xmm10,xmm15
	psrlq	xmm15,1
	pxor	xmm1,xmm2
	pxor	xmm15,xmm0
	pand	xmm1,xmm7
	pand	xmm15,xmm7
	pxor	xmm2,xmm1
	psllq	xmm1,1
	pxor	xmm0,xmm15
	psllq	xmm15,1
	pxor	xmm1,xmm9
	pxor	xmm15,xmm10
	movdqa	xmm7,XMMWORD PTR[32+r11]
	movdqa	xmm9,xmm4
	psrlq	xmm4,2
	movdqa	xmm10,xmm3
	psrlq	xmm3,2
	pxor	xmm4,xmm6
	pxor	xmm3,xmm5
	pand	xmm4,xmm8
	pand	xmm3,xmm8
	pxor	xmm6,xmm4
	psllq	xmm4,2
	pxor	xmm5,xmm3
	psllq	xmm3,2
	pxor	xmm4,xmm9
	pxor	xmm3,xmm10
	movdqa	xmm9,xmm0
	psrlq	xmm0,2
	movdqa	xmm10,xmm15
	psrlq	xmm15,2
	pxor	xmm0,xmm2
	pxor	xmm15,xmm1
	pand	xmm0,xmm8
	pand	xmm15,xmm8
	pxor	xmm2,xmm0
	psllq	xmm0,2
	pxor	xmm1,xmm15
	psllq	xmm15,2
	pxor	xmm0,xmm9
	pxor	xmm15,xmm10
	movdqa	xmm9,xmm2
	psrlq	xmm2,4
	movdqa	xmm10,xmm1
	psrlq	xmm1,4
	pxor	xmm2,xmm6
	pxor	xmm1,xmm5
	pand	xmm2,xmm7
	pand	xmm1,xmm7
	pxor	xmm6,xmm2
	psllq	xmm2,4
	pxor	xmm5,xmm1
	psllq	xmm1,4
	pxor	xmm2,xmm9
	pxor	xmm1,xmm10
	movdqa	xmm9,xmm0
	psrlq	xmm0,4
	movdqa	xmm10,xmm15
	psrlq	xmm15,4
	pxor	xmm0,xmm4
	pxor	xmm15,xmm3
	pand	xmm0,xmm7
	pand	xmm15,xmm7
	pxor	xmm4,xmm0
	psllq	xmm0,4
	pxor	xmm3,xmm15
	psllq	xmm15,4
	pxor	xmm0,xmm9
	pxor	xmm15,xmm10
	dec	r10d
	jmp	$L$enc_sbox
ALIGN	16
$L$enc_loop::
	pxor	xmm15,XMMWORD PTR[rax]
	pxor	xmm0,XMMWORD PTR[16+rax]
DB	102,68,15,56,0,255
	pxor	xmm1,XMMWORD PTR[32+rax]
DB	102,15,56,0,199
	pxor	xmm2,XMMWORD PTR[48+rax]
DB	102,15,56,0,207
	pxor	xmm3,XMMWORD PTR[64+rax]
DB	102,15,56,0,215
	pxor	xmm4,XMMWORD PTR[80+rax]
DB	102,15,56,0,223
	pxor	xmm5,XMMWORD PTR[96+rax]
DB	102,15,56,0,231
	pxor	xmm6,XMMWORD PTR[112+rax]
DB	102,15,56,0,239
	lea	rax,QWORD PTR[128+rax]
DB	102,15,56,0,247
$L$enc_sbox::
	pxor	xmm4,xmm5
	pxor	xmm1,xmm0
	pxor	xmm2,xmm15
	pxor	xmm5,xmm1
	pxor	xmm4,xmm15

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

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

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

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





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

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

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

	pxor	xmm10,xmm9

	pand	xmm12,xmm10

	movdqa	xmm9,xmm13
	pxor	xmm12,xmm7

	pxor	xmm9,xmm12
	pxor	xmm8,xmm12

	pand	xmm9,xmm7

	pxor	xmm13,xmm9
	pxor	xmm8,xmm9

	pand	xmm13,xmm14

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

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

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

	pxor	xmm5,xmm2
	dec	r10d
	jl	$L$enc_done
	pshufd	xmm7,xmm15,093h
	pshufd	xmm8,xmm0,093h
	pxor	xmm15,xmm7
	pshufd	xmm9,xmm3,093h
	pxor	xmm0,xmm8
	pshufd	xmm10,xmm5,093h
	pxor	xmm3,xmm9
	pshufd	xmm11,xmm2,093h
	pxor	xmm5,xmm10
	pshufd	xmm12,xmm6,093h
	pxor	xmm2,xmm11
	pshufd	xmm13,xmm1,093h
	pxor	xmm6,xmm12
	pshufd	xmm14,xmm4,093h
	pxor	xmm1,xmm13
	pxor	xmm4,xmm14

	pxor	xmm8,xmm15
	pxor	xmm7,xmm4
	pxor	xmm8,xmm4
	pshufd	xmm15,xmm15,04Eh
	pxor	xmm9,xmm0
	pshufd	xmm0,xmm0,04Eh
	pxor	xmm12,xmm2
	pxor	xmm15,xmm7
	pxor	xmm13,xmm6
	pxor	xmm0,xmm8
	pxor	xmm11,xmm5
	pshufd	xmm7,xmm2,04Eh
	pxor	xmm14,xmm1
	pshufd	xmm8,xmm6,04Eh
	pxor	xmm10,xmm3
	pshufd	xmm2,xmm5,04Eh
	pxor	xmm10,xmm4
	pshufd	xmm6,xmm4,04Eh
	pxor	xmm11,xmm4
	pshufd	xmm5,xmm1,04Eh
	pxor	xmm7,xmm11
	pshufd	xmm1,xmm3,04Eh
	pxor	xmm8,xmm12
	pxor	xmm2,xmm10
	pxor	xmm6,xmm14
	pxor	xmm5,xmm13
	movdqa	xmm3,xmm7
	pxor	xmm1,xmm9
	movdqa	xmm4,xmm8
	movdqa	xmm7,XMMWORD PTR[48+r11]
	jnz	$L$enc_loop
	movdqa	xmm7,XMMWORD PTR[64+r11]
	jmp	$L$enc_loop
ALIGN	16
$L$enc_done::
	movdqa	xmm7,XMMWORD PTR[r11]
	movdqa	xmm8,XMMWORD PTR[16+r11]
	movdqa	xmm9,xmm1
	psrlq	xmm1,1
	movdqa	xmm10,xmm2
	psrlq	xmm2,1
	pxor	xmm1,xmm4
	pxor	xmm2,xmm6
	pand	xmm1,xmm7
	pand	xmm2,xmm7
	pxor	xmm4,xmm1
	psllq	xmm1,1
	pxor	xmm6,xmm2
	psllq	xmm2,1
	pxor	xmm1,xmm9
	pxor	xmm2,xmm10
	movdqa	xmm9,xmm3
	psrlq	xmm3,1
	movdqa	xmm10,xmm15
	psrlq	xmm15,1
	pxor	xmm3,xmm5
	pxor	xmm15,xmm0
	pand	xmm3,xmm7
	pand	xmm15,xmm7
	pxor	xmm5,xmm3
	psllq	xmm3,1
	pxor	xmm0,xmm15
	psllq	xmm15,1
	pxor	xmm3,xmm9
	pxor	xmm15,xmm10
	movdqa	xmm7,XMMWORD PTR[32+r11]
	movdqa	xmm9,xmm6
	psrlq	xmm6,2
	movdqa	xmm10,xmm2
	psrlq	xmm2,2
	pxor	xmm6,xmm4
	pxor	xmm2,xmm1
	pand	xmm6,xmm8
	pand	xmm2,xmm8
	pxor	xmm4,xmm6
	psllq	xmm6,2
	pxor	xmm1,xmm2
	psllq	xmm2,2
	pxor	xmm6,xmm9
	pxor	xmm2,xmm10
	movdqa	xmm9,xmm0
	psrlq	xmm0,2
	movdqa	xmm10,xmm15
	psrlq	xmm15,2
	pxor	xmm0,xmm5
	pxor	xmm15,xmm3
	pand	xmm0,xmm8
	pand	xmm15,xmm8
	pxor	xmm5,xmm0
	psllq	xmm0,2
	pxor	xmm3,xmm15
	psllq	xmm15,2
	pxor	xmm0,xmm9
	pxor	xmm15,xmm10
	movdqa	xmm9,xmm5
	psrlq	xmm5,4
	movdqa	xmm10,xmm3
	psrlq	xmm3,4
	pxor	xmm5,xmm4
	pxor	xmm3,xmm1
	pand	xmm5,xmm7
	pand	xmm3,xmm7
	pxor	xmm4,xmm5
	psllq	xmm5,4
	pxor	xmm1,xmm3
	psllq	xmm3,4
	pxor	xmm5,xmm9
	pxor	xmm3,xmm10
	movdqa	xmm9,xmm0
	psrlq	xmm0,4
	movdqa	xmm10,xmm15
	psrlq	xmm15,4
	pxor	xmm0,xmm6
	pxor	xmm15,xmm2
	pand	xmm0,xmm7
	pand	xmm15,xmm7
	pxor	xmm6,xmm0
	psllq	xmm0,4
	pxor	xmm2,xmm15
	psllq	xmm15,4
	pxor	xmm0,xmm9
	pxor	xmm15,xmm10
	movdqa	xmm7,XMMWORD PTR[rax]
	pxor	xmm3,xmm7
	pxor	xmm5,xmm7
	pxor	xmm2,xmm7
	pxor	xmm6,xmm7
	pxor	xmm1,xmm7
	pxor	xmm4,xmm7
	pxor	xmm15,xmm7
	pxor	xmm0,xmm7
	DB	0F3h,0C3h		;repret
_bsaes_encrypt8	ENDP


ALIGN	64
_bsaes_decrypt8	PROC PRIVATE
	lea	r11,QWORD PTR[$L$BS0]

	movdqa	xmm8,XMMWORD PTR[rax]
	lea	rax,QWORD PTR[16+rax]
	movdqa	xmm7,XMMWORD PTR[((-48))+r11]
	pxor	xmm15,xmm8
	pxor	xmm0,xmm8
DB	102,68,15,56,0,255
	pxor	xmm1,xmm8
DB	102,15,56,0,199
	pxor	xmm2,xmm8
DB	102,15,56,0,207
	pxor	xmm3,xmm8
DB	102,15,56,0,215
	pxor	xmm4,xmm8
DB	102,15,56,0,223
	pxor	xmm5,xmm8
DB	102,15,56,0,231
	pxor	xmm6,xmm8
DB	102,15,56,0,239
DB	102,15,56,0,247
	movdqa	xmm7,XMMWORD PTR[r11]
	movdqa	xmm8,XMMWORD PTR[16+r11]
	movdqa	xmm9,xmm5
	psrlq	xmm5,1
	movdqa	xmm10,xmm3
	psrlq	xmm3,1
	pxor	xmm5,xmm6
	pxor	xmm3,xmm4
	pand	xmm5,xmm7
	pand	xmm3,xmm7
	pxor	xmm6,xmm5
	psllq	xmm5,1
	pxor	xmm4,xmm3
	psllq	xmm3,1
	pxor	xmm5,xmm9
	pxor	xmm3,xmm10
	movdqa	xmm9,xmm1
	psrlq	xmm1,1
	movdqa	xmm10,xmm15
	psrlq	xmm15,1
	pxor	xmm1,xmm2
	pxor	xmm15,xmm0
	pand	xmm1,xmm7
	pand	xmm15,xmm7
	pxor	xmm2,xmm1
	psllq	xmm1,1
	pxor	xmm0,xmm15
	psllq	xmm15,1
	pxor	xmm1,xmm9
	pxor	xmm15,xmm10
	movdqa	xmm7,XMMWORD PTR[32+r11]
	movdqa	xmm9,xmm4
	psrlq	xmm4,2
	movdqa	xmm10,xmm3
	psrlq	xmm3,2
	pxor	xmm4,xmm6
	pxor	xmm3,xmm5
	pand	xmm4,xmm8
	pand	xmm3,xmm8
	pxor	xmm6,xmm4
	psllq	xmm4,2
	pxor	xmm5,xmm3
	psllq	xmm3,2
	pxor	xmm4,xmm9
	pxor	xmm3,xmm10
	movdqa	xmm9,xmm0
	psrlq	xmm0,2
	movdqa	xmm10,xmm15
	psrlq	xmm15,2
	pxor	xmm0,xmm2
	pxor	xmm15,xmm1
	pand	xmm0,xmm8
	pand	xmm15,xmm8
	pxor	xmm2,xmm0
	psllq	xmm0,2
	pxor	xmm1,xmm15
	psllq	xmm15,2
	pxor	xmm0,xmm9
	pxor	xmm15,xmm10
	movdqa	xmm9,xmm2
	psrlq	xmm2,4
	movdqa	xmm10,xmm1
	psrlq	xmm1,4
	pxor	xmm2,xmm6
	pxor	xmm1,xmm5
	pand	xmm2,xmm7
	pand	xmm1,xmm7
	pxor	xmm6,xmm2
	psllq	xmm2,4
	pxor	xmm5,xmm1
	psllq	xmm1,4
	pxor	xmm2,xmm9
	pxor	xmm1,xmm10
	movdqa	xmm9,xmm0
	psrlq	xmm0,4
	movdqa	xmm10,xmm15
	psrlq	xmm15,4
	pxor	xmm0,xmm4
	pxor	xmm15,xmm3
	pand	xmm0,xmm7
	pand	xmm15,xmm7
	pxor	xmm4,xmm0
	psllq	xmm0,4
	pxor	xmm3,xmm15
	psllq	xmm15,4
	pxor	xmm0,xmm9
	pxor	xmm15,xmm10
	dec	r10d
	jmp	$L$dec_sbox
ALIGN	16
$L$dec_loop::
	pxor	xmm15,XMMWORD PTR[rax]
	pxor	xmm0,XMMWORD PTR[16+rax]
DB	102,68,15,56,0,255
	pxor	xmm1,XMMWORD PTR[32+rax]
DB	102,15,56,0,199
	pxor	xmm2,XMMWORD PTR[48+rax]
DB	102,15,56,0,207
	pxor	xmm3,XMMWORD PTR[64+rax]
DB	102,15,56,0,215
	pxor	xmm4,XMMWORD PTR[80+rax]
DB	102,15,56,0,223
	pxor	xmm5,XMMWORD PTR[96+rax]
DB	102,15,56,0,231
	pxor	xmm6,XMMWORD PTR[112+rax]
DB	102,15,56,0,239
	lea	rax,QWORD PTR[128+rax]
DB	102,15,56,0,247
$L$dec_sbox::
	pxor	xmm2,xmm3

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

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

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

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





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

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

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

	pxor	xmm10,xmm9

	pand	xmm12,xmm10

	movdqa	xmm9,xmm13
	pxor	xmm12,xmm7

	pxor	xmm9,xmm12
	pxor	xmm8,xmm12

	pand	xmm9,xmm7

	pxor	xmm13,xmm9
	pxor	xmm8,xmm9

	pand	xmm13,xmm14

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

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

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

	pxor	xmm3,xmm15
	pxor	xmm6,xmm2
	dec	r10d
	jl	$L$dec_done

	pshufd	xmm7,xmm15,04Eh
	pshufd	xmm13,xmm2,04Eh
	pxor	xmm7,xmm15
	pshufd	xmm14,xmm4,04Eh
	pxor	xmm13,xmm2
	pshufd	xmm8,xmm0,04Eh
	pxor	xmm14,xmm4
	pshufd	xmm9,xmm5,04Eh
	pxor	xmm8,xmm0
	pshufd	xmm10,xmm3,04Eh
	pxor	xmm9,xmm5
	pxor	xmm15,xmm13
	pxor	xmm0,xmm13
	pshufd	xmm11,xmm1,04Eh
	pxor	xmm10,xmm3
	pxor	xmm5,xmm7
	pxor	xmm3,xmm8
	pshufd	xmm12,xmm6,04Eh
	pxor	xmm11,xmm1
	pxor	xmm0,xmm14
	pxor	xmm1,xmm9
	pxor	xmm12,xmm6

	pxor	xmm5,xmm14
	pxor	xmm3,xmm13
	pxor	xmm1,xmm13
	pxor	xmm6,xmm10
	pxor	xmm2,xmm11
	pxor	xmm1,xmm14
	pxor	xmm6,xmm14
	pxor	xmm4,xmm12
	pshufd	xmm7,xmm15,093h
	pshufd	xmm8,xmm0,093h
	pxor	xmm15,xmm7
	pshufd	xmm9,xmm5,093h
	pxor	xmm0,xmm8
	pshufd	xmm10,xmm3,093h
	pxor	xmm5,xmm9
	pshufd	xmm11,xmm1,093h
	pxor	xmm3,xmm10
	pshufd	xmm12,xmm6,093h
	pxor	xmm1,xmm11
	pshufd	xmm13,xmm2,093h
	pxor	xmm6,xmm12
	pshufd	xmm14,xmm4,093h
	pxor	xmm2,xmm13
	pxor	xmm4,xmm14

	pxor	xmm8,xmm15
	pxor	xmm7,xmm4
	pxor	xmm8,xmm4
	pshufd	xmm15,xmm15,04Eh
	pxor	xmm9,xmm0
	pshufd	xmm0,xmm0,04Eh
	pxor	xmm12,xmm1
	pxor	xmm15,xmm7
	pxor	xmm13,xmm6
	pxor	xmm0,xmm8
	pxor	xmm11,xmm3
	pshufd	xmm7,xmm1,04Eh
	pxor	xmm14,xmm2
	pshufd	xmm8,xmm6,04Eh
	pxor	xmm10,xmm5
	pshufd	xmm1,xmm3,04Eh
	pxor	xmm10,xmm4
	pshufd	xmm6,xmm4,04Eh
	pxor	xmm11,xmm4
	pshufd	xmm3,xmm2,04Eh
	pxor	xmm7,xmm11
	pshufd	xmm2,xmm5,04Eh
	pxor	xmm8,xmm12
	pxor	xmm10,xmm1
	pxor	xmm6,xmm14
	pxor	xmm13,xmm3
	movdqa	xmm3,xmm7
	pxor	xmm2,xmm9
	movdqa	xmm5,xmm13
	movdqa	xmm4,xmm8
	movdqa	xmm1,xmm2
	movdqa	xmm2,xmm10
	movdqa	xmm7,XMMWORD PTR[((-16))+r11]
	jnz	$L$dec_loop
	movdqa	xmm7,XMMWORD PTR[((-32))+r11]
	jmp	$L$dec_loop
ALIGN	16
$L$dec_done::
	movdqa	xmm7,XMMWORD PTR[r11]
	movdqa	xmm8,XMMWORD PTR[16+r11]
	movdqa	xmm9,xmm2
	psrlq	xmm2,1
	movdqa	xmm10,xmm1
	psrlq	xmm1,1
	pxor	xmm2,xmm4
	pxor	xmm1,xmm6
	pand	xmm2,xmm7
	pand	xmm1,xmm7
	pxor	xmm4,xmm2
	psllq	xmm2,1
	pxor	xmm6,xmm1
	psllq	xmm1,1
	pxor	xmm2,xmm9
	pxor	xmm1,xmm10
	movdqa	xmm9,xmm5
	psrlq	xmm5,1
	movdqa	xmm10,xmm15
	psrlq	xmm15,1
	pxor	xmm5,xmm3
	pxor	xmm15,xmm0
	pand	xmm5,xmm7
	pand	xmm15,xmm7
	pxor	xmm3,xmm5
	psllq	xmm5,1
	pxor	xmm0,xmm15
	psllq	xmm15,1
	pxor	xmm5,xmm9
	pxor	xmm15,xmm10
	movdqa	xmm7,XMMWORD PTR[32+r11]
	movdqa	xmm9,xmm6
	psrlq	xmm6,2
	movdqa	xmm10,xmm1
	psrlq	xmm1,2
	pxor	xmm6,xmm4
	pxor	xmm1,xmm2
	pand	xmm6,xmm8
	pand	xmm1,xmm8
	pxor	xmm4,xmm6
	psllq	xmm6,2
	pxor	xmm2,xmm1
	psllq	xmm1,2
	pxor	xmm6,xmm9
	pxor	xmm1,xmm10
	movdqa	xmm9,xmm0
	psrlq	xmm0,2
	movdqa	xmm10,xmm15
	psrlq	xmm15,2
	pxor	xmm0,xmm3
	pxor	xmm15,xmm5
	pand	xmm0,xmm8
	pand	xmm15,xmm8
	pxor	xmm3,xmm0
	psllq	xmm0,2
	pxor	xmm5,xmm15
	psllq	xmm15,2
	pxor	xmm0,xmm9
	pxor	xmm15,xmm10
	movdqa	xmm9,xmm3
	psrlq	xmm3,4
	movdqa	xmm10,xmm5
	psrlq	xmm5,4
	pxor	xmm3,xmm4
	pxor	xmm5,xmm2
	pand	xmm3,xmm7
	pand	xmm5,xmm7
	pxor	xmm4,xmm3
	psllq	xmm3,4
	pxor	xmm2,xmm5
	psllq	xmm5,4
	pxor	xmm3,xmm9
	pxor	xmm5,xmm10
	movdqa	xmm9,xmm0
	psrlq	xmm0,4
	movdqa	xmm10,xmm15
	psrlq	xmm15,4
	pxor	xmm0,xmm6
	pxor	xmm15,xmm1
	pand	xmm0,xmm7
	pand	xmm15,xmm7
	pxor	xmm6,xmm0
	psllq	xmm0,4
	pxor	xmm1,xmm15
	psllq	xmm15,4
	pxor	xmm0,xmm9
	pxor	xmm15,xmm10
	movdqa	xmm7,XMMWORD PTR[rax]
	pxor	xmm5,xmm7
	pxor	xmm3,xmm7
	pxor	xmm1,xmm7
	pxor	xmm6,xmm7
	pxor	xmm2,xmm7
	pxor	xmm4,xmm7
	pxor	xmm15,xmm7
	pxor	xmm0,xmm7
	DB	0F3h,0C3h		;repret
_bsaes_decrypt8	ENDP

ALIGN	16
_bsaes_key_convert	PROC PRIVATE
	lea	r11,QWORD PTR[$L$masks]
	movdqu	xmm7,XMMWORD PTR[rcx]
	lea	rcx,QWORD PTR[16+rcx]
	movdqa	xmm0,XMMWORD PTR[r11]
	movdqa	xmm1,XMMWORD PTR[16+r11]
	movdqa	xmm2,XMMWORD PTR[32+r11]
	movdqa	xmm3,XMMWORD PTR[48+r11]
	movdqa	xmm4,XMMWORD PTR[64+r11]
	pcmpeqd	xmm5,xmm5

	movdqu	xmm6,XMMWORD PTR[rcx]
	movdqa	XMMWORD PTR[rax],xmm7
	lea	rax,QWORD PTR[16+rax]
	dec	r10d
	jmp	$L$key_loop
ALIGN	16
$L$key_loop::
DB	102,15,56,0,244

	movdqa	xmm8,xmm0
	movdqa	xmm9,xmm1

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

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

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

	pand	xmm12,xmm6
	pand	xmm13,xmm6
	movdqa	XMMWORD PTR[rax],xmm8
	pcmpeqb	xmm12,xmm0
	psrlq	xmm0,4
	movdqa	XMMWORD PTR[16+rax],xmm9
	pcmpeqb	xmm13,xmm1
	psrlq	xmm1,4
	lea	rcx,QWORD PTR[16+rcx]

	pand	xmm14,xmm6
	pand	xmm15,xmm6
	movdqa	XMMWORD PTR[32+rax],xmm10
	pcmpeqb	xmm14,xmm2
	psrlq	xmm2,4
	movdqa	XMMWORD PTR[48+rax],xmm11
	pcmpeqb	xmm15,xmm3
	psrlq	xmm3,4
	movdqu	xmm6,XMMWORD PTR[rcx]

	pxor	xmm13,xmm5
	pxor	xmm14,xmm5
	movdqa	XMMWORD PTR[64+rax],xmm12
	movdqa	XMMWORD PTR[80+rax],xmm13
	movdqa	XMMWORD PTR[96+rax],xmm14
	movdqa	XMMWORD PTR[112+rax],xmm15
	lea	rax,QWORD PTR[128+rax]
	dec	r10d
	jnz	$L$key_loop

	movdqa	xmm7,XMMWORD PTR[80+r11]

	DB	0F3h,0C3h		;repret
_bsaes_key_convert	ENDP
EXTERN	asm_AES_cbc_encrypt:NEAR
PUBLIC	bsaes_cbc_encrypt

ALIGN	16
bsaes_cbc_encrypt	PROC PUBLIC
	mov	r11d,DWORD PTR[48+rsp]
	cmp	r11d,0
	jne	asm_AES_cbc_encrypt
	cmp	r8,128
	jb	asm_AES_cbc_encrypt

	mov	rax,rsp
$L$cbc_dec_prologue::
	push	rbp
	push	rbx
	push	r12
	push	r13
	push	r14
	push	r15
	lea	rsp,QWORD PTR[((-72))+rsp]
	mov	r10,QWORD PTR[160+rsp]
	lea	rsp,QWORD PTR[((-160))+rsp]
	movaps	XMMWORD PTR[64+rsp],xmm6
	movaps	XMMWORD PTR[80+rsp],xmm7
	movaps	XMMWORD PTR[96+rsp],xmm8
	movaps	XMMWORD PTR[112+rsp],xmm9
	movaps	XMMWORD PTR[128+rsp],xmm10
	movaps	XMMWORD PTR[144+rsp],xmm11
	movaps	XMMWORD PTR[160+rsp],xmm12
	movaps	XMMWORD PTR[176+rsp],xmm13
	movaps	XMMWORD PTR[192+rsp],xmm14
	movaps	XMMWORD PTR[208+rsp],xmm15
$L$cbc_dec_body::
	mov	rbp,rsp
	mov	eax,DWORD PTR[240+r9]
	mov	r12,rcx
	mov	r13,rdx
	mov	r14,r8
	mov	r15,r9
	mov	rbx,r10
	shr	r14,4

	mov	edx,eax
	shl	rax,7
	sub	rax,96
	sub	rsp,rax

	mov	rax,rsp
	mov	rcx,r15
	mov	r10d,edx
	call	_bsaes_key_convert
	pxor	xmm7,XMMWORD PTR[rsp]
	movdqa	XMMWORD PTR[rax],xmm6
	movdqa	XMMWORD PTR[rsp],xmm7

	movdqu	xmm14,XMMWORD PTR[rbx]
	sub	r14,8
$L$cbc_dec_loop::
	movdqu	xmm15,XMMWORD PTR[r12]
	movdqu	xmm0,XMMWORD PTR[16+r12]
	movdqu	xmm1,XMMWORD PTR[32+r12]
	movdqu	xmm2,XMMWORD PTR[48+r12]
	movdqu	xmm3,XMMWORD PTR[64+r12]
	movdqu	xmm4,XMMWORD PTR[80+r12]
	mov	rax,rsp
	movdqu	xmm5,XMMWORD PTR[96+r12]
	mov	r10d,edx
	movdqu	xmm6,XMMWORD PTR[112+r12]
	movdqa	XMMWORD PTR[32+rbp],xmm14

	call	_bsaes_decrypt8

	pxor	xmm15,XMMWORD PTR[32+rbp]
	movdqu	xmm7,XMMWORD PTR[r12]
	movdqu	xmm8,XMMWORD PTR[16+r12]
	pxor	xmm0,xmm7
	movdqu	xmm9,XMMWORD PTR[32+r12]
	pxor	xmm5,xmm8
	movdqu	xmm10,XMMWORD PTR[48+r12]
	pxor	xmm3,xmm9
	movdqu	xmm11,XMMWORD PTR[64+r12]
	pxor	xmm1,xmm10
	movdqu	xmm12,XMMWORD PTR[80+r12]
	pxor	xmm6,xmm11
	movdqu	xmm13,XMMWORD PTR[96+r12]
	pxor	xmm2,xmm12
	movdqu	xmm14,XMMWORD PTR[112+r12]
	pxor	xmm4,xmm13
	movdqu	XMMWORD PTR[r13],xmm15
	lea	r12,QWORD PTR[128+r12]
	movdqu	XMMWORD PTR[16+r13],xmm0
	movdqu	XMMWORD PTR[32+r13],xmm5
	movdqu	XMMWORD PTR[48+r13],xmm3
	movdqu	XMMWORD PTR[64+r13],xmm1
	movdqu	XMMWORD PTR[80+r13],xmm6
	movdqu	XMMWORD PTR[96+r13],xmm2
	movdqu	XMMWORD PTR[112+r13],xmm4
	lea	r13,QWORD PTR[128+r13]
	sub	r14,8
	jnc	$L$cbc_dec_loop

	add	r14,8
	jz	$L$cbc_dec_done

	movdqu	xmm15,XMMWORD PTR[r12]
	mov	rax,rsp
	mov	r10d,edx
	cmp	r14,2
	jb	$L$cbc_dec_one
	movdqu	xmm0,XMMWORD PTR[16+r12]
	je	$L$cbc_dec_two
	movdqu	xmm1,XMMWORD PTR[32+r12]
	cmp	r14,4
	jb	$L$cbc_dec_three
	movdqu	xmm2,XMMWORD PTR[48+r12]
	je	$L$cbc_dec_four
	movdqu	xmm3,XMMWORD PTR[64+r12]
	cmp	r14,6
	jb	$L$cbc_dec_five
	movdqu	xmm4,XMMWORD PTR[80+r12]
	je	$L$cbc_dec_six
	movdqu	xmm5,XMMWORD PTR[96+r12]
	movdqa	XMMWORD PTR[32+rbp],xmm14
	call	_bsaes_decrypt8
	pxor	xmm15,XMMWORD PTR[32+rbp]
	movdqu	xmm7,XMMWORD PTR[r12]
	movdqu	xmm8,XMMWORD PTR[16+r12]
	pxor	xmm0,xmm7
	movdqu	xmm9,XMMWORD PTR[32+r12]
	pxor	xmm5,xmm8
	movdqu	xmm10,XMMWORD PTR[48+r12]
	pxor	xmm3,xmm9
	movdqu	xmm11,XMMWORD PTR[64+r12]
	pxor	xmm1,xmm10
	movdqu	xmm12,XMMWORD PTR[80+r12]
	pxor	xmm6,xmm11
	movdqu	xmm14,XMMWORD PTR[96+r12]
	pxor	xmm2,xmm12
	movdqu	XMMWORD PTR[r13],xmm15
	movdqu	XMMWORD PTR[16+r13],xmm0
	movdqu	XMMWORD PTR[32+r13],xmm5
	movdqu	XMMWORD PTR[48+r13],xmm3
	movdqu	XMMWORD PTR[64+r13],xmm1
	movdqu	XMMWORD PTR[80+r13],xmm6
	movdqu	XMMWORD PTR[96+r13],xmm2
	jmp	$L$cbc_dec_done
ALIGN	16
$L$cbc_dec_six::
	movdqa	XMMWORD PTR[32+rbp],xmm14
	call	_bsaes_decrypt8
	pxor	xmm15,XMMWORD PTR[32+rbp]
	movdqu	xmm7,XMMWORD PTR[r12]
	movdqu	xmm8,XMMWORD PTR[16+r12]
	pxor	xmm0,xmm7
	movdqu	xmm9,XMMWORD PTR[32+r12]
	pxor	xmm5,xmm8
	movdqu	xmm10,XMMWORD PTR[48+r12]
	pxor	xmm3,xmm9
	movdqu	xmm11,XMMWORD PTR[64+r12]
	pxor	xmm1,xmm10
	movdqu	xmm14,XMMWORD PTR[80+r12]
	pxor	xmm6,xmm11
	movdqu	XMMWORD PTR[r13],xmm15
	movdqu	XMMWORD PTR[16+r13],xmm0
	movdqu	XMMWORD PTR[32+r13],xmm5
	movdqu	XMMWORD PTR[48+r13],xmm3
	movdqu	XMMWORD PTR[64+r13],xmm1
	movdqu	XMMWORD PTR[80+r13],xmm6
	jmp	$L$cbc_dec_done
ALIGN	16
$L$cbc_dec_five::
	movdqa	XMMWORD PTR[32+rbp],xmm14
	call	_bsaes_decrypt8
	pxor	xmm15,XMMWORD PTR[32+rbp]
	movdqu	xmm7,XMMWORD PTR[r12]
	movdqu	xmm8,XMMWORD PTR[16+r12]
	pxor	xmm0,xmm7
	movdqu	xmm9,XMMWORD PTR[32+r12]
	pxor	xmm5,xmm8
	movdqu	xmm10,XMMWORD PTR[48+r12]
	pxor	xmm3,xmm9
	movdqu	xmm14,XMMWORD PTR[64+r12]
	pxor	xmm1,xmm10
	movdqu	XMMWORD PTR[r13],xmm15
	movdqu	XMMWORD PTR[16+r13],xmm0
	movdqu	XMMWORD PTR[32+r13],xmm5
	movdqu	XMMWORD PTR[48+r13],xmm3
	movdqu	XMMWORD PTR[64+r13],xmm1
	jmp	$L$cbc_dec_done
ALIGN	16
$L$cbc_dec_four::
	movdqa	XMMWORD PTR[32+rbp],xmm14
	call	_bsaes_decrypt8
	pxor	xmm15,XMMWORD PTR[32+rbp]
	movdqu	xmm7,XMMWORD PTR[r12]
	movdqu	xmm8,XMMWORD PTR[16+r12]
	pxor	xmm0,xmm7
	movdqu	xmm9,XMMWORD PTR[32+r12]
	pxor	xmm5,xmm8
	movdqu	xmm14,XMMWORD PTR[48+r12]
	pxor	xmm3,xmm9
	movdqu	XMMWORD PTR[r13],xmm15
	movdqu	XMMWORD PTR[16+r13],xmm0
	movdqu	XMMWORD PTR[32+r13],xmm5
	movdqu	XMMWORD PTR[48+r13],xmm3
	jmp	$L$cbc_dec_done
ALIGN	16
$L$cbc_dec_three::
	movdqa	XMMWORD PTR[32+rbp],xmm14
	call	_bsaes_decrypt8
	pxor	xmm15,XMMWORD PTR[32+rbp]
	movdqu	xmm7,XMMWORD PTR[r12]
	movdqu	xmm8,XMMWORD PTR[16+r12]
	pxor	xmm0,xmm7
	movdqu	xmm14,XMMWORD PTR[32+r12]
	pxor	xmm5,xmm8
	movdqu	XMMWORD PTR[r13],xmm15
	movdqu	XMMWORD PTR[16+r13],xmm0
	movdqu	XMMWORD PTR[32+r13],xmm5
	jmp	$L$cbc_dec_done
ALIGN	16
$L$cbc_dec_two::
	movdqa	XMMWORD PTR[32+rbp],xmm14
	call	_bsaes_decrypt8
	pxor	xmm15,XMMWORD PTR[32+rbp]
	movdqu	xmm7,XMMWORD PTR[r12]
	movdqu	xmm14,XMMWORD PTR[16+r12]
	pxor	xmm0,xmm7
	movdqu	XMMWORD PTR[r13],xmm15
	movdqu	XMMWORD PTR[16+r13],xmm0
	jmp	$L$cbc_dec_done
ALIGN	16
$L$cbc_dec_one::
	lea	rcx,QWORD PTR[r12]
	lea	rdx,QWORD PTR[32+rbp]
	lea	r8,QWORD PTR[r15]
	call	asm_AES_decrypt		
	pxor	xmm14,XMMWORD PTR[32+rbp]
	movdqu	XMMWORD PTR[r13],xmm14
	movdqa	xmm14,xmm15

$L$cbc_dec_done::
	movdqu	XMMWORD PTR[rbx],xmm14
	lea	rax,QWORD PTR[rsp]
	pxor	xmm0,xmm0
$L$cbc_dec_bzero::
	movdqa	XMMWORD PTR[rax],xmm0
	movdqa	XMMWORD PTR[16+rax],xmm0
	lea	rax,QWORD PTR[32+rax]
	cmp	rbp,rax
	ja	$L$cbc_dec_bzero

	lea	rsp,QWORD PTR[rbp]
	movaps	xmm6,XMMWORD PTR[64+rbp]
	movaps	xmm7,XMMWORD PTR[80+rbp]
	movaps	xmm8,XMMWORD PTR[96+rbp]
	movaps	xmm9,XMMWORD PTR[112+rbp]
	movaps	xmm10,XMMWORD PTR[128+rbp]
	movaps	xmm11,XMMWORD PTR[144+rbp]
	movaps	xmm12,XMMWORD PTR[160+rbp]
	movaps	xmm13,XMMWORD PTR[176+rbp]
	movaps	xmm14,XMMWORD PTR[192+rbp]
	movaps	xmm15,XMMWORD PTR[208+rbp]
	lea	rsp,QWORD PTR[160+rbp]
	mov	r15,QWORD PTR[72+rsp]
	mov	r14,QWORD PTR[80+rsp]
	mov	r13,QWORD PTR[88+rsp]
	mov	r12,QWORD PTR[96+rsp]
	mov	rbx,QWORD PTR[104+rsp]
	mov	rax,QWORD PTR[112+rsp]
	lea	rsp,QWORD PTR[120+rsp]
	mov	rbp,rax
$L$cbc_dec_epilogue::
	DB	0F3h,0C3h		;repret
bsaes_cbc_encrypt	ENDP

PUBLIC	bsaes_ctr32_encrypt_blocks

ALIGN	16
bsaes_ctr32_encrypt_blocks	PROC PUBLIC
	mov	rax,rsp
$L$ctr_enc_prologue::
	push	rbp
	push	rbx
	push	r12
	push	r13
	push	r14
	push	r15
	lea	rsp,QWORD PTR[((-72))+rsp]
	mov	r10,QWORD PTR[160+rsp]
	lea	rsp,QWORD PTR[((-160))+rsp]
	movaps	XMMWORD PTR[64+rsp],xmm6
	movaps	XMMWORD PTR[80+rsp],xmm7
	movaps	XMMWORD PTR[96+rsp],xmm8
	movaps	XMMWORD PTR[112+rsp],xmm9
	movaps	XMMWORD PTR[128+rsp],xmm10
	movaps	XMMWORD PTR[144+rsp],xmm11
	movaps	XMMWORD PTR[160+rsp],xmm12
	movaps	XMMWORD PTR[176+rsp],xmm13
	movaps	XMMWORD PTR[192+rsp],xmm14
	movaps	XMMWORD PTR[208+rsp],xmm15
$L$ctr_enc_body::
	mov	rbp,rsp
	movdqu	xmm0,XMMWORD PTR[r10]
	mov	eax,DWORD PTR[240+r9]
	mov	r12,rcx
	mov	r13,rdx
	mov	r14,r8
	mov	r15,r9
	movdqa	XMMWORD PTR[32+rbp],xmm0
	cmp	r8,8
	jb	$L$ctr_enc_short

	mov	ebx,eax
	shl	rax,7
	sub	rax,96
	sub	rsp,rax

	mov	rax,rsp
	mov	rcx,r15
	mov	r10d,ebx
	call	_bsaes_key_convert
	pxor	xmm7,xmm6
	movdqa	XMMWORD PTR[rax],xmm7

	movdqa	xmm8,XMMWORD PTR[rsp]
	lea	r11,QWORD PTR[$L$ADD1]
	movdqa	xmm15,XMMWORD PTR[32+rbp]
	movdqa	xmm7,XMMWORD PTR[((-32))+r11]
DB	102,68,15,56,0,199
DB	102,68,15,56,0,255
	movdqa	XMMWORD PTR[rsp],xmm8
	jmp	$L$ctr_enc_loop
ALIGN	16
$L$ctr_enc_loop::
	movdqa	XMMWORD PTR[32+rbp],xmm15
	movdqa	xmm0,xmm15
	movdqa	xmm1,xmm15
	paddd	xmm0,XMMWORD PTR[r11]
	movdqa	xmm2,xmm15
	paddd	xmm1,XMMWORD PTR[16+r11]
	movdqa	xmm3,xmm15
	paddd	xmm2,XMMWORD PTR[32+r11]
	movdqa	xmm4,xmm15
	paddd	xmm3,XMMWORD PTR[48+r11]
	movdqa	xmm5,xmm15
	paddd	xmm4,XMMWORD PTR[64+r11]
	movdqa	xmm6,xmm15
	paddd	xmm5,XMMWORD PTR[80+r11]
	paddd	xmm6,XMMWORD PTR[96+r11]



	movdqa	xmm8,XMMWORD PTR[rsp]
	lea	rax,QWORD PTR[16+rsp]
	movdqa	xmm7,XMMWORD PTR[((-16))+r11]
	pxor	xmm15,xmm8
	pxor	xmm0,xmm8
DB	102,68,15,56,0,255
	pxor	xmm1,xmm8
DB	102,15,56,0,199
	pxor	xmm2,xmm8
DB	102,15,56,0,207
	pxor	xmm3,xmm8
DB	102,15,56,0,215
	pxor	xmm4,xmm8
DB	102,15,56,0,223
	pxor	xmm5,xmm8
DB	102,15,56,0,231
	pxor	xmm6,xmm8
DB	102,15,56,0,239
	lea	r11,QWORD PTR[$L$BS0]
DB	102,15,56,0,247
	mov	r10d,ebx

	call	_bsaes_encrypt8_bitslice

	sub	r14,8
	jc	$L$ctr_enc_loop_done

	movdqu	xmm7,XMMWORD PTR[r12]
	movdqu	xmm8,XMMWORD PTR[16+r12]
	movdqu	xmm9,XMMWORD PTR[32+r12]
	movdqu	xmm10,XMMWORD PTR[48+r12]
	movdqu	xmm11,XMMWORD PTR[64+r12]
	movdqu	xmm12,XMMWORD PTR[80+r12]
	movdqu	xmm13,XMMWORD PTR[96+r12]
	movdqu	xmm14,XMMWORD PTR[112+r12]
	lea	r12,QWORD PTR[128+r12]
	pxor	xmm7,xmm15
	movdqa	xmm15,XMMWORD PTR[32+rbp]
	pxor	xmm0,xmm8
	movdqu	XMMWORD PTR[r13],xmm7
	pxor	xmm3,xmm9
	movdqu	XMMWORD PTR[16+r13],xmm0
	pxor	xmm5,xmm10
	movdqu	XMMWORD PTR[32+r13],xmm3
	pxor	xmm2,xmm11
	movdqu	XMMWORD PTR[48+r13],xmm5
	pxor	xmm6,xmm12
	movdqu	XMMWORD PTR[64+r13],xmm2
	pxor	xmm1,xmm13
	movdqu	XMMWORD PTR[80+r13],xmm6
	pxor	xmm4,xmm14
	movdqu	XMMWORD PTR[96+r13],xmm1
	lea	r11,QWORD PTR[$L$ADD1]
	movdqu	XMMWORD PTR[112+r13],xmm4
	lea	r13,QWORD PTR[128+r13]
	paddd	xmm15,XMMWORD PTR[112+r11]
	jnz	$L$ctr_enc_loop

	jmp	$L$ctr_enc_done
ALIGN	16
$L$ctr_enc_loop_done::
	add	r14,8
	movdqu	xmm7,XMMWORD PTR[r12]
	pxor	xmm15,xmm7
	movdqu	XMMWORD PTR[r13],xmm15
	cmp	r14,2
	jb	$L$ctr_enc_done
	movdqu	xmm8,XMMWORD PTR[16+r12]
	pxor	xmm0,xmm8
	movdqu	XMMWORD PTR[16+r13],xmm0
	je	$L$ctr_enc_done
	movdqu	xmm9,XMMWORD PTR[32+r12]
	pxor	xmm3,xmm9
	movdqu	XMMWORD PTR[32+r13],xmm3
	cmp	r14,4
	jb	$L$ctr_enc_done
	movdqu	xmm10,XMMWORD PTR[48+r12]
	pxor	xmm5,xmm10
	movdqu	XMMWORD PTR[48+r13],xmm5
	je	$L$ctr_enc_done
	movdqu	xmm11,XMMWORD PTR[64+r12]
	pxor	xmm2,xmm11
	movdqu	XMMWORD PTR[64+r13],xmm2
	cmp	r14,6
	jb	$L$ctr_enc_done
	movdqu	xmm12,XMMWORD PTR[80+r12]
	pxor	xmm6,xmm12
	movdqu	XMMWORD PTR[80+r13],xmm6
	je	$L$ctr_enc_done
	movdqu	xmm13,XMMWORD PTR[96+r12]
	pxor	xmm1,xmm13
	movdqu	XMMWORD PTR[96+r13],xmm1
	jmp	$L$ctr_enc_done

ALIGN	16
$L$ctr_enc_short::
	lea	rcx,QWORD PTR[32+rbp]
	lea	rdx,QWORD PTR[48+rbp]
	lea	r8,QWORD PTR[r15]
	call	asm_AES_encrypt
	movdqu	xmm0,XMMWORD PTR[r12]
	lea	r12,QWORD PTR[16+r12]
	mov	eax,DWORD PTR[44+rbp]
	bswap	eax
	pxor	xmm0,XMMWORD PTR[48+rbp]
	inc	eax
	movdqu	XMMWORD PTR[r13],xmm0
	bswap	eax
	lea	r13,QWORD PTR[16+r13]
	mov	DWORD PTR[44+rsp],eax
	dec	r14
	jnz	$L$ctr_enc_short

$L$ctr_enc_done::
	lea	rax,QWORD PTR[rsp]
	pxor	xmm0,xmm0
$L$ctr_enc_bzero::
	movdqa	XMMWORD PTR[rax],xmm0
	movdqa	XMMWORD PTR[16+rax],xmm0
	lea	rax,QWORD PTR[32+rax]
	cmp	rbp,rax
	ja	$L$ctr_enc_bzero

	lea	rsp,QWORD PTR[rbp]
	movaps	xmm6,XMMWORD PTR[64+rbp]
	movaps	xmm7,XMMWORD PTR[80+rbp]
	movaps	xmm8,XMMWORD PTR[96+rbp]
	movaps	xmm9,XMMWORD PTR[112+rbp]
	movaps	xmm10,XMMWORD PTR[128+rbp]
	movaps	xmm11,XMMWORD PTR[144+rbp]
	movaps	xmm12,XMMWORD PTR[160+rbp]
	movaps	xmm13,XMMWORD PTR[176+rbp]
	movaps	xmm14,XMMWORD PTR[192+rbp]
	movaps	xmm15,XMMWORD PTR[208+rbp]
	lea	rsp,QWORD PTR[160+rbp]
	mov	r15,QWORD PTR[72+rsp]
	mov	r14,QWORD PTR[80+rsp]
	mov	r13,QWORD PTR[88+rsp]
	mov	r12,QWORD PTR[96+rsp]
	mov	rbx,QWORD PTR[104+rsp]
	mov	rax,QWORD PTR[112+rsp]
	lea	rsp,QWORD PTR[120+rsp]
	mov	rbp,rax
$L$ctr_enc_epilogue::
	DB	0F3h,0C3h		;repret
bsaes_ctr32_encrypt_blocks	ENDP
PUBLIC	bsaes_xts_encrypt

ALIGN	16
bsaes_xts_encrypt	PROC PUBLIC
	mov	rax,rsp
$L$xts_enc_prologue::
	push	rbp
	push	rbx
	push	r12
	push	r13
	push	r14
	push	r15
	lea	rsp,QWORD PTR[((-72))+rsp]
	mov	r10,QWORD PTR[160+rsp]
	mov	r11,QWORD PTR[168+rsp]
	lea	rsp,QWORD PTR[((-160))+rsp]
	movaps	XMMWORD PTR[64+rsp],xmm6
	movaps	XMMWORD PTR[80+rsp],xmm7
	movaps	XMMWORD PTR[96+rsp],xmm8
	movaps	XMMWORD PTR[112+rsp],xmm9
	movaps	XMMWORD PTR[128+rsp],xmm10
	movaps	XMMWORD PTR[144+rsp],xmm11
	movaps	XMMWORD PTR[160+rsp],xmm12
	movaps	XMMWORD PTR[176+rsp],xmm13
	movaps	XMMWORD PTR[192+rsp],xmm14
	movaps	XMMWORD PTR[208+rsp],xmm15
$L$xts_enc_body::
	mov	rbp,rsp
	mov	r12,rcx
	mov	r13,rdx
	mov	r14,r8
	mov	r15,r9

	lea	rcx,QWORD PTR[r11]
	lea	rdx,QWORD PTR[32+rbp]
	lea	r8,QWORD PTR[r10]
	call	asm_AES_encrypt		

	mov	eax,DWORD PTR[240+r15]
	mov	rbx,r14

	mov	edx,eax
	shl	rax,7
	sub	rax,96
	sub	rsp,rax

	mov	rax,rsp
	mov	rcx,r15
	mov	r10d,edx
	call	_bsaes_key_convert
	pxor	xmm7,xmm6
	movdqa	XMMWORD PTR[rax],xmm7

	and	r14,-16
	sub	rsp,080h
	movdqa	xmm6,XMMWORD PTR[32+rbp]

	pxor	xmm14,xmm14
	movdqa	xmm12,XMMWORD PTR[$L$xts_magic]
	pcmpgtd	xmm14,xmm6

	sub	r14,080h
	jc	$L$xts_enc_short
	jmp	$L$xts_enc_loop

ALIGN	16
$L$xts_enc_loop::
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm15,xmm6
	movdqa	XMMWORD PTR[rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm0,xmm6
	movdqa	XMMWORD PTR[16+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm7,XMMWORD PTR[r12]
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm1,xmm6
	movdqa	XMMWORD PTR[32+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm8,XMMWORD PTR[16+r12]
	pxor	xmm15,xmm7
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm2,xmm6
	movdqa	XMMWORD PTR[48+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm9,XMMWORD PTR[32+r12]
	pxor	xmm0,xmm8
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm3,xmm6
	movdqa	XMMWORD PTR[64+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm10,XMMWORD PTR[48+r12]
	pxor	xmm1,xmm9
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm4,xmm6
	movdqa	XMMWORD PTR[80+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm11,XMMWORD PTR[64+r12]
	pxor	xmm2,xmm10
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm5,xmm6
	movdqa	XMMWORD PTR[96+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm12,XMMWORD PTR[80+r12]
	pxor	xmm3,xmm11
	movdqu	xmm13,XMMWORD PTR[96+r12]
	pxor	xmm4,xmm12
	movdqu	xmm14,XMMWORD PTR[112+r12]
	lea	r12,QWORD PTR[128+r12]
	movdqa	XMMWORD PTR[112+rsp],xmm6
	pxor	xmm5,xmm13
	lea	rax,QWORD PTR[128+rsp]
	pxor	xmm6,xmm14
	mov	r10d,edx

	call	_bsaes_encrypt8

	pxor	xmm15,XMMWORD PTR[rsp]
	pxor	xmm0,XMMWORD PTR[16+rsp]
	movdqu	XMMWORD PTR[r13],xmm15
	pxor	xmm3,XMMWORD PTR[32+rsp]
	movdqu	XMMWORD PTR[16+r13],xmm0
	pxor	xmm5,XMMWORD PTR[48+rsp]
	movdqu	XMMWORD PTR[32+r13],xmm3
	pxor	xmm2,XMMWORD PTR[64+rsp]
	movdqu	XMMWORD PTR[48+r13],xmm5
	pxor	xmm6,XMMWORD PTR[80+rsp]
	movdqu	XMMWORD PTR[64+r13],xmm2
	pxor	xmm1,XMMWORD PTR[96+rsp]
	movdqu	XMMWORD PTR[80+r13],xmm6
	pxor	xmm4,XMMWORD PTR[112+rsp]
	movdqu	XMMWORD PTR[96+r13],xmm1
	movdqu	XMMWORD PTR[112+r13],xmm4
	lea	r13,QWORD PTR[128+r13]

	movdqa	xmm6,XMMWORD PTR[112+rsp]
	pxor	xmm14,xmm14
	movdqa	xmm12,XMMWORD PTR[$L$xts_magic]
	pcmpgtd	xmm14,xmm6
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13

	sub	r14,080h
	jnc	$L$xts_enc_loop

$L$xts_enc_short::
	add	r14,080h
	jz	$L$xts_enc_done
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm15,xmm6
	movdqa	XMMWORD PTR[rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm0,xmm6
	movdqa	XMMWORD PTR[16+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm7,XMMWORD PTR[r12]
	cmp	r14,16
	je	$L$xts_enc_1
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm1,xmm6
	movdqa	XMMWORD PTR[32+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm8,XMMWORD PTR[16+r12]
	cmp	r14,32
	je	$L$xts_enc_2
	pxor	xmm15,xmm7
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm2,xmm6
	movdqa	XMMWORD PTR[48+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm9,XMMWORD PTR[32+r12]
	cmp	r14,48
	je	$L$xts_enc_3
	pxor	xmm0,xmm8
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm3,xmm6
	movdqa	XMMWORD PTR[64+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm10,XMMWORD PTR[48+r12]
	cmp	r14,64
	je	$L$xts_enc_4
	pxor	xmm1,xmm9
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm4,xmm6
	movdqa	XMMWORD PTR[80+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm11,XMMWORD PTR[64+r12]
	cmp	r14,80
	je	$L$xts_enc_5
	pxor	xmm2,xmm10
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm5,xmm6
	movdqa	XMMWORD PTR[96+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm12,XMMWORD PTR[80+r12]
	cmp	r14,96
	je	$L$xts_enc_6
	pxor	xmm3,xmm11
	movdqu	xmm13,XMMWORD PTR[96+r12]
	pxor	xmm4,xmm12
	movdqa	XMMWORD PTR[112+rsp],xmm6
	lea	r12,QWORD PTR[112+r12]
	pxor	xmm5,xmm13
	lea	rax,QWORD PTR[128+rsp]
	mov	r10d,edx

	call	_bsaes_encrypt8

	pxor	xmm15,XMMWORD PTR[rsp]
	pxor	xmm0,XMMWORD PTR[16+rsp]
	movdqu	XMMWORD PTR[r13],xmm15
	pxor	xmm3,XMMWORD PTR[32+rsp]
	movdqu	XMMWORD PTR[16+r13],xmm0
	pxor	xmm5,XMMWORD PTR[48+rsp]
	movdqu	XMMWORD PTR[32+r13],xmm3
	pxor	xmm2,XMMWORD PTR[64+rsp]
	movdqu	XMMWORD PTR[48+r13],xmm5
	pxor	xmm6,XMMWORD PTR[80+rsp]
	movdqu	XMMWORD PTR[64+r13],xmm2
	pxor	xmm1,XMMWORD PTR[96+rsp]
	movdqu	XMMWORD PTR[80+r13],xmm6
	movdqu	XMMWORD PTR[96+r13],xmm1
	lea	r13,QWORD PTR[112+r13]

	movdqa	xmm6,XMMWORD PTR[112+rsp]
	jmp	$L$xts_enc_done
ALIGN	16
$L$xts_enc_6::
	pxor	xmm3,xmm11
	lea	r12,QWORD PTR[96+r12]
	pxor	xmm4,xmm12
	lea	rax,QWORD PTR[128+rsp]
	mov	r10d,edx

	call	_bsaes_encrypt8

	pxor	xmm15,XMMWORD PTR[rsp]
	pxor	xmm0,XMMWORD PTR[16+rsp]
	movdqu	XMMWORD PTR[r13],xmm15
	pxor	xmm3,XMMWORD PTR[32+rsp]
	movdqu	XMMWORD PTR[16+r13],xmm0
	pxor	xmm5,XMMWORD PTR[48+rsp]
	movdqu	XMMWORD PTR[32+r13],xmm3
	pxor	xmm2,XMMWORD PTR[64+rsp]
	movdqu	XMMWORD PTR[48+r13],xmm5
	pxor	xmm6,XMMWORD PTR[80+rsp]
	movdqu	XMMWORD PTR[64+r13],xmm2
	movdqu	XMMWORD PTR[80+r13],xmm6
	lea	r13,QWORD PTR[96+r13]

	movdqa	xmm6,XMMWORD PTR[96+rsp]
	jmp	$L$xts_enc_done
ALIGN	16
$L$xts_enc_5::
	pxor	xmm2,xmm10
	lea	r12,QWORD PTR[80+r12]
	pxor	xmm3,xmm11
	lea	rax,QWORD PTR[128+rsp]
	mov	r10d,edx

	call	_bsaes_encrypt8

	pxor	xmm15,XMMWORD PTR[rsp]
	pxor	xmm0,XMMWORD PTR[16+rsp]
	movdqu	XMMWORD PTR[r13],xmm15
	pxor	xmm3,XMMWORD PTR[32+rsp]
	movdqu	XMMWORD PTR[16+r13],xmm0
	pxor	xmm5,XMMWORD PTR[48+rsp]
	movdqu	XMMWORD PTR[32+r13],xmm3
	pxor	xmm2,XMMWORD PTR[64+rsp]
	movdqu	XMMWORD PTR[48+r13],xmm5
	movdqu	XMMWORD PTR[64+r13],xmm2
	lea	r13,QWORD PTR[80+r13]

	movdqa	xmm6,XMMWORD PTR[80+rsp]
	jmp	$L$xts_enc_done
ALIGN	16
$L$xts_enc_4::
	pxor	xmm1,xmm9
	lea	r12,QWORD PTR[64+r12]
	pxor	xmm2,xmm10
	lea	rax,QWORD PTR[128+rsp]
	mov	r10d,edx

	call	_bsaes_encrypt8

	pxor	xmm15,XMMWORD PTR[rsp]
	pxor	xmm0,XMMWORD PTR[16+rsp]
	movdqu	XMMWORD PTR[r13],xmm15
	pxor	xmm3,XMMWORD PTR[32+rsp]
	movdqu	XMMWORD PTR[16+r13],xmm0
	pxor	xmm5,XMMWORD PTR[48+rsp]
	movdqu	XMMWORD PTR[32+r13],xmm3
	movdqu	XMMWORD PTR[48+r13],xmm5
	lea	r13,QWORD PTR[64+r13]

	movdqa	xmm6,XMMWORD PTR[64+rsp]
	jmp	$L$xts_enc_done
ALIGN	16
$L$xts_enc_3::
	pxor	xmm0,xmm8
	lea	r12,QWORD PTR[48+r12]
	pxor	xmm1,xmm9
	lea	rax,QWORD PTR[128+rsp]
	mov	r10d,edx

	call	_bsaes_encrypt8

	pxor	xmm15,XMMWORD PTR[rsp]
	pxor	xmm0,XMMWORD PTR[16+rsp]
	movdqu	XMMWORD PTR[r13],xmm15
	pxor	xmm3,XMMWORD PTR[32+rsp]
	movdqu	XMMWORD PTR[16+r13],xmm0
	movdqu	XMMWORD PTR[32+r13],xmm3
	lea	r13,QWORD PTR[48+r13]

	movdqa	xmm6,XMMWORD PTR[48+rsp]
	jmp	$L$xts_enc_done
ALIGN	16
$L$xts_enc_2::
	pxor	xmm15,xmm7
	lea	r12,QWORD PTR[32+r12]
	pxor	xmm0,xmm8
	lea	rax,QWORD PTR[128+rsp]
	mov	r10d,edx

	call	_bsaes_encrypt8

	pxor	xmm15,XMMWORD PTR[rsp]
	pxor	xmm0,XMMWORD PTR[16+rsp]
	movdqu	XMMWORD PTR[r13],xmm15
	movdqu	XMMWORD PTR[16+r13],xmm0
	lea	r13,QWORD PTR[32+r13]

	movdqa	xmm6,XMMWORD PTR[32+rsp]
	jmp	$L$xts_enc_done
ALIGN	16
$L$xts_enc_1::
	pxor	xmm7,xmm15
	lea	r12,QWORD PTR[16+r12]
	movdqa	XMMWORD PTR[32+rbp],xmm7
	lea	rcx,QWORD PTR[32+rbp]
	lea	rdx,QWORD PTR[32+rbp]
	lea	r8,QWORD PTR[r15]
	call	asm_AES_encrypt		
	pxor	xmm15,XMMWORD PTR[32+rbp]





	movdqu	XMMWORD PTR[r13],xmm15
	lea	r13,QWORD PTR[16+r13]

	movdqa	xmm6,XMMWORD PTR[16+rsp]

$L$xts_enc_done::
	and	ebx,15
	jz	$L$xts_enc_ret
	mov	rdx,r13

$L$xts_enc_steal::
	movzx	eax,BYTE PTR[r12]
	movzx	ecx,BYTE PTR[((-16))+rdx]
	lea	r12,QWORD PTR[1+r12]
	mov	BYTE PTR[((-16))+rdx],al
	mov	BYTE PTR[rdx],cl
	lea	rdx,QWORD PTR[1+rdx]
	sub	ebx,1
	jnz	$L$xts_enc_steal

	movdqu	xmm15,XMMWORD PTR[((-16))+r13]
	lea	rcx,QWORD PTR[32+rbp]
	pxor	xmm15,xmm6
	lea	rdx,QWORD PTR[32+rbp]
	movdqa	XMMWORD PTR[32+rbp],xmm15
	lea	r8,QWORD PTR[r15]
	call	asm_AES_encrypt		
	pxor	xmm6,XMMWORD PTR[32+rbp]
	movdqu	XMMWORD PTR[(-16)+r13],xmm6

$L$xts_enc_ret::
	lea	rax,QWORD PTR[rsp]
	pxor	xmm0,xmm0
$L$xts_enc_bzero::
	movdqa	XMMWORD PTR[rax],xmm0
	movdqa	XMMWORD PTR[16+rax],xmm0
	lea	rax,QWORD PTR[32+rax]
	cmp	rbp,rax
	ja	$L$xts_enc_bzero

	lea	rsp,QWORD PTR[rbp]
	movaps	xmm6,XMMWORD PTR[64+rbp]
	movaps	xmm7,XMMWORD PTR[80+rbp]
	movaps	xmm8,XMMWORD PTR[96+rbp]
	movaps	xmm9,XMMWORD PTR[112+rbp]
	movaps	xmm10,XMMWORD PTR[128+rbp]
	movaps	xmm11,XMMWORD PTR[144+rbp]
	movaps	xmm12,XMMWORD PTR[160+rbp]
	movaps	xmm13,XMMWORD PTR[176+rbp]
	movaps	xmm14,XMMWORD PTR[192+rbp]
	movaps	xmm15,XMMWORD PTR[208+rbp]
	lea	rsp,QWORD PTR[160+rbp]
	mov	r15,QWORD PTR[72+rsp]
	mov	r14,QWORD PTR[80+rsp]
	mov	r13,QWORD PTR[88+rsp]
	mov	r12,QWORD PTR[96+rsp]
	mov	rbx,QWORD PTR[104+rsp]
	mov	rax,QWORD PTR[112+rsp]
	lea	rsp,QWORD PTR[120+rsp]
	mov	rbp,rax
$L$xts_enc_epilogue::
	DB	0F3h,0C3h		;repret
bsaes_xts_encrypt	ENDP

PUBLIC	bsaes_xts_decrypt

ALIGN	16
bsaes_xts_decrypt	PROC PUBLIC
	mov	rax,rsp
$L$xts_dec_prologue::
	push	rbp
	push	rbx
	push	r12
	push	r13
	push	r14
	push	r15
	lea	rsp,QWORD PTR[((-72))+rsp]
	mov	r10,QWORD PTR[160+rsp]
	mov	r11,QWORD PTR[168+rsp]
	lea	rsp,QWORD PTR[((-160))+rsp]
	movaps	XMMWORD PTR[64+rsp],xmm6
	movaps	XMMWORD PTR[80+rsp],xmm7
	movaps	XMMWORD PTR[96+rsp],xmm8
	movaps	XMMWORD PTR[112+rsp],xmm9
	movaps	XMMWORD PTR[128+rsp],xmm10
	movaps	XMMWORD PTR[144+rsp],xmm11
	movaps	XMMWORD PTR[160+rsp],xmm12
	movaps	XMMWORD PTR[176+rsp],xmm13
	movaps	XMMWORD PTR[192+rsp],xmm14
	movaps	XMMWORD PTR[208+rsp],xmm15
$L$xts_dec_body::
	mov	rbp,rsp
	mov	r12,rcx
	mov	r13,rdx
	mov	r14,r8
	mov	r15,r9

	lea	rcx,QWORD PTR[r11]
	lea	rdx,QWORD PTR[32+rbp]
	lea	r8,QWORD PTR[r10]
	call	asm_AES_encrypt		

	mov	eax,DWORD PTR[240+r15]
	mov	rbx,r14

	mov	edx,eax
	shl	rax,7
	sub	rax,96
	sub	rsp,rax

	mov	rax,rsp
	mov	rcx,r15
	mov	r10d,edx
	call	_bsaes_key_convert
	pxor	xmm7,XMMWORD PTR[rsp]
	movdqa	XMMWORD PTR[rax],xmm6
	movdqa	XMMWORD PTR[rsp],xmm7

	xor	eax,eax
	and	r14,-16
	test	ebx,15
	setnz	al
	shl	rax,4
	sub	r14,rax

	sub	rsp,080h
	movdqa	xmm6,XMMWORD PTR[32+rbp]

	pxor	xmm14,xmm14
	movdqa	xmm12,XMMWORD PTR[$L$xts_magic]
	pcmpgtd	xmm14,xmm6

	sub	r14,080h
	jc	$L$xts_dec_short
	jmp	$L$xts_dec_loop

ALIGN	16
$L$xts_dec_loop::
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm15,xmm6
	movdqa	XMMWORD PTR[rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm0,xmm6
	movdqa	XMMWORD PTR[16+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm7,XMMWORD PTR[r12]
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm1,xmm6
	movdqa	XMMWORD PTR[32+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm8,XMMWORD PTR[16+r12]
	pxor	xmm15,xmm7
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm2,xmm6
	movdqa	XMMWORD PTR[48+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm9,XMMWORD PTR[32+r12]
	pxor	xmm0,xmm8
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm3,xmm6
	movdqa	XMMWORD PTR[64+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm10,XMMWORD PTR[48+r12]
	pxor	xmm1,xmm9
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm4,xmm6
	movdqa	XMMWORD PTR[80+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm11,XMMWORD PTR[64+r12]
	pxor	xmm2,xmm10
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm5,xmm6
	movdqa	XMMWORD PTR[96+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm12,XMMWORD PTR[80+r12]
	pxor	xmm3,xmm11
	movdqu	xmm13,XMMWORD PTR[96+r12]
	pxor	xmm4,xmm12
	movdqu	xmm14,XMMWORD PTR[112+r12]
	lea	r12,QWORD PTR[128+r12]
	movdqa	XMMWORD PTR[112+rsp],xmm6
	pxor	xmm5,xmm13
	lea	rax,QWORD PTR[128+rsp]
	pxor	xmm6,xmm14
	mov	r10d,edx

	call	_bsaes_decrypt8

	pxor	xmm15,XMMWORD PTR[rsp]
	pxor	xmm0,XMMWORD PTR[16+rsp]
	movdqu	XMMWORD PTR[r13],xmm15
	pxor	xmm5,XMMWORD PTR[32+rsp]
	movdqu	XMMWORD PTR[16+r13],xmm0
	pxor	xmm3,XMMWORD PTR[48+rsp]
	movdqu	XMMWORD PTR[32+r13],xmm5
	pxor	xmm1,XMMWORD PTR[64+rsp]
	movdqu	XMMWORD PTR[48+r13],xmm3
	pxor	xmm6,XMMWORD PTR[80+rsp]
	movdqu	XMMWORD PTR[64+r13],xmm1
	pxor	xmm2,XMMWORD PTR[96+rsp]
	movdqu	XMMWORD PTR[80+r13],xmm6
	pxor	xmm4,XMMWORD PTR[112+rsp]
	movdqu	XMMWORD PTR[96+r13],xmm2
	movdqu	XMMWORD PTR[112+r13],xmm4
	lea	r13,QWORD PTR[128+r13]

	movdqa	xmm6,XMMWORD PTR[112+rsp]
	pxor	xmm14,xmm14
	movdqa	xmm12,XMMWORD PTR[$L$xts_magic]
	pcmpgtd	xmm14,xmm6
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13

	sub	r14,080h
	jnc	$L$xts_dec_loop

$L$xts_dec_short::
	add	r14,080h
	jz	$L$xts_dec_done
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm15,xmm6
	movdqa	XMMWORD PTR[rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm0,xmm6
	movdqa	XMMWORD PTR[16+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm7,XMMWORD PTR[r12]
	cmp	r14,16
	je	$L$xts_dec_1
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm1,xmm6
	movdqa	XMMWORD PTR[32+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm8,XMMWORD PTR[16+r12]
	cmp	r14,32
	je	$L$xts_dec_2
	pxor	xmm15,xmm7
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm2,xmm6
	movdqa	XMMWORD PTR[48+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm9,XMMWORD PTR[32+r12]
	cmp	r14,48
	je	$L$xts_dec_3
	pxor	xmm0,xmm8
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm3,xmm6
	movdqa	XMMWORD PTR[64+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm10,XMMWORD PTR[48+r12]
	cmp	r14,64
	je	$L$xts_dec_4
	pxor	xmm1,xmm9
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm4,xmm6
	movdqa	XMMWORD PTR[80+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm11,XMMWORD PTR[64+r12]
	cmp	r14,80
	je	$L$xts_dec_5
	pxor	xmm2,xmm10
	pshufd	xmm13,xmm14,013h
	pxor	xmm14,xmm14
	movdqa	xmm5,xmm6
	movdqa	XMMWORD PTR[96+rsp],xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	pcmpgtd	xmm14,xmm6
	pxor	xmm6,xmm13
	movdqu	xmm12,XMMWORD PTR[80+r12]
	cmp	r14,96
	je	$L$xts_dec_6
	pxor	xmm3,xmm11
	movdqu	xmm13,XMMWORD PTR[96+r12]
	pxor	xmm4,xmm12
	movdqa	XMMWORD PTR[112+rsp],xmm6
	lea	r12,QWORD PTR[112+r12]
	pxor	xmm5,xmm13
	lea	rax,QWORD PTR[128+rsp]
	mov	r10d,edx

	call	_bsaes_decrypt8

	pxor	xmm15,XMMWORD PTR[rsp]
	pxor	xmm0,XMMWORD PTR[16+rsp]
	movdqu	XMMWORD PTR[r13],xmm15
	pxor	xmm5,XMMWORD PTR[32+rsp]
	movdqu	XMMWORD PTR[16+r13],xmm0
	pxor	xmm3,XMMWORD PTR[48+rsp]
	movdqu	XMMWORD PTR[32+r13],xmm5
	pxor	xmm1,XMMWORD PTR[64+rsp]
	movdqu	XMMWORD PTR[48+r13],xmm3
	pxor	xmm6,XMMWORD PTR[80+rsp]
	movdqu	XMMWORD PTR[64+r13],xmm1
	pxor	xmm2,XMMWORD PTR[96+rsp]
	movdqu	XMMWORD PTR[80+r13],xmm6
	movdqu	XMMWORD PTR[96+r13],xmm2
	lea	r13,QWORD PTR[112+r13]

	movdqa	xmm6,XMMWORD PTR[112+rsp]
	jmp	$L$xts_dec_done
ALIGN	16
$L$xts_dec_6::
	pxor	xmm3,xmm11
	lea	r12,QWORD PTR[96+r12]
	pxor	xmm4,xmm12
	lea	rax,QWORD PTR[128+rsp]
	mov	r10d,edx

	call	_bsaes_decrypt8

	pxor	xmm15,XMMWORD PTR[rsp]
	pxor	xmm0,XMMWORD PTR[16+rsp]
	movdqu	XMMWORD PTR[r13],xmm15
	pxor	xmm5,XMMWORD PTR[32+rsp]
	movdqu	XMMWORD PTR[16+r13],xmm0
	pxor	xmm3,XMMWORD PTR[48+rsp]
	movdqu	XMMWORD PTR[32+r13],xmm5
	pxor	xmm1,XMMWORD PTR[64+rsp]
	movdqu	XMMWORD PTR[48+r13],xmm3
	pxor	xmm6,XMMWORD PTR[80+rsp]
	movdqu	XMMWORD PTR[64+r13],xmm1
	movdqu	XMMWORD PTR[80+r13],xmm6
	lea	r13,QWORD PTR[96+r13]

	movdqa	xmm6,XMMWORD PTR[96+rsp]
	jmp	$L$xts_dec_done
ALIGN	16
$L$xts_dec_5::
	pxor	xmm2,xmm10
	lea	r12,QWORD PTR[80+r12]
	pxor	xmm3,xmm11
	lea	rax,QWORD PTR[128+rsp]
	mov	r10d,edx

	call	_bsaes_decrypt8

	pxor	xmm15,XMMWORD PTR[rsp]
	pxor	xmm0,XMMWORD PTR[16+rsp]
	movdqu	XMMWORD PTR[r13],xmm15
	pxor	xmm5,XMMWORD PTR[32+rsp]
	movdqu	XMMWORD PTR[16+r13],xmm0
	pxor	xmm3,XMMWORD PTR[48+rsp]
	movdqu	XMMWORD PTR[32+r13],xmm5
	pxor	xmm1,XMMWORD PTR[64+rsp]
	movdqu	XMMWORD PTR[48+r13],xmm3
	movdqu	XMMWORD PTR[64+r13],xmm1
	lea	r13,QWORD PTR[80+r13]

	movdqa	xmm6,XMMWORD PTR[80+rsp]
	jmp	$L$xts_dec_done
ALIGN	16
$L$xts_dec_4::
	pxor	xmm1,xmm9
	lea	r12,QWORD PTR[64+r12]
	pxor	xmm2,xmm10
	lea	rax,QWORD PTR[128+rsp]
	mov	r10d,edx

	call	_bsaes_decrypt8

	pxor	xmm15,XMMWORD PTR[rsp]
	pxor	xmm0,XMMWORD PTR[16+rsp]
	movdqu	XMMWORD PTR[r13],xmm15
	pxor	xmm5,XMMWORD PTR[32+rsp]
	movdqu	XMMWORD PTR[16+r13],xmm0
	pxor	xmm3,XMMWORD PTR[48+rsp]
	movdqu	XMMWORD PTR[32+r13],xmm5
	movdqu	XMMWORD PTR[48+r13],xmm3
	lea	r13,QWORD PTR[64+r13]

	movdqa	xmm6,XMMWORD PTR[64+rsp]
	jmp	$L$xts_dec_done
ALIGN	16
$L$xts_dec_3::
	pxor	xmm0,xmm8
	lea	r12,QWORD PTR[48+r12]
	pxor	xmm1,xmm9
	lea	rax,QWORD PTR[128+rsp]
	mov	r10d,edx

	call	_bsaes_decrypt8

	pxor	xmm15,XMMWORD PTR[rsp]
	pxor	xmm0,XMMWORD PTR[16+rsp]
	movdqu	XMMWORD PTR[r13],xmm15
	pxor	xmm5,XMMWORD PTR[32+rsp]
	movdqu	XMMWORD PTR[16+r13],xmm0
	movdqu	XMMWORD PTR[32+r13],xmm5
	lea	r13,QWORD PTR[48+r13]

	movdqa	xmm6,XMMWORD PTR[48+rsp]
	jmp	$L$xts_dec_done
ALIGN	16
$L$xts_dec_2::
	pxor	xmm15,xmm7
	lea	r12,QWORD PTR[32+r12]
	pxor	xmm0,xmm8
	lea	rax,QWORD PTR[128+rsp]
	mov	r10d,edx

	call	_bsaes_decrypt8

	pxor	xmm15,XMMWORD PTR[rsp]
	pxor	xmm0,XMMWORD PTR[16+rsp]
	movdqu	XMMWORD PTR[r13],xmm15
	movdqu	XMMWORD PTR[16+r13],xmm0
	lea	r13,QWORD PTR[32+r13]

	movdqa	xmm6,XMMWORD PTR[32+rsp]
	jmp	$L$xts_dec_done
ALIGN	16
$L$xts_dec_1::
	pxor	xmm7,xmm15
	lea	r12,QWORD PTR[16+r12]
	movdqa	XMMWORD PTR[32+rbp],xmm7
	lea	rcx,QWORD PTR[32+rbp]
	lea	rdx,QWORD PTR[32+rbp]
	lea	r8,QWORD PTR[r15]
	call	asm_AES_decrypt		
	pxor	xmm15,XMMWORD PTR[32+rbp]





	movdqu	XMMWORD PTR[r13],xmm15
	lea	r13,QWORD PTR[16+r13]

	movdqa	xmm6,XMMWORD PTR[16+rsp]

$L$xts_dec_done::
	and	ebx,15
	jz	$L$xts_dec_ret

	pxor	xmm14,xmm14
	movdqa	xmm12,XMMWORD PTR[$L$xts_magic]
	pcmpgtd	xmm14,xmm6
	pshufd	xmm13,xmm14,013h
	movdqa	xmm5,xmm6
	paddq	xmm6,xmm6
	pand	xmm13,xmm12
	movdqu	xmm15,XMMWORD PTR[r12]
	pxor	xmm6,xmm13

	lea	rcx,QWORD PTR[32+rbp]
	pxor	xmm15,xmm6
	lea	rdx,QWORD PTR[32+rbp]
	movdqa	XMMWORD PTR[32+rbp],xmm15
	lea	r8,QWORD PTR[r15]
	call	asm_AES_decrypt		
	pxor	xmm6,XMMWORD PTR[32+rbp]
	mov	rdx,r13
	movdqu	XMMWORD PTR[r13],xmm6

$L$xts_dec_steal::
	movzx	eax,BYTE PTR[16+r12]
	movzx	ecx,BYTE PTR[rdx]
	lea	r12,QWORD PTR[1+r12]
	mov	BYTE PTR[rdx],al
	mov	BYTE PTR[16+rdx],cl
	lea	rdx,QWORD PTR[1+rdx]
	sub	ebx,1
	jnz	$L$xts_dec_steal

	movdqu	xmm15,XMMWORD PTR[r13]
	lea	rcx,QWORD PTR[32+rbp]
	pxor	xmm15,xmm5
	lea	rdx,QWORD PTR[32+rbp]
	movdqa	XMMWORD PTR[32+rbp],xmm15
	lea	r8,QWORD PTR[r15]
	call	asm_AES_decrypt		
	pxor	xmm5,XMMWORD PTR[32+rbp]
	movdqu	XMMWORD PTR[r13],xmm5

$L$xts_dec_ret::
	lea	rax,QWORD PTR[rsp]
	pxor	xmm0,xmm0
$L$xts_dec_bzero::
	movdqa	XMMWORD PTR[rax],xmm0
	movdqa	XMMWORD PTR[16+rax],xmm0
	lea	rax,QWORD PTR[32+rax]
	cmp	rbp,rax
	ja	$L$xts_dec_bzero

	lea	rsp,QWORD PTR[rbp]
	movaps	xmm6,XMMWORD PTR[64+rbp]
	movaps	xmm7,XMMWORD PTR[80+rbp]
	movaps	xmm8,XMMWORD PTR[96+rbp]
	movaps	xmm9,XMMWORD PTR[112+rbp]
	movaps	xmm10,XMMWORD PTR[128+rbp]
	movaps	xmm11,XMMWORD PTR[144+rbp]
	movaps	xmm12,XMMWORD PTR[160+rbp]
	movaps	xmm13,XMMWORD PTR[176+rbp]
	movaps	xmm14,XMMWORD PTR[192+rbp]
	movaps	xmm15,XMMWORD PTR[208+rbp]
	lea	rsp,QWORD PTR[160+rbp]
	mov	r15,QWORD PTR[72+rsp]
	mov	r14,QWORD PTR[80+rsp]
	mov	r13,QWORD PTR[88+rsp]
	mov	r12,QWORD PTR[96+rsp]
	mov	rbx,QWORD PTR[104+rsp]
	mov	rax,QWORD PTR[112+rsp]
	lea	rsp,QWORD PTR[120+rsp]
	mov	rbp,rax
$L$xts_dec_epilogue::
	DB	0F3h,0C3h		;repret
bsaes_xts_decrypt	ENDP

ALIGN	64
_bsaes_const::
$L$M0ISR::
	DQ	00a0e0206070b0f03h,00004080c0d010509h
$L$ISRM0::
	DQ	001040b0e0205080fh,00306090c00070a0dh
$L$ISR::
	DQ	00504070602010003h,00f0e0d0c080b0a09h
$L$BS0::
	DQ	05555555555555555h,05555555555555555h
$L$BS1::
	DQ	03333333333333333h,03333333333333333h
$L$BS2::
	DQ	00f0f0f0f0f0f0f0fh,00f0f0f0f0f0f0f0fh
$L$SR::
	DQ	00504070600030201h,00f0e0d0c0a09080bh
$L$SRM0::
	DQ	00304090e00050a0fh,001060b0c0207080dh
$L$M0SR::
	DQ	00a0e02060f03070bh,00004080c05090d01h
$L$SWPUP::
	DQ	00706050403020100h,00c0d0e0f0b0a0908h
$L$SWPUPM0SR::
	DQ	00a0d02060c03070bh,00004080f05090e01h
$L$ADD1::
	DQ	00000000000000000h,00000000100000000h
$L$ADD2::
	DQ	00000000000000000h,00000000200000000h
$L$ADD3::
	DQ	00000000000000000h,00000000300000000h
$L$ADD4::
	DQ	00000000000000000h,00000000400000000h
$L$ADD5::
	DQ	00000000000000000h,00000000500000000h
$L$ADD6::
	DQ	00000000000000000h,00000000600000000h
$L$ADD7::
	DQ	00000000000000000h,00000000700000000h
$L$ADD8::
	DQ	00000000000000000h,00000000800000000h
$L$xts_magic::
	DD	087h,0,1,0
$L$masks::
	DQ	00101010101010101h,00101010101010101h
	DQ	00202020202020202h,00202020202020202h
	DQ	00404040404040404h,00404040404040404h
	DQ	00808080808080808h,00808080808080808h
$L$M0::
	DQ	002060a0e03070b0fh,00004080c0105090dh
$L$63::
	DQ	06363636363636363h,06363636363636363h
DB	66,105,116,45,115,108,105,99,101,100,32,65,69,83,32,102
DB	111,114,32,120,56,54,95,54,52,47,83,83,83,69,51,44
DB	32,69,109,105,108,105,97,32,75,195,164,115,112,101,114,44
DB	32,80,101,116,101,114,32,83,99,104,119,97,98,101,44,32
DB	65,110,100,121,32,80,111,108,121,97,107,111,118,0
ALIGN	64

EXTERN	__imp_RtlVirtualUnwind:NEAR

ALIGN	16
se_handler	PROC PRIVATE
	push	rsi
	push	rdi
	push	rbx
	push	rbp
	push	r12
	push	r13
	push	r14
	push	r15
	pushfq
	sub	rsp,64

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

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

	mov	r10d,DWORD PTR[r11]
	lea	r10,QWORD PTR[r10*1+rsi]
	cmp	rbx,r10
	jb	$L$in_prologue

	mov	rax,QWORD PTR[152+r8]

	mov	r10d,DWORD PTR[4+r11]
	lea	r10,QWORD PTR[r10*1+rsi]
	cmp	rbx,r10
	jae	$L$in_prologue

	mov	rax,QWORD PTR[160+r8]

	lea	rsi,QWORD PTR[64+rax]
	lea	rdi,QWORD PTR[512+r8]
	mov	ecx,20
	DD	0a548f3fch		
	lea	rax,QWORD PTR[160+rax]

	mov	rbp,QWORD PTR[112+rax]
	mov	rbx,QWORD PTR[104+rax]
	mov	r12,QWORD PTR[96+rax]
	mov	r13,QWORD PTR[88+rax]
	mov	r14,QWORD PTR[80+rax]
	mov	r15,QWORD PTR[72+rax]
	lea	rax,QWORD PTR[120+rax]
	mov	QWORD PTR[144+r8],rbx
	mov	QWORD PTR[160+r8],rbp
	mov	QWORD PTR[216+r8],r12
	mov	QWORD PTR[224+r8],r13
	mov	QWORD PTR[232+r8],r14
	mov	QWORD PTR[240+r8],r15

$L$in_prologue::
	mov	QWORD PTR[152+r8],rax

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

	mov	rsi,r9
	xor	rcx,rcx
	mov	rdx,QWORD PTR[8+rsi]
	mov	r8,QWORD PTR[rsi]
	mov	r9,QWORD PTR[16+rsi]
	mov	r10,QWORD PTR[40+rsi]
	lea	r11,QWORD PTR[56+rsi]
	lea	r12,QWORD PTR[24+rsi]
	mov	QWORD PTR[32+rsp],r10
	mov	QWORD PTR[40+rsp],r11
	mov	QWORD PTR[48+rsp],r12
	mov	QWORD PTR[56+rsp],rcx
	call	QWORD PTR[__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
se_handler	ENDP

.text$	ENDS
.pdata	SEGMENT READONLY ALIGN(4)
ALIGN	4
	DD	imagerel $L$cbc_dec_prologue
	DD	imagerel $L$cbc_dec_epilogue
	DD	imagerel $L$cbc_dec_info

	DD	imagerel $L$ctr_enc_prologue
	DD	imagerel $L$ctr_enc_epilogue
	DD	imagerel $L$ctr_enc_info

	DD	imagerel $L$xts_enc_prologue
	DD	imagerel $L$xts_enc_epilogue
	DD	imagerel $L$xts_enc_info

	DD	imagerel $L$xts_dec_prologue
	DD	imagerel $L$xts_dec_epilogue
	DD	imagerel $L$xts_dec_info

.pdata	ENDS
.xdata	SEGMENT READONLY ALIGN(8)
ALIGN	8
$L$cbc_dec_info::
DB	9,0,0,0
	DD	imagerel se_handler
	DD	imagerel $L$cbc_dec_body,imagerel $L$cbc_dec_epilogue	
$L$ctr_enc_info::
DB	9,0,0,0
	DD	imagerel se_handler
	DD	imagerel $L$ctr_enc_body,imagerel $L$ctr_enc_epilogue	
$L$xts_enc_info::
DB	9,0,0,0
	DD	imagerel se_handler
	DD	imagerel $L$xts_enc_body,imagerel $L$xts_enc_epilogue	
$L$xts_dec_info::
DB	9,0,0,0
	DD	imagerel se_handler
	DD	imagerel $L$xts_dec_body,imagerel $L$xts_dec_epilogue	

.xdata	ENDS
END
