; assembly | /* r2dec pseudo code output */ | /* balber_berutil.t/assume @ 0x477a20 */ | #include | ; (fcn) method.BloombergLP::bdldfp::DecimalImpUtil.format_char__int__BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType128__BloombergLP::bdldfp::DecimalFormatConfig_const_ () | int64_t method_BloombergLP::bdldfp::DecimalImpUtil_format_char_int_BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType128_BloombergLP::bdldfp::DecimalFormatConfig_const_ (int64_t arg5, int64_t arg4, int64_t arg3, int64_t arg2, int64_t arg1) { | int64_t var_fh; | int64_t var_10h; | int64_t var_14h; | void * s1; | int64_t var_20h; | uint32_t var_2ch; | int64_t var_30h; | int64_t var_40h; | int64_t var_50h; | r8 = arg5; | rcx = arg4; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* BloombergLP::bdldfp::DecimalImpUtil::format(char*, int, BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType128, BloombergLP::bdldfp::DecimalFormatConfig const&) */ 0x00477a20 push rbp | 0x00477a21 push r15 | 0x00477a23 push r14 | 0x00477a25 push r13 | 0x00477a27 push r12 | 0x00477a29 push rbx | 0x00477a2a sub rsp, 0x68 | 0x00477a2e mov r14, r8 | r14 = r8; 0x00477a31 mov r12, rcx | r12 = rcx; 0x00477a34 mov r13, rdx | r13 = rdx; 0x00477a37 mov r15d, esi | r15d = esi; 0x00477a3a mov rbp, rdi | 0x00477a3d mov rdi, rdx | rdi = rdx; 0x00477a40 mov rsi, rcx | rsi = rcx; 0x00477a43 call 0x4a2490 | _bid128_class (); 0x00477a48 cdqe | rax = (int64_t) eax; 0x00477a4a mov eax, dword [rax*4 + 0x50a110] | eax = *((rax*4 + 0x50a110)); 0x00477a51 test r12, r12 | | if (r12 >= 0) { 0x00477a54 js 0x477a64 | 0x00477a56 cmp dword [r14 + 8], 0 | | if (*((r14 + 8)) == 0) { 0x00477a5b je 0x477a72 | goto label_1; | } 0x00477a5d mov byte [rsp + 0xf], 0x2b | *((rsp + 0xf)) = 0x2b; 0x00477a62 jmp 0x477a69 | | } else { 0x00477a64 mov byte [rsp + 0xf], 0x2d | *((rsp + 0xf)) = 0x2d; | } 0x00477a69 mov esi, 1 | esi = 1; 0x00477a6e mov dl, 1 | dl = 1; 0x00477a70 jmp 0x477a7b | goto label_2; | label_1: 0x00477a72 mov byte [rsp + 0xf], 0x2b | *((rsp + 0xf)) = 0x2b; 0x00477a77 xor edx, edx | edx = 0; 0x00477a79 xor esi, esi | esi = 0; | label_2: 0x00477a7b mov dword [rsp + 0x2c], r15d | *((rsp + 0x2c)) = r15d; 0x00477a80 sub r15d, esi | r15d -= esi; 0x00477a83 mov ebx, esi | ebx = esi; 0x00477a85 add rbx, rbp | rbx += rbp; 0x00477a88 lea ecx, [rax - 2] | ecx = rax - 2; 0x00477a8b cmp ecx, 3 | | if (ecx < 3) { 0x00477a8e jae 0x477ae1 | 0x00477a90 mov dword [rsp + 0x10], esi | *((rsp + 0x10)) = esi; 0x00477a94 mov dword [rsp + 0x14], edx | *((rsp + 0x14)) = edx; 0x00477a98 cmp dword [r14 + 4], 2 | | if (*((r14 + 4)) == 2) { 0x00477a9d je 0x477b3a | goto label_3; | } 0x00477aa3 mov rdi, r13 | 0x00477aa6 mov rsi, r12 | 0x00477aa9 call 0x476cf0 | rax = BloombergLP::bdldfp::DecimalImpUtil::normalize(BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType128) (r13, r12); 0x00477aae mov r13, rax | r13 = rax; 0x00477ab1 mov r12, rdx | r12 = rdx; 0x00477ab4 mov eax, dword [r14 + 4] | eax = *((r14 + 4)); 0x00477ab8 cmp eax, 2 | | if (eax == 2) { 0x00477abb je 0x477b3a | goto label_3; | } 0x00477abd mov rdi, rbx | rdi = rbx; 0x00477ac0 mov esi, r15d | esi = r15d; 0x00477ac3 mov rdx, r13 | rdx = r13; 0x00477ac6 mov rcx, r12 | rcx = r12; 0x00477ac9 mov r8, r14 | r8 = r14; 0x00477acc cmp eax, 1 | | if (eax != 1) { 0x00477acf jne 0x477d3b | goto label_4; | } 0x00477ad5 call 0x479510 | eax = intBloombergLP::bdldfp::(anonymousnamespace)::formatFixed(char*,int,BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType128,BloombergLP::bdldfp::DecimalFormatConfigconst&) (rdi, rsi, rdx, rcx, r8); 0x00477ada mov ebx, eax | ebx = eax; 0x00477adc jmp 0x477d0b | goto label_5; | } 0x00477ae1 mov qword [rsp + 0x18], rbx | *((rsp + 0x18)) = rbx; 0x00477ae6 test eax, eax | | if (eax != 0) { 0x00477ae8 je 0x477b95 | 0x00477aee xor ebx, ebx | ebx = 0; 0x00477af0 cmp eax, 1 | | if (eax != 1) { 0x00477af3 jne 0x477d13 | goto label_6; | } 0x00477af9 mov dword [rsp + 0x10], esi | *((rsp + 0x10)) = esi; 0x00477afd mov r13d, edx | r13d = edx; 0x00477b00 mov r12, rbp | r12 = rbp; 0x00477b03 mov rbp, qword [r14 + 0x10] | rbp = *((r14 + 0x10)); 0x00477b07 mov rdi, rbp | 0x00477b0a call 0x404760 | rax = strlen (*((r14 + 0x10))); 0x00477b0f mov rbx, rax | rbx = rax; 0x00477b12 movsxd rax, r15d | rax = (int64_t) r15d; 0x00477b15 cmp rbx, rax | | if (rbx <= rax) { 0x00477b18 jg 0x477b2f | 0x00477b1a test rbx, rbx | | if (rbx == 0) { 0x00477b1d je 0x477b2f | goto label_7; | } 0x00477b1f mov rdi, qword [rsp + 0x18] | 0x00477b24 mov rsi, rbp | 0x00477b27 mov rdx, rbx | 0x00477b2a call 0x404970 | memmove (*((rsp + 0x18)), rbp, rbx); | } | label_7: 0x00477b2f mov rbp, r12 | 0x00477b32 mov edx, r13d | edx = r13d; 0x00477b35 jmp 0x477d0f | goto label_8; | label_3: 0x00477b3a mov qword [rsp + 0x18], rbx | *((rsp + 0x18)) = rbx; 0x00477b3f mov rdi, r13 | rdi = r13; 0x00477b42 mov rsi, r12 | rsi = r12; 0x00477b45 call 0x4a2490 | _bid128_class (); 0x00477b4a movabs rax, 0x6000000000000000 | rax = 0x6000000000000000; 0x00477b54 mov rcx, r12 | rcx = r12; 0x00477b57 and rcx, rax | rcx &= rax; 0x00477b5a cmp rcx, rax | 0x00477b5d mov qword [rsp + 0x20], rbp | *((rsp + 0x20)) = rbp; | if (rcx == rax) { 0x00477b62 jne 0x477bf4 | 0x00477b68 movabs rax, 0x7fffffffffff | rax = 0x7fffffffffff; 0x00477b72 and rax, r12 | rax &= r12; 0x00477b75 movabs rbx, 0x20000000000000 | rbx = 0x20000000000000; 0x00477b7f or rbx, rax | rbx |= rax; 0x00477b82 mov r8, r12 | r8 = r12; 0x00477b85 shr r8, 0x2f | r8 >>= 0x2f; 0x00477b89 and r8d, 0x3fff | r8d &= 0x3fff; 0x00477b90 jmp 0x477c16 | | } else { 0x00477b95 mov dword [rsp + 0x10], esi | *((rsp + 0x10)) = esi; 0x00477b99 mov dword [rsp + 0x14], edx | *((rsp + 0x14)) = edx; 0x00477b9d mov qword [rsp + 0x20], rbp | *((rsp + 0x20)) = rbp; 0x00477ba2 mov rdi, r13 | rdi = r13; 0x00477ba5 mov rsi, r12 | rsi = r12; 0x00477ba8 call 0x4a2490 | eax = _bid128_class (); 0x00477bad lea rcx, [r14 + 0x18] | rcx = r14 + 0x18; 0x00477bb1 add r14, 0x20 | r14 += 0x20; 0x00477bb5 cmp eax, 1 | | if (eax == 1) { 0x00477bb8 cmove r14, rcx | r14 = rcx; | } 0x00477bbc mov rbp, qword [r14] | rbp = *(r14); 0x00477bbf mov rdi, rbp | 0x00477bc2 call 0x404760 | rax = strlen (*(r14)); 0x00477bc7 mov rbx, rax | rbx = rax; 0x00477bca movsxd rax, r15d | rax = (int64_t) r15d; 0x00477bcd cmp rbx, rax | | if (rbx > rax) { 0x00477bd0 jg 0x477d06 | goto label_9; | } 0x00477bd6 test rbx, rbx | | if (rbx == 0) { 0x00477bd9 je 0x477d06 | goto label_9; | } 0x00477bdf mov rdi, qword [rsp + 0x18] | 0x00477be4 mov rsi, rbp | 0x00477be7 mov rdx, rbx | 0x00477bea call 0x404970 | rax = memmove (*((rsp + 0x18)), rbp, rbx); 0x00477bef jmp 0x477d06 | goto label_9; | } 0x00477bf4 mov r8, r12 | r8 = r12; 0x00477bf7 shr r8, 0x31 | r8 >>= 0x31; 0x00477bfb and r8d, 0x3fff | r8d &= 0x3fff; 0x00477c02 add r8d, 0xffffe7e0 | r8d += 0xffffe7e0; 0x00477c09 movabs rbx, 0x1ffffffffffff | rbx = 0x1ffffffffffff; 0x00477c13 and rbx, r12 | rbx &= r12; | } 0x00477c16 mov ebp, 0xffffffff | 0x00477c1b movabs r10, 0xcccccccccccccccd | r10 = 0xcccccccccccccccd; 0x00477c25 movabs r9, 0x1999999999999999 | r9 = 0x1999999999999999; 0x00477c2f mov rsi, r13 | rsi = r13; 0x00477c32 nop word cs:[rax + rax] | 0x00477c3c nop dword [rax] | | do { | label_0: 0x00477c40 mov rcx, rbx | rcx = rbx; 0x00477c43 mov rax, rbx | rax = rbx; 0x00477c46 mul r10 | rdx:rax = rax * r10; 0x00477c49 mov rbx, rdx | rbx = rdx; 0x00477c4c shr rbx, 3 | rbx >>= 3; 0x00477c50 lea rax, [rbx + rbx] | rax = rbx + rbx; 0x00477c54 lea rax, [rax + rax*4] | rax *= 5; 0x00477c58 mov rdi, rcx | rdi = rcx; 0x00477c5b sub rdi, rax | rdi -= rax; 0x00477c5e mov rax, rsi | rax = rsi; 0x00477c61 mul r10 | rdx:rax = rax * r10; 0x00477c64 shr rdx, 3 | rdx >>= 3; 0x00477c68 lea eax, [rdx + rdx] | eax = rdx + rdx; 0x00477c6b lea eax, [rax + rax*4] | eax = rax * 5; 0x00477c6e sub esi, eax | esi -= eax; 0x00477c70 lea eax, [rdi + rdi*2] | eax = rdi * 3; 0x00477c73 imul rdi, r9 | rdi *= r9; 0x00477c77 add rdi, rdx | rdi += rdx; 0x00477c7a lea eax, [rsi + rax*2] | eax = rsi + rax*2; 0x00477c7d imul eax, eax, 0xcd | eax *= 0xcd; 0x00477c83 movzx esi, ax | esi = (int32_t) ax; 0x00477c86 shr rsi, 0xb | rsi >>= 0xb; 0x00477c8a add rsi, rdi | rsi += rdi; 0x00477c8d inc ebp | ebp++; 0x00477c8f cmp rcx, 9 | 0x00477c93 ja 0x477c40 | | } while (rcx > 9); 0x00477c95 test rsi, rsi | | if (rsi != 0) { 0x00477c98 jne 0x477c40 | goto label_0; | } 0x00477c9a movups xmm0, xmmword [r14] | __asm ("movups xmm0, xmmword [r14]"); 0x00477c9e movups xmm1, xmmword [r14 + 0x10] | __asm ("movups xmm1, xmmword [r14 + 0x10]"); 0x00477ca3 movups xmm2, xmmword [r14 + 0x20] | __asm ("movups xmm2, xmmword [r14 + 0x20]"); 0x00477ca8 movaps xmmword [rsp + 0x50], xmm2 | *((rsp + 0x50)) = xmm2; 0x00477cad movaps xmmword [rsp + 0x40], xmm1 | *((rsp + 0x40)) = xmm1; 0x00477cb2 movaps xmmword [rsp + 0x30], xmm0 | *((rsp + 0x30)) = xmm0; 0x00477cb7 test r8d, r8d | | if (r8d <= 0) { 0x00477cba jg 0x477ce8 | 0x00477cbc lea eax, [r8 + rbp + 1] | eax = r8 + rbp + 1; 0x00477cc1 cmp eax, 0xfffffffb | | if (eax >= 0xfffffffb) { 0x00477cc4 jl 0x477ce8 | 0x00477cc6 neg r8d | r8d = -r8d; 0x00477cc9 mov dword [rsp + 0x30], r8d | *((rsp + 0x30)) = r8d; 0x00477cce lea r8, [rsp + 0x30] | 0x00477cd3 mov rdi, qword [rsp + 0x18] | 0x00477cd8 mov esi, r15d | 0x00477cdb mov rdx, r13 | 0x00477cde mov rcx, r12 | 0x00477ce1 call 0x479510 | intBloombergLP::bdldfp::(anonymousnamespace)::formatFixed(char*,int,BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType128,BloombergLP::bdldfp::DecimalFormatConfigconst&) (*((rsp + 0x18)), r15d, r13, r12, rsp + 0x30); 0x00477ce6 jmp 0x477d04 | | } | } else { 0x00477ce8 mov dword [rsp + 0x30], ebp | *((rsp + 0x30)) = ebp; 0x00477cec lea r8, [rsp + 0x30] | 0x00477cf1 mov rdi, qword [rsp + 0x18] | 0x00477cf6 mov esi, r15d | 0x00477cf9 mov rdx, r13 | 0x00477cfc mov rcx, r12 | 0x00477cff call 0x479110 | eax = intBloombergLP::bdldfp::(anonymousnamespace)::formatScientific(char*,int,BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType128,BloombergLP::bdldfp::DecimalFormatConfigconst&) (*((rsp + 0x18)), r15d, r13, r12, rsp + 0x30); | } 0x00477d04 mov ebx, eax | ebx = eax; | label_9: 0x00477d06 mov rbp, qword [rsp + 0x20] | rbp = *((rsp + 0x20)); | do { | label_5: 0x00477d0b mov edx, dword [rsp + 0x14] | edx = *((rsp + 0x14)); | label_8: 0x00477d0f mov esi, dword [rsp + 0x10] | esi = *((rsp + 0x10)); | label_6: 0x00477d13 add ebx, esi | ebx += esi; 0x00477d15 cmp ebx, dword [rsp + 0x2c] | 0x00477d19 setg al | al = (ebx > *((rsp + 0x2c))) ? 1 : 0; 0x00477d1c xor dl, 1 | dl ^= 1; 0x00477d1f or dl, al | dl |= al; | if (dl == 0) { 0x00477d21 jne 0x477d2a | 0x00477d23 mov al, byte [rsp + 0xf] | al = *((rsp + 0xf)); 0x00477d27 mov byte [rbp], al | *(rbp) = al; | } 0x00477d2a mov eax, ebx | eax = ebx; 0x00477d2c add rsp, 0x68 | 0x00477d30 pop rbx | 0x00477d31 pop r12 | 0x00477d33 pop r13 | 0x00477d35 pop r14 | 0x00477d37 pop r15 | 0x00477d39 pop rbp | 0x00477d3a ret | return rax; | label_4: 0x00477d3b call 0x479110 | eax = intBloombergLP::bdldfp::(anonymousnamespace)::formatScientific(char*,int,BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType128,BloombergLP::bdldfp::DecimalFormatConfigconst&) (rdi, rsi, rdx, rcx, r8); 0x00477d40 mov ebx, eax | ebx = eax; 0x00477d42 jmp 0x477d0b | | } while (1); | }