// File: chhylp123[P]hifiasm/rcut.cpp
// Function: to_mc_g_t(kv_u_trans_t*, kv_gg_status*, unsigned int)
mc_g_t* to_mc_g_t(kv_u_trans_t *ta, kv_gg_status *s, uint32_t un)
{
	fprintf(stderr, "[M::%s]\n", __func__);
	uint32_t i, k;
	mc_edge_t *ma = NULL;
	mc_g_t *mg = NULL; CALLOC(mg, 1);
    

	CALLOC(mg->e, 1);
	mg->e->n_seq = un;
	kv_init(mg->e->idx); kv_init(mg->e->ma); 
	// double sc = get_w_scale(ta);
	// fprintf(stderr, "sc: %f\n", sc);
	for (i = 0; i < ta->n; ++i)
	{
		if(ta->a[i].del) continue;
		kv_pushp(mc_edge_t, mg->e->ma, &ma);
		ma->x = (uint64_t)ta->a[i].qn << 32 | ta->a[i].tn;
		// ma->w = w_cast((ta->a[i].nw*sc));
		ma->w = w_cast((ta->a[i].nw));
	}
	

	for (i = k = 0; i < mg->e->ma.n; i++)
    {
		if(mg->e->ma.a[i].w == 0) continue;
		mg->e->ma.a[k] = mg->e->ma.a[i];
        k++;
    }
    mg->e->ma.n = k;
	
	radix_sort_mce(mg->e->ma.a, mg->e->ma.a + mg->e->ma.n);
	mc_merge_dup(mg);
	mc_edges_idx(mg->e);
	mc_edges_symm(mg->e);

	kv_init(mg->s); 
	mg->s.m = mg->s.n = s->n; CALLOC(mg->s.a, mg->s.n);
	for (i = 0; i < mg->s.n; ++i)
	{
		if(s->a[i].s != 1 && s->a[i].s != 2) continue;
		mg->s.a[i] = (s->a[i].s == 1? 1:-1);
	}
	return mg;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movl %edx, -0x14(%rbp)
movq 0x1997a6(%rip), %rax    # 0x3c3fe0
movq (%rax), %rdi
leaq 0x1628e9(%rip), %rsi    # 0x38d12d
leaq 0x163897(%rip), %rdx    # 0x38e0e2
movb $0x0, %al
callq 0x22a0
movq $0x0, -0x28(%rbp)
movq $0x0, -0x30(%rbp)
movl $0x1, %edi
movl $0x30, %esi
callq 0x2140
movq %rax, -0x30(%rbp)
movl $0x1, %edi
movl $0x40, %esi
callq 0x2140
movq %rax, %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x28(%rax)
movl -0x14(%rbp), %ecx
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
movl %ecx, 0x38(%rax)
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
movq $0x0, 0x8(%rax)
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
movq $0x0, (%rax)
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
movq $0x0, 0x10(%rax)
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
movq $0x0, 0x20(%rax)
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
movq $0x0, 0x18(%rax)
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
movq $0x0, 0x28(%rax)
movl $0x0, -0x18(%rbp)
movl -0x18(%rbp), %eax
movq -0x8(%rbp), %rcx
cmpq (%rcx), %rax
jae 0x22aa55
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movl -0x18(%rbp), %ecx
imulq $0x30, %rcx, %rcx
addq %rcx, %rax
movb 0x28(%rax), %al
shrb $0x7, %al
cmpb $0x0, %al
je 0x22a934
jmp 0x22aa47
jmp 0x22a936
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x18(%rax), %rax
movq -0x30(%rbp), %rcx
movq 0x28(%rcx), %rcx
cmpq 0x20(%rcx), %rax
jne 0x22a9bf
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
cmpq $0x0, 0x20(%rax)
je 0x22a974
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x20(%rax), %rax
shlq %rax
movq %rax, -0x38(%rbp)
jmp 0x22a97f
movl $0x2, %eax
movq %rax, -0x38(%rbp)
jmp 0x22a97f
movq -0x38(%rbp), %rcx
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
movq %rcx, 0x20(%rax)
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x28(%rax), %rdi
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x20(%rax), %rsi
shlq $0x4, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
movq %rcx, 0x28(%rax)
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x28(%rax), %rax
movq -0x30(%rbp), %rcx
movq 0x28(%rcx), %rdx
movq 0x18(%rdx), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, 0x18(%rdx)
shlq $0x4, %rcx
addq %rcx, %rax
movq %rax, -0x28(%rbp)
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movl -0x18(%rbp), %ecx
imulq $0x30, %rcx, %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
movl %eax, %ecx
shlq $0x20, %rcx
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movl -0x18(%rbp), %edx
imulq $0x30, %rdx, %rdx
addq %rdx, %rax
movl 0x14(%rax), %eax
orq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, (%rax)
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movl -0x18(%rbp), %ecx
imulq $0x30, %rcx, %rcx
addq %rcx, %rax
movsd 0x20(%rax), %xmm0
movq -0x28(%rbp), %rax
movsd %xmm0, 0x8(%rax)
movl -0x18(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x18(%rbp)
jmp 0x22a903
movl $0x0, -0x1c(%rbp)
movl $0x0, -0x18(%rbp)
movl -0x18(%rbp), %eax
movq -0x30(%rbp), %rcx
movq 0x28(%rcx), %rcx
cmpq 0x18(%rcx), %rax
jae 0x22aaed
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x28(%rax), %rax
movl -0x18(%rbp), %ecx
shlq $0x4, %rcx
addq %rcx, %rax
movsd 0x8(%rax), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jne 0x22aa9c
jp 0x22aa9c
jmp 0x22aadf
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x28(%rax), %rcx
movl -0x18(%rbp), %eax
shlq $0x4, %rax
addq %rax, %rcx
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x28(%rax), %rax
movl -0x1c(%rbp), %edx
shlq $0x4, %rdx
addq %rdx, %rax
movq (%rcx), %rdx
movq %rdx, (%rax)
movq 0x8(%rcx), %rcx
movq %rcx, 0x8(%rax)
movl -0x1c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x1c(%rbp)
movl -0x18(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x18(%rbp)
jmp 0x22aa63
movl -0x1c(%rbp), %eax
movl %eax, %ecx
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
movq %rcx, 0x18(%rax)
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x28(%rax), %rdi
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x28(%rax), %rsi
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x18(%rax), %rax
shlq $0x4, %rax
addq %rax, %rsi
callq 0x215950
movq -0x30(%rbp), %rdi
callq 0x2167a0
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rdi
callq 0x2193a0
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rdi
callq 0x2190a0
movq -0x30(%rbp), %rax
movq $0x0, 0x8(%rax)
movq -0x30(%rbp), %rax
movq $0x0, (%rax)
movq -0x30(%rbp), %rax
movq $0x0, 0x10(%rax)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x30(%rbp), %rax
movq %rcx, (%rax)
movq -0x30(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x30(%rbp), %rax
movq (%rax), %rdi
movl $0x1, %esi
callq 0x2140
movq %rax, %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x10(%rax)
movl $0x0, -0x18(%rbp)
movl -0x18(%rbp), %eax
movq -0x30(%rbp), %rcx
cmpq (%rcx), %rax
jae 0x22ac26
movq -0x10(%rbp), %rax
movq (%rax), %rax
movl -0x18(%rbp), %ecx
shlq $0x5, %rcx
addq %rcx, %rax
cmpl $0x1, (%rax)
je 0x22abe8
movq -0x10(%rbp), %rax
movq (%rax), %rax
movl -0x18(%rbp), %ecx
shlq $0x5, %rcx
addq %rcx, %rax
cmpl $0x2, (%rax)
je 0x22abe8
jmp 0x22ac1b
movq -0x10(%rbp), %rax
movq (%rax), %rax
movl -0x18(%rbp), %ecx
shlq $0x5, %rcx
addq %rcx, %rax
movl (%rax), %edx
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
movl $0x1, %ecx
cmpl $0x1, %edx
cmovel %ecx, %eax
movb %al, %dl
movq -0x30(%rbp), %rax
movq 0x10(%rax), %rax
movl -0x18(%rbp), %ecx
movb %dl, (%rax,%rcx)
movl -0x18(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x18(%rbp)
jmp 0x22abae
movq -0x30(%rbp), %rax
addq $0x40, %rsp
popq %rbp
retq