; assembly | /* r2dec pseudo code output */ | /* bdlc_flathashmap.t/none @ 0x4568b0 */ | #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_______std::__1::less_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_std::_1::less_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; | int64_t var_10h; | void * 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 > >, std::__1::less, bsl::allocator > > >::rehashRaw(unsigned long) */ 0x004568b0 push rbp | 0x004568b1 push r15 | 0x004568b3 push r14 | 0x004568b5 push r13 | 0x004568b7 push r12 | 0x004568b9 push rbx | 0x004568ba sub rsp, 0x38 | 0x004568be mov rbx, rsi | rbx = rsi; 0x004568c1 mov r14, rdi | r14 = rdi; 0x004568c4 mov r13, qword [rdi + 0x28] | r13 = *((rdi + 0x28)); 0x004568c8 mov rbp, qword [rdi + 0x38] | rbp = *((rdi + 0x38)); 0x004568cc test rbp, rbp | | if (rbp == 0) { 0x004568cf jne 0x4568e5 | 0x004568d1 mov rbp, qword [rip + 0x256570] | rbp = BloombergLP::bslma::Default::s_defaultAllocator; 0x004568d8 test rbp, rbp | | if (rbp != 0) { 0x004568db jne 0x4568e5 | goto label_4; | } 0x004568dd call 0x460a70 | rax = BloombergLP::bslma::Default::determineAndReturnDefaultAllocator() (); 0x004568e2 mov rbp, rax | | } | label_4: 0x004568e5 test rbx, rbx | 0x004568e8 mov qword [rsp + 0x28], rbp | *((rsp + 0x28)) = rbp; | if (rbx != 0) { 0x004568ed je 0x45697d | 0x004568f3 mov r12d, 0x20 | r12d = 0x20; 0x004568f9 cmp rbx, 0x21 | | if (rbx >= 0x21) { 0x004568fd jb 0x456924 | 0x004568ff dec rbx | rbx--; 0x00456902 or rbx, 1 | rbx |= 1; 0x00456906 bsr rax, rbx | __asm ("bsr rax, rbx"); 0x0045690a xor rax, 0x3f | rax ^= 0x3f; 0x0045690e mov ecx, eax | ecx = eax; 0x00456910 neg cl | cl = -cl; 0x00456912 mov r12d, 1 | r12d = 1; 0x00456918 shl r12, cl | r12 <<= cl; 0x0045691b test rax, rax | | if (rax == 0) { 0x0045691e je 0x456b0c | goto label_5; | } | } | label_3: 0x00456924 imul rsi, r12, 0x38 | rsi = r12 * 0x38; 0x00456928 mov rax, qword [rbp] | rax = *(rbp); 0x0045692c mov rdi, rbp | rdi = rbp; 0x0045692f call qword [rax + 0x10] | rax = uint64_t (*rax + 0x10)() (); 0x00456932 mov qword [rsp + 8], rax | *((rsp + 8)) = rax; 0x00456937 mov rax, qword [rbp] | rax = *(rbp); 0x0045693b mov rdi, rbp | rdi = rbp; 0x0045693e mov rsi, r12 | rsi = r12; 0x00456941 call qword [rax + 0x10] | rax = uint64_t (*rax + 0x10)() (); 0x00456944 mov r15, rax | r15 = rax; 0x00456947 mov rax, r12 | rax = r12; 0x0045694a shr rax, 4 | rax >>= 4; 0x0045694e dec rax | rax--; 0x00456951 mov rcx, rax | rcx = rax; 0x00456954 or rcx, 1 | rcx |= 1; 0x00456958 bsr rcx, rcx | __asm ("bsr rcx, rcx"); 0x0045695c xor ecx, 0x3f | ecx ^= 0x3f; 0x0045695f cmp rax, 1 | 0x00456963 adc ecx, 0 | ecx += 0; 0x00456966 mov qword [rsp + 0x18], rcx | *((rsp + 0x18)) = rcx; 0x0045696b mov rdi, r15 | 0x0045696e mov esi, 0x80 | 0x00456973 mov rdx, r12 | 0x00456976 call 0x4038e0 | eax = memset (r15, 0x80, r12); 0x0045697b jmp 0x456991 | | } else { 0x0045697d xor eax, eax | eax = 0; 0x0045697f mov qword [rsp + 0x18], rax | *((rsp + 0x18)) = rax; 0x00456984 xor r12d, r12d | r12d = 0; 0x00456987 xor r15d, r15d | r15d = 0; 0x0045698a xor eax, eax | eax = 0; 0x0045698c mov qword [rsp + 8], rax | *((rsp + 8)) = rax; | } 0x00456991 mov rax, qword [r14 + 0x18] | rax = *((r14 + 0x18)); 0x00456995 test rax, rax | | if (rax == 0) { 0x00456998 je 0x456ac2 | goto label_6; | } 0x0045699e mov rdx, r13 | rdx = r13; 0x004569a1 mov rcx, qword [rsp + 0x18] | rcx = *((rsp + 0x18)); 0x004569a6 shr rdx, cl | rdx >>= cl; 0x004569a9 shl rdx, 4 | rdx <<= 4; 0x004569ad mov qword [rsp + 0x10], rdx | *((rsp + 0x10)) = rdx; 0x004569b2 lea r9, [r12 - 1] | r9 = r12 - 1; 0x004569b7 and r13b, 0x7f | r13b &= 0x7f; 0x004569bb mov qword [rsp + 0x20], r13 | *((rsp + 0x20)) = r13; 0x004569c0 xor edx, edx | edx = 0; 0x004569c2 xor r13d, r13d | r13d = 0; 0x004569c5 jmp 0x4569e6 | goto label_7; | label_0: 0x004569d0 mov rax, qword [r14 + 0x18] | rax = *((r14 + 0x18)); 0x004569d4 mov rdx, qword [rsp + 0x30] | rdx = *((rsp + 0x30)); | do { 0x004569d9 add rdx, 0x10 | rdx += 0x10; 0x004569dd cmp rdx, rax | | if (rdx >= rax) { 0x004569e0 jae 0x456ac5 | goto label_8; | } | label_7: 0x004569e6 mov r10, qword [r14 + 8] | r10 = *((r14 + 8)); 0x004569ea movdqu xmm0, xmmword [r10 + rdx] | __asm ("movdqu xmm0, xmmword [r10 + rdx]"); 0x004569f0 pmovmskb ecx, xmm0 | __asm ("pmovmskb ecx, xmm0"); 0x004569f4 cmp cx, 0xffff | 0x004569f8 je 0x4569d9 | | } while (cx == 0xffff); 0x004569fa add r10, rdx | r10 += rdx; 0x004569fd mov qword [rsp + 0x30], rdx | *((rsp + 0x30)) = rdx; 0x00456a02 imul r11, rdx, 0x38 | r11 = rdx * 0x38; 0x00456a06 add r11, qword [r14] | r11 += *(r14); 0x00456a09 not ecx | ecx = ~ecx; 0x00456a0b movzx eax, cx | eax = (int32_t) cx; 0x00456a0e jmp 0x456a5a | goto label_9; | label_1: 0x00456a10 xor esi, esi | esi = 0; | label_2: 0x00456a12 imul rbp, rsi, 0x38 | rbp = rsi * 0x38; 0x00456a16 mov rbx, qword [rdi + 0x30] | rbx = *((rdi + 0x30)); 0x00456a1a mov rdx, qword [rsp + 8] | rdx = *((rsp + 8)); 0x00456a1f mov qword [rdx + rbp + 0x30], rbx | *((rdx + rbp + 0x30)) = rbx; 0x00456a24 movdqu xmm0, xmmword [rdi] | __asm ("movdqu xmm0, xmmword [rdi]"); 0x00456a28 movups xmm1, xmmword [rdi + 0x10] | __asm ("movups xmm1, xmmword [rdi + 0x10]"); 0x00456a2c movups xmm2, xmmword [rdi + 0x20] | __asm ("movups xmm2, xmmword [rdi + 0x20]"); 0x00456a30 movups xmmword [rdx + rbp + 0x20], xmm2 | __asm ("movups xmmword [rdx + rbp + 0x20], xmm2"); 0x00456a35 movups xmmword [rdx + rbp + 0x10], xmm1 | __asm ("movups xmmword [rdx + rbp + 0x10], xmm1"); 0x00456a3a movdqu xmmword [rdx + rbp], xmm0 | __asm ("movdqu xmmword [rdx + rbp], xmm0"); 0x00456a3f mov rdx, qword [rsp + 0x20] | rdx = *((rsp + 0x20)); 0x00456a44 mov byte [r15 + rsi], dl | *((r15 + rsi)) = dl; 0x00456a48 inc r13 | r13++; 0x00456a4b mov esi, 0xfffffffe | esi = 0xfffffffe; 0x00456a50 rol esi, cl | esi = rotate_left32 (esi, cl); 0x00456a52 and eax, esi | eax &= esi; | if (eax == 0) { 0x00456a54 je 0x4569d0 | goto label_0; | } | label_9: 0x00456a5a bsf ecx, eax | __asm ("bsf ecx, eax"); 0x00456a5d imul rdi, rcx, 0x38 | rdi = rcx * 0x38; 0x00456a61 add rdi, r11 | rdi += r11; 0x00456a64 mov byte [r10 + rcx], 0xc0 | *((r10 + rcx)) = 0xc0; 0x00456a69 dec qword [r14 + 0x10] | *((r14 + 0x10))--; 0x00456a6d test r12, r12 | | if (r12 == 0) { 0x00456a70 je 0x456a10 | goto label_1; | } 0x00456a72 mov rdx, r14 | rdx = r14; 0x00456a75 mov rsi, qword [rsp + 0x10] | rsi = *((rsp + 0x10)); 0x00456a7a xor r8d, r8d | r8d = 0; 0x00456a7d nop dword [rax] | | do { 0x00456a80 movdqu xmm0, xmmword [r15 + rsi] | __asm ("movdqu xmm0, xmmword [r15 + rsi]"); 0x00456a86 pmovmskb r14d, xmm0 | __asm ("pmovmskb r14d, xmm0"); 0x00456a8b test r14w, r14w | | if (r14w != 0) { 0x00456a8f jne 0x456ab0 | goto label_10; | } 0x00456a91 add rsi, 0x10 | rsi += 0x10; 0x00456a95 and rsi, r9 | rsi &= r9; 0x00456a98 add r8, 0x10 | r8 += 0x10; 0x00456a9c cmp r8, r12 | 0x00456a9f jb 0x456a80 | | } while (r8 < r12); 0x00456aa1 mov rsi, r12 | rsi = r12; 0x00456aa4 jmp 0x456aba | goto label_11; | label_10: 0x00456ab0 movzx ebp, r14w | ebp = (int32_t) r14w; 0x00456ab4 bsf ebp, ebp | __asm ("bsf ebp, ebp"); 0x00456ab7 add rsi, rbp | rsi += rbp; | label_11: 0x00456aba mov r14, rdx | r14 = rdx; 0x00456abd jmp 0x456a12 | goto label_2; | label_6: 0x00456ac2 xor r13d, r13d | r13d = 0; | label_8: 0x00456ac5 mov rsi, qword [r14] | rsi = *(r14); 0x00456ac8 mov rdi, qword [r14 + 0x38] | rdi = *((r14 + 0x38)); 0x00456acc mov rax, qword [rdi] | rax = *(rdi); 0x00456acf call qword [rax + 0x18] | uint64_t (*rax + 0x18)() (); 0x00456ad2 mov rsi, qword [r14 + 8] | rsi = *((r14 + 8)); 0x00456ad6 mov rdi, qword [r14 + 0x38] | rdi = *((r14 + 0x38)); 0x00456ada mov rax, qword [rdi] | rax = *(rdi); 0x00456add call qword [rax + 0x18] | uint64_t (*rax + 0x18)() (); 0x00456ae0 mov rax, qword [rsp + 8] | rax = *((rsp + 8)); 0x00456ae5 mov qword [r14], rax | *(r14) = rax; 0x00456ae8 mov qword [r14 + 8], r15 | *((r14 + 8)) = r15; 0x00456aec mov qword [r14 + 0x10], r13 | *((r14 + 0x10)) = r13; 0x00456af0 mov qword [r14 + 0x18], r12 | *((r14 + 0x18)) = r12; 0x00456af4 mov rax, qword [rsp + 0x18] | rax = *((rsp + 0x18)); 0x00456af9 mov dword [r14 + 0x20], eax | *((r14 + 0x20)) = eax; 0x00456afd add rsp, 0x38 | 0x00456b01 pop rbx | 0x00456b02 pop r12 | 0x00456b04 pop r13 | 0x00456b06 pop r14 | 0x00456b08 pop r15 | 0x00456b0a pop rbp | 0x00456b0b ret | return rax; | label_5: 0x00456b0c xor r12d, r12d | r12d = 0; 0x00456b0f jmp 0x456924 | goto label_3; | }