// File: /workspace/github_cpp_makefile_star2_O3/chhylp123[P]hifiasm/hic.cpp
// Function: LeastSquare_advance(trans_idx*, ha_ug_index*, unsigned long)
void LeastSquare_advance(trans_idx* dis, ha_ug_index* idx, uint64_t med)
{
    #define SCAL_RATE 1000
    long double t1=0, t2=0, t3=0, t4=0, x, y;
    uint64_t i, m, ava_size;

    for (i = m = 0; i < dis->n; i++)
    {
        x = ((double)(dis->a[i].beg + dis->a[i].end))/2;
        y = ((double)(dis->a[i].cnt_1))/((double)(dis->a[i].cnt_0 + dis->a[i].cnt_1));
        if(dis->a[i].beg >= med) break;

        t1 += x*x;
        t2 += x;
        t3 += x*y;
        t4 += y;
        m++;
    }

    if(i < dis->n)
    {
        uint64_t beg, end, cnt_0, cnt_1;
        for (beg = dis->a[i].beg, end = dis->a[i].end, cnt_0 = cnt_1 = 0; i < dis->n; i++)
        {
            cnt_0 += dis->a[i].cnt_0;
            cnt_1 += dis->a[i].cnt_1;
            beg = MIN(beg, dis->a[i].beg);
            end = MAX(end, dis->a[i].end);
        }

        x = ((double)(beg + end))/2;
        y = ((double)(cnt_1))/((double)(cnt_0 + cnt_1));

        t1 += x*x;
        t2 += x;
        t3 += x*y;
        t4 += y;
        m++;
    }



    if(t2 > t4)
    {
        idx->frac = t2/t4;
        if(idx->frac > SCAL_RATE) idx->frac = idx->frac / SCAL_RATE;
        if(idx->frac < 1) idx->frac = 1;
    }

    ava_size = m;
    t1 /= (idx->frac*idx->frac);
    t2 /= idx->frac;
    t3 /= idx->frac;
    if((t1*ava_size - t2*t2) != 0)
    {
        idx->a = (t3*ava_size - t2*t4) / (t1*ava_size - t2*t2);
    }
    if((t1*ava_size - t2*t2) != 0)
    {
        idx->b = (t1*t4 - t2*t3) / (t1*ava_size - t2*t2);
    }
}

// Assembly:
pushq %r14
pushq %rbx
movq 0x8(%rdi), %rax
fldz
testq %rax, %rax
je 0x14a6ea
fstp %st(0)
movq (%rdi), %rdi
addq $0x20, %rdi
fldz
xorl %ecx, %ecx
movq 0xe6c4e(%rip), %xmm1    # 0x231280
movapd 0xe6c56(%rip), %xmm0    # 0x231290
movsd 0xe6fae(%rip), %xmm2    # 0x2315f0
fld %st(0)
fld %st(1)
fld %st(2)
movq -0x20(%rdi), %r8
cmpq %rdx, %r8
jae 0x14a6f7
movq (%rdi), %r9
movq %r9, %xmm3
punpckldq %xmm1, %xmm3    # xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
subpd %xmm0, %xmm3
movapd %xmm3, %xmm4
unpckhpd %xmm3, %xmm4            # xmm4 = xmm4[1],xmm3[1]
addsd %xmm3, %xmm4
addq -0x8(%rdi), %r9
movq %r9, %xmm3
punpckldq %xmm1, %xmm3    # xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
subpd %xmm0, %xmm3
movapd %xmm3, %xmm5
unpckhpd %xmm3, %xmm5            # xmm5 = xmm5[1],xmm3[1]
addsd %xmm3, %xmm5
divsd %xmm5, %xmm4
movsd %xmm4, -0x30(%rsp)
fldl -0x30(%rsp)
addq -0x18(%rdi), %r8
movq %r8, %xmm3
punpckldq %xmm1, %xmm3    # xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
subpd %xmm0, %xmm3
movapd %xmm3, %xmm4
unpckhpd %xmm3, %xmm4            # xmm4 = xmm4[1],xmm3[1]
addsd %xmm3, %xmm4
mulsd %xmm2, %xmm4
movsd %xmm4, -0x28(%rsp)
fldl -0x28(%rsp)
fld %st(0)
fmul %st(1), %st
faddp %st, %st(6)
fadd %st, %st(4)
fmul %st(1), %st
faddp %st, %st(3)
faddp %st, %st(1)
incq %rcx
addq $0x28, %rdi
cmpq %rcx, %rax
jne 0x14a648
jmp 0x14a7c5
xorl %eax, %eax
fld %st(0)
fld %st(1)
fld %st(2)
jmp 0x14a7fb
movq -0x18(%rdi), %r10
cmpq %rax, %rcx
jae 0x14a733
xorl %r9d, %r9d
xorl %edx, %edx
movq %rcx, %r11
addq -0x8(%rdi), %rdx
addq (%rdi), %r9
movq -0x20(%rdi), %rbx
movq -0x18(%rdi), %r14
cmpq %rbx, %r8
cmovaeq %rbx, %r8
cmpq %r14, %r10
cmovbeq %r14, %r10
incq %r11
addq $0x28, %rdi
cmpq %rax, %r11
jb 0x14a708
jmp 0x14a738
xorl %edx, %edx
xorl %r9d, %r9d
addq %r10, %r8
movq %r8, %xmm2
punpckldq %xmm1, %xmm2    # xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
subpd %xmm0, %xmm2
movapd %xmm2, %xmm3
unpckhpd %xmm2, %xmm3            # xmm3 = xmm3[1],xmm2[1]
addsd %xmm2, %xmm3
mulsd 0xe6e94(%rip), %xmm3    # 0x2315f0
movsd %xmm3, -0x18(%rsp)
fldl -0x18(%rsp)
movq %r9, %xmm2
punpckldq %xmm1, %xmm2    # xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
subpd %xmm0, %xmm2
movapd %xmm2, %xmm3
unpckhpd %xmm2, %xmm3            # xmm3 = xmm3[1],xmm2[1]
addsd %xmm2, %xmm3
addq %r9, %rdx
movq %rdx, %xmm2
punpckldq %xmm1, %xmm2    # xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
subpd %xmm0, %xmm2
movapd %xmm2, %xmm0
unpckhpd %xmm2, %xmm0            # xmm0 = xmm0[1],xmm2[1]
addsd %xmm2, %xmm0
divsd %xmm0, %xmm3
movsd %xmm3, -0x20(%rsp)
fldl -0x20(%rsp)
fld %st(1)
fmul %st(2), %st
faddp %st, %st(6)
fxch %st(4)
fadd %st(1), %st
fxch %st(1)
fmul %st(4), %st
faddp %st, %st(3)
fxch %st(1)
faddp %st, %st(3)
incq %rcx
movq %rcx, %rax
fxch %st(2)
fxch %st(2)
fucomi %st(2), %st
jbe 0x14a7f9
fld %st(0)
fdiv %st(3), %st
flds 0xf0a9b(%rip)           # 0x23b270
fxch %st(1)
fucomi %st(1), %st
fdiv %st, %st(1)
fcmovnbe %st(1), %st
fstp %st(1)
fld %st(0)
fstpt 0xa0(%rsi)
fld1
fucomi %st(1), %st
jbe 0x14a803
fstp %st(1)
fld %st(0)
fstpt 0xa0(%rsi)
jmp 0x14a805
fxch %st(2)
fldt 0xa0(%rsi)
jmp 0x14a80b
fstp %st(0)
fxch %st(1)
fxch %st(3)
fxch %st(1)
fld %st(0)
fmul %st(1), %st
fdivrp %st, %st(5)
fdivr %st, %st(3)
movq %rax, -0x38(%rsp)
xorl %ecx, %ecx
testq %rax, %rax
sets %cl
fildll -0x38(%rsp)
leaq 0xf0a0d(%rip), %rax     # 0x23b238
fadds (%rax,%rcx,4)
fld %st(4)
fchs
fxch %st(5)
fmul %st, %st(0)
fld %st(6)
fstpt -0xc(%rsp)
fxch %st(6)
fmul %st(1), %st
fsubp %st, %st(6)
fldz
fxch %st(6)
fucomi %st(6), %st
fstp %st(6)
jne 0x14a84e
jnp 0x14a894
fxch %st(3)
fdivp %st, %st(1)
fld %st(1)
fmul %st(4), %st
fxch %st(3)
fmul %st(1), %st
faddp %st, %st(3)
fxch %st(2)
fdiv %st(4), %st
fstpt 0x80(%rsi)
fxch %st(1)
fmulp %st, %st(2)
fldt -0xc(%rsp)
fmulp %st, %st(1)
faddp %st, %st(1)
fdivp %st, %st(1)
fstpt 0x90(%rsi)
fldz
fldz
fldz
fldz
fldz
fldz
fxch %st(1)
fxch %st(5)
fxch %st(3)
fxch %st(4)
fxch %st(3)
fxch %st(2)
fxch %st(1)
fstp %st(2)
fstp %st(2)
fstp %st(2)
fstp %st(0)
fstp %st(1)
fstp %st(0)
popq %rbx
popq %r14
retq