; assembly | /* r2dec pseudo code output */ | /* bdlc_flathashmap.t/none @ 0x453230 */ | #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) method.BloombergLP::bdlc::FlatHashTable_int__bsl::pair_int__bsl::basic_string_char__std::__1::char_traits_char___bsl::allocator_char_______BloombergLP::bdlc::FlatHashMap_EntryUtil_int__bsl::basic_string_char__std::__1::char_traits_char___bsl::allocator_c () | uint64_t method_BloombergLP::bdlc::FlatHashTable_int_bsl::pair_int_bsl::basic_string_char_std::_1::char_traits_char_bsl::allocator_char_BloombergLP::bdlc::FlatHashMap_EntryUtil_int_bsl::basic_string_char_std::_1::char_traits_char_bsl::allocator_c (int64_t arg2, int64_t arg1) { | int64_t var_8h; | int64_t var_10h; | int64_t var_18h; | int64_t var_20h; | rsi = arg2; | rdi = arg1; | /* BloombergLP::bdlc::FlatHashTable, bsl::allocator > >, BloombergLP::bdlc::FlatHashMap_EntryUtil, bsl::allocator >, bsl::pair, bsl::allocator > > >, BloombergLP::bslh::FibonacciBadHashWrapper >, bsl::equal_to >::rehashRaw(unsigned long) */ 0x00453230 push rbp | 0x00453231 push r15 | 0x00453233 push r14 | 0x00453235 push r13 | 0x00453237 push r12 | 0x00453239 push rbx | 0x0045323a sub rsp, 0x28 | 0x0045323e mov rbx, rsi | rbx = rsi; 0x00453241 mov r13, rdi | r13 = rdi; 0x00453244 mov rbp, qword [rdi + 0x28] | rbp = *((rdi + 0x28)); 0x00453248 test rbp, rbp | | if (rbp == 0) { 0x0045324b jne 0x453261 | 0x0045324d mov rbp, qword [rip + 0x259bf4] | rbp = BloombergLP::bslma::Default::s_defaultAllocator; 0x00453254 test rbp, rbp | | if (rbp != 0) { 0x00453257 jne 0x453261 | goto label_4; | } 0x00453259 call 0x460a70 | rax = BloombergLP::bslma::Default::determineAndReturnDefaultAllocator() (); 0x0045325e mov rbp, rax | | } | label_4: 0x00453261 test rbx, rbx | 0x00453264 mov qword [rsp + 0x10], rbp | *((rsp + 0x10)) = rbp; | if (rbx != 0) { 0x00453269 je 0x4532f2 | 0x0045326f mov r12d, 0x20 | r12d = 0x20; 0x00453275 cmp rbx, 0x21 | | if (rbx >= 0x21) { 0x00453279 jb 0x4532a0 | 0x0045327b dec rbx | rbx--; 0x0045327e or rbx, 1 | rbx |= 1; 0x00453282 bsr rax, rbx | __asm ("bsr rax, rbx"); 0x00453286 xor rax, 0x3f | rax ^= 0x3f; 0x0045328a mov ecx, eax | ecx = eax; 0x0045328c neg cl | cl = -cl; 0x0045328e mov r12d, 1 | r12d = 1; 0x00453294 shl r12, cl | r12 <<= cl; 0x00453297 test rax, rax | | if (rax == 0) { 0x0045329a je 0x453499 | goto label_5; | } | } | label_3: 0x004532a0 imul rsi, r12, 0x38 | rsi = r12 * 0x38; 0x004532a4 mov rax, qword [rbp] | rax = *(rbp); 0x004532a8 mov rdi, rbp | rdi = rbp; 0x004532ab call qword [rax + 0x10] | rax = uint64_t (*rax + 0x10)() (); 0x004532ae mov r15, rax | r15 = rax; 0x004532b1 mov rax, qword [rbp] | rax = *(rbp); 0x004532b5 mov rdi, rbp | rdi = rbp; 0x004532b8 mov rsi, r12 | rsi = r12; 0x004532bb call qword [rax + 0x10] | rax = uint64_t (*rax + 0x10)() (); 0x004532be mov rbx, rax | rbx = rax; 0x004532c1 mov rax, r12 | rax = r12; 0x004532c4 shr rax, 4 | rax >>= 4; 0x004532c8 dec rax | rax--; 0x004532cb mov rcx, rax | rcx = rax; 0x004532ce or rcx, 1 | rcx |= 1; 0x004532d2 bsr rbp, rcx | __asm ("bsr rbp, rcx"); 0x004532d6 xor ebp, 0x3f | ebp ^= 0x3f; 0x004532d9 cmp rax, 1 | 0x004532dd adc ebp, 0 | ebp += 0; 0x004532e0 mov rdi, rbx | 0x004532e3 mov esi, 0x80 | 0x004532e8 mov rdx, r12 | 0x004532eb call 0x4038e0 | memset (rbx, 0x80, r12); 0x004532f0 jmp 0x4532fc | | } else { 0x004532f2 xor ebp, ebp | ebp = 0; 0x004532f4 xor r12d, r12d | r12d = 0; 0x004532f7 xor ebx, ebx | ebx = 0; 0x004532f9 xor r15d, r15d | r15d = 0; | } 0x004532fc mov rax, qword [r13 + 0x18] | rax = *((r13 + 0x18)); 0x00453300 test rax, rax | 0x00453303 mov qword [rsp + 8], rbp | *((rsp + 8)) = rbp; | if (rax == 0) { 0x00453308 je 0x453452 | goto label_6; | } 0x0045330e mov ecx, ebp | ecx = ebp; 0x00453310 mov qword [rsp + 0x20], rcx | *((rsp + 0x20)) = rcx; 0x00453315 lea rsi, [r12 - 1] | rsi = r12 - 1; 0x0045331a xor edx, edx | edx = 0; 0x0045331c xor r14d, r14d | r14d = 0; 0x0045331f jmp 0x453346 | goto label_7; | label_0: 0x00453330 mov rax, qword [r13 + 0x18] | rax = *((r13 + 0x18)); 0x00453334 mov rdx, qword [rsp + 0x18] | rdx = *((rsp + 0x18)); | do { 0x00453339 add rdx, 0x10 | rdx += 0x10; 0x0045333d cmp rdx, rax | | if (rdx >= rax) { 0x00453340 jae 0x453455 | goto label_8; | } | label_7: 0x00453346 mov r11, qword [r13 + 8] | r11 = *((r13 + 8)); 0x0045334a movdqu xmm0, xmmword [r11 + rdx] | __asm ("movdqu xmm0, xmmword [r11 + rdx]"); 0x00453350 pmovmskb ecx, xmm0 | __asm ("pmovmskb ecx, xmm0"); 0x00453354 cmp cx, 0xffff | 0x00453358 je 0x453339 | | } while (cx == 0xffff); 0x0045335a add r11, rdx | r11 += rdx; 0x0045335d mov qword [rsp + 0x18], rdx | *((rsp + 0x18)) = rdx; 0x00453362 imul r10, rdx, 0x38 | r10 = rdx * 0x38; 0x00453366 add r10, qword [r13] | r10 += *(r13); 0x0045336a not ecx | ecx = ~ecx; 0x0045336c movzx eax, cx | eax = (int32_t) cx; 0x0045336f jmp 0x4533cc | goto label_9; | label_1: 0x00453380 xor edi, edi | edi = 0; | label_2: 0x00453382 imul rcx, rdi, 0x38 | rcx = rdi * 0x38; 0x00453386 mov rbp, qword [r8 + 0x30] | rbp = *((r8 + 0x30)); 0x0045338a mov qword [r15 + rcx + 0x30], rbp | *((r15 + rcx + 0x30)) = rbp; 0x0045338f movdqu xmm0, xmmword [r8] | __asm ("movdqu xmm0, xmmword [r8]"); 0x00453394 movups xmm1, xmmword [r8 + 0x10] | __asm ("movups xmm1, xmmword [r8 + 0x10]"); 0x00453399 movups xmm2, xmmword [r8 + 0x20] | __asm ("movups xmm2, xmmword [r8 + 0x20]"); 0x0045339e movups xmmword [r15 + rcx + 0x20], xmm2 | __asm ("movups xmmword [r15 + rcx + 0x20], xmm2"); 0x004533a4 movups xmmword [r15 + rcx + 0x10], xmm1 | __asm ("movups xmmword [r15 + rcx + 0x10], xmm1"); 0x004533aa movdqu xmmword [r15 + rcx], xmm0 | __asm ("movdqu xmmword [r15 + rcx], xmm0"); 0x004533b0 and r9b, 0x7f | r9b &= 0x7f; 0x004533b4 mov byte [rbx + rdi], r9b | *((rbx + rdi)) = r9b; 0x004533b8 inc r14 | r14++; 0x004533bb mov edi, 0xfffffffe | edi = 0xfffffffe; 0x004533c0 mov ecx, edx | ecx = edx; 0x004533c2 rol edi, cl | edi = rotate_left32 (edi, cl); 0x004533c4 and eax, edi | eax &= edi; | if (eax == 0) { 0x004533c6 je 0x453330 | goto label_0; | } | label_9: 0x004533cc bsf edx, eax | __asm ("bsf edx, eax"); 0x004533cf imul rcx, rdx, 0x38 | rcx = rdx * 0x38; 0x004533d3 mov byte [r11 + rdx], 0xc0 | *((r11 + rdx)) = 0xc0; 0x004533d8 dec qword [r13 + 0x10] | *((r13 + 0x10))--; 0x004533dc lea r8, [r10 + rcx] | r8 = r10 + rcx; 0x004533e0 movsxd r9, dword [r10 + rcx] | r9 = *((r10 + rcx)); 0x004533e4 movabs rcx, 0x9e3779b97f4a7c15 | rcx = 0x9e3779b97f4a7c15; 0x004533ee imul r9, rcx | r9 *= rcx; 0x004533f2 test r12, r12 | | if (r12 == 0) { 0x004533f5 je 0x453380 | goto label_1; | } 0x004533f7 mov rbp, r13 | 0x004533fa mov rdi, r9 | rdi = r9; 0x004533fd mov rcx, qword [rsp + 0x20] | rcx = *((rsp + 0x20)); 0x00453402 shr rdi, cl | rdi >>= cl; 0x00453405 shl rdi, 4 | rdi <<= 4; 0x00453409 xor ecx, ecx | ecx = 0; 0x0045340b nop dword [rax + rax] | | do { 0x00453410 movdqu xmm0, xmmword [rbx + rdi] | __asm ("movdqu xmm0, xmmword [rbx + rdi]"); 0x00453415 pmovmskb r13d, xmm0 | __asm ("pmovmskb r13d, xmm0"); 0x0045341a test r13w, r13w | | if (r13w != 0) { 0x0045341e jne 0x453440 | goto label_10; | } 0x00453420 add rdi, 0x10 | rdi += 0x10; 0x00453424 and rdi, rsi | rdi &= rsi; 0x00453427 add rcx, 0x10 | rcx += 0x10; 0x0045342b cmp rcx, r12 | 0x0045342e jb 0x453410 | | } while (rcx < r12); 0x00453430 mov rdi, r12 | rdi = r12; 0x00453433 jmp 0x45344a | goto label_11; | label_10: 0x00453440 movzx ecx, r13w | ecx = (int32_t) r13w; 0x00453444 bsf ecx, ecx | __asm ("bsf ecx, ecx"); 0x00453447 add rdi, rcx | rdi += rcx; | label_11: 0x0045344a mov r13, rbp | r13 = rbp; 0x0045344d jmp 0x453382 | goto label_2; | label_6: 0x00453452 xor r14d, r14d | r14d = 0; | label_8: 0x00453455 mov rsi, qword [r13] | rsi = *(r13); 0x00453459 mov rdi, qword [r13 + 0x28] | rdi = *((r13 + 0x28)); 0x0045345d mov rax, qword [rdi] | rax = *(rdi); 0x00453460 call qword [rax + 0x18] | uint64_t (*rax + 0x18)() (); 0x00453463 mov rsi, qword [r13 + 8] | rsi = *((r13 + 8)); 0x00453467 mov rdi, qword [r13 + 0x28] | rdi = *((r13 + 0x28)); 0x0045346b mov rax, qword [rdi] | rax = *(rdi); 0x0045346e call qword [rax + 0x18] | uint64_t (*rax + 0x18)() (); 0x00453471 mov qword [r13], r15 | *(r13) = r15; 0x00453475 mov qword [r13 + 8], rbx | *((r13 + 8)) = rbx; 0x00453479 mov qword [r13 + 0x10], r14 | *((r13 + 0x10)) = r14; 0x0045347d mov qword [r13 + 0x18], r12 | *((r13 + 0x18)) = r12; 0x00453481 mov rax, qword [rsp + 8] | rax = *((rsp + 8)); 0x00453486 mov dword [r13 + 0x20], eax | *((r13 + 0x20)) = eax; 0x0045348a add rsp, 0x28 | 0x0045348e pop rbx | 0x0045348f pop r12 | 0x00453491 pop r13 | 0x00453493 pop r14 | 0x00453495 pop r15 | 0x00453497 pop rbp | 0x00453498 ret | return rax; | label_5: 0x00453499 xor r12d, r12d | r12d = 0; 0x0045349c jmp 0x4532a0 | goto label_3; | }