// File: /workspace/github_cpp_makefile_star2_O2/chhylp123[P]hifiasm/Overlaps.cpp
// Function: append_cov_line_ug_rid_cov_t(unsigned long, unsigned long*, u_trans_t*, ug_rid_cov_t*, unsigned long, double)
uint32_t append_cov_line_ug_rid_cov_t(uint64_t uid, uint64_t *qcc, u_trans_t *p, ug_rid_cov_t *idx, 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 = &(idx->ug->u.a[p->qn]); tu = &(idx->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)(idx->rg->seq[itk].len));
    } else {
        itk = 0; itl = 0;
    }
    // if(uid == 7929) {
    //     fprintf(stderr, "*****[M::%s]\tutg%.6lu%c\tqu->n::%u\ttu->n::%u\n", __func__, 
    //             uid+1, "lc"[idx->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 + idx->rg->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 <= (idx->rg->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_1(tu, idx->cov.a + idx->idx[p->tn], idx->rg, ots, ote, &itk, &itl, idx->rg->seq[rid].len);
        // if(uid == 7929) {
        //     fprintf(stderr, "[%u]\trid::%u\tno::%lu\tqcc[k]::%lu\trlen::%u\n", 
        //     k, rid, no, qcc[k], idx->rg->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)idx->rg->seq[rid].len))) ava++;
        }        
    }

    // if(uid == 7929) {
    //     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"[idx->ug->u.a[p->qn].circ], idx->ug->u.a[p->qn].len, p->qs, p->qe, "+-"[p->rev],
    //         p->tn+1, "lc"[idx->ug->u.a[p->tn].circ], idx->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"[idx->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 $0x68, %rsp
movq (%rcx), %rax
movq 0x10(%rax), %r11
movl 0x8(%rdx), %eax
imulq $0x28, %rax, %r10
movl 0x10(%r11,%r10), %r14d
xorl %eax, %eax
testq %r14, %r14
je 0x8b256
movq %rdx, %r15
movl 0x14(%rdx), %edi
movq %rdi, 0x50(%rsp)
imulq $0x28, %rdi, %rdx
addq %r11, %rdx
movq %rdx, 0x40(%rsp)
movl 0x10(%rdx), %edx
testl %edx, %edx
je 0x8b256
testb $0x40, 0x28(%r15)
movq %rcx, 0x10(%rsp)
jne 0x8afef
xorl %edx, %edx
xorl %eax, %eax
jmp 0x8b01c
decl %edx
movq 0x40(%rsp), %rax
movl (%rax), %eax
movl $0x7fffffff, %r9d       # imm = 0x7FFFFFFF
andq %r9, %rax
movq 0x10(%rsp), %rcx
movq 0x8(%rcx), %rdi
movq 0x20(%rdi), %rdi
movl (%rdi,%rdx,8), %edi
andq %r9, %rdi
subq %rdi, %rax
movq 0x10(%rsp), %rcx
addq %r10, %r11
leaq 0x60(%rsp), %rdi
movq %rdx, (%rdi)
leaq 0x58(%rsp), %rdx
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
movq %rax, (%rdx)
setae %al
movq %r8, 0x48(%rsp)
cmpq $-0x1, %r8
setne %dil
sete %dl
andb %al, %dil
movb %dil, 0xe(%rsp)
ucomisd %xmm0, %xmm1
seta %al
orb %dl, %al
movb %al, 0xf(%rsp)
xorl %r13d, %r13d
movq $0x0, 0x28(%rsp)
movq $0x0, 0x20(%rsp)
xorl %ebx, %ebx
movsd %xmm0, 0x38(%rsp)
movq %rsi, 0x30(%rsp)
movq %r11, 0x18(%rsp)
cmpq %r13, %r14
je 0x8b1fc
movq 0x18(%r11), %rax
movq (%rax,%r13,8), %r12
movq 0x8(%rcx), %rdx
movq 0x20(%rdx), %rax
movq %r12, %rdi
shrq $0x21, %rdi
movl (%rax,%rdi,8), %ebp
andl $0x7fffffff, %ebp       # imm = 0x7FFFFFFF
leaq (%rbx,%rbp), %rax
movl (%r15), %r10d
cmpq %r10, %rax
jbe 0x8b1ee
movl 0x4(%r15), %ecx
cmpq %rcx, %rbx
jae 0x8b1fc
cmpq %r10, %rbx
movq %r10, %rdi
cmovaq %rbx, %rdi
cmpq %rcx, %rax
cmovaeq %rcx, %rax
movq %rax, %r9
movl $0x0, %r8d
subq %rdi, %r9
cmovaeq %r9, %r8
jbe 0x8b1e9
cmpb $0x0, 0xe(%rsp)
je 0x8b115
cvtsi2sd %r8, %xmm2
cvtsi2sd %ebp, %xmm1
mulsd 0x1583bd(%rip), %xmm1   # 0x1e34c8
ucomisd %xmm2, %xmm1
jae 0x8b1e9
subl %r10d, %edi
movl %ecx, %r9d
subl %r10d, %r9d
movl 0xc(%r15), %r11d
movl 0x10(%r15), %r8d
movl %r8d, %r10d
subl %r11d, %r10d
cvtsi2sd %rdi, %xmm3
cvtsi2sd %r9, %xmm1
cvtsi2sd %r10, %xmm2
divsd %xmm1, %xmm3
mulsd %xmm2, %xmm3
cvttsd2si %xmm3, %rdi
movl %edi, %edi
subl %eax, %ecx
cvtsi2sd %rcx, %xmm3
divsd %xmm1, %xmm3
mulsd %xmm2, %xmm3
cvttsd2si %xmm3, %rax
movl %eax, %eax
testb $0x40, 0x28(%r15)
movq %rax, %rcx
cmoveq %rdi, %rcx
cmoveq %rax, %rdi
addq %r11, %rcx
subq %rdi, %r8
cmpq %rcx, %r8
jbe 0x8b1e4
movq 0x10(%rsp), %rdi
movq 0x10(%rdi), %rax
movq 0x50(%rsp), %rsi
movq (%rax,%rsi,8), %rsi
shlq $0x3, %rsi
addq 0x28(%rdi), %rsi
movq 0x40(%rsp), %rdi
leaq 0x60(%rsp), %r9
pushq %rbp
leaq 0x60(%rsp), %rax
pushq %rax
callq 0x8adda
addq $0x10, %rsp
cmpb $0x0, 0xf(%rsp)
je 0x8b1c1
movq 0x30(%rsp), %rsi
addq %rax, (%rsi,%r13,8)
jmp 0x8b1de
incq 0x28(%rsp)
movq 0x30(%rsp), %rsi
addq (%rsi,%r13,8), %rax
imulq 0x48(%rsp), %rbp
cmpq %rax, %rbp
sbbq $-0x1, 0x20(%rsp)
movsd 0x38(%rsp), %xmm0
movq 0x18(%rsp), %r11
movq 0x10(%rsp), %rcx
movl %r12d, %eax
addq %rax, %rbx
incq %r13
jmp 0x8b086
cmpb $0x0, 0xe(%rsp)
je 0x8b24f
movsd 0x20(%rsp), %xmm4
movsd 0x15805f(%rip), %xmm1   # 0x1e3270
unpcklps %xmm1, %xmm4            # xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1]
movapd 0x158064(%rip), %xmm2   # 0x1e3280
subpd %xmm2, %xmm4
movapd %xmm4, %xmm3
unpckhpd %xmm4, %xmm3            # xmm3 = xmm3[1],xmm4[1]
addsd %xmm4, %xmm3
movsd 0x28(%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
ucomisd %xmm1, %xmm3
jae 0x8b253
xorl %eax, %eax
jmp 0x8b256
pushq $0x1
popq %rax
addq $0x68, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq