; 1 "crypto/aes/vpaes-masm-x86_64.S.tmp"
; 1 "<built-in>" 1
; 1 "<built-in>" 3
; 343 "<built-in>" 3
; 1 "<command line>" 1
; 1 "<built-in>" 2
; 1 "crypto/aes/vpaes-masm-x86_64.S.tmp" 2
OPTION	DOTNAME

; 1 "./crypto/x86_arch.h" 1


; 16 "./crypto/x86_arch.h"









; 40 "./crypto/x86_arch.h"













































; 3 "crypto/aes/vpaes-masm-x86_64.S.tmp" 2
.text$	SEGMENT ALIGN(64) 'CODE'

















ALIGN	16
_vpaes_encrypt_core	PROC PRIVATE
	mov	r9,rdx
	mov	r11,16
	mov	eax,DWORD PTR[240+rdx]
	movdqa	xmm1,xmm9
	movdqa	xmm2,XMMWORD PTR[$L$k_ipt]
	pandn	xmm1,xmm0
	movdqu	xmm5,XMMWORD PTR[r9]
	psrld	xmm1,4
	pand	xmm0,xmm9
DB	102,15,56,0,208
	movdqa	xmm0,XMMWORD PTR[(($L$k_ipt+16))]
DB	102,15,56,0,193
	pxor	xmm2,xmm5
	pxor	xmm0,xmm2
	add	r9,16
	lea	r10,QWORD PTR[$L$k_mc_backward]
	jmp	$L$enc_entry

ALIGN	16
$L$enc_loop::

	movdqa	xmm4,xmm13
DB	102,15,56,0,226
	pxor	xmm4,xmm5
	movdqa	xmm0,xmm12
DB	102,15,56,0,195
	pxor	xmm0,xmm4
	movdqa	xmm5,xmm15
DB	102,15,56,0,234
	movdqa	xmm1,XMMWORD PTR[((-64))+r10*1+r11]
	movdqa	xmm2,xmm14
DB	102,15,56,0,211
	pxor	xmm2,xmm5
	movdqa	xmm4,XMMWORD PTR[r10*1+r11]
	movdqa	xmm3,xmm0
DB	102,15,56,0,193
	add	r9,16
	pxor	xmm0,xmm2
DB	102,15,56,0,220
	add	r11,16
	pxor	xmm3,xmm0
DB	102,15,56,0,193
	and	r11,030h
	pxor	xmm0,xmm3
	sub	rax,1

$L$enc_entry::

	movdqa	xmm1,xmm9
	pandn	xmm1,xmm0
	psrld	xmm1,4
	pand	xmm0,xmm9
	movdqa	xmm5,xmm11
DB	102,15,56,0,232
	pxor	xmm0,xmm1
	movdqa	xmm3,xmm10
DB	102,15,56,0,217
	pxor	xmm3,xmm5
	movdqa	xmm4,xmm10
DB	102,15,56,0,224
	pxor	xmm4,xmm5
	movdqa	xmm2,xmm10
DB	102,15,56,0,211
	pxor	xmm2,xmm0
	movdqa	xmm3,xmm10
	movdqu	xmm5,XMMWORD PTR[r9]
DB	102,15,56,0,220
	pxor	xmm3,xmm1
	jnz	$L$enc_loop


	movdqa	xmm4,XMMWORD PTR[((-96))+r10]
	movdqa	xmm0,XMMWORD PTR[((-80))+r10]
DB	102,15,56,0,226
	pxor	xmm4,xmm5
DB	102,15,56,0,195
	movdqa	xmm1,XMMWORD PTR[64+r10*1+r11]
	pxor	xmm0,xmm4
DB	102,15,56,0,193
	DB	0F3h,0C3h		;repret
_vpaes_encrypt_core	ENDP







ALIGN	16
_vpaes_decrypt_core	PROC PRIVATE
	mov	r9,rdx
	mov	eax,DWORD PTR[240+rdx]
	movdqa	xmm1,xmm9
	movdqa	xmm2,XMMWORD PTR[$L$k_dipt]
	pandn	xmm1,xmm0
	mov	r11,rax
	psrld	xmm1,4
	movdqu	xmm5,XMMWORD PTR[r9]
	shl	r11,4
	pand	xmm0,xmm9
DB	102,15,56,0,208
	movdqa	xmm0,XMMWORD PTR[(($L$k_dipt+16))]
	xor	r11,030h
	lea	r10,QWORD PTR[$L$k_dsbd]
DB	102,15,56,0,193
	and	r11,030h
	pxor	xmm2,xmm5
	movdqa	xmm5,XMMWORD PTR[(($L$k_mc_forward+48))]
	pxor	xmm0,xmm2
	add	r9,16
	add	r11,r10
	jmp	$L$dec_entry

ALIGN	16
$L$dec_loop::



	movdqa	xmm4,XMMWORD PTR[((-32))+r10]
DB	102,15,56,0,226
	pxor	xmm4,xmm0
	movdqa	xmm0,XMMWORD PTR[((-16))+r10]
DB	102,15,56,0,195
	pxor	xmm0,xmm4
	add	r9,16

DB	102,15,56,0,197
	movdqa	xmm4,XMMWORD PTR[r10]
DB	102,15,56,0,226
	pxor	xmm4,xmm0
	movdqa	xmm0,XMMWORD PTR[16+r10]
DB	102,15,56,0,195
	pxor	xmm0,xmm4
	sub	rax,1

DB	102,15,56,0,197
	movdqa	xmm4,XMMWORD PTR[32+r10]
DB	102,15,56,0,226
	pxor	xmm4,xmm0
	movdqa	xmm0,XMMWORD PTR[48+r10]
DB	102,15,56,0,195
	pxor	xmm0,xmm4

DB	102,15,56,0,197
	movdqa	xmm4,XMMWORD PTR[64+r10]
DB	102,15,56,0,226
	pxor	xmm4,xmm0
	movdqa	xmm0,XMMWORD PTR[80+r10]
DB	102,15,56,0,195
	pxor	xmm0,xmm4

DB	102,15,58,15,237,12

$L$dec_entry::

	movdqa	xmm1,xmm9
	pandn	xmm1,xmm0
	psrld	xmm1,4
	pand	xmm0,xmm9
	movdqa	xmm2,xmm11
DB	102,15,56,0,208
	pxor	xmm0,xmm1
	movdqa	xmm3,xmm10
DB	102,15,56,0,217
	pxor	xmm3,xmm2
	movdqa	xmm4,xmm10
DB	102,15,56,0,224
	pxor	xmm4,xmm2
	movdqa	xmm2,xmm10
DB	102,15,56,0,211
	pxor	xmm2,xmm0
	movdqa	xmm3,xmm10
DB	102,15,56,0,220
	pxor	xmm3,xmm1
	movdqu	xmm0,XMMWORD PTR[r9]
	jnz	$L$dec_loop


	movdqa	xmm4,XMMWORD PTR[96+r10]
DB	102,15,56,0,226
	pxor	xmm4,xmm0
	movdqa	xmm0,XMMWORD PTR[112+r10]
	movdqa	xmm2,XMMWORD PTR[((-352))+r11]
DB	102,15,56,0,195
	pxor	xmm0,xmm4
DB	102,15,56,0,194
	DB	0F3h,0C3h		;repret
_vpaes_decrypt_core	ENDP







ALIGN	16
_vpaes_schedule_core	PROC PRIVATE





	call	_vpaes_preheat		
	movdqa	xmm8,XMMWORD PTR[$L$k_rcon]
	movdqu	xmm0,XMMWORD PTR[rdi]


	movdqa	xmm3,xmm0
	lea	r11,QWORD PTR[$L$k_ipt]
	call	_vpaes_schedule_transform
	movdqa	xmm7,xmm0

	lea	r10,QWORD PTR[$L$k_sr]
	test	rcx,rcx
	jnz	$L$schedule_am_decrypting


	movdqu	XMMWORD PTR[rdx],xmm0
	jmp	$L$schedule_go

$L$schedule_am_decrypting::

	movdqa	xmm1,XMMWORD PTR[r10*1+r8]
DB	102,15,56,0,217
	movdqu	XMMWORD PTR[rdx],xmm3
	xor	r8,030h

$L$schedule_go::
	cmp	esi,192
	ja	$L$schedule_256
	je	$L$schedule_192










$L$schedule_128::
	mov	esi,10

$L$oop_schedule_128::
	call	_vpaes_schedule_round
	dec	rsi
	jz	$L$schedule_mangle_last
	call	_vpaes_schedule_mangle	
	jmp	$L$oop_schedule_128
















ALIGN	16
$L$schedule_192::
	movdqu	xmm0,XMMWORD PTR[8+rdi]
	call	_vpaes_schedule_transform	
	movdqa	xmm6,xmm0
	pxor	xmm4,xmm4
	movhlps	xmm6,xmm4
	mov	esi,4

$L$oop_schedule_192::
	call	_vpaes_schedule_round
DB	102,15,58,15,198,8
	call	_vpaes_schedule_mangle	
	call	_vpaes_schedule_192_smear
	call	_vpaes_schedule_mangle	
	call	_vpaes_schedule_round
	dec	rsi
	jz	$L$schedule_mangle_last
	call	_vpaes_schedule_mangle	
	call	_vpaes_schedule_192_smear
	jmp	$L$oop_schedule_192











ALIGN	16
$L$schedule_256::
	movdqu	xmm0,XMMWORD PTR[16+rdi]
	call	_vpaes_schedule_transform	
	mov	esi,7

$L$oop_schedule_256::
	call	_vpaes_schedule_mangle	
	movdqa	xmm6,xmm0


	call	_vpaes_schedule_round
	dec	rsi
	jz	$L$schedule_mangle_last
	call	_vpaes_schedule_mangle	


	pshufd	xmm0,xmm0,0FFh
	movdqa	xmm5,xmm7
	movdqa	xmm7,xmm6
	call	_vpaes_schedule_low_round
	movdqa	xmm7,xmm5

	jmp	$L$oop_schedule_256












ALIGN	16
$L$schedule_mangle_last::

	lea	r11,QWORD PTR[$L$k_deskew]
	test	rcx,rcx
	jnz	$L$schedule_mangle_last_dec


	movdqa	xmm1,XMMWORD PTR[r10*1+r8]
DB	102,15,56,0,193
	lea	r11,QWORD PTR[$L$k_opt]
	add	rdx,32

$L$schedule_mangle_last_dec::
	add	rdx,-16
	pxor	xmm0,XMMWORD PTR[$L$k_s63]
	call	_vpaes_schedule_transform 
	movdqu	XMMWORD PTR[rdx],xmm0


	pxor	xmm0,xmm0
	pxor	xmm1,xmm1
	pxor	xmm2,xmm2
	pxor	xmm3,xmm3
	pxor	xmm4,xmm4
	pxor	xmm5,xmm5
	pxor	xmm6,xmm6
	pxor	xmm7,xmm7
	DB	0F3h,0C3h		;repret
_vpaes_schedule_core	ENDP
















ALIGN	16
_vpaes_schedule_192_smear	PROC PRIVATE
	pshufd	xmm0,xmm6,080h
	pxor	xmm6,xmm0
	pshufd	xmm0,xmm7,0FEh
	pxor	xmm6,xmm0
	movdqa	xmm0,xmm6
	pxor	xmm1,xmm1
	movhlps	xmm6,xmm1
	DB	0F3h,0C3h		;repret
_vpaes_schedule_192_smear	ENDP




















ALIGN	16
_vpaes_schedule_round	PROC PRIVATE

	pxor	xmm1,xmm1
DB	102,65,15,58,15,200,15
DB	102,69,15,58,15,192,15
	pxor	xmm7,xmm1


	pshufd	xmm0,xmm0,0FFh
DB	102,15,58,15,192,1




_vpaes_schedule_low_round::

	movdqa	xmm1,xmm7
	pslldq	xmm7,4
	pxor	xmm7,xmm1
	movdqa	xmm1,xmm7
	pslldq	xmm7,8
	pxor	xmm7,xmm1
	pxor	xmm7,XMMWORD PTR[$L$k_s63]


	movdqa	xmm1,xmm9
	pandn	xmm1,xmm0
	psrld	xmm1,4
	pand	xmm0,xmm9
	movdqa	xmm2,xmm11
DB	102,15,56,0,208
	pxor	xmm0,xmm1
	movdqa	xmm3,xmm10
DB	102,15,56,0,217
	pxor	xmm3,xmm2
	movdqa	xmm4,xmm10
DB	102,15,56,0,224
	pxor	xmm4,xmm2
	movdqa	xmm2,xmm10
DB	102,15,56,0,211
	pxor	xmm2,xmm0
	movdqa	xmm3,xmm10
DB	102,15,56,0,220
	pxor	xmm3,xmm1
	movdqa	xmm4,xmm13
DB	102,15,56,0,226
	movdqa	xmm0,xmm12
DB	102,15,56,0,195
	pxor	xmm0,xmm4


	pxor	xmm0,xmm7
	movdqa	xmm7,xmm0
	DB	0F3h,0C3h		;repret
_vpaes_schedule_round	ENDP











ALIGN	16
_vpaes_schedule_transform	PROC PRIVATE
	movdqa	xmm1,xmm9
	pandn	xmm1,xmm0
	psrld	xmm1,4
	pand	xmm0,xmm9
	movdqa	xmm2,XMMWORD PTR[r11]
DB	102,15,56,0,208
	movdqa	xmm0,XMMWORD PTR[16+r11]
DB	102,15,56,0,193
	pxor	xmm0,xmm2
	DB	0F3h,0C3h		;repret
_vpaes_schedule_transform	ENDP

























ALIGN	16
_vpaes_schedule_mangle	PROC PRIVATE
	movdqa	xmm4,xmm0
	movdqa	xmm5,XMMWORD PTR[$L$k_mc_forward]
	test	rcx,rcx
	jnz	$L$schedule_mangle_dec


	add	rdx,16
	pxor	xmm4,XMMWORD PTR[$L$k_s63]
DB	102,15,56,0,229
	movdqa	xmm3,xmm4
DB	102,15,56,0,229
	pxor	xmm3,xmm4
DB	102,15,56,0,229
	pxor	xmm3,xmm4

	jmp	$L$schedule_mangle_both
ALIGN	16
$L$schedule_mangle_dec::

	lea	r11,QWORD PTR[$L$k_dksd]
	movdqa	xmm1,xmm9
	pandn	xmm1,xmm4
	psrld	xmm1,4
	pand	xmm4,xmm9

	movdqa	xmm2,XMMWORD PTR[r11]
DB	102,15,56,0,212
	movdqa	xmm3,XMMWORD PTR[16+r11]
DB	102,15,56,0,217
	pxor	xmm3,xmm2
DB	102,15,56,0,221

	movdqa	xmm2,XMMWORD PTR[32+r11]
DB	102,15,56,0,212
	pxor	xmm2,xmm3
	movdqa	xmm3,XMMWORD PTR[48+r11]
DB	102,15,56,0,217
	pxor	xmm3,xmm2
DB	102,15,56,0,221

	movdqa	xmm2,XMMWORD PTR[64+r11]
DB	102,15,56,0,212
	pxor	xmm2,xmm3
	movdqa	xmm3,XMMWORD PTR[80+r11]
DB	102,15,56,0,217
	pxor	xmm3,xmm2
DB	102,15,56,0,221

	movdqa	xmm2,XMMWORD PTR[96+r11]
DB	102,15,56,0,212
	pxor	xmm2,xmm3
	movdqa	xmm3,XMMWORD PTR[112+r11]
DB	102,15,56,0,217
	pxor	xmm3,xmm2

	add	rdx,-16

$L$schedule_mangle_both::
	movdqa	xmm1,XMMWORD PTR[r10*1+r8]
DB	102,15,56,0,217
	add	r8,-16
	and	r8,030h
	movdqu	XMMWORD PTR[rdx],xmm3
	DB	0F3h,0C3h		;repret
_vpaes_schedule_mangle	ENDP




PUBLIC	vpaes_set_encrypt_key

ALIGN	16
vpaes_set_encrypt_key	PROC PUBLIC
	mov	QWORD PTR[8+rsp],rdi	;WIN64 prologue
	mov	QWORD PTR[16+rsp],rsi
	mov	rax,rsp
$L$SEH_begin_vpaes_set_encrypt_key::
	mov	rdi,rcx
	mov	rsi,rdx
	mov	rdx,r8


	lea	rsp,QWORD PTR[((-184))+rsp]
	movaps	XMMWORD PTR[16+rsp],xmm6
	movaps	XMMWORD PTR[32+rsp],xmm7
	movaps	XMMWORD PTR[48+rsp],xmm8
	movaps	XMMWORD PTR[64+rsp],xmm9
	movaps	XMMWORD PTR[80+rsp],xmm10
	movaps	XMMWORD PTR[96+rsp],xmm11
	movaps	XMMWORD PTR[112+rsp],xmm12
	movaps	XMMWORD PTR[128+rsp],xmm13
	movaps	XMMWORD PTR[144+rsp],xmm14
	movaps	XMMWORD PTR[160+rsp],xmm15
$L$enc_key_body::
	mov	eax,esi
	shr	eax,5
	add	eax,5
	mov	DWORD PTR[240+rdx],eax

	mov	ecx,0
	mov	r8d,030h
	call	_vpaes_schedule_core
	movaps	xmm6,XMMWORD PTR[16+rsp]
	movaps	xmm7,XMMWORD PTR[32+rsp]
	movaps	xmm8,XMMWORD PTR[48+rsp]
	movaps	xmm9,XMMWORD PTR[64+rsp]
	movaps	xmm10,XMMWORD PTR[80+rsp]
	movaps	xmm11,XMMWORD PTR[96+rsp]
	movaps	xmm12,XMMWORD PTR[112+rsp]
	movaps	xmm13,XMMWORD PTR[128+rsp]
	movaps	xmm14,XMMWORD PTR[144+rsp]
	movaps	xmm15,XMMWORD PTR[160+rsp]
	lea	rsp,QWORD PTR[184+rsp]
$L$enc_key_epilogue::
	xor	eax,eax
	mov	rdi,QWORD PTR[8+rsp]	;WIN64 epilogue
	mov	rsi,QWORD PTR[16+rsp]
	DB	0F3h,0C3h		;repret
$L$SEH_end_vpaes_set_encrypt_key::
vpaes_set_encrypt_key	ENDP

PUBLIC	vpaes_set_decrypt_key

ALIGN	16
vpaes_set_decrypt_key	PROC PUBLIC
	mov	QWORD PTR[8+rsp],rdi	;WIN64 prologue
	mov	QWORD PTR[16+rsp],rsi
	mov	rax,rsp
$L$SEH_begin_vpaes_set_decrypt_key::
	mov	rdi,rcx
	mov	rsi,rdx
	mov	rdx,r8


	lea	rsp,QWORD PTR[((-184))+rsp]
	movaps	XMMWORD PTR[16+rsp],xmm6
	movaps	XMMWORD PTR[32+rsp],xmm7
	movaps	XMMWORD PTR[48+rsp],xmm8
	movaps	XMMWORD PTR[64+rsp],xmm9
	movaps	XMMWORD PTR[80+rsp],xmm10
	movaps	XMMWORD PTR[96+rsp],xmm11
	movaps	XMMWORD PTR[112+rsp],xmm12
	movaps	XMMWORD PTR[128+rsp],xmm13
	movaps	XMMWORD PTR[144+rsp],xmm14
	movaps	XMMWORD PTR[160+rsp],xmm15
$L$dec_key_body::
	mov	eax,esi
	shr	eax,5
	add	eax,5
	mov	DWORD PTR[240+rdx],eax
	shl	eax,4
	lea	rdx,QWORD PTR[16+rax*1+rdx]

	mov	ecx,1
	mov	r8d,esi
	shr	r8d,1
	and	r8d,32
	xor	r8d,32
	call	_vpaes_schedule_core
	movaps	xmm6,XMMWORD PTR[16+rsp]
	movaps	xmm7,XMMWORD PTR[32+rsp]
	movaps	xmm8,XMMWORD PTR[48+rsp]
	movaps	xmm9,XMMWORD PTR[64+rsp]
	movaps	xmm10,XMMWORD PTR[80+rsp]
	movaps	xmm11,XMMWORD PTR[96+rsp]
	movaps	xmm12,XMMWORD PTR[112+rsp]
	movaps	xmm13,XMMWORD PTR[128+rsp]
	movaps	xmm14,XMMWORD PTR[144+rsp]
	movaps	xmm15,XMMWORD PTR[160+rsp]
	lea	rsp,QWORD PTR[184+rsp]
$L$dec_key_epilogue::
	xor	eax,eax
	mov	rdi,QWORD PTR[8+rsp]	;WIN64 epilogue
	mov	rsi,QWORD PTR[16+rsp]
	DB	0F3h,0C3h		;repret
$L$SEH_end_vpaes_set_decrypt_key::
vpaes_set_decrypt_key	ENDP

PUBLIC	vpaes_encrypt

ALIGN	16
vpaes_encrypt	PROC PUBLIC
	mov	QWORD PTR[8+rsp],rdi	;WIN64 prologue
	mov	QWORD PTR[16+rsp],rsi
	mov	rax,rsp
$L$SEH_begin_vpaes_encrypt::
	mov	rdi,rcx
	mov	rsi,rdx
	mov	rdx,r8


	lea	rsp,QWORD PTR[((-184))+rsp]
	movaps	XMMWORD PTR[16+rsp],xmm6
	movaps	XMMWORD PTR[32+rsp],xmm7
	movaps	XMMWORD PTR[48+rsp],xmm8
	movaps	XMMWORD PTR[64+rsp],xmm9
	movaps	XMMWORD PTR[80+rsp],xmm10
	movaps	XMMWORD PTR[96+rsp],xmm11
	movaps	XMMWORD PTR[112+rsp],xmm12
	movaps	XMMWORD PTR[128+rsp],xmm13
	movaps	XMMWORD PTR[144+rsp],xmm14
	movaps	XMMWORD PTR[160+rsp],xmm15
$L$enc_body::
	movdqu	xmm0,XMMWORD PTR[rdi]
	call	_vpaes_preheat
	call	_vpaes_encrypt_core
	movdqu	XMMWORD PTR[rsi],xmm0
	movaps	xmm6,XMMWORD PTR[16+rsp]
	movaps	xmm7,XMMWORD PTR[32+rsp]
	movaps	xmm8,XMMWORD PTR[48+rsp]
	movaps	xmm9,XMMWORD PTR[64+rsp]
	movaps	xmm10,XMMWORD PTR[80+rsp]
	movaps	xmm11,XMMWORD PTR[96+rsp]
	movaps	xmm12,XMMWORD PTR[112+rsp]
	movaps	xmm13,XMMWORD PTR[128+rsp]
	movaps	xmm14,XMMWORD PTR[144+rsp]
	movaps	xmm15,XMMWORD PTR[160+rsp]
	lea	rsp,QWORD PTR[184+rsp]
$L$enc_epilogue::
	mov	rdi,QWORD PTR[8+rsp]	;WIN64 epilogue
	mov	rsi,QWORD PTR[16+rsp]
	DB	0F3h,0C3h		;repret
$L$SEH_end_vpaes_encrypt::
vpaes_encrypt	ENDP

PUBLIC	vpaes_decrypt

ALIGN	16
vpaes_decrypt	PROC PUBLIC
	mov	QWORD PTR[8+rsp],rdi	;WIN64 prologue
	mov	QWORD PTR[16+rsp],rsi
	mov	rax,rsp
$L$SEH_begin_vpaes_decrypt::
	mov	rdi,rcx
	mov	rsi,rdx
	mov	rdx,r8


	lea	rsp,QWORD PTR[((-184))+rsp]
	movaps	XMMWORD PTR[16+rsp],xmm6
	movaps	XMMWORD PTR[32+rsp],xmm7
	movaps	XMMWORD PTR[48+rsp],xmm8
	movaps	XMMWORD PTR[64+rsp],xmm9
	movaps	XMMWORD PTR[80+rsp],xmm10
	movaps	XMMWORD PTR[96+rsp],xmm11
	movaps	XMMWORD PTR[112+rsp],xmm12
	movaps	XMMWORD PTR[128+rsp],xmm13
	movaps	XMMWORD PTR[144+rsp],xmm14
	movaps	XMMWORD PTR[160+rsp],xmm15
$L$dec_body::
	movdqu	xmm0,XMMWORD PTR[rdi]
	call	_vpaes_preheat
	call	_vpaes_decrypt_core
	movdqu	XMMWORD PTR[rsi],xmm0
	movaps	xmm6,XMMWORD PTR[16+rsp]
	movaps	xmm7,XMMWORD PTR[32+rsp]
	movaps	xmm8,XMMWORD PTR[48+rsp]
	movaps	xmm9,XMMWORD PTR[64+rsp]
	movaps	xmm10,XMMWORD PTR[80+rsp]
	movaps	xmm11,XMMWORD PTR[96+rsp]
	movaps	xmm12,XMMWORD PTR[112+rsp]
	movaps	xmm13,XMMWORD PTR[128+rsp]
	movaps	xmm14,XMMWORD PTR[144+rsp]
	movaps	xmm15,XMMWORD PTR[160+rsp]
	lea	rsp,QWORD PTR[184+rsp]
$L$dec_epilogue::
	mov	rdi,QWORD PTR[8+rsp]	;WIN64 epilogue
	mov	rsi,QWORD PTR[16+rsp]
	DB	0F3h,0C3h		;repret
$L$SEH_end_vpaes_decrypt::
vpaes_decrypt	ENDP
PUBLIC	vpaes_cbc_encrypt

ALIGN	16
vpaes_cbc_encrypt	PROC PUBLIC
	mov	QWORD PTR[8+rsp],rdi	;WIN64 prologue
	mov	QWORD PTR[16+rsp],rsi
	mov	rax,rsp
$L$SEH_begin_vpaes_cbc_encrypt::
	mov	rdi,rcx
	mov	rsi,rdx
	mov	rdx,r8
	mov	rcx,r9
	mov	r8,QWORD PTR[40+rsp]
	mov	r9,QWORD PTR[48+rsp]


	xchg	rdx,rcx
	sub	rcx,16
	jc	$L$cbc_abort
	lea	rsp,QWORD PTR[((-184))+rsp]
	movaps	XMMWORD PTR[16+rsp],xmm6
	movaps	XMMWORD PTR[32+rsp],xmm7
	movaps	XMMWORD PTR[48+rsp],xmm8
	movaps	XMMWORD PTR[64+rsp],xmm9
	movaps	XMMWORD PTR[80+rsp],xmm10
	movaps	XMMWORD PTR[96+rsp],xmm11
	movaps	XMMWORD PTR[112+rsp],xmm12
	movaps	XMMWORD PTR[128+rsp],xmm13
	movaps	XMMWORD PTR[144+rsp],xmm14
	movaps	XMMWORD PTR[160+rsp],xmm15
$L$cbc_body::
	movdqu	xmm6,XMMWORD PTR[r8]
	sub	rsi,rdi
	call	_vpaes_preheat
	cmp	r9d,0
	je	$L$cbc_dec_loop
	jmp	$L$cbc_enc_loop
ALIGN	16
$L$cbc_enc_loop::
	movdqu	xmm0,XMMWORD PTR[rdi]
	pxor	xmm0,xmm6
	call	_vpaes_encrypt_core
	movdqa	xmm6,xmm0
	movdqu	XMMWORD PTR[rdi*1+rsi],xmm0
	lea	rdi,QWORD PTR[16+rdi]
	sub	rcx,16
	jnc	$L$cbc_enc_loop
	jmp	$L$cbc_done
ALIGN	16
$L$cbc_dec_loop::
	movdqu	xmm0,XMMWORD PTR[rdi]
	movdqa	xmm7,xmm0
	call	_vpaes_decrypt_core
	pxor	xmm0,xmm6
	movdqa	xmm6,xmm7
	movdqu	XMMWORD PTR[rdi*1+rsi],xmm0
	lea	rdi,QWORD PTR[16+rdi]
	sub	rcx,16
	jnc	$L$cbc_dec_loop
$L$cbc_done::
	movdqu	XMMWORD PTR[r8],xmm6
	movaps	xmm6,XMMWORD PTR[16+rsp]
	movaps	xmm7,XMMWORD PTR[32+rsp]
	movaps	xmm8,XMMWORD PTR[48+rsp]
	movaps	xmm9,XMMWORD PTR[64+rsp]
	movaps	xmm10,XMMWORD PTR[80+rsp]
	movaps	xmm11,XMMWORD PTR[96+rsp]
	movaps	xmm12,XMMWORD PTR[112+rsp]
	movaps	xmm13,XMMWORD PTR[128+rsp]
	movaps	xmm14,XMMWORD PTR[144+rsp]
	movaps	xmm15,XMMWORD PTR[160+rsp]
	lea	rsp,QWORD PTR[184+rsp]
$L$cbc_epilogue::
$L$cbc_abort::
	mov	rdi,QWORD PTR[8+rsp]	;WIN64 epilogue
	mov	rsi,QWORD PTR[16+rsp]
	DB	0F3h,0C3h		;repret
$L$SEH_end_vpaes_cbc_encrypt::
vpaes_cbc_encrypt	ENDP







ALIGN	16
_vpaes_preheat	PROC PRIVATE
	lea	r10,QWORD PTR[$L$k_s0F]
	movdqa	xmm10,XMMWORD PTR[((-32))+r10]
	movdqa	xmm11,XMMWORD PTR[((-16))+r10]
	movdqa	xmm9,XMMWORD PTR[r10]
	movdqa	xmm13,XMMWORD PTR[48+r10]
	movdqa	xmm12,XMMWORD PTR[64+r10]
	movdqa	xmm15,XMMWORD PTR[80+r10]
	movdqa	xmm14,XMMWORD PTR[96+r10]
	DB	0F3h,0C3h		;repret
_vpaes_preheat	ENDP






ALIGN	64
_vpaes_consts::
$L$k_inv::
	DQ	00E05060F0D080180h,0040703090A0B0C02h
	DQ	001040A060F0B0780h,0030D0E0C02050809h

$L$k_s0F::
	DQ	00F0F0F0F0F0F0F0Fh,00F0F0F0F0F0F0F0Fh

$L$k_ipt::
	DQ	0C2B2E8985A2A7000h,0CABAE09052227808h
	DQ	04C01307D317C4D00h,0CD80B1FCB0FDCC81h

$L$k_sb1::
	DQ	0B19BE18FCB503E00h,0A5DF7A6E142AF544h
	DQ	03618D415FAE22300h,03BF7CCC10D2ED9EFh
$L$k_sb2::
	DQ	0E27A93C60B712400h,05EB7E955BC982FCDh
	DQ	069EB88400AE12900h,0C2A163C8AB82234Ah
$L$k_sbo::
	DQ	0D0D26D176FBDC700h,015AABF7AC502A878h
	DQ	0CFE474A55FBB6A00h,08E1E90D1412B35FAh

$L$k_mc_forward::
	DQ	00407060500030201h,00C0F0E0D080B0A09h
	DQ	0080B0A0904070605h,0000302010C0F0E0Dh
	DQ	00C0F0E0D080B0A09h,00407060500030201h
	DQ	0000302010C0F0E0Dh,0080B0A0904070605h

$L$k_mc_backward::
	DQ	00605040702010003h,00E0D0C0F0A09080Bh
	DQ	0020100030E0D0C0Fh,00A09080B06050407h
	DQ	00E0D0C0F0A09080Bh,00605040702010003h
	DQ	00A09080B06050407h,0020100030E0D0C0Fh

$L$k_sr::
	DQ	00706050403020100h,00F0E0D0C0B0A0908h
	DQ	0030E09040F0A0500h,00B06010C07020D08h
	DQ	00F060D040B020900h,0070E050C030A0108h
	DQ	00B0E0104070A0D00h,00306090C0F020508h

$L$k_rcon::
	DQ	01F8391B9AF9DEEB6h,0702A98084D7C7D81h

$L$k_s63::
	DQ	05B5B5B5B5B5B5B5Bh,05B5B5B5B5B5B5B5Bh

$L$k_opt::
	DQ	0FF9F4929D6B66000h,0F7974121DEBE6808h
	DQ	001EDBD5150BCEC00h,0E10D5DB1B05C0CE0h

$L$k_deskew::
	DQ	007E4A34047A4E300h,01DFEB95A5DBEF91Ah
	DQ	05F36B5DC83EA6900h,02841C2ABF49D1E77h





$L$k_dksd::
	DQ	0FEB91A5DA3E44700h,00740E3A45A1DBEF9h
	DQ	041C277F4B5368300h,05FDC69EAAB289D1Eh
$L$k_dksb::
	DQ	09A4FCA1F8550D500h,003D653861CC94C99h
	DQ	0115BEDA7B6FC4A00h,0D993256F7E3482C8h
$L$k_dkse::
	DQ	0D5031CCA1FC9D600h,053859A4C994F5086h
	DQ	0A23196054FDC7BE8h,0CD5EF96A20B31487h
$L$k_dks9::
	DQ	0B6116FC87ED9A700h,04AED933482255BFCh
	DQ	04576516227143300h,08BB89FACE9DAFDCEh





$L$k_dipt::
	DQ	00F505B040B545F00h,0154A411E114E451Ah
	DQ	086E383E660056500h,012771772F491F194h

$L$k_dsb9::
	DQ	0851C03539A86D600h,0CAD51F504F994CC9h
	DQ	0C03B1789ECD74900h,0725E2C9EB2FBA565h
$L$k_dsbd::
	DQ	07D57CCDFE6B1A200h,0F56E9B13882A4439h
	DQ	03CE2FAF724C6CB00h,02931180D15DEEFD3h
$L$k_dsbb::
	DQ	0D022649296B44200h,0602646F6B0F2D404h
	DQ	0C19498A6CD596700h,0F3FF0C3E3255AA6Bh
$L$k_dsbe::
	DQ	046F2929626D4D000h,02242600464B4F6B0h
	DQ	00C55A6CDFFAAC100h,09467F36B98593E32h
$L$k_dsbo::
	DQ	01387EA537EF94000h,0C7AA6DB9D4943E2Dh
	DQ	012D7560F93441D00h,0CA4B8159D8C58E9Ch
DB	86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105
DB	111,110,32,65,69,83,32,102,111,114,32,120,56,54,95,54
DB	52,47,83,83,83,69,51,44,32,77,105,107,101,32,72,97
DB	109,98,117,114,103,32,40,83,116,97,110,102,111,114,100,32
DB	85,110,105,118,101,114,115,105,116,121,41,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

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

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

	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$SEH_begin_vpaes_set_encrypt_key
	DD	imagerel $L$SEH_end_vpaes_set_encrypt_key
	DD	imagerel $L$SEH_info_vpaes_set_encrypt_key

	DD	imagerel $L$SEH_begin_vpaes_set_decrypt_key
	DD	imagerel $L$SEH_end_vpaes_set_decrypt_key
	DD	imagerel $L$SEH_info_vpaes_set_decrypt_key

	DD	imagerel $L$SEH_begin_vpaes_encrypt
	DD	imagerel $L$SEH_end_vpaes_encrypt
	DD	imagerel $L$SEH_info_vpaes_encrypt

	DD	imagerel $L$SEH_begin_vpaes_decrypt
	DD	imagerel $L$SEH_end_vpaes_decrypt
	DD	imagerel $L$SEH_info_vpaes_decrypt

	DD	imagerel $L$SEH_begin_vpaes_cbc_encrypt
	DD	imagerel $L$SEH_end_vpaes_cbc_encrypt
	DD	imagerel $L$SEH_info_vpaes_cbc_encrypt

.pdata	ENDS
.xdata	SEGMENT READONLY ALIGN(8)
ALIGN	8
$L$SEH_info_vpaes_set_encrypt_key::
DB	9,0,0,0
	DD	imagerel se_handler
	DD	imagerel $L$enc_key_body,imagerel $L$enc_key_epilogue	
$L$SEH_info_vpaes_set_decrypt_key::
DB	9,0,0,0
	DD	imagerel se_handler
	DD	imagerel $L$dec_key_body,imagerel $L$dec_key_epilogue	
$L$SEH_info_vpaes_encrypt::
DB	9,0,0,0
	DD	imagerel se_handler
	DD	imagerel $L$enc_body,imagerel $L$enc_epilogue		
$L$SEH_info_vpaes_decrypt::
DB	9,0,0,0
	DD	imagerel se_handler
	DD	imagerel $L$dec_body,imagerel $L$dec_epilogue		
$L$SEH_info_vpaes_cbc_encrypt::
DB	9,0,0,0
	DD	imagerel se_handler
	DD	imagerel $L$cbc_body,imagerel $L$cbc_epilogue		

.xdata	ENDS
END

