// File: chhylp123[P]hifiasm/Correct.cpp
// Function: cal_estimate_err_hc(overlap_region*, long, long, long, long, long, double, long*)
int64_t cal_estimate_err_hc(overlap_region *z, int64_t wl, int64_t qs, int64_t qe, int64_t ts, int64_t te, double e_rate, int64_t *exact)
{
    int64_t k, ws, we, wid, os, oe, ovlp, tot, cov_l, est = (qe-qs)*e_rate, wn = z->w_list.n, exa = 1, ots, ote, q[2], t[2]; 
    if(exact) (*exact) = 0;
    if(!wn) return est;
    if(qs < z->x_pos_s) qs = z->x_pos_s;
    if(qe > z->x_pos_e+1) qe = z->x_pos_e+1;
    ws = qs/wl; ws *= wl; wid = get_win_id_by_s(z, ws, wl, NULL);
    if(wid>=wn) wid = wn-1;
    for (k = wid;k < wn && qs > z->w_list.a[k].x_end; k++); if(k == wn) return est;
    ///qs <= z->w_list.a[k].x_end
    for (;k>=0 && qs < z->w_list.a[k].x_start; k--); if(k < 0) k = 0;
    ///qs >= z->w_list.a[k].x_start

    for (tot = cov_l = 0, ots = ote = -1; k < wn && z->w_list.a[k].x_start < qe; k++) {
        if(z->w_list.a[k].y_end == -1) continue;
        ws = z->w_list.a[k].x_start; we = z->w_list.a[k].x_end+1;
        os = MAX(qs, ws); oe = MIN(qe, we);
	    ovlp = ((oe>os)? (oe-os):0);
        if(!ovlp) continue;
        cov_l += ovlp;
        
        if(ovlp == (we-ws)) {
            tot += z->w_list.a[k].error;
        } else {
            tot += ((double)z->w_list.a[k].error)*((double)ovlp)/((double)(we-ws));
        }
        if(z->w_list.a[k].error > 0) exa = 0;
        if(exa) {
            q[0] = os - ws; q[1] = we - oe; 
            we = z->w_list.a[k].y_end+1; ws = we - (z->w_list.a[k].x_end+1-z->w_list.a[k].x_start);
            os = MAX(ts, ws); oe = MIN(te, we);
	        ovlp = ((oe>os)? (oe-os):0);
            t[0] = os - ws; t[1] = we - oe; 
            if((ovlp) && (q[0] == t[0]) && (t[0] == t[0])) {
                if(ote == -1) {
                    ots = os; ote = oe; 
                } else if(ote == os) {
                    ote = oe; 
                } else {
                    exa = 0;
                }
            } else {
                exa = 0;
            }
        }
    }
    tot += ((qe-qs)-cov_l)*e_rate; 
    if((exact) && exa && (((qe-qs) == cov_l))) {
        if(((qe-qs) == (ote - ots)) && (ots == ts) && (ote == te)) (*exact) = 1;
    }
    return tot;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x110, %rsp            # imm = 0x110
movq 0x10(%rbp), %rax
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movq %r8, -0x30(%rbp)
movq %r9, -0x38(%rbp)
movsd %xmm0, -0x40(%rbp)
movq -0x28(%rbp), %rax
subq -0x20(%rbp), %rax
cvtsi2sd %rax, %xmm0
mulsd -0x40(%rbp), %xmm0
cvttsd2si %xmm0, %rax
movq %rax, -0x90(%rbp)
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movq %rax, -0x98(%rbp)
movq $0x1, -0xa0(%rbp)
cmpq $0x0, 0x10(%rbp)
je 0x5e156
movq 0x10(%rbp), %rax
movq $0x0, (%rax)
cmpq $0x0, -0x98(%rbp)
jne 0x5e170
movq -0x90(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x5e74e
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
movl 0x4(%rcx), %ecx
cmpq %rcx, %rax
jge 0x5e18b
movq -0x10(%rbp), %rax
movl 0x4(%rax), %eax
movq %rax, -0x20(%rbp)
movq -0x28(%rbp), %rax
movq -0x10(%rbp), %rcx
movl 0x8(%rcx), %ecx
addl $0x1, %ecx
movl %ecx, %ecx
cmpq %rcx, %rax
jle 0x5e1b0
movq -0x10(%rbp), %rax
movl 0x8(%rax), %eax
addl $0x1, %eax
movl %eax, %eax
movq %rax, -0x28(%rbp)
movq -0x20(%rbp), %rax
cqto
idivq -0x18(%rbp)
movq %rax, -0x50(%rbp)
movq -0x18(%rbp), %rax
imulq -0x50(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x10(%rbp), %rdi
movq -0x50(%rbp), %rsi
movq -0x18(%rbp), %rdx
xorl %eax, %eax
movl %eax, %ecx
callq 0x9e2e0
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rax
cmpq -0x98(%rbp), %rax
jl 0x5e200
movq -0x98(%rbp), %rax
subq $0x1, %rax
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rcx
xorl %eax, %eax
cmpq -0x98(%rbp), %rcx
movb %al, -0xd1(%rbp)
jge 0x5e244
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
movq 0x58(%rcx), %rcx
movq -0x48(%rbp), %rdx
shlq $0x5, %rdx
addq %rdx, %rcx
movslq 0x4(%rcx), %rcx
cmpq %rcx, %rax
setg %al
movb %al, -0xd1(%rbp)
movb -0xd1(%rbp), %al
testb $0x1, %al
jne 0x5e250
jmp 0x5e260
jmp 0x5e252
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
jmp 0x5e208
movq -0x48(%rbp), %rax
cmpq -0x98(%rbp), %rax
jne 0x5e27d
movq -0x90(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x5e74e
jmp 0x5e27f
xorl %eax, %eax
cmpq $0x0, -0x48(%rbp)
movb %al, -0xd2(%rbp)
jl 0x5e2b4
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
movq 0x58(%rcx), %rcx
movq -0x48(%rbp), %rdx
shlq $0x5, %rdx
addq %rdx, %rcx
movslq (%rcx), %rcx
cmpq %rcx, %rax
setl %al
movb %al, -0xd2(%rbp)
movb -0xd2(%rbp), %al
testb $0x1, %al
jne 0x5e2c0
jmp 0x5e2d0
jmp 0x5e2c2
movq -0x48(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x48(%rbp)
jmp 0x5e27f
cmpq $0x0, -0x48(%rbp)
jge 0x5e2df
movq $0x0, -0x48(%rbp)
movq $0x0, -0x88(%rbp)
movq $0x0, -0x80(%rbp)
movq $-0x1, -0xb0(%rbp)
movq $-0x1, -0xa8(%rbp)
movq -0x48(%rbp), %rcx
xorl %eax, %eax
cmpq -0x98(%rbp), %rcx
movb %al, -0xd3(%rbp)
jge 0x5e340
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x48(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movslq (%rax), %rax
cmpq -0x28(%rbp), %rax
setl %al
movb %al, -0xd3(%rbp)
movb -0xd3(%rbp), %al
testb $0x1, %al
jne 0x5e34f
jmp 0x5e6b2
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x48(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
cmpl $-0x1, 0xc(%rax)
jne 0x5e36d
jmp 0x5e6a1
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x48(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movslq (%rax), %rax
movq %rax, -0x50(%rbp)
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x48(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movl 0x4(%rax), %eax
addl $0x1, %eax
cltq
movq %rax, -0x58(%rbp)
movq -0x20(%rbp), %rax
cmpq -0x50(%rbp), %rax
jl 0x5e3bd
movq -0x20(%rbp), %rax
movq %rax, -0xe0(%rbp)
jmp 0x5e3c8
movq -0x50(%rbp), %rax
movq %rax, -0xe0(%rbp)
movq -0xe0(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x28(%rbp), %rax
cmpq -0x58(%rbp), %rax
jg 0x5e3ea
movq -0x28(%rbp), %rax
movq %rax, -0xe8(%rbp)
jmp 0x5e3f5
movq -0x58(%rbp), %rax
movq %rax, -0xe8(%rbp)
movq -0xe8(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
cmpq -0x68(%rbp), %rax
jle 0x5e41b
movq -0x70(%rbp), %rax
subq -0x68(%rbp), %rax
movq %rax, -0xf0(%rbp)
jmp 0x5e426
xorl %eax, %eax
movq %rax, -0xf0(%rbp)
jmp 0x5e426
movq -0xf0(%rbp), %rax
movq %rax, -0x78(%rbp)
cmpq $0x0, -0x78(%rbp)
jne 0x5e43d
jmp 0x5e6a1
movq -0x78(%rbp), %rax
addq -0x88(%rbp), %rax
movq %rax, -0x88(%rbp)
movq -0x78(%rbp), %rax
movq -0x58(%rbp), %rcx
subq -0x50(%rbp), %rcx
cmpq %rcx, %rax
jne 0x5e482
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x48(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movswq 0x14(%rax), %rax
addq -0x80(%rbp), %rax
movq %rax, -0x80(%rbp)
jmp 0x5e4c9
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x48(%rbp), %rcx
shlq $0x5, %rcx
movswl 0x14(%rax,%rcx), %eax
cvtsi2sd %eax, %xmm1
cvtsi2sdq -0x78(%rbp), %xmm0
mulsd %xmm0, %xmm1
movq -0x58(%rbp), %rax
subq -0x50(%rbp), %rax
cvtsi2sd %rax, %xmm0
divsd %xmm0, %xmm1
cvtsi2sdq -0x80(%rbp), %xmm0
addsd %xmm1, %xmm0
cvttsd2si %xmm0, %rax
movq %rax, -0x80(%rbp)
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x48(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movswl 0x14(%rax), %eax
cmpl $0x0, %eax
jle 0x5e4f0
movq $0x0, -0xa0(%rbp)
cmpq $0x0, -0xa0(%rbp)
je 0x5e69f
movq -0x68(%rbp), %rax
subq -0x50(%rbp), %rax
movq %rax, -0xc0(%rbp)
movq -0x58(%rbp), %rax
subq -0x70(%rbp), %rax
movq %rax, -0xb8(%rbp)
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x48(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movl 0xc(%rax), %eax
addl $0x1, %eax
cltq
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rax
movq -0x10(%rbp), %rcx
movq 0x58(%rcx), %rcx
movq -0x48(%rbp), %rdx
shlq $0x5, %rdx
addq %rdx, %rcx
movl 0x4(%rcx), %ecx
addl $0x1, %ecx
movq -0x10(%rbp), %rdx
movq 0x58(%rdx), %rdx
movq -0x48(%rbp), %rsi
shlq $0x5, %rsi
addq %rsi, %rdx
subl (%rdx), %ecx
movslq %ecx, %rcx
subq %rcx, %rax
movq %rax, -0x50(%rbp)
movq -0x30(%rbp), %rax
cmpq -0x50(%rbp), %rax
jl 0x5e58e
movq -0x30(%rbp), %rax
movq %rax, -0xf8(%rbp)
jmp 0x5e599
movq -0x50(%rbp), %rax
movq %rax, -0xf8(%rbp)
movq -0xf8(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x38(%rbp), %rax
cmpq -0x58(%rbp), %rax
jg 0x5e5bb
movq -0x38(%rbp), %rax
movq %rax, -0x100(%rbp)
jmp 0x5e5c6
movq -0x58(%rbp), %rax
movq %rax, -0x100(%rbp)
movq -0x100(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
cmpq -0x68(%rbp), %rax
jle 0x5e5ec
movq -0x70(%rbp), %rax
subq -0x68(%rbp), %rax
movq %rax, -0x108(%rbp)
jmp 0x5e5f7
xorl %eax, %eax
movq %rax, -0x108(%rbp)
jmp 0x5e5f7
movq -0x108(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x68(%rbp), %rax
subq -0x50(%rbp), %rax
movq %rax, -0xd0(%rbp)
movq -0x58(%rbp), %rax
subq -0x70(%rbp), %rax
movq %rax, -0xc8(%rbp)
cmpq $0x0, -0x78(%rbp)
je 0x5e692
movq -0xc0(%rbp), %rax
cmpq -0xd0(%rbp), %rax
jne 0x5e692
movq -0xd0(%rbp), %rax
cmpq -0xd0(%rbp), %rax
jne 0x5e692
cmpq $-0x1, -0xb0(%rbp)
jne 0x5e669
movq -0x68(%rbp), %rax
movq %rax, -0xa8(%rbp)
movq -0x70(%rbp), %rax
movq %rax, -0xb0(%rbp)
jmp 0x5e690
movq -0xb0(%rbp), %rax
cmpq -0x68(%rbp), %rax
jne 0x5e683
movq -0x70(%rbp), %rax
movq %rax, -0xb0(%rbp)
jmp 0x5e68e
movq $0x0, -0xa0(%rbp)
jmp 0x5e690
jmp 0x5e69d
movq $0x0, -0xa0(%rbp)
jmp 0x5e69f
jmp 0x5e6a1
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
jmp 0x5e308
movq -0x28(%rbp), %rax
subq -0x20(%rbp), %rax
subq -0x88(%rbp), %rax
cvtsi2sd %rax, %xmm0
movsd -0x40(%rbp), %xmm2
cvtsi2sdq -0x80(%rbp), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
cvttsd2si %xmm0, %rax
movq %rax, -0x80(%rbp)
cmpq $0x0, 0x10(%rbp)
je 0x5e746
cmpq $0x0, -0xa0(%rbp)
je 0x5e746
movq -0x28(%rbp), %rax
subq -0x20(%rbp), %rax
cmpq -0x88(%rbp), %rax
jne 0x5e746
movq -0x28(%rbp), %rax
subq -0x20(%rbp), %rax
movq -0xb0(%rbp), %rcx
subq -0xa8(%rbp), %rcx
cmpq %rcx, %rax
jne 0x5e744
movq -0xa8(%rbp), %rax
cmpq -0x30(%rbp), %rax
jne 0x5e744
movq -0xb0(%rbp), %rax
cmpq -0x38(%rbp), %rax
jne 0x5e744
movq 0x10(%rbp), %rax
movq $0x1, (%rax)
jmp 0x5e746
movq -0x80(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x110, %rsp            # imm = 0x110
popq %rbp
retq
nopl (%rax,%rax)