; assembly | /* r2dec pseudo code output */ | /* ball_asyncfileobserver.t/none @ 0x4612e0 */ | #include | ; (fcn) method.BloombergLP::bdlsb::OverflowMemOutStreamBuf.seekoff_long_long__std::__1::ios_base::seekdir__unsigned_int_ () | int64_t method_BloombergLP::bdlsb::OverflowMemOutStreamBuf_seekoff_long_long_std::_1::ios_base::seekdir_unsigned_int_ (int64_t arg3, int64_t arg2, int64_t arg1) { | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* BloombergLP::bdlsb::OverflowMemOutStreamBuf::seekoff(long long, std::__1::ios_base::seekdir, unsigned int) */ 0x004612e0 push r15 | 0x004612e2 push r14 | 0x004612e4 push r12 | 0x004612e6 push rbx | 0x004612e7 push rax | 0x004612e8 mov eax, edx | eax = edx; 0x004612ea mov rdx, 0xffffffffffffffff | rdx = 0xffffffffffffffff; 0x004612f1 test cl, 0x10 | | if ((cl & 0x10) == 0) { 0x004612f4 je 0x46142f | goto label_0; | } 0x004612fa mov r15, rdi | r15 = rdi; 0x004612fd mov r8b, byte [rdi + 0x58] | r8b = *((rdi + 0x58)); 0x00461301 mov r14, qword [rdi + 0x30] | r14 = *((rdi + 0x30)); 0x00461305 mov rcx, qword [rdi + 0x50] | rcx = *((rdi + 0x50)); 0x00461309 mov rdi, r14 | rdi = r14; 0x0046130c sub rdi, qword [r15 + 0x28] | rdi -= *((r15 + 0x28)); 0x00461310 xor r12d, r12d | r12d = 0; 0x00461313 test r8b, r8b | 0x00461316 mov rbx, rcx | rbx = rcx; | if (r8b == 0) { 0x00461319 cmove rbx, r12 | rbx = r12; | } 0x0046131d add rbx, rdi | rbx += rdi; 0x00461320 mov qword [r15 + 0x40], rbx | *((r15 + 0x40)) = rbx; 0x00461324 mov rdi, qword [r15 + 0x68] | rdi = *((r15 + 0x68)); 0x00461328 lea r9, [rdi + rcx] | r9 = rdi + rcx; 0x0046132c test eax, eax | | if (eax != 0) { 0x0046132e je 0x461341 | 0x00461330 cmp eax, 2 | | if (eax == 2) { 0x00461333 je 0x46134b | goto label_1; | } 0x00461335 mov r12, rbx | r12 = rbx; 0x00461338 cmp eax, 1 | | if (eax != 1) { 0x0046133b jne 0x46142f | goto label_0; | } | } 0x00461341 add r12, rsi | r12 += rsi; | if (r12 < 0) { 0x00461344 jns 0x461357 | 0x00461346 jmp 0x46142f | goto label_0; | label_1: 0x0046134b mov r12, r9 | r12 = r9; 0x0046134e add r12, rsi | r12 += rsi; | if (r12 < 0) { 0x00461351 js 0x46142f | goto label_0; | } | } 0x00461357 mov rax, r12 | rax = r12; 0x0046135a sub rax, rcx | rax -= rcx; | if (rax <= 0) { 0x0046135d jbe 0x4613e0 | goto label_2; | } 0x00461363 mov rdx, r12 | rdx = r12; 0x00461366 sub rdx, r9 | rdx -= r9; | if (rdx <= 0) { 0x00461369 jbe 0x4613fe | goto label_3; | } 0x0046136f test rdi, rdi | | if (rdi != 0) { 0x00461372 cmovne rcx, rdi | rcx = rdi; | } 0x00461376 nop word cs:[rax + rax] | | do { 0x00461380 mov rbx, rcx | rbx = rcx; 0x00461383 mov rax, rcx | rax = rcx; 0x00461386 sub rax, rdi | rax -= rdi; 0x00461389 add rcx, rcx | rcx += rcx; 0x0046138c cmp rax, rdx | 0x0046138f jb 0x461380 | | } while (rax < rdx); 0x00461391 mov rdi, qword [r15 + 0x70] | rdi = *((r15 + 0x70)); 0x00461395 mov rax, qword [rdi] | rax = *(rdi); 0x00461398 mov rsi, rbx | rsi = rbx; 0x0046139b call qword [rax + 0x10] | rax = uint64_t (*rax + 0x10)() (); 0x0046139e mov r14, rax | r14 = rax; 0x004613a1 mov rsi, qword [r15 + 0x60] | 0x004613a5 mov rdx, qword [r15 + 0x68] | 0x004613a9 mov rdi, rax | 0x004613ac call 0x407b10 | memcpy (rax, *((r15 + 0x60)), *((r15 + 0x68))); 0x004613b1 mov rsi, qword [r15 + 0x60] | rsi = *((r15 + 0x60)); 0x004613b5 mov rdi, qword [r15 + 0x70] | rdi = *((r15 + 0x70)); 0x004613b9 mov rax, qword [rdi] | rax = *(rdi); 0x004613bc call qword [rax + 0x18] | uint64_t (*rax + 0x18)() (); 0x004613bf mov qword [r15 + 0x60], r14 | *((r15 + 0x60)) = r14; 0x004613c3 mov qword [r15 + 0x68], rbx | *((r15 + 0x68)) = rbx; 0x004613c7 mov byte [r15 + 0x58], 1 | *((r15 + 0x58)) = 1; 0x004613cc add rbx, r14 | rbx += r14; 0x004613cf mov qword [r15 + 0x28], r14 | *((r15 + 0x28)) = r14; 0x004613d3 mov qword [r15 + 0x38], rbx | *((r15 + 0x38)) = rbx; 0x004613d7 mov rax, r12 | rax = r12; 0x004613da sub rax, qword [r15 + 0x50] | rax -= *((r15 + 0x50)); 0x004613de jmp 0x46141f | goto label_4; | label_2: 0x004613e0 test r8b, r8b | | if (r8b != 0) { 0x004613e3 je 0x461403 | 0x004613e5 mov byte [r15 + 0x58], 0 | *((r15 + 0x58)) = 0; 0x004613ea mov r14, qword [r15 + 0x48] | r14 = *((r15 + 0x48)); 0x004613ee add rcx, r14 | rcx += r14; 0x004613f1 mov qword [r15 + 0x28], r14 | *((r15 + 0x28)) = r14; 0x004613f5 mov qword [r15 + 0x38], rcx | *((r15 + 0x38)) = rcx; 0x004613f9 mov rax, r12 | rax = r12; 0x004613fc jmp 0x46141f | goto label_4; | label_3: 0x004613fe test r8b, r8b | | if (r8b == 0) { 0x00461401 je 0x46140b | goto label_5; | } | } 0x00461403 mov rax, r12 | rax = r12; 0x00461406 sub rax, rbx | rax -= rbx; 0x00461409 jmp 0x46141f | goto label_4; | label_5: 0x0046140b mov byte [r15 + 0x58], 1 | *((r15 + 0x58)) = 1; 0x00461410 mov r14, qword [r15 + 0x60] | r14 = *((r15 + 0x60)); 0x00461414 add rdi, r14 | rdi += r14; 0x00461417 mov qword [r15 + 0x28], r14 | *((r15 + 0x28)) = r14; 0x0046141b mov qword [r15 + 0x38], rdi | *((r15 + 0x38)) = rdi; | label_4: 0x0046141f cdqe | rax = (int64_t) eax; 0x00461421 add rax, r14 | rax += r14; 0x00461424 mov qword [r15 + 0x30], rax | *((r15 + 0x30)) = rax; 0x00461428 mov qword [r15 + 0x40], r12 | *((r15 + 0x40)) = r12; 0x0046142c mov rdx, r12 | rdx = r12; | label_0: 0x0046142f xor eax, eax | eax = 0; 0x00461431 add rsp, 8 | 0x00461435 pop rbx | 0x00461436 pop r12 | 0x00461438 pop r14 | 0x0046143a pop r15 | 0x0046143c ret | return rax; | }