// File: chhylp123[P]hifiasm/hic.cpp
// Function: get_specific_shortest_path(pdq_spec*)
uint32_t get_specific_shortest_path(pdq_spec *p)
{
    uint64_t u, i, nv, w;
    asg_arc_t *av = NULL;
    if(p->v == (uint64_t)-1)
    {
        // reset_pdq(p->pq);
        p->pq->dis.a[p->src] = 0;
        if(p->pre) p->pre[p->src] = (uint32_t)-1;
        push_pdq(p->pq, p->src, 0);
        p->occ = 0;
    }
    if(p->occ >= p->df_occ) return 0;
    
    while (pdq_cnt(*(p->pq)) > 0)
    {
        pop_pdq(p->pq, &(p->v), &w);
        p->pq->vis.a[p->v] = 1;
        if(p->dest && p->dest[p->v] == p->flag) p->occ++;
        if(p->occ > p->df_occ) return 0;

        av = asg_arc_a(p->sg, p->v);
        nv = asg_arc_n(p->sg, p->v);

        for (i = 0; i < nv; i++)
        {
            if(av[i].del) continue;
            u = av[i].v;
            w = (uint32_t)av[i].ul;

            if(p->pq->vis.a[u] == 0 && p->pq->dis.a[u] > p->pq->dis.a[p->v] + w)
            {
                p->pq->dis.a[u] = p->pq->dis.a[p->v] + w;
                push_pdq(p->pq, u, p->pq->dis.a[u]);
                if(p->pre) p->pre[u] = p->v;
            }
        }
        if(p->dest && p->dest[p->v] == p->flag) return 1;
        if(!p->dest) return 1;
    }

    return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x10(%rbp)
movq $0x0, -0x38(%rbp)
movq -0x10(%rbp), %rax
cmpq $-0x1, 0x38(%rax)
jne 0x1cc5cf
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x40(%rax), %rax
movq -0x10(%rbp), %rcx
movl 0x8(%rcx), %ecx
movq $0x0, (%rax,%rcx,8)
movq -0x10(%rbp), %rax
cmpq $0x0, 0x40(%rax)
je 0x1cc5aa
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
movq -0x10(%rbp), %rcx
movl 0x8(%rcx), %ecx
movl $0xffffffff, (%rax,%rcx,4) # imm = 0xFFFFFFFF
movq -0x10(%rbp), %rax
movq (%rax), %rdi
movq -0x10(%rbp), %rax
movl 0x8(%rax), %eax
movl %eax, %esi
xorl %eax, %eax
movl %eax, %edx
callq 0x1cbc50
movq -0x10(%rbp), %rax
movq $0x0, 0x28(%rax)
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x10(%rbp), %rcx
cmpq 0x30(%rcx), %rax
jb 0x1cc5ed
movl $0x0, -0x4(%rbp)
jmp 0x1cc864
jmp 0x1cc5ef
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x28(%rax), %rax
cmpq $0x0, (%rax)
jbe 0x1cc85d
movq -0x10(%rbp), %rax
movq (%rax), %rdi
movq -0x10(%rbp), %rsi
addq $0x38, %rsi
leaq -0x30(%rbp), %rdx
callq 0x1cbe10
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x10(%rax), %rax
movq -0x10(%rbp), %rcx
movq 0x38(%rcx), %rcx
movb $0x1, (%rax,%rcx)
movq -0x10(%rbp), %rax
cmpq $0x0, 0x18(%rax)
je 0x1cc66e
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq -0x10(%rbp), %rcx
movq 0x38(%rcx), %rcx
movzbl (%rax,%rcx), %eax
movq -0x10(%rbp), %rcx
movzbl 0x20(%rcx), %ecx
cmpl %ecx, %eax
jne 0x1cc66e
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x28(%rax)
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x10(%rbp), %rcx
cmpq 0x30(%rcx), %rax
jbe 0x1cc68c
movl $0x0, -0x4(%rbp)
jmp 0x1cc864
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rax
movq -0x10(%rbp), %rcx
movq 0x10(%rcx), %rcx
movq 0x28(%rcx), %rcx
movq -0x10(%rbp), %rdx
movq 0x38(%rdx), %rdx
movq (%rcx,%rdx,8), %rcx
shrq $0x20, %rcx
imulq $0x18, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0x38(%rbp)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x28(%rax), %rax
movq -0x10(%rbp), %rcx
movq 0x38(%rcx), %rcx
movq (%rax,%rcx,8), %rax
movl %eax, %eax
movq %rax, -0x28(%rbp)
movq $0x0, -0x20(%rbp)
movq -0x20(%rbp), %rax
cmpq -0x28(%rbp), %rax
jae 0x1cc810
movq -0x38(%rbp), %rax
imulq $0x18, -0x20(%rbp), %rcx
addq %rcx, %rax
movl 0xc(%rax), %eax
shrl $0x1f, %eax
cmpl $0x0, %eax
je 0x1cc70f
jmp 0x1cc7ff
movq -0x38(%rbp), %rax
imulq $0x18, -0x20(%rbp), %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
movq %rax, -0x18(%rbp)
movq -0x38(%rbp), %rax
imulq $0x18, -0x20(%rbp), %rcx
addq %rcx, %rax
movq (%rax), %rax
movl %eax, %eax
movq %rax, -0x30(%rbp)
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x10(%rax), %rax
movq -0x18(%rbp), %rcx
movzbl (%rax,%rcx), %eax
cmpl $0x0, %eax
jne 0x1cc7fd
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x40(%rax), %rax
movq -0x18(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq -0x10(%rbp), %rcx
movq (%rcx), %rcx
movq 0x40(%rcx), %rcx
movq -0x10(%rbp), %rdx
movq 0x38(%rdx), %rdx
movq (%rcx,%rdx,8), %rcx
addq -0x30(%rbp), %rcx
cmpq %rcx, %rax
jbe 0x1cc7fd
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x40(%rax), %rax
movq -0x10(%rbp), %rcx
movq 0x38(%rcx), %rcx
movq (%rax,%rcx,8), %rdx
addq -0x30(%rbp), %rdx
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x40(%rax), %rax
movq -0x18(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movq -0x10(%rbp), %rax
movq (%rax), %rdi
movq -0x18(%rbp), %rsi
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x40(%rax), %rax
movq -0x18(%rbp), %rcx
movq (%rax,%rcx,8), %rdx
callq 0x1cbc50
movq -0x10(%rbp), %rax
cmpq $0x0, 0x40(%rax)
je 0x1cc7fb
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rax
movl %eax, %edx
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
movq -0x18(%rbp), %rcx
movl %edx, (%rax,%rcx,4)
jmp 0x1cc7fd
jmp 0x1cc7ff
movq -0x20(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x20(%rbp)
jmp 0x1cc6e5
movq -0x10(%rbp), %rax
cmpq $0x0, 0x18(%rax)
je 0x1cc844
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq -0x10(%rbp), %rcx
movq 0x38(%rcx), %rcx
movzbl (%rax,%rcx), %eax
movq -0x10(%rbp), %rcx
movzbl 0x20(%rcx), %ecx
cmpl %ecx, %eax
jne 0x1cc844
movl $0x1, -0x4(%rbp)
jmp 0x1cc864
movq -0x10(%rbp), %rax
cmpq $0x0, 0x18(%rax)
jne 0x1cc858
movl $0x1, -0x4(%rbp)
jmp 0x1cc864
jmp 0x1cc5ef
movl $0x0, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x40, %rsp
popq %rbp
retq
nopl (%rax)