; assembly | /* r2dec pseudo code output */ | /* balber_berutil.t/none @ 0x479310 */ | #include | ; (fcn) method.int_BloombergLP::bdldfp._anonymous_namespace_::formatScientific_BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType128__char__int__BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType128__BloombergLP::bdldfp::DecimalFormatConfig_const_ () | int64_t method_int_BloombergLP::bdldfp_anonymous_namespace_::formatScientific_BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType128_char_int_BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType128_BloombergLP::bdldfp::DecimalFormatConfig_const_ (int64_t arg5, int64_t arg4, int64_t arg3, void * arg2, void * arg1) { | int64_t var_8h; | void * var_10h; | uint32_t var_1ch; | void * s1; | int64_t var_21h; | int64_t var_30h; | int64_t var_40h; | int64_t var_41h; | char * s2; | r8 = arg5; | rcx = arg4; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* int BloombergLP::bdldfp::(anonymous namespace)::formatScientific(char*, int, BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType128, BloombergLP::bdldfp::DecimalFormatConfig const&) */ 0x00479310 push rbp | 0x00479311 push r15 | 0x00479313 push r14 | 0x00479315 push r13 | 0x00479317 push r12 | 0x00479319 push rbx | 0x0047931a sub rsp, 0x48 | 0x0047931e mov qword [rsp + 8], r8 | *((rsp + 8)) = r8; 0x00479323 mov rbx, rcx | rbx = rcx; 0x00479326 mov rbp, rdx | 0x00479329 mov r15d, esi | r15d = esi; 0x0047932c mov qword [rsp + 0x10], rdi | *((rsp + 0x10)) = rdi; 0x00479331 movabs r13, 0x6000000000000000 | r13 = 0x6000000000000000; 0x0047933b movabs r14, 0x1999999999999999 | r14 = 0x1999999999999999; 0x00479345 mov rdi, rdx | rdi = rdx; 0x00479348 mov rsi, rcx | rsi = rcx; 0x0047934b call 0x4a2ad0 | _bid128_class (); 0x00479350 mov rsi, rbx | rsi = rbx; 0x00479353 mov rax, rbx | rax = rbx; 0x00479356 and rax, r13 | rax &= r13; 0x00479359 movabs r12, 0xcccccccccccccccd | r12 = 0xcccccccccccccccd; 0x00479363 cmp rax, r13 | 0x00479366 mov dword [rsp + 0x1c], r15d | *((rsp + 0x1c)) = r15d; | if (rax == r13) { 0x0047936b jne 0x479397 | 0x0047936d movabs rax, 0x7fffffffffff | rax = 0x7fffffffffff; 0x00479377 and rax, rsi | rax &= rsi; 0x0047937a movabs r10, 0x20000000000000 | r10 = 0x20000000000000; 0x00479384 or r10, rax | r10 |= rax; 0x00479387 mov r15, rsi | r15 = rsi; 0x0047938a shr r15, 0x2f | r15 >>= 0x2f; 0x0047938e and r15d, 0x3fff | r15d &= 0x3fff; 0x00479395 jmp 0x4793c5 | | } else { 0x00479397 mov r15, rsi | r15 = rsi; 0x0047939a shr r15, 0x31 | r15 >>= 0x31; 0x0047939e and r15d, 0x3fff | r15d &= 0x3fff; 0x004793a5 add r15d, 0xffffe7e0 | r15d += 0xffffe7e0; 0x004793ac movabs r10, 0x1ffffffffffff | r10 = 0x1ffffffffffff; 0x004793b6 and r10, rsi | r10 &= rsi; 0x004793b9 mov rax, r10 | rax = r10; 0x004793bc or rax, rbp | rax |= rbp; | if (rax == 0) { 0x004793bf je 0x47950f | goto label_1; | } | } 0x004793c5 mov r8d, 0xffffffff | r8d = 0xffffffff; 0x004793cb mov rcx, rbp | rcx = rbp; 0x004793ce mov rdi, r10 | rdi = r10; 0x004793d1 nop word cs:[rax + rax] | 0x004793db nop dword [rax + rax] | | do { | label_0: 0x004793e0 mov r9, rdi | r9 = rdi; 0x004793e3 mov rax, rdi | rax = rdi; 0x004793e6 mul r12 | rdx:rax = rax * r12; 0x004793e9 mov rdi, rdx | rdi = rdx; 0x004793ec shr rdi, 3 | rdi >>= 3; 0x004793f0 lea rax, [rdi + rdi] | rax = rdi + rdi; 0x004793f4 lea rax, [rax + rax*4] | rax *= 5; 0x004793f8 mov rbx, r9 | rbx = r9; 0x004793fb sub rbx, rax | rbx -= rax; 0x004793fe mov rax, rcx | rax = rcx; 0x00479401 mul r12 | rdx:rax = rax * r12; 0x00479404 shr rdx, 3 | rdx >>= 3; 0x00479408 lea eax, [rdx + rdx] | eax = rdx + rdx; 0x0047940b lea eax, [rax + rax*4] | eax = rax * 5; 0x0047940e sub ecx, eax | ecx -= eax; 0x00479410 lea eax, [rbx + rbx*2] | eax = rbx * 3; 0x00479413 imul rbx, r14 | rbx *= r14; 0x00479417 add rbx, rdx | rbx += rdx; 0x0047941a lea eax, [rcx + rax*2] | eax = rcx + rax*2; 0x0047941d imul eax, eax, 0xcd | eax *= 0xcd; 0x00479423 movzx ecx, ax | ecx = (int32_t) ax; 0x00479426 shr rcx, 0xb | rcx >>= 0xb; 0x0047942a add rcx, rbx | rcx += rbx; 0x0047942d inc r8d | r8d++; 0x00479430 cmp r9, 9 | 0x00479434 ja 0x4793e0 | | } while (r9 > 9); 0x00479436 test rcx, rcx | | if (rcx != 0) { 0x00479439 jne 0x4793e0 | goto label_0; | } 0x0047943b mov rax, qword [rsp + 8] | rax = *((rsp + 8)); 0x00479440 mov ebx, dword [rax] | ebx = *(rax); 0x00479442 sub ebx, r8d | ebx -= r8d; | if (ebx < 0) { 0x00479445 jge 0x479514 | 0x0047944b mov edx, r15d | edx = r15d; 0x0047944e neg edx | edx = -edx; 0x00479450 mov dword [rsp + 0x20], 0 | *((rsp + 0x20)) = 0; 0x00479458 lea rcx, [rsp + 0x20] | rcx = rsp + 0x20; 0x0047945d mov rdi, rbp | rdi = rbp; 0x00479460 call 0x4a6730 | rax = _bid128_scalbn (); 0x00479465 mov rbp, rax | 0x00479468 mov r13, rdx | r13 = rdx; 0x0047946b mov eax, dword [rsp + 0x20] | eax = *((rsp + 0x20)); 0x0047946f test al, 1 | | if ((al & 1) != 0) { 0x00479471 je 0x479482 | 0x00479473 call 0x404a50 | errno_location (); 0x00479478 mov dword [rax], 0x21 | *(rax) = 0x21; 0x0047947e mov eax, dword [rsp + 0x20] | eax = *((rsp + 0x20)); | } 0x00479482 test al, 8 | | if ((al & 8) != 0) { 0x00479484 je 0x479491 | 0x00479486 call 0x404a50 | errno_location (); 0x0047948b mov dword [rax], 0x22 | *(rax) = 0x22; | } 0x00479491 mov rdi, rbp | 0x00479494 mov rsi, r13 | 0x00479497 mov edx, ebx | 0x00479499 call 0x477500 | rax = BloombergLP::bdldfp::DecimalImpUtil::round(BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType128,unsignedint) (rbp, r13, ebx); 0x0047949e mov rbp, rax | 0x004794a1 mov rbx, rdx | rbx = rdx; 0x004794a4 mov rdi, rax | rdi = rax; 0x004794a7 mov rsi, rdx | rsi = rdx; 0x004794aa call 0x4a2ad0 | _bid128_class (); 0x004794af mov rax, rbx | rax = rbx; 0x004794b2 movabs rcx, 0x6000000000000000 | rcx = 0x6000000000000000; 0x004794bc and rax, rcx | rax &= rcx; 0x004794bf cmp rax, rcx | | if (rax == rcx) { 0x004794c2 jne 0x4794ea | 0x004794c4 movabs rax, 0x7fffffffffff | rax = 0x7fffffffffff; 0x004794ce and rax, rbx | rax &= rbx; 0x004794d1 movabs r10, 0x20000000000000 | r10 = 0x20000000000000; 0x004794db or r10, rax | r10 |= rax; 0x004794de shr rbx, 0x2f | rbx >>= 0x2f; 0x004794e2 and ebx, 0x3fff | ebx &= 0x3fff; 0x004794e8 jmp 0x479507 | | } else { 0x004794ea movabs r10, 0x1ffffffffffff | r10 = 0x1ffffffffffff; 0x004794f4 and r10, rbx | r10 &= rbx; 0x004794f7 shr rbx, 0x31 | rbx >>= 0x31; 0x004794fb and ebx, 0x3fff | ebx &= 0x3fff; 0x00479501 add ebx, 0xffffe7e0 | ebx += 0xffffe7e0; | } 0x00479507 add ebx, r15d | ebx += r15d; 0x0047950a mov r15d, ebx | r15d = ebx; 0x0047950d jmp 0x479514 | goto label_2; | label_1: 0x0047950f xor r10d, r10d | r10d = 0; 0x00479512 xor ebp, ebp | ebp = 0; | } | label_2: 0x00479514 xorps xmm0, xmm0 | __asm ("xorps xmm0, xmm0"); 0x00479517 movaps xmmword [rsp + 0x30], xmm0 | *((rsp + 0x30)) = xmm0; 0x0047951c movaps xmmword [rsp + 0x20], xmm0 | *((rsp + 0x20)) = xmm0; 0x00479521 mov word [rsp + 0x40], 0 | *((rsp + 0x40)) = 0; 0x00479528 lea r8, [rsp + 0x41] | r8 = rsp + 0x41; 0x0047952d xor edi, edi | edi = 0; 0x0047952f lea r9, [rsp + 0x20] | r9 = rsp + 0x20; 0x00479534 nop word cs:[rax + rax] | 0x0047953e nop | | do { 0x00479540 mov rcx, r10 | rcx = r10; 0x00479543 mov rax, r10 | rax = r10; 0x00479546 mul r12 | rdx:rax = rax * r12; 0x00479549 mov r10, rdx | r10 = rdx; 0x0047954c shr r10, 3 | r10 >>= 3; 0x00479550 lea rax, [r10 + r10] | rax = r10 + r10; 0x00479554 lea rax, [rax + rax*4] | rax *= 5; 0x00479558 mov rsi, rcx | rsi = rcx; 0x0047955b sub rsi, rax | rsi -= rax; 0x0047955e mov rax, rbp | rax = rbp; 0x00479561 mul r12 | rdx:rax = rax * r12; 0x00479564 shr rdx, 3 | rdx >>= 3; 0x00479568 lea rax, [rdx + rdx] | rax = rdx + rdx; 0x0047956c lea rax, [rax + rax*4] | rax *= 5; 0x00479570 sub rbp, rax | rbp -= rax; 0x00479573 lea rax, [rsi + rsi*2] | rax = rsi * 3; 0x00479577 imul rsi, r14 | rsi *= r14; 0x0047957b add rsi, rdx | rsi += rdx; 0x0047957e lea rbx, [rbp + rax*2] | rbx = rbp + rax*2; 0x00479583 imul eax, ebx, 0xcd | eax = ebx * 0xcd; 0x00479589 movzx ebp, ax | ebp = (int32_t) ax; 0x0047958c shr ebp, 0xb | ebp >>= 0xb; 0x0047958f mov eax, ebp | eax = ebp; 0x00479591 add eax, eax | eax += eax; 0x00479593 lea eax, [rax + rax*4] | eax = rax * 5; 0x00479596 sub bl, al | bl -= al; 0x00479598 or bl, 0x30 | bl |= 0x30; 0x0047959b lea rax, [r8 + rdi] | rax = r8 + rdi; 0x0047959f cmp rcx, 9 | 0x004795a3 seta dl | dl = (rcx > 9) ? 1 : 0; 0x004795a6 add rbp, rsi | rbp += rsi; 0x004795a9 mov byte [rsp + rdi + 0x41], bl | *((rsp + rdi + 0x41)) = bl; 0x004795ad setne bl | bl = (rbp != 0) ? 1 : 0; 0x004795b0 dec rdi | rdi--; 0x004795b3 cmp rax, r9 | | if (rax <= r9) { 0x004795b6 jbe 0x4795bc | goto label_3; | } 0x004795b8 or dl, bl | dl |= bl; 0x004795ba jne 0x479540 | | } while (dl != 0); | label_3: 0x004795bc mov rbp, rdi | 0x004795bf neg rbp | rbp = -rbp; 0x004795c2 cmp rax, r9 | | if (rax > r9) { 0x004795c5 jbe 0x4795e2 | 0x004795c7 test rdi, rdi | | if (rdi != 0) { 0x004795ca je 0x4795e0 | 0x004795cc lea rsi, [rsp + rdi + 0x42] | 0x004795d1 lea rdi, [rsp + 0x20] | 0x004795d6 mov rdx, rbp | 0x004795d9 call 0x4049c0 | eax = memmove (rsp + 0x20, rsp + rdi + 0x42, rbp); 0x004795de jmp 0x4795e2 | | } else { 0x004795e0 xor ebp, ebp | ebp = 0; | } | } 0x004795e2 lea ecx, [r15 + rbp - 1] | ecx = r15 + rbp - 1; 0x004795e7 mov rbx, qword [rsp + 8] | rbx = *((rsp + 8)); 0x004795ec mov edx, dword [rbx + 0x2c] | 0x004795ef lea rdi, [rsp + 0x42] | 0x004795f4 mov esi, 0x50a854 | 0x004795f9 xor eax, eax | eax = 0; 0x004795fb call 0x404850 | eax = sprintf (rsp + 0x42, "%+.*d", *((rbx + 0x2c))); 0x00479600 cmp byte [rbx + 0x2a], 1 | 0x00479604 mov ecx, dword [rbx] | ecx = *(rbx); 0x00479606 mov edx, 2 | edx = 2; 0x0047960b sbb edx, 0 | 0x0047960e mov esi, 2 | esi = 2; 0x00479613 test ecx, ecx | | if (ecx > 0) { 0x00479615 cmovg edx, esi | edx = esi; | } 0x00479618 add ecx, eax | ecx += eax; 0x0047961a lea r14d, [rdx + rcx + 1] | r14d = rdx + rcx + 1; 0x0047961f cmp r14d, dword [rsp + 0x1c] | 0x00479624 mov rdi, qword [rsp + 0x10] | rdi = *((rsp + 0x10)); | if (r14d <= *((rsp + 0x1c))) { 0x00479629 jg 0x4796eb | 0x0047962f mov r13d, eax | r13d = eax; 0x00479632 mov al, byte [rsp + 0x20] | al = *((rsp + 0x20)); 0x00479636 mov byte [rdi], al | *(rdi) = al; 0x00479638 cmp dword [rbx], 0 | | if (*(rbx) == 0) { 0x0047963b jne 0x47964b | 0x0047963d cmp byte [rbx + 0x2a], 0 | | if (*((rbx + 0x2a)) == 0) { 0x00479641 jne 0x47964b | 0x00479643 inc rdi | rdi++; 0x00479646 jmp 0x4796d1 | | } | } else { 0x0047964b mov al, byte [rbx + 0x28] | al = *((rbx + 0x28)); 0x0047964e mov byte [rdi + 1], al | *((rdi + 1)) = al; 0x00479651 add rdi, 2 | rdi += 2; 0x00479655 movsxd r12, dword [rbx] | r12 = *(rbx); 0x00479658 test r12, r12 | | if (r12 == 0) { 0x0047965b je 0x4796d1 | goto label_4; | } 0x0047965d movsxd rax, ebp | rax = (int64_t) ebp; 0x00479660 lea rbx, [rsp + rax + 0x20] | rbx = rsp + rax + 0x20; 0x00479665 lea r15, [rsp + 0x21] | r15 = rsp + 0x21; 0x0047966a add r12, r15 | r12 += r15; 0x0047966d cmp rbx, r12 | 0x00479670 mov rbp, r12 | | if (rbx < r12) { 0x00479673 cmovb rbp, rbx | | } 0x00479677 cmp r15, rbp | | if (r15 <= rbp) { 0x0047967a ja 0x4796cc | 0x0047967c sub rbp, r15 | rbp -= r15; | if (rbp != 0) { 0x0047967f je 0x47969b | 0x00479681 mov qword [rsp + 0x10], rdi | *((rsp + 0x10)) = rdi; 0x00479686 mov rdi, qword [rsp + 0x10] | 0x0047968b mov rsi, r15 | 0x0047968e mov rdx, rbp | 0x00479691 call 0x404d00 | memcpy (*((rsp + 0x10)), r15, rbp); 0x00479696 mov rdi, qword [rsp + 0x10] | rdi = *((rsp + 0x10)); | } 0x0047969b add rdi, rbp | rdi += rbp; 0x0047969e cmp rbx, r12 | | if (rbx > r12) { 0x004796a1 ja 0x4796cc | goto label_5; | } 0x004796a3 mov rax, qword [rsp + 8] | rax = *((rsp + 8)); 0x004796a8 movsxd rax, dword [rax] | rax = *(rax); 0x004796ab add r15, rax | r15 += rax; 0x004796ae sub r15, rbx | r15 -= rbx; 0x004796b1 test r15, r15 | | if (r15 > 0) { 0x004796b4 jle 0x4796c9 | 0x004796b6 mov rbp, rdi | 0x004796b9 mov esi, 0x30 | 0x004796be mov rdx, r15 | 0x004796c1 call 0x404530 | memset (rdi, 0x30, r15); 0x004796c6 mov rdi, rbp | rdi = rbp; | } 0x004796c9 add rdi, r15 | rdi += r15; | } | label_5: 0x004796cc mov rbx, qword [rsp + 8] | rbx = *((rsp + 8)); | } | label_4: 0x004796d1 mov al, byte [rbx + 0x29] | al = *((rbx + 0x29)); 0x004796d4 mov byte [rdi], al | *(rdi) = al; 0x004796d6 test r13d, r13d | | if (r13d == 0) { 0x004796d9 je 0x4796eb | goto label_6; | } 0x004796db movsxd rdx, r13d | rdx = (int64_t) r13d; 0x004796de inc rdi | rdi++; 0x004796e1 lea rsi, [rsp + 0x42] | 0x004796e6 call 0x4049c0 | memmove (rdi, rsp + 0x42, rdx); | } | label_6: 0x004796eb mov eax, r14d | eax = r14d; 0x004796ee add rsp, 0x48 | 0x004796f2 pop rbx | 0x004796f3 pop r12 | 0x004796f5 pop r13 | 0x004796f7 pop r14 | 0x004796f9 pop r15 | 0x004796fb pop rbp | 0x004796fc ret | return rax; | }