// File: /workspace/github_cpp_makefile_star2_O1/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:
movq (%rdi), %rax
movq 0x40(%rax), %rcx
movl %esi, %eax
imulq $0x38, %rax, %rsi
leaq (%rcx,%rsi), %rdx
addq $0x10, %rdx
movb (%rdx), %r9b
testb %r9b, %r9b
jne 0x16bb3f
cmpb $0x0, 0x1(%rdx)
je 0x16bca7
movq 0x8(%rdi), %rcx
movq 0x10(%rcx), %r8
movq (%r8,%rax,8), %r8
negb %r9b
movb %r9b, (%rdx)
movq (%rdi), %rax
movq 0x40(%rax), %rax
negb 0x11(%rax,%rsi)
testl %r8d, %r8d
je 0x16bca7
movq %r8, %rax
shrq $0x20, %rax
movq 0x28(%rcx), %rcx
movq (%rdi), %rdx
movq 0x40(%rdx), %rdx
addq %rdx, %rsi
addq $0x10, %rsi
movl %r8d, %edi
movl %eax, %r8d
leaq (%r8,%r8,4), %r8
leaq (%rcx,%r8,8), %r8
movl (%r8), %r9d
movzbl (%rsi), %r11d
testq %r11, %r11
je 0x16bc13
movsd 0x8(%r8), %xmm0
imulq $0x38, %r9, %r10
addq %rdx, %r10
shrl $0x7, %r11d
addsd 0x18(%r10,%r11,8), %xmm0
movsd %xmm0, 0x18(%r10,%r11,8)
xorl %r11d, %r11d
cmpb $0x0, (%rsi)
setg %r11b
movsd 0x18(%r10,%r11,8), %xmm0
subsd 0x8(%r8), %xmm0
movsd %xmm0, 0x18(%r10,%r11,8)
movsd 0x10(%r8), %xmm0
movzbl (%rsi), %r11d
shrl $0x7, %r11d
addsd 0x28(%r10,%r11,8), %xmm0
shlq $0x3, %r11
movsd %xmm0, 0x28(%r10,%r11)
xorl %r11d, %r11d
cmpb $0x0, (%rsi)
setg %r11b
movsd 0x28(%r10,%r11,8), %xmm0
subsd 0x10(%r8), %xmm0
movsd %xmm0, 0x28(%r10,%r11,8)
movzbl 0x1(%rsi), %r10d
testq %r10, %r10
je 0x16bc9b
movsd 0x18(%r8), %xmm0
imulq $0x38, %r9, %r9
addq %rdx, %r9
shrl $0x7, %r10d
addsd 0x18(%r9,%r10,8), %xmm0
movsd %xmm0, 0x18(%r9,%r10,8)
xorl %r10d, %r10d
cmpb $0x0, 0x1(%rsi)
setg %r10b
movsd 0x18(%r9,%r10,8), %xmm0
subsd 0x18(%r8), %xmm0
movsd %xmm0, 0x18(%r9,%r10,8)
movsd 0x20(%r8), %xmm0
movzbl 0x1(%rsi), %r10d
shrl $0x7, %r10d
addsd 0x28(%r9,%r10,8), %xmm0
shlq $0x3, %r10
movsd %xmm0, 0x28(%r9,%r10)
xorl %r10d, %r10d
cmpb $0x0, 0x1(%rsi)
setg %r10b
movsd 0x28(%r9,%r10,8), %xmm0
subsd 0x20(%r8), %xmm0
movsd %xmm0, 0x28(%r9,%r10,8)
incq %rax
decq %rdi
jne 0x16bb81
retq