// File: DoubleString[P]RtConverter/src/Rtklib/rtkcmn.cpp
// Function: bamboo::dops(int, double const*, double, double*)
extern void dops(int ns, const double *azel, double elmin, double *dop)
{
    double H[4*MAXRTKSAT],Q[16],cosel,sinel;
    int i,n;
    
    for (i=0;i<4;i++) dop[i]=0.0;
    for (i=n=0;i<ns&&i<MAXRTKSAT;i++) {
        if (azel[1+i*2]<elmin||azel[1+i*2]<=0.0) continue;
        cosel=cos(azel[1+i*2]);
        sinel=sin(azel[1+i*2]);
        H[  4*n]=cosel*sin(azel[i*2]);
        H[1+4*n]=cosel*cos(azel[i*2]);
        H[2+4*n]=sinel;
        H[3+4*n++]=1.0;
    }
    if (n<4) return;
    
    matmul("NT",4,4,n,1.0,H,H,0.0,Q);
    if (!matinv(Q,4)) {
        dop[0]=SQRT(Q[0]+Q[5]+Q[10]+Q[15]); /* GDOP */
        dop[1]=SQRT(Q[0]+Q[5]+Q[10]);       /* PDOP */
        dop[2]=SQRT(Q[0]+Q[5]);             /* HDOP */
        dop[3]=SQRT(Q[10]);                 /* VDOP */
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x1460, %rsp           # imm = 0x1460
movl %edi, -0x4(%rbp)
movq %rsi, -0x10(%rbp)
movsd %xmm0, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movl $0x0, -0x1414(%rbp)
cmpl $0x4, -0x1414(%rbp)
jge 0x96d02
movq -0x20(%rbp), %rax
movslq -0x1414(%rbp), %rcx
xorps %xmm0, %xmm0
movsd %xmm0, (%rax,%rcx,8)
movl -0x1414(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x1414(%rbp)
jmp 0x96cd5
movl $0x0, -0x1418(%rbp)
movl $0x0, -0x1414(%rbp)
movl -0x1414(%rbp), %ecx
xorl %eax, %eax
cmpl -0x4(%rbp), %ecx
movb %al, -0x1419(%rbp)
jge 0x96d3c
cmpl $0x9b, -0x1414(%rbp)
setl %al
movb %al, -0x1419(%rbp)
movb -0x1419(%rbp), %al
testb $0x1, %al
jne 0x96d4b
jmp 0x96ece
movq -0x10(%rbp), %rax
movl -0x1414(%rbp), %ecx
shll %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
movsd (%rax,%rcx,8), %xmm1
movsd -0x18(%rbp), %xmm0
ucomisd %xmm1, %xmm0
ja 0x96d89
movq -0x10(%rbp), %rax
movl -0x1414(%rbp), %ecx
shll %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
xorps %xmm0, %xmm0
ucomisd (%rax,%rcx,8), %xmm0
jb 0x96d8e
jmp 0x96eba
movq -0x10(%rbp), %rax
movl -0x1414(%rbp), %ecx
shll %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
movsd (%rax,%rcx,8), %xmm0
callq 0x9e00
movsd %xmm0, -0x1408(%rbp)
movq -0x10(%rbp), %rax
movl -0x1414(%rbp), %ecx
shll %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
movsd (%rax,%rcx,8), %xmm0
callq 0x91a0
movsd %xmm0, -0x1410(%rbp)
movsd -0x1408(%rbp), %xmm0
movsd %xmm0, -0x1430(%rbp)
movq -0x10(%rbp), %rax
movl -0x1414(%rbp), %ecx
shll %ecx
movslq %ecx, %rcx
movsd (%rax,%rcx,8), %xmm0
callq 0x91a0
movaps %xmm0, %xmm1
movsd -0x1430(%rbp), %xmm0
mulsd %xmm1, %xmm0
movl -0x1418(%rbp), %eax
shll $0x2, %eax
cltq
movsd %xmm0, -0x1380(%rbp,%rax,8)
movsd -0x1408(%rbp), %xmm0
movsd %xmm0, -0x1428(%rbp)
movq -0x10(%rbp), %rax
movl -0x1414(%rbp), %ecx
shll %ecx
movslq %ecx, %rcx
movsd (%rax,%rcx,8), %xmm0
callq 0x9e00
movaps %xmm0, %xmm1
movsd -0x1428(%rbp), %xmm0
mulsd %xmm1, %xmm0
movl -0x1418(%rbp), %eax
shll $0x2, %eax
addl $0x1, %eax
cltq
movsd %xmm0, -0x1380(%rbp,%rax,8)
movsd -0x1410(%rbp), %xmm0
movl -0x1418(%rbp), %eax
shll $0x2, %eax
addl $0x2, %eax
cltq
movsd %xmm0, -0x1380(%rbp,%rax,8)
movl -0x1418(%rbp), %eax
movl %eax, %ecx
addl $0x1, %ecx
movl %ecx, -0x1418(%rbp)
shll $0x2, %eax
addl $0x3, %eax
cltq
movsd 0x24faf(%rip), %xmm0    # 0xbbe60
movsd %xmm0, -0x1380(%rbp,%rax,8)
movl -0x1414(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x1414(%rbp)
jmp 0x96d16
cmpl $0x4, -0x1418(%rbp)
jge 0x96edc
jmp 0x97162
movl -0x1418(%rbp), %ecx
leaq -0x1380(%rbp), %r8
leaq -0x1380(%rbp), %r9
leaq -0x1400(%rbp), %rax
leaq 0x348ed(%rip), %rdi     # 0xcb7eb
movl $0x4, %edx
movsd 0x24f55(%rip), %xmm0    # 0xbbe60
xorps %xmm1, %xmm1
movl %edx, %esi
movq %rax, (%rsp)
callq 0x8ca20
leaq -0x1400(%rbp), %rdi
movl $0x4, %esi
callq 0x8cd10
cmpl $0x0, %eax
jne 0x97162
movsd -0x1400(%rbp), %xmm1
addsd -0x13d8(%rbp), %xmm1
addsd -0x13b0(%rbp), %xmm1
addsd -0x1388(%rbp), %xmm1
xorps %xmm0, %xmm0
ucomisd %xmm1, %xmm0
ja 0x96fa6
movsd -0x1400(%rbp), %xmm0
addsd -0x13d8(%rbp), %xmm0
addsd -0x13b0(%rbp), %xmm0
addsd -0x1388(%rbp), %xmm0
movsd -0x1400(%rbp), %xmm1
addsd -0x13d8(%rbp), %xmm1
addsd -0x13b0(%rbp), %xmm1
addsd -0x1388(%rbp), %xmm1
ucomisd %xmm1, %xmm0
jne 0x96fa6
jp 0x96fa6
jmp 0x96fb3
xorps %xmm0, %xmm0
movsd %xmm0, -0x1438(%rbp)
jmp 0x96fe0
movsd -0x1400(%rbp), %xmm0
addsd -0x13d8(%rbp), %xmm0
addsd -0x13b0(%rbp), %xmm0
addsd -0x1388(%rbp), %xmm0
callq 0x95e0
movsd %xmm0, -0x1438(%rbp)
movsd -0x1438(%rbp), %xmm0
movq -0x20(%rbp), %rax
movsd %xmm0, (%rax)
movsd -0x1400(%rbp), %xmm1
addsd -0x13d8(%rbp), %xmm1
addsd -0x13b0(%rbp), %xmm1
xorps %xmm0, %xmm0
ucomisd %xmm1, %xmm0
ja 0x9704b
movsd -0x1400(%rbp), %xmm0
addsd -0x13d8(%rbp), %xmm0
addsd -0x13b0(%rbp), %xmm0
movsd -0x1400(%rbp), %xmm1
addsd -0x13d8(%rbp), %xmm1
addsd -0x13b0(%rbp), %xmm1
ucomisd %xmm1, %xmm0
jne 0x9704b
jp 0x9704b
jmp 0x97058
xorps %xmm0, %xmm0
movsd %xmm0, -0x1440(%rbp)
jmp 0x9707d
movsd -0x1400(%rbp), %xmm0
addsd -0x13d8(%rbp), %xmm0
addsd -0x13b0(%rbp), %xmm0
callq 0x95e0
movsd %xmm0, -0x1440(%rbp)
movsd -0x1440(%rbp), %xmm0
movq -0x20(%rbp), %rax
movsd %xmm0, 0x8(%rax)
movsd -0x1400(%rbp), %xmm1
addsd -0x13d8(%rbp), %xmm1
xorps %xmm0, %xmm0
ucomisd %xmm1, %xmm0
ja 0x970d1
movsd -0x1400(%rbp), %xmm0
addsd -0x13d8(%rbp), %xmm0
movsd -0x1400(%rbp), %xmm1
addsd -0x13d8(%rbp), %xmm1
ucomisd %xmm1, %xmm0
jne 0x970d1
jp 0x970d1
jmp 0x970de
xorps %xmm0, %xmm0
movsd %xmm0, -0x1448(%rbp)
jmp 0x970fb
movsd -0x1400(%rbp), %xmm0
addsd -0x13d8(%rbp), %xmm0
callq 0x95e0
movsd %xmm0, -0x1448(%rbp)
movsd -0x1448(%rbp), %xmm0
movq -0x20(%rbp), %rax
movsd %xmm0, 0x10(%rax)
xorps %xmm0, %xmm0
ucomisd -0x13b0(%rbp), %xmm0
ja 0x9712f
movsd -0x13b0(%rbp), %xmm0
ucomisd -0x13b0(%rbp), %xmm0
jne 0x9712f
jp 0x9712f
jmp 0x9713c
xorps %xmm0, %xmm0
movsd %xmm0, -0x1450(%rbp)
jmp 0x97151
movsd -0x13b0(%rbp), %xmm0
callq 0x95e0
movsd %xmm0, -0x1450(%rbp)
movsd -0x1450(%rbp), %xmm0
movq -0x20(%rbp), %rax
movsd %xmm0, 0x18(%rax)
addq $0x1460, %rsp           # imm = 0x1460
popq %rbp
retq
nopl (%rax,%rax)