; assembly | /* r2dec pseudo code output */ | /* balber_berdecoder.t/none @ 0x4685e0 */ | #include | ; (fcn) method.BloombergLP::bdlt::Iso8601Util.parse_BloombergLP::bsls::TimeInterval__char_const__int_ () | uint64_t method_BloombergLP::bdlt::Iso8601Util_parse_BloombergLP::bsls::TimeInterval_char_const_int_ (signed int64_t arg3, uint32_t arg2, int64_t arg1) { | int64_t var_8h; | signed int64_t var_10h; | signed int64_t var_18h; | signed int64_t var_20h; | signed int64_t var_28h; | int64_t var_30h; | int64_t var_38h; | int64_t var_40h; | int64_t var_48h; | int64_t var_50h; | int64_t var_58h; | int64_t var_60h; | int64_t var_68h; | int64_t var_70h; | int64_t var_78h; | int64_t var_80h; | int64_t var_88h; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* BloombergLP::bdlt::Iso8601Util::parse(BloombergLP::bsls::TimeInterval*, char const*, int) */ 0x004685e0 push rbp | 0x004685e1 push r15 | 0x004685e3 push r14 | 0x004685e5 push r13 | 0x004685e7 push r12 | 0x004685e9 push rbx | 0x004685ea sub rsp, 0x98 | 0x004685f1 mov qword [rsp + 0x28], 0 | *((rsp + 0x28)) = 0; 0x004685fa mov qword [rsp + 0x20], 0 | *((rsp + 0x20)) = 0; 0x00468603 mov qword [rsp + 0x18], 0 | *((rsp + 0x18)) = 0; 0x0046860c mov qword [rsp + 0x10], 0 | *((rsp + 0x10)) = 0; 0x00468615 mov qword [rsp + 8], 0 | *((rsp + 8)) = 0; 0x0046861e mov eax, 0xffffffff | eax = 0xffffffff; 0x00468623 cmp edx, 3 | | if (edx < 3) { 0x00468626 jl 0x46889a | goto label_2; | } 0x0046862c mov rbx, rsi | rbx = rsi; 0x0046862f cmp byte [rsi], 0x50 | | if (*(rsi) != 0x50) { 0x00468632 jne 0x46889a | goto label_2; | } 0x00468638 mov qword [rsp + 0x30], rdi | *((rsp + 0x30)) = rdi; 0x0046863d mov r12d, edx | r12d = edx; 0x00468640 add r12, rbx | r12 += rbx; 0x00468643 inc rbx | rbx++; 0x00468646 mov byte [rsp + 0x40], 0x57 | *((rsp + 0x40)) = 0x57; 0x0046864b lea rax, [rsp + 0x28] | rax = rsp + 0x28; 0x00468650 mov qword [rsp + 0x48], rax | *((rsp + 0x48)) = rax; 0x00468655 mov byte [rsp + 0x50], 0x44 | *((rsp + 0x50)) = 0x44; 0x0046865a lea rax, [rsp + 0x20] | rax = rsp + 0x20; 0x0046865f mov qword [rsp + 0x58], rax | *((rsp + 0x58)) = rax; 0x00468664 mov byte [rsp + 0x60], 0x48 | *((rsp + 0x60)) = 0x48; 0x00468669 lea rax, [rsp + 0x18] | rax = rsp + 0x18; 0x0046866e mov qword [rsp + 0x68], rax | *((rsp + 0x68)) = rax; 0x00468673 mov byte [rsp + 0x70], 0x4d | *((rsp + 0x70)) = 0x4d; 0x00468678 lea rax, [rsp + 0x10] | rax = rsp + 0x10; 0x0046867d mov qword [rsp + 0x78], rax | *((rsp + 0x78)) = rax; 0x00468682 mov byte [rsp + 0x80], 0x53 | *((rsp + 0x80)) = 0x53; 0x0046868a lea rax, [rsp + 8] | rax = rsp + 8; 0x0046868f mov qword [rsp + 0x88], rax | *((rsp + 0x88)) = rax; 0x00468697 mov r15, 0xffffffffffffffff | r15 = 0xffffffffffffffff; 0x0046869e xor ebp, ebp | ebp = 0; 0x004686a0 movabs r13, 0x6666666666666667 | r13 = 0x6666666666666667; 0x004686aa xor r14d, r14d | r14d = 0; 0x004686ad xor edx, edx | edx = 0; 0x004686af xor eax, eax | eax = 0; 0x004686b1 mov qword [rsp], rax | *(rsp) = rax; 0x004686b5 jmp 0x4686d6 | goto label_3; | label_0: 0x004686c0 cmp rbx, r12 | | if (rbx == r12) { 0x004686c3 je 0x4688ac | goto label_4; | } | label_1: 0x004686c9 inc r14d | r14d++; 0x004686cc cmp r14d, 5 | | if (r14d == 5) { 0x004686d0 je 0x468895 | goto label_5; | } | label_3: 0x004686d6 test dl, 1 | | if ((dl & 1) != 0) { 0x004686d9 je 0x4686e5 | 0x004686db cmp r15, 0xffffffffffffffff | | if (r15 == -1) { 0x004686df je 0x468895 | goto label_5; | } | } 0x004686e5 cmp byte [rbx], 0x54 | | if (*(rbx) == 0x54) { 0x004686e8 jne 0x468710 | 0x004686ea test byte [rsp], 1 | | if ((*(rsp) & 1) != 0) { 0x004686ee jne 0x468895 | goto label_5; | } 0x004686f4 inc rbx | rbx++; 0x004686f7 cmp r14d, 2 | 0x004686fb mov eax, 2 | eax = 2; | if (r14d <= 2) { 0x00468700 cmovle r14d, eax | r14d = eax; | } 0x00468704 mov al, 1 | al = 1; 0x00468706 mov qword [rsp], rax | *(rsp) = rax; 0x0046870a jmp 0x468726 | | } else { 0x00468710 cmp r14d, 2 | | if (r14d != 2) { 0x00468714 jne 0x468726 | goto label_6; | } 0x00468716 mov r14d, 2 | r14d = 2; 0x0046871c test byte [rsp], 1 | | if ((*(rsp) & 1) == 0) { 0x00468720 je 0x468895 | goto label_5; | } | } | label_6: 0x00468726 cmp r15, 0xffffffffffffffff | | if (r15 != -1) { 0x0046872a jne 0x468780 | goto label_7; | } 0x0046872c cmp rbx, r12 | | if (rbx >= r12) { 0x0046872f jae 0x468895 | goto label_5; | } 0x00468735 mov qword [rsp + 0x38], rdx | *((rsp + 0x38)) = rdx; 0x0046873a call 0x4044f0 | rax = ctype_b_loc (); 0x0046873f mov rcx, qword [rax] | rcx = *(rax); 0x00468742 mov rax, rbx | rax = rbx; 0x00468745 xor r15d, r15d | r15d = 0; 0x00468748 nop dword [rax + rax] | | do { 0x00468750 movsx rdx, byte [rax] | rdx = *(rax); 0x00468754 test byte [rcx + rdx*2 + 1], 8 | | if ((*((rcx + rdx*2 + 1)) & 8) == 0) { 0x00468759 je 0x46876f | goto label_8; | } 0x0046875b lea rsi, [r15 + r15*4] | rsi = r15 * 5; 0x0046875f lea r15, [rdx + rsi*2 - 0x30] | r15 = rdx + rsi*2 - 0x30; 0x00468764 inc rax | rax++; 0x00468767 cmp r12, rax | 0x0046876a jne 0x468750 | | } while (r12 != rax); 0x0046876c mov rax, r12 | rax = r12; | label_8: 0x0046876f cmp rax, rbx | 0x00468772 mov rbx, rax | rbx = rax; 0x00468775 mov rdx, qword [rsp + 0x38] | rdx = *((rsp + 0x38)); | if (rax == rbx) { 0x0046877a je 0x468895 | goto label_5; | } | label_7: 0x00468780 mov al, byte [rbx] | al = *(rbx); 0x00468782 mov ecx, eax | ecx = eax; 0x00468784 or cl, 2 | cl |= 2; 0x00468787 cmp cl, 0x2e | | if (cl != 0x2e) { 0x0046878a jne 0x46885d | goto label_9; | } 0x00468790 lea rax, [rbx + 1] | rax = rbx + 1; 0x00468794 cmp rax, r12 | | if (rax == r12) { 0x00468797 je 0x468895 | goto label_5; | } 0x0046879d movsx rbp, byte [rax] | rbp = *(rax); 0x004687a1 call 0x4044f0 | rax = ctype_b_loc (); 0x004687a6 mov rsi, qword [rax] | rsi = *(rax); 0x004687a9 test byte [rsi + rbp*2 + 1], 8 | | if ((*((rsi + rbp*2 + 1)) & 8) == 0) { 0x004687ae je 0x468895 | goto label_5; | } 0x004687b4 lea rdi, [rbx + 0xb] | rdi = rbx + 0xb; 0x004687b8 cmp rdi, r12 | | if (rdi >= r12) { 0x004687bb cmovae rdi, r12 | rdi = r12; | } 0x004687bf add rbx, 2 | rbx += 2; 0x004687c3 cmp rdi, rbx | | if (rdi <= rbx) { 0x004687c6 cmovbe rdi, rbx | rdi = rbx; | } 0x004687ca mov rax, rbx | rax = rbx; 0x004687cd xor ecx, ecx | ecx = 0; 0x004687cf movabs rdx, 0x2540be400 | rdx = 0x2540be400; 0x004687d9 nop dword [rax] | | do { 0x004687e0 mov rbx, rax | rbx = rax; 0x004687e3 lea rax, [rcx + rcx*4] | rax = rcx * 5; 0x004687e7 movsx rcx, bpl | rcx = (int64_t) bpl; 0x004687eb lea rcx, [rcx + rax*2 - 0x30] | rcx = rcx + rax*2 - 0x30; 0x004687f0 mov rax, rdx | rax = rdx; 0x004687f3 imul r13 | rdx:rax = rax * r13; 0x004687f6 mov rax, rdx | rax = rdx; 0x004687f9 shr rax, 0x3f | rax >>= 0x3f; 0x004687fd sar rdx, 2 | rdx >>= 2; 0x00468801 add rdx, rax | rdx += rax; 0x00468804 cmp rdi, rbx | | if (rdi == rbx) { 0x00468807 je 0x468818 | goto label_10; | } 0x00468809 movsx rbp, byte [rbx] | rbp = *(rbx); 0x0046880d lea rax, [rbx + 1] | rax = rbx + 1; 0x00468811 test byte [rsi + rbp*2 + 1], 8 | 0x00468816 jne 0x4687e0 | | } while ((*((rsi + rbp*2 + 1)) & 8) != 0); | label_10: 0x00468818 imul rcx, rdx | rcx *= rdx; 0x0046881c add rcx, 5 | rcx += 5; 0x00468820 mov rax, rcx | rax = rcx; 0x00468823 imul r13 | rdx:rax = rax * r13; 0x00468826 mov rbp, rdx | 0x00468829 mov rax, rdx | rax = rdx; 0x0046882c shr rax, 0x3f | rax >>= 0x3f; 0x00468830 sar rbp, 2 | rbp >>= 2; 0x00468834 cmp rbx, r12 | | if (rbx >= r12) { 0x00468837 jae 0x468856 | goto label_11; | } 0x00468839 nop dword [rax] | | do { 0x00468840 movsx rcx, byte [rbx] | rcx = *(rbx); 0x00468844 test byte [rsi + rcx*2 + 1], 8 | | if ((*((rsi + rcx*2 + 1)) & 8) == 0) { 0x00468849 je 0x468856 | goto label_11; | } 0x0046884b inc rbx | rbx++; 0x0046884e cmp r12, rbx | 0x00468851 jne 0x468840 | | } while (r12 != rbx); 0x00468853 mov rbx, r12 | rbx = r12; | label_11: 0x00468856 add rbp, rax | rbp += rax; 0x00468859 mov al, byte [rbx] | al = *(rbx); 0x0046885b mov dl, 1 | dl = 1; | label_9: 0x0046885d movsxd rcx, r14d | rcx = (int64_t) r14d; 0x00468860 shl rcx, 4 | rcx <<= 4; 0x00468864 cmp byte [rsp + rcx + 0x40], al | | if (*((rsp + rcx + 0x40)) != al) { 0x00468868 jne 0x4686c0 | goto label_0; | } 0x0046886e cmp al, 0x53 | | if (al != 0x53) { 0x00468870 je 0x468878 | 0x00468872 mov eax, edx | eax = edx; 0x00468874 and al, 1 | al &= 1; | if (al != 0) { 0x00468876 jne 0x468895 | goto label_5; | } | } 0x00468878 mov rax, qword [rsp + rcx + 0x48] | rax = *((rsp + rcx + 0x48)); 0x0046887d mov qword [rax], r15 | *(rax) = r15; 0x00468880 inc rbx | rbx++; 0x00468883 mov r15, 0xffffffffffffffff | r15 = 0xffffffffffffffff; 0x0046888a cmp rbx, r12 | | if (rbx != r12) { 0x0046888d jne 0x4686c9 | goto label_1; | } 0x00468893 jmp 0x4688b7 | goto label_12; | label_5: 0x00468895 mov eax, 0xffffffff | eax = 0xffffffff; | do { | label_2: 0x0046889a add rsp, 0x98 | 0x004688a1 pop rbx | 0x004688a2 pop r12 | 0x004688a4 pop r13 | 0x004688a6 pop r14 | 0x004688a8 pop r15 | 0x004688aa pop rbp | 0x004688ab ret | return rax; | label_4: 0x004688ac cmp r15, 0xffffffffffffffff | 0x004688b0 mov eax, 0xffffffff | eax = 0xffffffff; 0x004688b5 jne 0x46889a | | } while (r15 != -1); | label_12: 0x004688b7 imul rax, qword [rsp + 0x28], 0x93a80 | rax = *((rsp + 0x28)) * 0x93a80; 0x004688c0 mov rdi, qword [rsp + 0x30] | rdi = *((rsp + 0x30)); 0x004688c5 mov dword [rdi + 8], 0 | *((rdi + 8)) = 0; 0x004688cc imul rcx, qword [rsp + 0x20], 0x15180 | rcx = *((rsp + 0x20)) * 0x15180; 0x004688d5 imul rdx, qword [rsp + 0x18], 0xe10 | rdx = *((rsp + 0x18)) * 0xe10; 0x004688de add rcx, rax | rcx += rax; 0x004688e1 add rdx, rcx | rdx += rcx; 0x004688e4 imul rax, qword [rsp + 0x10], 0x3c | rax = *((rsp + 0x10)) * 0x3c; 0x004688ea add rax, rdx | rax += rdx; 0x004688ed add rax, qword [rsp + 8] | rax += *((rsp + 8)); 0x004688f2 mov qword [rdi], rax | 0x004688f5 movabs rcx, 0x112e0be826d694b3 | rcx = 0x112e0be826d694b3; 0x004688ff mov rax, rbp | rax = rbp; 0x00468902 imul rcx | rdx:rax = rax * rcx; 0x00468905 mov rax, rdx | rax = rdx; 0x00468908 shr rax, 0x3f | rax >>= 0x3f; 0x0046890c sar rdx, 0x1a | rdx >>= 0x1a; 0x00468910 add rdx, rax | rdx += rax; 0x00468913 imul eax, edx, 0x3b9aca00 | eax = edx * 0x3b9aca00; 0x00468919 sub ebp, eax | ebp -= eax; 0x0046891b mov rsi, rdx | 0x0046891e mov edx, ebp | 0x00468920 call 0x46fa70 | eax = BloombergLP::bsls::TimeInterval::addInterval(long long,int) (rax, rdx, ebp); 0x00468925 xor eax, eax | eax = 0; 0x00468927 jmp 0x46889a | goto label_2; | }