; assembly | /* r2dec pseudo code output */ | /* bdlc_flathashmap.t/assume @ 0x453100 */ | #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) { | void * var_8h; | int64_t 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 > >, BloombergLP::bdlc::FlatHashMap_EntryUtil, bsl::allocator >, bsl::pair, bsl::allocator > > >, BloombergLP::bslh::FibonacciBadHashWrapper >, bsl::equal_to >::rehashRaw(unsigned long) */ 0x00453100 push rbp | 0x00453101 push r15 | 0x00453103 push r14 | 0x00453105 push r13 | 0x00453107 push r12 | 0x00453109 push rbx | 0x0045310a sub rsp, 0x38 | 0x0045310e mov r14, rsi | r14 = rsi; 0x00453111 mov rbp, rdi | 0x00453114 mov rbx, qword [rdi + 0x28] | rbx = *((rdi + 0x28)); 0x00453118 test rbx, rbx | | if (rbx == 0) { 0x0045311b jne 0x453131 | 0x0045311d mov rbx, qword [rip + 0x258d24] | rbx = BloombergLP::bslma::Default::s_defaultAllocator; 0x00453124 test rbx, rbx | | if (rbx != 0) { 0x00453127 jne 0x453131 | goto label_5; | } 0x00453129 call 0x460860 | rax = BloombergLP::bslma::Default::determineAndReturnDefaultAllocator() (); 0x0045312e mov rbx, rax | rbx = rax; | } | label_5: 0x00453131 test r14, r14 | 0x00453134 mov qword [rsp + 0x18], rbx | *((rsp + 0x18)) = rbx; | if (r14 != 0) { 0x00453139 je 0x4531c4 | 0x0045313f mov r12d, 0x20 | r12d = 0x20; 0x00453145 cmp r14, 0x21 | | if (r14 >= 0x21) { 0x00453149 jb 0x453170 | 0x0045314b dec r14 | r14--; 0x0045314e or r14, 1 | r14 |= 1; 0x00453152 bsr rax, r14 | __asm ("bsr rax, r14"); 0x00453156 xor rax, 0x3f | rax ^= 0x3f; 0x0045315a mov ecx, eax | ecx = eax; 0x0045315c neg cl | cl = -cl; 0x0045315e mov r12d, 1 | r12d = 1; 0x00453164 shl r12, cl | r12 <<= cl; 0x00453167 test rax, rax | | if (rax == 0) { 0x0045316a je 0x453375 | goto label_6; | } | } | label_4: 0x00453170 imul rsi, r12, 0x38 | rsi = r12 * 0x38; 0x00453174 mov rax, qword [rbx] | rax = *(rbx); 0x00453177 mov rdi, rbx | rdi = rbx; 0x0045317a call qword [rax + 0x10] | rax = uint64_t (*rax + 0x10)() (); 0x0045317d mov qword [rsp + 8], rax | *((rsp + 8)) = rax; 0x00453182 mov rax, qword [rbx] | rax = *(rbx); 0x00453185 mov rdi, rbx | rdi = rbx; 0x00453188 mov rsi, r12 | rsi = r12; 0x0045318b call qword [rax + 0x10] | rax = uint64_t (*rax + 0x10)() (); 0x0045318e mov r15, rax | r15 = rax; 0x00453191 mov rax, r12 | rax = r12; 0x00453194 shr rax, 4 | rax >>= 4; 0x00453198 dec rax | rax--; 0x0045319b mov rcx, rax | rcx = rax; 0x0045319e or rcx, 1 | rcx |= 1; 0x004531a2 bsr r14, rcx | __asm ("bsr r14, rcx"); 0x004531a6 xor r14d, 0x3f | r14d ^= 0x3f; 0x004531aa cmp rax, 1 | 0x004531ae adc r14d, 0 | r14d += 0; 0x004531b2 mov rdi, r15 | 0x004531b5 mov esi, 0x80 | 0x004531ba mov rdx, r12 | 0x004531bd call 0x4038e0 | eax = memset (r15, 0x80, r12); 0x004531c2 jmp 0x4531d4 | | } else { 0x004531c4 xor r14d, r14d | r14d = 0; 0x004531c7 xor r12d, r12d | r12d = 0; 0x004531ca xor r15d, r15d | r15d = 0; 0x004531cd xor eax, eax | eax = 0; 0x004531cf mov qword [rsp + 8], rax | *((rsp + 8)) = rax; | } 0x004531d4 mov rax, qword [rbp + 0x18] | rax = *((rbp + 0x18)); 0x004531d8 test rax, rax | 0x004531db mov qword [rsp + 0x28], r14 | *((rsp + 0x28)) = r14; | if (rax == 0) { 0x004531e0 je 0x45332a | goto label_7; | } 0x004531e6 mov ecx, r14d | ecx = r14d; 0x004531e9 mov qword [rsp + 0x10], rcx | *((rsp + 0x10)) = rcx; 0x004531ee lea rsi, [r12 - 1] | rsi = r12 - 1; 0x004531f3 xor edx, edx | edx = 0; 0x004531f5 xor r14d, r14d | r14d = 0; 0x004531f8 mov rbx, qword [rsp + 8] | rbx = *((rsp + 8)); 0x004531fd jmp 0x453216 | goto label_8; | label_0: 0x00453200 mov rax, qword [rbp + 0x18] | rax = *((rbp + 0x18)); 0x00453204 mov rdx, qword [rsp + 0x30] | rdx = *((rsp + 0x30)); | do { 0x00453209 add rdx, 0x10 | rdx += 0x10; 0x0045320d cmp rdx, rax | | if (rdx >= rax) { 0x00453210 jae 0x45332d | goto label_9; | } | label_8: 0x00453216 mov rdi, qword [rbp + 8] | rdi = *((rbp + 8)); 0x0045321a movdqu xmm0, xmmword [rdi + rdx] | __asm ("movdqu xmm0, xmmword [rdi + rdx]"); 0x0045321f pmovmskb ecx, xmm0 | __asm ("pmovmskb ecx, xmm0"); 0x00453223 cmp cx, 0xffff | 0x00453227 je 0x453209 | | } while (cx == 0xffff); 0x00453229 add rdi, rdx | rdi += rdx; 0x0045322c mov qword [rsp + 0x30], rdx | *((rsp + 0x30)) = rdx; 0x00453231 imul rax, rdx, 0x38 | rax = rdx * 0x38; 0x00453235 add rax, qword [rbp] | rax += *(rbp); 0x00453239 mov qword [rsp + 0x20], rax | *((rsp + 0x20)) = rax; 0x0045323e not ecx | ecx = ~ecx; 0x00453240 movzx eax, cx | eax = (int32_t) cx; 0x00453243 jmp 0x4532a7 | goto label_10; | label_2: 0x00453250 movzx ecx, r13w | ecx = (int32_t) r13w; 0x00453254 bsf ecx, ecx | __asm ("bsf ecx, ecx"); 0x00453257 add rdi, rcx | rdi += rcx; | label_1: 0x0045325a imul rcx, rdi, 0x38 | rcx = rdi * 0x38; 0x0045325e mov rbp, qword [r8 + 0x30] | rbp = *((r8 + 0x30)); 0x00453262 mov qword [rbx + rcx + 0x30], rbp | *((rbx + rcx + 0x30)) = rbp; 0x00453267 movdqu xmm0, xmmword [r8] | __asm ("movdqu xmm0, xmmword [r8]"); 0x0045326c movups xmm1, xmmword [r8 + 0x10] | __asm ("movups xmm1, xmmword [r8 + 0x10]"); 0x00453271 movups xmm2, xmmword [r8 + 0x20] | __asm ("movups xmm2, xmmword [r8 + 0x20]"); 0x00453276 movups xmmword [rbx + rcx + 0x20], xmm2 | __asm ("movups xmmword [rbx + rcx + 0x20], xmm2"); 0x0045327b movups xmmword [rbx + rcx + 0x10], xmm1 | __asm ("movups xmmword [rbx + rcx + 0x10], xmm1"); 0x00453280 movdqu xmmword [rbx + rcx], xmm0 | __asm ("movdqu xmmword [rbx + rcx], xmm0"); 0x00453285 and r9b, 0x7f | r9b &= 0x7f; 0x00453289 mov byte [r15 + rdi], r9b | *((r15 + rdi)) = r9b; 0x0045328d inc r14 | r14++; 0x00453290 mov edi, 0xfffffffe | edi = 0xfffffffe; 0x00453295 mov ecx, edx | ecx = edx; 0x00453297 rol edi, cl | edi = rotate_left32 (edi, cl); 0x00453299 and eax, edi | eax &= edi; 0x0045329b mov rbp, r11 | 0x0045329e mov rdi, r10 | rdi = r10; | if (eax == 0) { 0x004532a1 je 0x453200 | goto label_0; | } | label_10: 0x004532a7 bsf edx, eax | __asm ("bsf edx, eax"); 0x004532aa imul rcx, rdx, 0x38 | rcx = rdx * 0x38; 0x004532ae mov r10, rdi | r10 = rdi; 0x004532b1 mov byte [rdi + rdx], 0xc0 | *((rdi + rdx)) = 0xc0; 0x004532b5 mov r11, rbp | r11 = rbp; 0x004532b8 dec qword [rbp + 0x10] | *((rbp + 0x10))--; 0x004532bc mov rdi, qword [rsp + 0x20] | rdi = *((rsp + 0x20)); 0x004532c1 lea r8, [rdi + rcx] | r8 = rdi + rcx; 0x004532c5 movsxd r9, dword [rdi + rcx] | r9 = *((rdi + rcx)); 0x004532c9 movabs rcx, 0x9e3779b97f4a7c15 | rcx = 0x9e3779b97f4a7c15; 0x004532d3 imul r9, rcx | r9 *= rcx; 0x004532d7 test r12, r12 | | if (r12 == 0) { 0x004532da je 0x45325a | goto label_1; | } 0x004532e0 mov rdi, r9 | rdi = r9; 0x004532e3 mov rcx, qword [rsp + 0x10] | rcx = *((rsp + 0x10)); 0x004532e8 shr rdi, cl | rdi >>= cl; 0x004532eb shl rdi, 4 | rdi <<= 4; 0x004532ef xor ecx, ecx | ecx = 0; 0x004532f1 nop word cs:[rax + rax] | 0x004532fb nop dword [rax + rax] | | label_3: 0x00453300 movdqu xmm0, xmmword [r15 + rdi] | __asm ("movdqu xmm0, xmmword [r15 + rdi]"); 0x00453306 pmovmskb r13d, xmm0 | __asm ("pmovmskb r13d, xmm0"); 0x0045330b test r13w, r13w | | if (r13w != 0) { 0x0045330f jne 0x453250 | goto label_2; | } 0x00453315 add rdi, 0x10 | rdi += 0x10; 0x00453319 and rdi, rsi | rdi &= rsi; 0x0045331c add rcx, 0x10 | rcx += 0x10; 0x00453320 cmp rcx, r12 | | if (rcx < r12) { 0x00453323 jb 0x453300 | goto label_3; | } 0x00453325 jmp 0x45325a | goto label_1; | label_7: 0x0045332a xor r14d, r14d | r14d = 0; | label_9: 0x0045332d mov rsi, qword [rbp] | rsi = *(rbp); 0x00453331 mov rdi, qword [rbp + 0x28] | rdi = *((rbp + 0x28)); 0x00453335 mov rax, qword [rdi] | rax = *(rdi); 0x00453338 call qword [rax + 0x18] | uint64_t (*rax + 0x18)() (); 0x0045333b mov rsi, qword [rbp + 8] | rsi = *((rbp + 8)); 0x0045333f mov rdi, qword [rbp + 0x28] | rdi = *((rbp + 0x28)); 0x00453343 mov rax, qword [rdi] | rax = *(rdi); 0x00453346 call qword [rax + 0x18] | uint64_t (*rax + 0x18)() (); 0x00453349 mov rax, qword [rsp + 8] | rax = *((rsp + 8)); 0x0045334e mov qword [rbp], rax | *(rbp) = rax; 0x00453352 mov qword [rbp + 8], r15 | *((rbp + 8)) = r15; 0x00453356 mov qword [rbp + 0x10], r14 | *((rbp + 0x10)) = r14; 0x0045335a mov qword [rbp + 0x18], r12 | *((rbp + 0x18)) = r12; 0x0045335e mov rax, qword [rsp + 0x28] | rax = *((rsp + 0x28)); 0x00453363 mov dword [rbp + 0x20], eax | *((rbp + 0x20)) = eax; 0x00453366 add rsp, 0x38 | 0x0045336a pop rbx | 0x0045336b pop r12 | 0x0045336d pop r13 | 0x0045336f pop r14 | 0x00453371 pop r15 | 0x00453373 pop rbp | 0x00453374 ret | return rax; | label_6: 0x00453375 xor r12d, r12d | r12d = 0; 0x00453378 jmp 0x453170 | goto label_4; | }