; assembly | /* r2dec pseudo code output */ | /* bdlde_charconvertutf16.t/assume @ 0x42dd20 */ | #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) */ 0x0042dd20 push rbp | 0x0042dd21 push r15 | 0x0042dd23 push r14 | 0x0042dd25 push r13 | 0x0042dd27 push r12 | 0x0042dd29 push rbx | 0x0042dd2a push rax | 0x0042dd2b mov r12d, ecx | r12d = ecx; 0x0042dd2e mov r14, rdx | r14 = rdx; 0x0042dd31 mov r15, rsi | r15 = rsi; 0x0042dd34 mov r13, rdi | r13 = rdi; 0x0042dd37 movzx eax, word [rsi] | eax = *(rsi); 0x0042dd3a xor ebp, ebp | ebp = 0; 0x0042dd3c test r8d, r8d | | if (r8d == 0) { 0x0042dd3f je 0x42ddf3 | goto label_6; | } 0x0042dd45 test ax, ax | | if (ax == 0) { 0x0042dd48 je 0x42ddc4 | goto label_7; | } 0x0042dd4a mov rcx, r15 | rcx = r15; 0x0042dd4d jmp 0x42dd68 | goto label_8; | label_0: 0x0042dd50 cmp eax, 0x800 | 0x0042dd55 sbb rbp, 0 | 0x0042dd59 add rbp, 3 | rbp += 3; | do { | label_2: 0x0042dd5d movzx eax, word [rdx] | eax = *(rdx); 0x0042dd60 mov rcx, rdx | rcx = rdx; 0x0042dd63 test ax, ax | | if (ax == 0) { 0x0042dd66 je 0x42ddc4 | goto label_7; | } | label_8: 0x0042dd68 rol ax, 8 | ax = rotate_left16 (ax, 8); 0x0042dd6c cmp ax, 0x7f | | if (ax > 0x7f) { 0x0042dd70 ja 0x42dd80 | goto label_9; | } 0x0042dd72 add rcx, 2 | rcx += 2; 0x0042dd76 inc rbp | rbp++; | label_1: 0x0042dd79 mov rdx, rcx | rdx = rcx; 0x0042dd7c jmp 0x42dd5d | | } while (1); | label_9: 0x0042dd80 movzx eax, ax | eax = (int32_t) ax; 0x0042dd83 mov esi, eax | esi = eax; 0x0042dd85 and esi, 0xf800 | esi &= 0xf800; 0x0042dd8b lea rdx, [rcx + 2] | rdx = rcx + 2; 0x0042dd8f cmp esi, 0xd800 | | if (esi != 0xd800) { 0x0042dd95 jne 0x42dd50 | goto label_0; | } 0x0042dd97 and eax, 0xfc00 | eax &= 0xfc00; 0x0042dd9c cmp eax, 0xd800 | | if (eax == 0xd800) { 0x0042dda1 jne 0x42ddbf | 0x0042dda3 movzx eax, word [rdx] | eax = *(rdx); 0x0042dda6 and eax, 0xfc | eax &= 0xfc; 0x0042ddab movzx eax, ax | eax = (int32_t) ax; 0x0042ddae cmp eax, 0xdc | | if (eax != 0xdc) { 0x0042ddb3 jne 0x42ddbf | goto label_10; | } 0x0042ddb5 add rcx, 4 | rcx += 4; 0x0042ddb9 add rbp, 4 | rbp += 4; 0x0042ddbd jmp 0x42dd79 | goto label_1; | } | label_10: 0x0042ddbf inc rbp | rbp++; 0x0042ddc2 jmp 0x42dd5d | goto label_2; | label_7: 0x0042ddc4 inc rbp | rbp++; 0x0042ddc7 mov al, byte [r13] | al = *(r13); 0x0042ddcb test al, 1 | | if ((al & 1) != 0) { 0x0042ddcd jne 0x42dea2 | goto label_11; | } 0x0042ddd3 movzx ecx, al | ecx = (int32_t) al; 0x0042ddd6 shr rcx, 1 | rcx >>= 1; 0x0042ddd9 cmp rbp, rcx | | if (rbp > rcx) { 0x0042dddc ja 0x42deaf | goto label_12; | } | label_4: 0x0042dde2 test al, 1 | | if ((al & 1) != 0) { 0x0042dde4 jne 0x42dec8 | goto label_13; | } | label_5: 0x0042ddea lea rdi, [r13 + 1] | rdi = r13 + 1; 0x0042ddee jmp 0x42decc | goto label_14; | label_6: 0x0042ddf3 test ax, ax | | if (ax == 0) { 0x0042ddf6 je 0x42de8a | goto label_15; | } 0x0042ddfc mov rcx, r15 | rcx = r15; 0x0042ddff jmp 0x42de28 | | while (esi != 0xd800) { 0x0042de10 cmp eax, 0x800 | 0x0042de15 sbb rbp, 0 | 0x0042de19 add rbp, 3 | rbp += 3; | label_3: 0x0042de1d movzx eax, word [rdx] | eax = *(rdx); 0x0042de20 mov rcx, rdx | rcx = rdx; 0x0042de23 test ax, ax | | if (ax == 0) { 0x0042de26 je 0x42de8a | goto label_15; | } 0x0042de28 cmp ax, 0x7f | | if (ax <= 0x7f) { 0x0042de2c ja 0x42de40 | 0x0042de2e add rcx, 2 | rcx += 2; 0x0042de32 inc rbp | rbp++; 0x0042de35 jmp 0x42de80 | goto label_16; | } 0x0042de40 movzx eax, ax | eax = (int32_t) ax; 0x0042de43 mov esi, eax | esi = eax; 0x0042de45 and esi, 0xf800 | esi &= 0xf800; 0x0042de4b lea rdx, [rcx + 2] | rdx = rcx + 2; 0x0042de4f cmp esi, 0xd800 | 0x0042de55 jne 0x42de10 | | } 0x0042de57 and eax, 0xfc00 | eax &= 0xfc00; 0x0042de5c cmp eax, 0xd800 | | if (eax == 0xd800) { 0x0042de61 jne 0x42de85 | 0x0042de63 movzx eax, word [rdx] | eax = *(rdx); 0x0042de66 and eax, 0xfc00 | eax &= 0xfc00; 0x0042de6b movzx eax, ax | eax = (int32_t) ax; 0x0042de6e cmp eax, 0xdc00 | | if (eax != 0xdc00) { 0x0042de73 jne 0x42de85 | goto label_17; | } 0x0042de75 add rcx, 4 | rcx += 4; 0x0042de79 add rbp, 4 | rbp += 4; 0x0042de7d nop dword [rax] | | label_16: 0x0042de80 mov rdx, rcx | rdx = rcx; 0x0042de83 jmp 0x42de1d | goto label_3; | } | label_17: 0x0042de85 inc rbp | rbp++; 0x0042de88 jmp 0x42de1d | goto label_3; | label_15: 0x0042de8a inc rbp | rbp++; 0x0042de8d mov al, byte [r13] | al = *(r13); 0x0042de91 test al, 1 | | if ((al & 1) != 0) { 0x0042de93 jne 0x42dee0 | goto label_18; | } 0x0042de95 movzx ecx, al | ecx = (int32_t) al; 0x0042de98 shr rcx, 1 | rcx >>= 1; 0x0042de9b cmp rbp, rcx | | if (rbp > rcx) { 0x0042de9e ja 0x42dee9 | goto label_19; | } 0x0042dea0 jmp 0x42defa | goto label_20; | label_11: 0x0042dea2 mov rcx, qword [r13 + 8] | rcx = *((r13 + 8)); 0x0042dea6 cmp rbp, rcx | | if (rbp <= rcx) { 0x0042dea9 jbe 0x42dde2 | goto label_4; | } | label_12: 0x0042deaf mov rdi, r13 | rdi = r13; 0x0042deb2 mov rsi, rbp | rsi = rbp; 0x0042deb5 xor edx, edx | edx = 0; 0x0042deb7 call 0x403a30 | std::_1::basic_string,std::_1::allocator>::resize(unsigned long,char) (); 0x0042debc mov al, byte [r13] | al = *(r13); 0x0042dec0 test al, 1 | | if ((al & 1) == 0) { 0x0042dec2 je 0x42ddea | goto label_5; | } | label_13: 0x0042dec8 mov rdi, qword [r13 + 0x10] | rdi = *((r13 + 0x10)); | label_14: 0x0042decc movsx r8d, r12b | r8d = (int32_t) r12b; 0x0042ded0 mov rcx, rsp | rcx = rsp; 0x0042ded3 mov rsi, r15 | rsi = r15; 0x0042ded6 mov rdx, r14 | rdx = r14; 0x0042ded9 call 0x432f50 | int(anonymousnamespace)::localUtf16ToUtf8,(anonymousnamespace)::Swapper>(char*,(anonymousnamespace)::NoOpCapacity,unsignedshortconst*,(anonymousnamespace)::Utf16::ZeroBasedEnd,(anonymousnamespace)::Swapper,unsigned long*,unsigned long*,char) (); 0x0042dede jmp 0x42df1a | goto label_21; | label_18: 0x0042dee0 mov rcx, qword [r13 + 8] | rcx = *((r13 + 8)); 0x0042dee4 cmp rbp, rcx | | if (rbp > rcx) { 0x0042dee7 jbe 0x42defa | | label_19: 0x0042dee9 mov rdi, r13 | rdi = r13; 0x0042deec mov rsi, rbp | rsi = rbp; 0x0042deef xor edx, edx | edx = 0; 0x0042def1 call 0x403a30 | std::_1::basic_string,std::_1::allocator>::resize(unsigned long,char) (); 0x0042def6 mov al, byte [r13] | al = *(r13); | } | label_20: 0x0042defa test al, 1 | | if ((al & 1) == 0) { 0x0042defc jne 0x42df04 | 0x0042defe lea rdi, [r13 + 1] | rdi = r13 + 1; 0x0042df02 jmp 0x42df08 | | } else { 0x0042df04 mov rdi, qword [r13 + 0x10] | rdi = *((r13 + 0x10)); | } 0x0042df08 movsx r8d, r12b | r8d = (int32_t) r12b; 0x0042df0c mov rcx, rsp | rcx = rsp; 0x0042df0f mov rsi, r15 | rsi = r15; 0x0042df12 mov rdx, r14 | rdx = r14; 0x0042df15 call 0x432dc0 | eax = int(anonymousnamespace)::localUtf16ToUtf8,(anonymousnamespace)::NoOpSwapper>(char*,(anonymousnamespace)::NoOpCapacity,unsignedshortconst*,(anonymousnamespace)::Utf16::ZeroBasedEnd,(anonymousnamespace)::NoOpSwapper,unsigned long*,unsigned long*,char) (); | label_21: 0x0042df1a mov ebx, eax | ebx = eax; 0x0042df1c mov rsi, qword [rsp] | rsi = *(rsp); 0x0042df20 cmp rsi, rbp | 0x0042df23 dec rsi | rsi--; 0x0042df26 mov rdi, r13 | rdi = r13; 0x0042df29 xor edx, edx | edx = 0; 0x0042df2b call 0x403a30 | std::_1::basic_string,std::_1::allocator>::resize(unsigned long,char) (); 0x0042df30 mov eax, ebx | eax = ebx; 0x0042df32 add rsp, 8 | 0x0042df36 pop rbx | 0x0042df37 pop r12 | 0x0042df39 pop r13 | 0x0042df3b pop r14 | 0x0042df3d pop r15 | 0x0042df3f pop rbp | 0x0042df40 ret | return eax; | }