// File: chhylp123[P]hifiasm/hic.cpp
// Function: append_trans_hits(ha_ug_index*, hc_links*, bubble_type*, trans_idx*, pe_hit*, unsigned int, unsigned long*, kv_u_trans_t*, kv_u_trans_t*, unsigned int, unsigned int)
void append_trans_hits(ha_ug_index* idx, hc_links* link, bubble_type* bub, 
trans_idx* dis, pe_hit *hit, uint32_t hit_n, uint64_t *hit_occ, kv_u_trans_t *ref,
kv_u_trans_t *res, uint32_t qn, uint32_t tn)
{
    u_trans_t *r_a = NULL, *p = NULL, *q = NULL;
    uint32_t r_n, i;
    uint64_t occ_q, occ_t;
    double w;

    ///qn -> tn^
    {
        r_a = u_trans_a(*ref, tn);
        r_n = u_trans_n(*ref, tn);
        for (i = 0; i < r_n; i++)
        {
            if(IF_HOM(r_a[i].tn, *bub)) continue;
            if(r_a[i].tn == qn) continue;

            if(!get_trans_interval_weight(idx, link, bub, dis, hit, hit_n, 
            qn, 0, idx->ug->g->seq[qn].len, tn, r_a[i].qs, r_a[i].qe, &w))
            {
                continue;
            } 

            occ_q = hit_occ[qn];
            occ_t = (hit_occ[tn] * ((double)(r_a[i].qe - r_a[i].qs)/(double)(idx->ug->g->seq[tn].len))) + 0.5;
            if(occ_t < 1) occ_t = 1;

            kv_pushp(u_trans_t, *res, &p);
            memset(p, 0, sizeof(u_trans_t));
            p->qn = qn; p->tn = r_a[i].tn;
            p->nw = w/**r_a[i].occ**/;
            p->occ = MIN(occ_q, occ_t);

            kv_pushp(u_trans_t, *res, &q);
            (*q) = (*p); q->qn = p->tn; q->tn = p->qn;
        }
    }

    if(qn == tn) return;

   ///tn -> qn^
    {
        r_a = u_trans_a(*ref, qn);
        r_n = u_trans_n(*ref, qn);
        for (i = 0; i < r_n; i++)
        {
            if(IF_HOM(r_a[i].tn, *bub)) continue;
            if(r_a[i].tn == tn) continue;

            if(!get_trans_interval_weight(idx, link, bub, dis, hit, hit_n, 
            qn, r_a[i].qs, r_a[i].qe, tn, 0, idx->ug->g->seq[tn].len, &w))
            {
                continue;
            } 

            occ_q = (hit_occ[qn] * ((double)(r_a[i].qe - r_a[i].qs)/(double)(idx->ug->g->seq[qn].len))) + 0.5;
            occ_t = hit_occ[tn];
            if(occ_q < 1) occ_q = 1;
            kv_pushp(u_trans_t, *res, &p);
            memset(p, 0, sizeof(u_trans_t));
            p->qn = tn; p->tn = r_a[i].tn;
            p->nw = w/**r_a[i].occ**/;
            p->occ = MIN(occ_q, occ_t);

            kv_pushp(u_trans_t, *res, &q);
            (*q) = (*p); q->qn = p->tn; q->tn = p->qn;
        }
    }
    
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %rbx
subq $0xd8, %rsp
movl 0x30(%rbp), %eax
movl 0x28(%rbp), %eax
movq 0x20(%rbp), %rax
movq 0x18(%rbp), %rax
movq 0x10(%rbp), %rax
movq %rdi, -0x20(%rbp)
movq %rsi, -0x28(%rbp)
movq %rdx, -0x30(%rbp)
movq %rcx, -0x38(%rbp)
movq %r8, -0x40(%rbp)
movl %r9d, -0x44(%rbp)
movq $0x0, -0x50(%rbp)
movq $0x0, -0x58(%rbp)
movq $0x0, -0x60(%rbp)
movq 0x18(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x18(%rbp), %rcx
movq 0x28(%rcx), %rcx
movl 0x30(%rbp), %edx
movq (%rcx,%rdx,8), %rcx
shrq $0x20, %rcx
imulq $0x30, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0x50(%rbp)
movq 0x18(%rbp), %rax
movq 0x28(%rax), %rax
movl 0x30(%rbp), %ecx
movq (%rax,%rcx,8), %rax
movl %eax, -0x64(%rbp)
movl $0x0, -0x68(%rbp)
movl -0x68(%rbp), %eax
cmpl -0x64(%rbp), %eax
jae 0x20361d
movq -0x30(%rbp), %rax
movq (%rax), %rax
movq -0x50(%rbp), %rcx
movl -0x68(%rbp), %edx
imulq $0x30, %rdx, %rdx
addq %rdx, %rcx
movl 0x14(%rcx), %ecx
movl (%rax,%rcx,4), %eax
movq -0x30(%rbp), %rcx
movq 0x80(%rcx), %rcx
addq $0x1, %rcx
cmpq %rcx, %rax
jbe 0x2032d1
jmp 0x20360f
movq -0x50(%rbp), %rax
movl -0x68(%rbp), %ecx
imulq $0x30, %rcx, %rcx
addq %rcx, %rax
movl 0x14(%rax), %eax
cmpl 0x28(%rbp), %eax
jne 0x2032ec
jmp 0x20360f
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rsi
movq -0x30(%rbp), %rdx
movq -0x38(%rbp), %rcx
movq -0x40(%rbp), %r8
movl -0x44(%rbp), %r9d
movl 0x28(%rbp), %r15d
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq 0x18(%rax), %rax
movq 0x20(%rax), %rax
movl 0x28(%rbp), %r10d
movl (%rax,%r10,8), %r14d
andl $0x7fffffff, %r14d      # imm = 0x7FFFFFFF
movl 0x30(%rbp), %ebx
movq -0x50(%rbp), %rax
movl -0x68(%rbp), %r10d
imulq $0x30, %r10, %r10
addq %r10, %rax
movl (%rax), %r11d
movq -0x50(%rbp), %rax
movl -0x68(%rbp), %r10d
imulq $0x30, %r10, %r10
addq %r10, %rax
movl 0x4(%rax), %r10d
xorl %eax, %eax
leaq -0x80(%rbp), %rax
movl %r15d, (%rsp)
movl $0x0, 0x8(%rsp)
movl %r14d, 0x10(%rsp)
movl %ebx, 0x18(%rsp)
movl %r11d, 0x20(%rsp)
movl %r10d, 0x28(%rsp)
movq %rax, 0x30(%rsp)
callq 0x214d90
cmpl $0x0, %eax
jne 0x203387
jmp 0x20360f
movq 0x10(%rbp), %rax
movl 0x28(%rbp), %ecx
movq (%rax,%rcx,8), %rax
movq %rax, -0x70(%rbp)
movq 0x10(%rbp), %rax
movl 0x30(%rbp), %ecx
movq (%rax,%rcx,8), %xmm0
movaps 0x17ec67(%rip), %xmm1   # 0x382010
punpckldq %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
movapd 0x17ec6b(%rip), %xmm1   # 0x382020
subpd %xmm1, %xmm0
movaps %xmm0, %xmm1
unpckhpd %xmm0, %xmm0            # xmm0 = xmm0[1,1]
addsd %xmm1, %xmm0
movq -0x50(%rbp), %rax
movl -0x68(%rbp), %edx
leaq (%rdx,%rdx,2), %rsi
shlq $0x4, %rsi
movl (%rax,%rsi), %edx
movl 0x4(%rax,%rsi), %eax
subl %edx, %eax
cvtsi2sd %rax, %xmm1
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq 0x18(%rax), %rax
movq 0x20(%rax), %rax
movl (%rax,%rcx,8), %eax
andl $0x7fffffff, %eax       # imm = 0x7FFFFFFF
cvtsi2sd %eax, %xmm2
divsd %xmm2, %xmm1
mulsd %xmm1, %xmm0
movsd 0x17ee64(%rip), %xmm1   # 0x382270
addsd %xmm1, %xmm0
movaps %xmm0, %xmm1
cvttsd2si %xmm1, %rax
movq %rax, %rdx
sarq $0x3f, %rdx
movsd 0x17ebd1(%rip), %xmm1   # 0x381ff8
subsd %xmm1, %xmm0
cvttsd2si %xmm0, %rcx
andq %rdx, %rcx
orq %rcx, %rax
movq %rax, -0x78(%rbp)
cmpq $0x1, -0x78(%rbp)
jae 0x203449
movq $0x1, -0x78(%rbp)
jmp 0x20344b
movq 0x20(%rbp), %rax
movq (%rax), %rax
movq 0x20(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jne 0x2034b9
movq 0x20(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0x20347b
movq 0x20(%rbp), %rax
movq 0x8(%rax), %rax
shlq %rax
movq %rax, -0x88(%rbp)
jmp 0x203489
movl $0x2, %eax
movq %rax, -0x88(%rbp)
jmp 0x203489
movq -0x88(%rbp), %rcx
movq 0x20(%rbp), %rax
movq %rcx, 0x8(%rax)
movq 0x20(%rbp), %rax
movq 0x10(%rax), %rdi
movq 0x20(%rbp), %rax
imulq $0x30, 0x8(%rax), %rsi
callq 0x2360
movq %rax, %rcx
movq 0x20(%rbp), %rax
movq %rcx, 0x10(%rax)
movq 0x20(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x20(%rbp), %rdx
movq (%rdx), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, (%rdx)
imulq $0x30, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rdi
xorl %esi, %esi
movl $0x30, %edx
callq 0x2100
movl 0x28(%rbp), %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0x8(%rax)
movq -0x50(%rbp), %rax
movl -0x68(%rbp), %ecx
imulq $0x30, %rcx, %rcx
addq %rcx, %rax
movl 0x14(%rax), %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0x14(%rax)
movsd -0x80(%rbp), %xmm0
movq -0x58(%rbp), %rax
movsd %xmm0, 0x20(%rax)
movq -0x70(%rbp), %rax
cmpq -0x78(%rbp), %rax
ja 0x203534
movq -0x70(%rbp), %rax
movq %rax, -0x90(%rbp)
jmp 0x20353f
movq -0x78(%rbp), %rax
movq %rax, -0x90(%rbp)
movq -0x90(%rbp), %rax
movl %eax, %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0x18(%rax)
movq 0x20(%rbp), %rax
movq (%rax), %rax
movq 0x20(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jne 0x2035bd
movq 0x20(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0x20357f
movq 0x20(%rbp), %rax
movq 0x8(%rax), %rax
shlq %rax
movq %rax, -0x98(%rbp)
jmp 0x20358d
movl $0x2, %eax
movq %rax, -0x98(%rbp)
jmp 0x20358d
movq -0x98(%rbp), %rcx
movq 0x20(%rbp), %rax
movq %rcx, 0x8(%rax)
movq 0x20(%rbp), %rax
movq 0x10(%rax), %rdi
movq 0x20(%rbp), %rax
imulq $0x30, 0x8(%rax), %rsi
callq 0x2360
movq %rax, %rcx
movq 0x20(%rbp), %rax
movq %rcx, 0x10(%rax)
movq 0x20(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x20(%rbp), %rdx
movq (%rdx), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, (%rdx)
imulq $0x30, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0x60(%rbp)
movq -0x58(%rbp), %rsi
movq -0x60(%rbp), %rdi
movl $0x30, %edx
callq 0x2180
movq -0x58(%rbp), %rax
movl 0x14(%rax), %ecx
movq -0x60(%rbp), %rax
movl %ecx, 0x8(%rax)
movq -0x58(%rbp), %rax
movl 0x8(%rax), %ecx
movq -0x60(%rbp), %rax
movl %ecx, 0x14(%rax)
movl -0x68(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x68(%rbp)
jmp 0x203291
movl 0x28(%rbp), %eax
cmpl 0x30(%rbp), %eax
jne 0x20362a
jmp 0x2039f5
movq 0x18(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x18(%rbp), %rcx
movq 0x28(%rcx), %rcx
movl 0x28(%rbp), %edx
movq (%rcx,%rdx,8), %rcx
shrq $0x20, %rcx
imulq $0x30, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0x50(%rbp)
movq 0x18(%rbp), %rax
movq 0x28(%rax), %rax
movl 0x28(%rbp), %ecx
movq (%rax,%rcx,8), %rax
movl %eax, -0x64(%rbp)
movl $0x0, -0x68(%rbp)
movl -0x68(%rbp), %eax
cmpl -0x64(%rbp), %eax
jae 0x2039f5
movq -0x30(%rbp), %rax
movq (%rax), %rax
movq -0x50(%rbp), %rcx
movl -0x68(%rbp), %edx
imulq $0x30, %rdx, %rdx
addq %rdx, %rcx
movl 0x14(%rcx), %ecx
movl (%rax,%rcx,4), %eax
movq -0x30(%rbp), %rcx
movq 0x80(%rcx), %rcx
addq $0x1, %rcx
cmpq %rcx, %rax
jbe 0x2036a9
jmp 0x2039e7
movq -0x50(%rbp), %rax
movl -0x68(%rbp), %ecx
imulq $0x30, %rcx, %rcx
addq %rcx, %rax
movl 0x14(%rax), %eax
cmpl 0x30(%rbp), %eax
jne 0x2036c4
jmp 0x2039e7
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rsi
movq -0x30(%rbp), %rdx
movq -0x38(%rbp), %rcx
movq -0x40(%rbp), %r8
movl -0x44(%rbp), %r9d
movl 0x28(%rbp), %r15d
movq -0x50(%rbp), %rax
movl -0x68(%rbp), %r10d
imulq $0x30, %r10, %r10
addq %r10, %rax
movl (%rax), %r14d
movq -0x50(%rbp), %rax
movl -0x68(%rbp), %r10d
imulq $0x30, %r10, %r10
addq %r10, %rax
movl 0x4(%rax), %ebx
movl 0x30(%rbp), %r11d
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq 0x18(%rax), %rax
movq 0x20(%rax), %rax
movl 0x30(%rbp), %r10d
movl (%rax,%r10,8), %r10d
andl $0x7fffffff, %r10d      # imm = 0x7FFFFFFF
xorl %eax, %eax
leaq -0x80(%rbp), %rax
movl %r15d, (%rsp)
movl %r14d, 0x8(%rsp)
movl %ebx, 0x10(%rsp)
movl %r11d, 0x18(%rsp)
movl $0x0, 0x20(%rsp)
movl %r10d, 0x28(%rsp)
movq %rax, 0x30(%rsp)
callq 0x214d90
cmpl $0x0, %eax
jne 0x20375f
jmp 0x2039e7
movq 0x10(%rbp), %rax
movl 0x28(%rbp), %ecx
movq (%rax,%rcx,8), %xmm0
movaps 0x17e89e(%rip), %xmm1   # 0x382010
punpckldq %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
movapd 0x17e8a2(%rip), %xmm1   # 0x382020
subpd %xmm1, %xmm0
movaps %xmm0, %xmm1
unpckhpd %xmm0, %xmm0            # xmm0 = xmm0[1,1]
addsd %xmm1, %xmm0
movq -0x50(%rbp), %rax
movl -0x68(%rbp), %edx
leaq (%rdx,%rdx,2), %rsi
shlq $0x4, %rsi
movl (%rax,%rsi), %edx
movl 0x4(%rax,%rsi), %eax
subl %edx, %eax
cvtsi2sd %rax, %xmm1
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq 0x18(%rax), %rax
movq 0x20(%rax), %rax
movl (%rax,%rcx,8), %eax
andl $0x7fffffff, %eax       # imm = 0x7FFFFFFF
cvtsi2sd %eax, %xmm2
divsd %xmm2, %xmm1
mulsd %xmm1, %xmm0
movsd 0x17ea9b(%rip), %xmm1   # 0x382270
addsd %xmm1, %xmm0
movaps %xmm0, %xmm1
cvttsd2si %xmm1, %rax
movq %rax, %rdx
sarq $0x3f, %rdx
movsd 0x17e808(%rip), %xmm1   # 0x381ff8
subsd %xmm1, %xmm0
cvttsd2si %xmm0, %rcx
andq %rdx, %rcx
orq %rcx, %rax
movq %rax, -0x70(%rbp)
movq 0x10(%rbp), %rax
movl 0x30(%rbp), %ecx
movq (%rax,%rcx,8), %rax
movq %rax, -0x78(%rbp)
cmpq $0x1, -0x70(%rbp)
jae 0x203821
movq $0x1, -0x70(%rbp)
jmp 0x203823
movq 0x20(%rbp), %rax
movq (%rax), %rax
movq 0x20(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jne 0x203891
movq 0x20(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0x203853
movq 0x20(%rbp), %rax
movq 0x8(%rax), %rax
shlq %rax
movq %rax, -0xa0(%rbp)
jmp 0x203861
movl $0x2, %eax
movq %rax, -0xa0(%rbp)
jmp 0x203861
movq -0xa0(%rbp), %rcx
movq 0x20(%rbp), %rax
movq %rcx, 0x8(%rax)
movq 0x20(%rbp), %rax
movq 0x10(%rax), %rdi
movq 0x20(%rbp), %rax
imulq $0x30, 0x8(%rax), %rsi
callq 0x2360
movq %rax, %rcx
movq 0x20(%rbp), %rax
movq %rcx, 0x10(%rax)
movq 0x20(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x20(%rbp), %rdx
movq (%rdx), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, (%rdx)
imulq $0x30, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rdi
xorl %esi, %esi
movl $0x30, %edx
callq 0x2100
movl 0x30(%rbp), %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0x8(%rax)
movq -0x50(%rbp), %rax
movl -0x68(%rbp), %ecx
imulq $0x30, %rcx, %rcx
addq %rcx, %rax
movl 0x14(%rax), %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0x14(%rax)
movsd -0x80(%rbp), %xmm0
movq -0x58(%rbp), %rax
movsd %xmm0, 0x20(%rax)
movq -0x70(%rbp), %rax
cmpq -0x78(%rbp), %rax
ja 0x20390c
movq -0x70(%rbp), %rax
movq %rax, -0xa8(%rbp)
jmp 0x203917
movq -0x78(%rbp), %rax
movq %rax, -0xa8(%rbp)
movq -0xa8(%rbp), %rax
movl %eax, %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0x18(%rax)
movq 0x20(%rbp), %rax
movq (%rax), %rax
movq 0x20(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jne 0x203995
movq 0x20(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0x203957
movq 0x20(%rbp), %rax
movq 0x8(%rax), %rax
shlq %rax
movq %rax, -0xb0(%rbp)
jmp 0x203965
movl $0x2, %eax
movq %rax, -0xb0(%rbp)
jmp 0x203965
movq -0xb0(%rbp), %rcx
movq 0x20(%rbp), %rax
movq %rcx, 0x8(%rax)
movq 0x20(%rbp), %rax
movq 0x10(%rax), %rdi
movq 0x20(%rbp), %rax
imulq $0x30, 0x8(%rax), %rsi
callq 0x2360
movq %rax, %rcx
movq 0x20(%rbp), %rax
movq %rcx, 0x10(%rax)
movq 0x20(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x20(%rbp), %rdx
movq (%rdx), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, (%rdx)
imulq $0x30, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0x60(%rbp)
movq -0x58(%rbp), %rsi
movq -0x60(%rbp), %rdi
movl $0x30, %edx
callq 0x2180
movq -0x58(%rbp), %rax
movl 0x14(%rax), %ecx
movq -0x60(%rbp), %rax
movl %ecx, 0x8(%rax)
movq -0x58(%rbp), %rax
movl 0x8(%rax), %ecx
movq -0x60(%rbp), %rax
movl %ecx, 0x14(%rax)
movl -0x68(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x68(%rbp)
jmp 0x203669
addq $0xd8, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
nopw %cs:(%rax,%rax)