// File: chhylp123[P]hifiasm/rcut.cpp
// Function: reorder_bub(mc_match_t const*, unsigned int*, unsigned int, unsigned char*, unsigned char, unsigned char, unsigned char, unsigned char, double*, double*, double*, unsigned int*)
void reorder_bub(const mc_match_t *ma, uint32_t *a, uint32_t a_n, uint8_t *ff, uint8_t lf, uint8_t rf, uint8_t cf,
uint8_t cuf, double *sc_l, double *sc_r, double *sc_m, uint32_t *res)
{
	uint32_t k, o, j, n, t, z; mc_edge_t *e; 
	double mm_l, mm_r, m_inner, mm; int64_t mmlk, mmrk, rev, m_inner_k, mmk;
	for (k = 0; k < a_n; k++) ff[a[k]] = cf;
	m_inner = 0; m_inner_k = -1; mm_l = mm_r = 0; mmlk = mmrk = -1;
	for (k = 0, rev = -1; k < a_n; k++) {
		sc_l[k] = sc_r[k] = sc_m[k] = 0;
		o = ma->idx.a[a[k]] >> 32; n = (uint32_t)ma->idx.a[a[k]];
		for (j = 0; j < n; ++j) {
			e = &ma->ma.a[o + j];
			t = ma_y(*e);
			if(ff[t] == lf) sc_l[k] += fabs(e->w);
			if(ff[t] == rf) sc_r[k] += fabs(e->w);
			if(ff[t] == cf) sc_m[k] += fabs(e->w);
		}
		if(sc_l[k] > 0) {
			if(sc_l[k] > mm_l) {
				mm_l = sc_l[k]; mmlk = k; 
			}
		} else if(sc_r[k] > 0) {
			if(sc_r[k] > mm_r) {
				mm_r = sc_r[k]; mmrk = k; 
			}
		} else if(sc_m[k] > 0 && sc_m[k] > m_inner) {
			m_inner = sc_m[k]; m_inner_k = k;
		}
	}
	if(mmlk == -1 && mmrk == -1 && m_inner_k == -1) return;
	if(mmlk != -1) {
		mm = mm_l; mmk = mmlk; rev = 0;
	} else if(mmrk != -1) {
		mm = mm_r; mmk = mmrk; rev = 1;
	} else {
		mm = m_inner; mmk = m_inner_k; rev = 0;
	}

	double *sc = (!rev)?sc_l:sc_r;
	// for (k = 0; k < a_n; k++) {
	// 	// sc_m[k] = 0;
	// 	fprintf(stderr, "+[M::%s] a_n::%u, a[%u]::%u\n", __func__, a_n, k, a[k]);
	// }
	
	z = 0; res[z++] = a[mmk]; ff[a[mmk]] = cuf; 
	for (; z < a_n; ) {
		for (k = 0, mm = 0, mmk = -1; k < a_n; k++) {
			if(ff[a[k]] == cuf) continue;
			o = ma->idx.a[a[k]] >> 32; n = (uint32_t)ma->idx.a[a[k]];
			for (j = 0; j < n; ++j) {
				e = &ma->ma.a[o + j];
				t = ma_y(*e);
				if(ff[t] == cuf) sc[k] += fabs(e->w);
				// if(ff[t] == cuf) sc_m[k] += fabs(e->w);
			}

			if(sc[k] > 0) {
				if(sc[k] > mm) {
					mm = sc[k]; mmk = k; 
				}
			}
		}
		if(mmk == -1) break;
		// fprintf(stderr, "-[M::%s] mmk::%ld, a[%ld]::%u, z::%u\n", __func__, mmk, mmk, a[mmk], z);
		res[z++] = a[mmk]; ff[a[mmk]] = cuf; 
	}
	// fprintf(stderr, "[M::%s] a_n::%u, z::%u\n", __func__, a_n, k, z);
	if(z < a_n) {
		for (k = 0; k < a_n; k++) {
			if(ff[a[k]] == cuf) continue;
			res[z++] = a[k]; ff[a[k]] = cuf;
		}
	}
	assert(z == a_n);
	if(!rev) {
		for (k = 0; k < a_n; k++) {
			a[k] = res[k]; 
			// fprintf(stderr, "[M::%s] a_n::%u, a[k]::%u, res[k]::%u\n", __func__, a_n, a[k], res[k]);
			ff[a[k]] = lf;
		}
	} else {
		for (k = 0; k < a_n; k++) {
			a[k] = res[a_n-k-1]; ff[a[k]] = lf;
		}
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xc0, %rsp
movl %r8d, -0xb4(%rbp)
movq %rcx, %rax
movl -0xb4(%rbp), %ecx
movq %rax, -0xb0(%rbp)
movl %edx, %eax
movq -0xb0(%rbp), %rdx
movl %eax, -0xa4(%rbp)
movq %rsi, %rax
movl -0xa4(%rbp), %esi
movq %rax, -0xa0(%rbp)
movq %rdi, %r8
movq -0xa0(%rbp), %rdi
movb %r9b, %al
movq 0x38(%rbp), %r9
movq 0x30(%rbp), %r9
movq 0x28(%rbp), %r9
movq 0x20(%rbp), %r9
movb 0x18(%rbp), %r9b
movb 0x10(%rbp), %r9b
movq %r8, -0x8(%rbp)
movq %rdi, -0x10(%rbp)
movl %esi, -0x14(%rbp)
movq %rdx, -0x20(%rbp)
movb %cl, -0x21(%rbp)
movb %al, -0x22(%rbp)
movl $0x0, -0x28(%rbp)
movl -0x28(%rbp), %eax
cmpl -0x14(%rbp), %eax
jae 0x21f279
movb 0x10(%rbp), %dl
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
movl -0x28(%rbp), %esi
movl (%rcx,%rsi,4), %ecx
movb %dl, (%rax,%rcx)
movl -0x28(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x28(%rbp)
jmp 0x21f252
xorps %xmm0, %xmm0
movsd %xmm0, -0x60(%rbp)
movq $-0x1, -0x88(%rbp)
xorps %xmm0, %xmm0
movsd %xmm0, -0x58(%rbp)
xorps %xmm0, %xmm0
movsd %xmm0, -0x50(%rbp)
movq $-0x1, -0x78(%rbp)
movq $-0x1, -0x70(%rbp)
movl $0x0, -0x28(%rbp)
movq $-0x1, -0x80(%rbp)
movl -0x28(%rbp), %eax
cmpl -0x14(%rbp), %eax
jae 0x21f4f8
movq 0x30(%rbp), %rax
movl -0x28(%rbp), %ecx
xorps %xmm0, %xmm0
movsd %xmm0, (%rax,%rcx,8)
movq 0x28(%rbp), %rax
movl -0x28(%rbp), %ecx
xorps %xmm0, %xmm0
movsd %xmm0, (%rax,%rcx,8)
movq 0x20(%rbp), %rax
movl -0x28(%rbp), %ecx
xorps %xmm0, %xmm0
movsd %xmm0, (%rax,%rcx,8)
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x10(%rbp), %rcx
movl -0x28(%rbp), %edx
movl (%rcx,%rdx,4), %ecx
movq (%rax,%rcx,8), %rax
shrq $0x20, %rax
movl %eax, -0x2c(%rbp)
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x10(%rbp), %rcx
movl -0x28(%rbp), %edx
movl (%rcx,%rdx,4), %ecx
movq (%rax,%rcx,8), %rax
movl %eax, -0x34(%rbp)
movl $0x0, -0x30(%rbp)
movl -0x30(%rbp), %eax
cmpl -0x34(%rbp), %eax
jae 0x21f41a
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movl -0x2c(%rbp), %ecx
addl -0x30(%rbp), %ecx
movl %ecx, %ecx
shlq $0x4, %rcx
addq %rcx, %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
movq (%rax), %rax
movl %eax, -0x38(%rbp)
movq -0x20(%rbp), %rax
movl -0x38(%rbp), %ecx
movzbl (%rax,%rcx), %eax
movzbl -0x21(%rbp), %ecx
cmpl %ecx, %eax
jne 0x21f39a
movq -0x48(%rbp), %rax
movsd 0x8(%rax), %xmm0
movaps 0x16e56b(%rip), %xmm1   # 0x38d8f0
pand %xmm1, %xmm0
movq 0x20(%rbp), %rax
movl -0x28(%rbp), %ecx
addsd (%rax,%rcx,8), %xmm0
movsd %xmm0, (%rax,%rcx,8)
movq -0x20(%rbp), %rax
movl -0x38(%rbp), %ecx
movzbl (%rax,%rcx), %eax
movzbl -0x22(%rbp), %ecx
cmpl %ecx, %eax
jne 0x21f3d2
movq -0x48(%rbp), %rax
movsd 0x8(%rax), %xmm0
movaps 0x16e533(%rip), %xmm1   # 0x38d8f0
pand %xmm1, %xmm0
movq 0x28(%rbp), %rax
movl -0x28(%rbp), %ecx
addsd (%rax,%rcx,8), %xmm0
movsd %xmm0, (%rax,%rcx,8)
movq -0x20(%rbp), %rax
movl -0x38(%rbp), %ecx
movzbl (%rax,%rcx), %eax
movzbl 0x10(%rbp), %ecx
cmpl %ecx, %eax
jne 0x21f40a
movq -0x48(%rbp), %rax
movsd 0x8(%rax), %xmm0
movaps 0x16e4fb(%rip), %xmm1   # 0x38d8f0
pand %xmm1, %xmm0
movq 0x30(%rbp), %rax
movl -0x28(%rbp), %ecx
addsd (%rax,%rcx,8), %xmm0
movsd %xmm0, (%rax,%rcx,8)
jmp 0x21f40c
movl -0x30(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x30(%rbp)
jmp 0x21f331
movq 0x20(%rbp), %rax
movl -0x28(%rbp), %ecx
movsd (%rax,%rcx,8), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x21f45f
movq 0x20(%rbp), %rax
movl -0x28(%rbp), %ecx
movsd (%rax,%rcx,8), %xmm0
ucomisd -0x50(%rbp), %xmm0
jbe 0x21f45a
movq 0x20(%rbp), %rax
movl -0x28(%rbp), %ecx
movsd (%rax,%rcx,8), %xmm0
movsd %xmm0, -0x50(%rbp)
movl -0x28(%rbp), %eax
movq %rax, -0x70(%rbp)
jmp 0x21f4e8
movq 0x28(%rbp), %rax
movl -0x28(%rbp), %ecx
movsd (%rax,%rcx,8), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x21f4a1
movq 0x28(%rbp), %rax
movl -0x28(%rbp), %ecx
movsd (%rax,%rcx,8), %xmm0
ucomisd -0x58(%rbp), %xmm0
jbe 0x21f49f
movq 0x28(%rbp), %rax
movl -0x28(%rbp), %ecx
movsd (%rax,%rcx,8), %xmm0
movsd %xmm0, -0x58(%rbp)
movl -0x28(%rbp), %eax
movq %rax, -0x78(%rbp)
jmp 0x21f4e6
movq 0x30(%rbp), %rax
movl -0x28(%rbp), %ecx
movsd (%rax,%rcx,8), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x21f4e4
movq 0x30(%rbp), %rax
movl -0x28(%rbp), %ecx
movsd (%rax,%rcx,8), %xmm0
ucomisd -0x60(%rbp), %xmm0
jbe 0x21f4e4
movq 0x30(%rbp), %rax
movl -0x28(%rbp), %ecx
movsd (%rax,%rcx,8), %xmm0
movsd %xmm0, -0x60(%rbp)
movl -0x28(%rbp), %eax
movq %rax, -0x88(%rbp)
jmp 0x21f4e6
jmp 0x21f4e8
jmp 0x21f4ea
movl -0x28(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x28(%rbp)
jmp 0x21f2bb
cmpq $-0x1, -0x70(%rbp)
jne 0x21f515
cmpq $-0x1, -0x78(%rbp)
jne 0x21f515
cmpq $-0x1, -0x88(%rbp)
jne 0x21f515
jmp 0x21f8cf
cmpq $-0x1, -0x70(%rbp)
je 0x21f53b
movsd -0x50(%rbp), %xmm0
movsd %xmm0, -0x68(%rbp)
movq -0x70(%rbp), %rax
movq %rax, -0x90(%rbp)
movq $0x0, -0x80(%rbp)
jmp 0x21f583
cmpq $-0x1, -0x78(%rbp)
je 0x21f561
movsd -0x58(%rbp), %xmm0
movsd %xmm0, -0x68(%rbp)
movq -0x78(%rbp), %rax
movq %rax, -0x90(%rbp)
movq $0x1, -0x80(%rbp)
jmp 0x21f581
movsd -0x60(%rbp), %xmm0
movsd %xmm0, -0x68(%rbp)
movq -0x88(%rbp), %rax
movq %rax, -0x90(%rbp)
movq $0x0, -0x80(%rbp)
jmp 0x21f583
cmpq $0x0, -0x80(%rbp)
jne 0x21f597
movq 0x20(%rbp), %rax
movq %rax, -0xc0(%rbp)
jmp 0x21f5a2
movq 0x28(%rbp), %rax
movq %rax, -0xc0(%rbp)
movq -0xc0(%rbp), %rax
movq %rax, -0x98(%rbp)
movl $0x0, -0x3c(%rbp)
movq -0x10(%rbp), %rax
movq -0x90(%rbp), %rcx
movl (%rax,%rcx,4), %edx
movq 0x38(%rbp), %rax
movl -0x3c(%rbp), %ecx
movl %ecx, %esi
addl $0x1, %esi
movl %esi, -0x3c(%rbp)
movl %ecx, %ecx
movl %edx, (%rax,%rcx,4)
movb 0x18(%rbp), %dl
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
movq -0x90(%rbp), %rsi
movl (%rcx,%rsi,4), %ecx
movb %dl, (%rax,%rcx)
movl -0x3c(%rbp), %eax
cmpl -0x14(%rbp), %eax
jae 0x21f79d
movl $0x0, -0x28(%rbp)
xorps %xmm0, %xmm0
movsd %xmm0, -0x68(%rbp)
movq $-0x1, -0x90(%rbp)
movl -0x28(%rbp), %eax
cmpl -0x14(%rbp), %eax
jae 0x21f752
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
movl -0x28(%rbp), %edx
movl (%rcx,%rdx,4), %ecx
movzbl (%rax,%rcx), %eax
movzbl 0x18(%rbp), %ecx
cmpl %ecx, %eax
jne 0x21f642
jmp 0x21f744
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x10(%rbp), %rcx
movl -0x28(%rbp), %edx
movl (%rcx,%rdx,4), %ecx
movq (%rax,%rcx,8), %rax
shrq $0x20, %rax
movl %eax, -0x2c(%rbp)
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x10(%rbp), %rcx
movl -0x28(%rbp), %edx
movl (%rcx,%rdx,4), %ecx
movq (%rax,%rcx,8), %rax
movl %eax, -0x34(%rbp)
movl $0x0, -0x30(%rbp)
movl -0x30(%rbp), %eax
cmpl -0x34(%rbp), %eax
jae 0x21f6f4
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movl -0x2c(%rbp), %ecx
addl -0x30(%rbp), %ecx
movl %ecx, %ecx
shlq $0x4, %rcx
addq %rcx, %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
movq (%rax), %rax
movl %eax, -0x38(%rbp)
movq -0x20(%rbp), %rax
movl -0x38(%rbp), %ecx
movzbl (%rax,%rcx), %eax
movzbl 0x18(%rbp), %ecx
cmpl %ecx, %eax
jne 0x21f6e7
movq -0x48(%rbp), %rax
movsd 0x8(%rax), %xmm0
movaps 0x16e221(%rip), %xmm1   # 0x38d8f0
pand %xmm1, %xmm0
movq -0x98(%rbp), %rax
movl -0x28(%rbp), %ecx
addsd (%rax,%rcx,8), %xmm0
movsd %xmm0, (%rax,%rcx,8)
jmp 0x21f6e9
movl -0x30(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x30(%rbp)
jmp 0x21f67f
movq -0x98(%rbp), %rax
movl -0x28(%rbp), %ecx
movsd (%rax,%rcx,8), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x21f742
movq -0x98(%rbp), %rax
movl -0x28(%rbp), %ecx
movsd (%rax,%rcx,8), %xmm0
ucomisd -0x68(%rbp), %xmm0
jbe 0x21f740
movq -0x98(%rbp), %rax
movl -0x28(%rbp), %ecx
movsd (%rax,%rcx,8), %xmm0
movsd %xmm0, -0x68(%rbp)
movl -0x28(%rbp), %eax
movq %rax, -0x90(%rbp)
jmp 0x21f742
jmp 0x21f744
movl -0x28(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x28(%rbp)
jmp 0x21f617
cmpq $-0x1, -0x90(%rbp)
jne 0x21f75e
jmp 0x21f79d
movq -0x10(%rbp), %rax
movq -0x90(%rbp), %rcx
movl (%rax,%rcx,4), %edx
movq 0x38(%rbp), %rax
movl -0x3c(%rbp), %ecx
movl %ecx, %esi
addl $0x1, %esi
movl %esi, -0x3c(%rbp)
movl %ecx, %ecx
movl %edx, (%rax,%rcx,4)
movb 0x18(%rbp), %dl
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
movq -0x90(%rbp), %rsi
movl (%rcx,%rsi,4), %ecx
movb %dl, (%rax,%rcx)
jmp 0x21f5f1
movl -0x3c(%rbp), %eax
cmpl -0x14(%rbp), %eax
jae 0x21f80f
movl $0x0, -0x28(%rbp)
movl -0x28(%rbp), %eax
cmpl -0x14(%rbp), %eax
jae 0x21f80d
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
movl -0x28(%rbp), %edx
movl (%rcx,%rdx,4), %ecx
movzbl (%rax,%rcx), %eax
movzbl 0x18(%rbp), %ecx
cmpl %ecx, %eax
jne 0x21f7d0
jmp 0x21f802
movq -0x10(%rbp), %rax
movl -0x28(%rbp), %ecx
movl (%rax,%rcx,4), %edx
movq 0x38(%rbp), %rax
movl -0x3c(%rbp), %ecx
movl %ecx, %esi
addl $0x1, %esi
movl %esi, -0x3c(%rbp)
movl %ecx, %ecx
movl %edx, (%rax,%rcx,4)
movb 0x18(%rbp), %dl
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
movl -0x28(%rbp), %esi
movl (%rcx,%rsi,4), %ecx
movb %dl, (%rax,%rcx)
movl -0x28(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x28(%rbp)
jmp 0x21f7ac
jmp 0x21f80f
movl -0x3c(%rbp), %eax
cmpl -0x14(%rbp), %eax
jne 0x21f819
jmp 0x21f838
leaq 0x16e47f(%rip), %rdi    # 0x38dc9f
leaq 0x16e481(%rip), %rsi    # 0x38dca8
movl $0x90d, %edx            # imm = 0x90D
leaq 0x16e47e(%rip), %rcx    # 0x38dcb1
callq 0x2130
cmpq $0x0, -0x80(%rbp)
jne 0x21f883
movl $0x0, -0x28(%rbp)
movl -0x28(%rbp), %eax
cmpl -0x14(%rbp), %eax
jae 0x21f881
movq 0x38(%rbp), %rax
movl -0x28(%rbp), %ecx
movl (%rax,%rcx,4), %edx
movq -0x10(%rbp), %rax
movl -0x28(%rbp), %ecx
movl %edx, (%rax,%rcx,4)
movb -0x21(%rbp), %dl
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
movl -0x28(%rbp), %esi
movl (%rcx,%rsi,4), %ecx
movb %dl, (%rax,%rcx)
movl -0x28(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x28(%rbp)
jmp 0x21f846
jmp 0x21f8cf
movl $0x0, -0x28(%rbp)
movl -0x28(%rbp), %eax
cmpl -0x14(%rbp), %eax
jae 0x21f8cd
movq 0x38(%rbp), %rax
movl -0x14(%rbp), %ecx
subl -0x28(%rbp), %ecx
subl $0x1, %ecx
movl %ecx, %ecx
movl (%rax,%rcx,4), %edx
movq -0x10(%rbp), %rax
movl -0x28(%rbp), %ecx
movl %edx, (%rax,%rcx,4)
movb -0x21(%rbp), %dl
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
movl -0x28(%rbp), %esi
movl (%rcx,%rsi,4), %ecx
movb %dl, (%rax,%rcx)
movl -0x28(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x28(%rbp)
jmp 0x21f88a
jmp 0x21f8cf
addq $0xc0, %rsp
popq %rbp
retq
nopl (%rax,%rax)