; assembly | /* r2dec pseudo code output */ | /* balber_berutil.t/none @ 0x477650 */ | #include | ; (fcn) method.BloombergLP::bdldfp::DecimalImpUtil.format_char__int__BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType32__BloombergLP::bdldfp::DecimalFormatConfig_const_ () | int64_t method_BloombergLP::bdldfp::DecimalImpUtil_format_char_int_BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType32_BloombergLP::bdldfp::DecimalFormatConfig_const_ (int64_t arg4, int64_t arg3, int64_t arg2, int64_t arg1) { | int64_t var_3h; | int64_t var_4h; | void * s1; | uint32_t var_14h; | int64_t var_18h; | int64_t var_20h; | int64_t var_30h; | int64_t var_40h; | rcx = arg4; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* BloombergLP::bdldfp::DecimalImpUtil::format(char*, int, BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType32, BloombergLP::bdldfp::DecimalFormatConfig const&) */ 0x00477650 push rbp | 0x00477651 push r15 | 0x00477653 push r14 | 0x00477655 push r13 | 0x00477657 push r12 | 0x00477659 push rbx | 0x0047765a sub rsp, 0x58 | 0x0047765e mov r12, rcx | r12 = rcx; 0x00477661 mov r15d, edx | r15d = edx; 0x00477664 mov r13d, esi | r13d = esi; 0x00477667 mov rbp, rdi | 0x0047766a mov edi, edx | edi = edx; 0x0047766c call 0x4857e0 | eax = _bid32_class (); 0x00477671 mov ecx, 0xffffffff | ecx = 0xffffffff; 0x00477676 cmp eax, 9 | | if (eax <= 9) { 0x00477679 ja 0x477684 | 0x0047767b cdqe | rax = (int64_t) eax; 0x0047767d mov ecx, dword [rax*4 + 0x50a780] | ecx = *((rax*4 + 0x50a780)); | } 0x00477684 test r15d, r15d | | if (r15d >= 0) { 0x00477687 js 0x47769c | 0x00477689 mov byte [rsp + 3], 0x2b | *((rsp + 3)) = 0x2b; 0x0047768e cmp dword [r12 + 8], 0 | | if (*((r12 + 8)) == 0) { 0x00477694 jne 0x4776a1 | 0x00477696 xor edx, edx | edx = 0; 0x00477698 xor esi, esi | esi = 0; 0x0047769a jmp 0x4776a8 | | } else { 0x0047769c mov byte [rsp + 3], 0x2d | *((rsp + 3)) = 0x2d; | } 0x004776a1 mov esi, 1 | esi = 1; 0x004776a6 mov dl, 1 | dl = 1; | } 0x004776a8 mov dword [rsp + 0x14], r13d | *((rsp + 0x14)) = r13d; 0x004776ad sub r13d, esi | r13d -= esi; 0x004776b0 mov edi, esi | edi = esi; 0x004776b2 mov qword [rsp + 0x18], rbp | *((rsp + 0x18)) = rbp; 0x004776b7 add rdi, rbp | rdi += rbp; 0x004776ba xor r14d, r14d | r14d = 0; 0x004776bd lea eax, [rcx - 2] | eax = rcx - 2; 0x004776c0 cmp eax, 3 | | if (eax < 3) { 0x004776c3 jae 0x47771c | 0x004776c5 mov rbp, rdi | 0x004776c8 mov dword [rsp + 4], esi | *((rsp + 4)) = esi; 0x004776cc mov ebx, edx | ebx = edx; 0x004776ce cmp dword [r12 + 4], 2 | | if (*((r12 + 4)) == 2) { 0x004776d4 je 0x47776e | goto label_0; | } 0x004776da mov edi, r15d | 0x004776dd call 0x476650 | eax = BloombergLP::bdldfp::DecimalImpUtil::normalize(BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType32) (r15d); 0x004776e2 mov r15d, eax | r15d = eax; 0x004776e5 mov eax, dword [r12 + 4] | eax = *((r12 + 4)); 0x004776ea cmp eax, 2 | | if (eax == 2) { 0x004776ed je 0x47776e | goto label_0; | } 0x004776ef cmp eax, 1 | 0x004776f2 mov esi, dword [rsp + 4] | esi = *((rsp + 4)); | if (eax == 1) { 0x004776f6 je 0x4778ad | goto label_1; | } 0x004776fc mov edx, ebx | edx = ebx; 0x004776fe test eax, eax | | if (eax != 0) { 0x00477700 jne 0x4778c7 | goto label_2; | } 0x00477706 mov rdi, rbp | 0x00477709 mov esi, r13d | 0x0047770c mov edx, r15d | 0x0047770f mov rcx, r12 | 0x00477712 call 0x478410 | intBloombergLP::bdldfp::(anonymousnamespace)::formatScientific(char*,int,BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType32,BloombergLP::bdldfp::DecimalFormatConfigconst&) (rbp, r13d, r15d, r12); 0x00477717 jmp 0x4778be | goto label_3; | } 0x0047771c test ecx, ecx | | if (ecx != 0) { 0x0047771e je 0x4777b8 | 0x00477724 cmp ecx, 1 | | if (ecx != 1) { 0x00477727 jne 0x4778c7 | goto label_2; | } 0x0047772d mov qword [rsp + 8], rdi | *((rsp + 8)) = rdi; 0x00477732 mov r15d, esi | r15d = esi; 0x00477735 mov ebp, edx | 0x00477737 mov rbx, qword [r12 + 0x10] | rbx = *((r12 + 0x10)); 0x0047773c mov rdi, rbx | 0x0047773f call 0x4047b0 | rax = strlen (*((r12 + 0x10))); 0x00477744 mov r14, rax | r14 = rax; 0x00477747 movsxd rax, r13d | rax = (int64_t) r13d; 0x0047774a cmp r14, rax | | if (r14 <= rax) { 0x0047774d jg 0x477764 | 0x0047774f test r14, r14 | | if (r14 == 0) { 0x00477752 je 0x477764 | goto label_4; | } 0x00477754 mov rdi, qword [rsp + 8] | 0x00477759 mov rsi, rbx | 0x0047775c mov rdx, r14 | 0x0047775f call 0x4049c0 | memmove (*((rsp + 8)), rbx, r14); | } | label_4: 0x00477764 mov edx, ebp | edx = ebp; 0x00477766 mov esi, r15d | esi = r15d; 0x00477769 jmp 0x4778c7 | goto label_2; | label_0: 0x0047776e mov edi, r15d | edi = r15d; 0x00477771 call 0x4857e0 | _bid32_class (); 0x00477776 mov eax, r15d | eax = r15d; 0x00477779 and eax, 0x60000000 | eax &= 0x60000000; 0x0047777e cmp eax, 0x60000000 | | if (eax == 0x60000000) { 0x00477783 jne 0x47780e | 0x00477789 mov edx, r15d | edx = r15d; 0x0047778c and edx, 0x78000000 | edx &= 0x78000000; 0x00477792 mov ecx, r15d | ecx = r15d; 0x00477795 and ecx, 0x1fffff | ecx &= 0x1fffff; 0x0047779b or ecx, 0x800000 | ecx |= 0x800000; 0x004777a1 mov eax, r15d | eax = r15d; 0x004777a4 shr eax, 0x15 | eax >>= 0x15; 0x004777a7 movzx esi, al | esi = (int32_t) al; 0x004777aa lea eax, [rsi - 0x65] | eax = rsi - 0x65; 0x004777ad cmp edx, 0x78000000 | | if (edx == 0x78000000) { 0x004777b3 cmove eax, esi | eax = esi; | } 0x004777b6 jmp 0x477823 | | } else { 0x004777b8 mov qword [rsp + 8], rdi | *((rsp + 8)) = rdi; 0x004777bd mov dword [rsp + 4], esi | *((rsp + 4)) = esi; 0x004777c1 mov ebp, edx | 0x004777c3 mov edi, r15d | edi = r15d; 0x004777c6 call 0x4857e0 | eax = _bid32_class (); 0x004777cb lea rcx, [r12 + 0x18] | rcx = r12 + 0x18; 0x004777d0 add r12, 0x20 | r12 += 0x20; 0x004777d4 cmp eax, 1 | | if (eax == 1) { 0x004777d7 cmove r12, rcx | r12 = rcx; | } 0x004777db mov rbx, qword [r12] | rbx = *(r12); 0x004777df mov rdi, rbx | 0x004777e2 call 0x4047b0 | rax = strlen (*(r12)); 0x004777e7 mov r14, rax | r14 = rax; 0x004777ea movsxd rax, r13d | rax = (int64_t) r13d; 0x004777ed cmp r14, rax | | if (r14 <= rax) { 0x004777f0 jg 0x477807 | 0x004777f2 test r14, r14 | | if (r14 == 0) { 0x004777f5 je 0x477807 | goto label_5; | } 0x004777f7 mov rdi, qword [rsp + 8] | 0x004777fc mov rsi, rbx | 0x004777ff mov rdx, r14 | 0x00477802 call 0x4049c0 | memmove (*((rsp + 8)), rbx, r14); | } | label_5: 0x00477807 mov edx, ebp | edx = ebp; 0x00477809 jmp 0x4778a7 | goto label_6; | } 0x0047780e mov eax, r15d | eax = r15d; 0x00477811 shr eax, 0x17 | eax >>= 0x17; 0x00477814 movzx eax, al | eax = (int32_t) al; 0x00477817 add eax, 0xffffff9b | eax += 0xffffff9b; 0x0047781a mov ecx, r15d | ecx = r15d; 0x0047781d and ecx, 0x7fffff | ecx &= 0x7fffff; | } 0x00477823 mov edx, 0xffffffff | edx = 0xffffffff; 0x00477828 mov esi, 0xcccccccd | esi = 0xcccccccd; 0x0047782d nop dword [rax] | | do { 0x00477830 mov edi, ecx | edi = ecx; 0x00477832 imul rdi, rsi | rdi *= rsi; 0x00477836 shr rdi, 0x23 | rdi >>= 0x23; 0x0047783a inc edx | edx++; 0x0047783c cmp ecx, 9 | 0x0047783f mov ecx, edi | ecx = edi; 0x00477841 ja 0x477830 | | } while (ecx > 9); 0x00477843 movups xmm0, xmmword [r12] | __asm ("movups xmm0, xmmword [r12]"); 0x00477848 movups xmm1, xmmword [r12 + 0x10] | __asm ("movups xmm1, xmmword [r12 + 0x10]"); 0x0047784e movups xmm2, xmmword [r12 + 0x20] | __asm ("movups xmm2, xmmword [r12 + 0x20]"); 0x00477854 movaps xmmword [rsp + 0x40], xmm2 | *((rsp + 0x40)) = xmm2; 0x00477859 movaps xmmword [rsp + 0x30], xmm1 | *((rsp + 0x30)) = xmm1; 0x0047785e movaps xmmword [rsp + 0x20], xmm0 | *((rsp + 0x20)) = xmm0; 0x00477863 test eax, eax | | if (eax <= 0) { 0x00477865 jg 0x47788b | 0x00477867 lea ecx, [rax + rdx + 1] | ecx = rax + rdx + 1; 0x0047786b cmp ecx, 0xfffffffb | | if (ecx >= 0xfffffffb) { 0x0047786e jl 0x47788b | 0x00477870 neg eax | eax = -eax; 0x00477872 mov dword [rsp + 0x20], eax | *((rsp + 0x20)) = eax; 0x00477876 lea rcx, [rsp + 0x20] | 0x0047787b mov rdi, rbp | 0x0047787e mov esi, r13d | 0x00477881 mov edx, r15d | 0x00477884 call 0x478830 | intBloombergLP::bdldfp::(anonymousnamespace)::formatFixed(char*,int,BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType32,BloombergLP::bdldfp::DecimalFormatConfigconst&) (rbp, r13d, r15d, rsp + 0x20); 0x00477889 jmp 0x4778a2 | | } | } else { 0x0047788b mov dword [rsp + 0x20], edx | *((rsp + 0x20)) = edx; 0x0047788f lea rcx, [rsp + 0x20] | 0x00477894 mov rdi, rbp | 0x00477897 mov esi, r13d | 0x0047789a mov edx, r15d | 0x0047789d call 0x478410 | eax = intBloombergLP::bdldfp::(anonymousnamespace)::formatScientific(char*,int,BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType32,BloombergLP::bdldfp::DecimalFormatConfigconst&) (rbp, r13d, r15d, rsp + 0x20); | } 0x004778a2 mov r14d, eax | r14d = eax; 0x004778a5 mov edx, ebx | edx = ebx; | label_6: 0x004778a7 mov esi, dword [rsp + 4] | esi = *((rsp + 4)); 0x004778ab jmp 0x4778c7 | goto label_2; | label_1: 0x004778ad mov rdi, rbp | 0x004778b0 mov esi, r13d | 0x004778b3 mov edx, r15d | 0x004778b6 mov rcx, r12 | 0x004778b9 call 0x478830 | eax = intBloombergLP::bdldfp::(anonymousnamespace)::formatFixed(char*,int,BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType32,BloombergLP::bdldfp::DecimalFormatConfigconst&) (rbp, r13d, r15d, r12); | label_3: 0x004778be mov esi, dword [rsp + 4] | esi = *((rsp + 4)); 0x004778c2 mov edx, ebx | edx = ebx; 0x004778c4 mov r14d, eax | r14d = eax; | label_2: 0x004778c7 add r14d, esi | r14d += esi; 0x004778ca cmp r14d, dword [rsp + 0x14] | 0x004778cf setg al | al = (r14d > *((rsp + 0x14))) ? 1 : 0; 0x004778d2 xor dl, 1 | dl ^= 1; 0x004778d5 or dl, al | dl |= al; | if (dl == 0) { 0x004778d7 jne 0x4778e4 | 0x004778d9 mov rax, qword [rsp + 0x18] | rax = *((rsp + 0x18)); 0x004778de mov cl, byte [rsp + 3] | cl = *((rsp + 3)); 0x004778e2 mov byte [rax], cl | *(rax) = cl; | } 0x004778e4 mov eax, r14d | eax = r14d; 0x004778e7 add rsp, 0x58 | 0x004778eb pop rbx | 0x004778ec pop r12 | 0x004778ee pop r13 | 0x004778f0 pop r14 | 0x004778f2 pop r15 | 0x004778f4 pop rbp | 0x004778f5 ret | return rax; | }