; assembly | /* r2dec pseudo code output */ | /* bdlde_charconvertutf16.t/none @ 0x42dc30 */ | #include | | uint16_t rotate_left16 (uint16_t value, uint32_t count) { | const uint16_t mask = (CHAR_BIT * sizeof (value)) - 1; | count &= mask; | return (value << count) | (value >> (-count & mask)); | } | ; (fcn) method.BloombergLP::bdlde::CharConvertUtf16.utf16ToUtf8_std::__1::basic_string_char__std::__1::char_traits_char___std::__1::allocator_char_____unsigned_short_const__unsigned_long__char__BloombergLP::bdlde::ByteOrder::Enum_ () | uint32_t method_BloombergLP::bdlde::CharConvertUtf16_utf16ToUtf8_std::_1::basic_string_char_std::_1::char_traits_char_std::_1::allocator_char_unsigned_short_const_unsigned_long_char_BloombergLP::bdlde::ByteOrder::Enum_ (int64_t arg5, int64_t arg4, int64_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 >*, unsigned short const*, unsigned long*, char, BloombergLP::bdlde::ByteOrder::Enum) */ 0x0042dc30 push rbp | 0x0042dc31 push r15 | 0x0042dc33 push r14 | 0x0042dc35 push rbx | 0x0042dc36 push rax | 0x0042dc37 mov ebp, ecx | 0x0042dc39 mov r14, rdx | r14 = rdx; 0x0042dc3c mov r15, rsi | r15 = rsi; 0x0042dc3f mov rbx, rdi | rbx = rdi; 0x0042dc42 movzx eax, word [rsi] | eax = *(rsi); 0x0042dc45 xor esi, esi | esi = 0; 0x0042dc47 test r8d, r8d | | if (r8d == 0) { 0x0042dc4a je 0x42dd01 | goto label_6; | } 0x0042dc50 test ax, ax | | if (ax == 0) { 0x0042dc53 je 0x42dcd4 | goto label_7; | } 0x0042dc59 mov rcx, r15 | rcx = r15; 0x0042dc5c jmp 0x42dc78 | goto label_8; | label_0: 0x0042dc60 cmp eax, 0x800 | 0x0042dc65 sbb rsi, 0 | 0x0042dc69 add rsi, 3 | rsi += 3; | do { | label_2: 0x0042dc6d movzx eax, word [rdx] | eax = *(rdx); 0x0042dc70 mov rcx, rdx | rcx = rdx; 0x0042dc73 test ax, ax | | if (ax == 0) { 0x0042dc76 je 0x42dcd4 | goto label_7; | } | label_8: 0x0042dc78 rol ax, 8 | ax = rotate_left16 (ax, 8); 0x0042dc7c cmp ax, 0x7f | | if (ax > 0x7f) { 0x0042dc80 ja 0x42dc90 | goto label_9; | } 0x0042dc82 add rcx, 2 | rcx += 2; 0x0042dc86 inc rsi | rsi++; | label_1: 0x0042dc89 mov rdx, rcx | rdx = rcx; 0x0042dc8c jmp 0x42dc6d | | } while (1); | label_9: 0x0042dc90 movzx eax, ax | eax = (int32_t) ax; 0x0042dc93 mov edi, eax | edi = eax; 0x0042dc95 and edi, 0xf800 | edi &= 0xf800; 0x0042dc9b lea rdx, [rcx + 2] | rdx = rcx + 2; 0x0042dc9f cmp edi, 0xd800 | | if (edi != 0xd800) { 0x0042dca5 jne 0x42dc60 | goto label_0; | } 0x0042dca7 and eax, 0xfc00 | eax &= 0xfc00; 0x0042dcac cmp eax, 0xd800 | | if (eax == 0xd800) { 0x0042dcb1 jne 0x42dccf | 0x0042dcb3 movzx eax, word [rdx] | eax = *(rdx); 0x0042dcb6 and eax, 0xfc | eax &= 0xfc; 0x0042dcbb movzx eax, ax | eax = (int32_t) ax; 0x0042dcbe cmp eax, 0xdc | | if (eax != 0xdc) { 0x0042dcc3 jne 0x42dccf | goto label_10; | } 0x0042dcc5 add rcx, 4 | rcx += 4; 0x0042dcc9 add rsi, 4 | rsi += 4; 0x0042dccd jmp 0x42dc89 | goto label_1; | } | label_10: 0x0042dccf inc rsi | rsi++; 0x0042dcd2 jmp 0x42dc6d | goto label_2; | label_7: 0x0042dcd4 inc rsi | rsi++; 0x0042dcd7 mov al, byte [rbx] | al = *(rbx); 0x0042dcd9 test al, 1 | | if ((al & 1) != 0) { 0x0042dcdb jne 0x42dda0 | goto label_11; | } 0x0042dce1 movzx ecx, al | ecx = (int32_t) al; 0x0042dce4 shr rcx, 1 | rcx >>= 1; 0x0042dce7 cmp rsi, rcx | | if (rsi > rcx) { 0x0042dcea ja 0x42ddad | goto label_12; | } | label_4: 0x0042dcf0 test al, 1 | | if ((al & 1) != 0) { 0x0042dcf2 jne 0x42ddc1 | goto label_13; | } | label_5: 0x0042dcf8 lea rdi, [rbx + 1] | rdi = rbx + 1; 0x0042dcfc jmp 0x42ddc5 | goto label_14; | label_6: 0x0042dd01 test ax, ax | | if (ax == 0) { 0x0042dd04 je 0x42dd8a | goto label_15; | } 0x0042dd0a mov rcx, r15 | rcx = r15; 0x0042dd0d jmp 0x42dd28 | | while (edi != 0xd800) { 0x0042dd10 cmp eax, 0x800 | 0x0042dd15 sbb rsi, 0 | 0x0042dd19 add rsi, 3 | rsi += 3; | label_3: 0x0042dd1d movzx eax, word [rdx] | eax = *(rdx); 0x0042dd20 mov rcx, rdx | rcx = rdx; 0x0042dd23 test ax, ax | | if (ax == 0) { 0x0042dd26 je 0x42dd8a | goto label_15; | } 0x0042dd28 cmp ax, 0x7f | | if (ax <= 0x7f) { 0x0042dd2c ja 0x42dd40 | 0x0042dd2e add rcx, 2 | rcx += 2; 0x0042dd32 inc rsi | rsi++; 0x0042dd35 jmp 0x42dd80 | goto label_16; | } 0x0042dd40 movzx eax, ax | eax = (int32_t) ax; 0x0042dd43 mov edi, eax | edi = eax; 0x0042dd45 and edi, 0xf800 | edi &= 0xf800; 0x0042dd4b lea rdx, [rcx + 2] | rdx = rcx + 2; 0x0042dd4f cmp edi, 0xd800 | 0x0042dd55 jne 0x42dd10 | | } 0x0042dd57 and eax, 0xfc00 | eax &= 0xfc00; 0x0042dd5c cmp eax, 0xd800 | | if (eax == 0xd800) { 0x0042dd61 jne 0x42dd85 | 0x0042dd63 movzx eax, word [rdx] | eax = *(rdx); 0x0042dd66 and eax, 0xfc00 | eax &= 0xfc00; 0x0042dd6b movzx eax, ax | eax = (int32_t) ax; 0x0042dd6e cmp eax, 0xdc00 | | if (eax != 0xdc00) { 0x0042dd73 jne 0x42dd85 | goto label_17; | } 0x0042dd75 add rcx, 4 | rcx += 4; 0x0042dd79 add rsi, 4 | rsi += 4; 0x0042dd7d nop dword [rax] | | label_16: 0x0042dd80 mov rdx, rcx | rdx = rcx; 0x0042dd83 jmp 0x42dd1d | goto label_3; | } | label_17: 0x0042dd85 inc rsi | rsi++; 0x0042dd88 jmp 0x42dd1d | goto label_3; | label_15: 0x0042dd8a inc rsi | rsi++; 0x0042dd8d mov al, byte [rbx] | al = *(rbx); 0x0042dd8f test al, 1 | | if ((al & 1) != 0) { 0x0042dd91 jne 0x42ddd9 | goto label_18; | } 0x0042dd93 movzx ecx, al | ecx = (int32_t) al; 0x0042dd96 shr rcx, 1 | rcx >>= 1; 0x0042dd99 cmp rsi, rcx | | if (rsi > rcx) { 0x0042dd9c ja 0x42dde2 | goto label_19; | } 0x0042dd9e jmp 0x42ddee | goto label_20; | label_11: 0x0042dda0 mov rcx, qword [rbx + 8] | rcx = *((rbx + 8)); 0x0042dda4 cmp rsi, rcx | | if (rsi <= rcx) { 0x0042dda7 jbe 0x42dcf0 | goto label_4; | } | label_12: 0x0042ddad mov rdi, rbx | rdi = rbx; 0x0042ddb0 xor edx, edx | edx = 0; 0x0042ddb2 call 0x403a30 | std::_1::basic_string,std::_1::allocator>::resize(unsigned long,char) (); 0x0042ddb7 mov al, byte [rbx] | al = *(rbx); 0x0042ddb9 test al, 1 | | if ((al & 1) == 0) { 0x0042ddbb je 0x42dcf8 | goto label_5; | } | label_13: 0x0042ddc1 mov rdi, qword [rbx + 0x10] | rdi = *((rbx + 0x10)); | label_14: 0x0042ddc5 movsx r8d, bpl | r8d = (int32_t) bpl; 0x0042ddc9 mov rcx, rsp | rcx = rsp; 0x0042ddcc mov rsi, r15 | rsi = r15; 0x0042ddcf mov rdx, r14 | rdx = r14; 0x0042ddd2 call 0x432d30 | int(anonymousnamespace)::localUtf16ToUtf8,(anonymousnamespace)::Swapper>(char*,(anonymousnamespace)::NoOpCapacity,unsignedshortconst*,(anonymousnamespace)::Utf16::ZeroBasedEnd,(anonymousnamespace)::Swapper,unsigned long*,unsigned long*,char) (); 0x0042ddd7 jmp 0x42de0e | goto label_21; | label_18: 0x0042ddd9 mov rcx, qword [rbx + 8] | rcx = *((rbx + 8)); 0x0042dddd cmp rsi, rcx | | if (rsi > rcx) { 0x0042dde0 jbe 0x42ddee | | label_19: 0x0042dde2 mov rdi, rbx | rdi = rbx; 0x0042dde5 xor edx, edx | edx = 0; 0x0042dde7 call 0x403a30 | std::_1::basic_string,std::_1::allocator>::resize(unsigned long,char) (); 0x0042ddec mov al, byte [rbx] | al = *(rbx); | } | label_20: 0x0042ddee test al, 1 | | if ((al & 1) == 0) { 0x0042ddf0 jne 0x42ddf8 | 0x0042ddf2 lea rdi, [rbx + 1] | rdi = rbx + 1; 0x0042ddf6 jmp 0x42ddfc | | } else { 0x0042ddf8 mov rdi, qword [rbx + 0x10] | rdi = *((rbx + 0x10)); | } 0x0042ddfc movsx r8d, bpl | r8d = (int32_t) bpl; 0x0042de00 mov rcx, rsp | rcx = rsp; 0x0042de03 mov rsi, r15 | rsi = r15; 0x0042de06 mov rdx, r14 | rdx = r14; 0x0042de09 call 0x432ba0 | eax = int(anonymousnamespace)::localUtf16ToUtf8,(anonymousnamespace)::NoOpSwapper>(char*,(anonymousnamespace)::NoOpCapacity,unsignedshortconst*,(anonymousnamespace)::Utf16::ZeroBasedEnd,(anonymousnamespace)::NoOpSwapper,unsigned long*,unsigned long*,char) (); | label_21: 0x0042de0e mov ebp, eax | 0x0042de10 mov rsi, qword [rsp] | rsi = *(rsp); 0x0042de14 dec rsi | rsi--; 0x0042de17 mov rdi, rbx | rdi = rbx; 0x0042de1a xor edx, edx | edx = 0; 0x0042de1c call 0x403a30 | std::_1::basic_string,std::_1::allocator>::resize(unsigned long,char) (); 0x0042de21 mov eax, ebp | eax = ebp; 0x0042de23 add rsp, 8 | 0x0042de27 pop rbx | 0x0042de28 pop r14 | 0x0042de2a pop r15 | 0x0042de2c pop rbp | 0x0042de2d ret | return eax; | }