// File: bhhbazinga[P]LockFreeHashTable/./lockfree_hashtable.h
// Function: LockFreeHashTable<int, int, std::hash<int>>::InsertRegularNode(LockFreeHashTable<int, int, std::hash<int>>::DummyNode*, LockFreeHashTable<int, int, std::hash<int>>::RegularNode*)
bool LockFreeHashTable<K, V, Hash>::InsertRegularNode(DummyNode* head,
                                                      RegularNode* new_node) {
  Node* prev;
  Node* cur;
  HazardPointer prev_hp, cur_hp;
  auto& reclaimer = TableReclaimer<K, V>::GetInstance();
  do {
    if (SearchNode(head, new_node, &prev, &cur, prev_hp, cur_hp)) {
      V* new_value = new_node->value.load(std::memory_order_consume);
      V* old_value = static_cast<RegularNode*>(cur)->value.exchange(
          new_value, std::memory_order_release);
      reclaimer.ReclaimLater(old_value,
                             [](void* ptr) { delete static_cast<V*>(ptr); });
      new_node->value.store(nullptr, std::memory_order_release);
      delete new_node;
      return false;
    }
    new_node->next.store(cur, std::memory_order_release);
  } while (!prev->next.compare_exchange_weak(
      cur, new_node, std::memory_order_release, std::memory_order_relaxed));

  size_t size = size_.fetch_add(1, std::memory_order_relaxed) + 1;
  size_t power = power_of_2_.load(std::memory_order_relaxed);
  if ((1 << power) * kLoadFactor < size) {
    if (power_of_2_.compare_exchange_strong(power, power + 1,
                                            std::memory_order_release)) {
      assert(bucket_size() <=
             kMaxBucketSize);  // Out of memory or you can change the kMaxLevel
                               // and kSegmentSize.
    }
  }
  return true;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x2e0, %rsp            # imm = 0x2E0
movq %rdi, -0xa0(%rbp)
movq %rsi, -0xa8(%rbp)
movq %rdx, -0xb0(%rbp)
movq -0xa0(%rbp), %rax
movq %rax, -0x148(%rbp)
leaq -0xd0(%rbp), %rdi
callq 0xb020
leaq -0xe0(%rbp), %rdi
callq 0xb020
jmp 0x9548
callq 0xba40
movq %rax, -0x150(%rbp)
jmp 0x9556
movq -0x150(%rbp), %rax
movq %rax, -0xf8(%rbp)
movq -0x148(%rbp), %rdi
movq -0xa8(%rbp), %rsi
movq -0xb0(%rbp), %rdx
movq %rsp, %rax
leaq -0xe0(%rbp), %rcx
movq %rcx, (%rax)
leaq -0xb8(%rbp), %rcx
leaq -0xc0(%rbp), %r8
leaq -0xd0(%rbp), %r9
callq 0xb040
movb %al, -0x151(%rbp)
jmp 0x95a8
movb -0x151(%rbp), %al
testb $0x1, %al
jne 0x95b7
jmp 0x96f5
movq -0xb0(%rbp), %rdi
addq $0x28, %rdi
movl $0x1, %esi
callq 0xa1a0
movq %rax, -0x100(%rbp)
movq -0xc0(%rbp), %rdi
addq $0x28, %rdi
movq -0x100(%rbp), %rsi
movl $0x3, %edx
callq 0xdcf0
movq %rax, -0x108(%rbp)
movq -0xf8(%rbp), %rax
movq %rax, -0x170(%rbp)
movq -0x108(%rbp), %rax
movq %rax, -0x168(%rbp)
leaq -0x128(%rbp), %rdi
movq %rdi, -0x160(%rbp)
leaq -0x129(%rbp), %rsi
callq 0xddb0
movq -0x170(%rbp), %rdi
movq -0x168(%rbp), %rsi
movq -0x160(%rbp), %rdx
callq 0xc180
jmp 0x9648
leaq -0x128(%rbp), %rdi
callq 0x5750
movq -0xb0(%rbp), %rdi
addq $0x28, %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0x3, %edx
callq 0xde40
movq -0xb0(%rbp), %rax
movq %rax, -0x178(%rbp)
cmpq $0x0, %rax
je 0x968e
movq -0x178(%rbp), %rdi
movq (%rdi), %rax
callq *0x10(%rax)
movb $0x0, -0x91(%rbp)
movl $0x1, -0x130(%rbp)
jmp 0x9ffa
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xe8(%rbp)
movl %eax, -0xec(%rbp)
jmp 0xa02f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xe8(%rbp)
movl %eax, -0xec(%rbp)
jmp 0xa023
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xe8(%rbp)
movl %eax, -0xec(%rbp)
leaq -0x128(%rbp), %rdi
callq 0x5750
jmp 0xa023
movq -0xb0(%rbp), %rdi
addq $0x18, %rdi
movq -0xc0(%rbp), %rsi
movl $0x3, %edx
callq 0xb400
movq -0xb8(%rbp), %rdi
addq $0x18, %rdi
movq -0xb0(%rbp), %rdx
leaq -0xc0(%rbp), %rsi
movl $0x3, %ecx
xorl %r8d, %r8d
callq 0xb490
xorb $-0x1, %al
testb $0x1, %al
jne 0x9564
movq -0x148(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x58(%rbp)
movq $0x1, -0x60(%rbp)
movl $0x0, -0x64(%rbp)
movq -0x58(%rbp), %rax
movq %rax, -0x188(%rbp)
movl -0x64(%rbp), %eax
movq -0x60(%rbp), %rcx
movq %rcx, -0x70(%rbp)
decl %eax
movl %eax, %ecx
movq %rcx, -0x180(%rbp)
subl $0x4, %eax
ja 0x979c
movq -0x180(%rbp), %rax
leaq 0x7909(%rip), %rcx      # 0x1109c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x188(%rbp), %rcx
movq -0x70(%rbp), %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x78(%rbp)
jmp 0x9808
movq -0x188(%rbp), %rcx
movq -0x70(%rbp), %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x78(%rbp)
jmp 0x9808
movq -0x188(%rbp), %rcx
movq -0x70(%rbp), %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x78(%rbp)
jmp 0x9808
movq -0x188(%rbp), %rcx
movq -0x70(%rbp), %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x78(%rbp)
jmp 0x9808
movq -0x188(%rbp), %rcx
movq -0x70(%rbp), %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x78(%rbp)
movq -0x148(%rbp), %rax
movq -0x78(%rbp), %rcx
incq %rcx
movq %rcx, -0x138(%rbp)
movq %rax, -0x80(%rbp)
movl $0x0, -0x84(%rbp)
movq -0x80(%rbp), %rax
movq %rax, -0x198(%rbp)
movl -0x84(%rbp), %edi
movl $0xffff, %esi           # imm = 0xFFFF
callq 0x5730
movl %eax, -0x88(%rbp)
movl -0x84(%rbp), %eax
movl %eax, -0x18c(%rbp)
decl %eax
subl $0x2, %eax
jb 0x9881
jmp 0x9861
movl -0x18c(%rbp), %eax
subl $0x5, %eax
je 0x9894
jmp 0x986e
movq -0x198(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x90(%rbp)
jmp 0x98a5
movq -0x198(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x90(%rbp)
jmp 0x98a5
movq -0x198(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x90(%rbp)
movq -0x90(%rbp), %rax
movq %rax, -0x140(%rbp)
movb -0x140(%rbp), %cl
movl $0x1, %eax
shll %cl, %eax
cvtsi2ss %eax, %xmm0
movss 0x77cc(%rip), %xmm1     # 0x11098
mulss %xmm1, %xmm0
movss %xmm0, -0x1a4(%rbp)
movq -0x138(%rbp), %rax
movq %rax, %rdx
shrq %rdx
movl %eax, %ecx
andl $0x1, %ecx
orq %rdx, %rcx
cvtsi2ss %rcx, %xmm0
addss %xmm0, %xmm0
cvtsi2ss %rax, %xmm1
movss %xmm1, -0x1a0(%rbp)
testq %rax, %rax
movss %xmm0, -0x19c(%rbp)
js 0x9920
movss -0x1a0(%rbp), %xmm0
movss %xmm0, -0x19c(%rbp)
movss -0x1a4(%rbp), %xmm1
movss -0x19c(%rbp), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x9fe9
movq -0x148(%rbp), %rcx
movq -0x140(%rbp), %rax
incq %rax
movq %rcx, -0x38(%rbp)
leaq -0x140(%rbp), %rcx
movq %rcx, -0x40(%rbp)
movq %rax, -0x48(%rbp)
movl $0x3, -0x4c(%rbp)
movq -0x38(%rbp), %rax
movq %rax, -0x1e8(%rbp)
movq -0x40(%rbp), %rax
movq %rax, -0x1e0(%rbp)
movq -0x48(%rbp), %rax
movq %rax, -0x1d8(%rbp)
movl -0x4c(%rbp), %edi
movl %edi, -0x1cc(%rbp)
callq 0xaf70
movq -0x1e8(%rbp), %rdi
movq -0x1e0(%rbp), %rsi
movq -0x1d8(%rbp), %rdx
movl -0x1cc(%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, -0x1c8(%rbp)
movl -0x1c(%rbp), %eax
movq -0x10(%rbp), %rcx
movq %rcx, -0x1c0(%rbp)
movq -0x18(%rbp), %rcx
movq %rcx, -0x28(%rbp)
movl -0x20(%rbp), %ecx
movl %ecx, -0x1b4(%rbp)
decl %eax
movl %eax, %ecx
movq %rcx, -0x1b0(%rbp)
subl $0x4, %eax
ja 0x9a11
movq -0x1b0(%rbp), %rax
leaq 0x76a8(%rip), %rcx      # 0x110b0
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movl -0x1b4(%rbp), %eax
decl %eax
subl $0x2, %eax
jb 0x9b07
jmp 0x9a24
movl -0x1b4(%rbp), %eax
subl $0x5, %eax
je 0x9b3a
jmp 0x9ad4
movl -0x1b4(%rbp), %eax
decl %eax
subl $0x2, %eax
jb 0x9bff
jmp 0x9a4b
movl -0x1b4(%rbp), %eax
subl $0x5, %eax
je 0x9c32
jmp 0x9bcc
movl -0x1b4(%rbp), %eax
decl %eax
subl $0x2, %eax
jb 0x9cf7
jmp 0x9a72
movl -0x1b4(%rbp), %eax
subl $0x5, %eax
je 0x9d2a
jmp 0x9cc4
movl -0x1b4(%rbp), %eax
decl %eax
subl $0x2, %eax
jb 0x9def
jmp 0x9a99
movl -0x1b4(%rbp), %eax
subl $0x5, %eax
je 0x9e22
jmp 0x9dbc
movl -0x1b4(%rbp), %eax
decl %eax
subl $0x2, %eax
jb 0x9ee7
jmp 0x9ac0
movl -0x1b4(%rbp), %eax
subl $0x5, %eax
je 0x9f1a
jmp 0x9eb4
movq -0x1c8(%rbp), %rcx
movq -0x1c0(%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 0x9b83
jmp 0x9b72
movq -0x1c8(%rbp), %rcx
movq -0x1c0(%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 0x9ba1
jmp 0x9b90
movq -0x1c8(%rbp), %rcx
movq -0x1c0(%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 0x9bbf
jmp 0x9bae
jmp 0x9fa9
movq -0x1c0(%rbp), %rax
movq -0x1f0(%rbp), %rcx
movq %rcx, (%rax)
movb -0x1f1(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0x9b6d
movq -0x1c0(%rbp), %rax
movq -0x200(%rbp), %rcx
movq %rcx, (%rax)
movb -0x201(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0x9b6d
movq -0x1c0(%rbp), %rax
movq -0x210(%rbp), %rcx
movq %rcx, (%rax)
movb -0x211(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0x9b6d
movq -0x1c8(%rbp), %rcx
movq -0x1c0(%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 0x9c7b
jmp 0x9c6a
movq -0x1c8(%rbp), %rcx
movq -0x1c0(%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 0x9c99
jmp 0x9c88
movq -0x1c8(%rbp), %rcx
movq -0x1c0(%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 0x9cb7
jmp 0x9ca6
jmp 0x9fa9
movq -0x1c0(%rbp), %rax
movq -0x220(%rbp), %rcx
movq %rcx, (%rax)
movb -0x221(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0x9c65
movq -0x1c0(%rbp), %rax
movq -0x230(%rbp), %rcx
movq %rcx, (%rax)
movb -0x231(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0x9c65
movq -0x1c0(%rbp), %rax
movq -0x240(%rbp), %rcx
movq %rcx, (%rax)
movb -0x241(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0x9c65
movq -0x1c8(%rbp), %rcx
movq -0x1c0(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x251(%rbp)
movq %rcx, -0x250(%rbp)
testb $0x1, %al
jne 0x9d73
jmp 0x9d62
movq -0x1c8(%rbp), %rcx
movq -0x1c0(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x261(%rbp)
movq %rcx, -0x260(%rbp)
testb $0x1, %al
jne 0x9d91
jmp 0x9d80
movq -0x1c8(%rbp), %rcx
movq -0x1c0(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x271(%rbp)
movq %rcx, -0x270(%rbp)
testb $0x1, %al
jne 0x9daf
jmp 0x9d9e
jmp 0x9fa9
movq -0x1c0(%rbp), %rax
movq -0x250(%rbp), %rcx
movq %rcx, (%rax)
movb -0x251(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0x9d5d
movq -0x1c0(%rbp), %rax
movq -0x260(%rbp), %rcx
movq %rcx, (%rax)
movb -0x261(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0x9d5d
movq -0x1c0(%rbp), %rax
movq -0x270(%rbp), %rcx
movq %rcx, (%rax)
movb -0x271(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0x9d5d
movq -0x1c8(%rbp), %rcx
movq -0x1c0(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x281(%rbp)
movq %rcx, -0x280(%rbp)
testb $0x1, %al
jne 0x9e6b
jmp 0x9e5a
movq -0x1c8(%rbp), %rcx
movq -0x1c0(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x291(%rbp)
movq %rcx, -0x290(%rbp)
testb $0x1, %al
jne 0x9e89
jmp 0x9e78
movq -0x1c8(%rbp), %rcx
movq -0x1c0(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x2a1(%rbp)
movq %rcx, -0x2a0(%rbp)
testb $0x1, %al
jne 0x9ea7
jmp 0x9e96
jmp 0x9fa9
movq -0x1c0(%rbp), %rax
movq -0x280(%rbp), %rcx
movq %rcx, (%rax)
movb -0x281(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0x9e55
movq -0x1c0(%rbp), %rax
movq -0x290(%rbp), %rcx
movq %rcx, (%rax)
movb -0x291(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0x9e55
movq -0x1c0(%rbp), %rax
movq -0x2a0(%rbp), %rcx
movq %rcx, (%rax)
movb -0x2a1(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0x9e55
movq -0x1c8(%rbp), %rcx
movq -0x1c0(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x2b1(%rbp)
movq %rcx, -0x2b0(%rbp)
testb $0x1, %al
jne 0x9f60
jmp 0x9f4f
movq -0x1c8(%rbp), %rcx
movq -0x1c0(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x2c1(%rbp)
movq %rcx, -0x2c0(%rbp)
testb $0x1, %al
jne 0x9f7e
jmp 0x9f6d
movq -0x1c8(%rbp), %rcx
movq -0x1c0(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rdx
lock
cmpxchgq %rdx, (%rcx)
movq %rax, %rcx
sete %al
movb %al, -0x2d1(%rbp)
movq %rcx, -0x2d0(%rbp)
testb $0x1, %al
jne 0x9f9c
jmp 0x9f8b
jmp 0x9fa9
movq -0x1c0(%rbp), %rax
movq -0x2b0(%rbp), %rcx
movq %rcx, (%rax)
movb -0x2b1(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0x9f4d
movq -0x1c0(%rbp), %rax
movq -0x2c0(%rbp), %rcx
movq %rcx, (%rax)
movb -0x2c1(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0x9f4d
movq -0x1c0(%rbp), %rax
movq -0x2d0(%rbp), %rcx
movq %rcx, (%rax)
movb -0x2d1(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
jmp 0x9f4d
testb $0x1, -0x29(%rbp)
je 0x9fe7
movq -0x148(%rbp), %rdi
callq 0xa220
cmpq 0x10996(%rip), %rax     # 0x1a958
ja 0x9fc6
jmp 0x9fe5
leaq 0x74ab(%rip), %rdi      # 0x11478
leaq 0x74c4(%rip), %rsi      # 0x11498
movl $0x200, %edx            # imm = 0x200
leaq 0x74cf(%rip), %rcx      # 0x114af
callq 0x20c0
jmp 0x9fe7
jmp 0x9fe9
movb $0x1, -0x91(%rbp)
movl $0x1, -0x130(%rbp)
leaq -0xe0(%rbp), %rdi
callq 0xba10
leaq -0xd0(%rbp), %rdi
callq 0xba10
movb -0x91(%rbp), %al
andb $0x1, %al
addq $0x2e0, %rsp            # imm = 0x2E0
popq %rbp
retq
leaq -0xe0(%rbp), %rdi
callq 0xba10
leaq -0xd0(%rbp), %rdi
callq 0xba10
movq -0xe8(%rbp), %rdi
callq 0x2230
nopw (%rax,%rax)