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


global	x25519_fe51_mul

ALIGN	32
x25519_fe51_mul:
	mov	QWORD[8+rsp],rdi	;WIN64 prologue
	mov	QWORD[16+rsp],rsi
	mov	rax,rsp
$L$SEH_begin_x25519_fe51_mul:
	mov	rdi,rcx
	mov	rsi,rdx
	mov	rdx,r8



	push	rbp

	push	rbx

	push	r12

	push	r13

	push	r14

	push	r15

	lea	rsp,[((-40))+rsp]

$L$fe51_mul_body:

	mov	rax,QWORD[rsi]
	mov	r11,QWORD[rdx]
	mov	r12,QWORD[8+rdx]
	mov	r13,QWORD[16+rdx]
	mov	rbp,QWORD[24+rdx]
	mov	r14,QWORD[32+rdx]

	mov	QWORD[32+rsp],rdi
	mov	rdi,rax
	mul	r11
	mov	QWORD[rsp],r11
	mov	rbx,rax
	mov	rax,rdi
	mov	rcx,rdx
	mul	r12
	mov	QWORD[8+rsp],r12
	mov	r8,rax
	mov	rax,rdi
	lea	r15,[r14*8+r14]
	mov	r9,rdx
	mul	r13
	mov	QWORD[16+rsp],r13
	mov	r10,rax
	mov	rax,rdi
	lea	rdi,[r15*2+r14]
	mov	r11,rdx
	mul	rbp
	mov	r12,rax
	mov	rax,QWORD[rsi]
	mov	r13,rdx
	mul	r14
	mov	r14,rax
	mov	rax,QWORD[8+rsi]
	mov	r15,rdx

	mul	rdi
	add	rbx,rax
	mov	rax,QWORD[16+rsi]
	adc	rcx,rdx
	mul	rdi
	add	r8,rax
	mov	rax,QWORD[24+rsi]
	adc	r9,rdx
	mul	rdi
	add	r10,rax
	mov	rax,QWORD[32+rsi]
	adc	r11,rdx
	mul	rdi
	imul	rdi,rbp,19
	add	r12,rax
	mov	rax,QWORD[8+rsi]
	adc	r13,rdx
	mul	rbp
	mov	rbp,QWORD[16+rsp]
	add	r14,rax
	mov	rax,QWORD[16+rsi]
	adc	r15,rdx

	mul	rdi
	add	rbx,rax
	mov	rax,QWORD[24+rsi]
	adc	rcx,rdx
	mul	rdi
	add	r8,rax
	mov	rax,QWORD[32+rsi]
	adc	r9,rdx
	mul	rdi
	imul	rdi,rbp,19
	add	r10,rax
	mov	rax,QWORD[8+rsi]
	adc	r11,rdx
	mul	rbp
	add	r12,rax
	mov	rax,QWORD[16+rsi]
	adc	r13,rdx
	mul	rbp
	mov	rbp,QWORD[8+rsp]
	add	r14,rax
	mov	rax,QWORD[24+rsi]
	adc	r15,rdx

	mul	rdi
	add	rbx,rax
	mov	rax,QWORD[32+rsi]
	adc	rcx,rdx
	mul	rdi
	add	r8,rax
	mov	rax,QWORD[8+rsi]
	adc	r9,rdx
	mul	rbp
	imul	rdi,rbp,19
	add	r10,rax
	mov	rax,QWORD[16+rsi]
	adc	r11,rdx
	mul	rbp
	add	r12,rax
	mov	rax,QWORD[24+rsi]
	adc	r13,rdx
	mul	rbp
	mov	rbp,QWORD[rsp]
	add	r14,rax
	mov	rax,QWORD[32+rsi]
	adc	r15,rdx

	mul	rdi
	add	rbx,rax
	mov	rax,QWORD[8+rsi]
	adc	rcx,rdx
	mul	rbp
	add	r8,rax
	mov	rax,QWORD[16+rsi]
	adc	r9,rdx
	mul	rbp
	add	r10,rax
	mov	rax,QWORD[24+rsi]
	adc	r11,rdx
	mul	rbp
	add	r12,rax
	mov	rax,QWORD[32+rsi]
	adc	r13,rdx
	mul	rbp
	add	r14,rax
	adc	r15,rdx

	mov	rdi,QWORD[32+rsp]
	jmp	NEAR $L$reduce51
$L$fe51_mul_epilogue:

$L$SEH_end_x25519_fe51_mul:

global	x25519_fe51_sqr

ALIGN	32
x25519_fe51_sqr:
	mov	QWORD[8+rsp],rdi	;WIN64 prologue
	mov	QWORD[16+rsp],rsi
	mov	rax,rsp
$L$SEH_begin_x25519_fe51_sqr:
	mov	rdi,rcx
	mov	rsi,rdx



	push	rbp

	push	rbx

	push	r12

	push	r13

	push	r14

	push	r15

	lea	rsp,[((-40))+rsp]

$L$fe51_sqr_body:

	mov	rax,QWORD[rsi]
	mov	r15,QWORD[16+rsi]
	mov	rbp,QWORD[32+rsi]

	mov	QWORD[32+rsp],rdi
	lea	r14,[rax*1+rax]
	mul	rax
	mov	rbx,rax
	mov	rax,QWORD[8+rsi]
	mov	rcx,rdx
	mul	r14
	mov	r8,rax
	mov	rax,r15
	mov	QWORD[rsp],r15
	mov	r9,rdx
	mul	r14
	mov	r10,rax
	mov	rax,QWORD[24+rsi]
	mov	r11,rdx
	imul	rdi,rbp,19
	mul	r14
	mov	r12,rax
	mov	rax,rbp
	mov	r13,rdx
	mul	r14
	mov	r14,rax
	mov	rax,rbp
	mov	r15,rdx

	mul	rdi
	add	r12,rax
	mov	rax,QWORD[8+rsi]
	adc	r13,rdx

	mov	rsi,QWORD[24+rsi]
	lea	rbp,[rax*1+rax]
	mul	rax
	add	r10,rax
	mov	rax,QWORD[rsp]
	adc	r11,rdx
	mul	rbp
	add	r12,rax
	mov	rax,rbp
	adc	r13,rdx
	mul	rsi
	add	r14,rax
	mov	rax,rbp
	adc	r15,rdx
	imul	rbp,rsi,19
	mul	rdi
	add	rbx,rax
	lea	rax,[rsi*1+rsi]
	adc	rcx,rdx

	mul	rdi
	add	r10,rax
	mov	rax,rsi
	adc	r11,rdx
	mul	rbp
	add	r8,rax
	mov	rax,QWORD[rsp]
	adc	r9,rdx

	lea	rsi,[rax*1+rax]
	mul	rax
	add	r14,rax
	mov	rax,rbp
	adc	r15,rdx
	mul	rsi
	add	rbx,rax
	mov	rax,rsi
	adc	rcx,rdx
	mul	rdi
	add	r8,rax
	adc	r9,rdx

	mov	rdi,QWORD[32+rsp]
	jmp	NEAR $L$reduce51

ALIGN	32
$L$reduce51:
	mov	rbp,0x7ffffffffffff

	mov	rdx,r10
	shr	r10,51
	shl	r11,13
	and	rdx,rbp
	or	r11,r10
	add	r12,r11
	adc	r13,0

	mov	rax,rbx
	shr	rbx,51
	shl	rcx,13
	and	rax,rbp
	or	rcx,rbx
	add	r8,rcx
	adc	r9,0

	mov	rbx,r12
	shr	r12,51
	shl	r13,13
	and	rbx,rbp
	or	r13,r12
	add	r14,r13
	adc	r15,0

	mov	rcx,r8
	shr	r8,51
	shl	r9,13
	and	rcx,rbp
	or	r9,r8
	add	rdx,r9

	mov	r10,r14
	shr	r14,51
	shl	r15,13
	and	r10,rbp
	or	r15,r14

	lea	r14,[r15*8+r15]
	lea	r15,[r14*2+r15]
	add	rax,r15

	mov	r8,rdx
	and	rdx,rbp
	shr	r8,51
	add	rbx,r8

	mov	r9,rax
	and	rax,rbp
	shr	r9,51
	add	rcx,r9

	mov	QWORD[rdi],rax
	mov	QWORD[8+rdi],rcx
	mov	QWORD[16+rdi],rdx
	mov	QWORD[24+rdi],rbx
	mov	QWORD[32+rdi],r10

	mov	r15,QWORD[40+rsp]

	mov	r14,QWORD[48+rsp]

	mov	r13,QWORD[56+rsp]

	mov	r12,QWORD[64+rsp]

	mov	rbx,QWORD[72+rsp]

	mov	rbp,QWORD[80+rsp]

	lea	rsp,[88+rsp]

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

$L$SEH_end_x25519_fe51_sqr:

global	x25519_fe51_mul121666

ALIGN	32
x25519_fe51_mul121666:
	mov	QWORD[8+rsp],rdi	;WIN64 prologue
	mov	QWORD[16+rsp],rsi
	mov	rax,rsp
$L$SEH_begin_x25519_fe51_mul121666:
	mov	rdi,rcx
	mov	rsi,rdx



	push	rbp

	push	rbx

	push	r12

	push	r13

	push	r14

	push	r15

	lea	rsp,[((-40))+rsp]

$L$fe51_mul121666_body:
	mov	eax,121666

	mul	QWORD[rsi]
	mov	rbx,rax
	mov	eax,121666
	mov	rcx,rdx
	mul	QWORD[8+rsi]
	mov	r8,rax
	mov	eax,121666
	mov	r9,rdx
	mul	QWORD[16+rsi]
	mov	r10,rax
	mov	eax,121666
	mov	r11,rdx
	mul	QWORD[24+rsi]
	mov	r12,rax
	mov	eax,121666
	mov	r13,rdx
	mul	QWORD[32+rsi]
	mov	r14,rax
	mov	r15,rdx

	jmp	NEAR $L$reduce51
$L$fe51_mul121666_epilogue:

$L$SEH_end_x25519_fe51_mul121666:
EXTERN	OPENSSL_ia32cap_P
global	x25519_fe64_eligible

ALIGN	32
x25519_fe64_eligible:

	mov	ecx,DWORD[((OPENSSL_ia32cap_P+8))]
	xor	eax,eax
	and	ecx,0x80100
	cmp	ecx,0x80100
	cmove	eax,ecx
	DB	0F3h,0C3h		;repret



global	x25519_fe64_mul

ALIGN	32
x25519_fe64_mul:
	mov	QWORD[8+rsp],rdi	;WIN64 prologue
	mov	QWORD[16+rsp],rsi
	mov	rax,rsp
$L$SEH_begin_x25519_fe64_mul:
	mov	rdi,rcx
	mov	rsi,rdx
	mov	rdx,r8



	push	rbp

	push	rbx

	push	r12

	push	r13

	push	r14

	push	r15

	push	rdi

	lea	rsp,[((-16))+rsp]

$L$fe64_mul_body:

	mov	rax,rdx
	mov	rbp,QWORD[rdx]
	mov	rdx,QWORD[rsi]
	mov	rcx,QWORD[8+rax]
	mov	r14,QWORD[16+rax]
	mov	r15,QWORD[24+rax]

	mulx	rax,r8,rbp
	xor	edi,edi
	mulx	rbx,r9,rcx
	adcx	r9,rax
	mulx	rax,r10,r14
	adcx	r10,rbx
	mulx	r12,r11,r15
	mov	rdx,QWORD[8+rsi]
	adcx	r11,rax
	mov	QWORD[rsp],r14
	adcx	r12,rdi

	mulx	rbx,rax,rbp
	adox	r9,rax
	adcx	r10,rbx
	mulx	rbx,rax,rcx
	adox	r10,rax
	adcx	r11,rbx
	mulx	rbx,rax,r14
	adox	r11,rax
	adcx	r12,rbx
	mulx	r13,rax,r15
	mov	rdx,QWORD[16+rsi]
	adox	r12,rax
	adcx	r13,rdi
	adox	r13,rdi

	mulx	rbx,rax,rbp
	adcx	r10,rax
	adox	r11,rbx
	mulx	rbx,rax,rcx
	adcx	r11,rax
	adox	r12,rbx
	mulx	rbx,rax,r14
	adcx	r12,rax
	adox	r13,rbx
	mulx	r14,rax,r15
	mov	rdx,QWORD[24+rsi]
	adcx	r13,rax
	adox	r14,rdi
	adcx	r14,rdi

	mulx	rbx,rax,rbp
	adox	r11,rax
	adcx	r12,rbx
	mulx	rbx,rax,rcx
	adox	r12,rax
	adcx	r13,rbx
	mulx	rbx,rax,QWORD[rsp]
	adox	r13,rax
	adcx	r14,rbx
	mulx	r15,rax,r15
	mov	edx,38
	adox	r14,rax
	adcx	r15,rdi
	adox	r15,rdi

	jmp	NEAR $L$reduce64
$L$fe64_mul_epilogue:

$L$SEH_end_x25519_fe64_mul:

global	x25519_fe64_sqr

ALIGN	32
x25519_fe64_sqr:
	mov	QWORD[8+rsp],rdi	;WIN64 prologue
	mov	QWORD[16+rsp],rsi
	mov	rax,rsp
$L$SEH_begin_x25519_fe64_sqr:
	mov	rdi,rcx
	mov	rsi,rdx



	push	rbp

	push	rbx

	push	r12

	push	r13

	push	r14

	push	r15

	push	rdi

	lea	rsp,[((-16))+rsp]

$L$fe64_sqr_body:

	mov	rdx,QWORD[rsi]
	mov	rcx,QWORD[8+rsi]
	mov	rbp,QWORD[16+rsi]
	mov	rsi,QWORD[24+rsi]


	mulx	r15,r8,rdx
	mulx	rax,r9,rcx
	xor	edi,edi
	mulx	rbx,r10,rbp
	adcx	r10,rax
	mulx	r12,r11,rsi
	mov	rdx,rcx
	adcx	r11,rbx
	adcx	r12,rdi


	mulx	rbx,rax,rbp
	adox	r11,rax
	adcx	r12,rbx
	mulx	r13,rax,rsi
	mov	rdx,rbp
	adox	r12,rax
	adcx	r13,rdi


	mulx	r14,rax,rsi
	mov	rdx,rcx
	adox	r13,rax
	adcx	r14,rdi
	adox	r14,rdi

	adcx	r9,r9
	adox	r9,r15
	adcx	r10,r10
	mulx	rbx,rax,rdx
	mov	rdx,rbp
	adcx	r11,r11
	adox	r10,rax
	adcx	r12,r12
	adox	r11,rbx
	mulx	rbx,rax,rdx
	mov	rdx,rsi
	adcx	r13,r13
	adox	r12,rax
	adcx	r14,r14
	adox	r13,rbx
	mulx	r15,rax,rdx
	mov	edx,38
	adox	r14,rax
	adcx	r15,rdi
	adox	r15,rdi
	jmp	NEAR $L$reduce64

ALIGN	32
$L$reduce64:
	mulx	rbx,rax,r12
	adcx	r8,rax
	adox	r9,rbx
	mulx	rbx,rax,r13
	adcx	r9,rax
	adox	r10,rbx
	mulx	rbx,rax,r14
	adcx	r10,rax
	adox	r11,rbx
	mulx	r12,rax,r15
	adcx	r11,rax
	adox	r12,rdi
	adcx	r12,rdi

	mov	rdi,QWORD[16+rsp]
	imul	r12,rdx

	add	r8,r12
	adc	r9,0
	adc	r10,0
	adc	r11,0

	sbb	rax,rax
	and	rax,38

	add	r8,rax
	mov	QWORD[8+rdi],r9
	mov	QWORD[16+rdi],r10
	mov	QWORD[24+rdi],r11
	mov	QWORD[rdi],r8

	mov	r15,QWORD[24+rsp]

	mov	r14,QWORD[32+rsp]

	mov	r13,QWORD[40+rsp]

	mov	r12,QWORD[48+rsp]

	mov	rbx,QWORD[56+rsp]

	mov	rbp,QWORD[64+rsp]

	lea	rsp,[72+rsp]

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

$L$SEH_end_x25519_fe64_sqr:

global	x25519_fe64_mul121666

ALIGN	32
x25519_fe64_mul121666:
	mov	QWORD[8+rsp],rdi	;WIN64 prologue
	mov	QWORD[16+rsp],rsi
	mov	rax,rsp
$L$SEH_begin_x25519_fe64_mul121666:
	mov	rdi,rcx
	mov	rsi,rdx


$L$fe64_mul121666_body:

	mov	edx,121666
	mulx	rcx,r8,QWORD[rsi]
	mulx	rax,r9,QWORD[8+rsi]
	add	r9,rcx
	mulx	rcx,r10,QWORD[16+rsi]
	adc	r10,rax
	mulx	rax,r11,QWORD[24+rsi]
	adc	r11,rcx
	adc	rax,0

	imul	rax,rax,38

	add	r8,rax
	adc	r9,0
	adc	r10,0
	adc	r11,0

	sbb	rax,rax
	and	rax,38

	add	r8,rax
	mov	QWORD[8+rdi],r9
	mov	QWORD[16+rdi],r10
	mov	QWORD[24+rdi],r11
	mov	QWORD[rdi],r8

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

$L$SEH_end_x25519_fe64_mul121666:

global	x25519_fe64_add

ALIGN	32
x25519_fe64_add:
	mov	QWORD[8+rsp],rdi	;WIN64 prologue
	mov	QWORD[16+rsp],rsi
	mov	rax,rsp
$L$SEH_begin_x25519_fe64_add:
	mov	rdi,rcx
	mov	rsi,rdx
	mov	rdx,r8


$L$fe64_add_body:

	mov	r8,QWORD[rsi]
	mov	r9,QWORD[8+rsi]
	mov	r10,QWORD[16+rsi]
	mov	r11,QWORD[24+rsi]

	add	r8,QWORD[rdx]
	adc	r9,QWORD[8+rdx]
	adc	r10,QWORD[16+rdx]
	adc	r11,QWORD[24+rdx]

	sbb	rax,rax
	and	rax,38

	add	r8,rax
	adc	r9,0
	adc	r10,0
	mov	QWORD[8+rdi],r9
	adc	r11,0
	mov	QWORD[16+rdi],r10
	sbb	rax,rax
	mov	QWORD[24+rdi],r11
	and	rax,38

	add	r8,rax
	mov	QWORD[rdi],r8

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

$L$SEH_end_x25519_fe64_add:

global	x25519_fe64_sub

ALIGN	32
x25519_fe64_sub:
	mov	QWORD[8+rsp],rdi	;WIN64 prologue
	mov	QWORD[16+rsp],rsi
	mov	rax,rsp
$L$SEH_begin_x25519_fe64_sub:
	mov	rdi,rcx
	mov	rsi,rdx
	mov	rdx,r8


$L$fe64_sub_body:

	mov	r8,QWORD[rsi]
	mov	r9,QWORD[8+rsi]
	mov	r10,QWORD[16+rsi]
	mov	r11,QWORD[24+rsi]

	sub	r8,QWORD[rdx]
	sbb	r9,QWORD[8+rdx]
	sbb	r10,QWORD[16+rdx]
	sbb	r11,QWORD[24+rdx]

	sbb	rax,rax
	and	rax,38

	sub	r8,rax
	sbb	r9,0
	sbb	r10,0
	mov	QWORD[8+rdi],r9
	sbb	r11,0
	mov	QWORD[16+rdi],r10
	sbb	rax,rax
	mov	QWORD[24+rdi],r11
	and	rax,38

	sub	r8,rax
	mov	QWORD[rdi],r8

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

$L$SEH_end_x25519_fe64_sub:

global	x25519_fe64_tobytes

ALIGN	32
x25519_fe64_tobytes:
	mov	QWORD[8+rsp],rdi	;WIN64 prologue
	mov	QWORD[16+rsp],rsi
	mov	rax,rsp
$L$SEH_begin_x25519_fe64_tobytes:
	mov	rdi,rcx
	mov	rsi,rdx


$L$fe64_to_body:

	mov	r8,QWORD[rsi]
	mov	r9,QWORD[8+rsi]
	mov	r10,QWORD[16+rsi]
	mov	r11,QWORD[24+rsi]


	lea	rax,[r11*1+r11]
	sar	r11,63
	shr	rax,1
	and	r11,19
	add	r11,19

	add	r8,r11
	adc	r9,0
	adc	r10,0
	adc	rax,0

	lea	r11,[rax*1+rax]
	sar	rax,63
	shr	r11,1
	not	rax
	and	rax,19

	sub	r8,rax
	sbb	r9,0
	sbb	r10,0
	sbb	r11,0

	mov	QWORD[rdi],r8
	mov	QWORD[8+rdi],r9
	mov	QWORD[16+rdi],r10
	mov	QWORD[24+rdi],r11

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

$L$SEH_end_x25519_fe64_tobytes:
DB	88,50,53,53,49,57,32,112,114,105,109,105,116,105,118,101
DB	115,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82
DB	89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112
DB	114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
EXTERN	__imp_RtlVirtualUnwind


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

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

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

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

	mov	rax,QWORD[152+r8]
	jmp	NEAR $L$common_seh_tail



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

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

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

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

	mov	rax,QWORD[152+r8]

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

	mov	r10d,DWORD[8+r11]
	lea	rax,[r10*1+rax]

	mov	rbp,QWORD[((-8))+rax]
	mov	rbx,QWORD[((-16))+rax]
	mov	r12,QWORD[((-24))+rax]
	mov	r13,QWORD[((-32))+rax]
	mov	r14,QWORD[((-40))+rax]
	mov	r15,QWORD[((-48))+rax]
	mov	QWORD[144+r8],rbx
	mov	QWORD[160+r8],rbp
	mov	QWORD[216+r8],r12
	mov	QWORD[224+r8],r13
	mov	QWORD[232+r8],r14
	mov	QWORD[240+r8],r15

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

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

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

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


section	.pdata rdata align=4
ALIGN	4
	DD	$L$SEH_begin_x25519_fe51_mul wrt ..imagebase
	DD	$L$SEH_end_x25519_fe51_mul wrt ..imagebase
	DD	$L$SEH_info_x25519_fe51_mul wrt ..imagebase

	DD	$L$SEH_begin_x25519_fe51_sqr wrt ..imagebase
	DD	$L$SEH_end_x25519_fe51_sqr wrt ..imagebase
	DD	$L$SEH_info_x25519_fe51_sqr wrt ..imagebase

	DD	$L$SEH_begin_x25519_fe51_mul121666 wrt ..imagebase
	DD	$L$SEH_end_x25519_fe51_mul121666 wrt ..imagebase
	DD	$L$SEH_info_x25519_fe51_mul121666 wrt ..imagebase
	DD	$L$SEH_begin_x25519_fe64_mul wrt ..imagebase
	DD	$L$SEH_end_x25519_fe64_mul wrt ..imagebase
	DD	$L$SEH_info_x25519_fe64_mul wrt ..imagebase

	DD	$L$SEH_begin_x25519_fe64_sqr wrt ..imagebase
	DD	$L$SEH_end_x25519_fe64_sqr wrt ..imagebase
	DD	$L$SEH_info_x25519_fe64_sqr wrt ..imagebase

	DD	$L$SEH_begin_x25519_fe64_mul121666 wrt ..imagebase
	DD	$L$SEH_end_x25519_fe64_mul121666 wrt ..imagebase
	DD	$L$SEH_info_x25519_fe64_mul121666 wrt ..imagebase

	DD	$L$SEH_begin_x25519_fe64_add wrt ..imagebase
	DD	$L$SEH_end_x25519_fe64_add wrt ..imagebase
	DD	$L$SEH_info_x25519_fe64_add wrt ..imagebase

	DD	$L$SEH_begin_x25519_fe64_sub wrt ..imagebase
	DD	$L$SEH_end_x25519_fe64_sub wrt ..imagebase
	DD	$L$SEH_info_x25519_fe64_sub wrt ..imagebase

	DD	$L$SEH_begin_x25519_fe64_tobytes wrt ..imagebase
	DD	$L$SEH_end_x25519_fe64_tobytes wrt ..imagebase
	DD	$L$SEH_info_x25519_fe64_tobytes wrt ..imagebase
section	.xdata rdata align=8
ALIGN	8
$L$SEH_info_x25519_fe51_mul:
DB	9,0,0,0
	DD	full_handler wrt ..imagebase
	DD	$L$fe51_mul_body wrt ..imagebase,$L$fe51_mul_epilogue wrt ..imagebase
	DD	88,0
$L$SEH_info_x25519_fe51_sqr:
DB	9,0,0,0
	DD	full_handler wrt ..imagebase
	DD	$L$fe51_sqr_body wrt ..imagebase,$L$fe51_sqr_epilogue wrt ..imagebase
	DD	88,0
$L$SEH_info_x25519_fe51_mul121666:
DB	9,0,0,0
	DD	full_handler wrt ..imagebase
	DD	$L$fe51_mul121666_body wrt ..imagebase,$L$fe51_mul121666_epilogue wrt ..imagebase
	DD	88,0
$L$SEH_info_x25519_fe64_mul:
DB	9,0,0,0
	DD	full_handler wrt ..imagebase
	DD	$L$fe64_mul_body wrt ..imagebase,$L$fe64_mul_epilogue wrt ..imagebase
	DD	72,0
$L$SEH_info_x25519_fe64_sqr:
DB	9,0,0,0
	DD	full_handler wrt ..imagebase
	DD	$L$fe64_sqr_body wrt ..imagebase,$L$fe64_sqr_epilogue wrt ..imagebase
	DD	72,0
$L$SEH_info_x25519_fe64_mul121666:
DB	9,0,0,0
	DD	short_handler wrt ..imagebase
	DD	$L$fe64_mul121666_body wrt ..imagebase,$L$fe64_mul121666_epilogue wrt ..imagebase
$L$SEH_info_x25519_fe64_add:
DB	9,0,0,0
	DD	short_handler wrt ..imagebase
	DD	$L$fe64_add_body wrt ..imagebase,$L$fe64_add_epilogue wrt ..imagebase
$L$SEH_info_x25519_fe64_sub:
DB	9,0,0,0
	DD	short_handler wrt ..imagebase
	DD	$L$fe64_sub_body wrt ..imagebase,$L$fe64_sub_epilogue wrt ..imagebase
$L$SEH_info_x25519_fe64_tobytes:
DB	9,0,0,0
	DD	short_handler wrt ..imagebase
	DD	$L$fe64_to_body wrt ..imagebase,$L$fe64_to_epilogue wrt ..imagebase
