// File: /workspace/github_c_makefile_star2_O1/georgeweigt[P]eigenmath/eigenmath.c
// Function: nfindroot
void
nfindroot(double cr[], double ci[], int n, double *par, double *pai)
{
	int i, j;
	double d;
	double ar, br, dfr, dxr, far, fbr, xr, yr;
	double ai, bi, dfi, dxi, fai, fbi, xi, yi;

	// if const term is zero then root is zero

	// note: use exact zero, not "close to zero"

	// term will be exactly zero from coeffs(), no need for arbitrary cutoff

	if (cr[0] == 0.0 && ci[0] == 0.0) {
		*par = 0.0;
		*pai = 0.0;
		return;
	}

	// secant method

	for (i = 0; i < 100; i++) {

		ar = urandom();
		ai = urandom();

		fata(cr, ci, n, ar, ai, &far, &fai);

		br = ar;
		bi = ai;

		fbr = far;
		fbi = fai;

		ar = urandom();
		ai = urandom();

		for (j = 0; j < 1000; j++) {

			fata(cr, ci, n, ar, ai, &far, &fai);

			if (zabs(far, fai) < EPSILON) {
				*par = ar;
				*pai = ai;
				return;
			}

			if (zabs(far, fai) < zabs(fbr, fbi)) {

				xr = ar;
				xi = ai;

				ar = br;
				ai = bi;

				br = xr;
				bi = xi;

				xr = far;
				xi = fai;

				far = fbr;
				fai = fbi;

				fbr = xr;
				fbi = xi;
			}

			// dx = b - a

			dxr = br - ar;
			dxi = bi - ai;

			// df = fb - fa

			dfr = fbr - far;
			dfi = fbi - fai;

			// y = dx / df

			d = dfr * dfr + dfi * dfi;

			if (d == 0.0)
				break;

			yr = (dxr * dfr + dxi * dfi) / d;
			yi = (dxi * dfr - dxr * dfi) / d;

			// a = b - y * fb

			ar = br - (yr * fbr - yi * fbi);
			ai = bi - (yr * fbi + yi * fbr);
		}
	}

	stopf("nroots: convergence error");
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x68, %rsp
movl %edx, %r15d
movq %rsi, %r12
movq %rdi, %r13
movsd (%rdi), %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jne 0x19659
jp 0x19659
movsd (%r12), %xmm0
ucomisd %xmm1, %xmm0
jne 0x19659
jp 0x19659
xorpd %xmm4, %xmm4
jmp 0x19a2c
movq %rcx, -0x88(%rbp)
movq %r8, -0x90(%rbp)
leal -0x1(%r15), %eax
movslq %eax, %r14
leal -0x2(%r15), %eax
incq %rax
movq %rax, -0x70(%rbp)
movl $0x0, -0x44(%rbp)
callq 0x7390
movl %eax, %ebx
callq 0x7390
xorps %xmm5, %xmm5
cvtsi2sd %ebx, %xmm5
movsd 0xcaa5(%rip), %xmm1     # 0x26140
divsd %xmm1, %xmm5
movsd 0xcaa9(%rip), %xmm3     # 0x26150
mulsd %xmm3, %xmm5
movsd 0xcaa5(%rip), %xmm0     # 0x26158
addsd %xmm0, %xmm5
xorps %xmm2, %xmm2
cvtsi2sd %eax, %xmm2
divsd %xmm1, %xmm2
mulsd %xmm3, %xmm2
addsd %xmm0, %xmm2
movsd (%r13,%r14,8), %xmm0
movsd (%r12,%r14,8), %xmm3
cmpl $0x2, %r15d
jl 0x1971a
movq -0x70(%rbp), %rax
movapd %xmm2, %xmm1
mulsd %xmm3, %xmm1
movapd %xmm5, %xmm4
mulsd %xmm0, %xmm4
subsd %xmm1, %xmm4
mulsd %xmm2, %xmm0
mulsd %xmm5, %xmm3
addsd %xmm0, %xmm3
addsd -0x8(%r13,%rax,8), %xmm4
addsd -0x8(%r12,%rax,8), %xmm3
movapd %xmm4, %xmm0
decq %rax
jg 0x196e1
jmp 0x1971e
movapd %xmm0, %xmm4
movsd %xmm4, -0x30(%rbp)
movsd %xmm3, -0x38(%rbp)
movsd %xmm2, -0x58(%rbp)
movsd %xmm5, -0x50(%rbp)
callq 0x7390
xorps %xmm1, %xmm1
cvtsi2sd %eax, %xmm1
movsd 0xc9fa(%rip), %xmm0     # 0x26140
divsd %xmm0, %xmm1
movsd 0xc9fe(%rip), %xmm0     # 0x26150
mulsd %xmm0, %xmm1
movsd 0xc9fa(%rip), %xmm0     # 0x26158
addsd %xmm0, %xmm1
movsd %xmm1, -0x40(%rbp)
callq 0x7390
movsd -0x40(%rbp), %xmm3
movsd -0x50(%rbp), %xmm2
movsd -0x30(%rbp), %xmm10
movsd -0x38(%rbp), %xmm9
movsd -0x58(%rbp), %xmm8
xorps %xmm4, %xmm4
cvtsi2sd %eax, %xmm4
divsd 0xc9a9(%rip), %xmm4     # 0x26140
mulsd 0xc9b1(%rip), %xmm4     # 0x26150
addsd 0xc9b1(%rip), %xmm4     # 0x26158
xorl %ebx, %ebx
xorpd %xmm7, %xmm7
movsd (%r13,%r14,8), %xmm0
movsd (%r12,%r14,8), %xmm5
cmpl $0x2, %r15d
jl 0x197fd
movq -0x70(%rbp), %rax
movapd %xmm4, %xmm1
mulsd %xmm5, %xmm1
movapd %xmm3, %xmm6
mulsd %xmm0, %xmm6
subsd %xmm1, %xmm6
mulsd %xmm4, %xmm0
mulsd %xmm3, %xmm5
addsd %xmm0, %xmm5
addsd -0x8(%r13,%rax,8), %xmm6
addsd -0x8(%r12,%rax,8), %xmm5
movapd %xmm6, %xmm0
decq %rax
jg 0x197c4
jmp 0x19801
movapd %xmm0, %xmm6
movapd %xmm5, %xmm0
mulsd %xmm5, %xmm0
movapd %xmm6, %xmm11
mulsd %xmm6, %xmm11
addsd %xmm0, %xmm11
ucomisd %xmm7, %xmm11
movsd %xmm9, -0x38(%rbp)
movsd %xmm10, -0x30(%rbp)
movsd %xmm8, -0x58(%rbp)
movsd %xmm2, -0x50(%rbp)
movsd %xmm3, -0x40(%rbp)
movsd %xmm4, -0x68(%rbp)
movsd %xmm5, -0x80(%rbp)
movsd %xmm6, -0x78(%rbp)
jb 0x19854
xorps %xmm0, %xmm0
sqrtsd %xmm11, %xmm0
jmp 0x19878
movapd %xmm11, %xmm0
movsd %xmm11, -0x60(%rbp)
callq 0x7350
movsd -0x60(%rbp), %xmm11
movsd -0x68(%rbp), %xmm4
movsd -0x40(%rbp), %xmm3
xorpd %xmm7, %xmm7
movsd 0xc8e0(%rip), %xmm1     # 0x26160
ucomisd %xmm0, %xmm1
ja 0x19a1a
ucomisd %xmm7, %xmm11
jb 0x1989b
xorps %xmm2, %xmm2
sqrtsd %xmm11, %xmm2
jmp 0x198ad
movapd %xmm11, %xmm0
callq 0x7350
xorpd %xmm7, %xmm7
movapd %xmm0, %xmm2
movsd -0x38(%rbp), %xmm9
movsd -0x30(%rbp), %xmm10
movapd %xmm9, %xmm1
mulsd %xmm9, %xmm1
movapd %xmm10, %xmm0
mulsd %xmm10, %xmm0
addsd %xmm1, %xmm0
ucomisd %xmm7, %xmm0
jb 0x198dd
sqrtsd %xmm0, %xmm0
jmp 0x198fc
movsd %xmm2, -0x60(%rbp)
callq 0x7350
movsd -0x60(%rbp), %xmm2
movsd -0x30(%rbp), %xmm10
movsd -0x38(%rbp), %xmm9
xorpd %xmm7, %xmm7
movsd -0x58(%rbp), %xmm8
movsd -0x50(%rbp), %xmm6
movsd -0x40(%rbp), %xmm3
movsd -0x68(%rbp), %xmm4
ucomisd %xmm2, %xmm0
jbe 0x1993d
movapd %xmm10, %xmm2
movapd %xmm9, %xmm5
movsd -0x78(%rbp), %xmm10
movapd %xmm8, %xmm1
movapd %xmm4, %xmm8
movapd %xmm3, %xmm0
movsd -0x80(%rbp), %xmm9
jmp 0x19953
movsd -0x78(%rbp), %xmm2
movsd -0x80(%rbp), %xmm5
movapd %xmm4, %xmm1
movapd %xmm6, %xmm0
movapd %xmm3, %xmm6
movapd %xmm10, %xmm3
subsd %xmm2, %xmm3
movapd %xmm9, %xmm4
subsd %xmm5, %xmm4
movapd %xmm4, %xmm2
mulsd %xmm4, %xmm2
movapd %xmm3, %xmm5
mulsd %xmm3, %xmm5
addsd %xmm2, %xmm5
ucomisd %xmm7, %xmm5
jne 0x19981
jnp 0x199fd
movapd %xmm8, %xmm2
subsd %xmm1, %xmm2
movapd %xmm0, %xmm1
subsd %xmm6, %xmm1
movapd %xmm2, %xmm6
mulsd %xmm4, %xmm6
mulsd %xmm1, %xmm4
mulsd %xmm3, %xmm1
addsd %xmm6, %xmm1
divsd %xmm5, %xmm1
mulsd %xmm3, %xmm2
subsd %xmm4, %xmm2
divsd %xmm5, %xmm2
movapd %xmm9, %xmm3
mulsd %xmm2, %xmm3
movapd %xmm1, %xmm4
mulsd %xmm10, %xmm4
subsd %xmm3, %xmm4
movapd %xmm0, %xmm3
subsd %xmm4, %xmm3
mulsd %xmm10, %xmm2
mulsd %xmm9, %xmm1
addsd %xmm2, %xmm1
movapd %xmm8, %xmm4
subsd %xmm1, %xmm4
incl %ebx
movapd %xmm0, %xmm2
cmpl $0x3e8, %ebx            # imm = 0x3E8
jne 0x197ad
movl -0x44(%rbp), %eax
incl %eax
movl %eax, -0x44(%rbp)
cmpl $0x64, %eax
jne 0x19680
leaq 0x10e9d(%rip), %rdi     # 0x2a8b2
callq 0x77c8
movapd %xmm3, %xmm1
movq -0x90(%rbp), %r8
movq -0x88(%rbp), %rcx
movsd %xmm1, (%rcx)
movsd %xmm4, (%r8)
addq $0x68, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq