; assembly | /* r2dec pseudo code output */ | /* bdlc_flathashmap.t/none @ 0x4530c0 */ | #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_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_char_____bsl::pair_int__bsl::basic_string_char__std::__1::char_traits_char___bsl::allocator_char_________BloombergLP::bslh::FibonacciBadHashWrapper_bsl::hash_int_____bsl::equal_to_int___::indexOfKey_bool__int_const__unsigned_long_ () | int64_t 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_char_bsl::pair_int_bsl::basic_string_char_std::_1::char_traits_char_bsl::allocator_char_BloombergLP::bslh::FibonacciBadHashWrapper_bsl::hash_int_bsl::equal_to_int_::indexOfKey_bool_int_const_unsigned_long_ (int64_t arg4, void * arg3, void * arg2, uint32_t arg1, uint32_t arg9, int64_t arg10) { | rcx = arg4; | rdx = arg3; | rsi = arg2; | rdi = arg1; | xmm2 = arg9; | xmm3 = arg10; | /* BloombergLP::bdlc::FlatHashTable, bsl::allocator > >, BloombergLP::bdlc::FlatHashMap_EntryUtil, bsl::allocator >, bsl::pair, bsl::allocator > > >, BloombergLP::bslh::FibonacciBadHashWrapper >, bsl::equal_to >::indexOfKey(bool*, int const&, unsigned long) */ 0x004530c0 push rbp | 0x004530c1 push r15 | 0x004530c3 push r14 | 0x004530c5 push r12 | 0x004530c7 push rbx | 0x004530c8 mov rbx, rcx | rbx = rcx; 0x004530cb mov r14, rdi | r14 = rdi; 0x004530ce mov rdi, qword [rdi + 0x18] | rdi = *((rdi + 0x18)); 0x004530d2 test rdi, rdi | | if (rdi == 0) { 0x004530d5 je 0x453200 | goto label_2; | } 0x004530db mov r10d, ebx | r10d = ebx; 0x004530de mov cl, byte [r14 + 0x20] | cl = *((r14 + 0x20)); 0x004530e2 mov rax, rbx | rax = rbx; 0x004530e5 shr rax, cl | rax >>= cl; 0x004530e8 and r10b, 0x7f | r10b &= 0x7f; 0x004530ec shl rax, 4 | rax <<= 4; 0x004530f0 mov r8, qword [r14] | r8 = *(r14); 0x004530f3 mov r9, qword [r14 + 8] | r9 = *((r14 + 8)); 0x004530f7 movzx ecx, r10b | ecx = (int32_t) r10b; 0x004530fb movd xmm0, ecx | xmm0 = ecx; 0x004530ff pxor xmm1, xmm1 | xmm1 = 0; 0x00453103 pshufb xmm0, xmm1 | __asm ("pshufb xmm0, xmm1"); 0x00453108 mov r15d, dword [rdx] | r15d = *(rdx); 0x0045310b lea r10, [rdi - 1] | r10 = rdi - 1; 0x0045310f xor r11d, r11d | r11d = 0; 0x00453112 movdqa xmm1, xmmword [rip + 0x34d56] | __asm ("movdqa xmm1, xmmword [0x00487e70]"); | label_0: 0x0045311a movdqu xmm2, xmmword [r9 + rax] | __asm ("movdqu xmm2, xmmword [r9 + rax]"); 0x00453120 movdqa xmm3, xmm0 | __asm ("movdqa xmm3, xmm0"); 0x00453124 pcmpeqb xmm3, xmm2 | __asm ("pcmpeqb xmm3, xmm2"); 0x00453128 pmovmskb ecx, xmm3 | __asm ("pmovmskb ecx, xmm3"); 0x0045312c test cx, cx | | if (cx == 0) { 0x0045312f je 0x453160 | goto label_3; | } 0x00453131 imul rdx, rax, 0x38 | rdx = rax * 0x38; 0x00453135 add rdx, r8 | rdx += r8; 0x00453138 movzx r12d, cx | r12d = (int32_t) cx; | do { 0x0045313c bsf ecx, r12d | __asm ("bsf ecx, r12d"); 0x00453140 imul rbp, rcx, 0x38 | rbp = rcx * 0x38; 0x00453144 cmp dword [rdx + rbp], r15d | | if (*((rdx + rbp)) == r15d) { 0x00453148 je 0x45317f | goto label_4; | } 0x0045314a mov ebp, 0xfffffffe | 0x0045314f rol ebp, cl | ebp = rotate_left32 (ebp, cl); 0x00453151 and r12d, ebp | r12d &= ebp; 0x00453154 jne 0x45313c | | } while (r12d != 0); 0x00453156 nop word cs:[rax + rax] | | label_3: 0x00453160 pcmpeqb xmm2, xmm1 | __asm ("pcmpeqb xmm2, xmm1"); 0x00453164 pmovmskb ecx, xmm2 | __asm ("pmovmskb ecx, xmm2"); 0x00453168 test cx, cx | | if (cx != 0) { 0x0045316b jne 0x453189 | goto label_1; | } 0x0045316d add rax, 0x10 | rax += 0x10; 0x00453171 and rax, r10 | rax &= r10; 0x00453174 add r11, 0x10 | r11 += 0x10; 0x00453178 cmp r11, rdi | | if (r11 < rdi) { 0x0045317b jb 0x45311a | goto label_0; | } 0x0045317d jmp 0x453189 | goto label_1; | label_4: 0x0045317f mov ecx, ecx | 0x00453181 add rax, rcx | rax += rcx; 0x00453184 cmp rax, rdi | | if (rax != rdi) { 0x00453187 jne 0x453207 | goto label_5; | } | label_1: 0x00453189 mov byte [rsi], 1 | *(rsi) = 1; 0x0045318c mov rax, qword [r14 + 0x18] | rax = *((r14 + 0x18)); 0x00453190 mov rcx, rax | rcx = *((r14 + 0x18)); 0x00453193 shr rcx, 3 | rcx >>= 3; 0x00453197 lea rdx, [rcx*8] | rdx = rcx*8; 0x0045319f sub rdx, rcx | rdx -= rcx; 0x004531a2 cmp qword [r14 + 0x10], rdx | | if (*((r14 + 0x10)) >= rdx) { 0x004531a6 jb 0x4531c4 | 0x004531a8 lea rcx, [rax + rax] | rcx = rax + rax; 0x004531ac test rax, rax | 0x004531af mov esi, 0x20 | esi = 0x20; | if (rax != 0) { 0x004531b4 cmovne rsi, rcx | rsi = rcx; | } 0x004531b8 mov rdi, r14 | 0x004531bb call 0x453230 | BloombergLP::bdlc::FlatHashTable,bsl::allocator>>,BloombergLP::bdlc::FlatHashMap_EntryUtil,bsl::allocator>,bsl::pair,bsl::allocator>>>,BloombergLP::bslh::FibonacciBadHashWrapper>,bsl::equal_to>::rehashRaw(unsigned long) (r14, rsi); 0x004531c0 mov rax, qword [r14 + 0x18] | rax = *((r14 + 0x18)); | } 0x004531c4 test rax, rax | | if (rax == 0) { 0x004531c7 je 0x45320c | goto label_6; | } 0x004531c9 mov cl, byte [r14 + 0x20] | cl = *((r14 + 0x20)); 0x004531cd shr rbx, cl | rbx >>= cl; 0x004531d0 mov rcx, qword [r14 + 8] | rcx = *((r14 + 8)); 0x004531d4 shl rbx, 4 | rbx <<= 4; 0x004531d8 lea rdx, [rax - 1] | rdx = rax - 1; 0x004531dc xor esi, esi | esi = 0; 0x004531de nop | | do { 0x004531e0 movdqu xmm0, xmmword [rcx + rbx] | __asm ("movdqu xmm0, xmmword [rcx + rbx]"); 0x004531e5 pmovmskb edi, xmm0 | __asm ("pmovmskb edi, xmm0"); 0x004531e9 test di, di | | if (di != 0) { 0x004531ec jne 0x453210 | goto label_7; | } 0x004531ee add rbx, 0x10 | rbx += 0x10; 0x004531f2 and rbx, rdx | rbx &= rdx; 0x004531f5 add rsi, 0x10 | rsi += 0x10; 0x004531f9 cmp rsi, rax | 0x004531fc jb 0x4531e0 | | } while (rsi < rax); 0x004531fe jmp 0x45321c | goto label_8; | label_2: 0x00453200 xor eax, eax | eax = 0; 0x00453202 cmp rax, rdi | | if (rax == rdi) { 0x00453205 je 0x453189 | goto label_1; | } | label_5: 0x00453207 mov byte [rsi], 0 | *(rsi) = 0; 0x0045320a jmp 0x45321c | goto label_8; | label_6: 0x0045320c xor eax, eax | eax = 0; 0x0045320e jmp 0x45321c | goto label_8; | label_7: 0x00453210 movzx eax, di | eax = (int32_t) di; 0x00453213 bsf eax, eax | __asm ("bsf eax, eax"); 0x00453216 add rbx, rax | rbx += rax; 0x00453219 mov rax, rbx | rax = rbx; | label_8: 0x0045321c pop rbx | 0x0045321d pop r12 | 0x0045321f pop r14 | 0x00453221 pop r15 | 0x00453223 pop rbp | 0x00453224 ret | return rax; | }