// File: jvanns[P]verbatim/sub/lmdb/libraries/liblmdb/mdb.c
// Function: mdb_node_shrink
static void
mdb_node_shrink(MDB_page *mp, indx_t indx)
{
	MDB_node *node;
	MDB_page *sp, *xp;
	char *base;
	indx_t delta, nsize, len, ptr;
	int i;

	node = NODEPTR(mp, indx);
	sp = (MDB_page *)NODEDATA(node);
	delta = SIZELEFT(sp);
	nsize = NODEDSZ(node) - delta;

	/* Prepare to shift upward, set len = length(subpage part to shift) */
	if (IS_LEAF2(sp)) {
		len = nsize;
		if (nsize & 1)
			return;		/* do not make the node uneven-sized */
	} else {
		xp = (MDB_page *)((char *)sp + delta); /* destination subpage */
		for (i = NUMKEYS(sp); --i >= 0; )
			xp->mp_ptrs[i] = sp->mp_ptrs[i] - delta;
		len = PAGEHDRSZ;
	}
	sp->mp_upper = sp->mp_lower;
	COPY_PGNO(sp->mp_pgno, mp->mp_pgno);
	SETDSZ(node, nsize);

	/* Shift <lower nodes...initial part of subpage> upward */
	base = (char *)mp + mp->mp_upper + PAGEBASE;
	memmove(base + delta, base, (char *)sp + len - base);

	ptr = mp->mp_ptrs[indx];
	for (i = NUMKEYS(mp); --i >= 0; ) {
		if (mp->mp_ptrs[i] <= ptr)
			mp->mp_ptrs[i] += delta;
	}
	mp->mp_upper += delta;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movw %si, %ax
movq %rdi, -0x8(%rbp)
movw %ax, -0xa(%rbp)
movq -0x8(%rbp), %rax
movq -0x8(%rbp), %rcx
movzwl -0xa(%rbp), %edx
movzwl 0x10(%rcx,%rdx,2), %ecx
movslq %ecx, %rcx
addq %rcx, %rax
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rax
addq $0x8, %rax
movq -0x18(%rbp), %rcx
movzwl 0x6(%rcx), %ecx
movslq %ecx, %rcx
addq %rcx, %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movzwl 0xe(%rax), %eax
movq -0x20(%rbp), %rcx
movzwl 0xc(%rcx), %ecx
subl %ecx, %eax
movw %ax, -0x32(%rbp)
movq -0x18(%rbp), %rax
movzwl (%rax), %eax
movq -0x18(%rbp), %rcx
movzwl 0x2(%rcx), %ecx
shll $0x10, %ecx
orl %ecx, %eax
movzwl -0x32(%rbp), %ecx
subl %ecx, %eax
movw %ax, -0x34(%rbp)
movq -0x20(%rbp), %rax
movzwl 0xa(%rax), %eax
andl $0x20, %eax
cmpl $0x20, %eax
jne 0xd0a7
movw -0x34(%rbp), %ax
movw %ax, -0x36(%rbp)
movzwl -0x34(%rbp), %eax
andl $0x1, %eax
cmpl $0x0, %eax
je 0xd0a5
jmp 0xd1f5
jmp 0xd102
movq -0x20(%rbp), %rax
movzwl -0x32(%rbp), %ecx
movslq %ecx, %rcx
addq %rcx, %rax
movq %rax, -0x28(%rbp)
movq -0x20(%rbp), %rax
movzwl 0xc(%rax), %eax
subl $0x10, %eax
shrl %eax
movl %eax, -0x3c(%rbp)
movl -0x3c(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x3c(%rbp)
cmpl $0x0, %eax
jl 0xd0fc
movq -0x20(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movzwl 0x10(%rax,%rcx,2), %eax
movzwl -0x32(%rbp), %ecx
subl %ecx, %eax
movw %ax, %dx
movq -0x28(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movw %dx, 0x10(%rax,%rcx,2)
jmp 0xd0c9
movw $0x10, -0x36(%rbp)
movq -0x20(%rbp), %rax
movw 0xc(%rax), %cx
movq -0x20(%rbp), %rax
movw %cx, 0xe(%rax)
movq -0x8(%rbp), %rax
movq (%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, (%rax)
movzwl -0x34(%rbp), %eax
andl $0xffff, %eax           # imm = 0xFFFF
movw %ax, %cx
movq -0x18(%rbp), %rax
movw %cx, (%rax)
movzwl -0x34(%rbp), %eax
sarl $0x10, %eax
movw %ax, %cx
movq -0x18(%rbp), %rax
movw %cx, 0x2(%rax)
movq -0x8(%rbp), %rax
movq -0x8(%rbp), %rcx
movzwl 0xe(%rcx), %ecx
movslq %ecx, %rcx
addq %rcx, %rax
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rdi
movzwl -0x32(%rbp), %eax
cltq
addq %rax, %rdi
movq -0x30(%rbp), %rsi
movq -0x20(%rbp), %rdx
movzwl -0x36(%rbp), %eax
cltq
addq %rax, %rdx
movq -0x30(%rbp), %rax
subq %rax, %rdx
callq 0x22c0
movq -0x8(%rbp), %rax
movzwl -0xa(%rbp), %ecx
movw 0x10(%rax,%rcx,2), %ax
movw %ax, -0x38(%rbp)
movq -0x8(%rbp), %rax
movzwl 0xc(%rax), %eax
subl $0x10, %eax
shrl %eax
movl %eax, -0x3c(%rbp)
movl -0x3c(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x3c(%rbp)
cmpl $0x0, %eax
jl 0xd1e3
movq -0x8(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movzwl 0x10(%rax,%rcx,2), %eax
movzwl -0x38(%rbp), %ecx
cmpl %ecx, %eax
jg 0xd1e1
movzwl -0x32(%rbp), %esi
movq -0x8(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movzwl 0x10(%rax,%rcx,2), %edx
addl %esi, %edx
movw %dx, 0x10(%rax,%rcx,2)
jmp 0xd1a6
movzwl -0x32(%rbp), %edx
movq -0x8(%rbp), %rax
movzwl 0xe(%rax), %ecx
addl %edx, %ecx
movw %cx, 0xe(%rax)
addq $0x40, %rsp
popq %rbp
retq
nopl (%rax,%rax)