// File: Barath-Kannan[P]SignalsAndSlots/inc/BSignals/details/ContiguousMPMCQueue.hpp
// Function: BSignals::details::ContiguousMPMCQueue<int, 16ul>::enqueue(int const&)
bool enqueue(const T& data){
        size_t  head_seq = _head_seq.load(std::memory_order_relaxed);
        while(true){
            node_t*  node     = &_buffer[head_seq & (N-1)];
            size_t   node_seq = node->seq.load(std::memory_order_acquire);
            intptr_t dif      = (intptr_t) node_seq - (intptr_t) head_seq;

            if (dif == 0){
                if (_head_seq.compare_exchange_weak(head_seq, head_seq + 1, std::memory_order_relaxed)) {
                    node->data = data;
                    node->seq.store(head_seq + 1, std::memory_order_release);
                    return true;
                }
            }
            else if (dif < 0){
                return false;
            }
            else{
                head_seq = _head_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 $0x140, %rax            # imm = 0x140
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 0xf5a2
jmp 0xf585
movl -0xf4(%rbp), %eax
subl $0x5, %eax
je 0xf5b2
jmp 0xf592
movq -0x100(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x68(%rbp)
jmp 0xf5c0
movq -0x100(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x68(%rbp)
jmp 0xf5c0
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 0xf64a
jmp 0xf62d
movl -0x10c(%rbp), %eax
subl $0x5, %eax
je 0xf65a
jmp 0xf63a
movq -0x118(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x80(%rbp)
jmp 0xf668
movq -0x118(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x80(%rbp)
jmp 0xf668
movq -0x118(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x80(%rbp)
movq -0x80(%rbp), %rax
movq %rax, -0xe8(%rbp)
movq -0xe8(%rbp), %rax
subq -0xd8(%rbp), %rax
movq %rax, -0xf0(%rbp)
cmpq $0x0, -0xf0(%rbp)
jne 0xfe08
movq -0x108(%rbp), %rcx
addq $0x140, %rcx            # imm = 0x140
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 0xf775
movq -0x120(%rbp), %rax
leaq 0x4940(%rip), %rcx      # 0x140ac
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movl -0x124(%rbp), %eax
decl %eax
subl $0x2, %eax
jb 0xf86b
jmp 0xf788
movl -0x124(%rbp), %eax
subl $0x5, %eax
je 0xf89e
jmp 0xf838
movl -0x124(%rbp), %eax
decl %eax
subl $0x2, %eax
jb 0xf963
jmp 0xf7af
movl -0x124(%rbp), %eax
subl $0x5, %eax
je 0xf996
jmp 0xf930
movl -0x124(%rbp), %eax
decl %eax
subl $0x2, %eax
jb 0xfa5b
jmp 0xf7d6
movl -0x124(%rbp), %eax
subl $0x5, %eax
je 0xfa8e
jmp 0xfa28
movl -0x124(%rbp), %eax
decl %eax
subl $0x2, %eax
jb 0xfb53
jmp 0xf7fd
movl -0x124(%rbp), %eax
subl $0x5, %eax
je 0xfb86
jmp 0xfb20
movl -0x124(%rbp), %eax
decl %eax
subl $0x2, %eax
jb 0xfc4b
jmp 0xf824
movl -0x124(%rbp), %eax
subl $0x5, %eax
je 0xfc7e
jmp 0xfc18
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 0xf8e7
jmp 0xf8d6
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 0xf905
jmp 0xf8f4
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 0xf923
jmp 0xf912
jmp 0xfd0d
movq -0x130(%rbp), %rax
movq -0x160(%rbp), %rcx
movq %rcx, (%rax)
movb -0x161(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xf8d1
movq -0x130(%rbp), %rax
movq -0x170(%rbp), %rcx
movq %rcx, (%rax)
movb -0x171(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xf8d1
movq -0x130(%rbp), %rax
movq -0x180(%rbp), %rcx
movq %rcx, (%rax)
movb -0x181(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xf8d1
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 0xf9df
jmp 0xf9ce
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 0xf9fd
jmp 0xf9ec
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 0xfa1b
jmp 0xfa0a
jmp 0xfd0d
movq -0x130(%rbp), %rax
movq -0x190(%rbp), %rcx
movq %rcx, (%rax)
movb -0x191(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xf9c9
movq -0x130(%rbp), %rax
movq -0x1a0(%rbp), %rcx
movq %rcx, (%rax)
movb -0x1a1(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xf9c9
movq -0x130(%rbp), %rax
movq -0x1b0(%rbp), %rcx
movq %rcx, (%rax)
movb -0x1b1(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xf9c9
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 0xfad7
jmp 0xfac6
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 0xfaf5
jmp 0xfae4
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 0xfb13
jmp 0xfb02
jmp 0xfd0d
movq -0x130(%rbp), %rax
movq -0x1c0(%rbp), %rcx
movq %rcx, (%rax)
movb -0x1c1(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xfac1
movq -0x130(%rbp), %rax
movq -0x1d0(%rbp), %rcx
movq %rcx, (%rax)
movb -0x1d1(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xfac1
movq -0x130(%rbp), %rax
movq -0x1e0(%rbp), %rcx
movq %rcx, (%rax)
movb -0x1e1(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xfac1
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 0xfbcf
jmp 0xfbbe
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 0xfbed
jmp 0xfbdc
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 0xfc0b
jmp 0xfbfa
jmp 0xfd0d
movq -0x130(%rbp), %rax
movq -0x1f0(%rbp), %rcx
movq %rcx, (%rax)
movb -0x1f1(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xfbb9
movq -0x130(%rbp), %rax
movq -0x200(%rbp), %rcx
movq %rcx, (%rax)
movb -0x201(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xfbb9
movq -0x130(%rbp), %rax
movq -0x210(%rbp), %rcx
movq %rcx, (%rax)
movb -0x211(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xfbb9
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 0xfcc4
jmp 0xfcb3
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 0xfce2
jmp 0xfcd1
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 0xfd00
jmp 0xfcef
jmp 0xfd0d
movq -0x130(%rbp), %rax
movq -0x220(%rbp), %rcx
movq %rcx, (%rax)
movb -0x221(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xfcb1
movq -0x130(%rbp), %rax
movq -0x230(%rbp), %rcx
movq %rcx, (%rax)
movb -0x231(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xfcb1
movq -0x130(%rbp), %rax
movq -0x240(%rbp), %rcx
movq %rcx, (%rax)
movb -0x241(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0xfcb1
testb $0x1, -0x29(%rbp)
je 0xfe03
movq -0xd0(%rbp), %rax
movl (%rax), %ecx
movq -0xe0(%rbp), %rax
movl %ecx, (%rax)
movq -0xe0(%rbp), %rcx
addq $0x8, %rcx
movq -0xd8(%rbp), %rax
incq %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 0xfd7c
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 0xfdc9
jmp 0xfda9
movl -0x254(%rbp), %eax
subl $0x5, %eax
je 0xfddc
jmp 0xfdb6
movq -0x250(%rbp), %rax
movq -0xb8(%rbp), %rcx
movq %rcx, (%rax)
jmp 0xfdf7
movq -0x250(%rbp), %rax
movq -0xb8(%rbp), %rcx
movq %rcx, (%rax)
jmp 0xfdf7
movq -0x250(%rbp), %rcx
movq -0xb8(%rbp), %rax
xchgq %rax, (%rcx)
jmp 0xfdf7
movq %rax, %rdi
callq 0xb820
movb $0x1, -0xb9(%rbp)
jmp 0xfece
jmp 0xfec9
cmpq $0x0, -0xf0(%rbp)
jge 0xfe1e
movb $0x0, -0xb9(%rbp)
jmp 0xfece
movq -0x108(%rbp), %rax
addq $0x140, %rax            # imm = 0x140
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 0xfe95
jmp 0xfe75
movl -0x258(%rbp), %eax
subl $0x5, %eax
je 0xfea8
jmp 0xfe82
movq -0x260(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x98(%rbp)
jmp 0xfeb9
movq -0x260(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x98(%rbp)
jmp 0xfeb9
movq -0x260(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x98(%rbp)
movq -0x98(%rbp), %rax
movq %rax, -0xd8(%rbp)
jmp 0xfec9
jmp 0xf5cb
movb -0xb9(%rbp), %al
andb $0x1, %al
addq $0x260, %rsp            # imm = 0x260
popq %rbp
retq
nop