// File: chhylp123[P]hifiasm/hic.cpp
// Function: purge_phase(ha_ug_index*, mmhap_t*, unsigned long, unsigned long, hc_links*, kvec_pe_hit*, bubble_type*, ps_t*, kv_u_trans_t*, unsigned char*, unsigned int*, kv_u_trans_t*, asg64_v*)
void purge_phase(ha_ug_index* idx, mmhap_t *hh, uint64_t hapid, uint64_t max_round, hc_links *link, kvec_pe_hit* hits,
bubble_type *bub, ps_t *s, kv_u_trans_t *k_trans, uint8_t *del, uint32_t *bidx, kv_u_trans_t *ref, asg64_v *srt)
{
    uint64_t k, len; uint32_t *bm;
    ma_ug_t *ug = idx->ug;
    if(max_round <= 0) {
        for (k = 0; k < ug->g->n_seq; k++) {
            if(hh->h.a[k].n >= hh->h.a[k].m) continue;
            hh->a.a[hh->h.a[k].a+hh->h.a[k].n] = hapid;
            hh->h.a[k].n++;
        }
        return;
    }

    for (k = 0; k < ug->g->n_seq; k++) {
        del[k] = 0; s->s[k] = 0;
        if(hh->h.a[k].n >= hh->h.a[k].m) {///all haplotypes have been set
            bub->index[k] = (uint32_t)-1; del[k] = 1;
        } else {
            if(IF_HOM(k, (*bub))) bub->index[k] = bub->num.n;
        }
        bidx[k] = bub->index[k];
    }
    bm = bub->index; bub->index = bidx; bidx = bm;

    kv_resize(u_trans_t, *ref, idx->t_ch->k_trans.n); ref->n = idx->t_ch->k_trans.n;
    memcpy(ref->a, idx->t_ch->k_trans.a, ref->n*sizeof((*(ref->a))));
    kv_resize(uint64_t, ref->idx, idx->t_ch->k_trans.idx.n); ref->idx.n = idx->t_ch->k_trans.idx.n;
    memcpy(ref->idx.a, idx->t_ch->k_trans.idx.a, ref->idx.n*sizeof((*(ref->idx.a))));
    exchange_kv_u_trans_t(ref, &(idx->t_ch->k_trans));

    for (k = 0; k < max_round; k++) {
        clean_trans_ovlp(bub, &(idx->t_ch->k_trans), ref, ((k+1)<max_round)?srt:NULL, ug);
        purge_phase_0(idx, link, bub, s, hits, k_trans, del, hh);
    }

    for (k = len = 0; k < ug->g->n_seq; k++) {
        if(del[k] != 2) {
            if((hh->h.a[k].n == hh->h.a[k].m) && (hh->h.a[k].m == ((uint64_t)asm_opt.polyploidy))) {
                len += ug->g->seq[k].len;
            }
            continue;
        }
        assert(hh->h.a[k].n < hh->h.a[k].m);
        hh->a.a[hh->h.a[k].a+hh->h.a[k].n] = hapid;
        hh->h.a[k].n++; len += ug->g->seq[k].len;
    }
    fprintf(stderr, "[M::%s::stat] # hap%lu bases: %lu\n", __func__, hapid+1, len);
    
    bm = bub->index; bub->index = bidx; bidx = bm;
    exchange_kv_u_trans_t(ref, &(idx->t_ch->k_trans));
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x80, %rsp
movq 0x40(%rbp), %rax
movq 0x38(%rbp), %rax
movq 0x30(%rbp), %rax
movq 0x28(%rbp), %rax
movq 0x20(%rbp), %rax
movq 0x18(%rbp), %rax
movq 0x10(%rbp), %rax
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq %r8, -0x28(%rbp)
movq %r9, -0x30(%rbp)
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x50(%rbp)
cmpq $0x0, -0x20(%rbp)
ja 0x20cb1b
movq $0x0, -0x38(%rbp)
movq -0x38(%rbp), %rax
movq -0x50(%rbp), %rcx
movq 0x18(%rcx), %rcx
movl 0x14(%rcx), %ecx
andl $0x7fffffff, %ecx       # imm = 0x7FFFFFFF
movl %ecx, %ecx
cmpq %rcx, %rax
jae 0x20cb16
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0xc, -0x38(%rbp), %rcx
addq %rcx, %rax
movl (%rax), %eax
movq -0x10(%rbp), %rcx
movq 0x10(%rcx), %rcx
imulq $0xc, -0x38(%rbp), %rdx
addq %rdx, %rcx
cmpl 0x4(%rcx), %eax
jb 0x20cab6
jmp 0x20cb05
movq -0x18(%rbp), %rax
movl %eax, %edx
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x10(%rbp), %rcx
movq 0x10(%rcx), %rcx
imulq $0xc, -0x38(%rbp), %rsi
addq %rsi, %rcx
movl 0x8(%rcx), %ecx
movq -0x10(%rbp), %rsi
movq 0x10(%rsi), %rsi
imulq $0xc, -0x38(%rbp), %rdi
addq %rdi, %rsi
addl (%rsi), %ecx
movl %ecx, %ecx
movl %edx, (%rax,%rcx,4)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0xc, -0x38(%rbp), %rcx
addq %rcx, %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
jmp 0x20ca6d
jmp 0x20d129
movq $0x0, -0x38(%rbp)
movq -0x38(%rbp), %rax
movq -0x50(%rbp), %rcx
movq 0x18(%rcx), %rcx
movl 0x14(%rcx), %ecx
andl $0x7fffffff, %ecx       # imm = 0x7FFFFFFF
movl %ecx, %ecx
cmpq %rcx, %rax
jae 0x20cc0b
movq 0x28(%rbp), %rax
movq -0x38(%rbp), %rcx
movb $0x0, (%rax,%rcx)
movq 0x18(%rbp), %rax
movq (%rax), %rax
movq -0x38(%rbp), %rcx
movb $0x0, (%rax,%rcx)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0xc, -0x38(%rbp), %rcx
addq %rcx, %rax
movl (%rax), %eax
movq -0x10(%rbp), %rcx
movq 0x10(%rcx), %rcx
imulq $0xc, -0x38(%rbp), %rdx
addq %rdx, %rcx
cmpl 0x4(%rcx), %eax
jb 0x20cba5
movq 0x10(%rbp), %rax
movq (%rax), %rax
movq -0x38(%rbp), %rcx
movl $0xffffffff, (%rax,%rcx,4) # imm = 0xFFFFFFFF
movq 0x28(%rbp), %rax
movq -0x38(%rbp), %rcx
movb $0x1, (%rax,%rcx)
jmp 0x20cbe1
movq 0x10(%rbp), %rax
movq (%rax), %rax
movq -0x38(%rbp), %rcx
movl (%rax,%rcx,4), %eax
movq 0x10(%rbp), %rcx
movq 0x80(%rcx), %rcx
addq $0x1, %rcx
cmpq %rcx, %rax
jbe 0x20cbdf
movq 0x10(%rbp), %rax
movq 0x30(%rax), %rax
movl %eax, %edx
movq 0x10(%rbp), %rax
movq (%rax), %rax
movq -0x38(%rbp), %rcx
movl %edx, (%rax,%rcx,4)
jmp 0x20cbe1
movq 0x10(%rbp), %rax
movq (%rax), %rax
movq -0x38(%rbp), %rcx
movl (%rax,%rcx,4), %edx
movq 0x30(%rbp), %rax
movq -0x38(%rbp), %rcx
movl %edx, (%rax,%rcx,4)
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
jmp 0x20cb23
movq 0x10(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x48(%rbp)
movq 0x30(%rbp), %rcx
movq 0x10(%rbp), %rax
movq %rcx, (%rax)
movq -0x48(%rbp), %rax
movq %rax, 0x30(%rbp)
movq 0x38(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x8(%rbp), %rcx
movq 0x10(%rcx), %rcx
cmpq 0x138(%rcx), %rax
jae 0x20cd15
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x138(%rax), %rcx
movq 0x38(%rbp), %rax
movq %rcx, 0x8(%rax)
movq 0x38(%rbp), %rax
movq 0x8(%rax), %rcx
addq $-0x1, %rcx
movq %rcx, 0x8(%rax)
movq 0x38(%rbp), %rax
movq 0x8(%rax), %rcx
shrq %rcx
movq 0x38(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq 0x38(%rbp), %rax
movq 0x8(%rax), %rcx
shrq $0x2, %rcx
movq 0x38(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq 0x38(%rbp), %rax
movq 0x8(%rax), %rcx
shrq $0x4, %rcx
movq 0x38(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq 0x38(%rbp), %rax
movq 0x8(%rax), %rcx
shrq $0x8, %rcx
movq 0x38(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq 0x38(%rbp), %rax
movq 0x8(%rax), %rcx
shrq $0x10, %rcx
movq 0x38(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq 0x38(%rbp), %rax
movq 0x8(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x8(%rax)
movq 0x38(%rbp), %rax
movq 0x10(%rax), %rdi
movq 0x38(%rbp), %rax
imulq $0x30, 0x8(%rax), %rsi
callq 0x2360
movq %rax, %rcx
movq 0x38(%rbp), %rax
movq %rcx, 0x10(%rax)
jmp 0x20cd17
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x138(%rax), %rcx
movq 0x38(%rbp), %rax
movq %rcx, (%rax)
movq 0x38(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x148(%rax), %rsi
movq 0x38(%rbp), %rax
imulq $0x30, (%rax), %rdx
callq 0x2180
movq 0x38(%rbp), %rax
movq 0x20(%rax), %rax
movq -0x8(%rbp), %rcx
movq 0x10(%rcx), %rcx
cmpq 0x150(%rcx), %rax
jae 0x20ce40
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x150(%rax), %rcx
movq 0x38(%rbp), %rax
movq %rcx, 0x20(%rax)
movq 0x38(%rbp), %rax
movq 0x20(%rax), %rcx
addq $-0x1, %rcx
movq %rcx, 0x20(%rax)
movq 0x38(%rbp), %rax
movq 0x20(%rax), %rcx
shrq %rcx
movq 0x38(%rbp), %rax
orq 0x20(%rax), %rcx
movq %rcx, 0x20(%rax)
movq 0x38(%rbp), %rax
movq 0x20(%rax), %rcx
shrq $0x2, %rcx
movq 0x38(%rbp), %rax
orq 0x20(%rax), %rcx
movq %rcx, 0x20(%rax)
movq 0x38(%rbp), %rax
movq 0x20(%rax), %rcx
shrq $0x4, %rcx
movq 0x38(%rbp), %rax
orq 0x20(%rax), %rcx
movq %rcx, 0x20(%rax)
movq 0x38(%rbp), %rax
movq 0x20(%rax), %rcx
shrq $0x8, %rcx
movq 0x38(%rbp), %rax
orq 0x20(%rax), %rcx
movq %rcx, 0x20(%rax)
movq 0x38(%rbp), %rax
movq 0x20(%rax), %rcx
shrq $0x10, %rcx
movq 0x38(%rbp), %rax
orq 0x20(%rax), %rcx
movq %rcx, 0x20(%rax)
movq 0x38(%rbp), %rax
movq 0x20(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x20(%rax)
movq 0x38(%rbp), %rax
movq 0x28(%rax), %rdi
movq 0x38(%rbp), %rax
movq 0x20(%rax), %rsi
shlq $0x3, %rsi
callq 0x2360
movq %rax, %rcx
movq 0x38(%rbp), %rax
movq %rcx, 0x28(%rax)
jmp 0x20ce42
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x150(%rax), %rcx
movq 0x38(%rbp), %rax
movq %rcx, 0x18(%rax)
movq 0x38(%rbp), %rax
movq 0x28(%rax), %rdi
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x160(%rax), %rsi
movq 0x38(%rbp), %rax
movq 0x18(%rax), %rdx
shlq $0x3, %rdx
callq 0x2180
movq 0x38(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rsi
addq $0x138, %rsi            # imm = 0x138
callq 0x20c020
movq $0x0, -0x38(%rbp)
movq -0x38(%rbp), %rax
cmpq -0x20(%rbp), %rax
jae 0x20cf49
movq 0x10(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
addq $0x138, %rax            # imm = 0x138
movq %rax, -0x60(%rbp)
movq 0x38(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x38(%rbp), %rax
addq $0x1, %rax
cmpq -0x20(%rbp), %rax
jae 0x20cee9
movq 0x40(%rbp), %rax
movq %rax, -0x70(%rbp)
jmp 0x20cef1
xorl %eax, %eax
movq %rax, -0x70(%rbp)
jmp 0x20cef1
movq -0x58(%rbp), %rdx
movq -0x60(%rbp), %rsi
movq -0x68(%rbp), %rdi
movq -0x70(%rbp), %rcx
movq -0x50(%rbp), %r8
callq 0x20c2b0
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rsi
movq 0x10(%rbp), %rdx
movq 0x18(%rbp), %rcx
movq -0x30(%rbp), %r8
movq 0x20(%rbp), %r9
movq 0x28(%rbp), %r10
movq -0x10(%rbp), %rax
movq %r10, (%rsp)
movq %rax, 0x8(%rsp)
callq 0x20bc40
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
jmp 0x20cea1
movq $0x0, -0x40(%rbp)
movq $0x0, -0x38(%rbp)
movq -0x38(%rbp), %rax
movq -0x50(%rbp), %rcx
movq 0x18(%rcx), %rcx
movl 0x14(%rcx), %ecx
andl $0x7fffffff, %ecx       # imm = 0x7FFFFFFF
movl %ecx, %ecx
cmpq %rcx, %rax
jae 0x20d0c8
movq 0x28(%rbp), %rax
movq -0x38(%rbp), %rcx
movzbl (%rax,%rcx), %eax
cmpl $0x2, %eax
je 0x20cffe
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0xc, -0x38(%rbp), %rcx
addq %rcx, %rax
movl (%rax), %eax
movq -0x10(%rbp), %rcx
movq 0x10(%rcx), %rcx
imulq $0xc, -0x38(%rbp), %rdx
addq %rdx, %rcx
cmpl 0x4(%rcx), %eax
jne 0x20cff9
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0xc, -0x38(%rbp), %rcx
addq %rcx, %rax
movl 0x4(%rax), %eax
leaq 0x1b782d(%rip), %rcx    # 0x3c47f8
movslq 0x1bc(%rcx), %rcx
cmpq %rcx, %rax
jne 0x20cff9
movq -0x50(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x20(%rax), %rax
movq -0x38(%rbp), %rcx
movl (%rax,%rcx,8), %eax
andl $0x7fffffff, %eax       # imm = 0x7FFFFFFF
movl %eax, %eax
addq -0x40(%rbp), %rax
movq %rax, -0x40(%rbp)
jmp 0x20d0b7
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0xc, -0x38(%rbp), %rcx
addq %rcx, %rax
movl (%rax), %eax
movq -0x10(%rbp), %rcx
movq 0x10(%rcx), %rcx
imulq $0xc, -0x38(%rbp), %rdx
addq %rdx, %rcx
cmpl 0x4(%rcx), %eax
jae 0x20d027
jmp 0x20d046
leaq 0x1806a3(%rip), %rdi    # 0x38d6d1
leaq 0x1806b8(%rip), %rsi    # 0x38d6ed
movl $0x44ef, %edx           # imm = 0x44EF
leaq 0x1806b4(%rip), %rcx    # 0x38d6f5
callq 0x2130
movq -0x18(%rbp), %rax
movl %eax, %edx
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x10(%rbp), %rcx
movq 0x10(%rcx), %rcx
imulq $0xc, -0x38(%rbp), %rsi
addq %rsi, %rcx
movl 0x8(%rcx), %ecx
movq -0x10(%rbp), %rsi
movq 0x10(%rsi), %rsi
imulq $0xc, -0x38(%rbp), %rdi
addq %rdi, %rsi
addl (%rsi), %ecx
movl %ecx, %ecx
movl %edx, (%rax,%rcx,4)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0xc, -0x38(%rbp), %rcx
addq %rcx, %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
movq -0x50(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x20(%rax), %rax
movq -0x38(%rbp), %rcx
movl (%rax,%rcx,8), %eax
andl $0x7fffffff, %eax       # imm = 0x7FFFFFFF
movl %eax, %eax
addq -0x40(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
jmp 0x20cf59
movq 0x1b6f11(%rip), %rax    # 0x3c3fe0
movq (%rax), %rdi
movq -0x18(%rbp), %rcx
addq $0x1, %rcx
movq -0x40(%rbp), %r8
leaq 0x1806c3(%rip), %rsi    # 0x38d7a8
leaq 0x1806df(%rip), %rdx    # 0x38d7cb
movb $0x0, %al
callq 0x22a0
movq 0x10(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x48(%rbp)
movq 0x30(%rbp), %rcx
movq 0x10(%rbp), %rax
movq %rcx, (%rax)
movq -0x48(%rbp), %rax
movq %rax, 0x30(%rbp)
movq 0x38(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rsi
addq $0x138, %rsi            # imm = 0x138
callq 0x20c020
addq $0x80, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)