; assembly | /* r2dec pseudo code output */ | /* balber_berutil.t/none @ 0x478410 */ | #include | ; (fcn) method.int_BloombergLP::bdldfp._anonymous_namespace_::formatScientific_BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType32__char__int__BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType32__BloombergLP::bdldfp::DecimalFormatConfig_const_ () | int64_t method_int_BloombergLP::bdldfp_anonymous_namespace_::formatScientific_BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType32_char_int_BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType32_BloombergLP::bdldfp::DecimalFormatConfig_const_ (int64_t arg4, int64_t arg3, int64_t arg2, int64_t arg1) { | void * s1; | int64_t var_9h; | int64_t var_ah; | int64_t var_bh; | int64_t var_ch; | int64_t var_dh; | int64_t var_eh; | int64_t var_fh; | void * var_10h; | char * s2; | void * var_20h; | rcx = arg4; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* int BloombergLP::bdldfp::(anonymous namespace)::formatScientific(char*, int, BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType32, BloombergLP::bdldfp::DecimalFormatConfig const&) */ 0x00478410 push rbp | 0x00478411 push r15 | 0x00478413 push r14 | 0x00478415 push r13 | 0x00478417 push r12 | 0x00478419 push rbx | 0x0047841a sub rsp, 0x28 | 0x0047841e mov r12, rcx | r12 = rcx; 0x00478421 mov ebx, edx | ebx = edx; 0x00478423 mov ebp, esi | 0x00478425 mov r13, rdi | r13 = rdi; 0x00478428 mov edi, edx | edi = edx; 0x0047842a call 0x4857e0 | _bid32_class (); 0x0047842f mov eax, ebx | eax = ebx; 0x00478431 and eax, 0x60000000 | eax &= 0x60000000; 0x00478436 cmp eax, 0x60000000 | 0x0047843b mov dword [rsp + 0x10], ebp | *((rsp + 0x10)) = ebp; | if (eax == 0x60000000) { 0x0047843f jne 0x47846f | 0x00478441 mov ecx, ebx | ecx = ebx; 0x00478443 and ecx, 0x78000000 | ecx &= 0x78000000; 0x00478449 mov ebp, ebx | 0x0047844b and ebp, 0x1fffff | ebp &= 0x1fffff; 0x00478451 or ebp, 0x800000 | ebp |= 0x800000; 0x00478457 mov edx, ebx | edx = ebx; 0x00478459 shr edx, 0x15 | edx >>= 0x15; 0x0047845c movzx edx, dl | edx = (int32_t) dl; 0x0047845f lea r15d, [rdx - 0x65] | r15d = rdx - 0x65; 0x00478463 cmp ecx, 0x78000000 | | if (ecx == 0x78000000) { 0x00478469 cmove r15d, edx | r15d = edx; | } 0x0047846d jmp 0x47848a | | } else { 0x0047846f mov eax, ebx | eax = ebx; 0x00478471 shr eax, 0x17 | eax >>= 0x17; 0x00478474 movzx r15d, al | r15d = (int32_t) al; 0x00478478 add r15d, 0xffffff9b | r15d += 0xffffff9b; 0x0047847c mov ebp, ebx | 0x0047847e and ebp, 0x7fffff | ebp &= 0x7fffff; | if (ebp == 0) { 0x00478484 je 0x478567 | goto label_0; | } | } 0x0047848a mov ecx, 0xffffffff | ecx = 0xffffffff; 0x0047848f mov edx, 0xcccccccd | edx = 0xcccccccd; 0x00478494 mov esi, ebp | esi = ebp; 0x00478496 nop word cs:[rax + rax] | | do { 0x004784a0 mov edi, esi | edi = esi; 0x004784a2 imul rdi, rdx | rdi *= rdx; 0x004784a6 shr rdi, 0x23 | rdi >>= 0x23; 0x004784aa inc ecx | ecx++; 0x004784ac cmp esi, 9 | 0x004784af mov esi, edi | esi = edi; 0x004784b1 ja 0x4784a0 | | } while (esi > 9); 0x004784b3 mov r14d, dword [r12] | r14d = *(r12); 0x004784b7 sub r14d, ecx | r14d -= ecx; | if (r14d < 0) { 0x004784ba jge 0x478569 | 0x004784c0 mov esi, r15d | esi = r15d; 0x004784c3 neg esi | esi = -esi; 0x004784c5 mov dword [rsp + 8], 0 | *((rsp + 8)) = 0; 0x004784cd lea rdx, [rsp + 8] | rdx = rsp + 8; 0x004784d2 mov edi, ebx | edi = ebx; 0x004784d4 call 0x485f10 | eax = _bid32_scalbn (); 0x004784d9 mov ebx, eax | ebx = eax; 0x004784db mov eax, dword [rsp + 8] | eax = *((rsp + 8)); 0x004784df test al, 1 | | if ((al & 1) != 0) { 0x004784e1 je 0x4784f2 | 0x004784e3 call 0x404a50 | errno_location (); 0x004784e8 mov dword [rax], 0x21 | *(rax) = 0x21; 0x004784ee mov eax, dword [rsp + 8] | eax = *((rsp + 8)); | } 0x004784f2 test al, 8 | | if ((al & 8) != 0) { 0x004784f4 je 0x478501 | 0x004784f6 call 0x404a50 | errno_location (); 0x004784fb mov dword [rax], 0x22 | *(rax) = 0x22; | } 0x00478501 mov edi, ebx | 0x00478503 mov esi, r14d | 0x00478506 call 0x4772a0 | eax = BloombergLP::bdldfp::DecimalImpUtil::round(BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType32,unsignedint) (ebx, r14d); 0x0047850b mov ebx, eax | ebx = eax; 0x0047850d mov edi, eax | edi = eax; 0x0047850f call 0x4857e0 | _bid32_class (); 0x00478514 mov eax, ebx | eax = ebx; 0x00478516 and eax, 0x60000000 | eax &= 0x60000000; 0x0047851b cmp eax, 0x60000000 | | if (eax == 0x60000000) { 0x00478520 jne 0x47854c | 0x00478522 mov edx, ebx | edx = ebx; 0x00478524 and edx, 0x78000000 | edx &= 0x78000000; 0x0047852a mov ebp, ebx | 0x0047852c and ebp, 0x1fffff | ebp &= 0x1fffff; 0x00478532 or ebp, 0x800000 | ebp |= 0x800000; 0x00478538 shr ebx, 0x15 | ebx >>= 0x15; 0x0047853b movzx esi, bl | esi = (int32_t) bl; 0x0047853e lea ecx, [rsi - 0x65] | ecx = rsi - 0x65; 0x00478541 cmp edx, 0x78000000 | | if (edx == 0x78000000) { 0x00478547 cmove ecx, esi | ecx = esi; | } 0x0047854a jmp 0x47855f | | } else { 0x0047854c mov eax, ebx | eax = ebx; 0x0047854e shr eax, 0x17 | eax >>= 0x17; 0x00478551 movzx ecx, al | ecx = (int32_t) al; 0x00478554 add ecx, 0xffffff9b | ecx += 0xffffff9b; 0x00478557 and ebx, 0x7fffff | ebx &= 0x7fffff; 0x0047855d mov ebp, ebx | | } 0x0047855f add ecx, r15d | ecx += r15d; 0x00478562 mov r15d, ecx | r15d = ecx; 0x00478565 jmp 0x478569 | goto label_1; | label_0: 0x00478567 xor ebp, ebp | ebp = 0; | } | label_1: 0x00478569 mov dword [rsp + 0xb], 0 | *((rsp + 0xb)) = 0; 0x00478571 mov dword [rsp + 8], 0 | *((rsp + 8)) = 0; 0x00478579 lea r14, [rsp + 0xf] | r14 = rsp + 0xf; 0x0047857e mov edx, ebp | edx = ebp; 0x00478580 mov edi, 0xcccccccd | edi = 0xcccccccd; 0x00478585 mov rsi, rdx | rsi = rdx; 0x00478588 imul rsi, rdi | rsi *= rdi; 0x0047858c shr rsi, 0x23 | rsi >>= 0x23; 0x00478590 lea ecx, [rsi + rsi] | ecx = rsi + rsi; 0x00478593 lea ecx, [rcx + rcx*4] | ecx = rcx * 5; 0x00478596 mov eax, ebp | eax = ebp; 0x00478598 sub eax, ecx | eax -= ecx; 0x0047859a or al, 0x30 | al |= 0x30; 0x0047859c mov byte [rsp + 0xe], al | *((rsp + 0xe)) = al; 0x004785a0 mov cl, 1 | cl = 1; 0x004785a2 cmp ebp, 9 | | if (ebp > 9) { 0x004785a5 jbe 0x4786c1 | 0x004785ab mov eax, esi | eax = esi; 0x004785ad imul rax, rdi | rax *= rdi; 0x004785b1 shr rax, 0x23 | rax >>= 0x23; 0x004785b5 add eax, eax | eax += eax; 0x004785b7 lea eax, [rax + rax*4] | eax = rax * 5; 0x004785ba sub esi, eax | esi -= eax; 0x004785bc or sil, 0x30 | sil |= 0x30; 0x004785c0 mov byte [rsp + 0xd], sil | *((rsp + 0xd)) = sil; 0x004785c5 cmp ebp, 0x64 | | if (ebp >= 0x64) { 0x004785c8 jb 0x4786c8 | 0x004785ce imul rax, rdx, 0x51eb851f | rax = rdx * 0x51eb851f; 0x004785d5 shr rax, 0x25 | rax >>= 0x25; 0x004785d9 mov esi, 0xcccccccd | esi = 0xcccccccd; 0x004785de mov rdi, rax | rdi = rax; 0x004785e1 imul rdi, rsi | rdi *= rsi; 0x004785e5 shr rdi, 0x23 | rdi >>= 0x23; 0x004785e9 add edi, edi | edi += edi; 0x004785eb lea edi, [rdi + rdi*4] | edi = rdi * 5; 0x004785ee sub eax, edi | eax -= edi; 0x004785f0 or al, 0x30 | al |= 0x30; 0x004785f2 mov byte [rsp + 0xc], al | *((rsp + 0xc)) = al; 0x004785f6 cmp ebp, 0x3e8 | | if (ebp >= 0x3e8) { 0x004785fc jb 0x4786cf | 0x00478602 imul rax, rdx, 0x10624dd3 | rax = rdx * 0x10624dd3; 0x00478609 shr rax, 0x26 | rax >>= 0x26; 0x0047860d mov rdi, rax | rdi = rax; 0x00478610 imul rdi, rsi | rdi *= rsi; 0x00478614 shr rdi, 0x23 | rdi >>= 0x23; 0x00478618 add edi, edi | edi += edi; 0x0047861a lea esi, [rdi + rdi*4] | esi = rdi * 5; 0x0047861d sub eax, esi | eax -= esi; 0x0047861f or al, 0x30 | al |= 0x30; 0x00478621 mov byte [rsp + 0xb], al | *((rsp + 0xb)) = al; 0x00478625 cmp ebp, 0x2710 | | if (ebp >= 0x2710) { 0x0047862b jb 0x4786d6 | 0x00478631 mov eax, 0xd1b71759 | eax = 0xd1b71759; 0x00478636 imul rax, rdx | rax *= rdx; 0x0047863a shr rax, 0x2d | rax >>= 0x2d; 0x0047863e mov esi, 0xcccccccd | esi = 0xcccccccd; 0x00478643 mov rdi, rax | rdi = rax; 0x00478646 imul rdi, rsi | rdi *= rsi; 0x0047864a shr rdi, 0x23 | rdi >>= 0x23; 0x0047864e add edi, edi | edi += edi; 0x00478650 lea edi, [rdi + rdi*4] | edi = rdi * 5; 0x00478653 sub eax, edi | eax -= edi; 0x00478655 or al, 0x30 | al |= 0x30; 0x00478657 mov byte [rsp + 0xa], al | *((rsp + 0xa)) = al; 0x0047865b cmp ebp, 0x186a0 | | if (ebp >= 0x186a0) { 0x00478661 jb 0x4786dd | 0x00478663 mov eax, ebp | eax = ebp; 0x00478665 shr eax, 5 | eax >>= 5; 0x00478668 imul rax, rax, 0xa7c5ac5 | rax *= 0xa7c5ac5; 0x0047866f shr rax, 0x27 | rax >>= 0x27; 0x00478673 mov rdi, rax | rdi = rax; 0x00478676 imul rdi, rsi | rdi *= rsi; 0x0047867a shr rdi, 0x23 | rdi >>= 0x23; 0x0047867e add edi, edi | edi += edi; 0x00478680 lea esi, [rdi + rdi*4] | esi = rdi * 5; 0x00478683 sub eax, esi | eax -= esi; 0x00478685 or al, 0x30 | al |= 0x30; 0x00478687 mov byte [rsp + 9], al | *((rsp + 9)) = al; 0x0047868b cmp ebp, 0xf4240 | | if (ebp >= 0xf4240) { 0x00478691 jb 0x4786e4 | 0x00478693 imul rax, rdx, 0x431bde83 | rax = rdx * 0x431bde83; 0x0047869a shr rax, 0x32 | rax >>= 0x32; 0x0047869e mov ecx, 0xcccccccd | ecx = 0xcccccccd; 0x004786a3 imul rcx, rax | rcx *= rax; 0x004786a7 shr rcx, 0x23 | rcx >>= 0x23; 0x004786ab add ecx, ecx | ecx += ecx; 0x004786ad lea ecx, [rcx + rcx*4] | ecx = rcx * 5; 0x004786b0 sub eax, ecx | eax -= ecx; 0x004786b2 or al, 0x30 | al |= 0x30; 0x004786b4 lea rsi, [rsp + 8] | rsi = rsp + 8; 0x004786b9 mov byte [rsp + 8], al | *((rsp + 8)) = al; 0x004786bd xor ecx, ecx | ecx = 0; 0x004786bf jmp 0x4786e9 | | } else { 0x004786c1 lea rsi, [rsp + 0xe] | rsi = rsp + 0xe; 0x004786c6 jmp 0x4786e9 | | } else { 0x004786c8 lea rsi, [rsp + 0xd] | rsi = rsp + 0xd; | } 0x004786cd jmp 0x4786e9 | | } else { 0x004786cf lea rsi, [rsp + 0xc] | rsi = rsp + 0xc; | } 0x004786d4 jmp 0x4786e9 | | } else { 0x004786d6 lea rsi, [rsp + 0xb] | rsi = rsp + 0xb; | } 0x004786db jmp 0x4786e9 | | } else { 0x004786dd lea rsi, [rsp + 0xa] | rsi = rsp + 0xa; | } 0x004786e2 jmp 0x4786e9 | | } else { 0x004786e4 lea rsi, [rsp + 9] | rsi = rsp + 9; | } | } 0x004786e9 sub r14, rsi | r14 -= rsi; 0x004786ec test cl, cl | | if (cl != 0) { 0x004786ee je 0x478707 | 0x004786f0 test r14, r14 | | if (r14 != 0) { 0x004786f3 je 0x478704 | 0x004786f5 lea rdi, [rsp + 8] | 0x004786fa mov rdx, r14 | 0x004786fd call 0x4049c0 | eax = memmove (rsp + 8, rsi, r14); 0x00478702 jmp 0x478707 | | } else { 0x00478704 xor r14d, r14d | r14d = 0; | } | } 0x00478707 lea ecx, [r15 + r14 - 1] | ecx = r15 + r14 - 1; 0x0047870c mov edx, dword [r12 + 0x2c] | 0x00478711 lea rdi, [rsp + 0x1a] | 0x00478716 mov esi, 0x50a854 | 0x0047871b xor eax, eax | eax = 0; 0x0047871d call 0x404850 | eax = sprintf (rsp + 0x1a, "%+.*d", *((r12 + 0x2c))); 0x00478722 cmp byte [r12 + 0x2a], 1 | 0x00478728 mov ecx, dword [r12] | ecx = *(r12); 0x0047872c mov edx, 2 | edx = 2; 0x00478731 sbb edx, 0 | 0x00478734 mov esi, 2 | esi = 2; 0x00478739 test ecx, ecx | | if (ecx > 0) { 0x0047873b cmovg edx, esi | edx = esi; | } 0x0047873e add ecx, eax | ecx += eax; 0x00478740 lea ebx, [rdx + rcx + 1] | ebx = rdx + rcx + 1; 0x00478744 cmp ebx, dword [rsp + 0x10] | | if (ebx > *((rsp + 0x10))) { 0x00478748 jg 0x4787f8 | goto label_2; | } 0x0047874e mov ebp, eax | 0x00478750 mov al, byte [rsp + 8] | al = *((rsp + 8)); 0x00478754 mov byte [r13], al | *(r13) = al; 0x00478758 cmp dword [r12], 0 | | if (*(r12) == 0) { 0x0047875d jne 0x47876c | 0x0047875f cmp byte [r12 + 0x2a], 0 | | if (*((r12 + 0x2a)) == 0) { 0x00478765 jne 0x47876c | 0x00478767 inc r13 | r13++; 0x0047876a jmp 0x4787d8 | | } | } else { 0x0047876c mov al, byte [r12 + 0x28] | al = *((r12 + 0x28)); 0x00478771 mov byte [r13 + 1], al | *((r13 + 1)) = al; 0x00478775 add r13, 2 | r13 += 2; 0x00478779 mov rcx, r13 | rcx = r13; 0x0047877c movsxd r13, dword [r12] | r13 = *(r12); 0x00478780 test r13, r13 | | if (r13 != 0) { 0x00478783 je 0x4787d5 | 0x00478785 movsxd rax, r14d | rax = (int64_t) r14d; 0x00478788 lea rdx, [rsp + rax + 8] | rdx = rsp + rax + 8; 0x0047878d lea r15, [rsp + 9] | r15 = rsp + 9; 0x00478792 add r13, r15 | r13 += r15; 0x00478795 cmp rdx, r13 | 0x00478798 mov r14, r13 | r14 = r13; | if (rdx < r13) { 0x0047879b cmovb r14, rdx | r14 = rdx; | } 0x0047879f cmp r15, r14 | | if (r15 > r14) { 0x004787a2 ja 0x4787d5 | goto label_3; | } 0x004787a4 sub r14, r15 | r14 -= r15; | if (r14 != 0) { 0x004787a7 je 0x4787cd | 0x004787a9 mov qword [rsp + 0x10], rcx | *((rsp + 0x10)) = rcx; 0x004787ae mov rdi, qword [rsp + 0x10] | 0x004787b3 mov rsi, r15 | 0x004787b6 mov qword [rsp + 0x20], rdx | *((rsp + 0x20)) = rdx; 0x004787bb mov rdx, r14 | 0x004787be call 0x404d00 | memcpy (*((rsp + 0x10)), r15, r14); 0x004787c3 mov rcx, qword [rsp + 0x10] | rcx = *((rsp + 0x10)); 0x004787c8 mov rdx, qword [rsp + 0x20] | rdx = *((rsp + 0x20)); | } 0x004787cd add rcx, r14 | rcx += r14; 0x004787d0 cmp rdx, r13 | | if (rdx <= r13) { 0x004787d3 jbe 0x478809 | goto label_4; | } | } | label_3: 0x004787d5 mov r13, rcx | r13 = rcx; | } | do { 0x004787d8 mov al, byte [r12 + 0x29] | al = *((r12 + 0x29)); 0x004787dd mov byte [r13], al | *(r13) = al; 0x004787e1 test ebp, ebp | | if (ebp != 0) { 0x004787e3 je 0x4787f8 | 0x004787e5 movsxd rdx, ebp | rdx = (int64_t) ebp; 0x004787e8 inc r13 | r13++; 0x004787eb lea rsi, [rsp + 0x1a] | 0x004787f0 mov rdi, r13 | 0x004787f3 call 0x4049c0 | memmove (r13, rsp + 0x1a, rdx); | } | label_2: 0x004787f8 mov eax, ebx | eax = ebx; 0x004787fa add rsp, 0x28 | 0x004787fe pop rbx | 0x004787ff pop r12 | 0x00478801 pop r13 | 0x00478803 pop r14 | 0x00478805 pop r15 | 0x00478807 pop rbp | 0x00478808 ret | return rax; | label_4: 0x00478809 movsxd rax, dword [r12] | rax = *(r12); 0x0047880d add r15, rax | r15 += rax; 0x00478810 sub r15, rdx | r15 -= rdx; 0x00478813 test r15, r15 | 0x00478816 mov r13, rcx | r13 = rcx; | if (r15 > 0) { 0x00478819 jle 0x47882b | 0x0047881b mov rdi, r13 | 0x0047881e mov esi, 0x30 | 0x00478823 mov rdx, r15 | 0x00478826 call 0x404530 | memset (r13, 0x30, r15); | } 0x0047882b add r13, r15 | r13 += r15; 0x0047882e jmp 0x4787d8 | | } while (1); | }