; assembly | /* r2dec pseudo code output */ | /* bdlc_flathashset.t/assume @ 0x44d330 */ | #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__int__BloombergLP::bdlc::FlatHashSet_EntryUtil_int___BloombergLP::bslh::FibonacciBadHashWrapper_bsl::hash_int_____bsl::equal_to_int___.indexOfKey_bool__int_const__unsigned_long_ () | int64_t method_BloombergLP::bdlc::FlatHashTable_int_int_BloombergLP::bdlc::FlatHashSet_EntryUtil_int_BloombergLP::bslh::FibonacciBadHashWrapper_bsl::hash_int_bsl::equal_to_int_indexOfKey_bool_int_const_unsigned_long_ (uint32_t arg4, size_t arg3, size_t arg2, size_t arg1, uint32_t arg9, int64_t arg10) { | rcx = arg4; | rdx = arg3; | rsi = arg2; | rdi = arg1; | xmm2 = arg9; | xmm3 = arg10; | /* BloombergLP::bdlc::FlatHashTable, BloombergLP::bslh::FibonacciBadHashWrapper >, bsl::equal_to >::indexOfKey(bool*, int const&, unsigned long) */ 0x0044d330 push rbp | 0x0044d331 push r15 | 0x0044d333 push r14 | 0x0044d335 push r12 | 0x0044d337 push rbx | 0x0044d338 mov rbx, rcx | rbx = rcx; 0x0044d33b mov r14, rdi | r14 = rdi; 0x0044d33e mov rdi, qword [rdi + 0x18] | rdi = *((rdi + 0x18)); 0x0044d342 test rdi, rdi | | if (rdi == 0) { 0x0044d345 je 0x44d460 | goto label_2; | } 0x0044d34b mov r10d, ebx | r10d = ebx; 0x0044d34e mov cl, byte [r14 + 0x20] | cl = *((r14 + 0x20)); 0x0044d352 mov rax, rbx | rax = rbx; 0x0044d355 shr rax, cl | rax >>= cl; 0x0044d358 and r10b, 0x7f | r10b &= 0x7f; 0x0044d35c shl rax, 4 | rax <<= 4; 0x0044d360 mov r8, qword [r14] | r8 = *(r14); 0x0044d363 mov r9, qword [r14 + 8] | r9 = *((r14 + 8)); 0x0044d367 movzx ecx, r10b | ecx = (int32_t) r10b; 0x0044d36b movd xmm0, ecx | xmm0 = ecx; 0x0044d36f pxor xmm1, xmm1 | xmm1 = 0; 0x0044d373 pshufb xmm0, xmm1 | __asm ("pshufb xmm0, xmm1"); 0x0044d378 mov r15d, dword [rdx] | r15d = *(rdx); 0x0044d37b lea r10, [rdi - 1] | r10 = rdi - 1; 0x0044d37f xor r11d, r11d | r11d = 0; 0x0044d382 movdqa xmm1, xmmword [rip + 0x31e86] | __asm ("movdqa xmm1, xmmword [0x0047f210]"); | label_0: 0x0044d38a movdqu xmm2, xmmword [r9 + rax] | __asm ("movdqu xmm2, xmmword [r9 + rax]"); 0x0044d390 movdqa xmm3, xmm0 | __asm ("movdqa xmm3, xmm0"); 0x0044d394 pcmpeqb xmm3, xmm2 | __asm ("pcmpeqb xmm3, xmm2"); 0x0044d398 pmovmskb ecx, xmm3 | __asm ("pmovmskb ecx, xmm3"); 0x0044d39c test cx, cx | | if (cx == 0) { 0x0044d39f je 0x44d3c0 | goto label_3; | } 0x0044d3a1 lea rdx, [r8 + rax*4] | rdx = r8 + rax*4; 0x0044d3a5 movzx ebp, cx | ebp = (int32_t) cx; | do { 0x0044d3a8 bsf ecx, ebp | __asm ("bsf ecx, ebp"); 0x0044d3ab cmp dword [rdx + rcx*4], r15d | | if (*((rdx + rcx*4)) == r15d) { 0x0044d3af je 0x44d3df | goto label_4; | } 0x0044d3b1 mov r12d, 0xfffffffe | r12d = 0xfffffffe; 0x0044d3b7 rol r12d, cl | r12d = rotate_left32 (r12d, cl); 0x0044d3ba and ebp, r12d | ebp &= r12d; 0x0044d3bd jne 0x44d3a8 | | } while (ebp != 0); 0x0044d3bf nop | | label_3: 0x0044d3c0 pcmpeqb xmm2, xmm1 | __asm ("pcmpeqb xmm2, xmm1"); 0x0044d3c4 pmovmskb ecx, xmm2 | __asm ("pmovmskb ecx, xmm2"); 0x0044d3c8 test cx, cx | | if (cx != 0) { 0x0044d3cb jne 0x44d3e9 | goto label_1; | } 0x0044d3cd add rax, 0x10 | rax += 0x10; 0x0044d3d1 and rax, r10 | rax &= r10; 0x0044d3d4 add r11, 0x10 | r11 += 0x10; 0x0044d3d8 cmp r11, rdi | | if (r11 < rdi) { 0x0044d3db jb 0x44d38a | goto label_0; | } 0x0044d3dd jmp 0x44d3e9 | goto label_1; | label_4: 0x0044d3df mov ecx, ecx | 0x0044d3e1 add rax, rcx | rax += rcx; 0x0044d3e4 cmp rax, rdi | | if (rax != rdi) { 0x0044d3e7 jne 0x44d467 | goto label_5; | } | label_1: 0x0044d3e9 mov byte [rsi], 1 | *(rsi) = 1; 0x0044d3ec mov rdx, qword [r14 + 0x18] | rdx = *((r14 + 0x18)); 0x0044d3f0 mov rax, rdx | rax = *((r14 + 0x18)); 0x0044d3f3 shr rax, 3 | rax >>= 3; 0x0044d3f7 lea rcx, [rax*8] | rcx = rax*8; 0x0044d3ff sub rcx, rax | rcx -= rax; 0x0044d402 cmp qword [r14 + 0x10], rcx | | if (*((r14 + 0x10)) >= rcx) { 0x0044d406 jb 0x44d424 | 0x0044d408 lea rax, [rdx + rdx] | rax = rdx + rdx; 0x0044d40c test rdx, rdx | 0x0044d40f mov esi, 0x20 | esi = 0x20; | if (rdx != 0) { 0x0044d414 cmovne rsi, rax | rsi = rax; | } 0x0044d418 mov rdi, r14 | 0x0044d41b call 0x44d490 | BloombergLP::bdlc::FlatHashTable,BloombergLP::bslh::FibonacciBadHashWrapper>,bsl::equal_to>::rehashRaw(unsigned long) (r14, rsi, rdx); 0x0044d420 mov rdx, qword [r14 + 0x18] | rdx = *((r14 + 0x18)); | } 0x0044d424 test rdx, rdx | | if (rdx == 0) { 0x0044d427 je 0x44d46c | goto label_6; | } 0x0044d429 mov cl, byte [r14 + 0x20] | cl = *((r14 + 0x20)); 0x0044d42d shr rbx, cl | rbx >>= cl; 0x0044d430 mov rcx, qword [r14 + 8] | rcx = *((r14 + 8)); 0x0044d434 shl rbx, 4 | rbx <<= 4; 0x0044d438 lea rsi, [rdx - 1] | rsi = rdx - 1; 0x0044d43c xor edi, edi | edi = 0; 0x0044d43e nop | | do { 0x0044d440 movdqu xmm0, xmmword [rcx + rbx] | __asm ("movdqu xmm0, xmmword [rcx + rbx]"); 0x0044d445 pmovmskb eax, xmm0 | __asm ("pmovmskb eax, xmm0"); 0x0044d449 test ax, ax | | if (ax != 0) { 0x0044d44c jne 0x44d46e | goto label_7; | } 0x0044d44e add rbx, 0x10 | rbx += 0x10; 0x0044d452 and rbx, rsi | rbx &= rsi; 0x0044d455 add rdi, 0x10 | rdi += 0x10; 0x0044d459 cmp rdi, rdx | 0x0044d45c jb 0x44d440 | | } while (rdi < rdx); 0x0044d45e jmp 0x44d47a | goto label_8; | label_2: 0x0044d460 xor eax, eax | eax = 0; 0x0044d462 cmp rax, rdi | | if (rax == rdi) { 0x0044d465 je 0x44d3e9 | goto label_1; | } | label_5: 0x0044d467 mov byte [rsi], 0 | *(rsi) = 0; 0x0044d46a jmp 0x44d47a | goto label_8; | label_6: 0x0044d46c jmp 0x44d47a | goto label_8; | label_7: 0x0044d46e movzx eax, ax | eax = (int32_t) ax; 0x0044d471 bsf eax, eax | __asm ("bsf eax, eax"); 0x0044d474 add rbx, rax | rbx += rax; 0x0044d477 mov rax, rbx | rax = rbx; | label_8: 0x0044d47a pop rbx | 0x0044d47b pop r12 | 0x0044d47d pop r14 | 0x0044d47f pop r15 | 0x0044d481 pop rbp | 0x0044d482 ret | return rax; | }