// File: Kingsford-Group[P]ghost2/include/hungarian.hpp
// Function: kuhn_findPrime(float**, signed char**, signed char*, signed char*, unsigned long, unsigned long)
size_t* kuhn_findPrime(cell** t, byte** marks, boolean* rowCovered, boolean* colCovered, size_t n, size_t m)
{
    size_t i, j;
    BitSet zeroes = new_BitSet(n * m);
    
    for (i = 0; i < n; i++)
        if (!*(rowCovered + i))
	    for (j = 0; j < m; j++)
	        if ((!*(colCovered + j)) && (*(*(t + i) + j) == 0))
		  BitSet_set(zeroes, i * m + j);
    
    ssize_t p;
    size_t row, col;
    boolean markInRow;
    
    for (;;)
    {
        p = BitSet_any(zeroes);
	if (p < 0)
        {
	    delete[](zeroes.limbs);
	    delete(zeroes.first);
	    delete[](zeroes.next);
	    delete[](zeroes.prev);
	    return null;
	}
	
	row = (size_t)p / m;
	col = (size_t)p % m;
	
	*(*(marks + row) + col) = PRIME;
	
	markInRow = false;
	for (j = 0; j < m; j++)
	    if (*(*(marks + row) + j) == MARKED)
	    {
		markInRow = true;
		col = j;
	    }
	
	if (markInRow)
	{
	    *(rowCovered + row) = true;
	    *(colCovered + col) = false;
	    
	    for (i = 0; i < n; i++)
	        if ((*(*(t + i) + col) == 0) && (row != i))
		{
		    if ((!*(rowCovered + i)) && (!*(colCovered + col)))
		        BitSet_set(zeroes, i * m + col);
		    else
		        BitSet_unset(zeroes, i * m + col);
		}
	    
	    for (j = 0; j < m; j++)
	        if ((*(*(t + row) + j) == 0) && (col != j))
		{
		    if ((!*(rowCovered + row)) && (!*(colCovered + j)))
		        BitSet_set(zeroes, row * m + j);
		    else
		        BitSet_unset(zeroes, row * m + j);
		}
	    
	    if ((!*(rowCovered + row)) && (!*(colCovered + col)))
	        BitSet_set(zeroes, row * m + col);
	    else
	        BitSet_unset(zeroes, row * m + col);
	}
	else
	{
	    size_t* rc = new size_t[2];
	    *rc = row;
	    *(rc + 1) = col;
	    delete[](zeroes.limbs);
	    delete(zeroes.first);
	    delete[](zeroes.next);
	    delete[](zeroes.prev);
	    return rc;
	}
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x1f0, %rsp            # imm = 0x1F0
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movq %r8, -0x30(%rbp)
movq %r9, -0x38(%rbp)
movq -0x30(%rbp), %rsi
imulq -0x38(%rbp), %rsi
leaq -0x68(%rbp), %rdi
callq 0x1c3e0
movq $0x0, -0x40(%rbp)
movq -0x40(%rbp), %rax
cmpq -0x30(%rbp), %rax
jae 0x1b836
movq -0x20(%rbp), %rax
movq -0x40(%rbp), %rcx
cmpb $0x0, (%rax,%rcx)
jne 0x1b823
movq $0x0, -0x48(%rbp)
movq -0x48(%rbp), %rax
cmpq -0x38(%rbp), %rax
jae 0x1b821
movq -0x28(%rbp), %rax
movq -0x48(%rbp), %rcx
cmpb $0x0, (%rax,%rcx)
jne 0x1b80e
movq -0x10(%rbp), %rax
movq -0x40(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq -0x48(%rbp), %rcx
movss (%rax,%rcx,4), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jne 0x1b80e
jp 0x1b80e
movq -0x68(%rbp), %rax
movq %rax, -0x88(%rbp)
movq -0x60(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x58(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x50(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x40(%rbp), %rdi
imulq -0x38(%rbp), %rdi
addq -0x48(%rbp), %rdi
leaq -0x88(%rbp), %rax
movq (%rax), %rcx
movq %rcx, (%rsp)
movq 0x8(%rax), %rcx
movq %rcx, 0x8(%rsp)
movq 0x10(%rax), %rcx
movq %rcx, 0x10(%rsp)
movq 0x18(%rax), %rax
movq %rax, 0x18(%rsp)
callq 0x1c550
jmp 0x1b810
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
jmp 0x1b775
jmp 0x1b823
jmp 0x1b825
movq -0x40(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x40(%rbp)
jmp 0x1b74d
jmp 0x1b838
movq -0x68(%rbp), %rax
movq %rax, -0xc8(%rbp)
movq -0x60(%rbp), %rax
movq %rax, -0xc0(%rbp)
movq -0x58(%rbp), %rax
movq %rax, -0xb8(%rbp)
movq -0x50(%rbp), %rax
movq %rax, -0xb0(%rbp)
leaq -0xc8(%rbp), %rax
movq (%rax), %rcx
movq %rcx, (%rsp)
movq 0x8(%rax), %rcx
movq %rcx, 0x8(%rsp)
movq 0x10(%rax), %rcx
movq %rcx, 0x10(%rsp)
movq 0x18(%rax), %rax
movq %rax, 0x18(%rsp)
callq 0x1c620
movq %rax, -0x90(%rbp)
cmpq $0x0, -0x90(%rbp)
jge 0x1b92d
movq -0x68(%rbp), %rax
movq %rax, -0x198(%rbp)
cmpq $0x0, %rax
je 0x1b8c4
movq -0x198(%rbp), %rdi
callq 0x10940
movq -0x60(%rbp), %rax
movq %rax, -0x1a0(%rbp)
cmpq $0x0, %rax
je 0x1b8e6
movq -0x1a0(%rbp), %rdi
movl $0x8, %esi
callq 0x10710
movq -0x50(%rbp), %rax
movq %rax, -0x1a8(%rbp)
cmpq $0x0, %rax
je 0x1b903
movq -0x1a8(%rbp), %rdi
callq 0x10940
movq -0x58(%rbp), %rax
movq %rax, -0x1b0(%rbp)
cmpq $0x0, %rax
je 0x1b920
movq -0x1b0(%rbp), %rdi
callq 0x10940
movq $0x0, -0x8(%rbp)
jmp 0x1be73
movq -0x90(%rbp), %rax
xorl %ecx, %ecx
movl %ecx, %edx
divq -0x38(%rbp)
movq %rax, -0x98(%rbp)
movq -0x90(%rbp), %rax
xorl %ecx, %ecx
movl %ecx, %edx
divq -0x38(%rbp)
movq %rdx, -0xa0(%rbp)
movq -0x18(%rbp), %rax
movq -0x98(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq -0xa0(%rbp), %rcx
movb $0x2, (%rax,%rcx)
movb $0x0, -0xa1(%rbp)
movq $0x0, -0x48(%rbp)
movq -0x48(%rbp), %rax
cmpq -0x38(%rbp), %rax
jae 0x1b9cc
movq -0x18(%rbp), %rax
movq -0x98(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq -0x48(%rbp), %rcx
movsbq (%rax,%rcx), %rax
cmpq $0x1, %rax
jne 0x1b9bc
movb $0x1, -0xa1(%rbp)
movq -0x48(%rbp), %rax
movq %rax, -0xa0(%rbp)
jmp 0x1b9be
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
jmp 0x1b982
cmpb $0x0, -0xa1(%rbp)
je 0x1bdb4
movq -0x20(%rbp), %rax
movq -0x98(%rbp), %rcx
movb $0x1, (%rax,%rcx)
movq -0x28(%rbp), %rax
movq -0xa0(%rbp), %rcx
movb $0x0, (%rax,%rcx)
movq $0x0, -0x40(%rbp)
movq -0x40(%rbp), %rax
cmpq -0x30(%rbp), %rax
jae 0x1bb52
movq -0x10(%rbp), %rax
movq -0x40(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq -0xa0(%rbp), %rcx
movss (%rax,%rcx,4), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jne 0x1bb3f
jp 0x1bb3f
movq -0x98(%rbp), %rax
cmpq -0x40(%rbp), %rax
je 0x1bb3f
movq -0x20(%rbp), %rax
movq -0x40(%rbp), %rcx
cmpb $0x0, (%rax,%rcx)
jne 0x1bad3
movq -0x28(%rbp), %rax
movq -0xa0(%rbp), %rcx
cmpb $0x0, (%rax,%rcx)
jne 0x1bad3
movq -0x68(%rbp), %rax
movq %rax, -0xe8(%rbp)
movq -0x60(%rbp), %rax
movq %rax, -0xe0(%rbp)
movq -0x58(%rbp), %rax
movq %rax, -0xd8(%rbp)
movq -0x50(%rbp), %rax
movq %rax, -0xd0(%rbp)
movq -0x40(%rbp), %rdi
imulq -0x38(%rbp), %rdi
addq -0xa0(%rbp), %rdi
leaq -0xe8(%rbp), %rax
movq (%rax), %rcx
movq %rcx, (%rsp)
movq 0x8(%rax), %rcx
movq %rcx, 0x8(%rsp)
movq 0x10(%rax), %rcx
movq %rcx, 0x10(%rsp)
movq 0x18(%rax), %rax
movq %rax, 0x18(%rsp)
callq 0x1c550
jmp 0x1bb3d
movq -0x68(%rbp), %rax
movq %rax, -0x108(%rbp)
movq -0x60(%rbp), %rax
movq %rax, -0x100(%rbp)
movq -0x58(%rbp), %rax
movq %rax, -0xf8(%rbp)
movq -0x50(%rbp), %rax
movq %rax, -0xf0(%rbp)
movq -0x40(%rbp), %rdi
imulq -0x38(%rbp), %rdi
addq -0xa0(%rbp), %rdi
leaq -0x108(%rbp), %rax
movq (%rax), %rcx
movq %rcx, (%rsp)
movq 0x8(%rax), %rcx
movq %rcx, 0x8(%rsp)
movq 0x10(%rax), %rcx
movq %rcx, 0x10(%rsp)
movq 0x18(%rax), %rax
movq %rax, 0x18(%rsp)
callq 0x1c690
jmp 0x1bb3f
jmp 0x1bb41
movq -0x40(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x40(%rbp)
jmp 0x1b9ff
movq $0x0, -0x48(%rbp)
movq -0x48(%rbp), %rax
cmpq -0x38(%rbp), %rax
jae 0x1bcad
movq -0x10(%rbp), %rax
movq -0x98(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq -0x48(%rbp), %rcx
movss (%rax,%rcx,4), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jne 0x1bc9a
jp 0x1bc9a
movq -0xa0(%rbp), %rax
cmpq -0x48(%rbp), %rax
je 0x1bc9a
movq -0x20(%rbp), %rax
movq -0x98(%rbp), %rcx
cmpb $0x0, (%rax,%rcx)
jne 0x1bc2e
movq -0x28(%rbp), %rax
movq -0x48(%rbp), %rcx
cmpb $0x0, (%rax,%rcx)
jne 0x1bc2e
movq -0x68(%rbp), %rax
movq %rax, -0x128(%rbp)
movq -0x60(%rbp), %rax
movq %rax, -0x120(%rbp)
movq -0x58(%rbp), %rax
movq %rax, -0x118(%rbp)
movq -0x50(%rbp), %rax
movq %rax, -0x110(%rbp)
movq -0x98(%rbp), %rdi
imulq -0x38(%rbp), %rdi
addq -0x48(%rbp), %rdi
leaq -0x128(%rbp), %rax
movq (%rax), %rcx
movq %rcx, (%rsp)
movq 0x8(%rax), %rcx
movq %rcx, 0x8(%rsp)
movq 0x10(%rax), %rcx
movq %rcx, 0x10(%rsp)
movq 0x18(%rax), %rax
movq %rax, 0x18(%rsp)
callq 0x1c550
jmp 0x1bc98
movq -0x68(%rbp), %rax
movq %rax, -0x148(%rbp)
movq -0x60(%rbp), %rax
movq %rax, -0x140(%rbp)
movq -0x58(%rbp), %rax
movq %rax, -0x138(%rbp)
movq -0x50(%rbp), %rax
movq %rax, -0x130(%rbp)
movq -0x98(%rbp), %rdi
imulq -0x38(%rbp), %rdi
addq -0x48(%rbp), %rdi
leaq -0x148(%rbp), %rax
movq (%rax), %rcx
movq %rcx, (%rsp)
movq 0x8(%rax), %rcx
movq %rcx, 0x8(%rsp)
movq 0x10(%rax), %rcx
movq %rcx, 0x10(%rsp)
movq 0x18(%rax), %rax
movq %rax, 0x18(%rsp)
callq 0x1c690
jmp 0x1bc9a
jmp 0x1bc9c
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
jmp 0x1bb5a
movq -0x20(%rbp), %rax
movq -0x98(%rbp), %rcx
cmpb $0x0, (%rax,%rcx)
jne 0x1bd42
movq -0x28(%rbp), %rax
movq -0xa0(%rbp), %rcx
cmpb $0x0, (%rax,%rcx)
jne 0x1bd42
movq -0x68(%rbp), %rax
movq %rax, -0x168(%rbp)
movq -0x60(%rbp), %rax
movq %rax, -0x160(%rbp)
movq -0x58(%rbp), %rax
movq %rax, -0x158(%rbp)
movq -0x50(%rbp), %rax
movq %rax, -0x150(%rbp)
movq -0x98(%rbp), %rdi
imulq -0x38(%rbp), %rdi
addq -0xa0(%rbp), %rdi
leaq -0x168(%rbp), %rax
movq (%rax), %rcx
movq %rcx, (%rsp)
movq 0x8(%rax), %rcx
movq %rcx, 0x8(%rsp)
movq 0x10(%rax), %rcx
movq %rcx, 0x10(%rsp)
movq 0x18(%rax), %rax
movq %rax, 0x18(%rsp)
callq 0x1c550
jmp 0x1bdaf
movq -0x68(%rbp), %rax
movq %rax, -0x188(%rbp)
movq -0x60(%rbp), %rax
movq %rax, -0x180(%rbp)
movq -0x58(%rbp), %rax
movq %rax, -0x178(%rbp)
movq -0x50(%rbp), %rax
movq %rax, -0x170(%rbp)
movq -0x98(%rbp), %rdi
imulq -0x38(%rbp), %rdi
addq -0xa0(%rbp), %rdi
leaq -0x188(%rbp), %rax
movq (%rax), %rcx
movq %rcx, (%rsp)
movq 0x8(%rax), %rcx
movq %rcx, 0x8(%rsp)
movq 0x10(%rax), %rcx
movq %rcx, 0x10(%rsp)
movq 0x18(%rax), %rax
movq %rax, 0x18(%rsp)
callq 0x1c690
jmp 0x1be6e
movl $0x10, %edi
callq 0x10040
movq %rax, -0x190(%rbp)
movq -0x98(%rbp), %rcx
movq -0x190(%rbp), %rax
movq %rcx, (%rax)
movq -0xa0(%rbp), %rcx
movq -0x190(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x68(%rbp), %rax
movq %rax, -0x1b8(%rbp)
cmpq $0x0, %rax
je 0x1be05
movq -0x1b8(%rbp), %rdi
callq 0x10940
movq -0x60(%rbp), %rax
movq %rax, -0x1c0(%rbp)
cmpq $0x0, %rax
je 0x1be27
movq -0x1c0(%rbp), %rdi
movl $0x8, %esi
callq 0x10710
movq -0x50(%rbp), %rax
movq %rax, -0x1c8(%rbp)
cmpq $0x0, %rax
je 0x1be44
movq -0x1c8(%rbp), %rdi
callq 0x10940
movq -0x58(%rbp), %rax
movq %rax, -0x1d0(%rbp)
cmpq $0x0, %rax
je 0x1be61
movq -0x1d0(%rbp), %rdi
callq 0x10940
movq -0x190(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x1be73
jmp 0x1b838
movq -0x8(%rbp), %rax
addq $0x1f0, %rsp            # imm = 0x1F0
popq %rbp
retq