; assembly | /* r2dec pseudo code output */ | /* bdlde_charconvertutf16.t/none @ 0x42e280 */ | #include | ; (fcn) method.BloombergLP::bdlde::CharConvertUtf16.utf16ToUtf8_bsl::basic_string_char__std::__1::char_traits_char___bsl::allocator_char_____std::__1::basic_string_view_wchar_t__std::__1::char_traits_wchar_t____const__unsigned_long__char__BloombergLP::bdlde:: () | int64_t method_BloombergLP::bdlde::CharConvertUtf16_utf16ToUtf8_bsl::basic_string_char_std::_1::char_traits_char_bsl::allocator_char_std::_1::basic_string_view_wchar_t_std::_1::char_traits_wchar_t_const_unsigned_long_char_BloombergLP::bdlde:: (int64_t arg5, uint32_t arg4, uint32_t arg3, uint32_t arg2, char * arg1) { | r8 = arg5; | rcx = arg4; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* BloombergLP::bdlde::CharConvertUtf16::utf16ToUtf8(bsl::basic_string, bsl::allocator >*, std::__1::basic_string_view > const&, unsigned long*, char, BloombergLP::bdlde::ByteOrder::Enum) */ 0x0042e280 push rbp | 0x0042e281 push r15 | 0x0042e283 push r14 | 0x0042e285 push r13 | 0x0042e287 push r12 | 0x0042e289 push rbx | 0x0042e28a push rax | 0x0042e28b mov r13d, ecx | r13d = ecx; 0x0042e28e mov r14, rdx | r14 = rdx; 0x0042e291 mov r12, rdi | r12 = rdi; 0x0042e294 mov r15, qword [rsi] | r15 = *(rsi); 0x0042e297 mov rax, qword [rsi + 8] | rax = *((rsi + 8)); 0x0042e29b lea rbx, [r15 + rax*4] | rbx = r15 + rax*4; 0x0042e29f xor esi, esi | esi = 0; 0x0042e2a1 test r8d, r8d | | if (r8d == 0) { 0x0042e2a4 je 0x42e372 | goto label_6; | } 0x0042e2aa test rax, rax | | if (rax <= 0) { 0x0042e2ad jle 0x42e340 | goto label_7; | } 0x0042e2b3 mov r8d, 0xfc0000 | r8d = 0xfc0000; 0x0042e2b9 mov rcx, r15 | rcx = r15; 0x0042e2bc jmp 0x42e2d6 | goto label_8; | label_0: 0x0042e2c0 cmp edi, 0x800 | 0x0042e2c6 sbb rsi, 0 | 0x0042e2ca add rsi, 3 | rsi += 3; | do { | label_2: 0x0042e2ce mov rcx, rdx | rcx = rdx; 0x0042e2d1 cmp rdx, rbx | | if (rdx >= rbx) { 0x0042e2d4 jae 0x42e340 | goto label_7; | } | label_8: 0x0042e2d6 mov ebp, dword [rcx] | ebp = *(rcx); 0x0042e2d8 mov edx, ebp | edx = *(rcx); 0x0042e2da shr edx, 0x18 | edx >>= 0x18; 0x0042e2dd mov edi, ebp | edi = ebp; 0x0042e2df shr edi, 8 | edi >>= 8; 0x0042e2e2 and edi, 0xff00 | edi &= 0xff00; 0x0042e2e8 or edi, edx | edi |= edx; 0x0042e2ea cmp edi, 0x7f | | if (edi > 0x7f) { 0x0042e2ed ja 0x42e300 | goto label_9; | } 0x0042e2ef add rcx, 4 | rcx += 4; 0x0042e2f3 inc rsi | rsi++; | label_1: 0x0042e2f6 mov rdx, rcx | rdx = rcx; 0x0042e2f9 jmp 0x42e2ce | | } while (1); | label_9: 0x0042e300 mov eax, ebp | eax = ebp; 0x0042e302 and eax, 0xf80000 | eax &= 0xf80000; 0x0042e307 lea rdx, [rcx + 4] | rdx = rcx + 4; 0x0042e30b cmp eax, 0xd80000 | | if (eax != 0xd80000) { 0x0042e310 jne 0x42e2c0 | goto label_0; | } 0x0042e312 cmp rdx, rbx | | if (rdx < rbx) { 0x0042e315 jae 0x42e33b | 0x0042e317 and ebp, 0xfc0000 | ebp &= 0xfc0000; 0x0042e31d cmp ebp, 0xd80000 | | if (ebp != 0xd80000) { 0x0042e323 jne 0x42e33b | goto label_10; | } 0x0042e325 mov eax, dword [rdx] | eax = *(rdx); 0x0042e327 and eax, r8d | eax &= r8d; 0x0042e32a cmp eax, 0xdc0000 | | if (eax != 0xdc0000) { 0x0042e32f jne 0x42e33b | goto label_10; | } 0x0042e331 add rcx, 8 | rcx += 8; 0x0042e335 add rsi, 4 | rsi += 4; 0x0042e339 jmp 0x42e2f6 | goto label_1; | } | label_10: 0x0042e33b inc rsi | rsi++; 0x0042e33e jmp 0x42e2ce | goto label_2; | label_7: 0x0042e340 inc rsi | rsi++; 0x0042e343 cmp rsi, qword [r12 + 0x18] | | if (rsi > *((r12 + 0x18))) { 0x0042e348 jbe 0x42e35e | 0x0042e34a cmp rsi, 0xffffffffffffffff | | if (rsi == -1) { 0x0042e34e je 0x42e486 | goto label_11; | } 0x0042e354 mov rdi, r12 | 0x0042e357 xor edx, edx | 0x0042e359 call 0x437b80 | rax = bsl::basic_string,bsl::allocator>::privateResizeRaw(unsigned long,char) (r12, rsi, 0); | } 0x0042e35e cmp qword [r12 + 0x20], 0x17 | | if (*((r12 + 0x20)) != 0x17) { 0x0042e364 jne 0x42e429 | goto label_12; | } 0x0042e36a mov rdi, r12 | rdi = r12; 0x0042e36d jmp 0x42e42d | goto label_13; | label_6: 0x0042e372 test rax, rax | | if (rax <= 0) { 0x0042e375 jle 0x42e402 | goto label_14; | } 0x0042e37b mov eax, 0xfc00 | eax = 0xfc00; 0x0042e380 mov rcx, r15 | rcx = r15; 0x0042e383 jmp 0x42e3a6 | goto label_15; | label_3: 0x0042e390 cmp edi, 0x800 | 0x0042e396 sbb rsi, 0 | 0x0042e39a add rsi, 3 | rsi += 3; | do { | label_5: 0x0042e39e mov rcx, rdx | rcx = rdx; 0x0042e3a1 cmp rdx, rbx | | if (rdx >= rbx) { 0x0042e3a4 jae 0x42e402 | goto label_14; | } | label_15: 0x0042e3a6 mov edi, dword [rcx] | edi = *(rcx); 0x0042e3a8 cmp edi, 0x7f | | if (edi > 0x7f) { 0x0042e3ab ja 0x42e3c0 | goto label_16; | } 0x0042e3ad add rcx, 4 | rcx += 4; 0x0042e3b1 inc rsi | rsi++; | label_4: 0x0042e3b4 mov rdx, rcx | rdx = rcx; 0x0042e3b7 jmp 0x42e39e | | } while (1); | label_16: 0x0042e3c0 mov ebp, edi | 0x0042e3c2 and ebp, 0xf800 | ebp &= 0xf800; 0x0042e3c8 lea rdx, [rcx + 4] | rdx = rcx + 4; 0x0042e3cc cmp ebp, 0xd800 | | if (ebp != 0xd800) { 0x0042e3d2 jne 0x42e390 | goto label_3; | } 0x0042e3d4 cmp rdx, rbx | | if (rdx < rbx) { 0x0042e3d7 jae 0x42e3fd | 0x0042e3d9 and edi, 0xfc00 | edi &= 0xfc00; 0x0042e3df cmp edi, 0xd800 | | if (edi != 0xd800) { 0x0042e3e5 jne 0x42e3fd | goto label_17; | } 0x0042e3e7 mov edi, dword [rdx] | edi = *(rdx); 0x0042e3e9 and edi, eax | edi &= eax; 0x0042e3eb cmp edi, 0xdc00 | | if (edi != 0xdc00) { 0x0042e3f1 jne 0x42e3fd | goto label_17; | } 0x0042e3f3 add rcx, 8 | rcx += 8; 0x0042e3f7 add rsi, 4 | rsi += 4; 0x0042e3fb jmp 0x42e3b4 | goto label_4; | } | label_17: 0x0042e3fd inc rsi | rsi++; 0x0042e400 jmp 0x42e39e | goto label_5; | label_14: 0x0042e402 inc rsi | rsi++; 0x0042e405 cmp rsi, qword [r12 + 0x18] | | if (rsi > *((r12 + 0x18))) { 0x0042e40a jbe 0x42e41c | 0x0042e40c cmp rsi, 0xffffffffffffffff | | if (rsi == -1) { 0x0042e410 je 0x42e486 | goto label_11; | } 0x0042e412 mov rdi, r12 | 0x0042e415 xor edx, edx | 0x0042e417 call 0x437b80 | bsl::basic_string,bsl::allocator>::privateResizeRaw(unsigned long,char) (r12, rsi, 0); | } 0x0042e41c cmp qword [r12 + 0x20], 0x17 | | if (*((r12 + 0x20)) == 0x17) { 0x0042e422 jne 0x42e444 | 0x0042e424 mov rdi, r12 | rdi = r12; 0x0042e427 jmp 0x42e448 | goto label_18; | label_12: 0x0042e429 mov rdi, qword [r12] | rdi = *(r12); | label_13: 0x0042e42d movsx r9d, r13b | r9d = (int32_t) r13b; 0x0042e431 mov r8, rsp | r8 = rsp; 0x0042e434 mov rsi, r15 | rsi = r15; 0x0042e437 mov rdx, rbx | rdx = rbx; 0x0042e43a mov rcx, r14 | rcx = r14; 0x0042e43d call 0x433380 | int(anonymousnamespace)::localUtf16ToUtf8,(anonymousnamespace)::Swapper>(char*,(anonymousnamespace)::NoOpCapacity,wchar_tconst*,(anonymousnamespace)::Utf16::PtrBasedEnd,(anonymousnamespace)::Swapper,unsigned long*,unsigned long*,char) (); 0x0042e442 jmp 0x42e45d | | } else { 0x0042e444 mov rdi, qword [r12] | rdi = *(r12); | label_18: 0x0042e448 movsx r9d, r13b | r9d = (int32_t) r13b; 0x0042e44c mov r8, rsp | r8 = rsp; 0x0042e44f mov rsi, r15 | rsi = r15; 0x0042e452 mov rdx, rbx | rdx = rbx; 0x0042e455 mov rcx, r14 | rcx = r14; 0x0042e458 call 0x4331f0 | eax = int(anonymousnamespace)::localUtf16ToUtf8,(anonymousnamespace)::NoOpSwapper>(char*,(anonymousnamespace)::NoOpCapacity,wchar_tconst*,(anonymousnamespace)::Utf16::PtrBasedEnd,(anonymousnamespace)::NoOpSwapper,unsigned long*,unsigned long*,char) (); | } 0x0042e45d mov rsi, qword [rsp] | rsi = *(rsp); 0x0042e461 test rsi, rsi | | if (rsi != 0) { 0x0042e464 je 0x42e486 | 0x0042e466 mov ebx, eax | ebx = eax; 0x0042e468 dec rsi | rsi--; 0x0042e46b mov rdi, r12 | 0x0042e46e xor edx, edx | 0x0042e470 call 0x437b80 | bsl::basic_string,bsl::allocator>::privateResizeRaw(unsigned long,char) (r12, rsi, 0); 0x0042e475 mov eax, ebx | eax = ebx; 0x0042e477 add rsp, 8 | 0x0042e47b pop rbx | 0x0042e47c pop r12 | 0x0042e47e pop r13 | 0x0042e480 pop r14 | 0x0042e482 pop r15 | 0x0042e484 pop rbp | 0x0042e485 ret | return rax; | } | label_11: 0x0042e486 mov edi, 0x45f3de | 0x0042e48b call 0x435240 | return BloombergLP::bslstl::StdExceptUtil::throwLengthError(char const*) ("string<...>::resize(n): string too long"); | }