// File: Barath-Kannan[P]SignalsAndSlots/inc/BSignals/details/ContiguousMPMCQueue.hpp
// Function: BSignals::details::ContiguousMPMCQueue<int, 16ul>::dequeue(int&)
bool dequeue(T& data){
        size_t       tail_seq = _tail_seq.load(std::memory_order_relaxed);
        while(true){
            node_t*  node     = &_buffer[tail_seq & (N-1)];
            size_t   node_seq = node->seq.load(std::memory_order_acquire);
            intptr_t dif      = (intptr_t) node_seq - (intptr_t)(tail_seq + 1);
            if (dif == 0) {
                if (_tail_seq.compare_exchange_weak(tail_seq, tail_seq + 1, std::memory_order_relaxed)) {
                    data = node->data;
                    node->seq.store(tail_seq + N, std::memory_order_release);
                    return true;
                }
            }
            else if (dif < 0){
                return false;
            }
            else{
                tail_seq = _tail_seq.load(std::memory_order_relaxed);
            }
        }
    }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x260, %rsp            # imm = 0x260
movq %rdi, -0xc8(%rbp)
movq %rsi, -0xd0(%rbp)
movq -0xc8(%rbp), %rax
movq %rax, -0x108(%rbp)
addq $0x188, %rax            # imm = 0x188
movq %rax, -0x58(%rbp)
movl $0x0, -0x5c(%rbp)
movq -0x58(%rbp), %rax
movq %rax, -0x100(%rbp)
movl -0x5c(%rbp), %edi
movl $0xffff, %esi           # imm = 0xFFFF
callq 0xa060
movl %eax, -0x60(%rbp)
movl -0x5c(%rbp), %eax
movl %eax, -0xf4(%rbp)
decl %eax
subl $0x2, %eax
jb 0xe962
jmp 0xe945
movl -0xf4(%rbp), %eax
subl $0x5, %eax
je 0xe972
jmp 0xe952
movq -0x100(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x68(%rbp)
jmp 0xe980
movq -0x100(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x68(%rbp)
jmp 0xe980
movq -0x100(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x68(%rbp)
movq -0x68(%rbp), %rax
movq %rax, -0xd8(%rbp)
movq -0x108(%rbp), %rdi
movq -0xd8(%rbp), %rax
andl $0xf, %eax
movl %eax, %esi
callq 0xae80
movq %rax, -0xe0(%rbp)
movq -0xe0(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x70(%rbp)
movl $0x2, -0x74(%rbp)
movq -0x70(%rbp), %rax
movq %rax, -0x118(%rbp)
movl -0x74(%rbp), %edi
movl $0xffff, %esi           # imm = 0xFFFF
callq 0xa060
movl %eax, -0x78(%rbp)
movl -0x74(%rbp), %eax
movl %eax, -0x10c(%rbp)
decl %eax
subl $0x2, %eax
jb 0xea0a
jmp 0xe9ed
movl -0x10c(%rbp), %eax
subl $0x5, %eax
je 0xea1a
jmp 0xe9fa
movq -0x118(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x80(%rbp)
jmp 0xea28
movq -0x118(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x80(%rbp)
jmp 0xea28
movq -0x118(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x80(%rbp)
movq -0x80(%rbp), %rax
movq %rax, -0xe8(%rbp)
movq -0xe8(%rbp), %rax
movq -0xd8(%rbp), %rcx
addq $0x1, %rcx
subq %rcx, %rax
movq %rax, -0xf0(%rbp)
cmpq $0x0, -0xf0(%rbp)
jne 0xf1d0
movq -0x108(%rbp), %rcx
addq $0x188, %rcx            # imm = 0x188
movq -0xd8(%rbp), %rax
incq %rax
movq %rcx, -0x38(%rbp)
leaq -0xd8(%rbp), %rcx
movq %rcx, -0x40(%rbp)
movq %rax, -0x48(%rbp)
movl $0x0, -0x4c(%rbp)
movq -0x38(%rbp), %rax
movq %rax, -0x158(%rbp)
movq -0x40(%rbp), %rax
movq %rax, -0x150(%rbp)
movq -0x48(%rbp), %rax
movq %rax, -0x148(%rbp)
movl -0x4c(%rbp), %edi
movl %edi, -0x13c(%rbp)
callq 0xaed0
movq -0x158(%rbp), %rdi
movq -0x150(%rbp), %rsi
movq -0x148(%rbp), %rdx
movl -0x13c(%rbp), %ecx
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movl %ecx, -0x1c(%rbp)
movl %eax, -0x20(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x138(%rbp)
movl -0x1c(%rbp), %eax
movq -0x10(%rbp), %rcx
movq %rcx, -0x130(%rbp)
movq -0x18(%rbp), %rcx
movq %rcx, -0x28(%rbp)
movl -0x20(%rbp), %ecx
movl %ecx, -0x124(%rbp)
decl %eax
movl %eax, %ecx
movq %rcx, -0x120(%rbp)
subl $0x4, %eax
ja 0xeb3c
movq -0x120(%rbp), %rax
leaq 0x5565(%rip), %rcx      # 0x14098
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movl -0x124(%rbp), %eax
decl %eax
subl $0x2, %eax
jb 0xec32
jmp 0xeb4f
movl -0x124(%rbp), %eax
subl $0x5, %eax
je 0xec65
jmp 0xebff
movl -0x124(%rbp), %eax
decl %eax
subl $0x2, %eax
jb 0xed2a
jmp 0xeb76
movl -0x124(%rbp), %eax
subl $0x5, %eax
je 0xed5d
jmp 0xecf7
movl -0x124(%rbp), %eax
decl %eax
subl $0x2, %eax
jb 0xee22
jmp 0xeb9d
movl -0x124(%rbp), %eax
subl $0x5, %eax
je 0xee55
jmp 0xedef
movl -0x124(%rbp), %eax
decl %eax
subl $0x2, %eax
jb 0xef1a
jmp 0xebc4
movl -0x124(%rbp), %eax
subl $0x5, %eax
je 0xef4d
jmp 0xeee7
movl -0x124(%rbp), %eax
decl %eax
subl $0x2, %eax
jb 0xf012
jmp 0xebeb
movl -0x124(%rbp), %eax
subl $0x5, %eax
je 0xf045
jmp 0xefdf
movq -0x138(%rbp), %rcx
movq -0x130(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x161(%rbp)
movq %rcx, -0x160(%rbp)
testb $0x1, %al
jne 0xecae
jmp 0xec9d
movq -0x138(%rbp), %rcx
movq -0x130(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x171(%rbp)
movq %rcx, -0x170(%rbp)
testb $0x1, %al
jne 0xeccc
jmp 0xecbb
movq -0x138(%rbp), %rcx
movq -0x130(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x181(%rbp)
movq %rcx, -0x180(%rbp)
testb $0x1, %al
jne 0xecea
jmp 0xecd9
jmp 0xf0d4
movq -0x130(%rbp), %rax
movq -0x160(%rbp), %rcx
movq %rcx, (%rax)
movb -0x161(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xec98
movq -0x130(%rbp), %rax
movq -0x170(%rbp), %rcx
movq %rcx, (%rax)
movb -0x171(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xec98
movq -0x130(%rbp), %rax
movq -0x180(%rbp), %rcx
movq %rcx, (%rax)
movb -0x181(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xec98
movq -0x138(%rbp), %rcx
movq -0x130(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x191(%rbp)
movq %rcx, -0x190(%rbp)
testb $0x1, %al
jne 0xeda6
jmp 0xed95
movq -0x138(%rbp), %rcx
movq -0x130(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x1a1(%rbp)
movq %rcx, -0x1a0(%rbp)
testb $0x1, %al
jne 0xedc4
jmp 0xedb3
movq -0x138(%rbp), %rcx
movq -0x130(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x1b1(%rbp)
movq %rcx, -0x1b0(%rbp)
testb $0x1, %al
jne 0xede2
jmp 0xedd1
jmp 0xf0d4
movq -0x130(%rbp), %rax
movq -0x190(%rbp), %rcx
movq %rcx, (%rax)
movb -0x191(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xed90
movq -0x130(%rbp), %rax
movq -0x1a0(%rbp), %rcx
movq %rcx, (%rax)
movb -0x1a1(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xed90
movq -0x130(%rbp), %rax
movq -0x1b0(%rbp), %rcx
movq %rcx, (%rax)
movb -0x1b1(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xed90
movq -0x138(%rbp), %rcx
movq -0x130(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x1c1(%rbp)
movq %rcx, -0x1c0(%rbp)
testb $0x1, %al
jne 0xee9e
jmp 0xee8d
movq -0x138(%rbp), %rcx
movq -0x130(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x1d1(%rbp)
movq %rcx, -0x1d0(%rbp)
testb $0x1, %al
jne 0xeebc
jmp 0xeeab
movq -0x138(%rbp), %rcx
movq -0x130(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x1e1(%rbp)
movq %rcx, -0x1e0(%rbp)
testb $0x1, %al
jne 0xeeda
jmp 0xeec9
jmp 0xf0d4
movq -0x130(%rbp), %rax
movq -0x1c0(%rbp), %rcx
movq %rcx, (%rax)
movb -0x1c1(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xee88
movq -0x130(%rbp), %rax
movq -0x1d0(%rbp), %rcx
movq %rcx, (%rax)
movb -0x1d1(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xee88
movq -0x130(%rbp), %rax
movq -0x1e0(%rbp), %rcx
movq %rcx, (%rax)
movb -0x1e1(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xee88
movq -0x138(%rbp), %rcx
movq -0x130(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x1f1(%rbp)
movq %rcx, -0x1f0(%rbp)
testb $0x1, %al
jne 0xef96
jmp 0xef85
movq -0x138(%rbp), %rcx
movq -0x130(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x201(%rbp)
movq %rcx, -0x200(%rbp)
testb $0x1, %al
jne 0xefb4
jmp 0xefa3
movq -0x138(%rbp), %rcx
movq -0x130(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x211(%rbp)
movq %rcx, -0x210(%rbp)
testb $0x1, %al
jne 0xefd2
jmp 0xefc1
jmp 0xf0d4
movq -0x130(%rbp), %rax
movq -0x1f0(%rbp), %rcx
movq %rcx, (%rax)
movb -0x1f1(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xef80
movq -0x130(%rbp), %rax
movq -0x200(%rbp), %rcx
movq %rcx, (%rax)
movb -0x201(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xef80
movq -0x130(%rbp), %rax
movq -0x210(%rbp), %rcx
movq %rcx, (%rax)
movb -0x211(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xef80
movq -0x138(%rbp), %rcx
movq -0x130(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x221(%rbp)
movq %rcx, -0x220(%rbp)
testb $0x1, %al
jne 0xf08b
jmp 0xf07a
movq -0x138(%rbp), %rcx
movq -0x130(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x231(%rbp)
movq %rcx, -0x230(%rbp)
testb $0x1, %al
jne 0xf0a9
jmp 0xf098
movq -0x138(%rbp), %rcx
movq -0x130(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x241(%rbp)
movq %rcx, -0x240(%rbp)
testb $0x1, %al
jne 0xf0c7
jmp 0xf0b6
jmp 0xf0d4
movq -0x130(%rbp), %rax
movq -0x220(%rbp), %rcx
movq %rcx, (%rax)
movb -0x221(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xf078
movq -0x130(%rbp), %rax
movq -0x230(%rbp), %rcx
movq %rcx, (%rax)
movb -0x231(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xf078
movq -0x130(%rbp), %rax
movq -0x240(%rbp), %rcx
movq %rcx, (%rax)
movb -0x241(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xf078
testb $0x1, -0x29(%rbp)
je 0xf1cb
movq -0xe0(%rbp), %rax
movl (%rax), %ecx
movq -0xd0(%rbp), %rax
movl %ecx, (%rax)
movq -0xe0(%rbp), %rcx
addq $0x8, %rcx
movq -0xd8(%rbp), %rax
addq $0x10, %rax
movq %rcx, -0xa0(%rbp)
movq %rax, -0xa8(%rbp)
movl $0x3, -0xac(%rbp)
movq -0xa0(%rbp), %rax
movq %rax, -0x250(%rbp)
movl -0xac(%rbp), %edi
movl $0xffff, %esi           # imm = 0xFFFF
callq 0xa060
movl %eax, -0x248(%rbp)
jmp 0xf144
movl -0x248(%rbp), %eax
movl %eax, -0xb0(%rbp)
movl -0xac(%rbp), %eax
movl %eax, -0x254(%rbp)
movq -0xa8(%rbp), %rcx
movq %rcx, -0xb8(%rbp)
subl $0x3, %eax
je 0xf191
jmp 0xf171
movl -0x254(%rbp), %eax
subl $0x5, %eax
je 0xf1a4
jmp 0xf17e
movq -0x250(%rbp), %rax
movq -0xb8(%rbp), %rcx
movq %rcx, (%rax)
jmp 0xf1bf
movq -0x250(%rbp), %rax
movq -0xb8(%rbp), %rcx
movq %rcx, (%rax)
jmp 0xf1bf
movq -0x250(%rbp), %rcx
movq -0xb8(%rbp), %rax
xchgq %rax, (%rcx)
jmp 0xf1bf
movq %rax, %rdi
callq 0xb820
movb $0x1, -0xb9(%rbp)
jmp 0xf296
jmp 0xf291
cmpq $0x0, -0xf0(%rbp)
jge 0xf1e6
movb $0x0, -0xb9(%rbp)
jmp 0xf296
movq -0x108(%rbp), %rax
addq $0x188, %rax            # imm = 0x188
movq %rax, -0x88(%rbp)
movl $0x0, -0x8c(%rbp)
movq -0x88(%rbp), %rax
movq %rax, -0x260(%rbp)
movl -0x8c(%rbp), %edi
movl $0xffff, %esi           # imm = 0xFFFF
callq 0xa060
movl %eax, -0x90(%rbp)
movl -0x8c(%rbp), %eax
movl %eax, -0x258(%rbp)
decl %eax
subl $0x2, %eax
jb 0xf25d
jmp 0xf23d
movl -0x258(%rbp), %eax
subl $0x5, %eax
je 0xf270
jmp 0xf24a
movq -0x260(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x98(%rbp)
jmp 0xf281
movq -0x260(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x98(%rbp)
jmp 0xf281
movq -0x260(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x98(%rbp)
movq -0x98(%rbp), %rax
movq %rax, -0xd8(%rbp)
jmp 0xf291
jmp 0xe98b
movb -0xb9(%rbp), %al
andb $0x1, %al
addq $0x260, %rsp            # imm = 0x260
popq %rbp
retq
nopw (%rax,%rax)