; assembly | /* r2dec pseudo code output */ | /* bdlc_flathashset.t/none @ 0x4501e0 */ | #include | ; (fcn) fcn.004501e0 () | uint64_t fcn_004501e0 (int64_t arg3, int64_t arg2, int64_t arg1) { | int64_t var_8h; | int64_t var_10h; | rdx = arg3; | rsi = arg2; | rdi = arg1; 0x004501e0 push rbp | 0x004501e1 push r15 | 0x004501e3 push r14 | 0x004501e5 push r13 | 0x004501e7 push r12 | 0x004501e9 push rbx | 0x004501ea sub rsp, 0x18 | 0x004501ee mov rbp, rdx | 0x004501f1 mov r15, rsi | r15 = rsi; 0x004501f4 mov r14, rdi | r14 = rdi; 0x004501f7 mov r12, qword [rsi + 0x28] | r12 = *((rsi + 0x28)); 0x004501fb mov rdi, rsi | 0x004501fe mov rsi, rdx | 0x00450201 mov rdx, r12 | 0x00450204 call 0x44f860 | rax = BloombergLP::bdlc::FlatHashTable,bsl::allocator>,bsl::basic_string,bsl::allocator>,BloombergLP::bdlc::FlatHashSet_EntryUtil,bsl::allocator>>,SeedIsHash,bsl::allocator>>,std::_1::less,bsl::allocator>>>::findKey(bsl::basic_string,bsl::allocator>const&,unsigned long)const (rsi, rdx, r12, rcx, r8); 0x00450209 mov rbx, rax | rbx = rax; 0x0045020c mov rax, qword [r15 + 0x18] | rax = *((r15 + 0x18)); 0x00450210 cmp rbx, rax | | if (rbx != rax) { 0x00450213 jne 0x450290 | goto label_0; | } 0x00450215 mov qword [rsp + 8], rbp | *((rsp + 8)) = rbp; 0x0045021a mov rax, rbx | rax = rbx; 0x0045021d shr rax, 3 | rax >>= 3; 0x00450221 lea rcx, [rax*8] | rcx = rax*8; 0x00450229 sub rcx, rax | rcx -= rax; 0x0045022c cmp qword [r15 + 0x10], rcx | | if (*((r15 + 0x10)) >= rcx) { 0x00450230 jb 0x45024e | 0x00450232 lea rax, [rbx + rbx] | rax = rbx + rbx; 0x00450236 test rbx, rbx | 0x00450239 mov esi, 0x20 | esi = 0x20; | if (rbx != 0) { 0x0045023e cmovne rsi, rax | rsi = rax; | } 0x00450242 mov rdi, r15 | rdi = r15; 0x00450245 call 0x44fa10 | BloombergLP::bdlc::FlatHashTable,bsl::allocator>,bsl::basic_string,bsl::allocator>,BloombergLP::bdlc::FlatHashSet_EntryUtil,bsl::allocator>>,SeedIsHash,bsl::allocator>>,std::_1::less,bsl::allocator>>>::rehashRaw(unsigned long) (); 0x0045024a mov rbx, qword [r15 + 0x18] | rbx = *((r15 + 0x18)); | } 0x0045024e test rbx, rbx | 0x00450251 mov qword [rsp + 0x10], r12 | *((rsp + 0x10)) = r12; | if (rbx == 0) { 0x00450256 je 0x450297 | goto label_1; | } 0x00450258 mov cl, byte [r15 + 0x20] | cl = *((r15 + 0x20)); 0x0045025c mov rax, r12 | rax = r12; 0x0045025f shr rax, cl | rax >>= cl; 0x00450262 mov rcx, qword [r15 + 8] | rcx = *((r15 + 8)); 0x00450266 shl rax, 4 | rax <<= 4; 0x0045026a lea rdx, [rbx - 1] | rdx = rbx - 1; 0x0045026e xor esi, esi | esi = 0; | do { 0x00450270 movdqu xmm0, xmmword [rcx + rax] | __asm ("movdqu xmm0, xmmword [rcx + rax]"); 0x00450275 pmovmskb edi, xmm0 | __asm ("pmovmskb edi, xmm0"); 0x00450279 test di, di | | if (di != 0) { 0x0045027c jne 0x45029b | goto label_2; | } 0x0045027e add rax, 0x10 | rax += 0x10; 0x00450282 and rax, rdx | rax &= rdx; 0x00450285 add rsi, 0x10 | rsi += 0x10; 0x00450289 cmp rsi, rbx | 0x0045028c jb 0x450270 | | } while (rsi < rbx); 0x0045028e jmp 0x4502a7 | goto label_3; | label_0: 0x00450290 xor ecx, ecx | ecx = 0; 0x00450292 jmp 0x450386 | goto label_4; | label_1: 0x00450297 xor ebx, ebx | ebx = 0; 0x00450299 jmp 0x4502a7 | goto label_3; | label_2: 0x0045029b movzx ecx, di | ecx = (int32_t) di; 0x0045029e bsf ecx, ecx | __asm ("bsf ecx, ecx"); 0x004502a1 add rax, rcx | rax += rcx; 0x004502a4 mov rbx, rax | rbx = rax; | label_3: 0x004502a7 mov rcx, qword [rsp + 8] | rcx = *((rsp + 8)); 0x004502ac mov r12, qword [r15] | r12 = *(r15); 0x004502af mov rdi, qword [r15 + 0x38] | rdi = *((r15 + 0x38)); 0x004502b3 lea r13, [rbx + rbx*2] | r13 = rbx * 3; 0x004502b7 shl r13, 4 | r13 <<= 4; 0x004502bb lea rbp, [r12 + r13] | rbp = r12 + r13; 0x004502bf test rdi, rdi | | if (rdi == 0) { 0x004502c2 jne 0x4502dd | 0x004502c4 mov rdi, qword [rip + 0x2527bd] | rdi = BloombergLP::bslma::Default::s_defaultAllocator; 0x004502cb test rdi, rdi | | if (rdi != 0) { 0x004502ce jne 0x4502dd | goto label_5; | } 0x004502d0 call 0x457f90 | rax = BloombergLP::bslma::Default::determineAndReturnDefaultAllocator() (); 0x004502d5 mov rcx, qword [rsp + 8] | rcx = *((rsp + 8)); 0x004502da mov rdi, rax | rdi = rax; | } | label_5: 0x004502dd mov rax, qword [rcx + 0x20] | rax = *((rcx + 0x20)); 0x004502e1 mov qword [rbp + 0x20], rax | *((rbp + 0x20)) = rax; 0x004502e5 movups xmm0, xmmword [rcx] | __asm ("movups xmm0, xmmword [rcx]"); 0x004502e8 movups xmm1, xmmword [rcx + 0x10] | __asm ("movups xmm1, xmmword [rcx + 0x10]"); 0x004502ec movups xmmword [rbp + 0x10], xmm1 | __asm ("movups xmmword [rbp + 0x10], xmm1"); 0x004502f0 movups xmmword [rbp], xmm0 | __asm ("movups xmmword [rbp], xmm0"); 0x004502f4 mov qword [r12 + r13 + 0x28], rdi | *((r12 + r13 + 0x28)) = rdi; 0x004502f9 cmp qword [r12 + r13 + 0x20], 0x17 | | if (*((r12 + r13 + 0x20)) != 0x17) { 0x004502ff je 0x45036d | 0x00450301 lea rdx, [r12 + r13 + 0x20] | rdx = r12 + r13 + 0x20; 0x00450306 mov rax, qword [rcx + 0x18] | rax = *((rcx + 0x18)); 0x0045030a cmp rax, 0x17 | 0x0045030e mov esi, 0x17 | esi = 0x17; | if (rax > 0x17) { 0x00450313 cmova rsi, rax | rsi = rax; | } 0x00450317 mov qword [rbp], 0 | *(rbp) = 0; 0x0045031f mov qword [r12 + r13 + 0x18], rax | *((r12 + r13 + 0x18)) = rax; 0x00450324 mov qword [rdx], rsi | *(rdx) = rsi; 0x00450327 cmp rax, 0x18 | | if (rax >= 0x18) { 0x0045032b jb 0x45034c | 0x0045032d inc rsi | rsi++; 0x00450330 mov rax, qword [rdi] | rax = *(rdi); 0x00450333 mov r12, rdx | r12 = rdx; 0x00450336 call qword [rax + 0x10] | rax = uint64_t (*rax + 0x10)() (); 0x00450339 mov rdx, r12 | rdx = r12; 0x0045033c mov rcx, qword [rsp + 8] | rcx = *((rsp + 8)); 0x00450341 mov qword [rbp], rax | *(rbp) = rax; 0x00450345 cmp qword [r12], 0x17 | | if (*(r12) != 0x17) { 0x0045034a jne 0x45034f | goto label_6; | } | } 0x0045034c mov rax, rbp | rax = rbp; | label_6: 0x0045034f mov rdx, qword [rdx - 8] | rdx = *((rdx - 8)); 0x00450353 inc rdx | rdx++; | if (rdx == 0) { 0x00450356 je 0x45036d | goto label_7; | } 0x00450358 cmp qword [rcx + 0x20], 0x17 | | if (*((rcx + 0x20)) != 0x17) { 0x0045035d je 0x450362 | 0x0045035f mov rcx, qword [rcx] | rcx = *(rcx); | } 0x00450362 mov rdi, rax | 0x00450365 mov rsi, rcx | 0x00450368 call 0x403e80 | memcpy (rax, rcx, rdx); | } | label_7: 0x0045036d mov rcx, qword [rsp + 0x10] | rcx = *((rsp + 0x10)); 0x00450372 and cl, 0x7f | cl &= 0x7f; 0x00450375 mov rax, qword [r15 + 8] | rax = *((r15 + 8)); 0x00450379 mov byte [rax + rbx], cl | *((rax + rbx)) = cl; 0x0045037c inc qword [r15 + 0x10] | *((r15 + 0x10))++; 0x00450380 mov rax, qword [r15 + 0x18] | rax = *((r15 + 0x18)); 0x00450384 mov cl, 1 | cl = 1; | label_4: 0x00450386 lea rdx, [rbx + rbx*2] | rdx = rbx * 3; 0x0045038a shl rdx, 4 | rdx <<= 4; 0x0045038e add rdx, qword [r15] | rdx += *(r15); 0x00450391 mov rsi, qword [r15 + 8] | rsi = *((r15 + 8)); 0x00450395 add rsi, rbx | rsi += rbx; 0x00450398 not rbx | rbx = ~rbx; 0x0045039b add rbx, rax | rbx += rax; 0x0045039e mov qword [r14], rdx | *(r14) = rdx; 0x004503a1 mov qword [r14 + 8], rsi | *((r14 + 8)) = rsi; 0x004503a5 mov qword [r14 + 0x10], rbx | *((r14 + 0x10)) = rbx; 0x004503a9 mov byte [r14 + 0x18], cl | *((r14 + 0x18)) = cl; 0x004503ad mov rax, r14 | rax = r14; 0x004503b0 add rsp, 0x18 | 0x004503b4 pop rbx | 0x004503b5 pop r12 | 0x004503b7 pop r13 | 0x004503b9 pop r14 | 0x004503bb pop r15 | 0x004503bd pop rbp | 0x004503be ret | return rax; | }