// File: /workspace/github_cpp_makefile_star2_O3/attractivechaos[P]udb2/sparsepp/./sparsepp/spp.h
// Function: spp::sparse_hashtable<std::pair<unsigned int const, unsigned int>, unsigned int, Hash32, spp::sparse_hash_map<unsigned int, unsigned int, Hash32, std::equal_to<unsigned int>, spp::libc_allocator<std::pair<unsigned int const, unsigned int>>>::SelectKey, spp::sparse_hash_map<unsigned int, unsigned int, Hash32, std::equal_to<unsigned int>, spp::libc_allocator<std::pair<unsigned int const, unsigned int>>>::SetKey, std::equal_to<unsigned int>, spp::libc_allocator<std::pair<unsigned int const, unsigned int>>>::_find_position(unsigned int const&) const
Position _find_position(const key_type &key) const
    {
        size_type num_probes = 0;                    // how many times we've probed
        const size_type bucket_count_minus_one = (const size_type)(bucket_count() - 1);
        size_type bucknum = hash(key) & bucket_count_minus_one;
        Position pos;

        while (1)
        {
            // probe until something happens
            // -----------------------------
            typename Table::GrpPos grp_pos(table, bucknum);

            if (!grp_pos.test_strict())
            {
                // bucket is empty => key not present
                return pos._t ? pos : Position(pt_empty, bucknum);
            }
            else if (grp_pos.test())
            {
                reference ref(grp_pos.unsafe_get());

                if (equals(key, get_key(ref)))
                    return Position(pt_full, bucknum);
            }
            else if (pos._t == pt_empty)
            {
                // first erased position
                pos._t   = pt_erased;
                pos._idx = bucknum;
            }

            ++num_probes;                        // we're doing another probe
            bucknum = (size_type)((bucknum + JUMP_(key, num_probes)) & bucket_count_minus_one);
            assert(num_probes < bucket_count()
                   && "Hashtable is full: an error in key_equal<> or hash<>");
        }
    }

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
movq 0x30(%rdi), %r8
movq 0x40(%rdi), %rdi
leaq -0x1(%rdi), %r9
movl (%rsi), %esi
movl %r9d, %edx
andl %esi, %edx
movl %edx, %eax
shrl $0x5, %eax
leaq (%rax,%rax,2), %rax
movl %edx, %ecx
andl $0x1f, %ecx
movl 0x8(%r8,%rax,8), %ebp
movl 0xc(%r8,%rax,8), %r10d
orl %ebp, %r10d
movl $0x1, %r15d
shll %cl, %r15d
btl %ecx, %r10d
jae 0x286a
cmpq $0x1, %rdi
adcq $0x0, %rdi
leaq (%r8,%rax,8), %r14
xorl %eax, %eax
movl $0x1, %r10d
movl $0x33333333, %r11d      # imm = 0x33333333
testl %ebp, %r15d
je 0x2817
movl $0xffffffff, %r15d      # imm = 0xFFFFFFFF
shll %cl, %r15d
movq (%r14), %rcx
notl %r15d
andl %r15d, %ebp
movl %ebp, %r14d
shrl %r14d
andl $0x15555555, %r14d      # imm = 0x15555555
subl %r14d, %ebp
movl %ebp, %r14d
andl %r11d, %r14d
shrl $0x2, %ebp
andl %r11d, %ebp
addl %r14d, %ebp
movl %ebp, %r14d
shrl $0x4, %r14d
addl %ebp, %r14d
andl $0xf0f0f0f, %r14d       # imm = 0xF0F0F0F
imull $0x1010101, %r14d, %r14d # imm = 0x1010101
shrl $0x18, %r14d
cmpl (%rcx,%r14,8), %esi
jne 0x2822
jmp 0x286e
testl %eax, %eax
cmoveq %rdx, %rbx
movl $0x1, %eax
cmpq %r10, %rdi
je 0x287c
addq %r10, %rdx
andq %r9, %rdx
movq %rdx, %rcx
shrq $0x5, %rcx
leaq (%rcx,%rcx,2), %rcx
leaq (%r8,%rcx,8), %r14
movl %edx, %ecx
andl $0x1f, %ecx
movl 0x8(%r14), %ebp
movl $0x1, %r15d
shll %cl, %r15d
movl 0xc(%r14), %r12d
orl %ebp, %r12d
incq %r10
btl %ecx, %r12d
jb 0x27bd
testl %eax, %eax
cmovneq %rbx, %rdx
jmp 0x2873
xorl %eax, %eax
jmp 0x2873
movl $0x2, %eax
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
leaq 0xe88(%rip), %rdi       # 0x370b
leaq 0x841(%rip), %rsi       # 0x30cb
leaq 0xffd(%rip), %rcx       # 0x388e
movl $0xbf1, %edx            # imm = 0xBF1
callq 0x10a0
nop