// File: /workspace/github_cpp_makefile_star2_O3/attractivechaos[P]udb2/tsl_robin_map/./robin_hash.h
// Function: std::pair<tsl::detail_robin_hash::robin_hash<std::pair<unsigned int, unsigned int>, tsl::robin_map<unsigned int, unsigned int, Hash32, std::equal_to<unsigned int>, std::allocator<std::pair<unsigned int, unsigned int>>, false, tsl::rh::power_of_two_growth_policy<2ul>>::KeySelect, tsl::robin_map<unsigned int, unsigned int, Hash32, std::equal_to<unsigned int>, std::allocator<std::pair<unsigned int, unsigned int>>, false, tsl::rh::power_of_two_growth_policy<2ul>>::ValueSelect, Hash32, std::equal_to<unsigned int>, std::allocator<std::pair<unsigned int, unsigned int>>, false, tsl::rh::power_of_two_growth_policy<2ul>>::robin_iterator<false>, bool> tsl::detail_robin_hash::robin_hash<std::pair<unsigned int, unsigned int>, tsl::robin_map<unsigned int, unsigned int, Hash32, std::equal_to<unsigned int>, std::allocator<std::pair<unsigned int, unsigned int>>, false, tsl::rh::power_of_two_growth_policy<2ul>>::KeySelect, tsl::robin_map<unsigned int, unsigned int, Hash32, std::equal_to<unsigned int>, std::allocator<std::pair<unsigned int, unsigned int>>, false, tsl::rh::power_of_two_growth_policy<2ul>>::ValueSelect, Hash32, std::equal_to<unsigned int>, std::allocator<std::pair<unsigned int, unsigned int>>, false, tsl::rh::power_of_two_growth_policy<2ul>>::insert_impl<unsigned int, std::pair<unsigned int, unsigned int>>(unsigned int const&, std::pair<unsigned int, unsigned int>&&)
std::pair<iterator, bool> insert_impl(const K& key, Args&&... value_type_args) {
        const std::size_t hash = hash_key(key);
        
        std::size_t ibucket = bucket_for_hash(hash); 
        distance_type dist_from_ideal_bucket = 0;
        
        while(dist_from_ideal_bucket <= m_buckets[ibucket].dist_from_ideal_bucket()) {
            if((!USE_STORED_HASH_ON_LOOKUP || m_buckets[ibucket].bucket_hash_equal(hash)) &&
               compare_keys(KeySelect()(m_buckets[ibucket].value()), key)) 
            {
                return std::make_pair(iterator(m_buckets + ibucket), false);
            }
            
            ibucket = next_bucket(ibucket);
            dist_from_ideal_bucket++;
        }
        
        if(rehash_on_extreme_load()) {
            ibucket = bucket_for_hash(hash);
            dist_from_ideal_bucket = 0;
            
            while(dist_from_ideal_bucket <= m_buckets[ibucket].dist_from_ideal_bucket()) {
                ibucket = next_bucket(ibucket);
                dist_from_ideal_bucket++;
            }
        }
 
        
        if(m_buckets[ibucket].empty()) {
            m_buckets[ibucket].set_value_of_empty_bucket(dist_from_ideal_bucket, bucket_entry::truncate_hash(hash),
                                                         std::forward<Args>(value_type_args)...);
        }
        else {
            insert_value(ibucket, dist_from_ideal_bucket, bucket_entry::truncate_hash(hash), 
                         std::forward<Args>(value_type_args)...);
        }
        
        
        m_nb_elements++;
        /*
         * The value will be inserted in ibucket in any case, either because it was
         * empty or by stealing the bucket (robin hood). 
         */
        return std::make_pair(iterator(m_buckets + ibucket), true);
    }

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rdx, %r14
movq %rdi, %rbx
movl (%rsi), %r15d
movq (%rdi), %rax
movq 0x20(%rdi), %rcx
movl %eax, %r12d
andl %r15d, %r12d
leaq (%r12,%r12,2), %rdx
cmpw $0x0, (%rcx,%rdx,4)
js 0x1c57
leaq (%rcx,%rdx,4), %r13
xorl %ebp, %ebp
cmpl %r15d, 0x4(%r13)
je 0x1cc0
incq %r12
incl %ebp
andq %rax, %r12
leaq (%r12,%r12,2), %rdx
leaq (%rcx,%rdx,4), %r13
cmpw (%r13), %bp
jle 0x1c34
jmp 0x1c59
xorl %ebp, %ebp
movq %rbx, %rdi
callq 0x1cf2
movq 0x20(%rbx), %rcx
testb %al, %al
je 0x1c98
movq (%rbx), %rax
movl %eax, %r12d
andl %r15d, %r12d
leaq (%r12,%r12,2), %rdx
movzwl (%rcx,%rdx,4), %edx
xorl %ebp, %ebp
testw %dx, %dx
js 0x1ca0
incq %r12
incl %ebp
andq %rax, %r12
leaq (%r12,%r12,2), %rdx
movzwl (%rcx,%rdx,4), %edx
cmpw %dx, %bp
jle 0x1c81
jmp 0x1ca0
leaq (%r12,%r12,2), %rax
movzwl (%rcx,%rax,4), %edx
leaq (%r12,%r12,2), %r13
cmpw $-0x1, %dx
je 0x1cc4
movswl %bp, %edx
movq %rbx, %rdi
movq %r12, %rsi
movl %r15d, %ecx
movq %r14, %r8
callq 0x2082
jmp 0x1cd1
xorl %edx, %edx
jmp 0x1cdf
movq (%r14), %rax
movq %rax, 0x4(%rcx,%r13,4)
movw %bp, (%rcx,%r13,4)
incq 0x30(%rbx)
shlq $0x2, %r13
addq 0x20(%rbx), %r13
movb $0x1, %dl
movq %r13, %rax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
nop