// File: /workspace/github_cpp_makefile_star2_O3/canzarlab[P]Trajan/geno/lineSearch.cpp
// Function: dcstep(double&, double&, double&, double&, double&, double&, double&, double, double, bool&, double, double)
void dcstep(double & stx,
            double & fx,
            double & dx,
            double & sty,
            double & fy,
            double & dy,
            double & stp,
            double fp,
            double dp,
            bool & brackt,
            double const stpmin,
            double const stpmax) {
  double const zero  = 0.0,
               p66   = 0.66,
               two   = 2.0,
               three = 3.0;
  double gamma, p, q, r, s, sgnd, stpc, stpf, stpq, theta;
  sgnd = dp * (dx / std::fabs(dx));
  if (fp > fx) {
    //    std::cout << "dcstep 1" << std::endl;
     theta = three * (fx - fp) / (stp - stx) + dx + dp;
     s = std::max(std::fabs(theta), std::max(std::fabs(dx), std::fabs(dp)));
     gamma = s * std::sqrt(std::pow(theta / s, 2) - (dx / s) * (dp / s));
     if (stp < stx) gamma = -gamma;
     p = (gamma - dx) + theta;
     q = ((gamma - dx) + gamma) + dp;
     r = p / q;
     stpc = stx + r*(stp - stx);
     stpq = stx + ((dx/((fx - fp)/(stp - stx) + dx))/two) * (stp - stx);
     if (std::fabs(stpc-stx) < std::fabs(stpq-stx)) {
        stpf = stpc;
     } else {
        stpf = stpc + (stpq - stpc)/two;
     }
     brackt = true;
  } else if (sgnd < zero) {
    //    std::cout << "dcstep 2" << std::endl;
     theta = three*(fx - fp)/(stp - stx) + dx + dp;
     s = std::max(std::fabs(theta), std::max(std::fabs(dx),std::fabs(dp)));
     gamma = s*std::sqrt(std::pow(theta/s, 2) - (dx/s)*(dp/s));
     if (stp > stx) gamma = -gamma;
     p = (gamma - dp) + theta;
     q = ((gamma - dp) + gamma) + dx;
     r = p/q;
     stpc = stp + r*(stx - stp);
     stpq = stp + (dp/(dp - dx))*(stx - stp);
     if (std::fabs(stpc-stp) > std::fabs(stpq-stp)) {
        stpf = stpc;
     } else {
        stpf = stpq;
     }
     brackt = true;
  } else if (std::fabs(dp) < std::fabs(dx)) {
    //    std::cout << "dcstep 3 ***************" << std::endl;
     theta = three*(fx - fp)/(stp - stx) + dx + dp;
     s = std::max(std::fabs(theta), std::max(std::fabs(dx),std::fabs(dp)));

     gamma = s*std::sqrt(std::max(zero,std::pow(theta/s, 2)-(dx/s)*(dp/s)));
     //     std::cout << "theta = " << theta << std::endl;
     //     std::cout << "gamma = " << gamma << std::endl;
     if (stp > stx) gamma = -gamma;
     p = (gamma - dp) + theta;
     q = (gamma + (dx - dp)) + gamma;
     r = p/q;
     if (r < zero && gamma != zero) {
        stpc = stp + r*(stx - stp);
     } else if (stp > stx) {
        stpc = stpmax;
     } else {
        stpc = stpmin;
     }
     //     std::cout << "stpc = " << stpc << std::endl;
     
     stpq = stp + (dp/(dp - dx))*(stx - stp);

     //     std::cout << "--------------------------------------------" << std::endl;
     //     std::cout << "stpq = " << stpq << std::endl;
     //     std::cout << "stp  = " << stp << std::endl;
     //     std::cout << "dp   = " << dp << std::endl;
     //     std::cout << "dx   = " << dx << std::endl;
     //     std::cout << "stx  = " << stx << std::endl;
     //     std::cout << "dp/(dp-dx) = " << dp/(dp-dx) << std::endl;
     //     std::cout << "--------------------------------------------" << std::endl;



     if (brackt) {
        if (std::fabs(stpc-stp) < std::fabs(stpq-stp)) {
           stpf = stpc;
        } else {
           stpf = stpq;
        }
        if (stp > stx) {
           stpf = std::min(stp+p66*(sty-stp),stpf);
        } else {
           stpf = std::max(stp+p66*(sty-stp),stpf);
        }
     } else {
        if (std::fabs(stpc-stp) > std::fabs(stpq-stp)) {
           stpf = stpc;
        } else {
           stpf = stpq;
        }
        stpf = std::min(stpmax,stpf);
        stpf = std::max(stpmin,stpf);
     }
  } else { 
    //    std::cout << "dcstep 4" << std::endl;
    if (brackt) {

        theta = three*(fp - fy)/(sty - stp) + dy + dp;
        s = std::max(std::fabs(theta), std::max(std::fabs(dy),std::fabs(dp)));
        gamma = s*std::sqrt(std::pow(theta/s, 2) - (dy/s)*(dp/s));
        if (stp > sty) gamma = -gamma;
        p = (gamma - dp) + theta;
        q = ((gamma - dp) + gamma) + dy;
        r = p/q;
        stpc = stp + r*(sty - stp);
        stpf = stpc;
     } else if (stp > stx) {
        stpf = stpmax;
     } else {
        stpf = stpmin;
     }
  }

  if (fp > fx) {
     sty = stp;
     fy = fp;
     dy = dp;
  } else {
     if (sgnd < zero) {
        sty = stx;
        fy = fx;
        dy = dx;
     }
     stx = stp;
     fx = fp;
     dx = dp;
  }
  stp = stpf;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x58, %rsp
movapd %xmm0, %xmm11
movq 0x98(%rsp), %r10
movq 0x90(%rsp), %rax
movsd (%rdx), %xmm4
movapd 0x2f565(%rip), %xmm5    # 0x5c3d0
andpd %xmm4, %xmm5
movapd %xmm4, %xmm12
divsd %xmm5, %xmm12
mulsd %xmm1, %xmm12
movsd (%rsi), %xmm13
ucomisd %xmm13, %xmm0
jbe 0x2cf04
subsd %xmm11, %xmm13
mulsd 0x40dd0(%rip), %xmm13   # 0x6dc68
movsd (%rax), %xmm0
subsd (%rdi), %xmm0
divsd %xmm0, %xmm13
addsd %xmm4, %xmm13
addsd %xmm1, %xmm13
movapd 0x2f519(%rip), %xmm3    # 0x5c3d0
movapd %xmm13, %xmm0
andpd %xmm3, %xmm0
andpd %xmm1, %xmm3
maxsd %xmm5, %xmm3
maxsd %xmm0, %xmm3
movapd %xmm13, %xmm0
divsd %xmm3, %xmm0
mulsd %xmm0, %xmm0
movapd %xmm1, %xmm2
divsd %xmm3, %xmm2
divsd %xmm3, %xmm4
mulsd %xmm2, %xmm4
subsd %xmm4, %xmm0
xorpd %xmm2, %xmm2
ucomisd %xmm2, %xmm0
jb 0x2cf89
sqrtsd %xmm0, %xmm0
jmp 0x2d004
xorpd %xmm6, %xmm6
ucomisd %xmm12, %xmm6
jbe 0x2d0d4
subsd %xmm11, %xmm13
mulsd 0x40d47(%rip), %xmm13   # 0x6dc68
movsd (%rax), %xmm0
subsd (%rdi), %xmm0
divsd %xmm0, %xmm13
addsd %xmm4, %xmm13
addsd %xmm1, %xmm13
movapd 0x2f490(%rip), %xmm3    # 0x5c3d0
movapd %xmm13, %xmm0
andpd %xmm3, %xmm0
andpd %xmm1, %xmm3
maxsd %xmm5, %xmm3
maxsd %xmm0, %xmm3
movapd %xmm13, %xmm0
divsd %xmm3, %xmm0
mulsd %xmm0, %xmm0
movapd %xmm1, %xmm2
divsd %xmm3, %xmm2
divsd %xmm3, %xmm4
mulsd %xmm2, %xmm4
subsd %xmm4, %xmm0
ucomisd %xmm6, %xmm0
jb 0x2d1e7
sqrtsd %xmm0, %xmm0
jmp 0x2d262
movapd %xmm1, 0x40(%rsp)
movsd %xmm11, 0x8(%rsp)
movq %r8, %r15
movq %r9, %rbp
movq %rcx, %r13
movq %rdi, %rbx
movq %rdx, %r14
movq %rsi, %r12
movapd %xmm12, 0x30(%rsp)
movapd %xmm13, 0x20(%rsp)
movapd %xmm3, 0x10(%rsp)
callq 0x92b0
movapd 0x10(%rsp), %xmm3
movapd 0x20(%rsp), %xmm13
movq 0x98(%rsp), %r10
movapd 0x30(%rsp), %xmm12
movq %r12, %rsi
movq %r14, %rdx
movq %rbx, %rdi
movq 0x90(%rsp), %rax
movq %r13, %rcx
movq %rbp, %r9
movq %r15, %r8
movsd 0x8(%rsp), %xmm11
movapd 0x40(%rsp), %xmm1
mulsd %xmm3, %xmm0
movsd (%rax), %xmm10
movsd (%rdi), %xmm3
movapd 0x2f3a7(%rip), %xmm2    # 0x5c3c0
xorpd %xmm0, %xmm2
movapd %xmm10, %xmm4
cmpltsd %xmm3, %xmm4
andpd %xmm4, %xmm2
andnpd %xmm0, %xmm4
orpd %xmm2, %xmm4
movsd (%rdx), %xmm2
movapd %xmm4, %xmm0
subsd %xmm2, %xmm0
addsd %xmm0, %xmm13
addsd %xmm4, %xmm0
addsd %xmm1, %xmm0
divsd %xmm0, %xmm13
movapd %xmm10, %xmm0
subsd %xmm3, %xmm0
movsd (%rsi), %xmm4
subsd %xmm11, %xmm4
divsd %xmm0, %xmm4
addsd %xmm2, %xmm4
divsd %xmm4, %xmm2
movsd 0x2f3a1(%rip), %xmm4    # 0x5c418
mulsd %xmm4, %xmm2
unpcklpd %xmm2, %xmm13           # xmm13 = xmm13[0],xmm2[0]
unpcklpd %xmm0, %xmm0            # xmm0 = xmm0[0,0]
mulpd %xmm13, %xmm0
unpcklpd %xmm3, %xmm3            # xmm3 = xmm3[0,0]
addpd %xmm3, %xmm0
movapd %xmm0, %xmm2
subpd %xmm3, %xmm2
andpd 0x2f32f(%rip), %xmm2    # 0x5c3d0
pshufd $0xee, %xmm2, %xmm3     # xmm3 = xmm2[2,3,2,3]
movapd %xmm0, %xmm5
unpckhpd %xmm0, %xmm5            # xmm5 = xmm5[1],xmm0[1]
subsd %xmm0, %xmm5
mulsd %xmm4, %xmm5
addsd %xmm0, %xmm5
cmpltsd %xmm3, %xmm2
movapd %xmm2, %xmm3
andnpd %xmm5, %xmm3
andpd %xmm0, %xmm2
orpd %xmm3, %xmm2
jmp 0x2d30a
movapd 0x2f2f3(%rip), %xmm8    # 0x5c3d0
andpd %xmm1, %xmm8
ucomisd %xmm8, %xmm5
jbe 0x2d36d
subsd %xmm11, %xmm13
mulsd 0x40b6d(%rip), %xmm13   # 0x6dc68
movsd (%rax), %xmm10
movsd (%rdi), %xmm0
movapd %xmm10, %xmm6
subsd %xmm0, %xmm6
divsd %xmm6, %xmm13
addsd %xmm4, %xmm13
addsd %xmm1, %xmm13
movapd 0x2f2ac(%rip), %xmm6    # 0x5c3d0
andpd %xmm13, %xmm6
maxsd %xmm5, %xmm8
maxsd %xmm6, %xmm8
movapd %xmm13, %xmm6
divsd %xmm8, %xmm6
mulsd %xmm6, %xmm6
movapd %xmm1, %xmm5
divsd %xmm8, %xmm5
movapd %xmm4, %xmm7
divsd %xmm8, %xmm7
mulsd %xmm5, %xmm7
subsd %xmm7, %xmm6
xorpd %xmm5, %xmm5
maxsd %xmm5, %xmm6
sqrtsd %xmm6, %xmm6
mulsd %xmm8, %xmm6
movapd 0x2f24c(%rip), %xmm7    # 0x5c3c0
xorpd %xmm6, %xmm7
ucomisd %xmm7, %xmm6
jne 0x2d184
jnp 0x2d3fa
movapd %xmm0, %xmm8
cmpltsd %xmm10, %xmm8
movapd %xmm8, %xmm9
andnpd %xmm6, %xmm9
andpd %xmm7, %xmm8
orpd %xmm9, %xmm8
movapd %xmm4, %xmm6
subsd %xmm1, %xmm6
addsd %xmm8, %xmm6
addsd %xmm8, %xmm6
subsd %xmm1, %xmm8
addsd %xmm8, %xmm13
divsd %xmm6, %xmm13
ucomisd %xmm13, %xmm5
jbe 0x2d3fa
movapd %xmm0, %xmm5
subsd %xmm10, %xmm5
mulsd %xmm5, %xmm13
addsd %xmm10, %xmm13
jmp 0x2d40b
movapd %xmm1, 0x40(%rsp)
movsd %xmm11, 0x8(%rsp)
movq %r8, %r15
movq %r9, %rbp
movq %rcx, %r13
movq %rdi, %rbx
movq %rdx, %r14
movq %rsi, %r12
movapd %xmm12, 0x30(%rsp)
movapd %xmm13, 0x20(%rsp)
movapd %xmm3, 0x10(%rsp)
callq 0x92b0
movapd 0x10(%rsp), %xmm3
movapd 0x20(%rsp), %xmm13
movq 0x98(%rsp), %r10
movapd 0x30(%rsp), %xmm12
movq %r12, %rsi
movq %r14, %rdx
movq %rbx, %rdi
movq 0x90(%rsp), %rax
movq %r13, %rcx
movq %rbp, %r9
movq %r15, %r8
movsd 0x8(%rsp), %xmm11
movapd 0x40(%rsp), %xmm1
mulsd %xmm3, %xmm0
movsd (%rax), %xmm10
movsd (%rdi), %xmm3
movapd 0x2f149(%rip), %xmm2    # 0x5c3c0
xorpd %xmm0, %xmm2
movapd %xmm3, %xmm4
cmpltsd %xmm10, %xmm4
andpd %xmm4, %xmm2
andnpd %xmm0, %xmm4
orpd %xmm2, %xmm4
movapd %xmm4, %xmm0
subsd %xmm1, %xmm0
addsd %xmm0, %xmm13
addsd %xmm4, %xmm0
movsd (%rdx), %xmm2
addsd %xmm2, %xmm0
subsd %xmm10, %xmm3
movapd %xmm1, %xmm4
subsd %xmm2, %xmm4
unpcklpd %xmm4, %xmm0            # xmm0 = xmm0[0],xmm4[0]
unpcklpd %xmm1, %xmm13           # xmm13 = xmm13[0],xmm1[0]
divpd %xmm0, %xmm13
unpcklpd %xmm3, %xmm3            # xmm3 = xmm3[0,0]
mulpd %xmm13, %xmm3
movapd %xmm10, %xmm0
unpcklpd %xmm10, %xmm0           # xmm0 = xmm0[0],xmm10[0]
addpd %xmm0, %xmm3
movapd %xmm3, %xmm4
subpd %xmm0, %xmm4
andpd 0x2f0e4(%rip), %xmm4    # 0x5c3d0
pshufd $0xee, %xmm4, %xmm2     # xmm2 = xmm4[2,3,2,3]
cmpltsd %xmm4, %xmm2
movapd %xmm2, %xmm0
andpd %xmm3, %xmm0
unpckhpd %xmm3, %xmm3            # xmm3 = xmm3[1,1]
andnpd %xmm3, %xmm2
orpd %xmm0, %xmm2
movb $0x1, (%r10)
ucomisd (%rsi), %xmm11
jbe 0x2d322
movsd %xmm10, (%rcx)
movq %r8, %rsi
movq %r9, %rdx
jmp 0x2d351
xorpd %xmm0, %xmm0
ucomisd %xmm12, %xmm0
jbe 0x2d34c
movsd (%rdi), %xmm0
movsd %xmm0, (%rcx)
movsd (%rsi), %xmm0
movsd %xmm0, (%r8)
movsd (%rdx), %xmm0
movsd %xmm0, (%r9)
movsd (%rax), %xmm10
movsd %xmm10, (%rdi)
movsd %xmm11, (%rsi)
movsd %xmm1, (%rdx)
movsd %xmm2, (%rax)
addq $0x58, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
cmpb $0x1, (%r10)
jne 0x2d493
movapd %xmm11, %xmm5
subsd (%r8), %xmm5
mulsd 0x408df(%rip), %xmm5    # 0x6dc68
movsd (%rcx), %xmm0
subsd (%rax), %xmm0
divsd %xmm0, %xmm5
movsd (%r9), %xmm3
addsd %xmm3, %xmm5
addsd %xmm1, %xmm5
movapd 0x2f026(%rip), %xmm0    # 0x5c3d0
movapd %xmm5, %xmm2
andpd %xmm0, %xmm2
andpd %xmm3, %xmm0
maxsd %xmm0, %xmm8
maxsd %xmm2, %xmm8
movapd %xmm5, %xmm0
divsd %xmm8, %xmm0
mulsd %xmm0, %xmm0
movapd %xmm1, %xmm2
divsd %xmm8, %xmm2
divsd %xmm8, %xmm3
mulsd %xmm2, %xmm3
subsd %xmm3, %xmm0
xorpd %xmm2, %xmm2
ucomisd %xmm2, %xmm0
jb 0x2d4d0
sqrtsd %xmm0, %xmm0
jmp 0x2d543
ucomisd %xmm0, %xmm10
movapd %xmm3, %xmm13
ja 0x2d40b
movapd %xmm2, %xmm13
movapd %xmm1, %xmm5
subsd %xmm4, %xmm5
movapd %xmm1, %xmm4
divsd %xmm5, %xmm4
movapd %xmm0, %xmm5
subsd %xmm10, %xmm5
mulsd %xmm4, %xmm5
addsd %xmm10, %xmm5
movapd %xmm13, %xmm4
subsd %xmm10, %xmm4
movapd 0x2ef91(%rip), %xmm7    # 0x5c3d0
andpd %xmm7, %xmm4
movapd %xmm5, %xmm6
subsd %xmm10, %xmm6
andpd %xmm7, %xmm6
cmpb $0x1, (%r10)
jne 0x2d4ac
ucomisd %xmm0, %xmm10
cmpltsd %xmm6, %xmm4
andpd %xmm4, %xmm13
andnpd %xmm5, %xmm4
orpd %xmm13, %xmm4
movsd (%rcx), %xmm0
subsd %xmm10, %xmm0
mulsd 0x407f1(%rip), %xmm0    # 0x6dc70
addsd %xmm10, %xmm0
jbe 0x2d59f
minsd %xmm0, %xmm4
jmp 0x2d5a3
movsd (%rax), %xmm10
ucomisd (%rdi), %xmm10
jbe 0x2d30e
movapd %xmm3, %xmm2
jmp 0x2d30e
cmpltsd %xmm4, %xmm6
andpd %xmm6, %xmm13
andnpd %xmm5, %xmm6
orpd %xmm13, %xmm6
minsd %xmm3, %xmm6
maxsd %xmm2, %xmm6
movapd %xmm6, %xmm2
jmp 0x2d30e
movapd %xmm1, 0x40(%rsp)
movsd %xmm11, 0x8(%rsp)
movq %r8, %r15
movq %r9, %rbp
movq %rcx, %r13
movq %rdi, %rbx
movq %rdx, %r14
movq %rsi, %r12
movapd %xmm12, 0x30(%rsp)
movapd %xmm8, 0x20(%rsp)
movapd %xmm5, 0x10(%rsp)
callq 0x92b0
movapd 0x10(%rsp), %xmm5
movapd 0x20(%rsp), %xmm8
movapd 0x30(%rsp), %xmm12
movq %r12, %rsi
movq %r14, %rdx
movq %rbx, %rdi
movq 0x90(%rsp), %rax
movq %r13, %rcx
movq %rbp, %r9
movq %r15, %r8
movsd 0x8(%rsp), %xmm11
movapd 0x40(%rsp), %xmm1
mulsd %xmm8, %xmm0
movsd (%rax), %xmm10
movsd (%rcx), %xmm2
movapd 0x2ee67(%rip), %xmm3    # 0x5c3c0
xorpd %xmm0, %xmm3
movapd %xmm2, %xmm4
cmpltsd %xmm10, %xmm4
andpd %xmm4, %xmm3
andnpd %xmm0, %xmm4
orpd %xmm3, %xmm4
movapd %xmm4, %xmm0
subsd %xmm1, %xmm0
addsd %xmm0, %xmm5
addsd %xmm4, %xmm0
addsd (%r9), %xmm0
divsd %xmm0, %xmm5
subsd %xmm10, %xmm2
mulsd %xmm5, %xmm2
addsd %xmm10, %xmm2
jmp 0x2d30e
maxsd %xmm0, %xmm4
movapd %xmm4, %xmm2
jmp 0x2d30e