; assembly | /* r2dec pseudo code output */ | /* balber_berdecoder.t/none @ 0x4564f0 */ | #include | | uint16_t rotate_left16 (uint16_t value, uint32_t count) { | const uint16_t mask = (CHAR_BIT * sizeof (value)) - 1; | count &= mask; | return (value << count) | (value >> (-count & mask)); | } | ; (fcn) method.BloombergLP::balber::BerUtil_TimeImpUtil.putCompactBinaryTimeTzValue_std::__1::basic_streambuf_char__std::__1::char_traits_char_____BloombergLP::bdlt::TimeTz_const__BloombergLP::balber::BerEncoderOptions_const_ () | int64_t method_BloombergLP::balber::BerUtil_TimeImpUtil_putCompactBinaryTimeTzValue_std::_1::basic_streambuf_char_std::_1::char_traits_char_BloombergLP::bdlt::TimeTz_const_BloombergLP::balber::BerEncoderOptions_const_ (int64_t arg2, int64_t arg1) { | signed int64_t var_8h; | int64_t var_10h; | rsi = arg2; | rdi = arg1; | /* BloombergLP::balber::BerUtil_TimeImpUtil::putCompactBinaryTimeTzValue(std::__1::basic_streambuf >*, BloombergLP::bdlt::TimeTz const&, BloombergLP::balber::BerEncoderOptions const*) */ 0x004564f0 push rbp | 0x004564f1 push r15 | 0x004564f3 push r14 | 0x004564f5 push r13 | 0x004564f7 push r12 | 0x004564f9 push rbx | 0x004564fa sub rsp, 0x18 | 0x004564fe mov rbp, rsi | 0x00456501 mov r13, rdi | r13 = rdi; 0x00456504 movabs r14, 0xffffffbfffffffff | r14 = 0xffffffbfffffffff; 0x0045650e movabs rbx, 0x4000000000 | rbx = 0x4000000000; 0x00456518 mov rcx, qword [rsi] | rcx = *(rsi); 0x0045651b mov qword [rsp + 0x10], rcx | *((rsp + 0x10)) = rcx; 0x00456520 cmp rcx, rbx | | if (rcx < rbx) { 0x00456523 jl 0x456816 | goto label_4; | } 0x00456529 and rcx, r14 | rcx &= r14; | label_2: 0x0045652c mov rax, rcx | rax = rcx; 0x0045652f or rax, rbx | rax |= rbx; 0x00456532 mov qword [rsp + 0x10], rax | *((rsp + 0x10)) = rax; 0x00456537 mov r15d, dword [rbp + 8] | r15d = *((rbp + 8)); 0x0045653b test r15d, r15d | | if (r15d != 0) { 0x0045653e je 0x4565d7 | 0x00456544 mov dword [rsp], 0 | *(rsp) = 0; 0x0045654b mov qword [rsp + 8], 0 | *((rsp + 8)) = 0; 0x00456554 cmp rax, rbx | | if (rax < rbx) { 0x00456557 jl 0x456828 | goto label_5; | } 0x0045655d and rcx, r14 | rcx &= r14; | label_3: 0x00456560 movabs rdx, 0x32e73fb956a1b897 | rdx = 0x32e73fb956a1b897; 0x0045656a mov rax, rcx | rax = rcx; 0x0045656d imul rdx | rdx:rax = rax * rdx; 0x00456570 mov rax, rdx | rax = rdx; 0x00456573 shr rax, 0x3f | rax >>= 0x3f; 0x00456577 sar rdx, 0x22 | rdx >>= 0x22; 0x0045657b add rdx, rax | rdx += rax; 0x0045657e movabs rax, 0x141dd76000 | rax = 0x141dd76000; 0x00456588 imul rax, rdx | rax *= rdx; 0x0045658c sub rcx, rax | rcx -= rax; 0x0045658f mov rdi, rsp | 0x00456592 xor esi, esi | 0x00456594 mov rdx, rcx | 0x00456597 call 0x4641b0 | BloombergLP::bdlt::DatetimeInterval::assign(long long,long long) (rsp, 0, rcx); 0x0045659c imul ecx, dword [rsp], 0x5265c00 | ecx = *(rsp) * 0x5265c00; 0x004565a3 movabs rax, 0x20c49ba5e353f7cf | rax = 0x20c49ba5e353f7cf; 0x004565ad imul qword [rsp + 8] | rdx:rax = rax * *((rsp + 8)); 0x004565b2 mov rbp, rdx | 0x004565b5 mov rax, rdx | rax = rdx; 0x004565b8 shr rax, 0x3f | rax >>= 0x3f; 0x004565bc shr rbp, 7 | rbp >>= 7; 0x004565c0 add ebp, eax | ebp += eax; 0x004565c2 add ebp, ecx | ebp += ecx; | if (ebp != 0) { 0x004565c4 je 0x4565eb | 0x004565c6 mov eax, ebp | eax = ebp; 0x004565c8 test ebp, ebp | | if (ebp <= 0) { 0x004565ca jle 0x4565f3 | goto label_6; | } 0x004565cc or eax, 1 | eax |= 1; 0x004565cf bsr eax, eax | __asm ("bsr eax, eax"); 0x004565d2 xor eax, 0x1f | eax ^= 0x1f; 0x004565d5 jmp 0x456608 | | } else { 0x004565d7 lea rsi, [rsp + 0x10] | 0x004565dc mov rdi, r13 | 0x004565df call 0x455e60 | eax = BloombergLP::balber::BerUtil_TimeImpUtil::putCompactBinaryTimeValue(std::_1::basic_streambuf>*,BloombergLP::bdlt::Timeconst&,BloombergLP::balber::BerEncoderOptionsconst*) (r13, rsp + 0x10); 0x004565e4 mov ebx, eax | ebx = eax; 0x004565e6 jmp 0x456805 | goto label_7; | } 0x004565eb mov r12d, 1 | r12d = 1; 0x004565f1 jmp 0x456627 | goto label_8; | label_6: 0x004565f3 not eax | eax = ~eax; 0x004565f5 or eax, 1 | eax |= 1; 0x004565f8 bsr ecx, eax | __asm ("bsr ecx, eax"); 0x004565fb xor ecx, 0x1f | ecx ^= 0x1f; 0x004565fe xor eax, eax | eax = 0; 0x00456600 cmp ebp, 0xffffffff | 0x00456603 sete al | al = (ebp == 0xffffffff) ? 1 : 0; 0x00456606 add eax, ecx | eax += ecx; | } 0x00456608 mov ecx, 0x28 | ecx = 0x28; 0x0045660d sub ecx, eax | ecx -= eax; 0x0045660f mov r12d, 0x2f | r12d = 0x2f; 0x00456615 sub r12d, eax | r12d -= eax; 0x00456618 test ecx, ecx | 0x0045661a cmovns r12d, ecx | __asm ("cmovns r12d, ecx"); 0x0045661e sar r12d, 3 | r12d >>= 3; 0x00456622 cmp eax, 0x11 | | if (eax >= 0x11) { 0x00456625 jl 0x456645 | | label_8: 0x00456627 mov rax, qword [r13 + 0x30] | rax = *((r13 + 0x30)); 0x0045662b cmp rax, qword [r13 + 0x38] | | if (rax == *((r13 + 0x38))) { 0x0045662f je 0x4566e3 | goto label_9; | } 0x00456635 lea rcx, [rax + 1] | rcx = rax + 1; 0x00456639 mov qword [r13 + 0x30], rcx | *((r13 + 0x30)) = rcx; 0x0045663d mov byte [rax], 5 | *(rax) = 5; 0x00456640 jmp 0x456700 | goto label_10; | } 0x00456645 lea esi, [r12 + 2] | 0x0045664a mov rdi, r13 | 0x0045664d call 0x453da0 | eax = BloombergLP::balber::BerUtil_LengthImpUtil::putLength(std::_1::basic_streambuf>*,int) (r13, r12 + 2); 0x00456652 mov ebx, 0xffffffff | ebx = 0xffffffff; 0x00456657 test eax, eax | | if (eax != 0) { 0x00456659 jne 0x456805 | goto label_7; | } 0x0045665f rol r15w, 8 | r15w = rotate_left16 (r15w, 8); 0x00456664 mov word [rsp], r15w | 0x00456669 mov rax, qword [r13] | rax = *(r13); 0x0045666d mov rsi, rsp | rsi = rsp; 0x00456670 mov edx, 2 | edx = 2; 0x00456675 mov rdi, r13 | rdi = r13; 0x00456678 call qword [rax + 0x60] | rax = uint64_t (*rax + 0x60)(void) (r15w); 0x0045667b cmp rax, 2 | | if (rax != 2) { 0x0045667f jne 0x456805 | goto label_7; | } 0x00456685 mov dword [rsp], ebp | *(rsp) = ebp; 0x00456688 mov ebx, 0xffffffff | ebx = 0xffffffff; 0x0045668d cmp r12d, 4 | | if (r12d > 4) { 0x00456691 ja 0x456805 | goto label_7; | } 0x00456697 mov ebp, r12d | 0x0045669a jmp 0x4566b9 | | while (rcx != *((r13 + 0x38))) { 0x004566a0 lea rdx, [rcx + 1] | rdx = rcx + 1; 0x004566a4 mov qword [r13 + 0x30], rdx | *((r13 + 0x30)) = rdx; 0x004566a8 mov byte [rcx], al | *(rcx) = al; | label_0: 0x004566aa dec rbp | rbp--; 0x004566ad lea eax, [rbp + 1] | eax = rbp + 1; 0x004566b0 cmp eax, 1 | | if (eax <= 1) { 0x004566b3 jle 0x456803 | goto label_11; | } 0x004566b9 movzx eax, byte [rsp + rbp - 1] | eax = *((rsp + rbp - 1)); 0x004566be mov rcx, qword [r13 + 0x30] | rcx = *((r13 + 0x30)); 0x004566c2 cmp rcx, qword [r13 + 0x38] | 0x004566c6 jne 0x4566a0 | | } 0x004566c8 movzx r15d, al | r15d = (int32_t) al; 0x004566cc mov rax, qword [r13] | rax = *(r13); 0x004566d0 mov rdi, r13 | rdi = r13; 0x004566d3 mov esi, r15d | esi = r15d; 0x004566d6 call qword [rax + 0x68] | eax = uint64_t (*rax + 0x68)() (); 0x004566d9 cmp eax, r15d | | if (eax == r15d) { 0x004566dc je 0x4566aa | goto label_0; | } 0x004566de jmp 0x456805 | goto label_7; | label_9: 0x004566e3 mov rax, qword [r13] | rax = *(r13); 0x004566e7 mov rdi, r13 | rdi = r13; 0x004566ea mov esi, 5 | esi = 5; 0x004566ef call qword [rax + 0x68] | eax = uint64_t (*rax + 0x68)() (); 0x004566f2 mov ebx, 0xffffffff | ebx = 0xffffffff; 0x004566f7 cmp eax, 5 | | if (eax != 5) { 0x004566fa jne 0x456805 | goto label_7; | } | label_10: 0x00456700 rol r15w, 8 | r15w = rotate_left16 (r15w, 8); 0x00456705 mov word [rsp], r15w | 0x0045670a mov rax, qword [r13] | rax = *(r13); 0x0045670e mov rsi, rsp | rsi = rsp; 0x00456711 mov edx, 2 | edx = 2; 0x00456716 mov rdi, r13 | rdi = r13; 0x00456719 call qword [rax + 0x60] | rax = uint64_t (*rax + 0x60)(void) (r15w); 0x0045671c mov ebx, 0xffffffff | ebx = 0xffffffff; 0x00456721 cmp rax, 2 | | if (rax != 2) { 0x00456725 jne 0x456805 | goto label_7; | } 0x0045672b mov r14d, 3 | r14d = 3; 0x00456731 sub r14d, r12d | r14d -= r12d; 0x00456734 mov edx, r14d | 0x00456737 mov rdi, rsp | 0x0045673a xor esi, esi | 0x0045673c call 0x4041f0 | memset (rsp, 0, r14d); 0x00456741 mov eax, 0x12 | eax = 0x12; 0x00456746 sub eax, r12d | eax -= r12d; 0x00456749 cmp eax, 0x1f | | if (eax < 0x1f) { 0x0045674c jb 0x456780 | goto label_12; | } 0x0045674e mov ebx, r14d | ebx = r14d; 0x00456751 shr ebx, 4 | ebx >>= 4; 0x00456754 mov r15, rsp | r15 = rsp; 0x00456757 nop word [rax + rax] | | do { 0x00456760 mov rax, qword [r13] | rax = *(r13); 0x00456764 mov edx, 0x10 | edx = 0x10; 0x00456769 mov rdi, r13 | rdi = r13; 0x0045676c mov rsi, r15 | rsi = r15; 0x0045676f call qword [rax + 0x60] | rax = uint64_t (*rax + 0x60)() (); 0x00456772 cmp rax, 0x10 | | if (rax != 0x10) { 0x00456776 jne 0x4567fc | goto label_13; | } 0x0045677c dec ebx | ebx--; 0x0045677e jne 0x456760 | | } while (ebx != 0); | label_12: 0x00456780 and r14d, 0xf | r14d &= 0xf; 0x00456784 mov r15d, r14d | r15d = r14d; 0x00456787 mov rax, qword [r13] | rax = *(r13); 0x0045678b mov rsi, rsp | rsi = rsp; 0x0045678e mov rdi, r13 | rdi = r13; 0x00456791 mov rdx, r15 | rdx = r15; 0x00456794 call qword [rax + 0x60] | rax = uint64_t (*rax + 0x60)() (); 0x00456797 cmp rax, r15 | 0x0045679a mov ebx, 0xffffffff | ebx = 0xffffffff; | if (rax != r15) { 0x0045679f jne 0x456805 | goto label_7; | } 0x004567a1 mov dword [rsp], ebp | *(rsp) = ebp; 0x004567a4 mov ebx, 0xffffffff | ebx = 0xffffffff; 0x004567a9 test r12d, r12d | | if (r12d <= 0) { 0x004567ac jle 0x456805 | goto label_7; | } 0x004567ae cmp r12d, 4 | | if (r12d > 4) { 0x004567b2 ja 0x456805 | goto label_7; | } 0x004567b4 mov ebp, r12d | 0x004567b7 jmp 0x4567d5 | | while (rcx != *((r13 + 0x38))) { 0x004567c0 lea rdx, [rcx + 1] | rdx = rcx + 1; 0x004567c4 mov qword [r13 + 0x30], rdx | *((r13 + 0x30)) = rdx; 0x004567c8 mov byte [rcx], al | *(rcx) = al; | label_1: 0x004567ca dec rbp | rbp--; 0x004567cd lea eax, [rbp + 1] | eax = rbp + 1; 0x004567d0 cmp eax, 1 | | if (eax <= 1) { 0x004567d3 jle 0x456803 | goto label_11; | } 0x004567d5 movzx eax, byte [rsp + rbp - 1] | eax = *((rsp + rbp - 1)); 0x004567da mov rcx, qword [r13 + 0x30] | rcx = *((r13 + 0x30)); 0x004567de cmp rcx, qword [r13 + 0x38] | 0x004567e2 jne 0x4567c0 | | } 0x004567e4 movzx r15d, al | r15d = (int32_t) al; 0x004567e8 mov rax, qword [r13] | rax = *(r13); 0x004567ec mov rdi, r13 | rdi = r13; 0x004567ef mov esi, r15d | esi = r15d; 0x004567f2 call qword [rax + 0x68] | eax = uint64_t (*rax + 0x68)() (); 0x004567f5 cmp eax, r15d | | if (eax == r15d) { 0x004567f8 je 0x4567ca | goto label_1; | } 0x004567fa jmp 0x456805 | goto label_7; | label_13: 0x004567fc mov ebx, 0xffffffff | ebx = 0xffffffff; 0x00456801 jmp 0x456805 | goto label_7; | label_11: 0x00456803 xor ebx, ebx | ebx = 0; | label_7: 0x00456805 mov eax, ebx | eax = ebx; 0x00456807 add rsp, 0x18 | 0x0045680b pop rbx | 0x0045680c pop r12 | 0x0045680e pop r13 | 0x00456810 pop r14 | 0x00456812 pop r15 | 0x00456814 pop rbp | 0x00456815 ret | return rax; | label_4: 0x00456816 lea rdi, [rsp + 0x10] | 0x0045681b call 0x46b280 | rax = BloombergLP::bdlt::Time::invalidMicrosecondsFromMidnight()const (rsp + 0x10); 0x00456820 mov rcx, rax | rcx = rax; 0x00456823 jmp 0x45652c | goto label_2; | label_5: 0x00456828 lea rdi, [rsp + 0x10] | 0x0045682d call 0x46b280 | rax = BloombergLP::bdlt::Time::invalidMicrosecondsFromMidnight()const (rsp + 0x10); 0x00456832 mov rcx, rax | rcx = rax; 0x00456835 jmp 0x456560 | goto label_3; | }