// File: chhylp123[P]hifiasm/rcut.cpp
// Function: mb_flip_spin(mb_g_t*, mb_svaux_t*, unsigned int)
static void mb_flip_spin(mb_g_t *mbg, mb_svaux_t *b, uint32_t k)
{
	if(mbg->u->u.a[k].s[0] == 0 && mbg->u->u.a[k].s[1] == 0) return;
	mb_match_t *ma = mbg->e;
	uint32_t o, j, n;
	o = ma->idx.a[k] >> 32;
	n = (uint32_t)ma->idx.a[k];
	mbg->u->u.a[k].s[0] = -mbg->u->u.a[k].s[0];
	mbg->u->u.a[k].s[1] = -mbg->u->u.a[k].s[1];
	for (j = 0; j < n; ++j) {
		const mb_edge_t *e = &ma->ma.a[o + j];
		uint32_t t = ma_y(*e);///1->z[0]; (-1)->z[1];
		
		if(mbg->u->u.a[k].s[0] != 0)
		{
			///note: e is from k to t
			///t[0] ---> k[0], so update z[0 + x] and e[0]
			mbg->u->u.a[t].z[mbg->u->u.a[k].s[0] < 0] += e->w[0];
			mbg->u->u.a[t].z[mbg->u->u.a[k].s[0] > 0] -= e->w[0];

			///t[1] ---> k[0], so update z[2 + x] and e[1]
			mbg->u->u.a[t].z[(mbg->u->u.a[k].s[0] < 0) + 2] += e->w[1];
			mbg->u->u.a[t].z[(mbg->u->u.a[k].s[0] > 0) + 2] -= e->w[1];
		}

		if(mbg->u->u.a[k].s[1] != 0)
		{
			///note: e is from k to t
			///t[0] ---> k[1], so update z[0 + x] and e[2]
			mbg->u->u.a[t].z[mbg->u->u.a[k].s[1] < 0] += e->w[2];
			mbg->u->u.a[t].z[mbg->u->u.a[k].s[1] > 0] -= e->w[2];

			///t[1] ---> k[1], so update z[2 + x] and e[3]
			mbg->u->u.a[t].z[(mbg->u->u.a[k].s[1] < 0) + 2] += e->w[3];
			mbg->u->u.a[t].z[(mbg->u->u.a[k].s[1] > 0) + 2] -= e->w[3];
		}

		/*******************************for debug************************************/
		// debug_mb_z(mbg, t);
		/*******************************for debug************************************/
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movl %edx, -0x14(%rbp)
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq 0x40(%rax), %rax
movl -0x14(%rbp), %ecx
imulq $0x38, %rcx, %rcx
addq %rcx, %rax
movsbl 0x10(%rax), %eax
cmpl $0x0, %eax
jne 0x22c3c0
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq 0x40(%rax), %rax
movl -0x14(%rbp), %ecx
imulq $0x38, %rcx, %rcx
addq %rcx, %rax
movsbl 0x11(%rax), %eax
cmpl $0x0, %eax
jne 0x22c3c0
jmp 0x22c78e
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rax
movl -0x14(%rbp), %ecx
movq (%rax,%rcx,8), %rax
shrq $0x20, %rax
movl %eax, -0x24(%rbp)
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rax
movl -0x14(%rbp), %ecx
movq (%rax,%rcx,8), %rax
movl %eax, -0x2c(%rbp)
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq 0x40(%rax), %rax
movl -0x14(%rbp), %ecx
imulq $0x38, %rcx, %rcx
addq %rcx, %rax
movsbl 0x10(%rax), %ecx
xorl %eax, %eax
subl %ecx, %eax
movb %al, %cl
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq 0x40(%rax), %rax
movl -0x14(%rbp), %edx
imulq $0x38, %rdx, %rdx
addq %rdx, %rax
movb %cl, 0x10(%rax)
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq 0x40(%rax), %rax
movl -0x14(%rbp), %ecx
imulq $0x38, %rcx, %rcx
addq %rcx, %rax
movsbl 0x11(%rax), %ecx
xorl %eax, %eax
subl %ecx, %eax
movb %al, %cl
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq 0x40(%rax), %rax
movl -0x14(%rbp), %edx
imulq $0x38, %rdx, %rdx
addq %rdx, %rax
movb %cl, 0x11(%rax)
movl $0x0, -0x28(%rbp)
movl -0x28(%rbp), %eax
cmpl -0x2c(%rbp), %eax
jae 0x22c78e
movq -0x20(%rbp), %rax
movq 0x28(%rax), %rax
movl -0x24(%rbp), %ecx
addl -0x28(%rbp), %ecx
movl %ecx, %ecx
imulq $0x28, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rax
movq (%rax), %rax
movl %eax, -0x3c(%rbp)
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq 0x40(%rax), %rax
movl -0x14(%rbp), %ecx
imulq $0x38, %rcx, %rcx
addq %rcx, %rax
movsbl 0x10(%rax), %eax
cmpl $0x0, %eax
je 0x22c60c
movq -0x38(%rbp), %rax
movsd 0x8(%rax), %xmm0
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq 0x40(%rax), %rax
movl -0x3c(%rbp), %ecx
imulq $0x38, %rcx, %rcx
addq %rcx, %rax
movq -0x8(%rbp), %rcx
movq (%rcx), %rcx
movq 0x40(%rcx), %rcx
movl -0x14(%rbp), %edx
imulq $0x38, %rdx, %rdx
addq %rdx, %rcx
movsbl 0x10(%rcx), %ecx
cmpl $0x0, %ecx
setl %cl
andb $0x1, %cl
movzbl %cl, %ecx
addsd 0x18(%rax,%rcx,8), %xmm0
movsd %xmm0, 0x18(%rax,%rcx,8)
movq -0x38(%rbp), %rax
movsd 0x8(%rax), %xmm1
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq 0x40(%rax), %rax
movl -0x3c(%rbp), %ecx
imulq $0x38, %rcx, %rcx
addq %rcx, %rax
movq -0x8(%rbp), %rcx
movq (%rcx), %rcx
movq 0x40(%rcx), %rcx
movl -0x14(%rbp), %edx
imulq $0x38, %rdx, %rdx
addq %rdx, %rcx
movsbl 0x10(%rcx), %ecx
cmpl $0x0, %ecx
setg %cl
andb $0x1, %cl
movzbl %cl, %ecx
movsd 0x18(%rax,%rcx,8), %xmm0
subsd %xmm1, %xmm0
movsd %xmm0, 0x18(%rax,%rcx,8)
movq -0x38(%rbp), %rax
movsd 0x10(%rax), %xmm0
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq 0x40(%rax), %rax
movl -0x3c(%rbp), %ecx
imulq $0x38, %rcx, %rcx
addq %rcx, %rax
movq -0x8(%rbp), %rcx
movq (%rcx), %rcx
movq 0x40(%rcx), %rcx
movl -0x14(%rbp), %edx
imulq $0x38, %rdx, %rdx
addq %rdx, %rcx
movsbl 0x10(%rcx), %ecx
cmpl $0x0, %ecx
setl %cl
andb $0x1, %cl
movzbl %cl, %ecx
addl $0x2, %ecx
movslq %ecx, %rcx
addsd 0x18(%rax,%rcx,8), %xmm0
movsd %xmm0, 0x18(%rax,%rcx,8)
movq -0x38(%rbp), %rax
movsd 0x10(%rax), %xmm1
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq 0x40(%rax), %rax
movl -0x3c(%rbp), %ecx
imulq $0x38, %rcx, %rcx
addq %rcx, %rax
movq -0x8(%rbp), %rcx
movq (%rcx), %rcx
movq 0x40(%rcx), %rcx
movl -0x14(%rbp), %edx
imulq $0x38, %rdx, %rdx
addq %rdx, %rcx
movsbl 0x10(%rcx), %ecx
cmpl $0x0, %ecx
setg %cl
andb $0x1, %cl
movzbl %cl, %ecx
addl $0x2, %ecx
movslq %ecx, %rcx
movsd 0x18(%rax,%rcx,8), %xmm0
subsd %xmm1, %xmm0
movsd %xmm0, 0x18(%rax,%rcx,8)
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq 0x40(%rax), %rax
movl -0x14(%rbp), %ecx
imulq $0x38, %rcx, %rcx
addq %rcx, %rax
movsbl 0x11(%rax), %eax
cmpl $0x0, %eax
je 0x22c77e
movq -0x38(%rbp), %rax
movsd 0x18(%rax), %xmm0
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq 0x40(%rax), %rax
movl -0x3c(%rbp), %ecx
imulq $0x38, %rcx, %rcx
addq %rcx, %rax
movq -0x8(%rbp), %rcx
movq (%rcx), %rcx
movq 0x40(%rcx), %rcx
movl -0x14(%rbp), %edx
imulq $0x38, %rdx, %rdx
addq %rdx, %rcx
movsbl 0x11(%rcx), %ecx
cmpl $0x0, %ecx
setl %cl
andb $0x1, %cl
movzbl %cl, %ecx
addsd 0x18(%rax,%rcx,8), %xmm0
movsd %xmm0, 0x18(%rax,%rcx,8)
movq -0x38(%rbp), %rax
movsd 0x18(%rax), %xmm1
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq 0x40(%rax), %rax
movl -0x3c(%rbp), %ecx
imulq $0x38, %rcx, %rcx
addq %rcx, %rax
movq -0x8(%rbp), %rcx
movq (%rcx), %rcx
movq 0x40(%rcx), %rcx
movl -0x14(%rbp), %edx
imulq $0x38, %rdx, %rdx
addq %rdx, %rcx
movsbl 0x11(%rcx), %ecx
cmpl $0x0, %ecx
setg %cl
andb $0x1, %cl
movzbl %cl, %ecx
movsd 0x18(%rax,%rcx,8), %xmm0
subsd %xmm1, %xmm0
movsd %xmm0, 0x18(%rax,%rcx,8)
movq -0x38(%rbp), %rax
movsd 0x20(%rax), %xmm0
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq 0x40(%rax), %rax
movl -0x3c(%rbp), %ecx
imulq $0x38, %rcx, %rcx
addq %rcx, %rax
movq -0x8(%rbp), %rcx
movq (%rcx), %rcx
movq 0x40(%rcx), %rcx
movl -0x14(%rbp), %edx
imulq $0x38, %rdx, %rdx
addq %rdx, %rcx
movsbl 0x11(%rcx), %ecx
cmpl $0x0, %ecx
setl %cl
andb $0x1, %cl
movzbl %cl, %ecx
addl $0x2, %ecx
movslq %ecx, %rcx
addsd 0x18(%rax,%rcx,8), %xmm0
movsd %xmm0, 0x18(%rax,%rcx,8)
movq -0x38(%rbp), %rax
movsd 0x20(%rax), %xmm1
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq 0x40(%rax), %rax
movl -0x3c(%rbp), %ecx
imulq $0x38, %rcx, %rcx
addq %rcx, %rax
movq -0x8(%rbp), %rcx
movq (%rcx), %rcx
movq 0x40(%rcx), %rcx
movl -0x14(%rbp), %edx
imulq $0x38, %rdx, %rdx
addq %rdx, %rcx
movsbl 0x11(%rcx), %ecx
cmpl $0x0, %ecx
setg %cl
andb $0x1, %cl
movzbl %cl, %ecx
addl $0x2, %ecx
movslq %ecx, %rcx
movsd 0x18(%rax,%rcx,8), %xmm0
subsd %xmm1, %xmm0
movsd %xmm0, 0x18(%rax,%rcx,8)
jmp 0x22c780
movl -0x28(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x28(%rbp)
jmp 0x22c469
popq %rbp
retq