; assembly | /* r2dec pseudo code output */ | /* bdlde_charconvertutf16.t/none @ 0x42e8d0 */ | #include | ; (fcn) method.BloombergLP::bdlde::CharConvertUtf16.utf16ToUtf8_std::__1::basic_string_char__std::__1::char_traits_char___std::__1::allocator_char_____wchar_t_const__unsigned_long__char__BloombergLP::bdlde::ByteOrder::Enum_ () | int32_t method_BloombergLP::bdlde::CharConvertUtf16_utf16ToUtf8_std::_1::basic_string_char_std::_1::char_traits_char_std::_1::allocator_char_wchar_t_const_unsigned_long_char_BloombergLP::bdlde::ByteOrder::Enum_ (int64_t arg5, int64_t arg4, int64_t arg3, int64_t arg2, int64_t arg1) { | int64_t var_8h; | r8 = arg5; | rcx = arg4; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* BloombergLP::bdlde::CharConvertUtf16::utf16ToUtf8(std::__1::basic_string, std::__1::allocator >*, wchar_t const*, unsigned long*, char, BloombergLP::bdlde::ByteOrder::Enum) */ 0x0042e8d0 push rbp | 0x0042e8d1 push r15 | 0x0042e8d3 push r14 | 0x0042e8d5 push r12 | 0x0042e8d7 push rbx | 0x0042e8d8 sub rsp, 0x10 | 0x0042e8dc mov r12d, ecx | r12d = ecx; 0x0042e8df mov r14, rdx | r14 = rdx; 0x0042e8e2 mov r15, rsi | r15 = rsi; 0x0042e8e5 mov rbx, rdi | rbx = rdi; 0x0042e8e8 mov ebp, dword [rsi] | ebp = *(rsi); 0x0042e8ea xor esi, esi | esi = 0; 0x0042e8ec test r8d, r8d | | if (r8d == 0) { 0x0042e8ef je 0x42e9ba | goto label_6; | } 0x0042e8f5 test ebp, ebp | | if (ebp == 0) { 0x0042e8f7 je 0x42e98d | goto label_7; | } 0x0042e8fd mov r8d, 0xfc0000 | r8d = 0xfc0000; 0x0042e903 mov rdx, r15 | rdx = r15; 0x0042e906 jmp 0x42e926 | goto label_8; | label_0: 0x0042e910 cmp eax, 0x800 | 0x0042e915 sbb rsi, 0 | 0x0042e919 add rsi, 3 | rsi += 3; | do { | label_2: 0x0042e91d mov ebp, dword [rdi] | ebp = *(rdi); 0x0042e91f mov rdx, rdi | rdx = rdi; 0x0042e922 test ebp, ebp | | if (ebp == 0) { 0x0042e924 je 0x42e98d | goto label_7; | } | label_8: 0x0042e926 mov edi, ebp | edi = ebp; 0x0042e928 shr edi, 0x18 | edi >>= 0x18; 0x0042e92b mov eax, ebp | eax = ebp; 0x0042e92d shr eax, 8 | eax >>= 8; 0x0042e930 and eax, 0xff00 | eax &= 0xff00; 0x0042e935 or eax, edi | eax |= edi; 0x0042e937 cmp eax, 0x7f | | if (eax > 0x7f) { 0x0042e93a ja 0x42e950 | goto label_9; | } 0x0042e93c add rdx, 4 | rdx += 4; 0x0042e940 inc rsi | rsi++; | label_1: 0x0042e943 mov rdi, rdx | rdi = rdx; 0x0042e946 jmp 0x42e91d | | } while (1); | label_9: 0x0042e950 mov ecx, ebp | ecx = ebp; 0x0042e952 and ecx, 0xf80000 | ecx &= 0xf80000; 0x0042e958 lea rdi, [rdx + 4] | rdi = rdx + 4; 0x0042e95c cmp ecx, 0xd80000 | | if (ecx != 0xd80000) { 0x0042e962 jne 0x42e910 | goto label_0; | } 0x0042e964 and ebp, 0xfc0000 | ebp &= 0xfc0000; 0x0042e96a cmp ebp, 0xd80000 | | if (ebp == 0xd80000) { 0x0042e970 jne 0x42e988 | 0x0042e972 mov eax, dword [rdi] | eax = *(rdi); 0x0042e974 and eax, r8d | eax &= r8d; 0x0042e977 cmp eax, 0xdc0000 | | if (eax != 0xdc0000) { 0x0042e97c jne 0x42e988 | goto label_10; | } 0x0042e97e add rdx, 8 | rdx += 8; 0x0042e982 add rsi, 4 | rsi += 4; 0x0042e986 jmp 0x42e943 | goto label_1; | } | label_10: 0x0042e988 inc rsi | rsi++; 0x0042e98b jmp 0x42e91d | goto label_2; | label_7: 0x0042e98d inc rsi | rsi++; 0x0042e990 mov al, byte [rbx] | al = *(rbx); 0x0042e992 test al, 1 | | if ((al & 1) != 0) { 0x0042e994 jne 0x42ea60 | goto label_11; | } 0x0042e99a movzx ecx, al | ecx = (int32_t) al; 0x0042e99d shr rcx, 1 | rcx >>= 1; 0x0042e9a0 cmp rsi, rcx | | if (rsi > rcx) { 0x0042e9a3 ja 0x42ea6d | goto label_12; | } | label_4: 0x0042e9a9 test al, 1 | | if ((al & 1) != 0) { 0x0042e9ab jne 0x42ea81 | goto label_13; | } | label_5: 0x0042e9b1 lea rdi, [rbx + 1] | rdi = rbx + 1; 0x0042e9b5 jmp 0x42ea85 | goto label_14; | label_6: 0x0042e9ba test ebp, ebp | | if (ebp == 0) { 0x0042e9bc je 0x42ea4a | goto label_15; | } 0x0042e9c2 mov ecx, 0xfc00 | ecx = 0xfc00; 0x0042e9c7 mov rdx, r15 | rdx = r15; 0x0042e9ca jmp 0x42e9e7 | | while (eax != 0xd800) { 0x0042e9d0 cmp ebp, 0x800 | 0x0042e9d6 sbb rsi, 0 | 0x0042e9da add rsi, 3 | rsi += 3; | label_3: 0x0042e9de mov ebp, dword [rdi] | ebp = *(rdi); 0x0042e9e0 mov rdx, rdi | rdx = rdi; 0x0042e9e3 test ebp, ebp | | if (ebp == 0) { 0x0042e9e5 je 0x42ea4a | goto label_15; | } 0x0042e9e7 cmp ebp, 0x7f | | if (ebp <= 0x7f) { 0x0042e9ea ja 0x42ea00 | 0x0042e9ec add rdx, 4 | rdx += 4; 0x0042e9f0 inc rsi | rsi++; 0x0042e9f3 jmp 0x42ea40 | goto label_16; | } 0x0042ea00 mov eax, ebp | eax = ebp; 0x0042ea02 and eax, 0xf800 | eax &= 0xf800; 0x0042ea07 lea rdi, [rdx + 4] | rdi = rdx + 4; 0x0042ea0b cmp eax, 0xd800 | 0x0042ea10 jne 0x42e9d0 | | } 0x0042ea12 and ebp, 0xfc00 | ebp &= 0xfc00; 0x0042ea18 cmp ebp, 0xd800 | | if (ebp == 0xd800) { 0x0042ea1e jne 0x42ea45 | 0x0042ea20 mov eax, dword [rdi] | eax = *(rdi); 0x0042ea22 and eax, ecx | eax &= ecx; 0x0042ea24 cmp eax, 0xdc00 | | if (eax != 0xdc00) { 0x0042ea29 jne 0x42ea45 | goto label_17; | } 0x0042ea2b add rdx, 8 | rdx += 8; 0x0042ea2f add rsi, 4 | rsi += 4; 0x0042ea33 nop word cs:[rax + rax] | 0x0042ea3d nop dword [rax] | | label_16: 0x0042ea40 mov rdi, rdx | rdi = rdx; 0x0042ea43 jmp 0x42e9de | goto label_3; | } | label_17: 0x0042ea45 inc rsi | rsi++; 0x0042ea48 jmp 0x42e9de | goto label_3; | label_15: 0x0042ea4a inc rsi | rsi++; 0x0042ea4d mov al, byte [rbx] | al = *(rbx); 0x0042ea4f test al, 1 | | if ((al & 1) != 0) { 0x0042ea51 jne 0x42ea9b | goto label_18; | } 0x0042ea53 movzx ecx, al | ecx = (int32_t) al; 0x0042ea56 shr rcx, 1 | rcx >>= 1; 0x0042ea59 cmp rsi, rcx | | if (rsi > rcx) { 0x0042ea5c ja 0x42eaa4 | goto label_19; | } 0x0042ea5e jmp 0x42eab0 | goto label_20; | label_11: 0x0042ea60 mov rcx, qword [rbx + 8] | rcx = *((rbx + 8)); 0x0042ea64 cmp rsi, rcx | | if (rsi <= rcx) { 0x0042ea67 jbe 0x42e9a9 | goto label_4; | } | label_12: 0x0042ea6d mov rdi, rbx | rdi = rbx; 0x0042ea70 xor edx, edx | edx = 0; 0x0042ea72 call 0x403a30 | std::_1::basic_string,std::_1::allocator>::resize(unsigned long,char) (); 0x0042ea77 mov al, byte [rbx] | al = *(rbx); 0x0042ea79 test al, 1 | | if ((al & 1) == 0) { 0x0042ea7b je 0x42e9b1 | goto label_5; | } | label_13: 0x0042ea81 mov rdi, qword [rbx + 0x10] | rdi = *((rbx + 0x10)); | label_14: 0x0042ea85 movsx r8d, r12b | r8d = (int32_t) r12b; 0x0042ea89 lea rcx, [rsp + 8] | rcx = rsp + 8; 0x0042ea8e mov rsi, r15 | rsi = r15; 0x0042ea91 mov rdx, r14 | rdx = r14; 0x0042ea94 call 0x4336e0 | int(anonymousnamespace)::localUtf16ToUtf8,(anonymousnamespace)::Swapper>(char*,(anonymousnamespace)::NoOpCapacity,wchar_tconst*,(anonymousnamespace)::Utf16::ZeroBasedEnd,(anonymousnamespace)::Swapper,unsigned long*,unsigned long*,char) (); 0x0042ea99 jmp 0x42ead2 | goto label_21; | label_18: 0x0042ea9b mov rcx, qword [rbx + 8] | rcx = *((rbx + 8)); 0x0042ea9f cmp rsi, rcx | | if (rsi > rcx) { 0x0042eaa2 jbe 0x42eab0 | | label_19: 0x0042eaa4 mov rdi, rbx | rdi = rbx; 0x0042eaa7 xor edx, edx | edx = 0; 0x0042eaa9 call 0x403a30 | std::_1::basic_string,std::_1::allocator>::resize(unsigned long,char) (); 0x0042eaae mov al, byte [rbx] | al = *(rbx); | } | label_20: 0x0042eab0 test al, 1 | | if ((al & 1) == 0) { 0x0042eab2 jne 0x42eaba | 0x0042eab4 lea rdi, [rbx + 1] | rdi = rbx + 1; 0x0042eab8 jmp 0x42eabe | | } else { 0x0042eaba mov rdi, qword [rbx + 0x10] | rdi = *((rbx + 0x10)); | } 0x0042eabe movsx r8d, r12b | r8d = (int32_t) r12b; 0x0042eac2 lea rcx, [rsp + 8] | rcx = rsp + 8; 0x0042eac7 mov rsi, r15 | rsi = r15; 0x0042eaca mov rdx, r14 | rdx = r14; 0x0042eacd call 0x433530 | eax = int(anonymousnamespace)::localUtf16ToUtf8,(anonymousnamespace)::NoOpSwapper>(char*,(anonymousnamespace)::NoOpCapacity,wchar_tconst*,(anonymousnamespace)::Utf16::ZeroBasedEnd,(anonymousnamespace)::NoOpSwapper,unsigned long*,unsigned long*,char) (); | label_21: 0x0042ead2 mov ebp, eax | 0x0042ead4 mov rsi, qword [rsp + 8] | rsi = *((rsp + 8)); 0x0042ead9 dec rsi | rsi--; 0x0042eadc mov rdi, rbx | rdi = rbx; 0x0042eadf xor edx, edx | edx = 0; 0x0042eae1 call 0x403a30 | std::_1::basic_string,std::_1::allocator>::resize(unsigned long,char) (); 0x0042eae6 mov eax, ebp | eax = ebp; 0x0042eae8 add rsp, 0x10 | 0x0042eaec pop rbx | 0x0042eaed pop r12 | 0x0042eaef pop r14 | 0x0042eaf1 pop r15 | 0x0042eaf3 pop rbp | 0x0042eaf4 ret | return eax; | }