; assembly | /* r2dec pseudo code output */ | /* balber_berutil.t/none @ 0x477900 */ | #include | ; (fcn) method.BloombergLP::bdldfp::DecimalImpUtil.format_char__int__BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType64__BloombergLP::bdldfp::DecimalFormatConfig_const_ () | int64_t method_BloombergLP::bdldfp::DecimalImpUtil_format_char_int_BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType64_BloombergLP::bdldfp::DecimalFormatConfig_const_ (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; | uint32_t var_24h; | int64_t var_28h; | int64_t var_30h; | int64_t var_40h; | int64_t var_50h; | rcx = arg4; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* BloombergLP::bdldfp::DecimalImpUtil::format(char*, int, BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType64, BloombergLP::bdldfp::DecimalFormatConfig const&) */ 0x00477900 push rbp | 0x00477901 push r15 | 0x00477903 push r14 | 0x00477905 push r13 | 0x00477907 push r12 | 0x00477909 push rbx | 0x0047790a sub rsp, 0x68 | 0x0047790e mov r12, rcx | r12 = rcx; 0x00477911 mov r15, rdx | r15 = rdx; 0x00477914 mov r13d, esi | r13d = esi; 0x00477917 mov rbx, rdi | rbx = rdi; 0x0047791a mov rdi, rdx | rdi = rdx; 0x0047791d call 0x48a270 | eax = _bid64_class (); 0x00477922 mov ecx, 0xffffffff | ecx = 0xffffffff; 0x00477927 cmp eax, 9 | | if (eax <= 9) { 0x0047792a ja 0x477935 | 0x0047792c cdqe | rax = (int64_t) eax; 0x0047792e mov ecx, dword [rax*4 + 0x50a780] | ecx = *((rax*4 + 0x50a780)); | } 0x00477935 test r15, r15 | | if (r15 >= 0) { 0x00477938 js 0x47794d | 0x0047793a mov byte [rsp + 0xf], 0x2b | *((rsp + 0xf)) = 0x2b; 0x0047793f cmp dword [r12 + 8], 0 | | if (*((r12 + 8)) == 0) { 0x00477945 jne 0x477952 | 0x00477947 xor esi, esi | esi = 0; 0x00477949 xor edx, edx | edx = 0; 0x0047794b jmp 0x47795a | | } else { 0x0047794d mov byte [rsp + 0xf], 0x2d | *((rsp + 0xf)) = 0x2d; | } 0x00477952 mov edx, 1 | edx = 1; 0x00477957 mov sil, 1 | sil = 1; | } 0x0047795a mov dword [rsp + 0x24], r13d | *((rsp + 0x24)) = r13d; 0x0047795f sub r13d, edx | r13d -= edx; 0x00477962 mov edi, edx | edi = edx; 0x00477964 mov rbp, rbx | 0x00477967 add rdi, rbx | rdi += rbx; 0x0047796a xor r14d, r14d | r14d = 0; 0x0047796d lea eax, [rcx - 2] | eax = rcx - 2; 0x00477970 cmp eax, 3 | | if (eax < 3) { 0x00477973 jae 0x4779d4 | 0x00477975 mov rbx, rdi | rbx = rdi; 0x00477978 mov dword [rsp + 0x10], esi | *((rsp + 0x10)) = esi; 0x0047797c mov dword [rsp + 0x14], edx | *((rsp + 0x14)) = edx; 0x00477980 cmp dword [r12 + 4], 2 | | if (*((r12 + 4)) == 2) { 0x00477986 je 0x477a26 | goto label_0; | } 0x0047798c mov rdi, r15 | 0x0047798f call 0x476980 | rax = BloombergLP::bdldfp::DecimalImpUtil::normalize(BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType64) (r15); 0x00477994 mov r15, rax | r15 = rax; 0x00477997 mov eax, dword [r12 + 4] | eax = *((r12 + 4)); 0x0047799c cmp eax, 2 | | if (eax == 2) { 0x0047799f je 0x477a26 | goto label_0; | } 0x004779a5 cmp eax, 1 | 0x004779a8 mov edx, dword [rsp + 0x14] | edx = *((rsp + 0x14)); 0x004779ac mov esi, dword [rsp + 0x10] | esi = *((rsp + 0x10)); | if (eax == 1) { 0x004779b0 je 0x477bd1 | goto label_1; | } 0x004779b6 test eax, eax | | if (eax != 0) { 0x004779b8 jne 0x477ba4 | goto label_2; | } 0x004779be mov rdi, rbx | 0x004779c1 mov esi, r13d | 0x004779c4 mov rdx, r15 | 0x004779c7 mov rcx, r12 | 0x004779ca call 0x478c90 | intBloombergLP::bdldfp::(anonymousnamespace)::formatScientific(char*,int,BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType64,BloombergLP::bdldfp::DecimalFormatConfigconst&) (rbx, r13d, r15, r12); 0x004779cf jmp 0x477be2 | goto label_3; | } 0x004779d4 test ecx, ecx | | if (ecx != 0) { 0x004779d6 je 0x477a93 | 0x004779dc cmp ecx, 1 | | if (ecx != 1) { 0x004779df jne 0x477ba4 | goto label_2; | } 0x004779e5 mov qword [rsp + 0x18], rdi | *((rsp + 0x18)) = rdi; 0x004779ea mov dword [rsp + 0x10], esi | *((rsp + 0x10)) = esi; 0x004779ee mov r15d, edx | r15d = edx; 0x004779f1 mov rbx, qword [r12 + 0x10] | rbx = *((r12 + 0x10)); 0x004779f6 mov rdi, rbx | 0x004779f9 call 0x4047b0 | rax = strlen (*((r12 + 0x10))); 0x004779fe mov r14, rax | r14 = rax; 0x00477a01 movsxd rax, r13d | rax = (int64_t) r13d; 0x00477a04 cmp r14, rax | | if (r14 <= rax) { 0x00477a07 jg 0x477a1e | 0x00477a09 test r14, r14 | | if (r14 == 0) { 0x00477a0c je 0x477a1e | goto label_4; | } 0x00477a0e mov rdi, qword [rsp + 0x18] | 0x00477a13 mov rsi, rbx | 0x00477a16 mov rdx, r14 | 0x00477a19 call 0x4049c0 | memmove (*((rsp + 0x18)), rbx, r14); | } | label_4: 0x00477a1e mov edx, r15d | edx = r15d; 0x00477a21 jmp 0x477ba0 | goto label_5; | label_0: 0x00477a26 mov rdi, r15 | rdi = r15; 0x00477a29 call 0x48a270 | _bid64_class (); 0x00477a2e movabs rax, 0x6000000000000000 | rax = 0x6000000000000000; 0x00477a38 mov rcx, r15 | rcx = r15; 0x00477a3b and rcx, rax | rcx &= rax; 0x00477a3e cmp rcx, rax | 0x00477a41 mov qword [rsp + 0x28], rbp | *((rsp + 0x28)) = rbp; | if (rcx == rax) { 0x00477a46 jne 0x477af1 | 0x00477a4c movabs rax, 0x7800000000000000 | rax = 0x7800000000000000; 0x00477a56 mov rcx, r15 | rcx = r15; 0x00477a59 and rcx, rax | rcx &= rax; 0x00477a5c movabs rdx, 0x7ffffffffffff | rdx = 0x7ffffffffffff; 0x00477a66 and rdx, r15 | rdx &= r15; 0x00477a69 mov rdi, r15 | rdi = r15; 0x00477a6c shr rdi, 0x33 | rdi >>= 0x33; 0x00477a70 and edi, 0x3ff | edi &= 0x3ff; 0x00477a76 lea esi, [rdi - 0x18e] | esi = rdi - 0x18e; 0x00477a7c cmp rcx, rax | 0x00477a7f movabs rax, 0x1fffffffffffff | rax = 0x1fffffffffffff; 0x00477a89 lea rcx, [rdx + rax + 1] | rcx = rdx + rax + 1; | if (rcx == rax) { 0x00477a8e cmove esi, edi | esi = edi; | } 0x00477a91 jmp 0x477b11 | | } else { 0x00477a93 mov qword [rsp + 0x18], rdi | *((rsp + 0x18)) = rdi; 0x00477a98 mov dword [rsp + 0x10], esi | *((rsp + 0x10)) = esi; 0x00477a9c mov dword [rsp + 0x14], edx | *((rsp + 0x14)) = edx; 0x00477aa0 mov rdi, r15 | rdi = r15; 0x00477aa3 call 0x48a270 | eax = _bid64_class (); 0x00477aa8 lea rcx, [r12 + 0x18] | rcx = r12 + 0x18; 0x00477aad add r12, 0x20 | r12 += 0x20; 0x00477ab1 cmp eax, 1 | | if (eax == 1) { 0x00477ab4 cmove r12, rcx | r12 = rcx; | } 0x00477ab8 mov rbx, qword [r12] | rbx = *(r12); 0x00477abc mov rdi, rbx | 0x00477abf call 0x4047b0 | rax = strlen (*(r12)); 0x00477ac4 mov r14, rax | r14 = rax; 0x00477ac7 movsxd rax, r13d | rax = (int64_t) r13d; 0x00477aca cmp r14, rax | | if (r14 > rax) { 0x00477acd jg 0x477b9c | goto label_6; | } 0x00477ad3 test r14, r14 | | if (r14 == 0) { 0x00477ad6 je 0x477b9c | goto label_6; | } 0x00477adc mov rdi, qword [rsp + 0x18] | 0x00477ae1 mov rsi, rbx | 0x00477ae4 mov rdx, r14 | 0x00477ae7 call 0x4049c0 | memmove (*((rsp + 0x18)), rbx, r14); 0x00477aec jmp 0x477b9c | goto label_6; | } 0x00477af1 mov rsi, r15 | rsi = r15; 0x00477af4 shr rsi, 0x35 | rsi >>= 0x35; 0x00477af8 and esi, 0x3ff | esi &= 0x3ff; 0x00477afe add esi, 0xfffffe72 | esi += 0xfffffe72; 0x00477b04 movabs rcx, 0x1fffffffffffff | rcx = 0x1fffffffffffff; 0x00477b0e and rcx, r15 | rcx &= r15; | } 0x00477b11 mov edi, 0xffffffff | edi = 0xffffffff; 0x00477b16 movabs rbp, 0xcccccccccccccccd | | do { 0x00477b20 mov rax, rcx | rax = rcx; 0x00477b23 mul rbp | rdx:rax = rax * rbp; 0x00477b26 shr rdx, 3 | rdx >>= 3; 0x00477b2a inc edi | edi++; 0x00477b2c cmp rcx, 9 | 0x00477b30 mov rcx, rdx | rcx = rdx; 0x00477b33 ja 0x477b20 | | } while (rcx > 9); 0x00477b35 movups xmm0, xmmword [r12] | __asm ("movups xmm0, xmmword [r12]"); 0x00477b3a movups xmm1, xmmword [r12 + 0x10] | __asm ("movups xmm1, xmmword [r12 + 0x10]"); 0x00477b40 movups xmm2, xmmword [r12 + 0x20] | __asm ("movups xmm2, xmmword [r12 + 0x20]"); 0x00477b46 movaps xmmword [rsp + 0x50], xmm2 | *((rsp + 0x50)) = xmm2; 0x00477b4b movaps xmmword [rsp + 0x40], xmm1 | *((rsp + 0x40)) = xmm1; 0x00477b50 movaps xmmword [rsp + 0x30], xmm0 | *((rsp + 0x30)) = xmm0; 0x00477b55 test esi, esi | | if (esi <= 0) { 0x00477b57 jg 0x477b7d | 0x00477b59 lea eax, [rsi + rdi + 1] | eax = rsi + rdi + 1; 0x00477b5d cmp eax, 0xfffffffb | | if (eax >= 0xfffffffb) { 0x00477b60 jl 0x477b7d | 0x00477b62 neg esi | esi = -esi; 0x00477b64 mov dword [rsp + 0x30], esi | *((rsp + 0x30)) = esi; 0x00477b68 lea rcx, [rsp + 0x30] | 0x00477b6d mov rdi, rbx | 0x00477b70 mov esi, r13d | 0x00477b73 mov rdx, r15 | 0x00477b76 call 0x478fe0 | intBloombergLP::bdldfp::(anonymousnamespace)::formatFixed(char*,int,BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType64,BloombergLP::bdldfp::DecimalFormatConfigconst&) (rbx, r13d, r15, rsp + 0x30); 0x00477b7b jmp 0x477b94 | | } | } else { 0x00477b7d mov dword [rsp + 0x30], edi | *((rsp + 0x30)) = edi; 0x00477b81 lea rcx, [rsp + 0x30] | 0x00477b86 mov rdi, rbx | 0x00477b89 mov esi, r13d | 0x00477b8c mov rdx, r15 | 0x00477b8f call 0x478c90 | eax = intBloombergLP::bdldfp::(anonymousnamespace)::formatScientific(char*,int,BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType64,BloombergLP::bdldfp::DecimalFormatConfigconst&) (rbx, r13d, r15, rsp + 0x30); | } 0x00477b94 mov r14d, eax | r14d = eax; 0x00477b97 mov rbp, qword [rsp + 0x28] | rbp = *((rsp + 0x28)); | label_6: 0x00477b9c mov edx, dword [rsp + 0x14] | edx = *((rsp + 0x14)); | label_5: 0x00477ba0 mov esi, dword [rsp + 0x10] | esi = *((rsp + 0x10)); | do { | label_2: 0x00477ba4 add r14d, edx | r14d += edx; 0x00477ba7 cmp r14d, dword [rsp + 0x24] | 0x00477bac setg al | al = (r14d > *((rsp + 0x24))) ? 1 : 0; 0x00477baf xor sil, 1 | sil ^= 1; 0x00477bb3 or sil, al | sil |= al; | if (sil == 0) { 0x00477bb6 jne 0x477bbf | 0x00477bb8 mov al, byte [rsp + 0xf] | al = *((rsp + 0xf)); 0x00477bbc mov byte [rbp], al | *(rbp) = al; | } 0x00477bbf mov eax, r14d | eax = r14d; 0x00477bc2 add rsp, 0x68 | 0x00477bc6 pop rbx | 0x00477bc7 pop r12 | 0x00477bc9 pop r13 | 0x00477bcb pop r14 | 0x00477bcd pop r15 | 0x00477bcf pop rbp | 0x00477bd0 ret | return rax; | label_1: 0x00477bd1 mov rdi, rbx | 0x00477bd4 mov esi, r13d | 0x00477bd7 mov rdx, r15 | 0x00477bda mov rcx, r12 | 0x00477bdd call 0x478fe0 | eax = intBloombergLP::bdldfp::(anonymousnamespace)::formatFixed(char*,int,BloombergLP::bdldfp::DecimalImpUtil_IntelDfp::ValueType64,BloombergLP::bdldfp::DecimalFormatConfigconst&) (rbx, r13d, r15, r12); | label_3: 0x00477be2 mov esi, dword [rsp + 0x10] | esi = *((rsp + 0x10)); 0x00477be6 mov edx, dword [rsp + 0x14] | edx = *((rsp + 0x14)); 0x00477bea mov r14d, eax | r14d = eax; 0x00477bed jmp 0x477ba4 | | } while (1); | }