; assembly | /* r2dec pseudo code output */ | /* bdlde_charconvertutf16.t/none @ 0x42f060 */ | #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::vector_char__std::__1::allocator_char_____unsigned_short_const__unsigned_long__unsigned_long__char__BloombergLP::bdlde::ByteOrder::Enum_ () | int64_t method_BloombergLP::bdlde::CharConvertUtf16_utf16ToUtf8_std::_1::vector_char_std::_1::allocator_char_unsigned_short_const_unsigned_long_unsigned_long_char_BloombergLP::bdlde::ByteOrder::Enum_ (int64_t arg6, int64_t arg5, int64_t arg4, int64_t arg3, int64_t arg2, int64_t arg1) { | int64_t var_8h; | r9 = arg6; | r8 = arg5; | rcx = arg4; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* BloombergLP::bdlde::CharConvertUtf16::utf16ToUtf8(std::__1::vector >*, unsigned short const*, unsigned long, unsigned long*, char, BloombergLP::bdlde::ByteOrder::Enum) */ 0x0042f060 push rbp | 0x0042f061 push r15 | 0x0042f063 push r14 | 0x0042f065 push r12 | 0x0042f067 push rbx | 0x0042f068 sub rsp, 0x10 | 0x0042f06c mov ebp, r8d | 0x0042f06f mov r14, rcx | r14 = rcx; 0x0042f072 mov r15, rsi | r15 = rsi; 0x0042f075 mov r12, rdi | r12 = rdi; 0x0042f078 lea rbx, [rsi + rdx*2] | rbx = rsi + rdx*2; 0x0042f07c xor esi, esi | esi = 0; 0x0042f07e test r9d, r9d | | if (r9d == 0) { 0x0042f081 je 0x42f156 | goto label_6; | } 0x0042f087 test rdx, rdx | | if (rdx <= 0) { 0x0042f08a jle 0x42f11a | goto label_7; | } 0x0042f090 mov rax, r15 | rax = r15; 0x0042f093 jmp 0x42f0b6 | goto label_8; | label_0: 0x0042f0a0 cmp edx, 0x800 | 0x0042f0a6 sbb rsi, 0 | 0x0042f0aa add rsi, 3 | rsi += 3; | do { | label_2: 0x0042f0ae mov rax, rcx | rax = rcx; 0x0042f0b1 cmp rcx, rbx | | if (rcx >= rbx) { 0x0042f0b4 jae 0x42f11a | goto label_7; | } | label_8: 0x0042f0b6 movzx ecx, word [rax] | ecx = *(rax); 0x0042f0b9 rol cx, 8 | cx = rotate_left16 (cx, 8); 0x0042f0bd cmp cx, 0x7f | | if (cx > 0x7f) { 0x0042f0c1 ja 0x42f0d0 | goto label_9; | } 0x0042f0c3 add rax, 2 | rax += 2; 0x0042f0c7 inc rsi | rsi++; | label_1: 0x0042f0ca mov rcx, rax | rcx = rax; 0x0042f0cd jmp 0x42f0ae | | } while (1); | label_9: 0x0042f0d0 movzx edx, cx | edx = (int32_t) cx; 0x0042f0d3 mov edi, edx | edi = edx; 0x0042f0d5 and edi, 0xf800 | edi &= 0xf800; 0x0042f0db lea rcx, [rax + 2] | rcx = rax + 2; 0x0042f0df cmp edi, 0xd800 | | if (edi != 0xd800) { 0x0042f0e5 jne 0x42f0a0 | goto label_0; | } 0x0042f0e7 cmp rcx, rbx | | if (rcx < rbx) { 0x0042f0ea jae 0x42f115 | 0x0042f0ec and edx, 0xfc00 | edx &= 0xfc00; 0x0042f0f2 cmp edx, 0xd800 | | if (edx != 0xd800) { 0x0042f0f8 jne 0x42f115 | goto label_10; | } 0x0042f0fa movzx edx, word [rcx] | edx = *(rcx); 0x0042f0fd and edx, 0xfc | edx &= 0xfc; 0x0042f103 cmp edx, 0xdc | | if (edx != 0xdc) { 0x0042f109 jne 0x42f115 | goto label_10; | } 0x0042f10b add rax, 4 | rax += 4; 0x0042f10f add rsi, 4 | rsi += 4; 0x0042f113 jmp 0x42f0ca | goto label_1; | } | label_10: 0x0042f115 inc rsi | rsi++; 0x0042f118 jmp 0x42f0ae | goto label_2; | label_7: 0x0042f11a inc rsi | rsi++; 0x0042f11d mov rdi, qword [r12] | rdi = *(r12); 0x0042f121 mov rax, qword [r12 + 8] | rax = *((r12 + 8)); 0x0042f126 sub rax, rdi | rax -= rdi; 0x0042f129 cmp rsi, rax | | if (rsi > rax) { 0x0042f12c jbe 0x42f13a | 0x0042f12e mov rdi, r12 | 0x0042f131 call 0x433890 | std::_1::vector>::resize(unsigned long) (r12, rsi); 0x0042f136 mov rdi, qword [r12] | rdi = *(r12); | } 0x0042f13a movsx r9d, bpl | r9d = (int32_t) bpl; 0x0042f13e lea r8, [rsp + 8] | r8 = rsp + 8; 0x0042f143 mov rsi, r15 | rsi = r15; 0x0042f146 mov rdx, rbx | rdx = rbx; 0x0042f149 mov rcx, r14 | rcx = r14; 0x0042f14c call 0x433060 | int(anonymousnamespace)::localUtf16ToUtf8,(anonymousnamespace)::Swapper>(char*,(anonymousnamespace)::NoOpCapacity,unsignedshortconst*,(anonymousnamespace)::Utf16::PtrBasedEnd,(anonymousnamespace)::Swapper,unsigned long*,unsigned long*,char) (); 0x0042f151 jmp 0x42f20e | goto label_11; | label_6: 0x0042f156 test rdx, rdx | | if (rdx <= 0) { 0x0042f159 jle 0x42f1d7 | goto label_12; | } 0x0042f15b mov rax, r15 | rax = r15; 0x0042f15e jmp 0x42f176 | goto label_13; | label_3: 0x0042f160 cmp edx, 0x800 | 0x0042f166 sbb rsi, 0 | 0x0042f16a add rsi, 3 | rsi += 3; | do { | label_5: 0x0042f16e mov rax, rcx | rax = rcx; 0x0042f171 cmp rcx, rbx | | if (rcx >= rbx) { 0x0042f174 jae 0x42f1d7 | goto label_12; | } | label_13: 0x0042f176 movzx edx, word [rax] | edx = *(rax); 0x0042f179 cmp edx, 0x7f | | if (edx > 0x7f) { 0x0042f17c ja 0x42f190 | goto label_14; | } 0x0042f17e add rax, 2 | rax += 2; 0x0042f182 inc rsi | rsi++; | label_4: 0x0042f185 mov rcx, rax | rcx = rax; 0x0042f188 jmp 0x42f16e | | } while (1); | label_14: 0x0042f190 mov edi, edx | edi = edx; 0x0042f192 and edi, 0xf800 | edi &= 0xf800; 0x0042f198 lea rcx, [rax + 2] | rcx = rax + 2; 0x0042f19c cmp edi, 0xd800 | | if (edi != 0xd800) { 0x0042f1a2 jne 0x42f160 | goto label_3; | } 0x0042f1a4 cmp rcx, rbx | | if (rcx < rbx) { 0x0042f1a7 jae 0x42f1d2 | 0x0042f1a9 and edx, 0xfc00 | edx &= 0xfc00; 0x0042f1af cmp edx, 0xd800 | | if (edx != 0xd800) { 0x0042f1b5 jne 0x42f1d2 | goto label_15; | } 0x0042f1b7 movzx edx, word [rcx] | edx = *(rcx); 0x0042f1ba and edx, 0xfc00 | edx &= 0xfc00; 0x0042f1c0 cmp edx, 0xdc00 | | if (edx != 0xdc00) { 0x0042f1c6 jne 0x42f1d2 | goto label_15; | } 0x0042f1c8 add rax, 4 | rax += 4; 0x0042f1cc add rsi, 4 | rsi += 4; 0x0042f1d0 jmp 0x42f185 | goto label_4; | } | label_15: 0x0042f1d2 inc rsi | rsi++; 0x0042f1d5 jmp 0x42f16e | goto label_5; | label_12: 0x0042f1d7 inc rsi | rsi++; 0x0042f1da mov rdi, qword [r12] | rdi = *(r12); 0x0042f1de mov rax, qword [r12 + 8] | rax = *((r12 + 8)); 0x0042f1e3 sub rax, rdi | rax -= rdi; 0x0042f1e6 cmp rsi, rax | | if (rsi > rax) { 0x0042f1e9 jbe 0x42f1f7 | 0x0042f1eb mov rdi, r12 | 0x0042f1ee call 0x433890 | std::_1::vector>::resize(unsigned long) (r12, rsi); 0x0042f1f3 mov rdi, qword [r12] | rdi = *(r12); | } 0x0042f1f7 movsx r9d, bpl | r9d = (int32_t) bpl; 0x0042f1fb lea r8, [rsp + 8] | r8 = rsp + 8; 0x0042f200 mov rsi, r15 | rsi = r15; 0x0042f203 mov rdx, rbx | rdx = rbx; 0x0042f206 mov rcx, r14 | rcx = r14; 0x0042f209 call 0x432ed0 | eax = int(anonymousnamespace)::localUtf16ToUtf8,(anonymousnamespace)::NoOpSwapper>(char*,(anonymousnamespace)::NoOpCapacity,unsignedshortconst*,(anonymousnamespace)::Utf16::PtrBasedEnd,(anonymousnamespace)::NoOpSwapper,unsigned long*,unsigned long*,char) (); | label_11: 0x0042f20e mov ebx, eax | ebx = eax; 0x0042f210 mov rsi, qword [rsp + 8] | rsi = *((rsp + 8)); 0x0042f215 mov rax, qword [r12 + 8] | rax = *((r12 + 8)); 0x0042f21a sub rax, qword [r12] | rax -= *(r12); 0x0042f21e cmp rax, rsi | | if (rax != rsi) { 0x0042f221 je 0x42f22b | 0x0042f223 mov rdi, r12 | 0x0042f226 call 0x433890 | std::_1::vector>::resize(unsigned long) (r12, rsi); | } 0x0042f22b mov eax, ebx | eax = ebx; 0x0042f22d add rsp, 0x10 | 0x0042f231 pop rbx | 0x0042f232 pop r12 | 0x0042f234 pop r14 | 0x0042f236 pop r15 | 0x0042f238 pop rbp | 0x0042f239 ret | return rax; | }