OPTION	DOTNAME
.text$	SEGMENT ALIGN(256) 'CODE'

PUBLIC	ct_inverse_mod_256

ALIGN	32
ct_inverse_mod_256	PROC PUBLIC
	DB	243,15,30,250
	mov	QWORD PTR[8+rsp],rdi	;WIN64 prologue
	mov	QWORD PTR[16+rsp],rsi
	mov	r11,rsp
$L$SEH_begin_ct_inverse_mod_256::
	mov	rdi,rcx
	mov	rsi,rdx
	mov	rdx,r8
	mov	rcx,r9



	push	rbp

	push	rbx

	push	r12

	push	r13

	push	r14

	push	r15

	sub	rsp,1072

$L$SEH_body_ct_inverse_mod_256::


	lea	rax,QWORD PTR[((48+511))+rsp]
	and	rax,-512
	mov	QWORD PTR[32+rsp],rdi
	mov	QWORD PTR[40+rsp],rcx

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

	mov	r12,QWORD PTR[rdx]
	mov	r13,QWORD PTR[8+rdx]
	mov	r14,QWORD PTR[16+rdx]
	mov	r15,QWORD PTR[24+rdx]

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

	mov	QWORD PTR[32+rax],r12
	mov	QWORD PTR[40+rax],r13
	mov	QWORD PTR[48+rax],r14
	mov	QWORD PTR[56+rax],r15
	mov	rsi,rax


	mov	edx,31
	call	__ab_approximation_31_256


	mov	QWORD PTR[16+rsp],r12
	mov	QWORD PTR[24+rsp],r13

	mov	rdi,256
	xor	rdi,rsi
	call	__smulq_256_n_shift_by_31


	mov	QWORD PTR[64+rdi],rdx

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256_n_shift_by_31


	mov	QWORD PTR[72+rdi],rdx


	xor	rsi,256
	mov	edx,31
	call	__ab_approximation_31_256


	mov	QWORD PTR[16+rsp],r12
	mov	QWORD PTR[24+rsp],r13

	mov	rdi,256
	xor	rdi,rsi
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[rsp],rdx
	mov	QWORD PTR[8+rsp],rcx

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256_n_shift_by_31



	mov	r8,QWORD PTR[64+rsi]
	mov	r12,QWORD PTR[104+rsi]
	mov	r9,r8
	imul	r8,QWORD PTR[rsp]
	mov	r13,r12
	imul	r12,QWORD PTR[8+rsp]
	add	r8,r12
	mov	QWORD PTR[32+rdi],r8
	sar	r8,63
	mov	QWORD PTR[40+rdi],r8
	mov	QWORD PTR[48+rdi],r8
	mov	QWORD PTR[56+rdi],r8
	mov	QWORD PTR[64+rdi],r8
	lea	rsi,QWORD PTR[64+rsi]

	imul	r9,rdx
	imul	r13,rcx
	add	r9,r13
	mov	QWORD PTR[72+rdi],r9
	sar	r9,63
	mov	QWORD PTR[80+rdi],r9
	mov	QWORD PTR[88+rdi],r9
	mov	QWORD PTR[96+rdi],r9
	mov	QWORD PTR[104+rdi],r9
	xor	rsi,256+8*8
	mov	edx,31
	call	__ab_approximation_31_256


	mov	QWORD PTR[16+rsp],r12
	mov	QWORD PTR[24+rsp],r13

	mov	rdi,256
	xor	rdi,rsi
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[rsp],rdx
	mov	QWORD PTR[8+rsp],rcx

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[16+rsp],rdx
	mov	QWORD PTR[24+rsp],rcx

	mov	rdx,QWORD PTR[rsp]
	mov	rcx,QWORD PTR[8+rsp]
	lea	rsi,QWORD PTR[64+rsi]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256x63

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[40+rdi]
	call	__smulq_256x63
	xor	rsi,256+8*8
	mov	edx,31
	call	__ab_approximation_31_256


	mov	QWORD PTR[16+rsp],r12
	mov	QWORD PTR[24+rsp],r13

	mov	rdi,256
	xor	rdi,rsi
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[rsp],rdx
	mov	QWORD PTR[8+rsp],rcx

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[16+rsp],rdx
	mov	QWORD PTR[24+rsp],rcx

	mov	rdx,QWORD PTR[rsp]
	mov	rcx,QWORD PTR[8+rsp]
	lea	rsi,QWORD PTR[64+rsi]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256x63

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[40+rdi]
	call	__smulq_256x63
	xor	rsi,256+8*8
	mov	edx,31
	call	__ab_approximation_31_256


	mov	QWORD PTR[16+rsp],r12
	mov	QWORD PTR[24+rsp],r13

	mov	rdi,256
	xor	rdi,rsi
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[rsp],rdx
	mov	QWORD PTR[8+rsp],rcx

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[16+rsp],rdx
	mov	QWORD PTR[24+rsp],rcx

	mov	rdx,QWORD PTR[rsp]
	mov	rcx,QWORD PTR[8+rsp]
	lea	rsi,QWORD PTR[64+rsi]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256x63

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[40+rdi]
	call	__smulq_256x63
	xor	rsi,256+8*8
	mov	edx,31
	call	__ab_approximation_31_256


	mov	QWORD PTR[16+rsp],r12
	mov	QWORD PTR[24+rsp],r13

	mov	rdi,256
	xor	rdi,rsi
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[rsp],rdx
	mov	QWORD PTR[8+rsp],rcx

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[16+rsp],rdx
	mov	QWORD PTR[24+rsp],rcx

	mov	rdx,QWORD PTR[rsp]
	mov	rcx,QWORD PTR[8+rsp]
	lea	rsi,QWORD PTR[64+rsi]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256x63

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[40+rdi]
	call	__smulq_256x63
	xor	rsi,256+8*8
	mov	edx,31
	call	__ab_approximation_31_256


	mov	QWORD PTR[16+rsp],r12
	mov	QWORD PTR[24+rsp],r13

	mov	rdi,256
	xor	rdi,rsi
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[rsp],rdx
	mov	QWORD PTR[8+rsp],rcx

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[16+rsp],rdx
	mov	QWORD PTR[24+rsp],rcx

	mov	rdx,QWORD PTR[rsp]
	mov	rcx,QWORD PTR[8+rsp]
	lea	rsi,QWORD PTR[64+rsi]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256x63

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[40+rdi]
	call	__smulq_256x63
	xor	rsi,256+8*8
	mov	edx,31
	call	__ab_approximation_31_256


	mov	QWORD PTR[16+rsp],r12
	mov	QWORD PTR[24+rsp],r13

	mov	rdi,256
	xor	rdi,rsi
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[rsp],rdx
	mov	QWORD PTR[8+rsp],rcx

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[16+rsp],rdx
	mov	QWORD PTR[24+rsp],rcx

	mov	rdx,QWORD PTR[rsp]
	mov	rcx,QWORD PTR[8+rsp]
	lea	rsi,QWORD PTR[64+rsi]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256x63

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[40+rdi]
	call	__smulq_256x63
	xor	rsi,256+8*8
	mov	edx,31
	call	__ab_approximation_31_256


	mov	QWORD PTR[16+rsp],r12
	mov	QWORD PTR[24+rsp],r13

	mov	rdi,256
	xor	rdi,rsi
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[rsp],rdx
	mov	QWORD PTR[8+rsp],rcx

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[16+rsp],rdx
	mov	QWORD PTR[24+rsp],rcx

	mov	rdx,QWORD PTR[rsp]
	mov	rcx,QWORD PTR[8+rsp]
	lea	rsi,QWORD PTR[64+rsi]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256x63

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[40+rdi]
	call	__smulq_256x63
	sar	rbp,63
	mov	QWORD PTR[40+rdi],rbp
	mov	QWORD PTR[48+rdi],rbp
	mov	QWORD PTR[56+rdi],rbp
	xor	rsi,256+8*8
	mov	edx,31
	call	__ab_approximation_31_256


	mov	QWORD PTR[16+rsp],r12
	mov	QWORD PTR[24+rsp],r13

	mov	rdi,256
	xor	rdi,rsi
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[rsp],rdx
	mov	QWORD PTR[8+rsp],rcx

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[16+rsp],rdx
	mov	QWORD PTR[24+rsp],rcx

	mov	rdx,QWORD PTR[rsp]
	mov	rcx,QWORD PTR[8+rsp]
	lea	rsi,QWORD PTR[64+rsi]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256x63

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[40+rdi]
	call	__smulq_512x63
	xor	rsi,256+8*8
	mov	edx,31
	call	__ab_approximation_31_256


	mov	QWORD PTR[16+rsp],r12
	mov	QWORD PTR[24+rsp],r13

	mov	rdi,256
	xor	rdi,rsi
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[rsp],rdx
	mov	QWORD PTR[8+rsp],rcx

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[16+rsp],rdx
	mov	QWORD PTR[24+rsp],rcx

	mov	rdx,QWORD PTR[rsp]
	mov	rcx,QWORD PTR[8+rsp]
	lea	rsi,QWORD PTR[64+rsi]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256x63

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[40+rdi]
	call	__smulq_512x63
	xor	rsi,256+8*8
	mov	edx,31
	call	__ab_approximation_31_256


	mov	QWORD PTR[16+rsp],r12
	mov	QWORD PTR[24+rsp],r13

	mov	rdi,256
	xor	rdi,rsi
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[rsp],rdx
	mov	QWORD PTR[8+rsp],rcx

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[16+rsp],rdx
	mov	QWORD PTR[24+rsp],rcx

	mov	rdx,QWORD PTR[rsp]
	mov	rcx,QWORD PTR[8+rsp]
	lea	rsi,QWORD PTR[64+rsi]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256x63

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[40+rdi]
	call	__smulq_512x63
	xor	rsi,256+8*8
	mov	edx,31
	call	__ab_approximation_31_256


	mov	QWORD PTR[16+rsp],r12
	mov	QWORD PTR[24+rsp],r13

	mov	rdi,256
	xor	rdi,rsi
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[rsp],rdx
	mov	QWORD PTR[8+rsp],rcx

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[16+rsp],rdx
	mov	QWORD PTR[24+rsp],rcx

	mov	rdx,QWORD PTR[rsp]
	mov	rcx,QWORD PTR[8+rsp]
	lea	rsi,QWORD PTR[64+rsi]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256x63

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[40+rdi]
	call	__smulq_512x63
	xor	rsi,256+8*8
	mov	edx,31
	call	__ab_approximation_31_256


	mov	QWORD PTR[16+rsp],r12
	mov	QWORD PTR[24+rsp],r13

	mov	rdi,256
	xor	rdi,rsi
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[rsp],rdx
	mov	QWORD PTR[8+rsp],rcx

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[16+rsp],rdx
	mov	QWORD PTR[24+rsp],rcx

	mov	rdx,QWORD PTR[rsp]
	mov	rcx,QWORD PTR[8+rsp]
	lea	rsi,QWORD PTR[64+rsi]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256x63

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[40+rdi]
	call	__smulq_512x63
	xor	rsi,256+8*8
	mov	edx,31
	call	__ab_approximation_31_256


	mov	QWORD PTR[16+rsp],r12
	mov	QWORD PTR[24+rsp],r13

	mov	rdi,256
	xor	rdi,rsi
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[rsp],rdx
	mov	QWORD PTR[8+rsp],rcx

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256_n_shift_by_31
	mov	QWORD PTR[16+rsp],rdx
	mov	QWORD PTR[24+rsp],rcx

	mov	rdx,QWORD PTR[rsp]
	mov	rcx,QWORD PTR[8+rsp]
	lea	rsi,QWORD PTR[64+rsi]
	lea	rdi,QWORD PTR[32+rdi]
	call	__smulq_256x63

	mov	rdx,QWORD PTR[16+rsp]
	mov	rcx,QWORD PTR[24+rsp]
	lea	rdi,QWORD PTR[40+rdi]
	call	__smulq_512x63

	xor	rsi,256+8*8
	mov	edx,47

	mov	r8,QWORD PTR[rsi]

	mov	r10,QWORD PTR[32+rsi]

	call	__inner_loop_62_256







	lea	rsi,QWORD PTR[64+rsi]





	mov	rdx,r12
	mov	rcx,r13
	mov	rdi,QWORD PTR[32+rsp]
	call	__smulq_512x63
	adc	rdx,rbp

	mov	rsi,QWORD PTR[40+rsp]
	mov	rax,rdx
	sar	rdx,63

	mov	r8,rdx
	mov	r9,rdx
	and	r8,QWORD PTR[rsi]
	mov	r10,rdx
	and	r9,QWORD PTR[8+rsi]
	and	r10,QWORD PTR[16+rsi]
	and	rdx,QWORD PTR[24+rsi]

	add	r12,r8
	adc	r13,r9
	adc	r14,r10
	adc	r15,rdx
	adc	rax,0

	mov	rdx,rax
	neg	rax
	or	rdx,rax
	sar	rax,63

	mov	r8,rdx
	mov	r9,rdx
	and	r8,QWORD PTR[rsi]
	mov	r10,rdx
	and	r9,QWORD PTR[8+rsi]
	and	r10,QWORD PTR[16+rsi]
	and	rdx,QWORD PTR[24+rsi]

	xor	r8,rax
	xor	rcx,rcx
	xor	r9,rax
	sub	rcx,rax
	xor	r10,rax
	xor	rdx,rax
	add	r8,rcx
	adc	r9,0
	adc	r10,0
	adc	rdx,0

	add	r12,r8
	adc	r13,r9
	adc	r14,r10
	adc	r15,rdx

	mov	QWORD PTR[32+rdi],r12
	mov	QWORD PTR[40+rdi],r13
	mov	QWORD PTR[48+rdi],r14
	mov	QWORD PTR[56+rdi],r15

	lea	r8,QWORD PTR[1072+rsp]
	mov	r15,QWORD PTR[r8]

	mov	r14,QWORD PTR[8+r8]

	mov	r13,QWORD PTR[16+r8]

	mov	r12,QWORD PTR[24+r8]

	mov	rbx,QWORD PTR[32+r8]

	mov	rbp,QWORD PTR[40+r8]

	lea	rsp,QWORD PTR[48+r8]

$L$SEH_epilogue_ct_inverse_mod_256::
	mov	rdi,QWORD PTR[8+rsp]	;WIN64 epilogue
	mov	rsi,QWORD PTR[16+rsp]

	DB	0F3h,0C3h		;repret

$L$SEH_end_ct_inverse_mod_256::
ct_inverse_mod_256	ENDP

ALIGN	32
__smulq_512x63	PROC PRIVATE
	DB	243,15,30,250
	mov	r8,QWORD PTR[rsi]
	mov	r9,QWORD PTR[8+rsi]
	mov	r10,QWORD PTR[16+rsi]
	mov	r11,QWORD PTR[24+rsi]
	mov	rbp,QWORD PTR[32+rsi]

	mov	rbx,rdx
	sar	rdx,63
	xor	rax,rax
	sub	rax,rdx

	xor	rbx,rdx
	add	rbx,rax

	xor	r8,rdx
	xor	r9,rdx
	xor	r10,rdx
	xor	r11,rdx
	xor	rbp,rdx
	add	rax,r8
	adc	r9,0
	adc	r10,0
	adc	r11,0
	adc	rbp,0

	mul	rbx
	mov	QWORD PTR[rdi],rax
	mov	rax,r9
	mov	r9,rdx
	mul	rbx
	add	r9,rax
	mov	rax,r10
	adc	rdx,0
	mov	QWORD PTR[8+rdi],r9
	mov	r10,rdx
	mul	rbx
	add	r10,rax
	mov	rax,r11
	adc	rdx,0
	mov	QWORD PTR[16+rdi],r10
	mov	r11,rdx
	and	rbp,rbx
	neg	rbp
	mul	rbx
	add	r11,rax
	adc	rbp,rdx
	mov	QWORD PTR[24+rdi],r11

	mov	r8,QWORD PTR[40+rsi]
	mov	r9,QWORD PTR[48+rsi]
	mov	r10,QWORD PTR[56+rsi]
	mov	r11,QWORD PTR[64+rsi]
	mov	r12,QWORD PTR[72+rsi]
	mov	r13,QWORD PTR[80+rsi]
	mov	r14,QWORD PTR[88+rsi]
	mov	r15,QWORD PTR[96+rsi]

	mov	rdx,rcx
	sar	rdx,63
	xor	rax,rax
	sub	rax,rdx

	xor	rcx,rdx
	add	rcx,rax

	xor	r8,rdx
	xor	r9,rdx
	xor	r10,rdx
	xor	r11,rdx
	xor	r12,rdx
	xor	r13,rdx
	xor	r14,rdx
	xor	r15,rdx
	add	rax,r8
	adc	r9,0
	adc	r10,0
	adc	r11,0
	adc	r12,0
	adc	r13,0
	adc	r14,0
	adc	r15,0

	mul	rcx
	mov	r8,rax
	mov	rax,r9
	mov	r9,rdx
	mul	rcx
	add	r9,rax
	mov	rax,r10
	adc	rdx,0
	mov	r10,rdx
	mul	rcx
	add	r10,rax
	mov	rax,r11
	adc	rdx,0
	mov	r11,rdx
	mul	rcx
	add	r11,rax
	mov	rax,r12
	adc	rdx,0
	mov	r12,rdx
	mul	rcx
	add	r12,rax
	mov	rax,r13
	adc	rdx,0
	mov	r13,rdx
	mul	rcx
	add	r13,rax
	mov	rax,r14
	adc	rdx,0
	mov	r14,rdx
	mul	rcx
	add	r14,rax
	mov	rax,r15
	adc	rdx,0
	mov	r15,rdx
	imul	rcx
	add	r15,rax
	adc	rdx,0

	mov	rbx,rbp
	sar	rbp,63

	add	r8,QWORD PTR[rdi]
	adc	r9,QWORD PTR[8+rdi]
	adc	r10,QWORD PTR[16+rdi]
	adc	r11,QWORD PTR[24+rdi]
	adc	r12,rbx
	adc	r13,rbp
	adc	r14,rbp
	adc	r15,rbp

	mov	QWORD PTR[rdi],r8
	mov	QWORD PTR[8+rdi],r9
	mov	QWORD PTR[16+rdi],r10
	mov	QWORD PTR[24+rdi],r11
	mov	QWORD PTR[32+rdi],r12
	mov	QWORD PTR[40+rdi],r13
	mov	QWORD PTR[48+rdi],r14
	mov	QWORD PTR[56+rdi],r15

	DB	0F3h,0C3h		;repret
__smulq_512x63	ENDP


ALIGN	32
__smulq_256x63	PROC PRIVATE
	DB	243,15,30,250
	mov	r8,QWORD PTR[((0+0))+rsi]
	mov	r9,QWORD PTR[((0+8))+rsi]
	mov	r10,QWORD PTR[((0+16))+rsi]
	mov	r11,QWORD PTR[((0+24))+rsi]
	mov	rbp,QWORD PTR[((0+32))+rsi]

	mov	rbx,rdx
	sar	rdx,63
	xor	rax,rax
	sub	rax,rdx

	xor	rbx,rdx
	add	rbx,rax

	xor	r8,rdx
	xor	r9,rdx
	xor	r10,rdx
	xor	r11,rdx
	xor	rbp,rdx
	add	rax,r8
	adc	r9,0
	adc	r10,0
	adc	r11,0
	adc	rbp,0

	mul	rbx
	mov	r8,rax
	mov	rax,r9
	mov	r9,rdx
	mul	rbx
	add	r9,rax
	mov	rax,r10
	adc	rdx,0
	mov	r10,rdx
	mul	rbx
	add	r10,rax
	mov	rax,r11
	adc	rdx,0
	mov	r11,rdx
	and	rbp,rbx
	neg	rbp
	mul	rbx
	add	r11,rax
	adc	rbp,rdx
	mov	rdx,rcx
	mov	r12,QWORD PTR[((40+0))+rsi]
	mov	r13,QWORD PTR[((40+8))+rsi]
	mov	r14,QWORD PTR[((40+16))+rsi]
	mov	r15,QWORD PTR[((40+24))+rsi]
	mov	rcx,QWORD PTR[((40+32))+rsi]

	mov	rbx,rdx
	sar	rdx,63
	xor	rax,rax
	sub	rax,rdx

	xor	rbx,rdx
	add	rbx,rax

	xor	r12,rdx
	xor	r13,rdx
	xor	r14,rdx
	xor	r15,rdx
	xor	rcx,rdx
	add	rax,r12
	adc	r13,0
	adc	r14,0
	adc	r15,0
	adc	rcx,0

	mul	rbx
	mov	r12,rax
	mov	rax,r13
	mov	r13,rdx
	mul	rbx
	add	r13,rax
	mov	rax,r14
	adc	rdx,0
	mov	r14,rdx
	mul	rbx
	add	r14,rax
	mov	rax,r15
	adc	rdx,0
	mov	r15,rdx
	and	rcx,rbx
	neg	rcx
	mul	rbx
	add	r15,rax
	adc	rcx,rdx
	add	r8,r12
	adc	r9,r13
	adc	r10,r14
	adc	r11,r15
	adc	rbp,rcx

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

	DB	0F3h,0C3h		;repret
__smulq_256x63	ENDP

ALIGN	32
__smulq_256_n_shift_by_31	PROC PRIVATE
	DB	243,15,30,250
	mov	QWORD PTR[rdi],rdx
	mov	QWORD PTR[8+rdi],rcx
	mov	rbp,rdx
	mov	r8,QWORD PTR[((0+0))+rsi]
	mov	r9,QWORD PTR[((0+8))+rsi]
	mov	r10,QWORD PTR[((0+16))+rsi]
	mov	r11,QWORD PTR[((0+24))+rsi]

	mov	rbx,rbp
	sar	rbp,63
	xor	rax,rax
	sub	rax,rbp

	xor	rbx,rbp
	add	rbx,rax

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

	mul	rbx
	mov	r8,rax
	mov	rax,r9
	and	rbp,rbx
	neg	rbp
	mov	r9,rdx
	mul	rbx
	add	r9,rax
	mov	rax,r10
	adc	rdx,0
	mov	r10,rdx
	mul	rbx
	add	r10,rax
	mov	rax,r11
	adc	rdx,0
	mov	r11,rdx
	mul	rbx
	add	r11,rax
	adc	rbp,rdx
	mov	r12,QWORD PTR[((32+0))+rsi]
	mov	r13,QWORD PTR[((32+8))+rsi]
	mov	r14,QWORD PTR[((32+16))+rsi]
	mov	r15,QWORD PTR[((32+24))+rsi]

	mov	rbx,rcx
	sar	rcx,63
	xor	rax,rax
	sub	rax,rcx

	xor	rbx,rcx
	add	rbx,rax

	xor	r12,rcx
	xor	r13,rcx
	xor	r14,rcx
	xor	r15,rcx
	add	rax,r12
	adc	r13,0
	adc	r14,0
	adc	r15,0

	mul	rbx
	mov	r12,rax
	mov	rax,r13
	and	rcx,rbx
	neg	rcx
	mov	r13,rdx
	mul	rbx
	add	r13,rax
	mov	rax,r14
	adc	rdx,0
	mov	r14,rdx
	mul	rbx
	add	r14,rax
	mov	rax,r15
	adc	rdx,0
	mov	r15,rdx
	mul	rbx
	add	r15,rax
	adc	rcx,rdx
	add	r8,r12
	adc	r9,r13
	adc	r10,r14
	adc	r11,r15
	adc	rbp,rcx

	mov	rdx,QWORD PTR[rdi]
	mov	rcx,QWORD PTR[8+rdi]

	shrd	r8,r9,31
	shrd	r9,r10,31
	shrd	r10,r11,31
	shrd	r11,rbp,31

	sar	rbp,63
	xor	rax,rax
	sub	rax,rbp

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

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

	xor	rdx,rbp
	xor	rcx,rbp
	add	rdx,rax
	add	rcx,rax

	DB	0F3h,0C3h		;repret
__smulq_256_n_shift_by_31	ENDP

ALIGN	32
__ab_approximation_31_256	PROC PRIVATE
	DB	243,15,30,250
	mov	r9,QWORD PTR[24+rsi]
	mov	r11,QWORD PTR[56+rsi]
	mov	rbx,QWORD PTR[16+rsi]
	mov	rbp,QWORD PTR[48+rsi]
	mov	r8,QWORD PTR[8+rsi]
	mov	r10,QWORD PTR[40+rsi]

	mov	rax,r9
	or	rax,r11
	cmovz	r9,rbx
	cmovz	r11,rbp
	cmovz	rbx,r8
	mov	r8,QWORD PTR[rsi]
	cmovz	rbp,r10
	mov	r10,QWORD PTR[32+rsi]

	mov	rax,r9
	or	rax,r11
	cmovz	r9,rbx
	cmovz	r11,rbp
	cmovz	rbx,r8
	cmovz	rbp,r10

	mov	rax,r9
	or	rax,r11
	bsr	rcx,rax
	lea	rcx,QWORD PTR[1+rcx]
	cmovz	r9,r8
	cmovz	r11,r10
	cmovz	rcx,rax
	neg	rcx


	shld	r9,rbx,cl
	shld	r11,rbp,cl

	mov	eax,07FFFFFFFh
	and	r8,rax
	and	r10,rax
	not	rax
	and	r9,rax
	and	r11,rax
	or	r8,r9
	or	r10,r11

	jmp	__inner_loop_31_256

	DB	0F3h,0C3h		;repret
__ab_approximation_31_256	ENDP

ALIGN	32
__inner_loop_31_256	PROC PRIVATE
	DB	243,15,30,250
	mov	rcx,07FFFFFFF80000000h
	mov	r13,0800000007FFFFFFFh
	mov	r15,07FFFFFFF7FFFFFFFh

$L$oop_31_256::
	cmp	r8,r10
	mov	rax,r8
	mov	rbx,r10
	mov	rbp,rcx
	mov	r14,r13
	cmovb	r8,r10
	cmovb	r10,rax
	cmovb	rcx,r13
	cmovb	r13,rbp

	sub	r8,r10
	sub	rcx,r13
	add	rcx,r15

	test	rax,1
	cmovz	r8,rax
	cmovz	r10,rbx
	cmovz	rcx,rbp
	cmovz	r13,r14

	shr	r8,1
	add	r13,r13
	sub	r13,r15
	sub	edx,1
	jnz	$L$oop_31_256

	shr	r15,32
	mov	edx,ecx
	mov	r12d,r13d
	shr	rcx,32
	shr	r13,32
	sub	rdx,r15
	sub	rcx,r15
	sub	r12,r15
	sub	r13,r15

	DB	0F3h,0C3h		;repret
__inner_loop_31_256	ENDP


ALIGN	32
__inner_loop_62_256	PROC PRIVATE
	DB	243,15,30,250
	mov	r15d,edx
	mov	rdx,1
	xor	rcx,rcx
	xor	r12,r12
	mov	r13,rdx
	mov	r14,rdx

$L$oop_62_256::
	xor	rax,rax
	test	r8,r14
	mov	rbx,r10
	cmovnz	rax,r10
	sub	rbx,r8
	mov	rbp,r8
	sub	r8,rax
	cmovc	r8,rbx
	cmovc	r10,rbp
	mov	rax,rdx
	cmovc	rdx,r12
	cmovc	r12,rax
	mov	rbx,rcx
	cmovc	rcx,r13
	cmovc	r13,rbx
	xor	rax,rax
	xor	rbx,rbx
	shr	r8,1
	test	rbp,r14
	cmovnz	rax,r12
	cmovnz	rbx,r13
	add	r12,r12
	add	r13,r13
	sub	rdx,rax
	sub	rcx,rbx
	sub	r15d,1
	jnz	$L$oop_62_256

	DB	0F3h,0C3h		;repret
__inner_loop_62_256	ENDP
.text$	ENDS
.pdata	SEGMENT READONLY ALIGN(4)
ALIGN	4
	DD	imagerel $L$SEH_begin_ct_inverse_mod_256
	DD	imagerel $L$SEH_body_ct_inverse_mod_256
	DD	imagerel $L$SEH_info_ct_inverse_mod_256_prologue

	DD	imagerel $L$SEH_body_ct_inverse_mod_256
	DD	imagerel $L$SEH_epilogue_ct_inverse_mod_256
	DD	imagerel $L$SEH_info_ct_inverse_mod_256_body

	DD	imagerel $L$SEH_epilogue_ct_inverse_mod_256
	DD	imagerel $L$SEH_end_ct_inverse_mod_256
	DD	imagerel $L$SEH_info_ct_inverse_mod_256_epilogue

.pdata	ENDS
.xdata	SEGMENT READONLY ALIGN(8)
ALIGN	8
$L$SEH_info_ct_inverse_mod_256_prologue::
DB	1,0,5,00bh
DB	0,074h,1,0
DB	0,064h,2,0
DB	0,003h
DB	0,0
$L$SEH_info_ct_inverse_mod_256_body::
DB	1,0,18,0
DB	000h,0f4h,086h,000h
DB	000h,0e4h,087h,000h
DB	000h,0d4h,088h,000h
DB	000h,0c4h,089h,000h
DB	000h,034h,08ah,000h
DB	000h,054h,08bh,000h
DB	000h,074h,08dh,000h
DB	000h,064h,08eh,000h
DB	000h,001h,08ch,000h
$L$SEH_info_ct_inverse_mod_256_epilogue::
DB	1,0,4,0
DB	000h,074h,001h,000h
DB	000h,064h,002h,000h
DB	000h,000h,000h,000h


.xdata	ENDS
END
