; assembly | /* r2dec pseudo code output */ | /* bdlc_flathashmap.t/assume @ 0x453d10 */ | #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_ () | int64_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) { | int64_t var_8h; | void ** s; | int64_t var_18h; | 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_128h; | int64_t var_188h; | int64_t var_190h; | 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) */ 0x00453d10 push rbp | 0x00453d11 push r15 | 0x00453d13 push r14 | 0x00453d15 push r13 | 0x00453d17 push r12 | 0x00453d19 push rbx | 0x00453d1a sub rsp, 0x198 | 0x00453d21 mov rbx, rsi | rbx = rsi; 0x00453d24 mov rax, qword [rdi + 0x28] | rax = *((rdi + 0x28)); 0x00453d28 mov qword [rsp + 0x10], rax | *((rsp + 0x10)) = rax; 0x00453d2d test rax, rax | | if (rax == 0) { 0x00453d30 jne 0x453d47 | 0x00453d32 mov rax, qword [rip + 0x25810f] | rax = BloombergLP::bslma::Default::s_defaultAllocator; 0x00453d39 mov qword [rsp + 0x10], rax | *((rsp + 0x10)) = rax; 0x00453d3e test rax, rax | | if (rax == 0) { 0x00453d41 je 0x453ddf | goto label_5; | } | } 0x00453d47 test rbx, rbx | | if (rbx == 0) { 0x00453d4a je 0x453df8 | goto label_6; | } | do { 0x00453d50 mov ebp, 0x20 | 0x00453d55 cmp rbx, 0x21 | | if (rbx >= 0x21) { 0x00453d59 jb 0x453d7f | 0x00453d5b dec rbx | rbx--; 0x00453d5e or rbx, 1 | rbx |= 1; 0x00453d62 bsr rax, rbx | __asm ("bsr rax, rbx"); 0x00453d66 xor rax, 0x3f | rax ^= 0x3f; 0x00453d6a mov ecx, eax | ecx = eax; 0x00453d6c neg cl | cl = -cl; 0x00453d6e mov ebp, 1 | 0x00453d73 shl rbp, cl | rbp <<= cl; 0x00453d76 test rax, rax | | if (rax == 0) { 0x00453d79 je 0x45404b | goto label_7; | } | } | label_4: 0x00453d7f mov r14, rdi | r14 = rdi; 0x00453d82 imul rsi, rbp, 0x38 | rsi = rbp * 0x38; 0x00453d86 mov rbx, qword [rsp + 0x10] | rbx = *((rsp + 0x10)); 0x00453d8b mov rax, qword [rbx] | rax = *(rbx); 0x00453d8e mov rdi, rbx | rdi = rbx; 0x00453d91 call qword [rax + 0x10] | rax = uint64_t (*rax + 0x10)() (); 0x00453d94 mov qword [rsp + 8], rax | *((rsp + 8)) = rax; 0x00453d99 mov rax, qword [rbx] | rax = *(rbx); 0x00453d9c mov rdi, rbx | rdi = rbx; 0x00453d9f mov rsi, rbp | rsi = rbp; 0x00453da2 call qword [rax + 0x10] | rax = uint64_t (*rax + 0x10)() (); 0x00453da5 mov r12, rax | r12 = rax; 0x00453da8 mov rbx, rbp | rbx = rbp; 0x00453dab mov rax, rbp | rax = rbp; 0x00453dae shr rax, 4 | rax >>= 4; 0x00453db2 dec rax | rax--; 0x00453db5 mov rcx, rax | rcx = rax; 0x00453db8 or rcx, 1 | rcx |= 1; 0x00453dbc bsr rbp, rcx | __asm ("bsr rbp, rcx"); 0x00453dc0 xor ebp, 0x3f | ebp ^= 0x3f; 0x00453dc3 cmp rax, 1 | 0x00453dc7 adc ebp, 0 | ebp += 0; 0x00453dca mov rdi, r12 | 0x00453dcd mov esi, 0x80 | 0x00453dd2 mov rdx, rbx | 0x00453dd5 call 0x4038e0 | memset (r12, 0x80, rbx); 0x00453dda mov rdi, r14 | rdi = r14; 0x00453ddd jmp 0x453e06 | goto label_8; | label_5: 0x00453ddf mov rbp, rdi | 0x00453de2 call 0x460860 | rax = BloombergLP::bslma::Default::determineAndReturnDefaultAllocator() (); 0x00453de7 mov rdi, rbp | rdi = rbp; 0x00453dea mov qword [rsp + 0x10], rax | *((rsp + 0x10)) = rax; 0x00453def test rbx, rbx | 0x00453df2 jne 0x453d50 | | } while (rbx != 0); | label_6: 0x00453df8 xor ebp, ebp | ebp = 0; 0x00453dfa xor ebx, ebx | ebx = 0; 0x00453dfc xor r12d, r12d | r12d = 0; 0x00453dff xor eax, eax | eax = 0; 0x00453e01 mov qword [rsp + 8], rax | *((rsp + 8)) = rax; | label_8: 0x00453e06 mov rax, qword [rdi + 0x18] | rax = *((rdi + 0x18)); 0x00453e0a test rax, rax | 0x00453e0d mov qword [rsp + 0x18], r12 | *((rsp + 0x18)) = r12; 0x00453e12 mov qword [rsp + 0x30], rbp | *((rsp + 0x30)) = rbp; | if (rax == 0) { 0x00453e17 je 0x453ffc | goto label_9; | } 0x00453e1d mov ecx, ebp | ecx = ebp; 0x00453e1f mov qword [rsp + 0x40], rcx | *((rsp + 0x40)) = rcx; 0x00453e24 lea r14, [rbx - 1] | r14 = rbx - 1; 0x00453e28 xor edx, edx | edx = 0; 0x00453e2a lea r8, [rsp + 0x68] | r8 = rsp + 0x68; 0x00453e2f xor ebp, ebp | ebp = 0; 0x00453e31 mov qword [rsp + 0x48], rdi | *((rsp + 0x48)) = rdi; 0x00453e36 jmp 0x453e56 | goto label_10; | label_0: 0x00453e40 mov rax, qword [rdi + 0x18] | rax = *((rdi + 0x18)); 0x00453e44 mov rdx, qword [rsp + 0x38] | rdx = *((rsp + 0x38)); | do { 0x00453e49 add rdx, 0x10 | rdx += 0x10; 0x00453e4d cmp rdx, rax | | if (rdx >= rax) { 0x00453e50 jae 0x453ffe | goto label_11; | } | label_10: 0x00453e56 mov rsi, qword [rdi + 8] | rsi = *((rdi + 8)); 0x00453e5a movdqu xmm0, xmmword [rsi + rdx] | __asm ("movdqu xmm0, xmmword [rsi + rdx]"); 0x00453e5f pmovmskb ecx, xmm0 | __asm ("pmovmskb ecx, xmm0"); 0x00453e63 cmp cx, 0xffff | 0x00453e67 je 0x453e49 | | } while (cx == 0xffff); 0x00453e69 add rsi, rdx | rsi += rdx; 0x00453e6c mov qword [rsp + 0x38], rdx | *((rsp + 0x38)) = rdx; 0x00453e71 imul rdx, rdx, 0x38 | rdx *= 0x38; 0x00453e75 add rdx, qword [rdi] | rdx += *(rdi); 0x00453e78 not ecx | ecx = ~ecx; 0x00453e7a movzx r15d, cx | r15d = (int32_t) cx; 0x00453e7e mov qword [rsp + 0x50], rsi | *((rsp + 0x50)) = rsi; 0x00453e83 jmp 0x453efd | goto label_12; | label_2: 0x00453e90 movzx ecx, si | ecx = (int32_t) si; 0x00453e93 bsf ecx, ecx | __asm ("bsf ecx, ecx"); 0x00453e96 add rdx, rcx | rdx += rcx; | label_1: 0x00453e99 imul rcx, rdx, 0x38 | rcx = rdx * 0x38; 0x00453e9d mov rsi, qword [r12 + 0x30] | rsi = *((r12 + 0x30)); 0x00453ea2 mov rdi, qword [rsp + 8] | rdi = *((rsp + 8)); 0x00453ea7 mov qword [rdi + rcx + 0x30], rsi | *((rdi + rcx + 0x30)) = rsi; 0x00453eac movdqu xmm0, xmmword [r12] | __asm ("movdqu xmm0, xmmword [r12]"); 0x00453eb2 movups xmm1, xmmword [r12 + 0x10] | __asm ("movups xmm1, xmmword [r12 + 0x10]"); 0x00453eb8 movups xmm2, xmmword [r12 + 0x20] | __asm ("movups xmm2, xmmword [r12 + 0x20]"); 0x00453ebe movups xmmword [rdi + rcx + 0x20], xmm2 | __asm ("movups xmmword [rdi + rcx + 0x20], xmm2"); 0x00453ec3 movups xmmword [rdi + rcx + 0x10], xmm1 | __asm ("movups xmmword [rdi + rcx + 0x10], xmm1"); 0x00453ec8 movdqu xmmword [rdi + rcx], xmm0 | __asm ("movdqu xmmword [rdi + rcx], xmm0"); 0x00453ecd and al, 0x7f | al &= 0x7f; 0x00453ecf mov r12, qword [rsp + 0x18] | r12 = *((rsp + 0x18)); 0x00453ed4 mov byte [r12 + rdx], al | *((r12 + rdx)) = al; 0x00453ed8 inc rbp | rbp++; 0x00453edb mov eax, 0xfffffffe | eax = 0xfffffffe; 0x00453ee0 mov rcx, qword [rsp + 0x58] | rcx = *((rsp + 0x58)); 0x00453ee5 rol eax, cl | eax = rotate_left32 (eax, cl); 0x00453ee7 and r15d, eax | r15d &= eax; 0x00453eea mov rdi, qword [rsp + 0x48] | rdi = *((rsp + 0x48)); 0x00453eef mov rsi, qword [rsp + 0x50] | rsi = *((rsp + 0x50)); 0x00453ef4 mov rdx, r13 | rdx = r13; | if (r15d == 0) { 0x00453ef7 je 0x453e40 | goto label_0; | } | label_12: 0x00453efd mov qword [rsp + 0x20], rbp | *((rsp + 0x20)) = rbp; 0x00453f02 bsf ecx, r15d | __asm ("bsf ecx, r15d"); 0x00453f06 imul rax, rcx, 0x38 | rax = rcx * 0x38; 0x00453f0a lea r12, [rdx + rax] | r12 = rdx + rax; 0x00453f0e mov qword [rsp + 0x58], rcx | *((rsp + 0x58)) = rcx; 0x00453f13 mov byte [rsi + rcx], 0xc0 | *((rsi + rcx)) = 0xc0; 0x00453f17 dec qword [rdi + 0x10] | *((rdi + 0x10))--; 0x00453f1b mov qword [rsp + 0x188], 0 | *((rsp + 0x188)) = 0; 0x00453f27 mov byte [rsp + 0x190], 0 | *((rsp + 0x190)) = 0; 0x00453f2f movdqa xmm0, xmmword [rip + 0x33d09] | __asm ("movdqa xmm0, xmmword [0x00487c40]"); 0x00453f37 movdqu xmmword [rsp + 0x128], xmm0 | __asm ("movdqu xmmword [rsp + 0x128], xmm0"); 0x00453f40 cmp qword [rdx + rax + 0x20], 0x17 | 0x00453f46 mov rsi, r12 | rsi = r12; | if (*((rdx + rax + 0x20)) != 0x17) { 0x00453f49 je 0x453f4f | 0x00453f4b mov rsi, qword [rdx + rax] | | } 0x00453f4f mov r13, rdx | r13 = rdx; 0x00453f52 mov rdx, qword [rdx + rax + 0x18] | 0x00453f57 mov rdi, r8 | rdi = r8; 0x00453f5a mov rbp, r8 | 0x00453f5d call 0x45f7a0 | BloombergLP::bslh::SpookyHashAlgorithmImp::update(voidconst*,unsigned long) (rdi, *((rdx + rax)), *((rdx + rax + 0x18))); 0x00453f62 mov rax, qword [r12 + 0x18] | rax = *((r12 + 0x18)); 0x00453f67 mov qword [rsp + 0x28], rax | *((rsp + 0x28)) = rax; 0x00453f6c mov edx, 8 | 0x00453f71 mov rdi, rbp | 0x00453f74 lea rsi, [rsp + 0x28] | 0x00453f79 call 0x45f7a0 | BloombergLP::bslh::SpookyHashAlgorithmImp::update(voidconst*,unsigned long) (rbp, rsp + 0x28, 8); 0x00453f7e mov rdi, rbp | 0x00453f81 lea rsi, [rsp + 0x28] | 0x00453f86 lea rdx, [rsp + 0x60] | 0x00453f8b call 0x45ed20 | BloombergLP::bslh::SpookyHashAlgorithmImp::finalize(unsigned long long*,unsigned long long*) (rbp, rsp + 0x28, rsp + 0x60); 0x00453f90 mov rax, qword [rsp + 0x28] | rax = *((rsp + 0x28)); 0x00453f95 movabs rcx, 0x9e3779b97f4a7c15 | rcx = 0x9e3779b97f4a7c15; 0x00453f9f imul rax, rcx | rax *= rcx; 0x00453fa3 test rbx, rbx | 0x00453fa6 mov r8, rbp | r8 = rbp; 0x00453fa9 mov rbp, qword [rsp + 0x20] | rbp = *((rsp + 0x20)); | if (rbx == 0) { 0x00453fae je 0x453e99 | goto label_1; | } 0x00453fb4 mov rdx, rax | rdx = rax; 0x00453fb7 mov rcx, qword [rsp + 0x40] | rcx = *((rsp + 0x40)); 0x00453fbc shr rdx, cl | rdx >>= cl; 0x00453fbf shl rdx, 4 | rdx <<= 4; 0x00453fc3 xor ecx, ecx | ecx = 0; 0x00453fc5 nop word cs:[rax + rax] | 0x00453fcf nop | | label_3: 0x00453fd0 mov rsi, qword [rsp + 0x18] | rsi = *((rsp + 0x18)); 0x00453fd5 movdqu xmm0, xmmword [rsi + rdx] | __asm ("movdqu xmm0, xmmword [rsi + rdx]"); 0x00453fda pmovmskb esi, xmm0 | __asm ("pmovmskb esi, xmm0"); 0x00453fde test si, si | | if (si != 0) { 0x00453fe1 jne 0x453e90 | goto label_2; | } 0x00453fe7 add rdx, 0x10 | rdx += 0x10; 0x00453feb and rdx, r14 | rdx &= r14; 0x00453fee add rcx, 0x10 | rcx += 0x10; 0x00453ff2 cmp rcx, rbx | | if (rcx < rbx) { 0x00453ff5 jb 0x453fd0 | goto label_3; | } 0x00453ff7 jmp 0x453e99 | goto label_1; | label_9: 0x00453ffc xor ebp, ebp | ebp = 0; | label_11: 0x00453ffe mov rsi, qword [rdi] | rsi = *(rdi); 0x00454001 mov r14, rdi | r14 = rdi; 0x00454004 mov rdi, qword [rdi + 0x28] | rdi = *((rdi + 0x28)); 0x00454008 mov rax, qword [rdi] | rax = *(rdi); 0x0045400b call qword [rax + 0x18] | uint64_t (*rax + 0x18)() (); 0x0045400e mov rsi, qword [r14 + 8] | rsi = *((r14 + 8)); 0x00454012 mov rdi, qword [r14 + 0x28] | rdi = *((r14 + 0x28)); 0x00454016 mov rax, qword [rdi] | rax = *(rdi); 0x00454019 call qword [rax + 0x18] | uint64_t (*rax + 0x18)() (); 0x0045401c mov rax, qword [rsp + 8] | rax = *((rsp + 8)); 0x00454021 mov qword [r14], rax | *(r14) = rax; 0x00454024 mov qword [r14 + 8], r12 | *((r14 + 8)) = r12; 0x00454028 mov qword [r14 + 0x10], rbp | *((r14 + 0x10)) = rbp; 0x0045402c mov qword [r14 + 0x18], rbx | *((r14 + 0x18)) = rbx; 0x00454030 mov rax, qword [rsp + 0x30] | rax = *((rsp + 0x30)); 0x00454035 mov dword [r14 + 0x20], eax | *((r14 + 0x20)) = eax; 0x00454039 add rsp, 0x198 | 0x00454040 pop rbx | 0x00454041 pop r12 | 0x00454043 pop r13 | 0x00454045 pop r14 | 0x00454047 pop r15 | 0x00454049 pop rbp | 0x0045404a ret | return rax; | label_7: 0x0045404b xor ebp, ebp | ebp = 0; 0x0045404d jmp 0x453d7f | goto label_4; | }