; assembly | /* r2dec pseudo code output */ | /* ball_logthrottle.t/none @ 0x447cf0 */ | #include | ; (fcn) method.BloombergLP::bdlmt::Throttle.requestPermissionIfValid_bool__int__BloombergLP::bsls::TimeInterval_const_ () | int64_t method_BloombergLP::bdlmt::Throttle_requestPermissionIfValid_bool_int_BloombergLP::bsls::TimeInterval_const_ (int64_t arg6, int64_t arg4, signed int64_t arg3, int64_t arg2, uint32_t arg1) { | r9 = arg6; | rcx = arg4; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* BloombergLP::bdlmt::Throttle::requestPermissionIfValid(bool*, int, BloombergLP::bsls::TimeInterval const&) */ 0x00447cf0 push rbp | 0x00447cf1 push r14 | 0x00447cf3 push rbx | 0x00447cf4 mov r8d, 0xffffffff | r8d = 0xffffffff; 0x00447cfa test edx, edx | | if (edx <= 0) { 0x00447cfc jle 0x447dd6 | goto label_0; | } 0x00447d02 mov r14d, dword [rdi + 0x18] | r14d = *((rdi + 0x18)); 0x00447d06 cmp r14d, edx | | if (r14d < edx) { 0x00447d09 jge 0x447d14 | 0x00447d0b test r14d, r14d | | if (r14d != 0) { 0x00447d0e jne 0x447dd6 | goto label_0; | } | } 0x00447d14 mov rbx, qword [rcx] | rbx = *(rcx); 0x00447d17 movabs rax, 0x225c17d04 | rax = 0x225c17d04; 0x00447d21 add rax, rbx | rax += rbx; 0x00447d24 movabs rbp, 0x44b82fa08 | 0x00447d2e cmp rax, rbp | | if (rax > rbp) { 0x00447d31 ja 0x447dd6 | goto label_0; | } 0x00447d37 movabs r10, 0x8000000000000000 | r10 = 0x8000000000000000; 0x00447d41 imul r9, rbx, 0x3b9aca00 | r9 = rbx * 0x3b9aca00; 0x00447d48 test rbx, rbx | | if (rbx >= 0) { 0x00447d4b js 0x447d61 | 0x00447d4d mov rax, r9 | rax = r9; 0x00447d50 not rax | rax = ~rax; 0x00447d53 add rax, r10 | rax += r10; 0x00447d56 movsxd r11, dword [rcx + 8] | r11 = *((rcx + 8)); 0x00447d5a cmp rax, r11 | | if (rax >= r11) { 0x00447d5d jge 0x447d70 | goto label_1; | } 0x00447d5f jmp 0x447dd6 | goto label_0; | } 0x00447d61 mov rax, r10 | rax = r10; 0x00447d64 sub rax, r9 | rax -= r9; 0x00447d67 movsxd r11, dword [rcx + 8] | r11 = *((rcx + 8)); 0x00447d6b cmp rax, r11 | | if (rax > r11) { 0x00447d6e jg 0x447dd6 | goto label_0; | } | label_1: 0x00447d70 xor r8d, r8d | r8d = 0; 0x00447d73 mov ebx, 0 | ebx = 0; 0x00447d78 cmp r14d, edx | | if (r14d < edx) { 0x00447d7b jl 0x447dd4 | goto label_2; | } 0x00447d7d mov rcx, qword [rdi + 8] | rcx = *((rdi + 8)); 0x00447d81 mov bl, 1 | bl = 1; 0x00447d83 cmp rcx, r10 | | if (rcx == r10) { 0x00447d86 je 0x447dd4 | goto label_2; | } 0x00447d88 movsxd rax, r11d | rax = (int64_t) r11d; 0x00447d8b add r9, rax | r9 += rax; 0x00447d8e mov eax, edx | eax = edx; 0x00447d90 imul rcx, rax | rcx *= rax; 0x00447d94 mov r10, rcx | r10 = rcx; 0x00447d97 sub r10, qword [rdi + 0x10] | r10 -= *((rdi + 0x10)); 0x00447d9b mov rax, qword [rdi] | rax = *(rdi); 0x00447d9e add r10, r9 | r10 += r9; 0x00447da1 nop word cs:[rax + rax] | 0x00447dab nop dword [rax + rax] | | do { 0x00447db0 mov rdx, r9 | rdx = r9; 0x00447db3 sub rdx, rax | rdx -= rax; 0x00447db6 cmp rdx, rcx | | if (rdx < rcx) { 0x00447db9 jl 0x447dce | goto label_3; | } 0x00447dbb lea rbp, [rax + rcx] | rbp = rax + rcx; 0x00447dbf cmp qword [rdi + 0x10], rdx | | if (*((rdi + 0x10)) <= rdx) { 0x00447dc3 cmovle rbp, r10 | | } 0x00447dc7 lock cmpxchg qword [rdi], rbp | __asm ("lock cmpxchg qword [rdi], rbp"); 0x00447dcc jne 0x447db0 | | } while (*((rdi + 0x10)) != rdx); | label_3: 0x00447dce cmp rdx, rcx | 0x00447dd1 setge bl | bl = (rdx >= rcx) ? 1 : 0; | label_2: 0x00447dd4 mov byte [rsi], bl | *(rsi) = bl; | label_0: 0x00447dd6 mov eax, r8d | eax = r8d; 0x00447dd9 pop rbx | 0x00447dda pop r14 | r14 = rbx; 0x00447ddc pop rbp | 0x00447ddd ret | return rax; | }