; assembly | /* r2dec pseudo code output */ | /* balber_berutil.t/assume @ 0x479110 */ | #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, int64_t 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; | void * s2; | int64_t var_48h; | char * s; | 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&) */ 0x00479110 push rbp | 0x00479111 push r15 | 0x00479113 push r14 | 0x00479115 push r13 | 0x00479117 push r12 | 0x00479119 push rbx | 0x0047911a sub rsp, 0x58 | 0x0047911e mov r14, r8 | r14 = r8; 0x00479121 mov r15, rcx | r15 = rcx; 0x00479124 mov rbp, rdx | 0x00479127 mov ebx, esi | ebx = esi; 0x00479129 mov qword [rsp + 0x10], rdi | *((rsp + 0x10)) = rdi; 0x0047912e movabs r12, 0x6000000000000000 | r12 = 0x6000000000000000; 0x00479138 mov rdi, rdx | rdi = rdx; 0x0047913b mov rsi, rcx | rsi = rcx; 0x0047913e call 0x4a2490 | _bid128_class (); 0x00479143 mov rax, r15 | rax = r15; 0x00479146 and rax, r12 | rax &= r12; 0x00479149 cmp rax, r12 | 0x0047914c mov qword [rsp + 8], r14 | *((rsp + 8)) = r14; 0x00479151 mov dword [rsp + 0x1c], ebx | *((rsp + 0x1c)) = ebx; | if (rax == r12) { 0x00479155 jne 0x479181 | 0x00479157 movabs rax, 0x7fffffffffff | rax = 0x7fffffffffff; 0x00479161 and rax, r15 | rax &= r15; 0x00479164 movabs r10, 0x20000000000000 | r10 = 0x20000000000000; 0x0047916e or r10, rax | r10 |= rax; 0x00479171 mov r11, r15 | r11 = r15; 0x00479174 shr r11, 0x2f | r11 >>= 0x2f; 0x00479178 and r11d, 0x3fff | r11d &= 0x3fff; 0x0047917f jmp 0x4791a3 | | } else { 0x00479181 mov r11, r15 | r11 = r15; 0x00479184 shr r11, 0x31 | r11 >>= 0x31; 0x00479188 and r11d, 0x3fff | r11d &= 0x3fff; 0x0047918f add r11d, 0xffffe7e0 | r11d += 0xffffe7e0; 0x00479196 movabs r10, 0x1ffffffffffff | r10 = 0x1ffffffffffff; 0x004791a0 and r10, r15 | r10 &= r15; | } 0x004791a3 movabs r12, 0x1999999999999999 | r12 = 0x1999999999999999; 0x004791ad mov rax, r10 | rax = r10; 0x004791b0 or rax, rbp | rax |= rbp; 0x004791b3 movabs r14, 0xcccccccccccccccd | r14 = 0xcccccccccccccccd; | if (rax == 0) { 0x004791bd je 0x4792e4 | goto label_1; | } 0x004791c3 mov r8d, 0xffffffff | r8d = 0xffffffff; 0x004791c9 mov rsi, rbp | rsi = rbp; 0x004791cc mov rdi, r10 | rdi = r10; 0x004791cf nop | | do { | label_0: 0x004791d0 mov r9, rdi | r9 = rdi; 0x004791d3 mov rax, rdi | rax = rdi; 0x004791d6 mul r14 | rdx:rax = rax * r14; 0x004791d9 mov rdi, rdx | rdi = rdx; 0x004791dc shr rdi, 3 | rdi >>= 3; 0x004791e0 lea rax, [rdi + rdi] | rax = rdi + rdi; 0x004791e4 lea rax, [rax + rax*4] | rax *= 5; 0x004791e8 mov rbx, r9 | rbx = r9; 0x004791eb sub rbx, rax | rbx -= rax; 0x004791ee mov rax, rsi | rax = rsi; 0x004791f1 mul r14 | rdx:rax = rax * r14; 0x004791f4 shr rdx, 3 | rdx >>= 3; 0x004791f8 lea eax, [rdx + rdx] | eax = rdx + rdx; 0x004791fb lea eax, [rax + rax*4] | eax = rax * 5; 0x004791fe sub esi, eax | esi -= eax; 0x00479200 lea eax, [rbx + rbx*2] | eax = rbx * 3; 0x00479203 imul rbx, r12 | rbx *= r12; 0x00479207 add rbx, rdx | rbx += rdx; 0x0047920a lea eax, [rsi + rax*2] | eax = rsi + rax*2; 0x0047920d imul eax, eax, 0xcd | eax *= 0xcd; 0x00479213 movzx esi, ax | esi = (int32_t) ax; 0x00479216 shr rsi, 0xb | rsi >>= 0xb; 0x0047921a add rsi, rbx | rsi += rbx; 0x0047921d inc r8d | r8d++; 0x00479220 cmp r9, 9 | 0x00479224 ja 0x4791d0 | | } while (r9 > 9); 0x00479226 test rsi, rsi | | if (rsi != 0) { 0x00479229 jne 0x4791d0 | goto label_0; | } 0x0047922b mov rax, qword [rsp + 8] | rax = *((rsp + 8)); 0x00479230 mov r13d, dword [rax] | r13d = *(rax); 0x00479233 sub r13d, r8d | r13d -= r8d; | if (r13d < 0) { 0x00479236 jge 0x479312 | 0x0047923c mov qword [rsp + 0x48], r11 | *((rsp + 0x48)) = r11; 0x00479241 mov edx, r11d | edx = r11d; 0x00479244 neg edx | edx = -edx; 0x00479246 mov dword [rsp + 0x20], 0 | *((rsp + 0x20)) = 0; 0x0047924e lea rcx, [rsp + 0x20] | rcx = rsp + 0x20; 0x00479253 mov rdi, rbp | rdi = rbp; 0x00479256 mov rsi, r15 | rsi = r15; 0x00479259 call 0x4a60f0 | rax = _bid128_scalbn (); 0x0047925e mov rbx, rax | rbx = rax; 0x00479261 mov rbp, rdx | 0x00479264 mov eax, dword [rsp + 0x20] | eax = *((rsp + 0x20)); 0x00479268 test al, 1 | | if ((al & 1) != 0) { 0x0047926a je 0x47927b | 0x0047926c call 0x404a00 | errno_location (); 0x00479271 mov dword [rax], 0x21 | *(rax) = 0x21; 0x00479277 mov eax, dword [rsp + 0x20] | eax = *((rsp + 0x20)); | } 0x0047927b test al, 8 | | if ((al & 8) != 0) { 0x0047927d je 0x47928a | 0x0047927f call 0x404a00 | errno_location (); 0x00479284 mov dword [rax], 0x22 | *(rax) = 0x22; | } 0x0047928a mov rdi, rbx | 0x0047928d mov rsi, rbp | 0x00479290 mov edx, r13d | 0x00479293 call 0x477460 | rax = BloombergLP::bdldfp::DecimalImpUtil::round(BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType128,unsignedint) (rbx, rbp, r13d); 0x00479298 mov rbp, rax | 0x0047929b mov rbx, rdx | rbx = rdx; 0x0047929e mov rdi, rax | rdi = rax; 0x004792a1 mov rsi, rdx | rsi = rdx; 0x004792a4 call 0x4a2490 | _bid128_class (); 0x004792a9 mov rax, rbx | rax = rbx; 0x004792ac movabs rcx, 0x6000000000000000 | rcx = 0x6000000000000000; 0x004792b6 and rax, rcx | rax &= rcx; 0x004792b9 cmp rax, rcx | | if (rax == rcx) { 0x004792bc jne 0x4792eb | 0x004792be movabs rax, 0x7fffffffffff | rax = 0x7fffffffffff; 0x004792c8 and rax, rbx | rax &= rbx; 0x004792cb movabs r10, 0x20000000000000 | r10 = 0x20000000000000; 0x004792d5 or r10, rax | r10 |= rax; 0x004792d8 shr rbx, 0x2f | rbx >>= 0x2f; 0x004792dc and ebx, 0x3fff | ebx &= 0x3fff; 0x004792e2 jmp 0x479308 | goto label_2; | label_1: 0x004792e4 xor r10d, r10d | r10d = 0; 0x004792e7 xor ebp, ebp | ebp = 0; 0x004792e9 jmp 0x479312 | | } else { 0x004792eb movabs r10, 0x1ffffffffffff | r10 = 0x1ffffffffffff; 0x004792f5 and r10, rbx | r10 &= rbx; 0x004792f8 shr rbx, 0x31 | rbx >>= 0x31; 0x004792fc and ebx, 0x3fff | ebx &= 0x3fff; 0x00479302 add ebx, 0xffffe7e0 | ebx += 0xffffe7e0; | label_2: 0x00479308 mov rax, qword [rsp + 0x48] | rax = *((rsp + 0x48)); 0x0047930d add ebx, eax | ebx += eax; 0x0047930f mov r11d, ebx | r11d = ebx; | } | } 0x00479312 xorps xmm0, xmm0 | __asm ("xorps xmm0, xmm0"); 0x00479315 movaps xmmword [rsp + 0x30], xmm0 | *((rsp + 0x30)) = xmm0; 0x0047931a movaps xmmword [rsp + 0x20], xmm0 | *((rsp + 0x20)) = xmm0; 0x0047931f mov word [rsp + 0x40], 0 | *((rsp + 0x40)) = 0; 0x00479326 lea r8, [rsp + 0x41] | r8 = rsp + 0x41; 0x0047932b xor edi, edi | edi = 0; 0x0047932d lea r9, [rsp + 0x20] | r9 = rsp + 0x20; 0x00479332 nop word cs:[rax + rax] | 0x0047933c nop dword [rax] | | do { 0x00479340 mov rcx, r10 | rcx = r10; 0x00479343 mov rax, r10 | rax = r10; 0x00479346 mul r14 | rdx:rax = rax * r14; 0x00479349 mov r10, rdx | r10 = rdx; 0x0047934c shr r10, 3 | r10 >>= 3; 0x00479350 lea rax, [r10 + r10] | rax = r10 + r10; 0x00479354 lea rax, [rax + rax*4] | rax *= 5; 0x00479358 mov rsi, rcx | rsi = rcx; 0x0047935b sub rsi, rax | rsi -= rax; 0x0047935e mov rax, rbp | rax = rbp; 0x00479361 mul r14 | rdx:rax = rax * r14; 0x00479364 shr rdx, 3 | rdx >>= 3; 0x00479368 lea rax, [rdx + rdx] | rax = rdx + rdx; 0x0047936c lea rax, [rax + rax*4] | rax *= 5; 0x00479370 sub rbp, rax | rbp -= rax; 0x00479373 lea rax, [rsi + rsi*2] | rax = rsi * 3; 0x00479377 imul rsi, r12 | rsi *= r12; 0x0047937b add rsi, rdx | rsi += rdx; 0x0047937e lea rbx, [rbp + rax*2] | rbx = rbp + rax*2; 0x00479383 imul eax, ebx, 0xcd | eax = ebx * 0xcd; 0x00479389 movzx ebp, ax | ebp = (int32_t) ax; 0x0047938c shr ebp, 0xb | ebp >>= 0xb; 0x0047938f mov eax, ebp | eax = ebp; 0x00479391 add eax, eax | eax += eax; 0x00479393 lea eax, [rax + rax*4] | eax = rax * 5; 0x00479396 sub bl, al | bl -= al; 0x00479398 or bl, 0x30 | bl |= 0x30; 0x0047939b lea rax, [r8 + rdi] | rax = r8 + rdi; 0x0047939f cmp rcx, 9 | 0x004793a3 seta dl | dl = (rcx > 9) ? 1 : 0; 0x004793a6 add rbp, rsi | rbp += rsi; 0x004793a9 mov byte [rsp + rdi + 0x41], bl | *((rsp + rdi + 0x41)) = bl; 0x004793ad setne bl | bl = (rbp != 0) ? 1 : 0; 0x004793b0 dec rdi | rdi--; 0x004793b3 cmp rax, r9 | | if (rax <= r9) { 0x004793b6 jbe 0x4793bc | goto label_3; | } 0x004793b8 or dl, bl | dl |= bl; 0x004793ba jne 0x479340 | | } while (dl != 0); | label_3: 0x004793bc mov rbp, rdi | 0x004793bf neg rbp | rbp = -rbp; 0x004793c2 cmp rax, r9 | 0x004793c5 mov rbx, qword [rsp + 8] | rbx = *((rsp + 8)); | if (rax > r9) { 0x004793ca jbe 0x4793ed | 0x004793cc test rdi, rdi | | if (rdi != 0) { 0x004793cf je 0x4793eb | 0x004793d1 lea rsi, [rsp + rdi + 0x42] | 0x004793d6 lea rdi, [rsp + 0x20] | 0x004793db mov rdx, rbp | 0x004793de mov r14, r11 | r14 = r11; 0x004793e1 call 0x404970 | eax = memmove (rsp + 0x20, rsp + rdi + 0x42, rbp); 0x004793e6 mov r11, r14 | r11 = r14; 0x004793e9 jmp 0x4793ed | | } else { 0x004793eb xor ebp, ebp | ebp = 0; | } | } 0x004793ed lea ecx, [r11 + rbp - 1] | ecx = r11 + rbp - 1; 0x004793f2 mov edx, dword [rbx + 0x2c] | 0x004793f5 lea rdi, [rsp + 0x52] | 0x004793fa mov esi, 0x50a1e4 | 0x004793ff xor eax, eax | eax = 0; 0x00479401 call 0x404800 | eax = sprintf (rsp + 0x52, "%+.*d", *((rbx + 0x2c))); 0x00479406 cmp byte [rbx + 0x2a], 1 | 0x0047940a mov ecx, dword [rbx] | ecx = *(rbx); 0x0047940c mov edx, 2 | edx = 2; 0x00479411 sbb edx, 0 | 0x00479414 mov esi, 2 | esi = 2; 0x00479419 test ecx, ecx | | if (ecx > 0) { 0x0047941b cmovg edx, esi | edx = esi; | } 0x0047941e add ecx, eax | ecx += eax; 0x00479420 lea r14d, [rdx + rcx + 1] | r14d = rdx + rcx + 1; 0x00479425 cmp r14d, dword [rsp + 0x1c] | 0x0047942a mov rdi, qword [rsp + 0x10] | rdi = *((rsp + 0x10)); | if (r14d <= *((rsp + 0x1c))) { 0x0047942f jg 0x4794f1 | 0x00479435 mov r13d, eax | r13d = eax; 0x00479438 mov al, byte [rsp + 0x20] | al = *((rsp + 0x20)); 0x0047943c mov byte [rdi], al | *(rdi) = al; 0x0047943e cmp dword [rbx], 0 | | if (*(rbx) == 0) { 0x00479441 jne 0x479451 | 0x00479443 cmp byte [rbx + 0x2a], 0 | | if (*((rbx + 0x2a)) == 0) { 0x00479447 jne 0x479451 | 0x00479449 inc rdi | rdi++; 0x0047944c jmp 0x4794d7 | | } | } else { 0x00479451 mov al, byte [rbx + 0x28] | al = *((rbx + 0x28)); 0x00479454 mov byte [rdi + 1], al | *((rdi + 1)) = al; 0x00479457 add rdi, 2 | rdi += 2; 0x0047945b movsxd r12, dword [rbx] | r12 = *(rbx); 0x0047945e test r12, r12 | | if (r12 == 0) { 0x00479461 je 0x4794d7 | goto label_4; | } 0x00479463 movsxd rax, ebp | rax = (int64_t) ebp; 0x00479466 lea rbx, [rsp + rax + 0x20] | rbx = rsp + rax + 0x20; 0x0047946b lea r15, [rsp + 0x21] | r15 = rsp + 0x21; 0x00479470 add r12, r15 | r12 += r15; 0x00479473 cmp rbx, r12 | 0x00479476 mov rbp, r12 | | if (rbx < r12) { 0x00479479 cmovb rbp, rbx | | } 0x0047947d cmp r15, rbp | | if (r15 <= rbp) { 0x00479480 ja 0x4794d2 | 0x00479482 sub rbp, r15 | rbp -= r15; | if (rbp != 0) { 0x00479485 je 0x4794a1 | 0x00479487 mov qword [rsp + 0x10], rdi | *((rsp + 0x10)) = rdi; 0x0047948c mov rdi, qword [rsp + 0x10] | 0x00479491 mov rsi, r15 | 0x00479494 mov rdx, rbp | 0x00479497 call 0x404cb0 | memcpy (*((rsp + 0x10)), r15, rbp); 0x0047949c mov rdi, qword [rsp + 0x10] | rdi = *((rsp + 0x10)); | } 0x004794a1 add rdi, rbp | rdi += rbp; 0x004794a4 cmp rbx, r12 | | if (rbx > r12) { 0x004794a7 ja 0x4794d2 | goto label_5; | } 0x004794a9 mov rax, qword [rsp + 8] | rax = *((rsp + 8)); 0x004794ae movsxd rax, dword [rax] | rax = *(rax); 0x004794b1 add r15, rax | r15 += rax; 0x004794b4 sub r15, rbx | r15 -= rbx; 0x004794b7 test r15, r15 | | if (r15 > 0) { 0x004794ba jle 0x4794cf | 0x004794bc mov rbp, rdi | 0x004794bf mov esi, 0x30 | 0x004794c4 mov rdx, r15 | 0x004794c7 call 0x4044e0 | memset (rdi, 0x30, r15); 0x004794cc mov rdi, rbp | rdi = rbp; | } 0x004794cf add rdi, r15 | rdi += r15; | } | label_5: 0x004794d2 mov rbx, qword [rsp + 8] | rbx = *((rsp + 8)); | } | label_4: 0x004794d7 mov al, byte [rbx + 0x29] | al = *((rbx + 0x29)); 0x004794da mov byte [rdi], al | *(rdi) = al; 0x004794dc test r13d, r13d | | if (r13d == 0) { 0x004794df je 0x4794f1 | goto label_6; | } 0x004794e1 movsxd rdx, r13d | rdx = (int64_t) r13d; 0x004794e4 inc rdi | rdi++; 0x004794e7 lea rsi, [rsp + 0x52] | 0x004794ec call 0x404970 | memmove (rdi, rsp + 0x52, rdx); | } | label_6: 0x004794f1 mov eax, r14d | eax = r14d; 0x004794f4 add rsp, 0x58 | 0x004794f8 pop rbx | 0x004794f9 pop r12 | 0x004794fb pop r13 | 0x004794fd pop r14 | 0x004794ff pop r15 | 0x00479501 pop rbp | 0x00479502 ret | return rax; | }