; assembly | /* r2dec pseudo code output */ | /* bdlc_flathashmap.t/none @ 0x453e60 */ | #include | | uint32_t rotate_left32 (uint32_t value, uint32_t count) { | const uint32_t mask = (CHAR_BIT * sizeof (value)) - 1; | count &= mask; | return (value << count) | (value >> (-count & mask)); | } | ; (fcn) sym.BloombergLP::bdlc::FlatHashTable_bsl::basic_string_char__std::__1::char_traits_char___bsl::allocator_char_____bsl::pair_bsl::basic_string_char__std::__1::char_traits_char___bsl::allocator_char_____double___BloombergLP::bdlc::FlatHashMap_EntryUtil_bsl::basic_string_char__std::__1::char_traits_char___bsl::allocator_char_____double__bsl::pair_bsl::basic_string_char__std::__1::char_traits_char___bsl::allocator_char_____double_____BloombergLP::bslh::FibonacciBadHashWrapper_bsl::hash_bsl::basic_string_char__std::__1::char_traits_char___bsl::allocator_char_________bsl::equal_to_bsl::basic_string_char__std::__1::char_traits_char___bsl::allocator_char_______::rehashRaw_unsigned_long_ () | uint64_t BloombergLP::bdlc::FlatHashTable_bsl::basic_string_char_std::_1::char_traits_char_bsl::allocator_char_bsl::pair_bsl::basic_string_char_std::_1::char_traits_char_bsl::allocator_char_double_BloombergLP::bdlc::FlatHashMap_EntryUtil_bsl::basic_string_char_std::_1::char_traits_char_bsl::allocator_char_double_bsl::pair_bsl::basic_string_char_std::_1::char_traits_char_bsl::allocator_char_double_BloombergLP::bslh::FibonacciBadHashWrapper_bsl::hash_bsl::basic_string_char_std::_1::char_traits_char_bsl::allocator_char_bsl::equal_to_bsl::basic_string_char_std::_1::char_traits_char_bsl::allocator_char_::rehashRaw_unsigned_long_ (int64_t arg2, int64_t arg1) { | void * var_8h; | int64_t var_10h; | int64_t var_1ch; | int64_t var_20h; | int64_t var_28h; | int64_t var_30h; | int64_t var_38h; | int64_t var_40h; | int64_t var_48h; | int64_t var_50h; | int64_t var_58h; | int64_t var_60h; | int64_t var_68h; | int64_t var_70h; | int64_t var_78h; | int64_t var_138h; | int64_t var_198h; | int64_t var_1a0h; | rsi = arg2; | rdi = arg1; | /* BloombergLP::bdlc::FlatHashTable, bsl::allocator >, bsl::pair, bsl::allocator >, double>, BloombergLP::bdlc::FlatHashMap_EntryUtil, bsl::allocator >, double, bsl::pair, bsl::allocator >, double> >, BloombergLP::bslh::FibonacciBadHashWrapper, bsl::allocator > > >, bsl::equal_to, bsl::allocator > > >::rehashRaw(unsigned long) */ 0x00453e60 push rbp | 0x00453e61 push r15 | 0x00453e63 push r14 | 0x00453e65 push r13 | 0x00453e67 push r12 | 0x00453e69 push rbx | 0x00453e6a sub rsp, 0x1a8 | 0x00453e71 mov rbx, rsi | rbx = rsi; 0x00453e74 mov r8, rdi | r8 = rdi; 0x00453e77 mov rbp, qword [rdi + 0x28] | rbp = *((rdi + 0x28)); 0x00453e7b test rbp, rbp | | if (rbp == 0) { 0x00453e7e jne 0x453e9a | 0x00453e80 mov rbp, qword [rip + 0x258fc1] | rbp = BloombergLP::bslma::Default::s_defaultAllocator; 0x00453e87 test rbp, rbp | | if (rbp != 0) { 0x00453e8a jne 0x453e9a | goto label_4; | } 0x00453e8c mov rbp, r8 | 0x00453e8f call 0x460a70 | rax = BloombergLP::bslma::Default::determineAndReturnDefaultAllocator() (); 0x00453e94 mov r8, rbp | r8 = rbp; 0x00453e97 mov rbp, rax | | } | label_4: 0x00453e9a test rbx, rbx | 0x00453e9d mov qword [rsp + 0x38], rbp | *((rsp + 0x38)) = rbp; | if (rbx != 0) { 0x00453ea2 je 0x453f35 | 0x00453ea8 mov r12d, 0x20 | r12d = 0x20; 0x00453eae cmp rbx, 0x21 | | if (rbx >= 0x21) { 0x00453eb2 jb 0x453ed9 | 0x00453eb4 dec rbx | rbx--; 0x00453eb7 or rbx, 1 | rbx |= 1; 0x00453ebb bsr rax, rbx | __asm ("bsr rax, rbx"); 0x00453ebf xor rax, 0x3f | rax ^= 0x3f; 0x00453ec3 mov ecx, eax | ecx = eax; 0x00453ec5 neg cl | cl = -cl; 0x00453ec7 mov r12d, 1 | r12d = 1; 0x00453ecd shl r12, cl | r12 <<= cl; 0x00453ed0 test rax, rax | | if (rax == 0) { 0x00453ed3 je 0x4541b0 | goto label_5; | } | } | label_3: 0x00453ed9 mov r15, r8 | r15 = r8; 0x00453edc imul rsi, r12, 0x38 | rsi = r12 * 0x38; 0x00453ee0 mov rax, qword [rbp] | rax = *(rbp); 0x00453ee4 mov rdi, rbp | rdi = rbp; 0x00453ee7 call qword [rax + 0x10] | rax = uint64_t (*rax + 0x10)() (); 0x00453eea mov qword [rsp + 8], rax | *((rsp + 8)) = rax; 0x00453eef mov rax, qword [rbp] | rax = *(rbp); 0x00453ef3 mov rdi, rbp | rdi = rbp; 0x00453ef6 mov rsi, r12 | rsi = r12; 0x00453ef9 call qword [rax + 0x10] | rax = uint64_t (*rax + 0x10)() (); 0x00453efc mov rbx, rax | rbx = rax; 0x00453eff mov rax, r12 | rax = r12; 0x00453f02 shr rax, 4 | rax >>= 4; 0x00453f06 dec rax | rax--; 0x00453f09 mov rcx, rax | rcx = rax; 0x00453f0c or rcx, 1 | rcx |= 1; 0x00453f10 bsr r14, rcx | __asm ("bsr r14, rcx"); 0x00453f14 xor r14d, 0x3f | r14d ^= 0x3f; 0x00453f18 cmp rax, 1 | 0x00453f1c adc r14d, 0 | r14d += 0; 0x00453f20 mov rdi, rbx | 0x00453f23 mov esi, 0x80 | 0x00453f28 mov rdx, r12 | 0x00453f2b call 0x4038e0 | eax = memset (rbx, 0x80, r12); 0x00453f30 mov r8, r15 | r8 = r15; 0x00453f33 jmp 0x453f44 | | } else { 0x00453f35 xor r14d, r14d | r14d = 0; 0x00453f38 xor r12d, r12d | r12d = 0; 0x00453f3b xor ebx, ebx | ebx = 0; 0x00453f3d xor eax, eax | eax = 0; 0x00453f3f mov qword [rsp + 8], rax | *((rsp + 8)) = rax; | } 0x00453f44 mov rax, qword [r8 + 0x18] | rax = *((r8 + 0x18)); 0x00453f48 test rax, rax | 0x00453f4b mov qword [rsp + 0x20], rbx | *((rsp + 0x20)) = rbx; 0x00453f50 mov qword [rsp + 0x10], r12 | *((rsp + 0x10)) = r12; 0x00453f55 mov qword [rsp + 0x50], r14 | *((rsp + 0x50)) = r14; | if (rax == 0) { 0x00453f5a je 0x45415e | goto label_6; | } 0x00453f60 mov ecx, r14d | ecx = r14d; 0x00453f63 mov qword [rsp + 0x60], rcx | *((rsp + 0x60)) = rcx; 0x00453f68 lea r14, [r12 - 1] | r14 = r12 - 1; 0x00453f6d xor edx, edx | edx = 0; 0x00453f6f lea r9, [rsp + 0x78] | r9 = rsp + 0x78; 0x00453f74 xor esi, esi | esi = 0; 0x00453f76 mov qword [rsp + 0x40], r8 | *((rsp + 0x40)) = r8; 0x00453f7b jmp 0x453f96 | goto label_7; | label_0: 0x00453f80 mov rax, qword [r8 + 0x18] | rax = *((r8 + 0x18)); 0x00453f84 mov rdx, qword [rsp + 0x58] | rdx = *((rsp + 0x58)); | do { 0x00453f89 add rdx, 0x10 | rdx += 0x10; 0x00453f8d cmp rdx, rax | | if (rdx >= rax) { 0x00453f90 jae 0x454160 | goto label_8; | } | label_7: 0x00453f96 mov r10, qword [r8 + 8] | r10 = *((r8 + 8)); 0x00453f9a movdqu xmm0, xmmword [r10 + rdx] | __asm ("movdqu xmm0, xmmword [r10 + rdx]"); 0x00453fa0 pmovmskb ecx, xmm0 | __asm ("pmovmskb ecx, xmm0"); 0x00453fa4 cmp cx, 0xffff | 0x00453fa8 je 0x453f89 | | } while (cx == 0xffff); 0x00453faa add r10, rdx | r10 += rdx; 0x00453fad mov qword [rsp + 0x58], rdx | *((rsp + 0x58)) = rdx; 0x00453fb2 imul r11, rdx, 0x38 | r11 = rdx * 0x38; 0x00453fb6 add r11, qword [r8] | r11 += *(r8); 0x00453fb9 not ecx | ecx = ~ecx; 0x00453fbb movzx ebp, cx | ebp = (int32_t) cx; 0x00453fbe mov qword [rsp + 0x48], r10 | *((rsp + 0x48)) = r10; 0x00453fc3 jmp 0x45403a | goto label_9; | label_1: 0x00453fd0 xor edx, edx | edx = 0; 0x00453fd2 mov r8, qword [rsp + 0x40] | r8 = *((rsp + 0x40)); 0x00453fd7 mov rbx, qword [rsp + 0x20] | rbx = *((rsp + 0x20)); 0x00453fdc mov r10, qword [rsp + 0x48] | r10 = *((rsp + 0x48)); 0x00453fe1 mov r11, r15 | r11 = r15; 0x00453fe4 mov ebp, dword [rsp + 0x1c] | ebp = *((rsp + 0x1c)); | label_2: 0x00453fe8 imul rcx, rdx, 0x38 | rcx = rdx * 0x38; 0x00453fec mov rsi, qword [r13 + 0x30] | rsi = *((r13 + 0x30)); 0x00453ff0 mov rdi, qword [rsp + 8] | rdi = *((rsp + 8)); 0x00453ff5 mov qword [rdi + rcx + 0x30], rsi | *((rdi + rcx + 0x30)) = rsi; 0x00453ffa movdqu xmm0, xmmword [r13] | __asm ("movdqu xmm0, xmmword [r13]"); 0x00454000 movups xmm1, xmmword [r13 + 0x10] | __asm ("movups xmm1, xmmword [r13 + 0x10]"); 0x00454005 movups xmm2, xmmword [r13 + 0x20] | __asm ("movups xmm2, xmmword [r13 + 0x20]"); 0x0045400a movups xmmword [rdi + rcx + 0x20], xmm2 | __asm ("movups xmmword [rdi + rcx + 0x20], xmm2"); 0x0045400f movups xmmword [rdi + rcx + 0x10], xmm1 | __asm ("movups xmmword [rdi + rcx + 0x10], xmm1"); 0x00454014 movdqu xmmword [rdi + rcx], xmm0 | __asm ("movdqu xmmword [rdi + rcx], xmm0"); 0x00454019 and al, 0x7f | al &= 0x7f; 0x0045401b mov byte [rbx + rdx], al | *((rbx + rdx)) = al; 0x0045401e mov rsi, qword [rsp + 0x28] | rsi = *((rsp + 0x28)); 0x00454023 inc rsi | rsi++; 0x00454026 mov eax, 0xfffffffe | eax = 0xfffffffe; 0x0045402b mov rcx, qword [rsp + 0x68] | rcx = *((rsp + 0x68)); 0x00454030 rol eax, cl | eax = rotate_left32 (eax, cl); 0x00454032 and ebp, eax | ebp &= eax; | if (ebp == 0) { 0x00454034 je 0x453f80 | goto label_0; | } | label_9: 0x0045403a mov qword [rsp + 0x28], rsi | *((rsp + 0x28)) = rsi; 0x0045403f mov dword [rsp + 0x1c], ebp | *((rsp + 0x1c)) = ebp; 0x00454043 bsf ebx, ebp | __asm ("bsf ebx, ebp"); 0x00454046 imul rax, rbx, 0x38 | rax = rbx * 0x38; 0x0045404a lea r13, [r11 + rax] | r13 = r11 + rax; 0x0045404e mov byte [r10 + rbx], 0xc0 | *((r10 + rbx)) = 0xc0; 0x00454053 dec qword [r8 + 0x10] | *((r8 + 0x10))--; 0x00454057 mov qword [rsp + 0x198], 0 | *((rsp + 0x198)) = 0; 0x00454063 mov byte [rsp + 0x1a0], 0 | *((rsp + 0x1a0)) = 0; 0x0045406b movdqa xmm0, xmmword [rip + 0x33e2d] | __asm ("movdqa xmm0, xmmword [0x00487ea0]"); 0x00454073 movdqu xmmword [rsp + 0x138], xmm0 | __asm ("movdqu xmmword [rsp + 0x138], xmm0"); 0x0045407c cmp qword [r11 + rax + 0x20], 0x17 | 0x00454082 mov rsi, r13 | rsi = r13; | if (*((r11 + rax + 0x20)) != 0x17) { 0x00454085 je 0x45408b | 0x00454087 mov rsi, qword [r11 + rax] | | } 0x0045408b mov r15, r11 | r15 = r11; 0x0045408e mov rdx, qword [r11 + rax + 0x18] | 0x00454093 mov rdi, r9 | rdi = r9; 0x00454096 mov r12, r9 | r12 = r9; 0x00454099 call 0x45f9d0 | BloombergLP::bslh::SpookyHashAlgorithmImp::update(voidconst*,unsigned long) (rdi, *((r11 + rax)), *((r11 + rax + 0x18))); 0x0045409e mov rax, qword [r13 + 0x18] | rax = *((r13 + 0x18)); 0x004540a2 mov qword [rsp + 0x30], rax | *((rsp + 0x30)) = rax; 0x004540a7 mov edx, 8 | 0x004540ac mov rdi, r12 | 0x004540af lea rsi, [rsp + 0x30] | 0x004540b4 call 0x45f9d0 | BloombergLP::bslh::SpookyHashAlgorithmImp::update(voidconst*,unsigned long) (r12, rsp + 0x30, 8); 0x004540b9 mov rdi, r12 | 0x004540bc lea rsi, [rsp + 0x30] | 0x004540c1 lea rdx, [rsp + 0x70] | 0x004540c6 call 0x45ef50 | BloombergLP::bslh::SpookyHashAlgorithmImp::finalize(unsigned long long*,unsigned long long*) (r12, rsp + 0x30, rsp + 0x70); 0x004540cb mov qword [rsp + 0x68], rbx | *((rsp + 0x68)) = rbx; 0x004540d0 mov r9, r12 | r9 = r12; 0x004540d3 mov rax, qword [rsp + 0x30] | rax = *((rsp + 0x30)); 0x004540d8 movabs rcx, 0x9e3779b97f4a7c15 | rcx = 0x9e3779b97f4a7c15; 0x004540e2 imul rax, rcx | rax *= rcx; 0x004540e6 mov r12, qword [rsp + 0x10] | r12 = *((rsp + 0x10)); 0x004540eb test r12, r12 | | if (r12 == 0) { 0x004540ee je 0x453fd0 | goto label_1; | } 0x004540f4 mov rdx, rax | rdx = rax; 0x004540f7 mov rcx, qword [rsp + 0x60] | rcx = *((rsp + 0x60)); 0x004540fc shr rdx, cl | rdx >>= cl; 0x004540ff shl rdx, 4 | rdx <<= 4; 0x00454103 xor ecx, ecx | ecx = 0; 0x00454105 mov r8, qword [rsp + 0x40] | r8 = *((rsp + 0x40)); 0x0045410a mov rbx, qword [rsp + 0x20] | rbx = *((rsp + 0x20)); 0x0045410f mov r10, qword [rsp + 0x48] | r10 = *((rsp + 0x48)); 0x00454114 mov r11, r15 | r11 = r15; 0x00454117 mov ebp, dword [rsp + 0x1c] | ebp = *((rsp + 0x1c)); 0x0045411b nop dword [rax + rax] | | do { 0x00454120 movdqu xmm0, xmmword [rbx + rdx] | __asm ("movdqu xmm0, xmmword [rbx + rdx]"); 0x00454125 pmovmskb esi, xmm0 | __asm ("pmovmskb esi, xmm0"); 0x00454129 test si, si | | if (si != 0) { 0x0045412c jne 0x454150 | goto label_10; | } 0x0045412e add rdx, 0x10 | rdx += 0x10; 0x00454132 and rdx, r14 | rdx &= r14; 0x00454135 add rcx, 0x10 | rcx += 0x10; 0x00454139 cmp rcx, r12 | 0x0045413c jb 0x454120 | | } while (rcx < r12); 0x0045413e mov rdx, r12 | rdx = r12; 0x00454141 jmp 0x453fe8 | goto label_2; | label_10: 0x00454150 movzx ecx, si | ecx = (int32_t) si; 0x00454153 bsf ecx, ecx | __asm ("bsf ecx, ecx"); 0x00454156 add rdx, rcx | rdx += rcx; 0x00454159 jmp 0x453fe8 | goto label_2; | label_6: 0x0045415e xor esi, esi | esi = 0; | label_8: 0x00454160 mov r14, rsi | r14 = rsi; 0x00454163 mov rsi, qword [r8] | rsi = *(r8); 0x00454166 mov rdi, qword [r8 + 0x28] | rdi = *((r8 + 0x28)); 0x0045416a mov rax, qword [rdi] | rax = *(rdi); 0x0045416d mov r15, r8 | r15 = r8; 0x00454170 call qword [rax + 0x18] | uint64_t (*rax + 0x18)() (); 0x00454173 mov rsi, qword [r15 + 8] | rsi = *((r15 + 8)); 0x00454177 mov rdi, qword [r15 + 0x28] | rdi = *((r15 + 0x28)); 0x0045417b mov rax, qword [rdi] | rax = *(rdi); 0x0045417e call qword [rax + 0x18] | uint64_t (*rax + 0x18)() (); 0x00454181 mov rax, qword [rsp + 8] | rax = *((rsp + 8)); 0x00454186 mov qword [r15], rax | *(r15) = rax; 0x00454189 mov qword [r15 + 8], rbx | *((r15 + 8)) = rbx; 0x0045418d mov qword [r15 + 0x10], r14 | *((r15 + 0x10)) = r14; 0x00454191 mov qword [r15 + 0x18], r12 | *((r15 + 0x18)) = r12; 0x00454195 mov rax, qword [rsp + 0x50] | rax = *((rsp + 0x50)); 0x0045419a mov dword [r15 + 0x20], eax | *((r15 + 0x20)) = eax; 0x0045419e add rsp, 0x1a8 | 0x004541a5 pop rbx | 0x004541a6 pop r12 | 0x004541a8 pop r13 | 0x004541aa pop r14 | 0x004541ac pop r15 | 0x004541ae pop rbp | 0x004541af ret | return rax; | label_5: 0x004541b0 xor r12d, r12d | r12d = 0; 0x004541b3 jmp 0x453ed9 | goto label_3; | }