; assembly | /* r2dec pseudo code output */ | /* balber_berdecoder.t/assume @ 0x4682c0 */ | #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_ (uint32_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) */ 0x004682c0 push rbp | 0x004682c1 push r15 | 0x004682c3 push r14 | 0x004682c5 push r13 | 0x004682c7 push r12 | 0x004682c9 push rbx | 0x004682ca sub rsp, 0x98 | 0x004682d1 mov qword [rsp + 0x28], 0 | *((rsp + 0x28)) = 0; 0x004682da mov qword [rsp + 0x20], 0 | *((rsp + 0x20)) = 0; 0x004682e3 mov qword [rsp + 0x18], 0 | *((rsp + 0x18)) = 0; 0x004682ec mov qword [rsp + 0x10], 0 | *((rsp + 0x10)) = 0; 0x004682f5 mov qword [rsp + 8], 0 | *((rsp + 8)) = 0; 0x004682fe mov eax, 0xffffffff | eax = 0xffffffff; 0x00468303 cmp edx, 3 | | if (edx < 3) { 0x00468306 jb 0x46856a | goto label_2; | } 0x0046830c mov rbx, rsi | rbx = rsi; 0x0046830f cmp byte [rsi], 0x50 | | if (*(rsi) != 0x50) { 0x00468312 jne 0x46856a | goto label_2; | } 0x00468318 mov qword [rsp + 0x30], rdi | *((rsp + 0x30)) = rdi; 0x0046831d mov r12d, edx | r12d = edx; 0x00468320 add r12, rbx | r12 += rbx; 0x00468323 inc rbx | rbx++; 0x00468326 mov byte [rsp + 0x40], 0x57 | *((rsp + 0x40)) = 0x57; 0x0046832b lea rax, [rsp + 0x28] | rax = rsp + 0x28; 0x00468330 mov qword [rsp + 0x48], rax | *((rsp + 0x48)) = rax; 0x00468335 mov byte [rsp + 0x50], 0x44 | *((rsp + 0x50)) = 0x44; 0x0046833a lea rax, [rsp + 0x20] | rax = rsp + 0x20; 0x0046833f mov qword [rsp + 0x58], rax | *((rsp + 0x58)) = rax; 0x00468344 mov byte [rsp + 0x60], 0x48 | *((rsp + 0x60)) = 0x48; 0x00468349 lea rax, [rsp + 0x18] | rax = rsp + 0x18; 0x0046834e mov qword [rsp + 0x68], rax | *((rsp + 0x68)) = rax; 0x00468353 mov byte [rsp + 0x70], 0x4d | *((rsp + 0x70)) = 0x4d; 0x00468358 lea rax, [rsp + 0x10] | rax = rsp + 0x10; 0x0046835d mov qword [rsp + 0x78], rax | *((rsp + 0x78)) = rax; 0x00468362 mov byte [rsp + 0x80], 0x53 | *((rsp + 0x80)) = 0x53; 0x0046836a lea rax, [rsp + 8] | rax = rsp + 8; 0x0046836f mov qword [rsp + 0x88], rax | *((rsp + 0x88)) = rax; 0x00468377 mov r15, 0xffffffffffffffff | r15 = 0xffffffffffffffff; 0x0046837e xor ebp, ebp | ebp = 0; 0x00468380 movabs r13, 0x6666666666666667 | r13 = 0x6666666666666667; 0x0046838a xor r14d, r14d | r14d = 0; 0x0046838d xor edx, edx | edx = 0; 0x0046838f xor eax, eax | eax = 0; 0x00468391 mov qword [rsp], rax | *(rsp) = rax; 0x00468395 jmp 0x4683b6 | goto label_3; | label_0: 0x004683a0 cmp rbx, r12 | | if (rbx == r12) { 0x004683a3 je 0x46857c | goto label_4; | } | label_1: 0x004683a9 inc r14d | r14d++; 0x004683ac cmp r14d, 5 | | if (r14d == 5) { 0x004683b0 je 0x468565 | goto label_5; | } | label_3: 0x004683b6 test dl, 1 | | if ((dl & 1) != 0) { 0x004683b9 je 0x4683c5 | 0x004683bb cmp r15, 0xffffffffffffffff | | if (r15 == -1) { 0x004683bf je 0x468565 | goto label_5; | } | } 0x004683c5 cmp byte [rbx], 0x54 | | if (*(rbx) == 0x54) { 0x004683c8 jne 0x4683f0 | 0x004683ca test byte [rsp], 1 | | if ((*(rsp) & 1) != 0) { 0x004683ce jne 0x468565 | goto label_5; | } 0x004683d4 inc rbx | rbx++; 0x004683d7 cmp r14d, 2 | 0x004683db mov eax, 2 | eax = 2; | if (r14d <= 2) { 0x004683e0 cmovle r14d, eax | r14d = eax; | } 0x004683e4 mov al, 1 | al = 1; 0x004683e6 mov qword [rsp], rax | *(rsp) = rax; 0x004683ea jmp 0x468406 | | } else { 0x004683f0 cmp r14d, 2 | | if (r14d != 2) { 0x004683f4 jne 0x468406 | goto label_6; | } 0x004683f6 mov r14d, 2 | r14d = 2; 0x004683fc test byte [rsp], 1 | | if ((*(rsp) & 1) == 0) { 0x00468400 je 0x468565 | goto label_5; | } | } | label_6: 0x00468406 cmp r15, 0xffffffffffffffff | | if (r15 != -1) { 0x0046840a jne 0x468450 | goto label_7; | } 0x0046840c mov qword [rsp + 0x38], rdx | *((rsp + 0x38)) = rdx; 0x00468411 call 0x4044f0 | rax = ctype_b_loc (); 0x00468416 mov rcx, qword [rax] | rcx = *(rax); 0x00468419 mov rax, rbx | rax = rbx; 0x0046841c xor r15d, r15d | r15d = 0; 0x0046841f nop | | do { 0x00468420 movsx rdx, byte [rax] | rdx = *(rax); 0x00468424 test byte [rcx + rdx*2 + 1], 8 | | if ((*((rcx + rdx*2 + 1)) & 8) == 0) { 0x00468429 je 0x46843f | goto label_8; | } 0x0046842b lea rsi, [r15 + r15*4] | rsi = r15 * 5; 0x0046842f lea r15, [rdx + rsi*2 - 0x30] | r15 = rdx + rsi*2 - 0x30; 0x00468434 inc rax | rax++; 0x00468437 cmp r12, rax | 0x0046843a jne 0x468420 | | } while (r12 != rax); 0x0046843c mov rax, r12 | rax = r12; | label_8: 0x0046843f cmp rax, rbx | 0x00468442 mov rbx, rax | rbx = rax; 0x00468445 mov rdx, qword [rsp + 0x38] | rdx = *((rsp + 0x38)); | if (rax == rbx) { 0x0046844a je 0x468565 | goto label_5; | } | label_7: 0x00468450 mov al, byte [rbx] | al = *(rbx); 0x00468452 mov ecx, eax | ecx = eax; 0x00468454 or cl, 2 | cl |= 2; 0x00468457 cmp cl, 0x2e | | if (cl != 0x2e) { 0x0046845a jne 0x46852d | goto label_9; | } 0x00468460 lea rax, [rbx + 1] | rax = rbx + 1; 0x00468464 cmp rax, r12 | | if (rax == r12) { 0x00468467 je 0x468565 | goto label_5; | } 0x0046846d movsx rbp, byte [rax] | rbp = *(rax); 0x00468471 call 0x4044f0 | rax = ctype_b_loc (); 0x00468476 mov rsi, qword [rax] | rsi = *(rax); 0x00468479 test byte [rsi + rbp*2 + 1], 8 | | if ((*((rsi + rbp*2 + 1)) & 8) == 0) { 0x0046847e je 0x468565 | goto label_5; | } 0x00468484 lea rdi, [rbx + 0xb] | rdi = rbx + 0xb; 0x00468488 cmp rdi, r12 | | if (rdi >= r12) { 0x0046848b cmovae rdi, r12 | rdi = r12; | } 0x0046848f add rbx, 2 | rbx += 2; 0x00468493 cmp rdi, rbx | | if (rdi <= rbx) { 0x00468496 cmovbe rdi, rbx | rdi = rbx; | } 0x0046849a mov rax, rbx | rax = rbx; 0x0046849d xor ecx, ecx | ecx = 0; 0x0046849f movabs rdx, 0x2540be400 | rdx = 0x2540be400; 0x004684a9 nop dword [rax] | | do { 0x004684b0 mov rbx, rax | rbx = rax; 0x004684b3 lea rax, [rcx + rcx*4] | rax = rcx * 5; 0x004684b7 movsx rcx, bpl | rcx = (int64_t) bpl; 0x004684bb lea rcx, [rcx + rax*2 - 0x30] | rcx = rcx + rax*2 - 0x30; 0x004684c0 mov rax, rdx | rax = rdx; 0x004684c3 imul r13 | rdx:rax = rax * r13; 0x004684c6 mov rax, rdx | rax = rdx; 0x004684c9 shr rax, 0x3f | rax >>= 0x3f; 0x004684cd sar rdx, 2 | rdx >>= 2; 0x004684d1 add rdx, rax | rdx += rax; 0x004684d4 cmp rdi, rbx | | if (rdi == rbx) { 0x004684d7 je 0x4684e8 | goto label_10; | } 0x004684d9 movsx rbp, byte [rbx] | rbp = *(rbx); 0x004684dd lea rax, [rbx + 1] | rax = rbx + 1; 0x004684e1 test byte [rsi + rbp*2 + 1], 8 | 0x004684e6 jne 0x4684b0 | | } while ((*((rsi + rbp*2 + 1)) & 8) != 0); | label_10: 0x004684e8 imul rcx, rdx | rcx *= rdx; 0x004684ec add rcx, 5 | rcx += 5; 0x004684f0 mov rax, rcx | rax = rcx; 0x004684f3 imul r13 | rdx:rax = rax * r13; 0x004684f6 mov rbp, rdx | 0x004684f9 mov rax, rdx | rax = rdx; 0x004684fc shr rax, 0x3f | rax >>= 0x3f; 0x00468500 sar rbp, 2 | rbp >>= 2; 0x00468504 cmp rbx, r12 | | if (rbx >= r12) { 0x00468507 jae 0x468526 | goto label_11; | } 0x00468509 nop dword [rax] | | do { 0x00468510 movsx rcx, byte [rbx] | rcx = *(rbx); 0x00468514 test byte [rsi + rcx*2 + 1], 8 | | if ((*((rsi + rcx*2 + 1)) & 8) == 0) { 0x00468519 je 0x468526 | goto label_11; | } 0x0046851b inc rbx | rbx++; 0x0046851e cmp r12, rbx | 0x00468521 jne 0x468510 | | } while (r12 != rbx); 0x00468523 mov rbx, r12 | rbx = r12; | label_11: 0x00468526 add rbp, rax | rbp += rax; 0x00468529 mov al, byte [rbx] | al = *(rbx); 0x0046852b mov dl, 1 | dl = 1; | label_9: 0x0046852d movsxd rcx, r14d | rcx = (int64_t) r14d; 0x00468530 shl rcx, 4 | rcx <<= 4; 0x00468534 cmp byte [rsp + rcx + 0x40], al | | if (*((rsp + rcx + 0x40)) != al) { 0x00468538 jne 0x4683a0 | goto label_0; | } 0x0046853e cmp al, 0x53 | | if (al != 0x53) { 0x00468540 je 0x468548 | 0x00468542 mov eax, edx | eax = edx; 0x00468544 and al, 1 | al &= 1; | if (al != 0) { 0x00468546 jne 0x468565 | goto label_5; | } | } 0x00468548 mov rax, qword [rsp + rcx + 0x48] | rax = *((rsp + rcx + 0x48)); 0x0046854d mov qword [rax], r15 | *(rax) = r15; 0x00468550 inc rbx | rbx++; 0x00468553 mov r15, 0xffffffffffffffff | r15 = 0xffffffffffffffff; 0x0046855a cmp rbx, r12 | | if (rbx != r12) { 0x0046855d jne 0x4683a9 | goto label_1; | } 0x00468563 jmp 0x468587 | goto label_12; | label_5: 0x00468565 mov eax, 0xffffffff | eax = 0xffffffff; | do { | label_2: 0x0046856a add rsp, 0x98 | 0x00468571 pop rbx | 0x00468572 pop r12 | 0x00468574 pop r13 | 0x00468576 pop r14 | 0x00468578 pop r15 | 0x0046857a pop rbp | 0x0046857b ret | return rax; | label_4: 0x0046857c cmp r15, 0xffffffffffffffff | 0x00468580 mov eax, 0xffffffff | eax = 0xffffffff; 0x00468585 jne 0x46856a | | } while (r15 != -1); | label_12: 0x00468587 imul rax, qword [rsp + 0x28], 0x93a80 | rax = *((rsp + 0x28)) * 0x93a80; 0x00468590 mov rdi, qword [rsp + 0x30] | rdi = *((rsp + 0x30)); 0x00468595 mov dword [rdi + 8], 0 | *((rdi + 8)) = 0; 0x0046859c imul rcx, qword [rsp + 0x20], 0x15180 | rcx = *((rsp + 0x20)) * 0x15180; 0x004685a5 imul rdx, qword [rsp + 0x18], 0xe10 | rdx = *((rsp + 0x18)) * 0xe10; 0x004685ae add rcx, rax | rcx += rax; 0x004685b1 add rdx, rcx | rdx += rcx; 0x004685b4 imul rax, qword [rsp + 0x10], 0x3c | rax = *((rsp + 0x10)) * 0x3c; 0x004685ba add rax, rdx | rax += rdx; 0x004685bd add rax, qword [rsp + 8] | rax += *((rsp + 8)); 0x004685c2 mov qword [rdi], rax | 0x004685c5 movabs rcx, 0x112e0be826d694b3 | rcx = 0x112e0be826d694b3; 0x004685cf mov rax, rbp | rax = rbp; 0x004685d2 imul rcx | rdx:rax = rax * rcx; 0x004685d5 mov rax, rdx | rax = rdx; 0x004685d8 shr rax, 0x3f | rax >>= 0x3f; 0x004685dc sar rdx, 0x1a | rdx >>= 0x1a; 0x004685e0 add rdx, rax | rdx += rax; 0x004685e3 imul eax, edx, 0x3b9aca00 | eax = edx * 0x3b9aca00; 0x004685e9 sub ebp, eax | ebp -= eax; 0x004685eb mov rsi, rdx | 0x004685ee mov edx, ebp | 0x004685f0 call 0x46f6b0 | eax = BloombergLP::bsls::TimeInterval::addInterval(long long,int) (rax, rdx, ebp); 0x004685f5 xor eax, eax | eax = 0; 0x004685f7 jmp 0x46856a | goto label_2; | }