; assembly | /* r2dec pseudo code output */ | /* bslmt_fastpostsemaphore.t/assume @ 0x407850 */ | #include | ; (fcn) method.int_BloombergLP::bslmt::ChronoUtil::timedWait_BloombergLP::bslmt::FastPostSemaphore__AnotherClock__std::__1::chrono::duration_long_long__std::__1.ratio_1l__1000000000l______BloombergLP::bslmt::FastPostSemaphore__std::__1::chrono::time_point_Anoth () | uint64_t method_int_BloombergLP::bslmt::ChronoUtil::timedWait_BloombergLP::bslmt::FastPostSemaphore_AnotherClock_std::_1::chrono::duration_long_long_std::_1_ratio_1l_1000000000l_BloombergLP::bslmt::FastPostSemaphore_std::_1::chrono::time_point_Anoth (int32_t arg2, int64_t arg1) { | int64_t var_8h; | int64_t var_10h; | rsi = arg2; | rdi = arg1; | /* int BloombergLP::bslmt::ChronoUtil::timedWait > >(BloombergLP::bslmt::FastPostSemaphore*, std::__1::chrono::time_point > > const&) */ 0x00407850 push rbp | 0x00407851 push r15 | 0x00407853 push r14 | 0x00407855 push r13 | 0x00407857 push r12 | 0x00407859 push rbx | 0x0040785a sub rsp, 0x28 | 0x0040785e mov r13, rsi | r13 = rsi; 0x00407861 mov rbx, rdi | rbx = rdi; 0x00407864 call 0x4028a0 | rax = std::_1::chrono::steady_clock::now() (); 0x00407869 mov rbp, rax | 0x0040786c add rbp, 0xffffffffffffd8f0 | rbp += 0xffffffffffffd8f0; 0x00407873 mov r14d, 0xfffffffe | r14d = 0xfffffffe; 0x00407879 cmp rbp, qword [r13] | | if (rbp >= *(r13)) { 0x0040787d jge 0x4079bb | goto label_0; | } 0x00407883 movabs r14, 0x112e0be826d694b3 | r14 = 0x112e0be826d694b3; 0x0040788d mov r15, rsp | r15 = rsp; 0x00407890 lea r12, [rsp + 0x10] | r12 = rsp + 0x10; 0x00407895 nop word cs:[rax + rax] | 0x0040789f nop | | do { 0x004078a0 cmp dword [rbx + 0x60], 1 | | if (*((rbx + 0x60)) == 1) { 0x004078a4 jne 0x4078b0 | 0x004078a6 call 0x422180 | BloombergLP::bsls::SystemTime::nowMonotonicClock() (); 0x004078ab jmp 0x4078b5 | | } else { 0x004078b0 call 0x422210 | rax = BloombergLP::bsls::SystemTime::nowRealtimeClock() (); | } 0x004078b5 mov qword [rsp], rax | *(rsp) = rax; 0x004078b9 mov dword [rsp + 8], edx | *((rsp + 8)) = edx; 0x004078bd mov rcx, qword [r13] | rcx = *(r13); 0x004078c1 sub rcx, rbp | rcx -= rbp; 0x004078c4 mov rax, rcx | rax = rcx; 0x004078c7 imul r14 | rdx:rax = rax * r14; 0x004078ca mov rax, rdx | rax = rdx; 0x004078cd shr rax, 0x3f | rax >>= 0x3f; 0x004078d1 sar rdx, 0x1a | rdx >>= 0x1a; 0x004078d5 add rdx, rax | rdx += rax; 0x004078d8 imul eax, edx, 0xc4653600 | eax = edx * 0xc4653600; 0x004078de add ecx, eax | ecx += eax; 0x004078e0 mov rdi, r15 | 0x004078e3 mov rsi, rdx | 0x004078e6 mov edx, ecx | 0x004078e8 call 0x422330 | rax = BloombergLP::bsls::TimeInterval::addInterval(long long,int) (r15, rdx, ecx); 0x004078ed movups xmm0, xmmword [rax] | __asm ("movups xmm0, xmmword [rax]"); 0x004078f0 movaps xmmword [rsp + 0x10], xmm0 | *((rsp + 0x10)) = xmm0; 0x004078f5 mov rax, 0xfffffffff0000000 | rax = 0xfffffffff0000000; 0x004078fc lock xadd qword [rbx], rax | __asm ("lock xadd qword [rbx], rax"); 0x00407901 test eax, 0x1000000 | | if ((eax & 0x1000000) != 0) { 0x00407906 jne 0x407959 | goto label_1; | } 0x00407908 lea rdx, [rax - 0x10000000] | rdx = rax - 0x10000000; 0x0040790f mov rcx, rdx | rcx = rdx; 0x00407912 sar rcx, 0x1c | rcx >>= 0x1c; 0x00407916 and eax, 0xffffff | eax &= 0xffffff; 0x0040791b cmp rcx, rax | | if (rcx >= rax) { 0x0040791e jge 0x4079b3 | goto label_2; | } 0x00407924 mov rdi, rbx | 0x00407927 mov rsi, r12 | 0x0040792a call 0x406df0 | eax = BloombergLP::bslmt::FastPostSemaphoreImpl::timedWaitSlowPath(BloombergLP::bsls::TimeIntervalconst&,long long) (rbx, r12, rdx); 0x0040792f cmp eax, 0xfffffffe | | if (eax != 0xfffffffe) { 0x00407932 jne 0x4079b8 | goto label_3; | } 0x00407938 call 0x4028a0 | rax = std::_1::chrono::steady_clock::now() (); 0x0040793d mov rbp, rax | 0x00407940 add rbp, 0xffffffffffffd8f0 | rbp += 0xffffffffffffd8f0; 0x00407947 cmp rbp, qword [r13] | 0x0040794b jl 0x4078a0 | | } while (rbp < *(r13)); 0x00407951 mov r14d, 0xfffffffe | r14d = 0xfffffffe; 0x00407957 jmp 0x4079bb | goto label_0; | label_1: 0x00407959 mov eax, 0x10000000 | eax = 0x10000000; 0x0040795e lock xadd qword [rbx], rax | __asm ("lock xadd qword [rbx], rax"); 0x00407963 mov r14d, 0xffffffff | r14d = 0xffffffff; 0x00407969 test eax, 0xffffff | | if ((eax & 0xffffff) != 0) { 0x0040796e je 0x4079bb | 0x00407970 mov ecx, eax | ecx = eax; 0x00407972 and ecx, 0x1000000 | ecx &= 0x1000000; 0x00407978 test rcx, rcx | | if (rcx != 0) { 0x0040797b jne 0x4079bb | goto label_0; | } 0x0040797d add rax, 0x10000000 | rax += 0x10000000; 0x00407983 and rax, 0xfffffffff0000000 | rax &= 0xfffffffff0000000; 0x00407989 cmp rax, 0x10000000 | | if (rax != 0x10000000) { 0x0040798f jne 0x4079bb | goto label_0; | } 0x00407991 lea rbp, [rbx + 8] | rbp = rbx + 8; 0x00407995 mov rdi, rbp | rdi = rbp; 0x00407998 call 0x402970 | pthread_mutex_lock (); 0x0040799d mov rdi, rbp | rdi = rbp; 0x004079a0 call 0x4029e0 | pthread_mutex_unlock (); 0x004079a5 add rbx, 0x30 | rbx += 0x30; 0x004079a9 mov rdi, rbx | rdi = rbx; 0x004079ac call 0x4026b0 | eax = pthread_cond_signal (); 0x004079b1 jmp 0x4079bb | goto label_0; | label_2: 0x004079b3 xor r14d, r14d | r14d = 0; 0x004079b6 jmp 0x4079bb | goto label_0; | label_3: 0x004079b8 mov r14d, eax | r14d = eax; | } | label_0: 0x004079bb mov eax, r14d | 0x004079be add rsp, 0x28 | 0x004079c2 pop rbx | 0x004079c3 pop r12 | 0x004079c5 pop r13 | 0x004079c7 pop r14 | 0x004079c9 pop r15 | 0x004079cb pop rbp | 0x004079cc ret | return rax; | }