// File: chhylp123[P]hifiasm/Correct.cpp
// Function: gen_rphase_path(asg64_v*, long*, int*, long*, unsigned long, asg64_v*)
void gen_rphase_path(asg64_v *idx, int64_t *cn, int32_t *f, int64_t *p, uint64_t v0, asg64_v *res)
{
    uint64_t n0 = idx->n, pn = 0, v, w, ct, *ca, k, gi;
    kv_push(uint64_t, *idx, v0); 
    while (idx->n > n0) {
        v = idx->a[--idx->n];
        pn = v>>32; v = (uint32_t)v;
        f[v] = 1; p[pn++] = v;
        ct = ((v>0)?(cn[v]-cn[v-1]):(cn[v]));
        ca = ((v>0)?(idx->a+cn[v-1]):(idx->a));
        if(ct) {
            for (k = 0; k < ct; k++) {
                w = ((pn<<32)|ca[k]);
                kv_push(uint64_t, *idx, w); 
            }
        } else {
            gi = ((res->n)?((res->a[res->n-1]>>32)+1):(0));
            for (k = 0; k < pn; k++) {
                w = (gi<<32)|((uint32_t)p[pn-k-1]);
                kv_push(uint64_t, *res, w);
            }
        }
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xa0, %rsp
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, -0x38(%rbp)
movq $0x0, -0x40(%rbp)
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq -0x8(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jne 0x4422e
movq -0x8(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0x441f3
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
shlq %rax
movq %rax, -0x78(%rbp)
jmp 0x441fe
movl $0x2, %eax
movq %rax, -0x78(%rbp)
jmp 0x441fe
movq -0x78(%rbp), %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rsi
shlq $0x3, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x28(%rbp), %rdx
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x8(%rbp), %rsi
movq (%rsi), %rcx
movq %rcx, %rdi
addq $0x1, %rdi
movq %rdi, (%rsi)
movq %rdx, (%rax,%rcx,8)
jmp 0x44251
movq -0x8(%rbp), %rax
movq (%rax), %rax
cmpq -0x38(%rbp), %rax
jbe 0x44560
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x8(%rbp), %rdx
movq (%rdx), %rcx
movq %rcx, %rsi
addq $-0x1, %rsi
movq %rsi, (%rdx)
movq -0x8(%rax,%rcx,8), %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
shrq $0x20, %rax
movq %rax, -0x40(%rbp)
movq -0x48(%rbp), %rax
movl %eax, %eax
movq %rax, -0x48(%rbp)
movq -0x18(%rbp), %rax
movq -0x48(%rbp), %rcx
movl $0x1, (%rax,%rcx,4)
movq -0x48(%rbp), %rdx
movq -0x20(%rbp), %rax
movq -0x40(%rbp), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, -0x40(%rbp)
movq %rdx, (%rax,%rcx,8)
cmpq $0x0, -0x48(%rbp)
jbe 0x442ed
movq -0x10(%rbp), %rax
movq -0x48(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq -0x10(%rbp), %rcx
movq -0x48(%rbp), %rdx
subq $0x1, %rdx
subq (%rcx,%rdx,8), %rax
movq %rax, -0x80(%rbp)
jmp 0x442fd
movq -0x10(%rbp), %rax
movq -0x48(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq %rax, -0x80(%rbp)
movq -0x80(%rbp), %rax
movq %rax, -0x58(%rbp)
cmpq $0x0, -0x48(%rbp)
jbe 0x44334
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x10(%rbp), %rcx
movq -0x48(%rbp), %rdx
subq $0x1, %rdx
movq (%rcx,%rdx,8), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq %rax, -0x88(%rbp)
jmp 0x44343
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x88(%rbp)
movq -0x88(%rbp), %rax
movq %rax, -0x60(%rbp)
cmpq $0x0, -0x58(%rbp)
je 0x44431
movq $0x0, -0x68(%rbp)
movq -0x68(%rbp), %rax
cmpq -0x58(%rbp), %rax
jae 0x4442c
movq -0x40(%rbp), %rax
shlq $0x20, %rax
movq -0x60(%rbp), %rcx
movq -0x68(%rbp), %rdx
orq (%rcx,%rdx,8), %rax
movq %rax, -0x50(%rbp)
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq -0x8(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jne 0x443f8
movq -0x8(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0x443b7
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
shlq %rax
movq %rax, -0x90(%rbp)
jmp 0x443c5
movl $0x2, %eax
movq %rax, -0x90(%rbp)
jmp 0x443c5
movq -0x90(%rbp), %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rsi
shlq $0x3, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x50(%rbp), %rdx
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x8(%rbp), %rsi
movq (%rsi), %rcx
movq %rcx, %rdi
addq $0x1, %rdi
movq %rdi, (%rsi)
movq %rdx, (%rax,%rcx,8)
jmp 0x4441b
movq -0x68(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x68(%rbp)
jmp 0x44361
jmp 0x4455b
movq -0x30(%rbp), %rax
cmpq $0x0, (%rax)
je 0x44463
movq -0x30(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x30(%rbp), %rcx
movq (%rcx), %rcx
subq $0x1, %rcx
movq (%rax,%rcx,8), %rax
shrq $0x20, %rax
addq $0x1, %rax
movq %rax, -0x98(%rbp)
jmp 0x4446e
xorl %eax, %eax
movq %rax, -0x98(%rbp)
jmp 0x4446e
movq -0x98(%rbp), %rax
movq %rax, -0x70(%rbp)
movq $0x0, -0x68(%rbp)
movq -0x68(%rbp), %rax
cmpq -0x40(%rbp), %rax
jae 0x44559
movq -0x70(%rbp), %rax
shlq $0x20, %rax
movq -0x20(%rbp), %rcx
movq -0x40(%rbp), %rdx
subq -0x68(%rbp), %rdx
subq $0x1, %rdx
movq (%rcx,%rdx,8), %rcx
movl %ecx, %ecx
orq %rcx, %rax
movq %rax, -0x50(%rbp)
movq -0x30(%rbp), %rax
movq (%rax), %rax
movq -0x30(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jne 0x44525
movq -0x30(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0x444e4
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rax
shlq %rax
movq %rax, -0xa0(%rbp)
jmp 0x444f2
movl $0x2, %eax
movq %rax, -0xa0(%rbp)
jmp 0x444f2
movq -0xa0(%rbp), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x30(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rsi
shlq $0x3, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x50(%rbp), %rdx
movq -0x30(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x30(%rbp), %rsi
movq (%rsi), %rcx
movq %rcx, %rdi
addq $0x1, %rdi
movq %rdi, (%rsi)
movq %rdx, (%rax,%rcx,8)
jmp 0x44548
movq -0x68(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x68(%rbp)
jmp 0x44481
jmp 0x4455b
jmp 0x44251
addq $0xa0, %rsp
popq %rbp
retq
nopl (%rax)