// File: DoubleString[P]eph_converter/src/Com.cpp
// Function: xyzblh(double*, double, double, double, double, double, double, double*)
void xyzblh(double* x, double scale, double a0, double b0, double dx, double dy,
		double dz, double* geod) {
	double a, b;
	long double xp, yp, zp, s, e2, rhd, rbd, n, zps, tmp1, tmp2;
	int i;

	if (a0 == 0 || b0 == 0) {
		a = 6378137.0;
		b = 298.257223563;  //alpha = (a-b)/a
	} else {
		a = a0;
		b = b0;
	}
	for (i = 0; i < 3; i++)
		geod[i] = 0;
	xp = x[0] * scale + dx;
	yp = x[1] * scale + dy;
	zp = x[2] * scale + dz;

	if (b <= 6000000)
		b = a - a / b;
	e2 = (a * a - b * b) / (a * a);
	s = sqrt(xp * xp + yp * yp);
	geod[1] = atan(yp / xp);
	if (geod[1] < 0) {
		if (yp > 0)
			geod[1] += PI;
		if (yp < 0)
			geod[1] += 2 * PI;
	} else {
		if (yp < 0)
			geod[1] += PI;
	}
	zps = zp / s;
	geod[2] = sqrt(xp * xp + yp * yp + zp * zp) - a;
	geod[0] = atan(zps / (1.0 - e2 * a / (a + geod[2])));
	n = 1;
	rhd = rbd = 1;
	while (rbd * n > 1e-4 || rhd > 1e-4) {
		n = a / sqrt(1.0 - e2 * sin(geod[0]) * sin(geod[0]));
		tmp1 = geod[0];
		tmp2 = geod[2];
		geod[2] = s / cos(geod[0]) - n;
		geod[0] = atan(zps / (1.0 - e2 * n / (n + geod[2])));
		rbd = ABS(tmp1 - geod[0]);
		rhd = ABS(tmp2 - geod[2]);
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x1b0, %rsp            # imm = 0x1B0
movq %rdi, -0x8(%rbp)
movsd %xmm0, -0x10(%rbp)
movsd %xmm1, -0x18(%rbp)
movsd %xmm2, -0x20(%rbp)
movsd %xmm3, -0x28(%rbp)
movsd %xmm4, -0x30(%rbp)
movsd %xmm5, -0x38(%rbp)
movq %rsi, -0x40(%rbp)
movsd -0x18(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jne 0x149b3
jp 0x149b3
jmp 0x149c3
movsd -0x20(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jne 0x149df
jp 0x149df
movsd 0x38ed(%rip), %xmm0     # 0x182b8
movsd %xmm0, -0x48(%rbp)
movsd 0x38d8(%rip), %xmm0     # 0x182b0
movsd %xmm0, -0x50(%rbp)
jmp 0x149f3
movsd -0x18(%rbp), %xmm0
movsd %xmm0, -0x48(%rbp)
movsd -0x20(%rbp), %xmm0
movsd %xmm0, -0x50(%rbp)
movl $0x0, -0x104(%rbp)
cmpl $0x3, -0x104(%rbp)
jge 0x14a2a
movq -0x40(%rbp), %rax
movslq -0x104(%rbp), %rcx
xorps %xmm0, %xmm0
movsd %xmm0, (%rax,%rcx,8)
movl -0x104(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x104(%rbp)
jmp 0x149fd
movq -0x8(%rbp), %rax
movsd (%rax), %xmm0
movsd -0x10(%rbp), %xmm2
movsd -0x28(%rbp), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x110(%rbp)
fldl -0x110(%rbp)
fstpt -0x60(%rbp)
movq -0x8(%rbp), %rax
movsd 0x8(%rax), %xmm0
movsd -0x10(%rbp), %xmm2
movsd -0x30(%rbp), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x118(%rbp)
fldl -0x118(%rbp)
fstpt -0x70(%rbp)
movq -0x8(%rbp), %rax
movsd 0x10(%rax), %xmm0
movsd -0x10(%rbp), %xmm2
movsd -0x38(%rbp), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x120(%rbp)
fldl -0x120(%rbp)
fstpt -0x80(%rbp)
movsd 0x380b(%rip), %xmm0     # 0x182c0
ucomisd -0x50(%rbp), %xmm0
jb 0x14ad4
movsd -0x48(%rbp), %xmm0
movsd -0x48(%rbp), %xmm1
divsd -0x50(%rbp), %xmm1
subsd %xmm1, %xmm0
movsd %xmm0, -0x50(%rbp)
movsd -0x48(%rbp), %xmm1
movsd -0x50(%rbp), %xmm2
mulsd %xmm2, %xmm2
mulsd %xmm1, %xmm1
movaps %xmm1, %xmm0
subsd %xmm2, %xmm0
divsd %xmm1, %xmm0
movsd %xmm0, -0x128(%rbp)
fldl -0x128(%rbp)
fstpt -0xa0(%rbp)
fldt -0x60(%rbp)
fldt -0x70(%rbp)
fmul %st, %st(0)
fxch %st(1)
fmul %st, %st(0)
faddp %st, %st(1)
movq %rsp, %rax
fstpt (%rax)
callq 0x166b0
fstpt -0x90(%rbp)
fldt -0x70(%rbp)
fldt -0x60(%rbp)
fdivrp %st, %st(1)
movq %rsp, %rax
fstpt (%rax)
callq 0x166e0
fstpl -0x130(%rbp)
movsd -0x130(%rbp), %xmm0
movq -0x40(%rbp), %rax
movsd %xmm0, 0x8(%rax)
movq -0x40(%rbp), %rax
xorps %xmm0, %xmm0
ucomisd 0x8(%rax), %xmm0
jbe 0x14ba4
fldt -0x70(%rbp)
fldz
fxch %st(1)
fucompi %st(1), %st
fstp %st(0)
jbe 0x14b7f
jmp 0x14b69
movq -0x40(%rbp), %rax
movsd 0x31cb(%rip), %xmm0     # 0x17d40
addsd 0x8(%rax), %xmm0
movsd %xmm0, 0x8(%rax)
fldt -0x70(%rbp)
fldz
fucompi %st(1), %st
fstp %st(0)
jbe 0x14ba2
jmp 0x14b8c
movq -0x40(%rbp), %rax
movsd 0x31b0(%rip), %xmm0     # 0x17d48
addsd 0x8(%rax), %xmm0
movsd %xmm0, 0x8(%rax)
jmp 0x14bc9
fldt -0x70(%rbp)
fldz
fucompi %st(1), %st
fstp %st(0)
jbe 0x14bc7
jmp 0x14bb1
movq -0x40(%rbp), %rax
movsd 0x3183(%rip), %xmm0     # 0x17d40
addsd 0x8(%rax), %xmm0
movsd %xmm0, 0x8(%rax)
jmp 0x14bc9
fldt -0x80(%rbp)
fldt -0x90(%rbp)
fdivrp %st, %st(1)
fstpt -0xe0(%rbp)
fldt -0x60(%rbp)
fldt -0x70(%rbp)
fmul %st, %st(0)
fxch %st(1)
fmul %st, %st(0)
faddp %st, %st(1)
fldt -0x80(%rbp)
fmul %st, %st(0)
faddp %st, %st(1)
movq %rsp, %rax
fstpt (%rax)
callq 0x166b0
fldl -0x48(%rbp)
fsubrp %st, %st(1)
movq -0x40(%rbp), %rax
fstpl 0x10(%rax)
fldt -0xe0(%rbp)
fldt -0xa0(%rbp)
movsd -0x48(%rbp), %xmm0
movsd %xmm0, -0x138(%rbp)
fldl -0x138(%rbp)
fmulp %st, %st(1)
movq -0x40(%rbp), %rax
movsd 0x10(%rax), %xmm1
addsd %xmm1, %xmm0
movsd %xmm0, -0x140(%rbp)
fldl -0x140(%rbp)
fdivrp %st, %st(1)
fld1
fld %st(0)
fstpt -0x164(%rbp)
fsubp %st, %st(1)
fdivrp %st, %st(1)
movq %rsp, %rax
fstpt (%rax)
callq 0x166e0
fldt -0x164(%rbp)
movq -0x40(%rbp), %rax
fxch %st(1)
fstpl (%rax)
fld %st(0)
fstpt -0xd0(%rbp)
fld %st(0)
fstpt -0xc0(%rbp)
fstpt -0xb0(%rbp)
fldt -0xc0(%rbp)
fldt -0xd0(%rbp)
fmulp %st, %st(1)
movb $0x1, %al
fldl 0x3633(%rip)            # 0x182c8
fxch %st(1)
fucompi %st(1), %st
fstp %st(0)
movb %al, -0x165(%rbp)
ja 0x14cc0
jmp 0x14ca5
fldt -0xb0(%rbp)
fldl 0x3617(%rip)            # 0x182c8
fxch %st(1)
fucompi %st(1), %st
fstp %st(0)
seta %al
movb %al, -0x165(%rbp)
movb -0x165(%rbp), %al
testb $0x1, %al
jne 0x14ccf
jmp 0x14e28
fldl -0x48(%rbp)
fstpt -0x188(%rbp)
fldt -0xa0(%rbp)
fstpt -0x1a0(%rbp)
movq -0x40(%rbp), %rax
movsd (%rax), %xmm0
callq 0x30b0
fldt -0x1a0(%rbp)
movsd %xmm0, -0x148(%rbp)
fldl -0x148(%rbp)
fmulp %st, %st(1)
fstpt -0x194(%rbp)
movq -0x40(%rbp), %rax
movsd (%rax), %xmm0
callq 0x30b0
fldt -0x194(%rbp)
movsd %xmm0, -0x150(%rbp)
fldl -0x150(%rbp)
fmulp %st, %st(1)
fld1
fld %st(0)
fstpt -0x170(%rbp)
fsubp %st, %st(1)
movq %rsp, %rax
fstpt (%rax)
callq 0x166b0
fldt -0x188(%rbp)
fdivp %st, %st(1)
fstpt -0xd0(%rbp)
movq -0x40(%rbp), %rax
fldl (%rax)
fstpt -0xf0(%rbp)
movq -0x40(%rbp), %rax
fldl 0x10(%rax)
fstpt -0x100(%rbp)
fldt -0x90(%rbp)
fstpt -0x17c(%rbp)
movq -0x40(%rbp), %rax
movsd (%rax), %xmm0
callq 0x3500
fldt -0x17c(%rbp)
fldt -0x170(%rbp)
movsd %xmm0, -0x158(%rbp)
fldl -0x158(%rbp)
fdivrp %st, %st(2)
fldt -0xd0(%rbp)
fsubrp %st, %st(2)
movq -0x40(%rbp), %rax
fxch %st(1)
fstpl 0x10(%rax)
fldt -0xe0(%rbp)
fldt -0xa0(%rbp)
fldt -0xd0(%rbp)
fmul %st, %st(1)
movq -0x40(%rbp), %rax
fldl 0x10(%rax)
faddp %st, %st(1)
fdivrp %st, %st(1)
fsubrp %st, %st(2)
fdivp %st, %st(1)
movq %rsp, %rax
fstpt (%rax)
callq 0x166e0
movq -0x40(%rbp), %rax
fstpl (%rax)
fldt -0xf0(%rbp)
movq -0x40(%rbp), %rax
fldl (%rax)
fsubrp %st, %st(1)
movq %rsp, %rax
fstpt (%rax)
callq 0x16710
fstpt -0xc0(%rbp)
fldt -0x100(%rbp)
movq -0x40(%rbp), %rax
fldl 0x10(%rax)
fsubrp %st, %st(1)
movq %rsp, %rax
fstpt (%rax)
callq 0x16710
fstpt -0xb0(%rbp)
jmp 0x14c7f
addq $0x1b0, %rsp            # imm = 0x1B0
popq %rbp
retq
nopw %cs:(%rax,%rax)