; assembly | /* r2dec pseudo code output */ | /* balber_berutil.t/none @ 0x477bf0 */ | #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_bh; | int64_t var_ch; | int64_t var_10h; | int64_t var_14h; | void * s1; | void * var_24h; | int64_t var_28h; | 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&) */ 0x00477bf0 push rbp | 0x00477bf1 push r15 | 0x00477bf3 push r14 | 0x00477bf5 push r13 | 0x00477bf7 push r12 | 0x00477bf9 push rbx | 0x00477bfa sub rsp, 0x68 | 0x00477bfe mov r13, r8 | r13 = r8; 0x00477c01 mov r12, rcx | r12 = rcx; 0x00477c04 mov rbp, rdx | 0x00477c07 mov r15d, esi | r15d = esi; 0x00477c0a mov r14, rdi | r14 = rdi; 0x00477c0d mov rdi, rdx | rdi = rdx; 0x00477c10 mov rsi, rcx | rsi = rcx; 0x00477c13 call 0x4a2ad0 | eax = _bid128_class (); 0x00477c18 mov ecx, 0xffffffff | ecx = 0xffffffff; 0x00477c1d cmp eax, 9 | | if (eax <= 9) { 0x00477c20 ja 0x477c2b | 0x00477c22 cdqe | rax = (int64_t) eax; 0x00477c24 mov ecx, dword [rax*4 + 0x50a780] | ecx = *((rax*4 + 0x50a780)); | } 0x00477c2b test r12, r12 | | if (r12 >= 0) { 0x00477c2e js 0x477c45 | 0x00477c30 mov byte [rsp + 0xb], 0x2b | *((rsp + 0xb)) = 0x2b; 0x00477c35 cmp dword [r13 + 8], 0 | | if (*((r13 + 8)) == 0) { 0x00477c3a jne 0x477c4a | 0x00477c3c mov r8, rbp | r8 = rbp; 0x00477c3f xor edx, edx | edx = 0; 0x00477c41 xor ebx, ebx | ebx = 0; 0x00477c43 jmp 0x477c54 | | } else { 0x00477c45 mov byte [rsp + 0xb], 0x2d | *((rsp + 0xb)) = 0x2d; | } 0x00477c4a mov r8, rbp | r8 = rbp; 0x00477c4d mov ebx, 1 | ebx = 1; 0x00477c52 mov dl, 1 | dl = 1; | } 0x00477c54 mov ebp, r15d | 0x00477c57 sub ebp, ebx | ebp -= ebx; 0x00477c59 mov edi, ebx | edi = ebx; 0x00477c5b mov qword [rsp + 0x28], r14 | *((rsp + 0x28)) = r14; 0x00477c60 add rdi, r14 | rdi += r14; 0x00477c63 xor r14d, r14d | r14d = 0; 0x00477c66 lea eax, [rcx - 2] | eax = rcx - 2; 0x00477c69 cmp eax, 3 | | if (eax < 3) { 0x00477c6c jae 0x477cdd | 0x00477c6e mov dword [rsp + 0x24], ebp | *((rsp + 0x24)) = ebp; 0x00477c72 mov qword [rsp + 0x18], rdi | *((rsp + 0x18)) = rdi; 0x00477c77 mov dword [rsp + 0xc], ebx | *((rsp + 0xc)) = ebx; 0x00477c7b mov dword [rsp + 0x10], edx | *((rsp + 0x10)) = edx; 0x00477c7f cmp dword [r13 + 4], 2 | | if (*((r13 + 4)) == 2) { 0x00477c84 je 0x477d34 | goto label_1; | } 0x00477c8a mov rdi, r8 | 0x00477c8d mov rsi, r12 | 0x00477c90 call 0x476d60 | rax = BloombergLP::bdldfp::DecimalImpUtil::normalize(BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType128) (r8, r12); 0x00477c95 mov r8, rax | r8 = rax; 0x00477c98 mov r12, rdx | r12 = rdx; 0x00477c9b mov eax, dword [r13 + 4] | eax = *((r13 + 4)); 0x00477c9f cmp eax, 2 | | if (eax == 2) { 0x00477ca2 je 0x477d34 | goto label_1; | } 0x00477ca8 cmp eax, 1 | 0x00477cab mov edx, dword [rsp + 0x10] | edx = *((rsp + 0x10)); 0x00477caf mov ebx, dword [rsp + 0xc] | ebx = *((rsp + 0xc)); 0x00477cb3 mov rdi, qword [rsp + 0x18] | rdi = *((rsp + 0x18)); 0x00477cb8 mov esi, dword [rsp + 0x24] | esi = *((rsp + 0x24)); | if (eax == 1) { 0x00477cbc je 0x477f34 | goto label_2; | } 0x00477cc2 test eax, eax | | if (eax != 0) { 0x00477cc4 jne 0x477f07 | goto label_3; | } 0x00477cca mov rdx, r8 | 0x00477ccd mov rcx, r12 | 0x00477cd0 mov r8, r13 | 0x00477cd3 call 0x479310 | intBloombergLP::bdldfp::(anonymousnamespace)::formatScientific(char*,int,BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType128,BloombergLP::bdldfp::DecimalFormatConfigconst&) (rdi, rsi, r8, r12, r13); 0x00477cd8 jmp 0x477f42 | goto label_4; | } 0x00477cdd test ecx, ecx | | if (ecx != 0) { 0x00477cdf je 0x477d8d | 0x00477ce5 cmp ecx, 1 | | if (ecx != 1) { 0x00477ce8 jne 0x477f07 | goto label_3; | } 0x00477cee mov qword [rsp + 0x18], rdi | *((rsp + 0x18)) = rdi; 0x00477cf3 mov dword [rsp + 0xc], ebx | *((rsp + 0xc)) = ebx; 0x00477cf7 mov dword [rsp + 0x10], edx | *((rsp + 0x10)) = edx; 0x00477cfb mov rbx, qword [r13 + 0x10] | rbx = *((r13 + 0x10)); 0x00477cff mov rdi, rbx | 0x00477d02 call 0x4047b0 | rax = strlen (*((r13 + 0x10))); 0x00477d07 mov r14, rax | r14 = rax; 0x00477d0a movsxd rax, ebp | rax = (int64_t) ebp; 0x00477d0d cmp r14, rax | | if (r14 > rax) { 0x00477d10 jg 0x477eff | goto label_5; | } 0x00477d16 test r14, r14 | | if (r14 == 0) { 0x00477d19 je 0x477eff | goto label_5; | } 0x00477d1f mov rdi, qword [rsp + 0x18] | 0x00477d24 mov rsi, rbx | 0x00477d27 mov rdx, r14 | 0x00477d2a call 0x4049c0 | memmove (*((rsp + 0x18)), rbx, r14); 0x00477d2f jmp 0x477eff | goto label_5; | label_1: 0x00477d34 mov dword [rsp + 0x14], r15d | *((rsp + 0x14)) = r15d; 0x00477d39 mov r14, r8 | r14 = r8; 0x00477d3c mov rdi, r8 | rdi = r8; 0x00477d3f mov rsi, r12 | rsi = r12; 0x00477d42 call 0x4a2ad0 | _bid128_class (); 0x00477d47 movabs rax, 0x6000000000000000 | rax = 0x6000000000000000; 0x00477d51 mov rcx, r12 | rcx = r12; 0x00477d54 and rcx, rax | rcx &= rax; 0x00477d57 cmp rcx, rax | | if (rcx == rax) { 0x00477d5a jne 0x477df2 | 0x00477d60 movabs rax, 0x7fffffffffff | rax = 0x7fffffffffff; 0x00477d6a and rax, r12 | rax &= r12; 0x00477d6d movabs rbx, 0x20000000000000 | rbx = 0x20000000000000; 0x00477d77 or rbx, rax | rbx |= rax; 0x00477d7a mov r8, r12 | r8 = r12; 0x00477d7d shr r8, 0x2f | r8 >>= 0x2f; 0x00477d81 and r8d, 0x3fff | r8d &= 0x3fff; 0x00477d88 jmp 0x477e14 | | } else { 0x00477d8d mov qword [rsp + 0x18], rdi | *((rsp + 0x18)) = rdi; 0x00477d92 mov dword [rsp + 0xc], ebx | *((rsp + 0xc)) = ebx; 0x00477d96 mov dword [rsp + 0x10], edx | *((rsp + 0x10)) = edx; 0x00477d9a mov dword [rsp + 0x14], r15d | *((rsp + 0x14)) = r15d; 0x00477d9f mov rdi, r8 | rdi = r8; 0x00477da2 mov rsi, r12 | rsi = r12; 0x00477da5 call 0x4a2ad0 | eax = _bid128_class (); 0x00477daa lea rcx, [r13 + 0x18] | rcx = r13 + 0x18; 0x00477dae add r13, 0x20 | r13 += 0x20; 0x00477db2 cmp eax, 1 | | if (eax == 1) { 0x00477db5 cmove r13, rcx | r13 = rcx; | } 0x00477db9 mov rbx, qword [r13] | rbx = *(r13); 0x00477dbd mov rdi, rbx | 0x00477dc0 call 0x4047b0 | rax = strlen (*(r13)); 0x00477dc5 mov r14, rax | r14 = rax; 0x00477dc8 movsxd rax, ebp | rax = (int64_t) ebp; 0x00477dcb cmp r14, rax | | if (r14 > rax) { 0x00477dce jg 0x477efa | goto label_6; | } 0x00477dd4 test r14, r14 | | if (r14 == 0) { 0x00477dd7 je 0x477efa | goto label_6; | } 0x00477ddd mov rdi, qword [rsp + 0x18] | 0x00477de2 mov rsi, rbx | 0x00477de5 mov rdx, r14 | 0x00477de8 call 0x4049c0 | memmove (*((rsp + 0x18)), rbx, r14); 0x00477ded jmp 0x477efa | goto label_6; | } 0x00477df2 mov r8, r12 | r8 = r12; 0x00477df5 shr r8, 0x31 | r8 >>= 0x31; 0x00477df9 and r8d, 0x3fff | r8d &= 0x3fff; 0x00477e00 add r8d, 0xffffe7e0 | r8d += 0xffffe7e0; 0x00477e07 movabs rbx, 0x1ffffffffffff | rbx = 0x1ffffffffffff; 0x00477e11 and rbx, r12 | rbx &= r12; | } 0x00477e14 mov ebp, 0xffffffff | 0x00477e19 movabs r10, 0xcccccccccccccccd | r10 = 0xcccccccccccccccd; 0x00477e23 movabs r9, 0x1999999999999999 | r9 = 0x1999999999999999; 0x00477e2d mov rsi, r14 | rsi = r14; | do { | label_0: 0x00477e30 mov rcx, rbx | rcx = rbx; 0x00477e33 mov rax, rbx | rax = rbx; 0x00477e36 mul r10 | rdx:rax = rax * r10; 0x00477e39 mov rbx, rdx | rbx = rdx; 0x00477e3c shr rbx, 3 | rbx >>= 3; 0x00477e40 lea rax, [rbx + rbx] | rax = rbx + rbx; 0x00477e44 lea rax, [rax + rax*4] | rax *= 5; 0x00477e48 mov rdi, rcx | rdi = rcx; 0x00477e4b sub rdi, rax | rdi -= rax; 0x00477e4e mov rax, rsi | rax = rsi; 0x00477e51 mul r10 | rdx:rax = rax * r10; 0x00477e54 shr rdx, 3 | rdx >>= 3; 0x00477e58 lea eax, [rdx + rdx] | eax = rdx + rdx; 0x00477e5b lea eax, [rax + rax*4] | eax = rax * 5; 0x00477e5e sub esi, eax | esi -= eax; 0x00477e60 lea eax, [rdi + rdi*2] | eax = rdi * 3; 0x00477e63 imul rdi, r9 | rdi *= r9; 0x00477e67 add rdi, rdx | rdi += rdx; 0x00477e6a lea eax, [rsi + rax*2] | eax = rsi + rax*2; 0x00477e6d imul eax, eax, 0xcd | eax *= 0xcd; 0x00477e73 movzx esi, ax | esi = (int32_t) ax; 0x00477e76 shr rsi, 0xb | rsi >>= 0xb; 0x00477e7a add rsi, rdi | rsi += rdi; 0x00477e7d inc ebp | ebp++; 0x00477e7f cmp rcx, 9 | 0x00477e83 ja 0x477e30 | | } while (rcx > 9); 0x00477e85 test rsi, rsi | | if (rsi != 0) { 0x00477e88 jne 0x477e30 | goto label_0; | } 0x00477e8a movups xmm0, xmmword [r13] | __asm ("movups xmm0, xmmword [r13]"); 0x00477e8f movups xmm1, xmmword [r13 + 0x10] | __asm ("movups xmm1, xmmword [r13 + 0x10]"); 0x00477e94 movups xmm2, xmmword [r13 + 0x20] | __asm ("movups xmm2, xmmword [r13 + 0x20]"); 0x00477e99 movaps xmmword [rsp + 0x50], xmm2 | *((rsp + 0x50)) = xmm2; 0x00477e9e movaps xmmword [rsp + 0x40], xmm1 | *((rsp + 0x40)) = xmm1; 0x00477ea3 movaps xmmword [rsp + 0x30], xmm0 | *((rsp + 0x30)) = xmm0; 0x00477ea8 test r8d, r8d | | if (r8d <= 0) { 0x00477eab jg 0x477eda | 0x00477ead lea eax, [r8 + rbp + 1] | eax = r8 + rbp + 1; 0x00477eb2 cmp eax, 0xfffffffb | | if (eax >= 0xfffffffb) { 0x00477eb5 jl 0x477eda | 0x00477eb7 neg r8d | r8d = -r8d; 0x00477eba mov dword [rsp + 0x30], r8d | *((rsp + 0x30)) = r8d; 0x00477ebf lea r8, [rsp + 0x30] | 0x00477ec4 mov rdi, qword [rsp + 0x18] | 0x00477ec9 mov esi, dword [rsp + 0x24] | 0x00477ecd mov rdx, r14 | 0x00477ed0 mov rcx, r12 | 0x00477ed3 call 0x479700 | intBloombergLP::bdldfp::(anonymousnamespace)::formatFixed(char*,int,BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType128,BloombergLP::bdldfp::DecimalFormatConfigconst&) (*((rsp + 0x18)), *((rsp + 0x24)), r14, r12, rsp + 0x30); 0x00477ed8 jmp 0x477ef7 | | } | } else { 0x00477eda mov dword [rsp + 0x30], ebp | *((rsp + 0x30)) = ebp; 0x00477ede lea r8, [rsp + 0x30] | 0x00477ee3 mov rdi, qword [rsp + 0x18] | 0x00477ee8 mov esi, dword [rsp + 0x24] | 0x00477eec mov rdx, r14 | 0x00477eef mov rcx, r12 | 0x00477ef2 call 0x479310 | eax = intBloombergLP::bdldfp::(anonymousnamespace)::formatScientific(char*,int,BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType128,BloombergLP::bdldfp::DecimalFormatConfigconst&) (*((rsp + 0x18)), *((rsp + 0x24)), r14, r12, rsp + 0x30); | } 0x00477ef7 mov r14d, eax | r14d = eax; | label_6: 0x00477efa mov r15d, dword [rsp + 0x14] | r15d = *((rsp + 0x14)); | label_5: 0x00477eff mov edx, dword [rsp + 0x10] | edx = *((rsp + 0x10)); 0x00477f03 mov ebx, dword [rsp + 0xc] | ebx = *((rsp + 0xc)); | do { | label_3: 0x00477f07 add r14d, ebx | r14d += ebx; 0x00477f0a cmp r14d, r15d | 0x00477f0d setg al | al = (r14d > r15d) ? 1 : 0; 0x00477f10 xor dl, 1 | dl ^= 1; 0x00477f13 or dl, al | dl |= al; | if (dl == 0) { 0x00477f15 jne 0x477f22 | 0x00477f17 mov al, byte [rsp + 0xb] | al = *((rsp + 0xb)); 0x00477f1b mov rcx, qword [rsp + 0x28] | rcx = *((rsp + 0x28)); 0x00477f20 mov byte [rcx], al | *(rcx) = al; | } 0x00477f22 mov eax, r14d | eax = r14d; 0x00477f25 add rsp, 0x68 | 0x00477f29 pop rbx | 0x00477f2a pop r12 | 0x00477f2c pop r13 | 0x00477f2e pop r14 | 0x00477f30 pop r15 | 0x00477f32 pop rbp | 0x00477f33 ret | return rax; | label_2: 0x00477f34 mov rdx, r8 | 0x00477f37 mov rcx, r12 | 0x00477f3a mov r8, r13 | 0x00477f3d call 0x479700 | eax = intBloombergLP::bdldfp::(anonymousnamespace)::formatFixed(char*,int,BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType128,BloombergLP::bdldfp::DecimalFormatConfigconst&) (rdi, rsi, r8, r12, r13); | label_4: 0x00477f42 mov ebx, dword [rsp + 0xc] | ebx = *((rsp + 0xc)); 0x00477f46 mov edx, dword [rsp + 0x10] | edx = *((rsp + 0x10)); 0x00477f4a mov r14d, eax | r14d = eax; 0x00477f4d jmp 0x477f07 | | } while (1); | }