; assembly | /* r2dec pseudo code output */ | /* bdlcc_sharedobjectpool.t/none @ 0x409610 */ | #include | ; (fcn) sym.BloombergLP::bdlcc::ObjectPool_BloombergLP::bdlcc::SharedObjectPool_Rep__anonymous_namespace_::SpLink__BloombergLP::bdlcc::ObjectPoolFunctors::Reset__anonymous_namespace_::SpLink_____bsl::function_void__void__BloombergLP::bslma::Allocator____BloombergLP::bdlcc::ObjectPoolFunctors::Reset_BloombergLP::bdlcc::SharedObjectPool_Rep__anonymous_namespace_::SpLink__BloombergLP::bdlcc::ObjectPoolFunctors::Reset__anonymous_namespace_::SpLink_______::getObject__ () | int64_t BloombergLP::bdlcc::ObjectPool_BloombergLP::bdlcc::SharedObjectPool_Rep_anonymous_namespace_::SpLink_BloombergLP::bdlcc::ObjectPoolFunctors::Reset_anonymous_namespace_::SpLink_bsl::function_void_void_BloombergLP::bslma::Allocator_BloombergLP::bdlcc::ObjectPoolFunctors::Reset_BloombergLP::bdlcc::SharedObjectPool_Rep_anonymous_namespace_::SpLink_BloombergLP::bdlcc::ObjectPoolFunctors::Reset_anonymous_namespace_::SpLink_::getObject_ (int64_t arg1) { | int64_t var_4h; | uint32_t var_8h; | int64_t var_10h; | int64_t var_18h; | int64_t var_20h; | rdi = arg1; | /* BloombergLP::bdlcc::ObjectPool >, bsl::function, BloombergLP::bdlcc::ObjectPoolFunctors::Reset > > >::getObject() */ 0x00409610 push rbp | 0x00409611 push r15 | 0x00409613 push r14 | 0x00409615 push r13 | 0x00409617 push r12 | 0x00409619 push rbx | 0x0040961a sub rsp, 0x28 | 0x0040961e mov rbp, rdi | 0x00409621 lea r14, [rdi + 0x90] | r14 = rdi + 0x90; 0x00409628 lea r15, [rdi + 0x78] | r15 = rdi + 0x78; 0x0040962c lea r12, [rdi + 0x10] | r12 = rdi + 0x10; | label_1: 0x00409630 mov rbx, qword [rbp + 8] | rbx = *((rbp + 8)); 0x00409634 test rbx, rbx | | if (rbx == 0) { 0x00409637 je 0x4096a2 | goto label_4; | } | label_2: 0x00409639 mov eax, 2 | eax = 2; 0x0040963e lock xadd dword [rbx + 8], eax | __asm ("lock xadd dword [rbx + 8], eax"); 0x00409643 test eax, eax | | if (eax != 0) { 0x00409645 jne 0x4096c0 | goto label_5; | } | label_3: 0x00409647 mov rax, qword [rbp + 8] | rax = *((rbp + 8)); 0x0040964b mov qword [rsp + 0x18], rax | *((rsp + 0x18)) = rax; 0x00409650 mov rax, qword [rsp + 0x18] | rax = *((rsp + 0x18)); 0x00409655 cmp rax, rbx | | if (rax != rbx) { 0x00409658 jne 0x40968a | goto label_0; | } 0x0040965a mov rax, qword [rsp + 0x18] | rax = *((rsp + 0x18)); 0x0040965f mov rcx, qword [rax] | rcx = *(rax); 0x00409662 mov rax, rbx | rax = rbx; 0x00409665 lock cmpxchg qword [rbp + 8], rcx | __asm ("lock cmpxchg qword [rbp + 8], rcx"); 0x0040966b cmp rbx, rax | | if (rbx == rax) { 0x0040966e je 0x4097e2 | goto label_6; | } 0x00409674 jmp 0x40968a | | while ((cl & 1) != 0) { 0x00409676 mov edx, ecx | edx = ecx; 0x00409678 xor edx, 1 | edx ^= 1; 0x0040967b mov eax, ecx | eax = ecx; 0x0040967d lock cmpxchg dword [rbx + 8], edx | __asm ("lock cmpxchg dword [rbx + 8], edx"); 0x00409682 cmp ecx, eax | | if (ecx == eax) { 0x00409684 je 0x4097e2 | goto label_6; | } | label_0: 0x0040968a mov ecx, dword [rbx + 8] | ecx = *((rbx + 8)); 0x0040968d test cl, 1 | 0x00409690 jne 0x409676 | | } 0x00409692 lea edx, [rcx - 2] | edx = rcx - 2; 0x00409695 mov eax, ecx | eax = ecx; 0x00409697 lock cmpxchg dword [rbx + 8], edx | __asm ("lock cmpxchg dword [rbx + 8], edx"); 0x0040969c cmp ecx, eax | | if (ecx != eax) { 0x0040969e jne 0x40968a | goto label_0; | } 0x004096a0 jmp 0x409630 | goto label_1; | label_4: 0x004096a2 mov rdi, r14 | rdi = r14; 0x004096a5 call 0x403a50 | pthread_mutex_lock (); 0x004096aa mov rbx, qword [rbp + 8] | rbx = *((rbp + 8)); 0x004096ae test rbx, rbx | | if (rbx == 0) { 0x004096b1 je 0x4096e3 | goto label_7; | } 0x004096b3 mov rdi, r14 | rdi = r14; 0x004096b6 call 0x403b00 | pthread_mutex_unlock (); 0x004096bb jmp 0x409639 | goto label_2; | label_5: 0x004096c0 mov rax, qword [rbp + 8] | rax = *((rbp + 8)); 0x004096c4 cmp rbx, rax | | if (rbx != rax) { 0x004096c7 jne 0x409647 | goto label_3; | } 0x004096cd mov rax, qword [rbp + 8] | rax = *((rbp + 8)); 0x004096d1 cmp rbx, rax | | if (rbx != rax) { 0x004096d4 jne 0x409647 | goto label_3; | } 0x004096da mov rax, qword [rbp + 8] | rax = *((rbp + 8)); 0x004096de jmp 0x409647 | goto label_3; | label_7: 0x004096e3 mov eax, dword [rbp + 0x64] | eax = *((rbp + 0x64)); 0x004096e6 mov ebx, eax | ebx = *((rbp + 0x64)); 0x004096e8 neg ebx | ebx = -ebx; 0x004096ea mov dword [rsp + 8], eax | *((rsp + 8)) = eax; | if (rbx < rax) { 0x004096ee cmovl ebx, eax | ebx = eax; | } 0x004096f1 mov eax, ebx | eax = ebx; 0x004096f3 shl eax, 6 | eax <<= 6; 0x004096f6 or eax, 0x10 | eax |= 0x10; 0x004096f9 movsxd rsi, eax | rsi = (int64_t) eax; 0x004096fc mov rdi, r15 | 0x004096ff call 0x410520 | BloombergLP::bdlma::InfrequentDeleteBlockList::allocate(unsigned long) (r15, rsi); 0x00409704 mov rcx, qword [rbp + 0x70] | rcx = *((rbp + 0x70)); 0x00409708 mov qword [rax], rcx | *(rax) = rcx; 0x0040970b mov dword [rsp + 4], ebx | *((rsp + 4)) = ebx; 0x0040970f mov dword [rax + 8], ebx | *((rax + 8)) = ebx; 0x00409712 lea rdx, [rax + 0x10] | rdx = rax + 0x10; 0x00409716 mov r13, rdx | r13 = rdx; 0x00409719 cmp dword [rsp + 8], 0 | | if (*((rsp + 8)) == 0) { 0x0040971e je 0x409790 | goto label_8; | } 0x00409720 mov qword [rsp + 0x20], rdx | *((rsp + 0x20)) = rdx; 0x00409725 mov ecx, dword [rsp + 4] | ecx = *((rsp + 4)); 0x00409729 neg ecx | ecx = -ecx; 0x0040972b mov qword [rsp + 8], rcx | *((rsp + 8)) = rcx; 0x00409730 mov ebx, 1 | ebx = 1; 0x00409735 mov qword [rsp + 0x10], rax | *((rsp + 0x10)) = rax; 0x0040973a mov r13, rax | r13 = rax; | do { 0x0040973d lea rax, [r13 + 0x50] | rax = r13 + 0x50; 0x00409741 mov qword [r13 + 0x10], rax | *((r13 + 0x10)) = rax; 0x00409745 mov dword [r13 + 0x18], 0 | *((r13 + 0x18)) = 0; 0x0040974d mov rax, qword [rbp + 0x50] | rax = *((rbp + 0x50)); 0x00409751 test rax, rax | | if (rax == 0) { 0x00409754 je 0x409803 | goto label_9; | } 0x0040975a mov rdx, qword [rbp + 0x88] | rdx = *((rbp + 0x88)); 0x00409761 lea rsi, [r13 + 0x20] | rsi = r13 + 0x20; 0x00409765 mov rdi, r12 | rdi = r12; 0x00409768 call rax | void (*rax)() (); 0x0040976a mov rax, qword [rsp + 8] | rax = *((rsp + 8)); 0x0040976f lea eax, [rax + rbx + 1] | eax = rax + rbx + 1; 0x00409773 mov ecx, ebx | ecx = ebx; 0x00409775 inc ecx | ecx++; 0x00409777 add r13, 0x40 | r13 += 0x40; 0x0040977b mov ebx, ecx | ebx = ecx; 0x0040977d cmp eax, 1 | 0x00409780 jne 0x40973d | | } while (eax != 1); 0x00409782 add r13, 0x10 | r13 += 0x10; 0x00409786 mov rax, qword [rsp + 0x10] | rax = *((rsp + 0x10)); 0x0040978b mov rdx, qword [rsp + 0x20] | rdx = *((rsp + 0x20)); | label_8: 0x00409790 mov dword [r13 - 0x38], 0 | *((r13 - 0x38)) = 0; 0x00409798 mov qword [rbp + 0x70], rax | *((rbp + 0x70)) = rax; | do { 0x0040979c mov rcx, qword [rbp + 8] | rcx = *((rbp + 8)); 0x004097a0 mov qword [r13 - 0x40], rcx | *((r13 - 0x40)) = rcx; 0x004097a4 mov rax, rcx | rax = rcx; 0x004097a7 lock cmpxchg qword [rbp + 8], rdx | __asm ("lock cmpxchg qword [rbp + 8], rdx"); 0x004097ad cmp rcx, rax | 0x004097b0 jne 0x40979c | | } while (rcx != rax); 0x004097b2 mov eax, dword [rsp + 4] | eax = *((rsp + 4)); 0x004097b6 lock add dword [rbp + 0x6c], eax | *((rbp + 0x6c)) += eax; 0x004097ba lock add dword [rbp + 0x68], eax | *((rbp + 0x68)) += eax; 0x004097be mov eax, dword [rbp + 0x64] | eax = *((rbp + 0x64)); 0x004097c1 test eax, eax | | if (eax < 0) { 0x004097c3 jns 0x4097d5 | 0x004097c5 mov ecx, eax | ecx = eax; 0x004097c7 neg ecx | ecx = -ecx; 0x004097c9 lea edx, [rax + rax] | edx = rax + rax; 0x004097cc cmp eax, 0xffffffe0 | | if (eax <= 0xffffffe0) { 0x004097cf cmovle edx, ecx | edx = ecx; | } 0x004097d2 mov dword [rbp + 0x64], edx | *((rbp + 0x64)) = edx; | } 0x004097d5 mov rdi, r14 | rdi = r14; 0x004097d8 call 0x403b00 | pthread_mutex_unlock (); 0x004097dd jmp 0x409630 | goto label_1; | label_6: 0x004097e2 mov qword [rbx], 0 | *(rbx) = 0; 0x004097e9 lock dec dword [rbp + 0x68] | *((rbp + 0x68))--; 0x004097ed add rbx, 0x10 | rbx += 0x10; 0x004097f1 mov rax, rbx | rax = rbx; 0x004097f4 add rsp, 0x28 | 0x004097f8 pop rbx | 0x004097f9 pop r12 | 0x004097fb pop r13 | 0x004097fd pop r14 | 0x004097ff pop r15 | 0x00409801 pop rbp | 0x00409802 ret | return rax; | label_9: 0x00409803 mov edi, 8 | edi = 8; 0x00409808 call 0x403690 | cxa_allocate_exception (); 0x0040980d mov qword [rax], 0x439bc0 | *(rax) = fcn.00403950; 0x00409814 mov esi, 0x439b98 | 0x00409819 mov edx, 0x403950 | 0x0040981e mov rdi, rax | 0x00409821 call 0x403740 | return cxa_throw (rax, obj.typeinfo_for_std::__1::bad_function_call, fcn.00403950); | }