// File: /workspace/github_cpp_makefile_star2_O3/chhylp123[P]hifiasm/Overlaps.cpp
// Function: append_cov_line(unsigned long, unsigned long*, unsigned long*, u_trans_t*, ma_ug_t*, asg_t*, unsigned long, double)
uint32_t append_cov_line(uint64_t uid, uint64_t *qcc, uint64_t *cc, u_trans_t *p, ma_ug_t *ug, asg_t *sg, uint64_t hom_cut, double cut_rate)
{
    uint32_t k, rid; uint64_t qs, qe, oqs, oqe, ovq, ots, ote, no, tot, ava; 
    ma_utg_t *qu, *tu; uint64_t s_shift, e_shift; int64_t itk, itl, l;
    qu = &(ug->u.a[p->qn]); tu = &(ug->u.a[p->tn]);
    if(qu->n <= 0 || tu->n <= 0) return 0;
    if(p->rev) {
        itk = tu->n-1; itl = ((int64_t)(tu->len))-((int64_t)(sg->seq[itk].len));
    } else {
        itk = 0; itl = 0;
    }
    // if(uid == 315 || uid == 1055) {
    //     fprintf(stderr, "*****[M::%s]\tutg%.6lu%c\tqu->n::%u\ttu->n::%u\n", __func__, 
    //             uid+1, "lc"[ug->u.a[uid].circ], (uint32_t)qu->n, (uint32_t)tu->n);
    // }
    for (k = l = 0, tot = ava = 0; k < qu->n; k++) {
        rid = qu->a[k]>>33;
        qs = l; qe = l + sg->seq[rid].len;
        l += (uint32_t)qu->a[k];
        if(qe <= p->qs) continue;
        if(qs >= p->qe) break;
        ///qe > p->qs && qs < p->qe && qe > qs

        oqs = MAX(qs, p->qs); oqe = MIN(qe, p->qe);
        ovq = ((oqe > oqs)? (oqe - oqs):0);
        
        // if(!(ovq > 0)) {
        //     fprintf(stderr, "[M::%s::] qn::%u, tn::%u, q::[%lu, %lu), p->q::[%u, %u)\n", 
        //     __func__, p->qn, p->tn, qs, qe, p->qs, p->qe);
        // }
        if(ovq <= 0) continue;
        assert(ovq > 0);
        if((hom_cut != ((uint64_t)-1)) && (cut_rate >= 0) && (ovq <= (sg->seq[rid].len*0.55))) {
            continue;
        }

        s_shift = get_offset_adjust(oqs-p->qs, p->qe-p->qs, p->te-p->ts);
        e_shift = get_offset_adjust(p->qe-oqe, p->qe-p->qs, p->te-p->ts);
        if(p->rev) {
            ovq = s_shift; s_shift = e_shift; e_shift = ovq;
        }
        ots = p->ts + s_shift; ote = p->te-e_shift;
        if(ote <= ots) continue;
        no = get_ovlp_cov(tu, cc, sg, ots, ote, &itk, &itl, sg->seq[rid].len);
        // if(uid == 315 || uid == 1055) {
        //     fprintf(stderr, "[%u]\trid::%u\tno::%lu\tqcc[k]::%lu\trlen::%u\n", k, rid, no, qcc[k], sg->seq[rid].len);
        // }
        // to = qcc[k] + no;
        // qcc[k] = to;
        if((hom_cut == ((uint64_t)-1)) || (cut_rate < 0)) {
            qcc[k] += no;
        } else {
            tot++; 
            if((qcc[k] + no) <= (hom_cut*((uint64_t)sg->seq[rid].len))) ava++;
        }        
    }

    // if(uid == 315 || uid == 1055) {
    //     fprintf(stderr, "[M::%s]\tutg%.6u%c\t%u\t%u\t%u\t%c\tutg%.6u%c\t%u\t%u\t%u\tis_reliable::%u\tw::%f\n", __func__, 
    //         p->qn+1, "lc"[ug->u.a[p->qn].circ], ug->u.a[p->qn].len, p->qs, p->qe, "+-"[p->rev],
    //         p->tn+1, "lc"[ug->u.a[p->tn].circ], ug->u.a[p->tn].len, p->ts, p->te, ((p->f == RC_0) || (p->f == RC_1))?1:0, p->nw);
    //     fprintf(stderr, "[M::%s]\tutg%.6lu%c\thom_cut::%lu\tcut_rate::%f\tava::%lu\ttot::%lu\n", __func__, 
    //         uid+1, "lc"[ug->u.a[uid].circ], hom_cut, cut_rate, ava, tot);
    // }

    if((hom_cut != ((uint64_t)-1)) && (cut_rate >= 0) && (ava >= (tot*cut_rate))) {
        return 1;
    }
    return 0;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x78, %rsp
movq %rsi, 0x58(%rsp)
movq 0x10(%r8), %rdi
movl 0x8(%rcx), %eax
leaq (%rax,%rax,4), %rsi
movl 0x10(%rdi,%rsi,8), %r10d
xorl %eax, %eax
testq %r10, %r10
je 0xc7af1
movl 0x14(%rcx), %r8d
leaq (%r8,%r8,4), %r8
leaq (%rdi,%r8,8), %r8
movq %r8, 0x50(%rsp)
movl 0x10(%r8), %ebx
testl %ebx, %ebx
je 0xc7af1
leaq (%rdi,%rsi,8), %rax
testb $0x40, 0x28(%rcx)
jne 0xc7878
movq 0x20(%r9), %r11
xorl %ebx, %ebx
xorl %r8d, %r8d
jmp 0xc7898
decl %ebx
movq 0x50(%rsp), %rsi
movl (%rsi), %r8d
movl $0x7fffffff, %esi       # imm = 0x7FFFFFFF
andq %rsi, %r8
movq 0x20(%r9), %r11
movl (%r11,%rbx,8), %edi
andq %rsi, %rdi
subq %rdi, %r8
leaq 0x70(%rsp), %rsi
movq %rbx, (%rsi)
leaq 0x68(%rsp), %rsi
movq %r8, (%rsi)
movq 0x18(%rax), %r14
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
movq %rcx, 0x60(%rsp)
movl (%rcx), %r13d
setae %al
cmpq $-0x1, 0xb0(%rsp)
setne %sil
sete %cl
andb %al, %sil
movb %sil, 0xe(%rsp)
ucomisd %xmm0, %xmm1
seta %al
orb %cl, %al
movb %al, 0xf(%rsp)
xorl %ebx, %ebx
xorl %r15d, %r15d
movq $0x0, 0x28(%rsp)
movq $0x0, 0x30(%rsp)
movsd %xmm0, 0x48(%rsp)
movq %r9, 0x40(%rsp)
movq %rdx, 0x38(%rsp)
movq %r10, 0x20(%rsp)
movq %r11, 0x18(%rsp)
movq %r13, 0x10(%rsp)
movq (%r14,%rbx,8), %rbp
movq %rbp, %rax
shrq $0x21, %rax
movl (%r11,%rax,8), %r12d
andl $0x7fffffff, %r12d      # imm = 0x7FFFFFFF
leaq (%r15,%r12), %rax
cmpq %r13, %rax
jbe 0xc7a86
movq 0x60(%rsp), %rcx
movl 0x4(%rcx), %ecx
cmpq %rcx, %r15
jae 0xc7a97
cmpq %r13, %r15
movq %r13, %rsi
cmovaq %r15, %rsi
cmpq %rcx, %rax
cmovaeq %rcx, %rax
movq %rax, %rdi
movl $0x0, %r8d
subq %rsi, %rdi
cmovaeq %rdi, %r8
jbe 0xc7a86
cmpb $0x0, 0xe(%rsp)
je 0xc799e
xorps %xmm2, %xmm2
cvtsi2sd %r8, %xmm2
xorps %xmm1, %xmm1
cvtsi2sd %r12d, %xmm1
mulsd 0x169be4(%rip), %xmm1   # 0x231578
ucomisd %xmm2, %xmm1
jae 0xc7a86
subl %r13d, %esi
movl %ecx, %edi
subl %r13d, %edi
movq 0x60(%rsp), %r13
movl 0xc(%r13), %r11d
movl 0x10(%r13), %r8d
movl %r8d, %r10d
subl %r11d, %r10d
xorps %xmm3, %xmm3
cvtsi2sd %rsi, %xmm3
xorps %xmm1, %xmm1
cvtsi2sd %rdi, %xmm1
xorps %xmm2, %xmm2
cvtsi2sd %r10, %xmm2
divsd %xmm1, %xmm3
mulsd %xmm2, %xmm3
cvttsd2si %xmm3, %rsi
movl %esi, %esi
subl %eax, %ecx
xorps %xmm3, %xmm3
cvtsi2sd %rcx, %xmm3
divsd %xmm1, %xmm3
mulsd %xmm2, %xmm3
cvttsd2si %xmm3, %rax
movl %eax, %eax
testb $0x40, 0x28(%r13)
movq %rax, %rcx
cmoveq %rsi, %rcx
cmoveq %rax, %rsi
addq %r11, %rcx
subq %rsi, %r8
cmpq %rcx, %r8
jbe 0xc7a77
movq 0x50(%rsp), %rdi
movq %rdx, %rsi
movq %r9, %rdx
leaq 0x70(%rsp), %r9
pushq %r12
leaq 0x70(%rsp), %rax
pushq %rax
callq 0xc7146
addq $0x10, %rsp
cmpb $0x0, 0xf(%rsp)
je 0xc7a47
movq 0x58(%rsp), %rcx
addq %rax, (%rcx,%rbx,8)
jmp 0xc7a67
incq 0x30(%rsp)
movq 0x58(%rsp), %rcx
addq (%rcx,%rbx,8), %rax
imulq 0xb0(%rsp), %r12
cmpq %rax, %r12
sbbq $-0x1, 0x28(%rsp)
movsd 0x48(%rsp), %xmm0
movq 0x40(%rsp), %r9
movq 0x38(%rsp), %rdx
movq 0x20(%rsp), %r10
movq 0x18(%rsp), %r11
movq 0x10(%rsp), %r13
movl %ebp, %eax
addq %rax, %r15
incq %rbx
cmpq %rbx, %r10
jne 0xc791a
cmpb $0x0, 0xe(%rsp)
je 0xc7aef
movsd 0x28(%rsp), %xmm4
movsd 0x1697d4(%rip), %xmm1   # 0x231280
unpcklps %xmm1, %xmm4            # xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1]
movapd 0x1697d9(%rip), %xmm2   # 0x231290
subpd %xmm2, %xmm4
movapd %xmm4, %xmm3
unpckhpd %xmm4, %xmm3            # xmm3 = xmm3[1],xmm4[1]
addsd %xmm4, %xmm3
movsd 0x30(%rsp), %xmm4
unpcklps %xmm1, %xmm4            # xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1]
subpd %xmm2, %xmm4
movapd %xmm4, %xmm1
unpckhpd %xmm4, %xmm1            # xmm1 = xmm1[1],xmm4[1]
addsd %xmm4, %xmm1
mulsd %xmm0, %xmm1
movl $0x1, %eax
ucomisd %xmm1, %xmm3
jae 0xc7af1
xorl %eax, %eax
addq $0x78, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq