; assembly | /* r2dec pseudo code output */ | /* balber_berutil.t/assume @ 0x478210 */ | #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&) */ 0x00478210 push rbp | 0x00478211 push r15 | 0x00478213 push r14 | 0x00478215 push r13 | 0x00478217 push r12 | 0x00478219 push rbx | 0x0047821a sub rsp, 0x28 | 0x0047821e mov r12, rcx | r12 = rcx; 0x00478221 mov ebx, edx | ebx = edx; 0x00478223 mov ebp, esi | 0x00478225 mov r13, rdi | r13 = rdi; 0x00478228 mov edi, edx | edi = edx; 0x0047822a call 0x4851a0 | _bid32_class (); 0x0047822f mov eax, ebx | eax = ebx; 0x00478231 and eax, 0x60000000 | eax &= 0x60000000; 0x00478236 cmp eax, 0x60000000 | 0x0047823b mov dword [rsp + 0x10], ebp | *((rsp + 0x10)) = ebp; 0x0047823f mov eax, ebx | eax = ebx; | if (eax == 0x60000000) { 0x00478241 jne 0x47826d | 0x00478243 and eax, 0x78000000 | eax &= 0x78000000; 0x00478248 mov ecx, ebx | ecx = ebx; 0x0047824a shr ecx, 0x15 | ecx >>= 0x15; 0x0047824d movzx ecx, cl | ecx = (int32_t) cl; 0x00478250 lea r15d, [rcx - 0x65] | r15d = rcx - 0x65; 0x00478254 cmp eax, 0x78000000 | | if (eax == 0x78000000) { 0x00478259 cmove r15d, ecx | r15d = ecx; | } 0x0047825d mov ebp, ebx | 0x0047825f and ebp, 0x1fffff | ebp &= 0x1fffff; 0x00478265 or ebp, 0x800000 | ebp |= 0x800000; 0x0047826b jmp 0x478286 | | } else { 0x0047826d shr eax, 0x17 | eax >>= 0x17; 0x00478270 movzx r15d, al | r15d = (int32_t) al; 0x00478274 add r15d, 0xffffff9b | r15d += 0xffffff9b; 0x00478278 mov ebp, ebx | 0x0047827a and ebp, 0x7fffff | ebp &= 0x7fffff; | if (ebp == 0) { 0x00478280 je 0x478367 | goto label_0; | } | } 0x00478286 mov ecx, 0xffffffff | ecx = 0xffffffff; 0x0047828b mov edx, 0xcccccccd | edx = 0xcccccccd; 0x00478290 mov esi, ebp | esi = ebp; 0x00478292 nop word cs:[rax + rax] | 0x0047829c nop dword [rax] | | do { 0x004782a0 mov edi, esi | edi = esi; 0x004782a2 imul rdi, rdx | rdi *= rdx; 0x004782a6 shr rdi, 0x23 | rdi >>= 0x23; 0x004782aa inc ecx | ecx++; 0x004782ac cmp esi, 9 | 0x004782af mov esi, edi | esi = edi; 0x004782b1 ja 0x4782a0 | | } while (esi > 9); 0x004782b3 mov r14d, dword [r12] | r14d = *(r12); 0x004782b7 sub r14d, ecx | r14d -= ecx; | if (r14d < 0) { 0x004782ba jge 0x478369 | 0x004782c0 mov esi, r15d | esi = r15d; 0x004782c3 neg esi | esi = -esi; 0x004782c5 mov dword [rsp + 8], 0 | *((rsp + 8)) = 0; 0x004782cd lea rdx, [rsp + 8] | rdx = rsp + 8; 0x004782d2 mov edi, ebx | edi = ebx; 0x004782d4 call 0x4858d0 | eax = _bid32_scalbn (); 0x004782d9 mov ebx, eax | ebx = eax; 0x004782db mov eax, dword [rsp + 8] | eax = *((rsp + 8)); 0x004782df test al, 1 | | if ((al & 1) != 0) { 0x004782e1 je 0x4782f2 | 0x004782e3 call 0x404a00 | errno_location (); 0x004782e8 mov dword [rax], 0x21 | *(rax) = 0x21; 0x004782ee mov eax, dword [rsp + 8] | eax = *((rsp + 8)); | } 0x004782f2 test al, 8 | | if ((al & 8) != 0) { 0x004782f4 je 0x478301 | 0x004782f6 call 0x404a00 | errno_location (); 0x004782fb mov dword [rax], 0x22 | *(rax) = 0x22; | } 0x00478301 mov edi, ebx | 0x00478303 mov esi, r14d | 0x00478306 call 0x477200 | eax = BloombergLP::bdldfp::DecimalImpUtil::round(BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType32,unsignedint) (ebx, r14d); 0x0047830b mov ebx, eax | ebx = eax; 0x0047830d mov edi, eax | edi = eax; 0x0047830f call 0x4851a0 | _bid32_class (); 0x00478314 mov eax, ebx | eax = ebx; 0x00478316 and eax, 0x60000000 | eax &= 0x60000000; 0x0047831b cmp eax, 0x60000000 | | if (eax == 0x60000000) { 0x00478320 jne 0x47834c | 0x00478322 mov edx, ebx | edx = ebx; 0x00478324 and edx, 0x78000000 | edx &= 0x78000000; 0x0047832a mov ebp, ebx | 0x0047832c and ebp, 0x1fffff | ebp &= 0x1fffff; 0x00478332 or ebp, 0x800000 | ebp |= 0x800000; 0x00478338 shr ebx, 0x15 | ebx >>= 0x15; 0x0047833b movzx esi, bl | esi = (int32_t) bl; 0x0047833e lea ecx, [rsi - 0x65] | ecx = rsi - 0x65; 0x00478341 cmp edx, 0x78000000 | | if (edx == 0x78000000) { 0x00478347 cmove ecx, esi | ecx = esi; | } 0x0047834a jmp 0x47835f | | } else { 0x0047834c mov eax, ebx | eax = ebx; 0x0047834e shr eax, 0x17 | eax >>= 0x17; 0x00478351 movzx ecx, al | ecx = (int32_t) al; 0x00478354 add ecx, 0xffffff9b | ecx += 0xffffff9b; 0x00478357 and ebx, 0x7fffff | ebx &= 0x7fffff; 0x0047835d mov ebp, ebx | | } 0x0047835f add ecx, r15d | ecx += r15d; 0x00478362 mov r15d, ecx | r15d = ecx; 0x00478365 jmp 0x478369 | goto label_1; | label_0: 0x00478367 xor ebp, ebp | ebp = 0; | } | label_1: 0x00478369 mov dword [rsp + 0xb], 0 | *((rsp + 0xb)) = 0; 0x00478371 mov dword [rsp + 8], 0 | *((rsp + 8)) = 0; 0x00478379 lea r14, [rsp + 0xf] | r14 = rsp + 0xf; 0x0047837e mov edx, ebp | edx = ebp; 0x00478380 mov edi, 0xcccccccd | edi = 0xcccccccd; 0x00478385 mov rsi, rdx | rsi = rdx; 0x00478388 imul rsi, rdi | rsi *= rdi; 0x0047838c shr rsi, 0x23 | rsi >>= 0x23; 0x00478390 lea ecx, [rsi + rsi] | ecx = rsi + rsi; 0x00478393 lea ecx, [rcx + rcx*4] | ecx = rcx * 5; 0x00478396 mov eax, ebp | eax = ebp; 0x00478398 sub eax, ecx | eax -= ecx; 0x0047839a or al, 0x30 | al |= 0x30; 0x0047839c mov byte [rsp + 0xe], al | *((rsp + 0xe)) = al; 0x004783a0 mov cl, 1 | cl = 1; 0x004783a2 cmp ebp, 9 | | if (ebp > 9) { 0x004783a5 jbe 0x4784bf | 0x004783ab mov eax, esi | eax = esi; 0x004783ad imul rax, rdi | rax *= rdi; 0x004783b1 shr rax, 0x23 | rax >>= 0x23; 0x004783b5 add eax, eax | eax += eax; 0x004783b7 lea eax, [rax + rax*4] | eax = rax * 5; 0x004783ba sub esi, eax | esi -= eax; 0x004783bc or sil, 0x30 | sil |= 0x30; 0x004783c0 mov byte [rsp + 0xd], sil | *((rsp + 0xd)) = sil; 0x004783c5 cmp ebp, 0x64 | | if (ebp >= 0x64) { 0x004783c8 jb 0x4784c6 | 0x004783ce imul rax, rdx, 0x51eb851f | rax = rdx * 0x51eb851f; 0x004783d5 shr rax, 0x25 | rax >>= 0x25; 0x004783d9 mov edi, eax | edi = eax; 0x004783db mov esi, 0xcccccccd | esi = 0xcccccccd; 0x004783e0 imul rdi, rsi | rdi *= rsi; 0x004783e4 shr rdi, 0x23 | rdi >>= 0x23; 0x004783e8 add edi, edi | edi += edi; 0x004783ea lea edi, [rdi + rdi*4] | edi = rdi * 5; 0x004783ed sub eax, edi | eax -= edi; 0x004783ef or al, 0x30 | al |= 0x30; 0x004783f1 mov byte [rsp + 0xc], al | *((rsp + 0xc)) = al; 0x004783f5 cmp ebp, 0x3e8 | | if (ebp >= 0x3e8) { 0x004783fb jb 0x4784cd | 0x00478401 imul rax, rdx, 0x10624dd3 | rax = rdx * 0x10624dd3; 0x00478408 shr rax, 0x26 | rax >>= 0x26; 0x0047840c mov edi, eax | edi = eax; 0x0047840e imul rdi, rsi | rdi *= rsi; 0x00478412 shr rdi, 0x23 | rdi >>= 0x23; 0x00478416 add edi, edi | edi += edi; 0x00478418 lea esi, [rdi + rdi*4] | esi = rdi * 5; 0x0047841b sub eax, esi | eax -= esi; 0x0047841d or al, 0x30 | al |= 0x30; 0x0047841f mov byte [rsp + 0xb], al | *((rsp + 0xb)) = al; 0x00478423 cmp ebp, 0x2710 | | if (ebp >= 0x2710) { 0x00478429 jb 0x4784d4 | 0x0047842f mov eax, 0xd1b71759 | eax = 0xd1b71759; 0x00478434 imul rax, rdx | rax *= rdx; 0x00478438 shr rax, 0x2d | rax >>= 0x2d; 0x0047843c mov edi, eax | edi = eax; 0x0047843e mov esi, 0xcccccccd | esi = 0xcccccccd; 0x00478443 imul rdi, rsi | rdi *= rsi; 0x00478447 shr rdi, 0x23 | rdi >>= 0x23; 0x0047844b add edi, edi | edi += edi; 0x0047844d lea edi, [rdi + rdi*4] | edi = rdi * 5; 0x00478450 sub eax, edi | eax -= edi; 0x00478452 or al, 0x30 | al |= 0x30; 0x00478454 mov byte [rsp + 0xa], al | *((rsp + 0xa)) = al; 0x00478458 cmp ebp, 0x186a0 | | if (ebp >= 0x186a0) { 0x0047845e jb 0x4784db | 0x00478460 mov eax, ebp | eax = ebp; 0x00478462 shr eax, 5 | eax >>= 5; 0x00478465 imul rax, rax, 0xa7c5ac5 | rax *= 0xa7c5ac5; 0x0047846c shr rax, 0x27 | rax >>= 0x27; 0x00478470 mov edi, eax | edi = eax; 0x00478472 imul rdi, rsi | rdi *= rsi; 0x00478476 shr rdi, 0x23 | rdi >>= 0x23; 0x0047847a add edi, edi | edi += edi; 0x0047847c lea esi, [rdi + rdi*4] | esi = rdi * 5; 0x0047847f sub eax, esi | eax -= esi; 0x00478481 or al, 0x30 | al |= 0x30; 0x00478483 mov byte [rsp + 9], al | *((rsp + 9)) = al; 0x00478487 cmp ebp, 0xf4240 | | if (ebp >= 0xf4240) { 0x0047848d jb 0x4784e2 | 0x0047848f imul rax, rdx, 0x431bde83 | rax = rdx * 0x431bde83; 0x00478496 shr rax, 0x32 | rax >>= 0x32; 0x0047849a mov ecx, eax | ecx = eax; 0x0047849c mov edx, 0xcccccccd | edx = 0xcccccccd; 0x004784a1 imul rdx, rcx | rdx *= rcx; 0x004784a5 shr rdx, 0x23 | rdx >>= 0x23; 0x004784a9 add edx, edx | edx += edx; 0x004784ab lea ecx, [rdx + rdx*4] | ecx = rdx * 5; 0x004784ae sub eax, ecx | eax -= ecx; 0x004784b0 or al, 0x30 | al |= 0x30; 0x004784b2 lea rsi, [rsp + 8] | rsi = rsp + 8; 0x004784b7 mov byte [rsp + 8], al | *((rsp + 8)) = al; 0x004784bb xor ecx, ecx | ecx = 0; 0x004784bd jmp 0x4784e7 | | } else { 0x004784bf lea rsi, [rsp + 0xe] | rsi = rsp + 0xe; 0x004784c4 jmp 0x4784e7 | | } else { 0x004784c6 lea rsi, [rsp + 0xd] | rsi = rsp + 0xd; | } 0x004784cb jmp 0x4784e7 | | } else { 0x004784cd lea rsi, [rsp + 0xc] | rsi = rsp + 0xc; | } 0x004784d2 jmp 0x4784e7 | | } else { 0x004784d4 lea rsi, [rsp + 0xb] | rsi = rsp + 0xb; | } 0x004784d9 jmp 0x4784e7 | | } else { 0x004784db lea rsi, [rsp + 0xa] | rsi = rsp + 0xa; | } 0x004784e0 jmp 0x4784e7 | | } else { 0x004784e2 lea rsi, [rsp + 9] | rsi = rsp + 9; | } | } 0x004784e7 sub r14, rsi | r14 -= rsi; 0x004784ea test cl, cl | | if (cl != 0) { 0x004784ec je 0x478505 | 0x004784ee test r14, r14 | | if (r14 != 0) { 0x004784f1 je 0x478502 | 0x004784f3 lea rdi, [rsp + 8] | 0x004784f8 mov rdx, r14 | 0x004784fb call 0x404970 | eax = memmove (rsp + 8, rsi, r14); 0x00478500 jmp 0x478505 | | } else { 0x00478502 xor r14d, r14d | r14d = 0; | } | } 0x00478505 lea ecx, [r15 + r14 - 1] | ecx = r15 + r14 - 1; 0x0047850a mov edx, dword [r12 + 0x2c] | 0x0047850f lea rdi, [rsp + 0x1a] | 0x00478514 mov esi, 0x50a1e4 | 0x00478519 xor eax, eax | eax = 0; 0x0047851b call 0x404800 | eax = sprintf (rsp + 0x1a, "%+.*d", *((r12 + 0x2c))); 0x00478520 cmp byte [r12 + 0x2a], 1 | 0x00478526 mov ecx, dword [r12] | ecx = *(r12); 0x0047852a mov edx, 2 | edx = 2; 0x0047852f sbb edx, 0 | 0x00478532 mov esi, 2 | esi = 2; 0x00478537 test ecx, ecx | | if (ecx > 0) { 0x00478539 cmovg edx, esi | edx = esi; | } 0x0047853c add ecx, eax | ecx += eax; 0x0047853e lea ebx, [rdx + rcx + 1] | ebx = rdx + rcx + 1; 0x00478542 cmp ebx, dword [rsp + 0x10] | | if (ebx > *((rsp + 0x10))) { 0x00478546 jg 0x4785f6 | goto label_2; | } 0x0047854c mov ebp, eax | 0x0047854e mov al, byte [rsp + 8] | al = *((rsp + 8)); 0x00478552 mov byte [r13], al | *(r13) = al; 0x00478556 cmp dword [r12], 0 | | if (*(r12) == 0) { 0x0047855b jne 0x47856a | 0x0047855d cmp byte [r12 + 0x2a], 0 | | if (*((r12 + 0x2a)) == 0) { 0x00478563 jne 0x47856a | 0x00478565 inc r13 | r13++; 0x00478568 jmp 0x4785d6 | | } | } else { 0x0047856a mov al, byte [r12 + 0x28] | al = *((r12 + 0x28)); 0x0047856f mov byte [r13 + 1], al | *((r13 + 1)) = al; 0x00478573 add r13, 2 | r13 += 2; 0x00478577 mov rcx, r13 | rcx = r13; 0x0047857a movsxd r13, dword [r12] | r13 = *(r12); 0x0047857e test r13, r13 | | if (r13 != 0) { 0x00478581 je 0x4785d3 | 0x00478583 movsxd rax, r14d | rax = (int64_t) r14d; 0x00478586 lea rdx, [rsp + rax + 8] | rdx = rsp + rax + 8; 0x0047858b lea r15, [rsp + 9] | r15 = rsp + 9; 0x00478590 add r13, r15 | r13 += r15; 0x00478593 cmp rdx, r13 | 0x00478596 mov r14, r13 | r14 = r13; | if (rdx < r13) { 0x00478599 cmovb r14, rdx | r14 = rdx; | } 0x0047859d cmp r15, r14 | | if (r15 > r14) { 0x004785a0 ja 0x4785d3 | goto label_3; | } 0x004785a2 sub r14, r15 | r14 -= r15; | if (r14 != 0) { 0x004785a5 je 0x4785cb | 0x004785a7 mov qword [rsp + 0x10], rcx | *((rsp + 0x10)) = rcx; 0x004785ac mov rdi, qword [rsp + 0x10] | 0x004785b1 mov rsi, r15 | 0x004785b4 mov qword [rsp + 0x20], rdx | *((rsp + 0x20)) = rdx; 0x004785b9 mov rdx, r14 | 0x004785bc call 0x404cb0 | memcpy (*((rsp + 0x10)), r15, r14); 0x004785c1 mov rcx, qword [rsp + 0x10] | rcx = *((rsp + 0x10)); 0x004785c6 mov rdx, qword [rsp + 0x20] | rdx = *((rsp + 0x20)); | } 0x004785cb add rcx, r14 | rcx += r14; 0x004785ce cmp rdx, r13 | | if (rdx <= r13) { 0x004785d1 jbe 0x478607 | goto label_4; | } | } | label_3: 0x004785d3 mov r13, rcx | r13 = rcx; | } | do { 0x004785d6 mov al, byte [r12 + 0x29] | al = *((r12 + 0x29)); 0x004785db mov byte [r13], al | *(r13) = al; 0x004785df test ebp, ebp | | if (ebp != 0) { 0x004785e1 je 0x4785f6 | 0x004785e3 movsxd rdx, ebp | rdx = (int64_t) ebp; 0x004785e6 inc r13 | r13++; 0x004785e9 lea rsi, [rsp + 0x1a] | 0x004785ee mov rdi, r13 | 0x004785f1 call 0x404970 | memmove (r13, rsp + 0x1a, rdx); | } | label_2: 0x004785f6 mov eax, ebx | eax = ebx; 0x004785f8 add rsp, 0x28 | 0x004785fc pop rbx | 0x004785fd pop r12 | 0x004785ff pop r13 | 0x00478601 pop r14 | 0x00478603 pop r15 | 0x00478605 pop rbp | 0x00478606 ret | return rax; | label_4: 0x00478607 movsxd rax, dword [r12] | rax = *(r12); 0x0047860b add r15, rax | r15 += rax; 0x0047860e sub r15, rdx | r15 -= rdx; 0x00478611 test r15, r15 | 0x00478614 mov r13, rcx | r13 = rcx; | if (r15 > 0) { 0x00478617 jle 0x478629 | 0x00478619 mov rdi, r13 | 0x0047861c mov esi, 0x30 | 0x00478621 mov rdx, r15 | 0x00478624 call 0x4044e0 | memset (r13, 0x30, r15); | } 0x00478629 add r13, r15 | r13 += r15; 0x0047862c jmp 0x4785d6 | | } while (1); | }