; assembly | /* r2dec pseudo code output */ | /* bdlc_flathashmap.t/none @ 0x45ce70 */ | #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_short__bsl::pair_short__short___BloombergLP::bdlc::FlatHashMap_EntryUtil_short__short__bsl::pair_short__short_____BloombergLP::bslh::FibonacciBadHashWrapper_bsl::hash_short_____bsl::equal_to_short___.rehashRaw_unsi () | uint64_t method_BloombergLP::bdlc::FlatHashTable_short_bsl::pair_short_short_BloombergLP::bdlc::FlatHashMap_EntryUtil_short_short_bsl::pair_short_short_BloombergLP::bslh::FibonacciBadHashWrapper_bsl::hash_short_bsl::equal_to_short_rehashRaw_unsi (int64_t arg4, int64_t arg2, int64_t arg1) { | int64_t var_8h; | int64_t var_10h; | rcx = arg4; | rsi = arg2; | rdi = arg1; | /* BloombergLP::bdlc::FlatHashTable, BloombergLP::bdlc::FlatHashMap_EntryUtil >, BloombergLP::bslh::FibonacciBadHashWrapper >, bsl::equal_to >::rehashRaw(unsigned long) */ 0x0045ce70 push rbp | 0x0045ce71 push r15 | 0x0045ce73 push r14 | 0x0045ce75 push r13 | 0x0045ce77 push r12 | 0x0045ce79 push rbx | 0x0045ce7a sub rsp, 0x18 | 0x0045ce7e mov rbx, rsi | rbx = rsi; 0x0045ce81 mov r15, rdi | r15 = rdi; 0x0045ce84 mov rbp, qword [rdi + 0x28] | rbp = *((rdi + 0x28)); 0x0045ce88 test rbp, rbp | | if (rbp == 0) { 0x0045ce8b jne 0x45cea1 | 0x0045ce8d mov rbp, qword [rip + 0x24ffb4] | rbp = BloombergLP::bslma::Default::s_defaultAllocator; 0x0045ce94 test rbp, rbp | | if (rbp != 0) { 0x0045ce97 jne 0x45cea1 | goto label_4; | } 0x0045ce99 call 0x460a70 | rax = BloombergLP::bslma::Default::determineAndReturnDefaultAllocator() (); 0x0045ce9e mov rbp, rax | | } | label_4: 0x0045cea1 test rbx, rbx | 0x0045cea4 mov qword [rsp], rbp | *(rsp) = rbp; | if (rbx != 0) { 0x0045cea8 je 0x45cf35 | 0x0045ceae mov r13d, 0x20 | r13d = 0x20; 0x0045ceb4 cmp rbx, 0x21 | | if (rbx >= 0x21) { 0x0045ceb8 jb 0x45cedf | 0x0045ceba dec rbx | rbx--; 0x0045cebd or rbx, 1 | rbx |= 1; 0x0045cec1 bsr rax, rbx | __asm ("bsr rax, rbx"); 0x0045cec5 xor rax, 0x3f | rax ^= 0x3f; 0x0045cec9 mov ecx, eax | ecx = eax; 0x0045cecb neg cl | cl = -cl; 0x0045cecd mov r13d, 1 | r13d = 1; 0x0045ced3 shl r13, cl | r13 <<= cl; 0x0045ced6 test rax, rax | | if (rax == 0) { 0x0045ced9 je 0x45d094 | goto label_5; | } | } | label_3: 0x0045cedf lea rsi, [r13*4] | rsi = r13*4; 0x0045cee7 mov rax, qword [rbp] | rax = *(rbp); 0x0045ceeb mov rdi, rbp | rdi = rbp; 0x0045ceee call qword [rax + 0x10] | rax = uint64_t (*rax + 0x10)() (); 0x0045cef1 mov r12, rax | r12 = rax; 0x0045cef4 mov rax, qword [rbp] | rax = *(rbp); 0x0045cef8 mov rdi, rbp | rdi = rbp; 0x0045cefb mov rsi, r13 | rsi = r13; 0x0045cefe call qword [rax + 0x10] | rax = uint64_t (*rax + 0x10)() (); 0x0045cf01 mov rbx, rax | rbx = rax; 0x0045cf04 mov rax, r13 | rax = r13; 0x0045cf07 shr rax, 4 | rax >>= 4; 0x0045cf0b dec rax | rax--; 0x0045cf0e mov rcx, rax | rcx = rax; 0x0045cf11 or rcx, 1 | rcx |= 1; 0x0045cf15 bsr rbp, rcx | __asm ("bsr rbp, rcx"); 0x0045cf19 xor ebp, 0x3f | ebp ^= 0x3f; 0x0045cf1c cmp rax, 1 | 0x0045cf20 adc ebp, 0 | ebp += 0; 0x0045cf23 mov rdi, rbx | 0x0045cf26 mov esi, 0x80 | 0x0045cf2b mov rdx, r13 | 0x0045cf2e call 0x4038e0 | memset (rbx, 0x80, r13); 0x0045cf33 jmp 0x45cf3f | | } else { 0x0045cf35 xor ebp, ebp | ebp = 0; 0x0045cf37 xor r13d, r13d | r13d = 0; 0x0045cf3a xor ebx, ebx | ebx = 0; 0x0045cf3c xor r12d, r12d | r12d = 0; | } 0x0045cf3f mov rax, qword [r15 + 0x18] | rax = *((r15 + 0x18)); 0x0045cf43 test rax, rax | 0x0045cf46 mov qword [rsp + 8], rbp | *((rsp + 8)) = rbp; | if (rax == 0) { 0x0045cf4b je 0x45d04f | goto label_6; | } 0x0045cf51 mov r10d, ebp | r10d = ebp; 0x0045cf54 lea rsi, [r13 - 1] | rsi = r13 - 1; 0x0045cf58 xor edx, edx | edx = 0; 0x0045cf5a xor r14d, r14d | r14d = 0; 0x0045cf5d jmp 0x45cf76 | goto label_7; | label_0: 0x0045cf60 mov rax, qword [r15 + 0x18] | rax = *((r15 + 0x18)); 0x0045cf64 mov rdx, qword [rsp + 0x10] | rdx = *((rsp + 0x10)); | do { 0x0045cf69 add rdx, 0x10 | rdx += 0x10; 0x0045cf6d cmp rdx, rax | | if (rdx >= rax) { 0x0045cf70 jae 0x45d052 | goto label_8; | } | label_7: 0x0045cf76 mov r11, qword [r15 + 8] | r11 = *((r15 + 8)); 0x0045cf7a movdqu xmm0, xmmword [r11 + rdx] | __asm ("movdqu xmm0, xmmword [r11 + rdx]"); 0x0045cf80 pmovmskb ecx, xmm0 | __asm ("pmovmskb ecx, xmm0"); 0x0045cf84 cmp cx, 0xffff | 0x0045cf88 je 0x45cf69 | | } while (cx == 0xffff); 0x0045cf8a add r11, rdx | r11 += rdx; 0x0045cf8d mov qword [rsp + 0x10], rdx | *((rsp + 0x10)) = rdx; 0x0045cf92 lea rbp, [rdx*4] | rbp = rdx*4; 0x0045cf9a add rbp, qword [r15] | rbp += *(r15); 0x0045cf9d not ecx | ecx = ~ecx; 0x0045cf9f movzx eax, cx | eax = (int32_t) cx; 0x0045cfa2 jmp 0x45cfd2 | goto label_9; | label_1: 0x0045cfb0 xor edi, edi | edi = 0; | label_2: 0x0045cfb2 mov ecx, dword [rbp + rdx*4] | ecx = *((rbp + rdx*4)); 0x0045cfb6 mov dword [r12 + rdi*4], ecx | *((r12 + rdi*4)) = ecx; 0x0045cfba and r8b, 0x7f | r8b &= 0x7f; 0x0045cfbe mov byte [rbx + rdi], r8b | *((rbx + rdi)) = r8b; 0x0045cfc2 inc r14 | r14++; 0x0045cfc5 mov edi, 0xfffffffe | edi = 0xfffffffe; 0x0045cfca mov ecx, edx | ecx = edx; 0x0045cfcc rol edi, cl | edi = rotate_left32 (edi, cl); 0x0045cfce and eax, edi | eax &= edi; | if (eax == 0) { 0x0045cfd0 je 0x45cf60 | goto label_0; | } | label_9: 0x0045cfd2 bsf edx, eax | __asm ("bsf edx, eax"); 0x0045cfd5 mov byte [r11 + rdx], 0xc0 | *((r11 + rdx)) = 0xc0; 0x0045cfda dec qword [r15 + 0x10] | *((r15 + 0x10))--; 0x0045cfde movsx r8, word [rbp + rdx*4] | r8 = *((rbp + rdx*4)); 0x0045cfe4 movabs rcx, 0x9e3779b97f4a7c15 | rcx = 0x9e3779b97f4a7c15; 0x0045cfee imul r8, rcx | r8 *= rcx; 0x0045cff2 test r13, r13 | | if (r13 == 0) { 0x0045cff5 je 0x45cfb0 | goto label_1; | } 0x0045cff7 mov rdi, r8 | rdi = r8; 0x0045cffa mov ecx, r10d | ecx = r10d; 0x0045cffd shr rdi, cl | rdi >>= cl; 0x0045d000 shl rdi, 4 | rdi <<= 4; 0x0045d004 xor ecx, ecx | ecx = 0; 0x0045d006 nop word cs:[rax + rax] | | do { 0x0045d010 movdqu xmm0, xmmword [rbx + rdi] | __asm ("movdqu xmm0, xmmword [rbx + rdi]"); 0x0045d015 pmovmskb r9d, xmm0 | __asm ("pmovmskb r9d, xmm0"); 0x0045d01a test r9w, r9w | | if (r9w != 0) { 0x0045d01e jne 0x45d040 | goto label_10; | } 0x0045d020 add rdi, 0x10 | rdi += 0x10; 0x0045d024 and rdi, rsi | rdi &= rsi; 0x0045d027 add rcx, 0x10 | rcx += 0x10; 0x0045d02b cmp rcx, r13 | 0x0045d02e jb 0x45d010 | | } while (rcx < r13); 0x0045d030 mov rdi, r13 | rdi = r13; 0x0045d033 jmp 0x45cfb2 | goto label_2; | label_10: 0x0045d040 movzx ecx, r9w | ecx = (int32_t) r9w; 0x0045d044 bsf ecx, ecx | __asm ("bsf ecx, ecx"); 0x0045d047 add rdi, rcx | rdi += rcx; 0x0045d04a jmp 0x45cfb2 | goto label_2; | label_6: 0x0045d04f xor r14d, r14d | r14d = 0; | label_8: 0x0045d052 mov rsi, qword [r15] | rsi = *(r15); 0x0045d055 mov rdi, qword [r15 + 0x28] | rdi = *((r15 + 0x28)); 0x0045d059 mov rax, qword [rdi] | rax = *(rdi); 0x0045d05c call qword [rax + 0x18] | uint64_t (*rax + 0x18)() (); 0x0045d05f mov rsi, qword [r15 + 8] | rsi = *((r15 + 8)); 0x0045d063 mov rdi, qword [r15 + 0x28] | rdi = *((r15 + 0x28)); 0x0045d067 mov rax, qword [rdi] | rax = *(rdi); 0x0045d06a call qword [rax + 0x18] | uint64_t (*rax + 0x18)() (); 0x0045d06d mov qword [r15], r12 | *(r15) = r12; 0x0045d070 mov qword [r15 + 8], rbx | *((r15 + 8)) = rbx; 0x0045d074 mov qword [r15 + 0x10], r14 | *((r15 + 0x10)) = r14; 0x0045d078 mov qword [r15 + 0x18], r13 | *((r15 + 0x18)) = r13; 0x0045d07c mov rax, qword [rsp + 8] | rax = *((rsp + 8)); 0x0045d081 mov dword [r15 + 0x20], eax | *((r15 + 0x20)) = eax; 0x0045d085 add rsp, 0x18 | 0x0045d089 pop rbx | 0x0045d08a pop r12 | 0x0045d08c pop r13 | 0x0045d08e pop r14 | 0x0045d090 pop r15 | 0x0045d092 pop rbp | 0x0045d093 ret | return rax; | label_5: 0x0045d094 xor r13d, r13d | r13d = 0; 0x0045d097 jmp 0x45cedf | goto label_3; | }