// File: WbtLm[P]mempool/./mempool.cpp
// Function: mpnsp::memPool::allocMemFromPool()
void* mpnsp::memPool::allocMemFromPool()
{
    if(__builtin_expect(status==0,0))
    {
        memPoolInit();
        if(status==0)
        {
            return malloc(unitSize);
        }
    }
    if(topPtr<=-1)
    {
        maxNumInNode=std::min(maxNumInNode<<1,MaxAllocNum);
        int ret=createNewNode(maxNumInNode);
        topPtr=ret<<OffsetBits;
        if(ret==-1)
        {
            topPtr=-1;
            myErrorOperate("allocMemFromPool.there is too many unit. So . Have to call to malloc.",__LINE__,0);
            return malloc(unitSize);
        }
    }
    #define alloc_head(idx) (node->head+idx*unitSize)
    #define alloc_ptr(idx) (node->ptrArr+idx)
    uint nodeIdx=topPtr>>OffsetBits;
    uint offsetIdx=topPtr & MaskOffsetNumb;
    if(nodeArr[nodeIdx]==NULL || nodeArr[nodeIdx]->deleted)      //如果当前节点不存在 or 被删除了
    {
        for(nodeIdx=0;nodeIdx<=MaxNodeNum;)
        {
            if(__builtin_expect(nodeArr[nodeIdx]==NULL,0))
                nodeIdx++;
            else if(nodeArr[nodeIdx]->deleted==1 || nodeIdx==0)
            {
                nodeIdx=nodeArr[nodeIdx]->nptr;
            }
            else
                break;
        }
        if(nodeIdx>MaxNodeNum)
        {
            topPtr=-1;
            return allocMemFromPool();
        }
        offsetIdx=nodeArr[nodeIdx]->top;
    }
    memNode *node=nodeArr[nodeIdx];

    void*retPtr=alloc_head(offsetIdx);
    uint &nodeTop=node->top;
    if(__builtin_expect(node->used >= node->size,0)) //当前节点容纳不下
    {
        int i;
        for(i=nodeArr[0]->nptr;i<=MaxNodeNum;)
        {
            if(__builtin_expect(nodeArr[i]==NULL,0))
                i++;
            else if(nodeArr[i]->deleted==1 || nodeArr[i]->used >= nodeArr[i]->size)
            {
                i=nodeArr[i]->nptr;
            }
            else //能容得下
            {
                node=nodeArr[i];
                retPtr=node->head+node->top;
                node->used++;

                node->top=*alloc_ptr(node->top);
                topPtr=i<<OffsetBits;
                topPtr|=node->top;
                return retPtr;
            }
        }
        //当前容纳不下且也没有节点能容纳下
        topPtr=-1;
        return allocMemFromPool();  //一层递归
    }
    else
    {
        node->used++;
        node->top=*alloc_ptr(offsetIdx);
        topPtr&=~MaskOffsetNumb;
        topPtr|=node->top;
    }
    return retPtr;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x48(%rbp)
movb 0x28(%rax), %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
jne 0x1b52
movq -0x48(%rbp), %rdi
callq 0x1930
movq -0x48(%rbp), %rax
movb 0x28(%rax), %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
jne 0x1b50
movq -0x48(%rbp), %rax
movslq (%rax), %rdi
callq 0x1130
movq %rax, -0x8(%rbp)
jmp 0x1e7a
jmp 0x1b52
movq -0x48(%rbp), %rax
cmpq $-0x1, 0x8(%rax)
jg 0x1bd9
movq -0x48(%rbp), %rsi
movl 0x1c(%rsi), %eax
shll %eax
movl %eax, -0x14(%rbp)
addq $0x18, %rsi
leaq -0x14(%rbp), %rdi
callq 0x2670
movq -0x48(%rbp), %rdi
movl (%rax), %eax
movl %eax, 0x1c(%rdi)
movl 0x1c(%rdi), %esi
callq 0x1630
movl %eax, %ecx
movq -0x48(%rbp), %rax
movl %ecx, -0x18(%rbp)
movl -0x18(%rbp), %ecx
shll $0x15, %ecx
movslq %ecx, %rcx
movq %rcx, 0x8(%rax)
cmpl $-0x1, -0x18(%rbp)
jne 0x1bd7
movq -0x48(%rbp), %rax
movq $-0x1, 0x8(%rax)
leaq 0x3547(%rip), %rdi      # 0x50fd
movl $0xbc, %esi
xorl %edx, %edx
callq 0x13a0
movq -0x48(%rbp), %rax
movslq (%rax), %rdi
callq 0x1130
movq %rax, -0x8(%rbp)
jmp 0x1e7a
jmp 0x1bd9
movq -0x48(%rbp), %rax
movq 0x8(%rax), %rcx
sarq $0x15, %rcx
movl %ecx, -0x1c(%rbp)
movq 0x8(%rax), %rcx
andq $0x1fffff, %rcx         # imm = 0x1FFFFF
movl %ecx, -0x20(%rbp)
movq 0x20(%rax), %rax
movl -0x1c(%rbp), %ecx
cmpq $0x0, (%rax,%rcx,8)
je 0x1c1d
movq -0x48(%rbp), %rax
movq 0x20(%rax), %rax
movl -0x1c(%rbp), %ecx
movq (%rax,%rcx,8), %rax
testb $0x1, 0x10(%rax)
je 0x1cbb
movl $0x0, -0x1c(%rbp)
cmpl $0x7f, -0x1c(%rbp)
ja 0x1c86
movq -0x48(%rbp), %rax
movq 0x20(%rax), %rax
movl -0x1c(%rbp), %ecx
cmpq $0x0, (%rax,%rcx,8)
jne 0x1c47
movl -0x1c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x1c(%rbp)
jmp 0x1c84
movq -0x48(%rbp), %rax
movq 0x20(%rax), %rax
movl -0x1c(%rbp), %ecx
movq (%rax,%rcx,8), %rax
movb 0x10(%rax), %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x1, %eax
je 0x1c69
cmpl $0x0, -0x1c(%rbp)
jne 0x1c80
movq -0x48(%rbp), %rax
movq 0x20(%rax), %rax
movl -0x1c(%rbp), %ecx
movq (%rax,%rcx,8), %rax
movl 0x2c(%rax), %eax
movl %eax, -0x1c(%rbp)
jmp 0x1c82
jmp 0x1c86
jmp 0x1c84
jmp 0x1c24
cmpl $0x7f, -0x1c(%rbp)
jbe 0x1ca6
movq -0x48(%rbp), %rdi
movq $-0x1, 0x8(%rdi)
callq 0x1b00
movq %rax, -0x8(%rbp)
jmp 0x1e7a
movq -0x48(%rbp), %rax
movq 0x20(%rax), %rax
movl -0x1c(%rbp), %ecx
movq (%rax,%rcx,8), %rax
movl 0x28(%rax), %eax
movl %eax, -0x20(%rbp)
movq -0x48(%rbp), %rdx
movq 0x20(%rdx), %rax
movl -0x1c(%rbp), %ecx
movq (%rax,%rcx,8), %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
movl -0x20(%rbp), %ecx
imull (%rdx), %ecx
movl %ecx, %ecx
addq %rcx, %rax
movq %rax, -0x30(%rbp)
movq -0x28(%rbp), %rax
addq $0x28, %rax
movq %rax, -0x38(%rbp)
movq -0x28(%rbp), %rax
movl 0x18(%rax), %eax
movq -0x28(%rbp), %rcx
cmpl 0x14(%rcx), %eax
jb 0x1e2e
movq -0x48(%rbp), %rax
movq 0x20(%rax), %rax
movq (%rax), %rax
movl 0x2c(%rax), %eax
movl %eax, -0x3c(%rbp)
cmpl $0x7f, -0x3c(%rbp)
jg 0x1e17
movq -0x48(%rbp), %rax
movq 0x20(%rax), %rax
movslq -0x3c(%rbp), %rcx
cmpq $0x0, (%rax,%rcx,8)
jne 0x1d41
movl -0x3c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x3c(%rbp)
jmp 0x1e12
movq -0x48(%rbp), %rax
movq 0x20(%rax), %rax
movslq -0x3c(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movb 0x10(%rax), %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x1, %eax
je 0x1d82
movq -0x48(%rbp), %rcx
movq 0x20(%rcx), %rax
movslq -0x3c(%rbp), %rdx
movq (%rax,%rdx,8), %rax
movl 0x18(%rax), %eax
movq 0x20(%rcx), %rcx
movslq -0x3c(%rbp), %rdx
movq (%rcx,%rdx,8), %rcx
cmpl 0x14(%rcx), %eax
jb 0x1d9a
movq -0x48(%rbp), %rax
movq 0x20(%rax), %rax
movslq -0x3c(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movl 0x2c(%rax), %eax
movl %eax, -0x3c(%rbp)
jmp 0x1e10
movq -0x48(%rbp), %rax
movq 0x20(%rax), %rcx
movslq -0x3c(%rbp), %rdx
movq (%rcx,%rdx,8), %rcx
movq %rcx, -0x28(%rbp)
movq -0x28(%rbp), %rcx
movq 0x8(%rcx), %rcx
movq -0x28(%rbp), %rdx
movl 0x28(%rdx), %edx
addq %rdx, %rcx
movq %rcx, -0x30(%rbp)
movq -0x28(%rbp), %rcx
movl 0x18(%rcx), %edx
addl $0x1, %edx
movl %edx, 0x18(%rcx)
movq -0x28(%rbp), %rcx
movq 0x20(%rcx), %rcx
movq -0x28(%rbp), %rdx
movl 0x28(%rdx), %edx
movl (%rcx,%rdx,4), %edx
movq -0x28(%rbp), %rcx
movl %edx, 0x28(%rcx)
movl -0x3c(%rbp), %ecx
shll $0x15, %ecx
movslq %ecx, %rcx
movq %rcx, 0x8(%rax)
movq -0x28(%rbp), %rcx
movl 0x28(%rcx), %ecx
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x30(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x1e7a
jmp 0x1e12
jmp 0x1d16
movq -0x48(%rbp), %rdi
movq $-0x1, 0x8(%rdi)
callq 0x1b00
movq %rax, -0x8(%rbp)
jmp 0x1e7a
movq -0x48(%rbp), %rax
movq -0x28(%rbp), %rcx
movl 0x18(%rcx), %edx
addl $0x1, %edx
movl %edx, 0x18(%rcx)
movq -0x28(%rbp), %rcx
movq 0x20(%rcx), %rcx
movl -0x20(%rbp), %edx
movl (%rcx,%rdx,4), %edx
movq -0x28(%rbp), %rcx
movl %edx, 0x28(%rcx)
movq 0x8(%rax), %rcx
andq $-0x200000, %rcx        # imm = 0xFFE00000
movq %rcx, 0x8(%rax)
movq -0x28(%rbp), %rcx
movl 0x28(%rcx), %ecx
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x30(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x50, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)