// File: /workspace/github_c_makefile_star2_O2/zpole[P]IICV/vl/covdet.c
// Function: vl_refine_local_extreum_2
VL_EXPORT vl_bool
vl_refine_local_extreum_2 (VlCovDetExtremum2 * refined,
                           float const * map,
                           vl_size width, vl_size height,
                           vl_index x, vl_index y)
{
  vl_size const xo = 1 ;
  vl_size const yo = width ;

  double Dx=0,Dy=0,Dxx=0,Dyy=0,Dxy=0;
  double A [2*2], b [2] ;

#define at(dx,dy) (*(pt + (dx)*xo + (dy)*yo ))
#define Aat(i,j) (A[(i)+(j)*2])

  float const * pt ;
  vl_index dx = 0 ;
  vl_index dy = 0 ;
  vl_index iter ;
  int err ;

  assert (map) ;
  assert (1 <= x && x <= (signed)width - 2) ;
  assert (1 <= y && y <= (signed)height - 2) ;

  for (iter = 0 ; iter < 5 ; ++iter) {
    x += dx ;
    y += dy ;
    pt = map + x*xo + y*yo  ;

    /* compute the gradient */
    Dx = 0.5 * (at(+1,0) - at(-1,0)) ;
    Dy = 0.5 * (at(0,+1) - at(0,-1));

    /* compute the Hessian */
    Dxx = (at(+1,0) + at(-1,0) - 2.0 * at(0,0)) ;
    Dyy = (at(0,+1) + at(0,-1) - 2.0 * at(0,0)) ;
    Dxy = 0.25 * (at(+1,+1) + at(-1,-1) - at(-1,+1) - at(+1,-1)) ;

    /* solve linear system */
    Aat(0,0) = Dxx ;
    Aat(1,1) = Dyy ;
    Aat(0,1) = Aat(1,0) = Dxy ;

    b[0] = - Dx ;
    b[1] = - Dy ;

    err = vl_solve_linear_system_2(b, A, b) ;

    if (err != VL_ERR_OK) {
      b[0] = 0 ;
      b[1] = 0 ;
      break ;
    }

    /* Keep going if there is sufficient translation */

    dx = (b[0] > 0.6 && x < (signed)width - 2 ?  1 : 0)
    + (b[0] < -0.6 && x > 1 ? -1 : 0) ;

    dy = (b[1] > 0.6 && y < (signed)height - 2 ?  1 : 0)
    + (b[1] < -0.6 && y > 1 ? -1 : 0) ;

    if (dx == 0 && dy == 0) break ;
  }

  /* check threshold and other conditions */
  {
    double peakScore = at(0,0) + 0.5 * (Dx * b[0] + Dy * b[1]) ;
    double alpha = (Dxx+Dyy)*(Dxx+Dyy) / (Dxx*Dyy - Dxy*Dxy) ;
    double edgeScore ;

    if (alpha < 0) {
      /* not an extremum */
      edgeScore = VL_INFINITY_D ;
    } else {
      edgeScore = (0.5*alpha - 1) + sqrt(VL_MAX(0.25*alpha - 1,0)*alpha) ;
    }

    refined->xi = x ;
    refined->yi = y ;
    refined->x = x + b[0] ;
    refined->y = y + b[1] ;
    refined->peakScore = peakScore ;
    refined->edgeScore = edgeScore ;

    return
    err == VL_ERR_OK &&
    vl_abs_d(b[0]) < 1.5 &&
    vl_abs_d(b[1]) < 1.5 &&
    0 <= refined->x && refined->x <= (signed)width - 1 &&
    0 <= refined->y && refined->y <= (signed)height - 1 ;
  }
#undef Aat
#undef at
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x98, %rsp
movq %r9, %r12
movq %r8, %r13
movq %rdx, %r14
movq %rsi, 0x58(%rsp)
movq %rdi, 0x40(%rsp)
movq %rdx, %rbp
negq %rbp
leal -0x2(%rdx), %eax
cltq
movq %rax, 0x50(%rsp)
movq %rcx, 0x38(%rsp)
leal -0x2(%rcx), %eax
cltq
movq %rax, 0x48(%rsp)
xorps %xmm0, %xmm0
movaps %xmm0, 0x10(%rsp)
xorps %xmm0, %xmm0
movaps %xmm0, 0x20(%rsp)
pushq $0x6
popq %r15
xorl %eax, %eax
xorl %ecx, %ecx
xorpd %xmm2, %xmm2
movapd %xmm2, 0x60(%rsp)
decq %r15
je 0xb4cf
addq %rax, %r13
addq %rcx, %r12
movq 0x58(%rsp), %rax
leaq (%rax,%r13,4), %rax
movq %r12, %rcx
imulq %r14, %rcx
leaq (%rax,%rcx,4), %rbx
movss -0x4(%rbx), %xmm0
movss 0x4(%rbx), %xmm1
movaps %xmm1, %xmm2
subss %xmm0, %xmm2
cvtss2sd %xmm2, %xmm6
mulsd 0x21e16(%rip), %xmm6    # 0x2d1c0
cvtss2sd (%rbx), %xmm2
movss (%rbx,%r14,4), %xmm3
unpcklps %xmm3, %xmm1            # xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
movss 0x4(%rbx,%r14,4), %xmm4
addss -0x4(%rbx,%rbp,4), %xmm4
subss -0x4(%rbx,%r14,4), %xmm4
movsd (%rbx,%rbp,4), %xmm5
unpcklps %xmm5, %xmm0            # xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
addps %xmm1, %xmm0
cvtps2pd %xmm0, %xmm0
addsd %xmm2, %xmm2
unpcklpd %xmm2, %xmm2            # xmm2 = xmm2[0,0]
subpd %xmm2, %xmm0
unpcklps %xmm4, %xmm3            # xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
subps %xmm5, %xmm3
cvtps2pd %xmm3, %xmm1
mulpd 0x21cca(%rip), %xmm1    # 0x2d0c0
movlpd %xmm0, 0x70(%rsp)
movapd %xmm0, 0x10(%rsp)
movhpd %xmm0, 0x88(%rsp)
movapd %xmm1, %xmm0
unpckhpd %xmm1, %xmm0            # xmm0 = xmm0[1],xmm1[1]
movupd %xmm0, 0x78(%rsp)
movapd %xmm6, 0x20(%rsp)
movapd %xmm6, %xmm0
movapd %xmm1, 0x60(%rsp)
unpcklpd %xmm1, %xmm0            # xmm0 = xmm0[0],xmm1[0]
xorpd 0x21c6b(%rip), %xmm0    # 0x2d0a0
movapd %xmm0, (%rsp)
movq %rsp, %rdi
leaq 0x70(%rsp), %rsi
movq %rdi, %rdx
callq 0x9950
testl %eax, %eax
jne 0xb4d3
movsd (%rsp), %xmm1
movsd 0x21d51(%rip), %xmm2    # 0x2d1b0
ucomisd %xmm2, %xmm1
movsd 0x8(%rsp), %xmm0
seta %al
cmpq 0x50(%rsp), %r13
setl %cl
andb %al, %cl
movsd 0x21d3a(%rip), %xmm3    # 0x2d1b8
ucomisd %xmm1, %xmm3
movzbl %cl, %eax
seta %cl
cmpq $0x2, %r13
setge %dl
andb %cl, %dl
movzbl %dl, %ecx
subq %rcx, %rax
ucomisd %xmm2, %xmm0
seta %cl
cmpq 0x48(%rsp), %r12
setl %dl
andb %cl, %dl
ucomisd %xmm0, %xmm3
seta %sil
movzbl %dl, %ecx
cmpq $0x2, %r12
setge %dl
andb %sil, %dl
movzbl %dl, %edx
subq %rdx, %rcx
movq %rcx, %rdx
orq %rax, %rdx
jne 0xb36a
xorl %ebp, %ebp
jmp 0xb4e7
xorpd %xmm0, %xmm0
movapd %xmm0, (%rsp)
movb $0x1, %bpl
xorpd %xmm0, %xmm0
xorpd %xmm1, %xmm1
cvtss2sd (%rbx), %xmm2
movapd 0x60(%rsp), %xmm5
movapd %xmm5, %xmm3
mulsd %xmm0, %xmm3
movapd 0x20(%rsp), %xmm4
mulsd %xmm1, %xmm4
addsd %xmm3, %xmm4
mulsd 0x21cb1(%rip), %xmm4    # 0x2d1c0
addsd %xmm2, %xmm4
movapd %xmm4, 0x20(%rsp)
movapd 0x10(%rsp), %xmm4
movapd %xmm4, %xmm3
unpckhpd %xmm4, %xmm3            # xmm3 = xmm3[1],xmm4[1]
movapd %xmm4, %xmm2
addsd %xmm3, %xmm2
mulsd %xmm2, %xmm2
unpckhpd %xmm5, %xmm5            # xmm5 = xmm5[1,1]
mulsd %xmm5, %xmm5
mulsd %xmm4, %xmm3
subsd %xmm5, %xmm3
divsd %xmm3, %xmm2
xorpd %xmm3, %xmm3
ucomisd %xmm2, %xmm3
jbe 0xb55b
movss 0x21d17(%rip), %xmm4    # 0x2d270
jmp 0xb5bb
movsd 0x21c5d(%rip), %xmm4    # 0x2d1c0
mulsd %xmm2, %xmm4
movsd 0x21c59(%rip), %xmm1    # 0x2d1c8
addsd %xmm1, %xmm4
movsd 0x21c55(%rip), %xmm0    # 0x2d1d0
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
maxsd %xmm3, %xmm0
mulsd %xmm2, %xmm0
ucomisd %xmm3, %xmm0
jb 0xb597
sqrtsd %xmm0, %xmm0
jmp 0xb5a8
movsd %xmm4, 0x10(%rsp)
callq 0x9a00
movsd 0x10(%rsp), %xmm4
addsd %xmm0, %xmm4
cvtsd2ss %xmm4, %xmm4
movsd (%rsp), %xmm1
movsd 0x8(%rsp), %xmm0
movq 0x40(%rsp), %rax
movq %r13, (%rax)
movq %r12, 0x8(%rax)
cvtsi2sd %r13, %xmm2
addsd %xmm1, %xmm2
cvtsd2ss %xmm2, %xmm3
cvtsi2sd %r12, %xmm2
addsd %xmm0, %xmm2
unpcklpd 0x20(%rsp), %xmm2       # xmm2 = xmm2[0],mem[0]
cvtpd2ps %xmm2, %xmm2
movss %xmm3, 0x10(%rax)
movlpd %xmm2, 0x14(%rax)
movss %xmm4, 0x1c(%rax)
movapd 0x21ae2(%rip), %xmm4    # 0x2d0e0
andpd %xmm4, %xmm1
movsd 0x21bce(%rip), %xmm5    # 0x2d1d8
ucomisd %xmm1, %xmm5
setbe %cl
xorl %eax, %eax
orb %cl, %bpl
jne 0xb653
andpd %xmm4, %xmm0
ucomisd %xmm0, %xmm5
jbe 0xb653
xorpd %xmm0, %xmm0
ucomiss %xmm0, %xmm3
jb 0xb653
decl %r14d
cvtsi2ss %r14d, %xmm0
ucomiss %xmm3, %xmm0
jb 0xb653
xorps %xmm0, %xmm0
ucomiss %xmm0, %xmm2
jb 0xb653
movq 0x38(%rsp), %rax
decl %eax
cvtsi2ss %eax, %xmm0
xorl %eax, %eax
ucomiss %xmm2, %xmm0
setae %al
addq $0x98, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq