// File: /workspace/github_cpp_makefile_star2_O2/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 %r14
pushq %rbx
movq (%rdi), %rax
movq 0x40(%rax), %rcx
movl %esi, %edx
imulq $0x38, %rdx, %rax
leaq (%rcx,%rax), %r8
addq $0x10, %r8
movb (%r8), %r9b
testb %r9b, %r9b
jne 0x12e68f
cmpb $0x0, 0x1(%r8)
je 0x12e804
movq 0x8(%rdi), %rcx
movq 0x10(%rcx), %rsi
movq (%rsi,%rdx,8), %rsi
movl %esi, %edx
shrq $0x20, %rsi
negb %r9b
movb %r9b, (%r8)
movq (%rdi), %r8
movq 0x40(%r8), %r8
negb 0x11(%r8,%rax)
subq $0x1, %rdx
jb 0x12e804
movq 0x28(%rcx), %r9
movl %esi, %r8d
imulq $0x28, %r8, %r10
leaq (%r9,%r10), %r8
movl (%r9,%r10), %r9d
movq (%rdi), %r10
movq 0x40(%r10), %r10
movzbl 0x10(%r10,%rax), %r14d
testq %r14, %r14
je 0x12e769
leaq (%r10,%rax), %rbx
addq $0x10, %rbx
movsd 0x8(%r8), %xmm0
imulq $0x38, %r9, %r11
addq %r10, %r11
shrl $0x7, %r14d
addsd 0x18(%r11,%r14,8), %xmm0
movsd %xmm0, 0x18(%r11,%r14,8)
xorl %r14d, %r14d
cmpb $0x0, (%rbx)
setg %r14b
movsd 0x18(%r11,%r14,8), %xmm0
subsd 0x8(%r8), %xmm0
movsd %xmm0, 0x18(%r11,%r14,8)
movsd 0x10(%r8), %xmm0
movzbl (%rbx), %r14d
shrl $0x7, %r14d
addsd 0x28(%r11,%r14,8), %xmm0
shlq $0x3, %r14
movsd %xmm0, 0x28(%r11,%r14)
xorl %r14d, %r14d
cmpb $0x0, (%rbx)
setg %r14b
movsd 0x28(%r11,%r14,8), %xmm0
subsd 0x10(%r8), %xmm0
movsd %xmm0, 0x28(%r11,%r14,8)
movzbl 0x11(%r10,%rax), %ebx
testq %rbx, %rbx
je 0x12e7fc
leaq (%r10,%rax), %r11
addq $0x11, %r11
movsd 0x18(%r8), %xmm0
imulq $0x38, %r9, %r9
addq %r10, %r9
shrl $0x7, %ebx
addsd 0x18(%r9,%rbx,8), %xmm0
movsd %xmm0, 0x18(%r9,%rbx,8)
xorl %r10d, %r10d
cmpb $0x0, (%r11)
setg %r10b
movsd 0x18(%r9,%r10,8), %xmm0
subsd 0x18(%r8), %xmm0
movsd %xmm0, 0x18(%r9,%r10,8)
movsd 0x20(%r8), %xmm0
movzbl (%r11), %r10d
shrl $0x7, %r10d
addsd 0x28(%r9,%r10,8), %xmm0
shlq $0x3, %r10
movsd %xmm0, 0x28(%r9,%r10)
xorl %r10d, %r10d
cmpb $0x0, (%r11)
setg %r10b
movsd 0x28(%r9,%r10,8), %xmm0
subsd 0x20(%r8), %xmm0
movsd %xmm0, 0x28(%r9,%r10,8)
incq %rsi
jmp 0x12e6b3
popq %rbx
popq %r14
retq