; assembly | /* r2dec pseudo code output */ | /* bdlde_charconvertutf16.t/assume @ 0x42e600 */ | #include | ; (fcn) method.BloombergLP::bdlde::CharConvertUtf16.utf16ToUtf8_std::__1::basic_string_char__std::__1::char_traits_char___std::__1::allocator_char_____std::__1::basic_string_view_wchar_t__std::__1::char_traits_wchar_t____const__unsigned_long__char__BloombergL () | int64_t method_BloombergLP::bdlde::CharConvertUtf16_utf16ToUtf8_std::_1::basic_string_char_std::_1::char_traits_char_std::_1::allocator_char_std::_1::basic_string_view_wchar_t_std::_1::char_traits_wchar_t_const_unsigned_long_char_BloombergL (int64_t arg5, int64_t arg4, uint32_t arg3, int64_t arg2, int64_t arg1) { | r8 = arg5; | rcx = arg4; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* BloombergLP::bdlde::CharConvertUtf16::utf16ToUtf8(std::__1::basic_string, std::__1::allocator >*, std::__1::basic_string_view > const&, unsigned long*, char, BloombergLP::bdlde::ByteOrder::Enum) */ 0x0042e600 push rbp | 0x0042e601 push r15 | 0x0042e603 push r14 | 0x0042e605 push r13 | 0x0042e607 push r12 | 0x0042e609 push rbx | 0x0042e60a push rax | 0x0042e60b mov r13d, ecx | r13d = ecx; 0x0042e60e mov r14, rdx | r14 = rdx; 0x0042e611 mov r12, rdi | r12 = rdi; 0x0042e614 mov r15, qword [rsi] | r15 = *(rsi); 0x0042e617 mov rax, qword [rsi + 8] | rax = *((rsi + 8)); 0x0042e61b lea rbx, [r15 + rax*4] | rbx = r15 + rax*4; 0x0042e61f xor ebp, ebp | ebp = 0; 0x0042e621 test r8d, r8d | | if (r8d == 0) { 0x0042e624 je 0x42e6f5 | goto label_8; | } 0x0042e62a test rax, rax | | if (rax <= 0) { 0x0042e62d jle 0x42e6c5 | goto label_9; | } 0x0042e633 mov r8d, 0xfc0000 | r8d = 0xfc0000; 0x0042e639 mov rcx, r15 | rcx = r15; 0x0042e63c jmp 0x42e656 | goto label_10; | label_0: 0x0042e640 cmp edi, 0x800 | 0x0042e646 sbb rbp, 0 | 0x0042e64a add rbp, 3 | rbp += 3; | do { | label_2: 0x0042e64e mov rcx, rdx | rcx = rdx; 0x0042e651 cmp rdx, rbx | | if (rdx >= rbx) { 0x0042e654 jae 0x42e6c5 | goto label_9; | } | label_10: 0x0042e656 mov esi, dword [rcx] | esi = *(rcx); 0x0042e658 mov edx, esi | edx = *(rcx); 0x0042e65a shr edx, 0x18 | edx >>= 0x18; 0x0042e65d mov edi, esi | edi = esi; 0x0042e65f shr edi, 8 | edi >>= 8; 0x0042e662 and edi, 0xff00 | edi &= 0xff00; 0x0042e668 or edi, edx | edi |= edx; 0x0042e66a cmp edi, 0x7f | | if (edi > 0x7f) { 0x0042e66d ja 0x42e680 | goto label_11; | } 0x0042e66f add rcx, 4 | rcx += 4; 0x0042e673 inc rbp | rbp++; | label_1: 0x0042e676 mov rdx, rcx | rdx = rcx; 0x0042e679 jmp 0x42e64e | | } while (1); | label_11: 0x0042e680 mov eax, esi | eax = esi; 0x0042e682 and eax, 0xf80000 | eax &= 0xf80000; 0x0042e687 lea rdx, [rcx + 4] | rdx = rcx + 4; 0x0042e68b cmp eax, 0xd80000 | | if (eax != 0xd80000) { 0x0042e690 jne 0x42e640 | goto label_0; | } 0x0042e692 cmp rdx, rbx | | if (rdx < rbx) { 0x0042e695 jae 0x42e6c0 | 0x0042e697 and esi, 0xfc0000 | esi &= 0xfc0000; 0x0042e69d cmp esi, 0xd80000 | | if (esi != 0xd80000) { 0x0042e6a3 jne 0x42e6c0 | goto label_12; | } 0x0042e6a5 mov eax, dword [rdx] | eax = *(rdx); 0x0042e6a7 and eax, r8d | eax &= r8d; 0x0042e6aa cmp eax, 0xdc0000 | | if (eax != 0xdc0000) { 0x0042e6af jne 0x42e6c0 | goto label_12; | } 0x0042e6b1 add rcx, 8 | rcx += 8; 0x0042e6b5 add rbp, 4 | rbp += 4; 0x0042e6b9 jmp 0x42e676 | goto label_1; | } | label_12: 0x0042e6c0 inc rbp | rbp++; 0x0042e6c3 jmp 0x42e64e | goto label_2; | label_9: 0x0042e6c5 inc rbp | rbp++; 0x0042e6c8 mov al, byte [r12] | al = *(r12); 0x0042e6cc test al, 1 | | if ((al & 1) != 0) { 0x0042e6ce jne 0x42e79d | goto label_13; | } 0x0042e6d4 movzx ecx, al | ecx = (int32_t) al; 0x0042e6d7 shr rcx, 1 | rcx >>= 1; 0x0042e6da cmp rbp, rcx | | if (rbp > rcx) { 0x0042e6dd ja 0x42e7ab | goto label_14; | } | label_6: 0x0042e6e3 test al, 1 | | if ((al & 1) != 0) { 0x0042e6e5 jne 0x42e7c4 | goto label_15; | } | label_7: 0x0042e6eb lea rdi, [r12 + 1] | rdi = r12 + 1; 0x0042e6f0 jmp 0x42e7c9 | goto label_16; | label_8: 0x0042e6f5 test rax, rax | | if (rax <= 0) { 0x0042e6f8 jle 0x42e785 | goto label_17; | } 0x0042e6fe mov eax, 0xfc00 | eax = 0xfc00; 0x0042e703 mov rcx, r15 | rcx = r15; 0x0042e706 jmp 0x42e726 | goto label_18; | label_3: 0x0042e710 cmp esi, 0x800 | 0x0042e716 sbb rbp, 0 | 0x0042e71a add rbp, 3 | rbp += 3; | do { | label_5: 0x0042e71e mov rcx, rdx | rcx = rdx; 0x0042e721 cmp rdx, rbx | | if (rdx >= rbx) { 0x0042e724 jae 0x42e785 | goto label_17; | } | label_18: 0x0042e726 mov esi, dword [rcx] | esi = *(rcx); 0x0042e728 cmp esi, 0x7f | | if (esi > 0x7f) { 0x0042e72b ja 0x42e740 | goto label_19; | } 0x0042e72d add rcx, 4 | rcx += 4; 0x0042e731 inc rbp | rbp++; | label_4: 0x0042e734 mov rdx, rcx | rdx = rcx; 0x0042e737 jmp 0x42e71e | | } while (1); | label_19: 0x0042e740 mov edi, esi | edi = esi; 0x0042e742 and edi, 0xf800 | edi &= 0xf800; 0x0042e748 lea rdx, [rcx + 4] | rdx = rcx + 4; 0x0042e74c cmp edi, 0xd800 | | if (edi != 0xd800) { 0x0042e752 jne 0x42e710 | goto label_3; | } 0x0042e754 cmp rdx, rbx | | if (rdx < rbx) { 0x0042e757 jae 0x42e780 | 0x0042e759 and esi, 0xfc00 | esi &= 0xfc00; 0x0042e75f cmp esi, 0xd800 | | if (esi != 0xd800) { 0x0042e765 jne 0x42e780 | goto label_20; | } 0x0042e767 mov esi, dword [rdx] | esi = *(rdx); 0x0042e769 and esi, eax | esi &= eax; 0x0042e76b cmp esi, 0xdc00 | | if (esi != 0xdc00) { 0x0042e771 jne 0x42e780 | goto label_20; | } 0x0042e773 add rcx, 8 | rcx += 8; 0x0042e777 add rbp, 4 | rbp += 4; 0x0042e77b jmp 0x42e734 | goto label_4; | } | label_20: 0x0042e780 inc rbp | rbp++; 0x0042e783 jmp 0x42e71e | goto label_5; | label_17: 0x0042e785 inc rbp | rbp++; 0x0042e788 mov al, byte [r12] | al = *(r12); 0x0042e78c test al, 1 | | if ((al & 1) != 0) { 0x0042e78e jne 0x42e7e0 | goto label_21; | } 0x0042e790 movzx ecx, al | ecx = (int32_t) al; 0x0042e793 shr rcx, 1 | rcx >>= 1; 0x0042e796 cmp rbp, rcx | | if (rbp > rcx) { 0x0042e799 ja 0x42e7ea | goto label_22; | } 0x0042e79b jmp 0x42e7fb | goto label_23; | label_13: 0x0042e79d mov rcx, qword [r12 + 8] | rcx = *((r12 + 8)); 0x0042e7a2 cmp rbp, rcx | | if (rbp <= rcx) { 0x0042e7a5 jbe 0x42e6e3 | goto label_6; | } | label_14: 0x0042e7ab mov rdi, r12 | rdi = r12; 0x0042e7ae mov rsi, rbp | rsi = rbp; 0x0042e7b1 xor edx, edx | edx = 0; 0x0042e7b3 call 0x403a30 | std::_1::basic_string,std::_1::allocator>::resize(unsigned long,char) (); 0x0042e7b8 mov al, byte [r12] | al = *(r12); 0x0042e7bc test al, 1 | | if ((al & 1) == 0) { 0x0042e7be je 0x42e6eb | goto label_7; | } | label_15: 0x0042e7c4 mov rdi, qword [r12 + 0x10] | rdi = *((r12 + 0x10)); | label_16: 0x0042e7c9 movsx r9d, r13b | r9d = (int32_t) r13b; 0x0042e7cd mov r8, rsp | r8 = rsp; 0x0042e7d0 mov rsi, r15 | rsi = r15; 0x0042e7d3 mov rdx, rbx | rdx = rbx; 0x0042e7d6 mov rcx, r14 | rcx = r14; 0x0042e7d9 call 0x4335a0 | int(anonymousnamespace)::localUtf16ToUtf8,(anonymousnamespace)::Swapper>(char*,(anonymousnamespace)::NoOpCapacity,wchar_tconst*,(anonymousnamespace)::Utf16::PtrBasedEnd,(anonymousnamespace)::Swapper,unsigned long*,unsigned long*,char) (); 0x0042e7de jmp 0x42e820 | goto label_24; | label_21: 0x0042e7e0 mov rcx, qword [r12 + 8] | rcx = *((r12 + 8)); 0x0042e7e5 cmp rbp, rcx | | if (rbp > rcx) { 0x0042e7e8 jbe 0x42e7fb | | label_22: 0x0042e7ea mov rdi, r12 | rdi = r12; 0x0042e7ed mov rsi, rbp | rsi = rbp; 0x0042e7f0 xor edx, edx | edx = 0; 0x0042e7f2 call 0x403a30 | std::_1::basic_string,std::_1::allocator>::resize(unsigned long,char) (); 0x0042e7f7 mov al, byte [r12] | al = *(r12); | } | label_23: 0x0042e7fb test al, 1 | | if ((al & 1) == 0) { 0x0042e7fd jne 0x42e806 | 0x0042e7ff lea rdi, [r12 + 1] | rdi = r12 + 1; 0x0042e804 jmp 0x42e80b | | } else { 0x0042e806 mov rdi, qword [r12 + 0x10] | rdi = *((r12 + 0x10)); | } 0x0042e80b movsx r9d, r13b | r9d = (int32_t) r13b; 0x0042e80f mov r8, rsp | r8 = rsp; 0x0042e812 mov rsi, r15 | rsi = r15; 0x0042e815 mov rdx, rbx | rdx = rbx; 0x0042e818 mov rcx, r14 | rcx = r14; 0x0042e81b call 0x433410 | eax = int(anonymousnamespace)::localUtf16ToUtf8,(anonymousnamespace)::NoOpSwapper>(char*,(anonymousnamespace)::NoOpCapacity,wchar_tconst*,(anonymousnamespace)::Utf16::PtrBasedEnd,(anonymousnamespace)::NoOpSwapper,unsigned long*,unsigned long*,char) (); | label_24: 0x0042e820 mov ebx, eax | ebx = eax; 0x0042e822 mov rsi, qword [rsp] | rsi = *(rsp); 0x0042e826 cmp rsi, rbp | 0x0042e829 dec rsi | rsi--; 0x0042e82c mov rdi, r12 | rdi = r12; 0x0042e82f xor edx, edx | edx = 0; 0x0042e831 call 0x403a30 | std::_1::basic_string,std::_1::allocator>::resize(unsigned long,char) (); 0x0042e836 mov eax, ebx | eax = ebx; 0x0042e838 add rsp, 8 | 0x0042e83c pop rbx | 0x0042e83d pop r12 | 0x0042e83f pop r13 | 0x0042e841 pop r14 | 0x0042e843 pop r15 | 0x0042e845 pop rbp | 0x0042e846 ret | return rax; | }