// File: chhylp123[P]hifiasm/hic.cpp
// Function: get_hic_distance_bench(pe_hit*, hc_links*, bench_idx*, ma_ug_t*, unsigned long*)
uint64_t get_hic_distance_bench(pe_hit* hit, hc_links* link, bench_idx* idx, ma_ug_t *ug, uint64_t* is_trans)
{
    (*is_trans) = (uint64_t)-1;
    uint64_t s_uid, e_uid;
    long long s_pos, e_pos;
    s_uid = ((hit->s<<1)>>(64 - idx->uID_bits)); s_pos = hit->s & idx->pos_mode;
    e_uid = ((hit->e<<1)>>(64 - idx->uID_bits)); e_pos = hit->e & idx->pos_mode;
    if(s_uid == e_uid)
    {
        (*is_trans) = 0;
        return MAX(s_pos, e_pos) - MIN(s_pos, e_pos);
    }

    uint64_t s_i, e_i, k, ori;
    for (s_i = 0; s_i < idx->ug_idx.n; s_i++)
    {
        if(s_uid >= idx->ug_idx.a[s_i].uID_start && s_uid < idx->ug_idx.a[s_i].uID_end) break;
    }
    for (e_i = 0; e_i < idx->ug_idx.n; e_i++)
    {
        if(e_uid >= idx->ug_idx.a[e_i].uID_start && e_uid < idx->ug_idx.a[e_i].uID_end) break;
    }
    if(s_i == idx->ug_idx.n || e_i == idx->ug_idx.n) return (uint64_t)-1;
    if(s_i == e_i)
    {
        (*is_trans) = 0;
        return (uint64_t)-1;
    }

    (*is_trans) = 1;
    hc_linkeage* t = &(link->a.a[s_uid]);
    long long m_x[2] = {1, -1}, dis;
    for (k = 0; k < t->e.n; k++)
    {
        if(t->e.a[k].del || t->e.a[k].uID != e_uid) continue;
        ori = !!(t->e.a[k].dis & (uint64_t)2);
        dis = (long long)(t->e.a[k].dis>>2) * m_x[t->e.a[k].dis & (uint64_t)1];
        if(ori) e_pos = ug->u.a[e_uid].len - e_pos - 1;
        e_pos = e_pos + dis;
        return MAX(s_pos, e_pos) - MIN(s_pos, e_pos);
    }

    return (uint64_t)-1;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movq %r8, -0x30(%rbp)
movq -0x30(%rbp), %rax
movq $-0x1, (%rax)
movq -0x10(%rbp), %rax
movq (%rax), %rax
shlq %rax
movq -0x20(%rbp), %rdx
movl $0x40, %ecx
subq 0x18(%rdx), %rcx
shrq %cl, %rax
movq %rax, -0x38(%rbp)
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq -0x20(%rbp), %rcx
andq 0x20(%rcx), %rax
movq %rax, -0x48(%rbp)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
shlq %rax
movq -0x20(%rbp), %rdx
movl $0x40, %ecx
subq 0x18(%rdx), %rcx
shrq %cl, %rax
movq %rax, -0x40(%rbp)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x20(%rbp), %rcx
andq 0x20(%rcx), %rax
movq %rax, -0x50(%rbp)
movq -0x38(%rbp), %rax
cmpq -0x40(%rbp), %rax
jne 0x210b9c
movq -0x30(%rbp), %rax
movq $0x0, (%rax)
movq -0x48(%rbp), %rax
cmpq -0x50(%rbp), %rax
jl 0x210b47
movq -0x48(%rbp), %rax
movq %rax, -0xa0(%rbp)
jmp 0x210b52
movq -0x50(%rbp), %rax
movq %rax, -0xa0(%rbp)
movq -0xa0(%rbp), %rax
movq %rax, -0xa8(%rbp)
movq -0x48(%rbp), %rax
cmpq -0x50(%rbp), %rax
jg 0x210b77
movq -0x48(%rbp), %rax
movq %rax, -0xb0(%rbp)
jmp 0x210b82
movq -0x50(%rbp), %rax
movq %rax, -0xb0(%rbp)
movq -0xa8(%rbp), %rax
movq -0xb0(%rbp), %rcx
subq %rcx, %rax
movq %rax, -0x8(%rbp)
jmp 0x210e4e
movq $0x0, -0x58(%rbp)
movq -0x58(%rbp), %rax
movq -0x20(%rbp), %rcx
cmpq (%rcx), %rax
jae 0x210bf6
movq -0x38(%rbp), %rax
movq -0x20(%rbp), %rcx
movq 0x10(%rcx), %rcx
imulq $0x28, -0x58(%rbp), %rdx
addq %rdx, %rcx
cmpq (%rcx), %rax
jb 0x210be6
movq -0x38(%rbp), %rax
movq -0x20(%rbp), %rcx
movq 0x10(%rcx), %rcx
imulq $0x28, -0x58(%rbp), %rdx
addq %rdx, %rcx
cmpq 0x8(%rcx), %rax
jae 0x210be6
jmp 0x210bf6
jmp 0x210be8
movq -0x58(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x58(%rbp)
jmp 0x210ba4
movq $0x0, -0x60(%rbp)
movq -0x60(%rbp), %rax
movq -0x20(%rbp), %rcx
cmpq (%rcx), %rax
jae 0x210c50
movq -0x40(%rbp), %rax
movq -0x20(%rbp), %rcx
movq 0x10(%rcx), %rcx
imulq $0x28, -0x60(%rbp), %rdx
addq %rdx, %rcx
cmpq (%rcx), %rax
jb 0x210c40
movq -0x40(%rbp), %rax
movq -0x20(%rbp), %rcx
movq 0x10(%rcx), %rcx
imulq $0x28, -0x60(%rbp), %rdx
addq %rdx, %rcx
cmpq 0x8(%rcx), %rax
jae 0x210c40
jmp 0x210c50
jmp 0x210c42
movq -0x60(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x60(%rbp)
jmp 0x210bfe
movq -0x58(%rbp), %rax
movq -0x20(%rbp), %rcx
cmpq (%rcx), %rax
je 0x210c6a
movq -0x60(%rbp), %rax
movq -0x20(%rbp), %rcx
cmpq (%rcx), %rax
jne 0x210c77
movq $-0x1, -0x8(%rbp)
jmp 0x210e4e
movq -0x58(%rbp), %rax
cmpq -0x60(%rbp), %rax
jne 0x210c99
movq -0x30(%rbp), %rax
movq $0x0, (%rax)
movq $-0x1, -0x8(%rbp)
jmp 0x210e4e
movq -0x30(%rbp), %rax
movq $0x1, (%rax)
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0x30, -0x38(%rbp), %rcx
addq %rcx, %rax
movq %rax, -0x78(%rbp)
movq 0x17b1b1(%rip), %rax    # 0x38be70
movq %rax, -0x90(%rbp)
movq 0x17b1ab(%rip), %rax    # 0x38be78
movq %rax, -0x88(%rbp)
movq $0x0, -0x68(%rbp)
movq -0x68(%rbp), %rax
movq -0x78(%rbp), %rcx
cmpq (%rcx), %rax
jae 0x210e46
movq -0x78(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0x28, -0x68(%rbp), %rcx
addq %rcx, %rax
movb 0x18(%rax), %al
shrb $0x7, %al
cmpb $0x0, %al
jne 0x210d20
movq -0x78(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0x28, -0x68(%rbp), %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
cmpq -0x40(%rbp), %rax
je 0x210d25
jmp 0x210e35
movq -0x78(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0x28, -0x68(%rbp), %rcx
addq %rcx, %rax
movq 0x10(%rax), %rax
andq $0x2, %rax
cmpq $0x0, %rax
setne %al
xorb $-0x1, %al
xorb $-0x1, %al
andb $0x1, %al
movzbl %al, %eax
movq %rax, -0x70(%rbp)
movq -0x78(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0x28, -0x68(%rbp), %rcx
addq %rcx, %rax
movq 0x10(%rax), %rax
shrq $0x2, %rax
movq -0x78(%rbp), %rcx
movq 0x10(%rcx), %rcx
imulq $0x28, -0x68(%rbp), %rdx
addq %rdx, %rcx
movq 0x10(%rcx), %rcx
andq $0x1, %rcx
imulq -0x90(%rbp,%rcx,8), %rax
movq %rax, -0x98(%rbp)
cmpq $0x0, -0x70(%rbp)
je 0x210dbd
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0x28, -0x40(%rbp), %rcx
addq %rcx, %rax
movl (%rax), %eax
andl $0x7fffffff, %eax       # imm = 0x7FFFFFFF
movl %eax, %eax
subq -0x50(%rbp), %rax
subq $0x1, %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rax
addq -0x98(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x48(%rbp), %rax
cmpq -0x50(%rbp), %rax
jl 0x210de3
movq -0x48(%rbp), %rax
movq %rax, -0xb8(%rbp)
jmp 0x210dee
movq -0x50(%rbp), %rax
movq %rax, -0xb8(%rbp)
movq -0xb8(%rbp), %rax
movq %rax, -0xc0(%rbp)
movq -0x48(%rbp), %rax
cmpq -0x50(%rbp), %rax
jg 0x210e13
movq -0x48(%rbp), %rax
movq %rax, -0xc8(%rbp)
jmp 0x210e1e
movq -0x50(%rbp), %rax
movq %rax, -0xc8(%rbp)
movq -0xc0(%rbp), %rax
movq -0xc8(%rbp), %rcx
subq %rcx, %rax
movq %rax, -0x8(%rbp)
jmp 0x210e4e
movq -0x68(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x68(%rbp)
jmp 0x210cdc
movq $-0x1, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x50, %rsp
popq %rbp
retq
nopl (%rax,%rax)