// File: DoubleString[P]RtConverter/src/Rtklib/lambda.cpp
// Function: bamboo::search(int, int, double const*, double const*, double const*, double*, double*)
static int search(int n, int m, const double *L, const double *D,
                  const double *zs, double *zn, double *s)
{
    int i,j,k,c,nn=0,imax=0;
    double newdist,maxdist=1E99,y;
    double *S=zeros(n,n),*dist=mat(n,1),*zb=mat(n,1),*z=mat(n,1),*step=mat(n,1);
    
    k=n-1; dist[k]=0.0;
    zb[k]=zs[k];
    z[k]=ROUND(zb[k]); y=zb[k]-z[k]; step[k]=SGN(y);
    for (c=0;c<LOOPMAX;c++) {
        newdist=dist[k]+y*y/D[k];
        if (newdist<maxdist) {
            if (k!=0) {
                dist[--k]=newdist;
                for (i=0;i<=k;i++)
                    S[k+i*n]=S[k+1+i*n]+(z[k+1]-zb[k+1])*L[k+1+i*n];
                zb[k]=zs[k]+S[k+k*n];
                z[k]=ROUND(zb[k]); y=zb[k]-z[k]; step[k]=SGN(y);
            }
            else {
                if (nn<m) {
                    if (nn==0||newdist>s[imax]) imax=nn;
                    for (i=0;i<n;i++) zn[i+nn*n]=z[i];
                    s[nn++]=newdist;
                }
                else {
                    if (newdist<s[imax]) {
                        for (i=0;i<n;i++) zn[i+imax*n]=z[i];
                        s[imax]=newdist;
                        for (i=imax=0;i<m;i++) if (s[imax]<s[i]) imax=i;
                    }
                    maxdist=s[imax];
                }
                z[0]+=step[0]; y=zb[0]-z[0]; step[0]=-step[0]-SGN(step[0]);
            }
        }
        else {
            if (k==n-1) break;
            else {
                k++;
                z[k]+=step[k]; y=zb[k]-z[k]; step[k]=-step[k]-SGN(step[k]);
            }
        }
    }
    for (i=0;i<m-1;i++) { /* sort by s */
        for (j=i+1;j<m;j++) {
            if (s[i]<s[j]) continue;
            SWAP(s[i],s[j]);
            for (k=0;k<n;k++) SWAP(zn[k+i*n],zn[k+j*n]);
        }
    }
    free(S); free(dist); free(zb); free(z); free(step);
    
    if (c>=LOOPMAX) {
        fprintf(stderr,"%s : search loop count overflow\n",__FILE__);
        return -1;
    }
    return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xa0, %rsp
movq 0x10(%rbp), %rax
movl %edi, -0x8(%rbp)
movl %esi, -0xc(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq %r8, -0x28(%rbp)
movq %r9, -0x30(%rbp)
movl $0x0, -0x44(%rbp)
movl $0x0, -0x48(%rbp)
movsd 0x5d555(%rip), %xmm0    # 0xbede0
movsd %xmm0, -0x58(%rbp)
movl -0x8(%rbp), %edi
movl -0x8(%rbp), %esi
callq 0x8c6e0
movq %rax, -0x68(%rbp)
movl -0x8(%rbp), %edi
movl $0x1, %esi
callq 0x8c500
movq %rax, -0x70(%rbp)
movl -0x8(%rbp), %edi
movl $0x1, %esi
callq 0x8c500
movq %rax, -0x78(%rbp)
movl -0x8(%rbp), %edi
movl $0x1, %esi
callq 0x8c500
movq %rax, -0x80(%rbp)
movl -0x8(%rbp), %edi
movl $0x1, %esi
callq 0x8c500
movq %rax, -0x88(%rbp)
movl -0x8(%rbp), %eax
subl $0x1, %eax
movl %eax, -0x3c(%rbp)
movq -0x70(%rbp), %rax
movslq -0x3c(%rbp), %rcx
xorps %xmm0, %xmm0
movsd %xmm0, (%rax,%rcx,8)
movq -0x28(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
movq -0x78(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movsd %xmm0, (%rax,%rcx,8)
movq -0x78(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movsd 0x5b557(%rip), %xmm0    # 0xbce80
addsd (%rax,%rcx,8), %xmm0
callq 0x9c90
movq -0x80(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movsd %xmm0, (%rax,%rcx,8)
movq -0x78(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
movq -0x80(%rbp), %rax
movslq -0x3c(%rbp), %rcx
subsd (%rax,%rcx,8), %xmm0
movsd %xmm0, -0x60(%rbp)
movsd -0x60(%rbp), %xmm0
movsd 0x5d46c(%rip), %xmm3    # 0xbedd8
movsd 0x5a4ec(%rip), %xmm2    # 0xbbe60
xorps %xmm1, %xmm1
cmplesd %xmm1, %xmm0
movaps %xmm0, %xmm1
andpd %xmm3, %xmm1
andnpd %xmm2, %xmm0
orpd %xmm1, %xmm0
movq -0x88(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movsd %xmm0, (%rax,%rcx,8)
movl $0x0, -0x40(%rbp)
cmpl $0x2710, -0x40(%rbp)    # imm = 0x2710
jge 0x61e32
movq -0x70(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
movsd -0x60(%rbp), %xmm1
mulsd -0x60(%rbp), %xmm1
movq -0x20(%rbp), %rax
movslq -0x3c(%rbp), %rcx
divsd (%rax,%rcx,8), %xmm1
addsd %xmm1, %xmm0
movsd %xmm0, -0x50(%rbp)
movsd -0x50(%rbp), %xmm1
movsd -0x58(%rbp), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x61d52
cmpl $0x0, -0x3c(%rbp)
je 0x61b68
movsd -0x50(%rbp), %xmm0
movq -0x70(%rbp), %rax
movl -0x3c(%rbp), %ecx
addl $-0x1, %ecx
movl %ecx, -0x3c(%rbp)
movslq %ecx, %rcx
movsd %xmm0, (%rax,%rcx,8)
movl $0x0, -0x34(%rbp)
movl -0x34(%rbp), %eax
cmpl -0x3c(%rbp), %eax
jg 0x61aaf
movq -0x68(%rbp), %rax
movl -0x3c(%rbp), %ecx
addl $0x1, %ecx
movl -0x34(%rbp), %edx
imull -0x8(%rbp), %edx
addl %edx, %ecx
movslq %ecx, %rcx
movsd (%rax,%rcx,8), %xmm1
movq -0x80(%rbp), %rax
movl -0x3c(%rbp), %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
movsd (%rax,%rcx,8), %xmm0
movq -0x78(%rbp), %rax
movl -0x3c(%rbp), %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
subsd (%rax,%rcx,8), %xmm0
movq -0x18(%rbp), %rax
movl -0x3c(%rbp), %ecx
addl $0x1, %ecx
movl -0x34(%rbp), %edx
imull -0x8(%rbp), %edx
addl %edx, %ecx
movslq %ecx, %rcx
movsd (%rax,%rcx,8), %xmm2
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movq -0x68(%rbp), %rax
movl -0x3c(%rbp), %ecx
movl -0x34(%rbp), %edx
imull -0x8(%rbp), %edx
addl %edx, %ecx
movslq %ecx, %rcx
movsd %xmm0, (%rax,%rcx,8)
movl -0x34(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x34(%rbp)
jmp 0x61a1b
movq -0x28(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
movq -0x68(%rbp), %rax
movl -0x3c(%rbp), %ecx
movl -0x3c(%rbp), %edx
imull -0x8(%rbp), %edx
addl %edx, %ecx
movslq %ecx, %rcx
addsd (%rax,%rcx,8), %xmm0
movq -0x78(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movsd %xmm0, (%rax,%rcx,8)
movq -0x78(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movsd 0x5b38f(%rip), %xmm0    # 0xbce80
addsd (%rax,%rcx,8), %xmm0
callq 0x9c90
movq -0x80(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movsd %xmm0, (%rax,%rcx,8)
movq -0x78(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
movq -0x80(%rbp), %rax
movslq -0x3c(%rbp), %rcx
subsd (%rax,%rcx,8), %xmm0
movsd %xmm0, -0x60(%rbp)
movsd -0x60(%rbp), %xmm0
movsd 0x5d2a4(%rip), %xmm3    # 0xbedd8
movsd 0x5a324(%rip), %xmm2    # 0xbbe60
xorps %xmm1, %xmm1
cmplesd %xmm1, %xmm0
movaps %xmm0, %xmm1
andpd %xmm3, %xmm1
andnpd %xmm2, %xmm0
orpd %xmm1, %xmm0
movq -0x88(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movsd %xmm0, (%rax,%rcx,8)
jmp 0x61d4d
movl -0x44(%rbp), %eax
cmpl -0xc(%rbp), %eax
jge 0x61bf4
cmpl $0x0, -0x44(%rbp)
je 0x61b8e
movsd -0x50(%rbp), %xmm0
movq 0x10(%rbp), %rax
movslq -0x48(%rbp), %rcx
ucomisd (%rax,%rcx,8), %xmm0
jbe 0x61b94
movl -0x44(%rbp), %eax
movl %eax, -0x48(%rbp)
movl $0x0, -0x34(%rbp)
movl -0x34(%rbp), %eax
cmpl -0x8(%rbp), %eax
jge 0x61bd3
movq -0x80(%rbp), %rax
movslq -0x34(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
movq -0x30(%rbp), %rax
movl -0x34(%rbp), %ecx
movl -0x44(%rbp), %edx
imull -0x8(%rbp), %edx
addl %edx, %ecx
movslq %ecx, %rcx
movsd %xmm0, (%rax,%rcx,8)
movl -0x34(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x34(%rbp)
jmp 0x61b9b
movsd -0x50(%rbp), %xmm0
movq 0x10(%rbp), %rax
movl -0x44(%rbp), %ecx
movl %ecx, %edx
addl $0x1, %edx
movl %edx, -0x44(%rbp)
movslq %ecx, %rcx
movsd %xmm0, (%rax,%rcx,8)
jmp 0x61cbe
movsd -0x50(%rbp), %xmm1
movq 0x10(%rbp), %rax
movslq -0x48(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x61cac
movl $0x0, -0x34(%rbp)
movl -0x34(%rbp), %eax
cmpl -0x8(%rbp), %eax
jge 0x61c4f
movq -0x80(%rbp), %rax
movslq -0x34(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
movq -0x30(%rbp), %rax
movl -0x34(%rbp), %ecx
movl -0x48(%rbp), %edx
imull -0x8(%rbp), %edx
addl %edx, %ecx
movslq %ecx, %rcx
movsd %xmm0, (%rax,%rcx,8)
movl -0x34(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x34(%rbp)
jmp 0x61c17
movsd -0x50(%rbp), %xmm0
movq 0x10(%rbp), %rax
movslq -0x48(%rbp), %rcx
movsd %xmm0, (%rax,%rcx,8)
movl $0x0, -0x48(%rbp)
movl $0x0, -0x34(%rbp)
movl -0x34(%rbp), %eax
cmpl -0xc(%rbp), %eax
jge 0x61caa
movq 0x10(%rbp), %rax
movslq -0x48(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm1
movq 0x10(%rbp), %rax
movslq -0x34(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x61c9d
movl -0x34(%rbp), %eax
movl %eax, -0x48(%rbp)
jmp 0x61c9f
movl -0x34(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x34(%rbp)
jmp 0x61c6f
jmp 0x61cac
movq 0x10(%rbp), %rax
movslq -0x48(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
movsd %xmm0, -0x58(%rbp)
movq -0x88(%rbp), %rax
movsd (%rax), %xmm0
movq -0x80(%rbp), %rax
addsd (%rax), %xmm0
movsd %xmm0, (%rax)
movq -0x78(%rbp), %rax
movsd (%rax), %xmm0
movq -0x80(%rbp), %rax
subsd (%rax), %xmm0
movsd %xmm0, -0x60(%rbp)
movq -0x88(%rbp), %rax
movsd (%rax), %xmm0
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
movq -0x88(%rbp), %rax
movsd (%rax), %xmm1
movsd 0x5d0b9(%rip), %xmm4    # 0xbedd8
movsd 0x5a139(%rip), %xmm3    # 0xbbe60
xorps %xmm2, %xmm2
cmplesd %xmm2, %xmm1
movaps %xmm1, %xmm2
andpd %xmm4, %xmm2
andnpd %xmm3, %xmm1
orpd %xmm2, %xmm1
subsd %xmm1, %xmm0
movq -0x88(%rbp), %rax
movsd %xmm0, (%rax)
jmp 0x61e22
movl -0x3c(%rbp), %eax
movl -0x8(%rbp), %ecx
subl $0x1, %ecx
cmpl %ecx, %eax
jne 0x61d64
jmp 0x61e32
movl -0x3c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x3c(%rbp)
movq -0x88(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
movq -0x80(%rbp), %rax
movslq -0x3c(%rbp), %rcx
addsd (%rax,%rcx,8), %xmm0
movsd %xmm0, (%rax,%rcx,8)
movq -0x78(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
movq -0x80(%rbp), %rax
movslq -0x3c(%rbp), %rcx
subsd (%rax,%rcx,8), %xmm0
movsd %xmm0, -0x60(%rbp)
movq -0x88(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
movq -0x88(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm1
movsd 0x5cfeb(%rip), %xmm4    # 0xbedd8
movsd 0x5a06b(%rip), %xmm3    # 0xbbe60
xorps %xmm2, %xmm2
cmplesd %xmm2, %xmm1
movaps %xmm1, %xmm2
andpd %xmm4, %xmm2
andnpd %xmm3, %xmm1
orpd %xmm2, %xmm1
subsd %xmm1, %xmm0
movq -0x88(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movsd %xmm0, (%rax,%rcx,8)
jmp 0x61e22
jmp 0x61e24
movl -0x40(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x40(%rbp)
jmp 0x619a2
movl $0x0, -0x34(%rbp)
movl -0x34(%rbp), %eax
movl -0xc(%rbp), %ecx
subl $0x1, %ecx
cmpl %ecx, %eax
jge 0x61f7f
movl -0x34(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x38(%rbp)
movl -0x38(%rbp), %eax
cmpl -0xc(%rbp), %eax
jge 0x61f6f
movq 0x10(%rbp), %rax
movslq -0x34(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm1
movq 0x10(%rbp), %rax
movslq -0x38(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x61e84
jmp 0x61f61
jmp 0x61e86
movq 0x10(%rbp), %rax
movslq -0x34(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
movsd %xmm0, -0x90(%rbp)
movq 0x10(%rbp), %rax
movslq -0x38(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
movq 0x10(%rbp), %rax
movslq -0x34(%rbp), %rcx
movsd %xmm0, (%rax,%rcx,8)
movsd -0x90(%rbp), %xmm0
movq 0x10(%rbp), %rax
movslq -0x38(%rbp), %rcx
movsd %xmm0, (%rax,%rcx,8)
movl $0x0, -0x3c(%rbp)
movl -0x3c(%rbp), %eax
cmpl -0x8(%rbp), %eax
jge 0x61f5f
jmp 0x61edf
movq -0x30(%rbp), %rax
movl -0x3c(%rbp), %ecx
movl -0x34(%rbp), %edx
imull -0x8(%rbp), %edx
addl %edx, %ecx
movslq %ecx, %rcx
movsd (%rax,%rcx,8), %xmm0
movsd %xmm0, -0x98(%rbp)
movq -0x30(%rbp), %rax
movl -0x3c(%rbp), %ecx
movl -0x38(%rbp), %edx
imull -0x8(%rbp), %edx
addl %edx, %ecx
movslq %ecx, %rcx
movsd (%rax,%rcx,8), %xmm0
movq -0x30(%rbp), %rax
movl -0x3c(%rbp), %ecx
movl -0x34(%rbp), %edx
imull -0x8(%rbp), %edx
addl %edx, %ecx
movslq %ecx, %rcx
movsd %xmm0, (%rax,%rcx,8)
movsd -0x98(%rbp), %xmm0
movq -0x30(%rbp), %rax
movl -0x3c(%rbp), %ecx
movl -0x38(%rbp), %edx
imull -0x8(%rbp), %edx
addl %edx, %ecx
movslq %ecx, %rcx
movsd %xmm0, (%rax,%rcx,8)
jmp 0x61f51
movl -0x3c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x3c(%rbp)
jmp 0x61ed1
jmp 0x61f61
movl -0x38(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x38(%rbp)
jmp 0x61e53
jmp 0x61f71
movl -0x34(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x34(%rbp)
jmp 0x61e39
movq -0x68(%rbp), %rdi
callq 0x9900
movq -0x70(%rbp), %rdi
callq 0x9900
movq -0x78(%rbp), %rdi
callq 0x9900
movq -0x80(%rbp), %rdi
callq 0x9900
movq -0x88(%rbp), %rdi
callq 0x9900
cmpl $0x2710, -0x40(%rbp)    # imm = 0x2710
jl 0x61fe0
movq 0x95009(%rip), %rax     # 0xf6fc8
movq (%rax), %rdi
leaq 0x5ce56(%rip), %rsi     # 0xbee1f
leaq 0x5ce38(%rip), %rdx     # 0xbee08
movb $0x0, %al
callq 0x9a90
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x61fe7
movl $0x0, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0xa0, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)