; assembly | /* r2dec pseudo code output */ | /* bdlc_flathashmap.t/assume @ 0x455de0 */ | #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_____SeedIsHash_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_SeedIsHash_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 * var_10h; | int64_t var_18h; | int64_t var_20h; | int64_t var_28h; | int64_t var_30h; | 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> >, SeedIsHash, bsl::allocator > >, bsl::equal_to, bsl::allocator > > >::rehashRaw(unsigned long) */ 0x00455de0 push rbp | 0x00455de1 push r15 | 0x00455de3 push r14 | 0x00455de5 push r13 | 0x00455de7 push r12 | 0x00455de9 push rbx | 0x00455dea sub rsp, 0x38 | 0x00455dee mov r14, rsi | r14 = rsi; 0x00455df1 mov rbx, rdi | rbx = rdi; 0x00455df4 mov r13, qword [rdi + 0x28] | r13 = *((rdi + 0x28)); 0x00455df8 mov rbp, qword [rdi + 0x38] | rbp = *((rdi + 0x38)); 0x00455dfc test rbp, rbp | | if (rbp == 0) { 0x00455dff jne 0x455e15 | 0x00455e01 mov rbp, qword [rip + 0x256040] | rbp = BloombergLP::bslma::Default::s_defaultAllocator; 0x00455e08 test rbp, rbp | | if (rbp != 0) { 0x00455e0b jne 0x455e15 | goto label_5; | } 0x00455e0d call 0x460860 | rax = BloombergLP::bslma::Default::determineAndReturnDefaultAllocator() (); 0x00455e12 mov rbp, rax | | } | label_5: 0x00455e15 test r14, r14 | 0x00455e18 mov qword [rsp + 0x20], rbp | *((rsp + 0x20)) = rbp; | if (r14 != 0) { 0x00455e1d je 0x455eac | 0x00455e23 mov r12d, 0x20 | r12d = 0x20; 0x00455e29 cmp r14, 0x21 | | if (r14 >= 0x21) { 0x00455e2d jb 0x455e54 | 0x00455e2f dec r14 | r14--; 0x00455e32 or r14, 1 | r14 |= 1; 0x00455e36 bsr rax, r14 | __asm ("bsr rax, r14"); 0x00455e3a xor rax, 0x3f | rax ^= 0x3f; 0x00455e3e mov ecx, eax | ecx = eax; 0x00455e40 neg cl | cl = -cl; 0x00455e42 mov r12d, 1 | r12d = 1; 0x00455e48 shl r12, cl | r12 <<= cl; 0x00455e4b test rax, rax | | if (rax == 0) { 0x00455e4e je 0x456042 | goto label_6; | } | } | label_4: 0x00455e54 imul rsi, r12, 0x38 | rsi = r12 * 0x38; 0x00455e58 mov rax, qword [rbp] | rax = *(rbp); 0x00455e5c mov rdi, rbp | rdi = rbp; 0x00455e5f call qword [rax + 0x10] | rax = uint64_t (*rax + 0x10)() (); 0x00455e62 mov qword [rsp], rax | 0x00455e66 mov rax, qword [rbp] | rax = *(rbp); 0x00455e6a mov rdi, rbp | rdi = rbp; 0x00455e6d mov rsi, r12 | rsi = r12; 0x00455e70 call qword [rax + 0x10] | rax = uint64_t (*rax + 0x10)(void) (rax); 0x00455e73 mov r15, rax | r15 = rax; 0x00455e76 mov rax, r12 | rax = r12; 0x00455e79 shr rax, 4 | rax >>= 4; 0x00455e7d dec rax | rax--; 0x00455e80 mov rcx, rax | rcx = rax; 0x00455e83 or rcx, 1 | rcx |= 1; 0x00455e87 bsr rcx, rcx | __asm ("bsr rcx, rcx"); 0x00455e8b xor ecx, 0x3f | ecx ^= 0x3f; 0x00455e8e cmp rax, 1 | 0x00455e92 adc ecx, 0 | ecx += 0; 0x00455e95 mov qword [rsp + 0x10], rcx | *((rsp + 0x10)) = rcx; 0x00455e9a mov rdi, r15 | 0x00455e9d mov esi, 0x80 | 0x00455ea2 mov rdx, r12 | 0x00455ea5 call 0x4038e0 | eax = memset (r15, 0x80, r12); 0x00455eaa jmp 0x455ebf | | } else { 0x00455eac xor eax, eax | eax = 0; 0x00455eae mov qword [rsp + 0x10], rax | *((rsp + 0x10)) = rax; 0x00455eb3 xor r12d, r12d | r12d = 0; 0x00455eb6 xor r15d, r15d | r15d = 0; 0x00455eb9 xor eax, eax | eax = 0; 0x00455ebb mov qword [rsp], rax | *(rsp) = rax; | } 0x00455ebf mov rax, qword [rbx + 0x18] | rax = *((rbx + 0x18)); 0x00455ec3 test rax, rax | | if (rax == 0) { 0x00455ec6 je 0x455ffa | goto label_7; | } 0x00455ecc mov rdx, r13 | rdx = r13; 0x00455ecf mov rcx, qword [rsp + 0x10] | rcx = *((rsp + 0x10)); 0x00455ed4 shr rdx, cl | rdx >>= cl; 0x00455ed7 shl rdx, 4 | rdx <<= 4; 0x00455edb mov qword [rsp + 0x30], rdx | *((rsp + 0x30)) = rdx; 0x00455ee0 lea r9, [r12 - 1] | r9 = r12 - 1; 0x00455ee5 and r13b, 0x7f | r13b &= 0x7f; 0x00455ee9 mov qword [rsp + 8], r13 | *((rsp + 8)) = r13; 0x00455eee xor edx, edx | edx = 0; 0x00455ef0 xor r13d, r13d | r13d = 0; 0x00455ef3 jmp 0x455f16 | goto label_8; | label_0: 0x00455f00 mov rax, qword [rbx + 0x18] | rax = *((rbx + 0x18)); 0x00455f04 mov rdx, qword [rsp + 0x28] | rdx = *((rsp + 0x28)); | do { 0x00455f09 add rdx, 0x10 | rdx += 0x10; 0x00455f0d cmp rdx, rax | | if (rdx >= rax) { 0x00455f10 jae 0x455ffd | goto label_9; | } | label_8: 0x00455f16 mov rsi, qword [rbx + 8] | rsi = *((rbx + 8)); 0x00455f1a movdqu xmm0, xmmword [rsi + rdx] | __asm ("movdqu xmm0, xmmword [rsi + rdx]"); 0x00455f1f pmovmskb ecx, xmm0 | __asm ("pmovmskb ecx, xmm0"); 0x00455f23 cmp cx, 0xffff | 0x00455f27 je 0x455f09 | | } while (cx == 0xffff); 0x00455f29 add rsi, rdx | rsi += rdx; 0x00455f2c mov qword [rsp + 0x28], rdx | *((rsp + 0x28)) = rdx; 0x00455f31 imul rax, rdx, 0x38 | rax = rdx * 0x38; 0x00455f35 add rax, qword [rbx] | rax += *(rbx); 0x00455f38 mov qword [rsp + 0x18], rax | *((rsp + 0x18)) = rax; 0x00455f3d not ecx | ecx = ~ecx; 0x00455f3f movzx eax, cx | eax = (int32_t) cx; 0x00455f42 jmp 0x455fa7 | goto label_10; | label_2: 0x00455f50 movzx ebp, r14w | ebp = (int32_t) r14w; 0x00455f54 bsf ebp, ebp | __asm ("bsf ebp, ebp"); 0x00455f57 add rsi, rbp | rsi += rbp; | label_1: 0x00455f5a imul rbp, rsi, 0x38 | rbp = rsi * 0x38; 0x00455f5e mov rbx, qword [rdi + 0x30] | rbx = *((rdi + 0x30)); 0x00455f62 mov rdx, qword [rsp] | rdx = *(rsp); 0x00455f66 mov qword [rdx + rbp + 0x30], rbx | *((rdx + rbp + 0x30)) = rbx; 0x00455f6b movdqu xmm0, xmmword [rdi] | __asm ("movdqu xmm0, xmmword [rdi]"); 0x00455f6f movups xmm1, xmmword [rdi + 0x10] | __asm ("movups xmm1, xmmword [rdi + 0x10]"); 0x00455f73 movups xmm2, xmmword [rdi + 0x20] | __asm ("movups xmm2, xmmword [rdi + 0x20]"); 0x00455f77 movups xmmword [rdx + rbp + 0x20], xmm2 | __asm ("movups xmmword [rdx + rbp + 0x20], xmm2"); 0x00455f7c movups xmmword [rdx + rbp + 0x10], xmm1 | __asm ("movups xmmword [rdx + rbp + 0x10], xmm1"); 0x00455f81 movdqu xmmword [rdx + rbp], xmm0 | __asm ("movdqu xmmword [rdx + rbp], xmm0"); 0x00455f86 mov rdx, qword [rsp + 8] | rdx = *((rsp + 8)); 0x00455f8b mov byte [r15 + rsi], dl | *((r15 + rsi)) = dl; 0x00455f8f inc r13 | r13++; 0x00455f92 mov esi, 0xfffffffe | esi = 0xfffffffe; 0x00455f97 rol esi, cl | esi = rotate_left32 (esi, cl); 0x00455f99 and eax, esi | eax &= esi; 0x00455f9b mov rbx, r10 | rbx = r10; 0x00455f9e mov rsi, r11 | rsi = r11; | if (eax == 0) { 0x00455fa1 je 0x455f00 | goto label_0; | } | label_10: 0x00455fa7 bsf ecx, eax | __asm ("bsf ecx, eax"); 0x00455faa imul rdi, rcx, 0x38 | rdi = rcx * 0x38; 0x00455fae add rdi, qword [rsp + 0x18] | rdi += *((rsp + 0x18)); 0x00455fb3 mov r11, rsi | r11 = rsi; 0x00455fb6 mov byte [rsi + rcx], 0xc0 | *((rsi + rcx)) = 0xc0; 0x00455fba mov r10, rbx | r10 = rbx; 0x00455fbd dec qword [rbx + 0x10] | *((rbx + 0x10))--; 0x00455fc1 test r12, r12 | | if (r12 == 0) { 0x00455fc4 je 0x455f5a | goto label_1; | } 0x00455fc6 mov rsi, qword [rsp + 0x30] | rsi = *((rsp + 0x30)); 0x00455fcb xor r8d, r8d | r8d = 0; 0x00455fce nop | | label_3: 0x00455fd0 movdqu xmm0, xmmword [r15 + rsi] | __asm ("movdqu xmm0, xmmword [r15 + rsi]"); 0x00455fd6 pmovmskb r14d, xmm0 | __asm ("pmovmskb r14d, xmm0"); 0x00455fdb test r14w, r14w | | if (r14w != 0) { 0x00455fdf jne 0x455f50 | goto label_2; | } 0x00455fe5 add rsi, 0x10 | rsi += 0x10; 0x00455fe9 and rsi, r9 | rsi &= r9; 0x00455fec add r8, 0x10 | r8 += 0x10; 0x00455ff0 cmp r8, r12 | | if (r8 < r12) { 0x00455ff3 jb 0x455fd0 | goto label_3; | } 0x00455ff5 jmp 0x455f5a | goto label_1; | label_7: 0x00455ffa xor r13d, r13d | r13d = 0; | label_9: 0x00455ffd mov rsi, qword [rbx] | rsi = *(rbx); 0x00456000 mov rdi, qword [rbx + 0x38] | rdi = *((rbx + 0x38)); 0x00456004 mov rax, qword [rdi] | rax = *(rdi); 0x00456007 call qword [rax + 0x18] | uint64_t (*rax + 0x18)() (); 0x0045600a mov rsi, qword [rbx + 8] | rsi = *((rbx + 8)); 0x0045600e mov rdi, qword [rbx + 0x38] | rdi = *((rbx + 0x38)); 0x00456012 mov rax, qword [rdi] | rax = *(rdi); 0x00456015 call qword [rax + 0x18] | uint64_t (*rax + 0x18)() (); 0x00456018 mov rax, qword [rsp] | rax = *(rsp); 0x0045601c mov qword [rbx], rax | *(rbx) = rax; 0x0045601f mov qword [rbx + 8], r15 | *((rbx + 8)) = r15; 0x00456023 mov qword [rbx + 0x10], r13 | *((rbx + 0x10)) = r13; 0x00456027 mov qword [rbx + 0x18], r12 | *((rbx + 0x18)) = r12; 0x0045602b mov rax, qword [rsp + 0x10] | rax = *((rsp + 0x10)); 0x00456030 mov dword [rbx + 0x20], eax | *((rbx + 0x20)) = eax; 0x00456033 add rsp, 0x38 | 0x00456037 pop rbx | 0x00456038 pop r12 | 0x0045603a pop r13 | 0x0045603c pop r14 | 0x0045603e pop r15 | 0x00456040 pop rbp | 0x00456041 ret | return rax; | label_6: 0x00456042 xor r12d, r12d | r12d = 0; 0x00456045 jmp 0x455e54 | goto label_4; | }