; assembly | /* r2dec pseudo code output */ | /* bdlde_charconvertutf16.t/assume @ 0x42f240 */ | #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) { | 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) */ 0x0042f240 push rbp | 0x0042f241 push r15 | 0x0042f243 push r14 | 0x0042f245 push r13 | 0x0042f247 push r12 | 0x0042f249 push rbx | 0x0042f24a push rax | 0x0042f24b mov r13d, r8d | r13d = r8d; 0x0042f24e mov r14, rcx | r14 = rcx; 0x0042f251 mov r15, rsi | r15 = rsi; 0x0042f254 mov r12, rdi | r12 = rdi; 0x0042f257 lea rbx, [rsi + rdx*2] | rbx = rsi + rdx*2; 0x0042f25b xor ebp, ebp | ebp = 0; 0x0042f25d test r9d, r9d | | if (r9d == 0) { 0x0042f260 je 0x42f342 | goto label_6; | } 0x0042f266 test rdx, rdx | | if (rdx <= 0) { 0x0042f269 jle 0x42f305 | goto label_7; | } 0x0042f26f mov rax, r15 | rax = r15; 0x0042f272 jmp 0x42f296 | goto label_8; | label_0: 0x0042f280 cmp edx, 0x800 | 0x0042f286 sbb rbp, 0 | 0x0042f28a add rbp, 3 | rbp += 3; | do { | label_2: 0x0042f28e mov rax, rcx | rax = rcx; 0x0042f291 cmp rcx, rbx | | if (rcx >= rbx) { 0x0042f294 jae 0x42f305 | goto label_7; | } | label_8: 0x0042f296 movzx ecx, word [rax] | ecx = *(rax); 0x0042f299 rol cx, 8 | cx = rotate_left16 (cx, 8); 0x0042f29d cmp cx, 0x7f | | if (cx > 0x7f) { 0x0042f2a1 ja 0x42f2b0 | goto label_9; | } 0x0042f2a3 add rax, 2 | rax += 2; 0x0042f2a7 inc rbp | rbp++; | label_1: 0x0042f2aa mov rcx, rax | rcx = rax; 0x0042f2ad jmp 0x42f28e | | } while (1); | label_9: 0x0042f2b0 movzx edx, cx | edx = (int32_t) cx; 0x0042f2b3 mov esi, edx | esi = edx; 0x0042f2b5 and esi, 0xf800 | esi &= 0xf800; 0x0042f2bb lea rcx, [rax + 2] | rcx = rax + 2; 0x0042f2bf cmp esi, 0xd800 | | if (esi != 0xd800) { 0x0042f2c5 jne 0x42f280 | goto label_0; | } 0x0042f2c7 cmp rcx, rbx | | if (rcx < rbx) { 0x0042f2ca jae 0x42f300 | 0x0042f2cc and edx, 0xfc00 | edx &= 0xfc00; 0x0042f2d2 cmp edx, 0xd800 | | if (edx != 0xd800) { 0x0042f2d8 jne 0x42f300 | goto label_10; | } 0x0042f2da movzx edx, word [rcx] | edx = *(rcx); 0x0042f2dd and edx, 0xfc | edx &= 0xfc; 0x0042f2e3 cmp edx, 0xdc | | if (edx != 0xdc) { 0x0042f2e9 jne 0x42f300 | goto label_10; | } 0x0042f2eb add rax, 4 | rax += 4; 0x0042f2ef add rbp, 4 | rbp += 4; 0x0042f2f3 jmp 0x42f2aa | goto label_1; | } | label_10: 0x0042f300 inc rbp | rbp++; 0x0042f303 jmp 0x42f28e | goto label_2; | label_7: 0x0042f305 inc rbp | rbp++; 0x0042f308 mov rdi, qword [r12] | rdi = *(r12); 0x0042f30c mov rax, qword [r12 + 8] | rax = *((r12 + 8)); 0x0042f311 sub rax, rdi | rax -= rdi; 0x0042f314 cmp rbp, rax | | if (rbp > rax) { 0x0042f317 jbe 0x42f328 | 0x0042f319 mov rdi, r12 | 0x0042f31c mov rsi, rbp | 0x0042f31f call 0x433ab0 | std::_1::vector>::resize(unsigned long) (r12, rbp); 0x0042f324 mov rdi, qword [r12] | rdi = *(r12); | } 0x0042f328 movsx r9d, r13b | r9d = (int32_t) r13b; 0x0042f32c mov r8, rsp | r8 = rsp; 0x0042f32f mov rsi, r15 | rsi = r15; 0x0042f332 mov rdx, rbx | rdx = rbx; 0x0042f335 mov rcx, r14 | rcx = r14; 0x0042f338 call 0x433280 | int(anonymousnamespace)::localUtf16ToUtf8,(anonymousnamespace)::Swapper>(char*,(anonymousnamespace)::NoOpCapacity,unsignedshortconst*,(anonymousnamespace)::Utf16::PtrBasedEnd,(anonymousnamespace)::Swapper,unsigned long*,unsigned long*,char) (); 0x0042f33d jmp 0x42f40d | goto label_11; | label_6: 0x0042f342 test rdx, rdx | | if (rdx <= 0) { 0x0042f345 jle 0x42f3d5 | goto label_12; | } 0x0042f34b mov rax, r15 | rax = r15; 0x0042f34e jmp 0x42f366 | goto label_13; | label_3: 0x0042f350 cmp edx, 0x800 | 0x0042f356 sbb rbp, 0 | 0x0042f35a add rbp, 3 | rbp += 3; | do { | label_5: 0x0042f35e mov rax, rcx | rax = rcx; 0x0042f361 cmp rcx, rbx | | if (rcx >= rbx) { 0x0042f364 jae 0x42f3d5 | goto label_12; | } | label_13: 0x0042f366 movzx edx, word [rax] | edx = *(rax); 0x0042f369 cmp edx, 0x7f | | if (edx > 0x7f) { 0x0042f36c ja 0x42f380 | goto label_14; | } 0x0042f36e add rax, 2 | rax += 2; 0x0042f372 inc rbp | rbp++; | label_4: 0x0042f375 mov rcx, rax | rcx = rax; 0x0042f378 jmp 0x42f35e | | } while (1); | label_14: 0x0042f380 mov esi, edx | esi = edx; 0x0042f382 and esi, 0xf800 | esi &= 0xf800; 0x0042f388 lea rcx, [rax + 2] | rcx = rax + 2; 0x0042f38c cmp esi, 0xd800 | | if (esi != 0xd800) { 0x0042f392 jne 0x42f350 | goto label_3; | } 0x0042f394 cmp rcx, rbx | | if (rcx < rbx) { 0x0042f397 jae 0x42f3d0 | 0x0042f399 and edx, 0xfc00 | edx &= 0xfc00; 0x0042f39f cmp edx, 0xd800 | | if (edx != 0xd800) { 0x0042f3a5 jne 0x42f3d0 | goto label_15; | } 0x0042f3a7 movzx edx, word [rcx] | edx = *(rcx); 0x0042f3aa and edx, 0xfc00 | edx &= 0xfc00; 0x0042f3b0 cmp edx, 0xdc00 | | if (edx != 0xdc00) { 0x0042f3b6 jne 0x42f3d0 | goto label_15; | } 0x0042f3b8 add rax, 4 | rax += 4; 0x0042f3bc add rbp, 4 | rbp += 4; 0x0042f3c0 jmp 0x42f375 | goto label_4; | } | label_15: 0x0042f3d0 inc rbp | rbp++; 0x0042f3d3 jmp 0x42f35e | goto label_5; | label_12: 0x0042f3d5 inc rbp | rbp++; 0x0042f3d8 mov rdi, qword [r12] | rdi = *(r12); 0x0042f3dc mov rax, qword [r12 + 8] | rax = *((r12 + 8)); 0x0042f3e1 sub rax, rdi | rax -= rdi; 0x0042f3e4 cmp rbp, rax | | if (rbp > rax) { 0x0042f3e7 jbe 0x42f3f8 | 0x0042f3e9 mov rdi, r12 | 0x0042f3ec mov rsi, rbp | 0x0042f3ef call 0x433ab0 | std::_1::vector>::resize(unsigned long) (r12, rbp); 0x0042f3f4 mov rdi, qword [r12] | rdi = *(r12); | } 0x0042f3f8 movsx r9d, r13b | r9d = (int32_t) r13b; 0x0042f3fc mov r8, rsp | r8 = rsp; 0x0042f3ff mov rsi, r15 | rsi = r15; 0x0042f402 mov rdx, rbx | rdx = rbx; 0x0042f405 mov rcx, r14 | rcx = r14; 0x0042f408 call 0x4330f0 | eax = int(anonymousnamespace)::localUtf16ToUtf8,(anonymousnamespace)::NoOpSwapper>(char*,(anonymousnamespace)::NoOpCapacity,unsignedshortconst*,(anonymousnamespace)::Utf16::PtrBasedEnd,(anonymousnamespace)::NoOpSwapper,unsigned long*,unsigned long*,char) (); | label_11: 0x0042f40d mov ebx, eax | ebx = eax; 0x0042f40f mov rsi, qword [rsp] | rsi = *(rsp); 0x0042f413 cmp rsi, rbp | 0x0042f416 mov rax, qword [r12 + 8] | rax = *((r12 + 8)); 0x0042f41b sub rax, qword [r12] | rax -= *(r12); 0x0042f41f cmp rax, rsi | | if (rax != rsi) { 0x0042f422 je 0x42f42c | 0x0042f424 mov rdi, r12 | 0x0042f427 call 0x433ab0 | std::_1::vector>::resize(unsigned long) (r12, rsi); | } 0x0042f42c mov eax, ebx | eax = ebx; 0x0042f42e add rsp, 8 | 0x0042f432 pop rbx | 0x0042f433 pop r12 | 0x0042f435 pop r13 | 0x0042f437 pop r14 | 0x0042f439 pop r15 | 0x0042f43b pop rbp | 0x0042f43c ret | return rax; | }