// File: chhylp123[P]hifiasm/Correct.cpp
// Function: refine_khits(overlap_region*, Candidates_list*, Chain_Data*, double)
void refine_khits(overlap_region *z, Candidates_list *cl, Chain_Data *dp, double sgap_rate)
{
    int64_t k, wn = z->w_list.n, aln_n, qs, qe, ts, te, ci, cmi, id, mm_gap = 64; 
    k_mer_hit p; p.self_offset = (uint32_t)-1; p.offset = (uint32_t)-1;
    if(wn <= 0) return;
    qs = qe = ts = te = -1; ci = cmi = z->shared_seed; id = cl->list[ci].readID;
    for (k = aln_n = 0; k < wn; k++) {
        if(z->w_list.a[k].extra_end < 0 && z->w_list.a[k].y_end != -1) {///anchor
            if(qs == -1) {
                qs = z->w_list.a[k].x_start; ts = z->w_list.a[k-1].y_end+1;
            }
            qe = z->w_list.a[k].x_end+1; te = z->w_list.a[k].y_end+1;
        } else {
            if(qs != -1) {
                // fprintf(stderr, "\n[M::%s::] q::[%ld, %ld), t::[%ld, %ld), ci::%ld\n", 
                // __func__, qs, qe, ts, te, ci);
                ci = filter_adp_k_hits(cl->list, cl->length, dp, qs, qe, ts, te, id, ci, &cmi, 
                                                                aln_n?&p:NULL, sgap_rate, mm_gap);                
                p.self_offset = qe - 1; p.offset = te -1;
                aln_n++;//[qs, qe); [ts, te)
            }
            qs = qe = ts = te = -1;
        }
    }
    if(qs != -1) {
        // fprintf(stderr, "\n[M::%s::] q::[%ld, %ld), t::[%ld, %ld), ci::%ld\n", 
        //         __func__, qs, qe, ts, te, ci);
        ci = filter_adp_k_hits(cl->list, cl->length, dp, qs, qe, ts, te, id, ci, &cmi, 
                                                                aln_n?&p:NULL, sgap_rate, mm_gap); 
        p.self_offset = qe - 1; p.offset = te -1;
        aln_n++;//[qs, qe); [ts, te)
    }
    // fprintf(stderr, "\n[M::%s::] q::[%ld, %ld), t::[%ld, %ld), ci::%ld\n", 
    //             __func__, qs, qe, ts, te, ci);
    ci = filter_adp_k_hits(cl->list, cl->length, dp, (uint64_t)-1, (uint64_t)-1, (uint64_t)-1, (uint64_t)-1, id, ci, &cmi, 
                                                            aln_n?&p:NULL, sgap_rate, mm_gap);
    for (k = cmi; k < ci; k++) cl->list[k].readID = ((uint32_t)(0x7fffffff));
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %rbx
subq $0x188, %rsp            # imm = 0x188
movq %rdi, -0x20(%rbp)
movq %rsi, -0x28(%rbp)
movq %rdx, -0x30(%rbp)
movsd %xmm0, -0x38(%rbp)
movq -0x20(%rbp), %rax
movq 0x48(%rax), %rax
movq %rax, -0x48(%rbp)
movq $0x40, -0x90(%rbp)
movl $0xffffffff, -0x98(%rbp) # imm = 0xFFFFFFFF
movl $0xffffffff, -0x9c(%rbp) # imm = 0xFFFFFFFF
cmpq $0x0, -0x48(%rbp)
jg 0x5b608
jmp 0x5bb01
movq $-0x1, -0x70(%rbp)
movq $-0x1, -0x68(%rbp)
movq $-0x1, -0x60(%rbp)
movq $-0x1, -0x58(%rbp)
movq -0x20(%rbp), %rax
movslq 0x24(%rax), %rax
movq %rax, -0x80(%rbp)
movq %rax, -0x78(%rbp)
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq -0x78(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl (%rax), %eax
andl $0x7fffffff, %eax       # imm = 0x7FFFFFFF
movl %eax, %eax
movq %rax, -0x88(%rbp)
movq $0x0, -0x50(%rbp)
movq $0x0, -0x40(%rbp)
movq -0x40(%rbp), %rax
cmpq -0x48(%rbp), %rax
jge 0x5b8ad
movq -0x20(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x40(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movswl 0x12(%rax), %eax
cmpl $0x0, %eax
jge 0x5b73c
movq -0x20(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x40(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
cmpl $-0x1, 0xc(%rax)
je 0x5b73c
cmpq $-0x1, -0x58(%rbp)
jne 0x5b6f9
movq -0x20(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x40(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movslq (%rax), %rax
movq %rax, -0x58(%rbp)
movq -0x20(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x40(%rbp), %rcx
subq $0x1, %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movl 0xc(%rax), %eax
addl $0x1, %eax
cltq
movq %rax, -0x68(%rbp)
movq -0x20(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x40(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movl 0x4(%rax), %eax
addl $0x1, %eax
cltq
movq %rax, -0x60(%rbp)
movq -0x20(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x40(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movl 0xc(%rax), %eax
addl $0x1, %eax
cltq
movq %rax, -0x70(%rbp)
jmp 0x5b89a
cmpq $-0x1, -0x58(%rbp)
je 0x5b87a
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq %rax, -0xe8(%rbp)
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0xe0(%rbp)
movq -0x30(%rbp), %rax
movq %rax, -0xd8(%rbp)
movq -0x58(%rbp), %rax
movq %rax, -0xd0(%rbp)
movq -0x60(%rbp), %rax
movq %rax, -0xc8(%rbp)
movq -0x68(%rbp), %rax
movq %rax, -0xc0(%rbp)
movq -0x70(%rbp), %rax
movq %rax, -0xb8(%rbp)
movq -0x88(%rbp), %rax
movq %rax, -0xb0(%rbp)
movq -0x78(%rbp), %rax
movq %rax, -0xa8(%rbp)
cmpq $0x0, -0x50(%rbp)
je 0x5b7cb
leaq -0xa0(%rbp), %rax
movq %rax, -0xf0(%rbp)
jmp 0x5b7d6
xorl %eax, %eax
movq %rax, -0xf0(%rbp)
jmp 0x5b7d6
movq -0xa8(%rbp), %rbx
movq -0xb0(%rbp), %r14
movq -0xb8(%rbp), %r15
movq -0xc0(%rbp), %r9
movq -0xc8(%rbp), %r8
movq -0xd0(%rbp), %rcx
movq -0xd8(%rbp), %rdx
movq -0xe0(%rbp), %rsi
movq -0xe8(%rbp), %rdi
movq -0xf0(%rbp), %r10
movsd -0x38(%rbp), %xmm0
movq -0x90(%rbp), %rax
leaq -0x80(%rbp), %r11
movq %r15, (%rsp)
movq %r14, 0x8(%rsp)
movq %rbx, 0x10(%rsp)
movq %r11, 0x18(%rsp)
movq %r10, 0x20(%rsp)
movq %rax, 0x28(%rsp)
callq 0x5b300
movq %rax, -0x78(%rbp)
movq -0x60(%rbp), %rax
subq $0x1, %rax
movl %eax, -0x98(%rbp)
movq -0x70(%rbp), %rax
subq $0x1, %rax
movl %eax, -0x9c(%rbp)
movq -0x50(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x50(%rbp)
movq $-0x1, -0x70(%rbp)
movq $-0x1, -0x68(%rbp)
movq $-0x1, -0x60(%rbp)
movq $-0x1, -0x58(%rbp)
jmp 0x5b89c
movq -0x40(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x40(%rbp)
jmp 0x5b66a
cmpq $-0x1, -0x58(%rbp)
je 0x5b9eb
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x138(%rbp)
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x130(%rbp)
movq -0x30(%rbp), %rax
movq %rax, -0x128(%rbp)
movq -0x58(%rbp), %rax
movq %rax, -0x120(%rbp)
movq -0x60(%rbp), %rax
movq %rax, -0x118(%rbp)
movq -0x68(%rbp), %rax
movq %rax, -0x110(%rbp)
movq -0x70(%rbp), %rax
movq %rax, -0x108(%rbp)
movq -0x88(%rbp), %rax
movq %rax, -0x100(%rbp)
movq -0x78(%rbp), %rax
movq %rax, -0xf8(%rbp)
cmpq $0x0, -0x50(%rbp)
je 0x5b93c
leaq -0xa0(%rbp), %rax
movq %rax, -0x140(%rbp)
jmp 0x5b947
xorl %eax, %eax
movq %rax, -0x140(%rbp)
jmp 0x5b947
movq -0xf8(%rbp), %rbx
movq -0x100(%rbp), %r14
movq -0x108(%rbp), %r15
movq -0x110(%rbp), %r9
movq -0x118(%rbp), %r8
movq -0x120(%rbp), %rcx
movq -0x128(%rbp), %rdx
movq -0x130(%rbp), %rsi
movq -0x138(%rbp), %rdi
movq -0x140(%rbp), %r10
movsd -0x38(%rbp), %xmm0
movq -0x90(%rbp), %rax
leaq -0x80(%rbp), %r11
movq %r15, (%rsp)
movq %r14, 0x8(%rsp)
movq %rbx, 0x10(%rsp)
movq %r11, 0x18(%rsp)
movq %r10, 0x20(%rsp)
movq %rax, 0x28(%rsp)
callq 0x5b300
movq %rax, -0x78(%rbp)
movq -0x60(%rbp), %rax
subq $0x1, %rax
movl %eax, -0x98(%rbp)
movq -0x70(%rbp), %rax
subq $0x1, %rax
movl %eax, -0x9c(%rbp)
movq -0x50(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x50(%rbp)
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x168(%rbp)
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x160(%rbp)
movq -0x30(%rbp), %rax
movq %rax, -0x158(%rbp)
movq -0x88(%rbp), %rax
movq %rax, -0x150(%rbp)
movq -0x78(%rbp), %rax
movq %rax, -0x148(%rbp)
cmpq $0x0, -0x50(%rbp)
je 0x5ba43
leaq -0xa0(%rbp), %rax
movq %rax, -0x170(%rbp)
jmp 0x5ba4e
xorl %eax, %eax
movq %rax, -0x170(%rbp)
jmp 0x5ba4e
movq -0x148(%rbp), %rbx
movq -0x150(%rbp), %r14
movq -0x158(%rbp), %rdx
movq -0x160(%rbp), %rsi
movq -0x168(%rbp), %rdi
movq -0x170(%rbp), %r10
movsd -0x38(%rbp), %xmm0
movq -0x90(%rbp), %rax
movq $-0x1, %r9
leaq -0x80(%rbp), %r11
movq %r9, %rcx
movq %r9, %r8
movq $-0x1, (%rsp)
movq %r14, 0x8(%rsp)
movq %rbx, 0x10(%rsp)
movq %r11, 0x18(%rsp)
movq %r10, 0x20(%rsp)
movq %rax, 0x28(%rsp)
callq 0x5b300
movq %rax, -0x78(%rbp)
movq -0x80(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rax
cmpq -0x78(%rbp), %rax
jge 0x5bb01
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq -0x40(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl (%rax), %ecx
andl $0x80000000, %ecx       # imm = 0x80000000
orl $0x7fffffff, %ecx       # imm = 0x7FFFFFFF
movl %ecx, (%rax)
movq -0x40(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x40(%rbp)
jmp 0x5bac7
addq $0x188, %rsp            # imm = 0x188
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
nop