// File: chhylp123[P]hifiasm/gfa_ut.cpp
// Function: init_poa_dp(ma_ug_t*, poa_dp_t*, poa_g_t*, unsigned long, unsigned long*, unsigned long, unsigned long, uc_block_t*, integer_t*)
void init_poa_dp(ma_ug_t *ug, poa_dp_t *dp, poa_g_t *g, uint64_t g_occ, uint64_t *str, uint64_t str_occ, uint64_t is_rev, uc_block_t *raw, integer_t *buf)
{
    kv_resize(uint8_t, dp->dir, (str_occ+1)*(g_occ+1));
    kv_resize(int64_t, dp->sc, (str_occ+1)*(g_occ+1));
    kv_resize(uint64_t, dp->prefix, (str_occ+1)*(g_occ+1));
    dp->n = str_occ+1; dp->m = g_occ+1;
    kv_resize(uint64_t, buf->u, str_occ);
    int64_t *sc = dp->sc.a, bsc, ss; uint8_t *dir = dp->dir.a; uint64_t k, l, *str_w = buf->u.a, *prefix = dp->prefix.a, m; 
    uc_block_t *z; uint32_t *g_idx = g->srt_b.res.a, *n2gidx = g->srt_b.res2nid.a, v, w, a_n, bsc_i; poa_arc_t *a; 
    for (k = 0; k < str_occ; k++) {
        z = &(raw[str[k]>>32]); str_w[k] = ug_occ_w(z->ts, z->te, &(ug->u.a[z->hid]));
    }
    
    sc[poa_dp_idx(*dp, 0, 0)] = dir[poa_dp_idx(*dp, 0, 0)] = 0;
    for (k = 1, l = 0; k < dp->n; k++) {///pat; new ul read
        l += str_w[poa_str_idx(k-1, str_occ, is_rev)];
        sc[poa_dp_idx(*dp, k, 0)] = l;
        dir[poa_dp_idx(*dp, k, 0)] = lstr_dp;
        prefix[poa_dp_idx(*dp, k, 0)] = ((k - 1)<<32);
    }
    
    for (k = 1; k < dp->m; k++) {///ref; graph
        v = (g_idx[k-1]<<1) + 1;
        a_n = poa_arc_n(g, v); a = poa_arc_a(g, v);
        for (m = 0, bsc = bsc_i = 0; m < a_n; m++) {
            w = n2gidx[a[m].v>>1]; assert(w+1 < k);
            ss = sc[poa_dp_idx(*dp, 0, w+1)];
            if(ss < bsc || bsc_i == 0) {
                bsc = ss; bsc_i = w + 1;
            }
        }
        sc[poa_dp_idx(*dp, 0, k)] = bsc + g->seq.a[v>>1].occ;
        dir[poa_dp_idx(*dp, 0, k)] = lref_dp;
        prefix[poa_dp_idx(*dp, 0, k)] = bsc_i;
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xc0, %rsp
movq 0x20(%rbp), %rax
movq 0x18(%rbp), %rax
movq 0x10(%rbp), %rax
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 -0x10(%rbp), %rax
movq 0x20(%rax), %rax
movq -0x30(%rbp), %rcx
addq $0x1, %rcx
movq -0x20(%rbp), %rdx
addq $0x1, %rdx
imulq %rdx, %rcx
cmpq %rcx, %rax
jae 0x3319ab
movq -0x30(%rbp), %rcx
addq $0x1, %rcx
movq -0x20(%rbp), %rax
addq $0x1, %rax
imulq %rax, %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rcx
addq $-0x1, %rcx
movq %rcx, 0x20(%rax)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rcx
shrq %rcx
movq -0x10(%rbp), %rax
orq 0x20(%rax), %rcx
movq %rcx, 0x20(%rax)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rcx
shrq $0x2, %rcx
movq -0x10(%rbp), %rax
orq 0x20(%rax), %rcx
movq %rcx, 0x20(%rax)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rcx
shrq $0x4, %rcx
movq -0x10(%rbp), %rax
orq 0x20(%rax), %rcx
movq %rcx, 0x20(%rax)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rcx
shrq $0x8, %rcx
movq -0x10(%rbp), %rax
orq 0x20(%rax), %rcx
movq %rcx, 0x20(%rax)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rcx
shrq $0x10, %rcx
movq -0x10(%rbp), %rax
orq 0x20(%rax), %rcx
movq %rcx, 0x20(%rax)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x20(%rax)
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
shlq $0x0, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x28(%rax)
jmp 0x3319ad
jmp 0x3319af
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x30(%rbp), %rcx
addq $0x1, %rcx
movq -0x20(%rbp), %rdx
addq $0x1, %rdx
imulq %rdx, %rcx
cmpq %rcx, %rax
jae 0x331aab
movq -0x30(%rbp), %rcx
addq $0x1, %rcx
movq -0x20(%rbp), %rax
addq $0x1, %rax
imulq %rax, %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
addq $-0x1, %rcx
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
shrq %rcx
movq -0x10(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
shrq $0x2, %rcx
movq -0x10(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
shrq $0x4, %rcx
movq -0x10(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
shrq $0x8, %rcx
movq -0x10(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
shrq $0x10, %rcx
movq -0x10(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rsi
shlq $0x3, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x10(%rax)
jmp 0x331aad
jmp 0x331aaf
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rax
movq -0x30(%rbp), %rcx
addq $0x1, %rcx
movq -0x20(%rbp), %rdx
addq $0x1, %rdx
imulq %rdx, %rcx
cmpq %rcx, %rax
jae 0x331bab
movq -0x30(%rbp), %rcx
addq $0x1, %rcx
movq -0x20(%rbp), %rax
addq $0x1, %rax
imulq %rax, %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x38(%rax)
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rcx
addq $-0x1, %rcx
movq %rcx, 0x38(%rax)
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rcx
shrq %rcx
movq -0x10(%rbp), %rax
orq 0x38(%rax), %rcx
movq %rcx, 0x38(%rax)
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rcx
shrq $0x2, %rcx
movq -0x10(%rbp), %rax
orq 0x38(%rax), %rcx
movq %rcx, 0x38(%rax)
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rcx
shrq $0x4, %rcx
movq -0x10(%rbp), %rax
orq 0x38(%rax), %rcx
movq %rcx, 0x38(%rax)
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rcx
shrq $0x8, %rcx
movq -0x10(%rbp), %rax
orq 0x38(%rax), %rcx
movq %rcx, 0x38(%rax)
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rcx
shrq $0x10, %rcx
movq -0x10(%rbp), %rax
orq 0x38(%rax), %rcx
movq %rcx, 0x38(%rax)
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x38(%rax)
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rsi
shlq $0x3, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x40(%rax)
jmp 0x331bad
movq -0x30(%rbp), %rcx
addq $0x1, %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x48(%rax)
movq -0x20(%rbp), %rcx
addq $0x1, %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x50(%rax)
movq 0x20(%rbp), %rax
movq 0x98(%rax), %rax
cmpq -0x30(%rbp), %rax
jae 0x331cee
movq -0x30(%rbp), %rcx
movq 0x20(%rbp), %rax
movq %rcx, 0x98(%rax)
movq 0x20(%rbp), %rax
movq 0x98(%rax), %rcx
addq $-0x1, %rcx
movq %rcx, 0x98(%rax)
movq 0x20(%rbp), %rax
movq 0x98(%rax), %rcx
shrq %rcx
movq 0x20(%rbp), %rax
orq 0x98(%rax), %rcx
movq %rcx, 0x98(%rax)
movq 0x20(%rbp), %rax
movq 0x98(%rax), %rcx
shrq $0x2, %rcx
movq 0x20(%rbp), %rax
orq 0x98(%rax), %rcx
movq %rcx, 0x98(%rax)
movq 0x20(%rbp), %rax
movq 0x98(%rax), %rcx
shrq $0x4, %rcx
movq 0x20(%rbp), %rax
orq 0x98(%rax), %rcx
movq %rcx, 0x98(%rax)
movq 0x20(%rbp), %rax
movq 0x98(%rax), %rcx
shrq $0x8, %rcx
movq 0x20(%rbp), %rax
orq 0x98(%rax), %rcx
movq %rcx, 0x98(%rax)
movq 0x20(%rbp), %rax
movq 0x98(%rax), %rcx
shrq $0x10, %rcx
movq 0x20(%rbp), %rax
orq 0x98(%rax), %rcx
movq %rcx, 0x98(%rax)
movq 0x20(%rbp), %rax
movq 0x98(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x98(%rax)
movq 0x20(%rbp), %rax
movq 0xa0(%rax), %rdi
movq 0x20(%rbp), %rax
movq 0x98(%rax), %rsi
shlq $0x3, %rsi
callq 0x2360
movq %rax, %rcx
movq 0x20(%rbp), %rax
movq %rcx, 0xa0(%rax)
jmp 0x331cf0
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x38(%rbp)
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq %rax, -0x50(%rbp)
movq 0x20(%rbp), %rax
movq 0xa0(%rax), %rax
movq %rax, -0x68(%rbp)
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
movq %rax, -0x70(%rbp)
movq -0x18(%rbp), %rax
movq 0x90(%rax), %rax
movq %rax, -0x88(%rbp)
movq -0x18(%rbp), %rax
movq 0xa8(%rax), %rax
movq %rax, -0x90(%rbp)
movq $0x0, -0x58(%rbp)
movq -0x58(%rbp), %rax
cmpq -0x30(%rbp), %rax
jae 0x331dc1
movq 0x18(%rbp), %rax
movq -0x28(%rbp), %rcx
movq -0x58(%rbp), %rdx
movq (%rcx,%rdx,8), %rcx
shrq $0x20, %rcx
imulq $0x24, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0x80(%rbp)
movq -0x80(%rbp), %rax
movl 0xc(%rax), %eax
movl %eax, %edi
movq -0x80(%rbp), %rax
movl 0x10(%rax), %eax
movl %eax, %esi
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rdx
movq -0x80(%rbp), %rax
movl (%rax), %eax
imulq $0x28, %rax, %rax
addq %rax, %rdx
callq 0x327090
movq %rax, %rdx
movq -0x68(%rbp), %rax
movq -0x58(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movq -0x58(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x58(%rbp)
jmp 0x331d4f
movq -0x50(%rbp), %rax
movq -0x10(%rbp), %rcx
imulq $0x0, 0x50(%rcx), %rcx
movb $0x0, (%rax,%rcx)
movq -0x38(%rbp), %rax
movq -0x10(%rbp), %rcx
imulq $0x0, 0x50(%rcx), %rcx
movq $0x0, (%rax,%rcx,8)
movq $0x1, -0x58(%rbp)
movq $0x0, -0x60(%rbp)
movq -0x58(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x48(%rcx), %rax
jae 0x331ec0
movq -0x68(%rbp), %rax
movq %rax, -0xb0(%rbp)
cmpq $0x0, 0x10(%rbp)
je 0x331e37
movq -0x30(%rbp), %rax
movq -0x58(%rbp), %rcx
subq $0x1, %rcx
subq %rcx, %rax
subq $0x1, %rax
movq %rax, -0xb8(%rbp)
jmp 0x331e46
movq -0x58(%rbp), %rax
subq $0x1, %rax
movq %rax, -0xb8(%rbp)
movq -0xb0(%rbp), %rax
movq -0xb8(%rbp), %rcx
movq (%rax,%rcx,8), %rax
addq -0x60(%rbp), %rax
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rdx
movq -0x38(%rbp), %rax
movq -0x10(%rbp), %rcx
movq 0x50(%rcx), %rcx
imulq -0x58(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movq -0x50(%rbp), %rax
movq -0x10(%rbp), %rcx
movq 0x50(%rcx), %rcx
imulq -0x58(%rbp), %rcx
movb $0x2, (%rax,%rcx)
movq -0x58(%rbp), %rdx
subq $0x1, %rdx
shlq $0x20, %rdx
movq -0x70(%rbp), %rax
movq -0x10(%rbp), %rcx
movq 0x50(%rcx), %rcx
imulq -0x58(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movq -0x58(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x58(%rbp)
jmp 0x331df7
movq $0x1, -0x58(%rbp)
movq -0x58(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x50(%rcx), %rax
jae 0x332097
movq -0x88(%rbp), %rax
movq -0x58(%rbp), %rcx
subq $0x1, %rcx
movl (%rax,%rcx,4), %eax
shll %eax
addl $0x1, %eax
movl %eax, -0x94(%rbp)
movq -0x18(%rbp), %rax
movq 0x40(%rax), %rax
movl -0x94(%rbp), %ecx
movq (%rax,%rcx,8), %rax
movl %eax, -0x9c(%rbp)
movq -0x18(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x18(%rbp), %rcx
movq 0x40(%rcx), %rcx
movl -0x94(%rbp), %edx
movq (%rcx,%rdx,8), %rcx
shrq $0x20, %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movq %rax, -0xa8(%rbp)
movq $0x0, -0x78(%rbp)
movl $0x0, -0xa0(%rbp)
movq $0x0, -0x40(%rbp)
movq -0x78(%rbp), %rax
movl -0x9c(%rbp), %ecx
cmpq %rcx, %rax
jae 0x332023
movq -0x90(%rbp), %rax
movq -0xa8(%rbp), %rcx
movq -0x78(%rbp), %rdx
shlq $0x4, %rdx
addq %rdx, %rcx
movl 0x8(%rcx), %ecx
shrl %ecx
movl %ecx, %ecx
movl (%rax,%rcx,4), %eax
movl %eax, -0x98(%rbp)
movl -0x98(%rbp), %eax
addl $0x1, %eax
movl %eax, %eax
cmpq -0x58(%rbp), %rax
jae 0x331fa4
jmp 0x331fc3
leaq 0x65c55(%rip), %rdi     # 0x397c00
leaq 0x64207(%rip), %rsi     # 0x3961b9
movl $0x1673, %edx           # imm = 0x1673
leaq 0x65c4a(%rip), %rcx     # 0x397c08
callq 0x2130
movq -0x38(%rbp), %rax
movq -0x10(%rbp), %rcx
imulq $0x0, 0x50(%rcx), %rcx
movl -0x98(%rbp), %edx
addl $0x1, %edx
movl %edx, %edx
addq %rdx, %rcx
movq (%rax,%rcx,8), %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
cmpq -0x40(%rbp), %rax
jl 0x331ff9
cmpl $0x0, -0xa0(%rbp)
jne 0x332010
movq -0x48(%rbp), %rax
movq %rax, -0x40(%rbp)
movl -0x98(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xa0(%rbp)
jmp 0x332012
movq -0x78(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x78(%rbp)
jmp 0x331f55
movq -0x40(%rbp), %rdx
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
movl -0x94(%rbp), %ecx
shrl %ecx
movl %ecx, %ecx
movl (%rax,%rcx,8), %eax
addq %rax, %rdx
movq -0x38(%rbp), %rax
movq -0x10(%rbp), %rcx
imulq $0x0, 0x50(%rcx), %rcx
addq -0x58(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movq -0x50(%rbp), %rax
movq -0x10(%rbp), %rcx
imulq $0x0, 0x50(%rcx), %rcx
addq -0x58(%rbp), %rcx
movb $0x3, (%rax,%rcx)
movl -0xa0(%rbp), %eax
movl %eax, %edx
movq -0x70(%rbp), %rax
movq -0x10(%rbp), %rcx
imulq $0x0, 0x50(%rcx), %rcx
addq -0x58(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movq -0x58(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x58(%rbp)
jmp 0x331ec8
addq $0xc0, %rsp
popq %rbp
retq