// File: jswaff[P]prophet3/src/pos.cpp
// Function: add_piece(position*, int, square_t)
void add_piece(position* p,int32 piece,square_t sq) {
    assert(piece != NO_PIECE);
    assert(sq >= 0 && sq < 64);
    assert(p->piece[sq]==NO_PIECE);

    p->piece[sq] = piece;
    uint64 bb_sq = bb_squares[sq];
    if (piece > NO_PIECE) {
        p->white_pieces |= bb_sq;
        if (piece==PAWN) {
            p->white_pawns |= bb_sq;
            p->pawn_key ^= zkeys.pieces[PAWN][WHITE][sq];
        } else if (piece==KNIGHT) {
            p->white_knights |= bb_sq;
        } else if (piece==BISHOP) {
            p->white_bishops |= bb_sq;
        } else if (piece==ROOK) {
            p->white_rooks |= bb_sq;
        } else if (piece==QUEEN) {
            p->white_queens |= bb_sq;
        }
        p->piece_counts[WHITE][piece]++;
        p->hash_key ^= zkeys.pieces[piece][WHITE][sq];
    } else {
        p->black_pieces |= bb_sq;
        if (piece==-PAWN) {
            p->black_pawns |= bb_sq;
            p->pawn_key ^= zkeys.pieces[PAWN][BLACK][sq];
        } else if (piece==-KNIGHT) {
            p->black_knights |= bb_sq;
        } else if (piece==-BISHOP) {
            p->black_bishops |= bb_sq;
        } else if (piece==-ROOK) {
            p->black_rooks |= bb_sq;
        } else if (piece==-QUEEN) {
            p->black_queens |= bb_sq;
        }
        p->piece_counts[BLACK][-piece]++;
        p->hash_key ^= zkeys.pieces[-piece][BLACK][sq];
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x20, %rsp
movq %rdi, -0x8(%rbp)
movl %esi, -0xc(%rbp)
movl %edx, -0x10(%rbp)
cmpl $0x0, -0xc(%rbp)
je 0xeb3a
jmp 0xeb59
leaq 0x27e61(%rip), %rdi     # 0x369a2
leaq 0x28b32(%rip), %rsi     # 0x3767a
movl $0x51, %edx
leaq 0x28f8e(%rip), %rcx     # 0x37ae2
callq 0x20c0
xorl %eax, %eax
cmpl $0x0, -0x10(%rbp)
movb %al, -0x19(%rbp)
jl 0xeb6e
cmpl $0x40, -0x10(%rbp)
setl %al
movb %al, -0x19(%rbp)
movb -0x19(%rbp), %al
testb $0x1, %al
jne 0xeb77
jmp 0xeb79
jmp 0xeb98
leaq 0x28f8e(%rip), %rdi     # 0x37b0e
leaq 0x28af3(%rip), %rsi     # 0x3767a
movl $0x52, %edx
leaq 0x28f4f(%rip), %rcx     # 0x37ae2
callq 0x20c0
movq -0x8(%rbp), %rax
movl -0x10(%rbp), %ecx
cmpl $0x0, (%rax,%rcx,4)
jne 0xeba7
jmp 0xebc6
leaq 0x28f73(%rip), %rdi     # 0x37b21
leaq 0x28ac5(%rip), %rsi     # 0x3767a
movl $0x53, %edx
leaq 0x28f21(%rip), %rcx     # 0x37ae2
callq 0x20c0
movl -0xc(%rbp), %edx
movq -0x8(%rbp), %rax
movl -0x10(%rbp), %ecx
movl %edx, (%rax,%rcx,4)
movl -0x10(%rbp), %eax
movl %eax, %ecx
leaq 0xf6a91(%rip), %rax     # 0x105670
movq (%rax,%rcx,8), %rax
movq %rax, -0x18(%rbp)
cmpl $0x0, -0xc(%rbp)
jle 0xed16
movq -0x18(%rbp), %rcx
movq -0x8(%rbp), %rax
orq 0x1a8(%rax), %rcx
movq %rcx, 0x1a8(%rax)
cmpl $0x1, -0xc(%rbp)
jne 0xec4b
movq -0x18(%rbp), %rcx
movq -0x8(%rbp), %rax
orq 0x158(%rax), %rcx
movq %rcx, 0x158(%rax)
movl -0x10(%rbp), %eax
movl %eax, %ecx
leaq 0xf4b29(%rip), %rax     # 0x103758
movq 0x600(%rax,%rcx,8), %rcx
movq -0x8(%rbp), %rax
xorq 0x1c0(%rax), %rcx
movq %rcx, 0x1c0(%rax)
jmp 0xecc9
cmpl $0x2, -0xc(%rbp)
jne 0xec69
movq -0x18(%rbp), %rcx
movq -0x8(%rbp), %rax
orq 0x168(%rax), %rcx
movq %rcx, 0x168(%rax)
jmp 0xecc7
cmpl $0x3, -0xc(%rbp)
jne 0xec87
movq -0x18(%rbp), %rcx
movq -0x8(%rbp), %rax
orq 0x178(%rax), %rcx
movq %rcx, 0x178(%rax)
jmp 0xecc5
cmpl $0x4, -0xc(%rbp)
jne 0xeca5
movq -0x18(%rbp), %rcx
movq -0x8(%rbp), %rax
orq 0x188(%rax), %rcx
movq %rcx, 0x188(%rax)
jmp 0xecc3
cmpl $0x5, -0xc(%rbp)
jne 0xecc1
movq -0x18(%rbp), %rcx
movq -0x8(%rbp), %rax
orq 0x198(%rax), %rcx
movq %rcx, 0x198(%rax)
jmp 0xecc3
jmp 0xecc5
jmp 0xecc7
jmp 0xecc9
movq -0x8(%rbp), %rax
movslq -0xc(%rbp), %rcx
movl 0x11c(%rax,%rcx,4), %edx
addl $0x1, %edx
movl %edx, 0x11c(%rax,%rcx,4)
movslq -0xc(%rbp), %rcx
leaq 0xf4a6b(%rip), %rax     # 0x103758
shlq $0xa, %rcx
addq %rcx, %rax
movl -0x10(%rbp), %ecx
movq 0x200(%rax,%rcx,8), %rcx
movq -0x8(%rbp), %rax
xorq 0x1b8(%rax), %rcx
movq %rcx, 0x1b8(%rax)
jmp 0xee3a
movq -0x18(%rbp), %rcx
movq -0x8(%rbp), %rax
orq 0x1b0(%rax), %rcx
movq %rcx, 0x1b0(%rax)
cmpl $-0x1, -0xc(%rbp)
jne 0xed70
movq -0x18(%rbp), %rcx
movq -0x8(%rbp), %rax
orq 0x160(%rax), %rcx
movq %rcx, 0x160(%rax)
movl -0x10(%rbp), %eax
movl %eax, %ecx
leaq 0xf4a04(%rip), %rax     # 0x103758
movq 0x400(%rax,%rcx,8), %rcx
movq -0x8(%rbp), %rax
xorq 0x1c0(%rax), %rcx
movq %rcx, 0x1c0(%rax)
jmp 0xedee
cmpl $-0x2, -0xc(%rbp)
jne 0xed8e
movq -0x18(%rbp), %rcx
movq -0x8(%rbp), %rax
orq 0x170(%rax), %rcx
movq %rcx, 0x170(%rax)
jmp 0xedec
cmpl $-0x3, -0xc(%rbp)
jne 0xedac
movq -0x18(%rbp), %rcx
movq -0x8(%rbp), %rax
orq 0x180(%rax), %rcx
movq %rcx, 0x180(%rax)
jmp 0xedea
cmpl $-0x4, -0xc(%rbp)
jne 0xedca
movq -0x18(%rbp), %rcx
movq -0x8(%rbp), %rax
orq 0x190(%rax), %rcx
movq %rcx, 0x190(%rax)
jmp 0xede8
cmpl $-0x5, -0xc(%rbp)
jne 0xede6
movq -0x18(%rbp), %rcx
movq -0x8(%rbp), %rax
orq 0x1a0(%rax), %rcx
movq %rcx, 0x1a0(%rax)
jmp 0xede8
jmp 0xedea
jmp 0xedec
jmp 0xedee
movq -0x8(%rbp), %rax
xorl %ecx, %ecx
subl -0xc(%rbp), %ecx
movslq %ecx, %rcx
movl 0x100(%rax,%rcx,4), %edx
addl $0x1, %edx
movl %edx, 0x100(%rax,%rcx,4)
xorl %eax, %eax
subl -0xc(%rbp), %eax
movslq %eax, %rcx
leaq 0xf493e(%rip), %rax     # 0x103758
shlq $0xa, %rcx
addq %rcx, %rax
movl -0x10(%rbp), %ecx
movq (%rax,%rcx,8), %rcx
movq -0x8(%rbp), %rax
xorq 0x1b8(%rax), %rcx
movq %rcx, 0x1b8(%rax)
addq $0x20, %rsp
popq %rbp
retq