// File: codeandkey[P]neocortex/src/perft.cpp
// Function: perft_movegen(neocortex::Position&, int)
void perft_movegen(Position& p, int depth) {
	if (!depth) {
		current_results.nodes++;

		if (p.capture()) current_results.captures++;
		if (p.check()) current_results.checks++;
		if (p.castle()) current_results.castles++;
		if (p.en_passant()) current_results.en_passant++;
		if (p.promotion()) current_results.promotions++;
	
		return;
	}

	Move pl_moves[MAX_PL_MOVES];
	int num_pl_moves = p.pseudolegal_moves(pl_moves);

	for (int i = 0; i < num_pl_moves; ++i) {
		if (p.make_move(pl_moves[i])) {
			perft_movegen(p, depth - 1);
		}

		p.unmake_move(pl_moves[i]);
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x520, %rsp            # imm = 0x520
movq %rdi, -0x8(%rbp)
movl %esi, -0xc(%rbp)
cmpl $0x0, -0xc(%rbp)
jne 0xb678
movq 0x316dd(%rip), %rax     # 0x3cca0
addq $0x1, %rax
movq %rax, 0x316d2(%rip)     # 0x3cca0
movq -0x8(%rbp), %rdi
callq 0xbbe0
testb $0x1, %al
jne 0xb5dd
jmp 0xb5ef
movq 0x316cc(%rip), %rax     # 0x3ccb0
addq $0x1, %rax
movq %rax, 0x316c1(%rip)     # 0x3ccb0
movq -0x8(%rbp), %rdi
callq 0xbc10
testb $0x1, %al
jne 0xb5fe
jmp 0xb610
movq 0x316a3(%rip), %rax     # 0x3cca8
addq $0x1, %rax
movq %rax, 0x31698(%rip)     # 0x3cca8
movq -0x8(%rbp), %rdi
callq 0xbc40
testb $0x1, %al
jne 0xb61f
jmp 0xb631
movq 0x31692(%rip), %rax     # 0x3ccb8
addq $0x1, %rax
movq %rax, 0x31687(%rip)     # 0x3ccb8
movq -0x8(%rbp), %rdi
callq 0xbc70
testb $0x1, %al
jne 0xb640
jmp 0xb652
movq 0x31681(%rip), %rax     # 0x3ccc8
addq $0x1, %rax
movq %rax, 0x31676(%rip)     # 0x3ccc8
movq -0x8(%rbp), %rdi
callq 0xbca0
testb $0x1, %al
jne 0xb661
jmp 0xb673
movq 0x31658(%rip), %rax     # 0x3ccc0
addq $0x1, %rax
movq %rax, 0x3164d(%rip)     # 0x3ccc0
jmp 0xb7d3
leaq -0x4c0(%rbp), %rax
movq %rax, %rcx
addq $0x4b0, %rcx            # imm = 0x4B0
movq %rcx, -0x510(%rbp)
movq %rax, -0x508(%rbp)
movq -0x508(%rbp), %rdi
movq %rdi, -0x518(%rbp)
callq 0xa870
movq -0x518(%rbp), %rax
movq -0x510(%rbp), %rcx
addq $0xc, %rax
cmpq %rcx, %rax
movq %rax, -0x508(%rbp)
jne 0xb697
movq -0x8(%rbp), %rdi
leaq -0x4c0(%rbp), %rsi
callq 0xe050
movl %eax, -0x4c4(%rbp)
movl $0x0, -0x4c8(%rbp)
movl -0x4c8(%rbp), %eax
cmpl -0x4c4(%rbp), %eax
jge 0xb7d3
movq -0x8(%rbp), %rdi
movslq -0x4c8(%rbp), %rcx
leaq -0x4c0(%rbp), %rax
imulq $0xc, %rcx, %rcx
addq %rcx, %rax
movq (%rax), %rcx
movq %rcx, -0x4d4(%rbp)
movl 0x8(%rax), %eax
movl %eax, -0x4cc(%rbp)
movq -0x4d4(%rbp), %rax
movq %rax, -0x4e4(%rbp)
movl -0x4cc(%rbp), %eax
movl %eax, -0x4dc(%rbp)
movq -0x4e4(%rbp), %rsi
movl -0x4dc(%rbp), %edx
callq 0xd190
testb $0x1, %al
jne 0xb758
jmp 0xb767
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
subl $0x1, %esi
callq 0xb5a0
movq -0x8(%rbp), %rdi
movslq -0x4c8(%rbp), %rcx
leaq -0x4c0(%rbp), %rax
imulq $0xc, %rcx, %rcx
addq %rcx, %rax
movq (%rax), %rcx
movq %rcx, -0x4f0(%rbp)
movl 0x8(%rax), %eax
movl %eax, -0x4e8(%rbp)
movq -0x4f0(%rbp), %rax
movq %rax, -0x500(%rbp)
movl -0x4e8(%rbp), %eax
movl %eax, -0x4f8(%rbp)
movq -0x500(%rbp), %rsi
movl -0x4f8(%rbp), %edx
callq 0xdd20
movl -0x4c8(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x4c8(%rbp)
jmp 0xb6e8
addq $0x520, %rsp            # imm = 0x520
popq %rbp
retq
nopl (%rax)