; assembly | /* r2dec pseudo code output */ | /* bdlde_charconvertutf16.t/none @ 0x42ee80 */ | #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_bsl::vector_char__bsl::allocator_char_____unsigned_short_const__unsigned_long__unsigned_long__char__BloombergLP::bdlde::ByteOrder::Enum_ () | int64_t method_BloombergLP::bdlde::CharConvertUtf16_utf16ToUtf8_bsl::vector_char_bsl::allocator_char_unsigned_short_const_unsigned_long_unsigned_long_char_BloombergLP::bdlde::ByteOrder::Enum_ (int64_t arg6, int64_t arg5, char * arg4, char * arg3, uint32_t arg2, char * arg1) { | int64_t var_8h; | r9 = arg6; | r8 = arg5; | rcx = arg4; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* BloombergLP::bdlde::CharConvertUtf16::utf16ToUtf8(bsl::vector >*, unsigned short const*, unsigned long, unsigned long*, char, BloombergLP::bdlde::ByteOrder::Enum) */ 0x0042ee80 push rbp | 0x0042ee81 push r15 | 0x0042ee83 push r14 | 0x0042ee85 push r12 | 0x0042ee87 push rbx | 0x0042ee88 sub rsp, 0x10 | 0x0042ee8c mov ebp, r8d | 0x0042ee8f mov r14, rcx | r14 = rcx; 0x0042ee92 mov r15, rsi | r15 = rsi; 0x0042ee95 mov r12, rdi | r12 = rdi; 0x0042ee98 lea rbx, [rsi + rdx*2] | rbx = rsi + rdx*2; 0x0042ee9c xor esi, esi | esi = 0; 0x0042ee9e test r9d, r9d | | if (r9d == 0) { 0x0042eea1 je 0x42ef76 | goto label_6; | } 0x0042eea7 test rdx, rdx | | if (rdx <= 0) { 0x0042eeaa jle 0x42ef3a | goto label_7; | } 0x0042eeb0 mov rax, r15 | rax = r15; 0x0042eeb3 jmp 0x42eed6 | goto label_8; | label_0: 0x0042eec0 cmp edx, 0x800 | 0x0042eec6 sbb rsi, 0 | 0x0042eeca add rsi, 3 | rsi += 3; | do { | label_2: 0x0042eece mov rax, rcx | rax = rcx; 0x0042eed1 cmp rcx, rbx | | if (rcx >= rbx) { 0x0042eed4 jae 0x42ef3a | goto label_7; | } | label_8: 0x0042eed6 movzx ecx, word [rax] | ecx = *(rax); 0x0042eed9 rol cx, 8 | cx = rotate_left16 (cx, 8); 0x0042eedd cmp cx, 0x7f | | if (cx > 0x7f) { 0x0042eee1 ja 0x42eef0 | goto label_9; | } 0x0042eee3 add rax, 2 | rax += 2; 0x0042eee7 inc rsi | rsi++; | label_1: 0x0042eeea mov rcx, rax | rcx = rax; 0x0042eeed jmp 0x42eece | | } while (1); | label_9: 0x0042eef0 movzx edx, cx | edx = (int32_t) cx; 0x0042eef3 mov edi, edx | edi = edx; 0x0042eef5 and edi, 0xf800 | edi &= 0xf800; 0x0042eefb lea rcx, [rax + 2] | rcx = rax + 2; 0x0042eeff cmp edi, 0xd800 | | if (edi != 0xd800) { 0x0042ef05 jne 0x42eec0 | goto label_0; | } 0x0042ef07 cmp rcx, rbx | | if (rcx < rbx) { 0x0042ef0a jae 0x42ef35 | 0x0042ef0c and edx, 0xfc00 | edx &= 0xfc00; 0x0042ef12 cmp edx, 0xd800 | | if (edx != 0xd800) { 0x0042ef18 jne 0x42ef35 | goto label_10; | } 0x0042ef1a movzx edx, word [rcx] | edx = *(rcx); 0x0042ef1d and edx, 0xfc | edx &= 0xfc; 0x0042ef23 cmp edx, 0xdc | | if (edx != 0xdc) { 0x0042ef29 jne 0x42ef35 | goto label_10; | } 0x0042ef2b add rax, 4 | rax += 4; 0x0042ef2f add rsi, 4 | rsi += 4; 0x0042ef33 jmp 0x42eeea | goto label_1; | } | label_10: 0x0042ef35 inc rsi | rsi++; 0x0042ef38 jmp 0x42eece | goto label_2; | label_7: 0x0042ef3a inc rsi | rsi++; 0x0042ef3d mov rdi, qword [r12] | rdi = *(r12); 0x0042ef41 mov rax, qword [r12 + 8] | rax = *((r12 + 8)); 0x0042ef46 sub rax, rdi | rax -= rdi; 0x0042ef49 cmp rsi, rax | | if (rsi > rax) { 0x0042ef4c jbe 0x42ef5a | 0x0042ef4e mov rdi, r12 | 0x0042ef51 call 0x442e60 | bsl::vector>::resize(unsigned long) (r12, rsi); 0x0042ef56 mov rdi, qword [r12] | rdi = *(r12); | } 0x0042ef5a movsx r9d, bpl | r9d = (int32_t) bpl; 0x0042ef5e lea r8, [rsp + 8] | r8 = rsp + 8; 0x0042ef63 mov rsi, r15 | rsi = r15; 0x0042ef66 mov rdx, rbx | rdx = rbx; 0x0042ef69 mov rcx, r14 | rcx = r14; 0x0042ef6c call 0x433060 | int(anonymousnamespace)::localUtf16ToUtf8,(anonymousnamespace)::Swapper>(char*,(anonymousnamespace)::NoOpCapacity,unsignedshortconst*,(anonymousnamespace)::Utf16::PtrBasedEnd,(anonymousnamespace)::Swapper,unsigned long*,unsigned long*,char) (); 0x0042ef71 jmp 0x42f02e | goto label_11; | label_6: 0x0042ef76 test rdx, rdx | | if (rdx <= 0) { 0x0042ef79 jle 0x42eff7 | goto label_12; | } 0x0042ef7b mov rax, r15 | rax = r15; 0x0042ef7e jmp 0x42ef96 | goto label_13; | label_3: 0x0042ef80 cmp edx, 0x800 | 0x0042ef86 sbb rsi, 0 | 0x0042ef8a add rsi, 3 | rsi += 3; | do { | label_5: 0x0042ef8e mov rax, rcx | rax = rcx; 0x0042ef91 cmp rcx, rbx | | if (rcx >= rbx) { 0x0042ef94 jae 0x42eff7 | goto label_12; | } | label_13: 0x0042ef96 movzx edx, word [rax] | edx = *(rax); 0x0042ef99 cmp edx, 0x7f | | if (edx > 0x7f) { 0x0042ef9c ja 0x42efb0 | goto label_14; | } 0x0042ef9e add rax, 2 | rax += 2; 0x0042efa2 inc rsi | rsi++; | label_4: 0x0042efa5 mov rcx, rax | rcx = rax; 0x0042efa8 jmp 0x42ef8e | | } while (1); | label_14: 0x0042efb0 mov edi, edx | edi = edx; 0x0042efb2 and edi, 0xf800 | edi &= 0xf800; 0x0042efb8 lea rcx, [rax + 2] | rcx = rax + 2; 0x0042efbc cmp edi, 0xd800 | | if (edi != 0xd800) { 0x0042efc2 jne 0x42ef80 | goto label_3; | } 0x0042efc4 cmp rcx, rbx | | if (rcx < rbx) { 0x0042efc7 jae 0x42eff2 | 0x0042efc9 and edx, 0xfc00 | edx &= 0xfc00; 0x0042efcf cmp edx, 0xd800 | | if (edx != 0xd800) { 0x0042efd5 jne 0x42eff2 | goto label_15; | } 0x0042efd7 movzx edx, word [rcx] | edx = *(rcx); 0x0042efda and edx, 0xfc00 | edx &= 0xfc00; 0x0042efe0 cmp edx, 0xdc00 | | if (edx != 0xdc00) { 0x0042efe6 jne 0x42eff2 | goto label_15; | } 0x0042efe8 add rax, 4 | rax += 4; 0x0042efec add rsi, 4 | rsi += 4; 0x0042eff0 jmp 0x42efa5 | goto label_4; | } | label_15: 0x0042eff2 inc rsi | rsi++; 0x0042eff5 jmp 0x42ef8e | goto label_5; | label_12: 0x0042eff7 inc rsi | rsi++; 0x0042effa mov rdi, qword [r12] | rdi = *(r12); 0x0042effe mov rax, qword [r12 + 8] | rax = *((r12 + 8)); 0x0042f003 sub rax, rdi | rax -= rdi; 0x0042f006 cmp rsi, rax | | if (rsi > rax) { 0x0042f009 jbe 0x42f017 | 0x0042f00b mov rdi, r12 | 0x0042f00e call 0x442e60 | bsl::vector>::resize(unsigned long) (r12, rsi); 0x0042f013 mov rdi, qword [r12] | rdi = *(r12); | } 0x0042f017 movsx r9d, bpl | r9d = (int32_t) bpl; 0x0042f01b lea r8, [rsp + 8] | r8 = rsp + 8; 0x0042f020 mov rsi, r15 | rsi = r15; 0x0042f023 mov rdx, rbx | rdx = rbx; 0x0042f026 mov rcx, r14 | rcx = r14; 0x0042f029 call 0x432ed0 | eax = int(anonymousnamespace)::localUtf16ToUtf8,(anonymousnamespace)::NoOpSwapper>(char*,(anonymousnamespace)::NoOpCapacity,unsignedshortconst*,(anonymousnamespace)::Utf16::PtrBasedEnd,(anonymousnamespace)::NoOpSwapper,unsigned long*,unsigned long*,char) (); | label_11: 0x0042f02e mov ebx, eax | ebx = eax; 0x0042f030 mov rsi, qword [rsp + 8] | rsi = *((rsp + 8)); 0x0042f035 mov rax, qword [r12 + 8] | rax = *((r12 + 8)); 0x0042f03a sub rax, qword [r12] | rax -= *(r12); 0x0042f03e cmp rax, rsi | | if (rax != rsi) { 0x0042f041 je 0x42f04b | 0x0042f043 mov rdi, r12 | 0x0042f046 call 0x442e60 | bsl::vector>::resize(unsigned long) (r12, rsi); | } 0x0042f04b mov eax, ebx | eax = ebx; 0x0042f04d add rsp, 0x10 | 0x0042f051 pop rbx | 0x0042f052 pop r12 | 0x0042f054 pop r14 | 0x0042f056 pop r15 | 0x0042f058 pop rbp | 0x0042f059 ret | return rax; | }