// File: chhylp123[P]hifiasm/ecovlp.cpp
// Function: cns_gen0(overlap_region*, All_reads*, unsigned long, unsigned long, unsigned long, UC_Read*, cc_idx_t*, unsigned long, double, asg32_v*, unsigned int*)
uint64_t cns_gen0(overlap_region* ol, All_reads *rref, uint64_t s, uint64_t e, uint64_t ql, UC_Read* tu, cc_idx_t *idx, uint64_t occ_tot, double occ_max, asg32_v* b32, uint32_t *rc)
{
    if(e > s + simp_vote_len) return 0;///too long

    uint64_t *id_a = NULL, id_n, an = 0, oc[2]; b32->n = 0; uint32_t m, *a = NULL;
    id_n = iter_cc_idx_t(ol, idx, s, e, idx->rr, ((s==e)?1:0), &id_a);
    // debug_inter0(ol, idx->c_idx, idx->idx->a + idx->i0, idx->srt_n - idx->i0, id_a, id_n, s, e, ((s==e)?1:0), 0, "-1-");
    uint64_t k, l, q[2], os, oe; ul_ov_t *p; overlap_region *z; idx->rr = 0;
    // fprintf(stderr, "[M::%s] [%lu, %lu) id_n::%lu\n", __func__, s, e, id_n);
    for (k = 0; k < id_n; k++) {
        p = &(idx->c_idx[id_a[k]]); z = &(ol[ovlp_id(*p)]); 
        q[0] = z->w_list.a[ovlp_cur_wid(*p)].x_start+ovlp_bd(*p);
        q[1] = z->w_list.a[ovlp_cur_wid(*p)].x_end+1-ovlp_bd(*p);

        // if(s == 11851 && e == 11853) {
        //     fprintf(stderr, "[M::%s] tid::%u\t%.*s\twid::%u\tq::[%u, %u)\terr::%d\toerr::%u\n", __func__, ol[ovlp_id(*p)].y_id, (int)Get_NAME_LENGTH(R_INF, ol[ovlp_id(*p)].y_id), Get_NAME(R_INF, ol[ovlp_id(*p)].y_id),
        //         ovlp_cur_wid(*p), ol[ovlp_id(*p)].w_list.a[ovlp_cur_wid(*p)].x_start, ol[ovlp_id(*p)].w_list.a[ovlp_cur_wid(*p)].x_end+1, ol[ovlp_id(*p)].w_list.a[ovlp_cur_wid(*p)].error, ol[ovlp_id(*p)].non_homopolymer_errors);
        // }
        
        if(q[1] <= e) idx->rr = 1;
        os = MAX(q[0], s); oe = MIN(q[1], e);
        // if((oe > os) || ((s == e) && (s >= q[0]) && (s <= q[1]))) {
        if((oe > os) || ((s == e) && (s > q[0]) && (s < q[1]))) {
        // if(oe >= os) {
            ///[-4-][-12-][-4-][-12-]
            ///[cigar_len][cigar][base_len][base]
            m = extract_sub_cigar_ii(z, ql, rref, os, oe, s, e, tu, p); an++;
            if(m != ((uint32_t)-1)) {///no gap in both sides
                kv_push(uint32_t, *b32, m);
            }
        }
    }

    oc[0] = b32->n; oc[1] = an + 1; //+1 for the reference read
    // if(s == 11851 && e == 11853) {
    //     fprintf(stderr, "-0-[M::%s] oc[0]::%lu, oc[1]::%lu\n", __func__, oc[0], oc[1]);
    // }
    if(((oc[0] > (oc[1]*occ_max)) && (oc[0] > (oc[1]-oc[0])) && (oc[1] >= occ_tot) && (oc[0] > 1))) {
        radix_sort_ec32(b32->a, b32->a+b32->n); an = 0;
        for (k = 1, l = 0; k <= b32->n; ++k) {
            if (k == b32->n || b32->a[k] != b32->a[l]) {
                if(k - l > an) {
                    an = k - l; a = b32->a + l;
                }
                l = k;
            }
        }      
        oc[0] = an;
        // fprintf(stderr, "-1-[M::%s] oc[0]::%lu, oc[1]::%lu\n", __func__, oc[0], oc[1]);
        if(((oc[0] > (oc[1]*occ_max)) && (oc[0] > (oc[1]-oc[0])) && (oc[1] >= occ_tot) && (oc[0] > 1))) {
            (*rc) = a[0];
            // prt_cigar0((a[0]<<4)>>20, a[0]>>28);
            // prt_bp0((a[0]<<20)>>20, (a[0]<<16)>>28);
            return 1;
        }
    }

    idx->ru = 1;
    return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xf0, %rsp
movq 0x28(%rbp), %rax
movq 0x20(%rbp), %rax
movq 0x18(%rbp), %rax
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
movq -0x20(%rbp), %rcx
addq $0x6, %rcx
cmpq %rcx, %rax
jbe 0x24eec6
movq $0x0, -0x8(%rbp)
jmp 0x24f3fc
movq $0x0, -0x48(%rbp)
movq $0x0, -0x58(%rbp)
movq 0x20(%rbp), %rax
movq $0x0, (%rax)
movq $0x0, -0x80(%rbp)
movq -0x10(%rbp), %rdi
movq 0x10(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0x28(%rbp), %rcx
movq 0x10(%rbp), %rax
movq 0x28(%rax), %r8
movq -0x20(%rbp), %r10
movq -0x28(%rbp), %r11
xorl %eax, %eax
movl $0x1, %r9d
cmpq %r11, %r10
cmovel %r9d, %eax
movslq %eax, %r9
leaq -0x48(%rbp), %rax
movq %rax, (%rsp)
callq 0x24e580
movq %rax, -0x50(%rbp)
movq 0x10(%rbp), %rax
movq $0x0, 0x28(%rax)
movq $0x0, -0x88(%rbp)
movq -0x88(%rbp), %rax
cmpq -0x50(%rbp), %rax
jae 0x24f1d8
movq 0x10(%rbp), %rax
movq (%rax), %rax
movq -0x48(%rbp), %rcx
movq -0x88(%rbp), %rdx
imulq $0x1c, (%rcx,%rdx,8), %rcx
addq %rcx, %rax
movq %rax, -0xb8(%rbp)
movq -0x10(%rbp), %rax
movq -0xb8(%rbp), %rcx
movl 0xc(%rcx), %ecx
imulq $0xa8, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0xc0(%rbp)
movq -0xc0(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xb8(%rbp), %rcx
movl (%rcx), %ecx
shlq $0x5, %rcx
addq %rcx, %rax
movl (%rax), %eax
movq -0xb8(%rbp), %rcx
movl 0x18(%rcx), %ecx
andl $0x3fffffff, %ecx       # imm = 0x3FFFFFFF
addl %ecx, %eax
cltq
movq %rax, -0xa0(%rbp)
movq -0xc0(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xb8(%rbp), %rcx
movl (%rcx), %ecx
shlq $0x5, %rcx
addq %rcx, %rax
movl 0x4(%rax), %eax
addl $0x1, %eax
movq -0xb8(%rbp), %rcx
movl 0x18(%rcx), %ecx
andl $0x3fffffff, %ecx       # imm = 0x3FFFFFFF
subl %ecx, %eax
cltq
movq %rax, -0x98(%rbp)
movq -0x98(%rbp), %rax
cmpq -0x28(%rbp), %rax
ja 0x24f021
movq 0x10(%rbp), %rax
movq $0x1, 0x28(%rax)
movq -0xa0(%rbp), %rax
cmpq -0x20(%rbp), %rax
jb 0x24f03e
movq -0xa0(%rbp), %rax
movq %rax, -0xc8(%rbp)
jmp 0x24f049
movq -0x20(%rbp), %rax
movq %rax, -0xc8(%rbp)
movq -0xc8(%rbp), %rax
movq %rax, -0xa8(%rbp)
movq -0x98(%rbp), %rax
cmpq -0x28(%rbp), %rax
ja 0x24f074
movq -0x98(%rbp), %rax
movq %rax, -0xd0(%rbp)
jmp 0x24f07f
movq -0x28(%rbp), %rax
movq %rax, -0xd0(%rbp)
movq -0xd0(%rbp), %rax
movq %rax, -0xb0(%rbp)
movq -0xb0(%rbp), %rax
cmpq -0xa8(%rbp), %rax
ja 0x24f0cd
movq -0x20(%rbp), %rax
cmpq -0x28(%rbp), %rax
jne 0x24f1bf
movq -0x20(%rbp), %rax
cmpq -0xa0(%rbp), %rax
jbe 0x24f1bf
movq -0x20(%rbp), %rax
cmpq -0x98(%rbp), %rax
jae 0x24f1bf
movq -0xc0(%rbp), %rdi
movq -0x30(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0xa8(%rbp), %rcx
movq -0xb0(%rbp), %r8
movq -0x20(%rbp), %r9
movq -0x28(%rbp), %r11
movq -0x38(%rbp), %r10
movq -0xb8(%rbp), %rax
movq %r11, (%rsp)
movq %r10, 0x8(%rsp)
movq %rax, 0x10(%rsp)
callq 0x24bc40
movl %eax, -0x74(%rbp)
movq -0x58(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x58(%rbp)
cmpl $-0x1, -0x74(%rbp)
je 0x24f1bd
jmp 0x24f12b
movq 0x20(%rbp), %rax
movq (%rax), %rax
movq 0x20(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jne 0x24f19c
movq 0x20(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0x24f15b
movq 0x20(%rbp), %rax
movq 0x8(%rax), %rax
shlq %rax
movq %rax, -0xd8(%rbp)
jmp 0x24f169
movl $0x2, %eax
movq %rax, -0xd8(%rbp)
jmp 0x24f169
movq -0xd8(%rbp), %rcx
movq 0x20(%rbp), %rax
movq %rcx, 0x8(%rax)
movq 0x20(%rbp), %rax
movq 0x10(%rax), %rdi
movq 0x20(%rbp), %rax
movq 0x8(%rax), %rsi
shlq $0x2, %rsi
callq 0x2360
movq %rax, %rcx
movq 0x20(%rbp), %rax
movq %rcx, 0x10(%rax)
movl -0x74(%rbp), %edx
movq 0x20(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x20(%rbp), %rsi
movq (%rsi), %rcx
movq %rcx, %rdi
addq $0x1, %rdi
movq %rdi, (%rsi)
movl %edx, (%rax,%rcx,4)
jmp 0x24f1bd
jmp 0x24f1bf
jmp 0x24f1c1
movq -0x88(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x88(%rbp)
jmp 0x24ef43
movq 0x20(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x70(%rbp)
movq -0x58(%rbp), %rax
incq %rax
movq %rax, -0x68(%rbp)
movaps 0x132e1b(%rip), %xmm3   # 0x382010
movq -0x70(%rbp), %xmm0
punpckldq %xmm3, %xmm0    # xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
movapd 0x132e1a(%rip), %xmm2   # 0x382020
subpd %xmm2, %xmm0
movaps %xmm0, %xmm1
unpckhpd %xmm0, %xmm0            # xmm0 = xmm0[1,1]
addsd %xmm1, %xmm0
movq -0x68(%rbp), %xmm1
punpckldq %xmm3, %xmm1    # xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
subpd %xmm2, %xmm1
movaps %xmm1, %xmm2
unpckhpd %xmm1, %xmm1            # xmm1 = xmm1[1,1]
addsd %xmm2, %xmm1
mulsd -0x40(%rbp), %xmm1
ucomisd %xmm1, %xmm0
jbe 0x24f3e8
movq -0x70(%rbp), %rax
movq -0x68(%rbp), %rcx
subq -0x70(%rbp), %rcx
cmpq %rcx, %rax
jbe 0x24f3e8
movq -0x68(%rbp), %rax
cmpq 0x18(%rbp), %rax
jb 0x24f3e8
cmpq $0x1, -0x70(%rbp)
jbe 0x24f3e8
movq 0x20(%rbp), %rax
movq 0x10(%rax), %rdi
movq 0x20(%rbp), %rax
movq 0x10(%rax), %rsi
movq 0x20(%rbp), %rax
movq (%rax), %rax
shlq $0x2, %rax
addq %rax, %rsi
callq 0x24a740
movq $0x0, -0x58(%rbp)
movq $0x1, -0x88(%rbp)
movq $0x0, -0x90(%rbp)
movq -0x88(%rbp), %rax
movq 0x20(%rbp), %rcx
cmpq (%rcx), %rax
ja 0x24f35c
movq -0x88(%rbp), %rax
movq 0x20(%rbp), %rcx
cmpq (%rcx), %rax
je 0x24f2f5
movq 0x20(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x88(%rbp), %rcx
movl (%rax,%rcx,4), %eax
movq 0x20(%rbp), %rcx
movq 0x10(%rcx), %rcx
movq -0x90(%rbp), %rdx
cmpl (%rcx,%rdx,4), %eax
je 0x24f343
movq -0x88(%rbp), %rax
subq -0x90(%rbp), %rax
cmpq -0x58(%rbp), %rax
jbe 0x24f335
movq -0x88(%rbp), %rax
subq -0x90(%rbp), %rax
movq %rax, -0x58(%rbp)
movq 0x20(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x90(%rbp), %rcx
shlq $0x2, %rcx
addq %rcx, %rax
movq %rax, -0x80(%rbp)
movq -0x88(%rbp), %rax
movq %rax, -0x90(%rbp)
jmp 0x24f345
movq -0x88(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x88(%rbp)
jmp 0x24f2ab
movq -0x58(%rbp), %rax
movq %rax, -0x70(%rbp)
movaps 0x132ca5(%rip), %xmm3   # 0x382010
movq -0x70(%rbp), %xmm0
punpckldq %xmm3, %xmm0    # xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
movapd 0x132ca4(%rip), %xmm2   # 0x382020
subpd %xmm2, %xmm0
movaps %xmm0, %xmm1
unpckhpd %xmm0, %xmm0            # xmm0 = xmm0[1,1]
addsd %xmm1, %xmm0
movq -0x68(%rbp), %xmm1
punpckldq %xmm3, %xmm1    # xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
subpd %xmm2, %xmm1
movaps %xmm1, %xmm2
unpckhpd %xmm1, %xmm1            # xmm1 = xmm1[1,1]
addsd %xmm2, %xmm1
mulsd -0x40(%rbp), %xmm1
ucomisd %xmm1, %xmm0
jbe 0x24f3e6
movq -0x70(%rbp), %rax
movq -0x68(%rbp), %rcx
subq -0x70(%rbp), %rcx
cmpq %rcx, %rax
jbe 0x24f3e6
movq -0x68(%rbp), %rax
cmpq 0x18(%rbp), %rax
jb 0x24f3e6
cmpq $0x1, -0x70(%rbp)
jbe 0x24f3e6
movq -0x80(%rbp), %rax
movl (%rax), %ecx
movq 0x28(%rbp), %rax
movl %ecx, (%rax)
movq $0x1, -0x8(%rbp)
jmp 0x24f3fc
jmp 0x24f3e8
movq 0x10(%rbp), %rax
movq $0x1, 0x30(%rax)
movq $0x0, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0xf0, %rsp
popq %rbp
retq
nopl (%rax)