; assembly | /* r2dec pseudo code output */ | /* balb_testmessages.t/assume @ 0x41d9f0 */ | #include | ; (fcn) method.BloombergLP::bdlde::Utf8Util.advanceIfValid_int__char_const__char_const__unsigned_long__long_ () | int64_t method_BloombergLP::bdlde::Utf8Util_advanceIfValid_int_char_const_char_const_unsigned_long_long_ (int64_t arg_4eh, int64_t arg_ch, int64_t arg_10h, int64_t arg_18h, int64_t arg_20h, int64_t arg_ch_2, int64_t arg_dh, int64_t arg_eh, int64_t arg_fh, int64_t arg_10h_2, int64_t arg_18h_2, int64_t arg_20h_2, uint32_t arg5, uint32_t arg4, int64_t arg3, int64_t arg2, int64_t arg1) { | r8 = arg5; | rcx = arg4; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* BloombergLP::bdlde::Utf8Util::advanceIfValid(int*, char const**, char const*, unsigned long, long) */ 0x0041d9f0 push rbp | 0x0041d9f1 push r14 | 0x0041d9f3 push rbx | 0x0041d9f4 test rcx, rcx | | if (rcx <= 0) { 0x0041d9f7 jle 0x41dbec | goto label_2; | } 0x0041d9fd add rcx, rdx | rcx += rdx; 0x0041da00 xor eax, eax | eax = 0; 0x0041da02 mov r9, rdx | r9 = rdx; 0x0041da05 jmp 0x41da1f | | while ((r10b & 0x1e) != 0) { | label_0: 0x0041da10 inc rax | rax++; 0x0041da13 mov r9, rdx | r9 = rdx; 0x0041da16 cmp rdx, rcx | | if (rdx >= rcx) { 0x0041da19 jae 0x41dbee | goto label_3; | } 0x0041da1f cmp r8, rax | | if (r8 == rax) { 0x0041da22 je 0x41db75 | goto label_4; | } 0x0041da28 lea rdx, [r9 + 1] | rdx = r9 + 1; 0x0041da2c movzx r10d, byte [r9] | r10d = *(r9); 0x0041da30 mov rbx, r10 | rbx = r10; 0x0041da33 shr rbx, 4 | rbx >>= 4; | /* switch table (110 cases) at 0x4488e8 */ 0x0041da37 jmp qword [rbx*8 + 0x4488e8] | 0x0041da3e lea rbx, [r9 + 2] | rbx = r9 + 2; 0x0041da42 cmp rbx, rcx | | if (rbx > rcx) { 0x0041da45 ja 0x41db88 | goto label_5; | } 0x0041da4b movzx edx, byte [rdx] | edx = *(rdx); 0x0041da4e and dl, 0xc0 | dl &= 0xc0; 0x0041da51 cmp dl, 0x80 | | if (dl != 0x80) { 0x0041da54 jne 0x41dbe4 | goto label_6; | } 0x0041da5a mov rdx, rbx | rdx = rbx; 0x0041da5d test r10b, 0x1e | 0x0041da61 jne 0x41da10 | | } 0x0041da63 jmp 0x41db80 | goto label_7; 0x0041da68 lea r11, [r9 + 3] | r11 = r9 + 3; 0x0041da6c cmp r11, rcx | | if (r11 > rcx) { 0x0041da6f ja 0x41db90 | goto label_8; | } 0x0041da75 movzx ebx, byte [rdx] | ebx = *(rdx); 0x0041da78 mov edx, ebx | edx = ebx; 0x0041da7a and dl, 0xc0 | dl &= 0xc0; 0x0041da7d cmp dl, 0x80 | | if (dl != 0x80) { 0x0041da80 jne 0x41dbe4 | goto label_6; | } 0x0041da86 movzx edx, byte [r9 + 2] | edx = *((r9 + 2)); 0x0041da8b and dl, 0xc0 | dl &= 0xc0; 0x0041da8e cmp dl, 0x80 | | if (dl != 0x80) { 0x0041da91 jne 0x41dbe4 | goto label_6; | } 0x0041da97 and r10d, 0xf | r10d &= 0xf; 0x0041da9b shl r10d, 0xc | r10d <<= 0xc; 0x0041da9f and ebx, 0x3f | ebx &= 0x3f; 0x0041daa2 shl ebx, 6 | ebx <<= 6; 0x0041daa5 or ebx, r10d | ebx |= r10d; 0x0041daa8 cmp ebx, 0x7ff | | if (ebx <= 0x7ff) { 0x0041daae jbe 0x41db80 | goto label_7; | } 0x0041dab4 and ebx, 0xf800 | ebx &= 0xf800; 0x0041daba mov rdx, r11 | rdx = r11; 0x0041dabd cmp ebx, 0xd800 | | if (ebx != 0xd800) { 0x0041dac3 jne 0x41da10 | goto label_0; | } 0x0041dac9 jmp 0x41dbb4 | goto label_9; 0x0041dace test r10b, 8 | | if ((r10b & 8) != 0) { 0x0041dad2 jne 0x41dbbc | goto label_10; | } 0x0041dad8 lea r11, [r9 + 4] | r11 = r9 + 4; 0x0041dadc cmp r11, rcx | | if (r11 > rcx) { 0x0041dadf ja 0x41dbc4 | goto label_11; | } 0x0041dae5 movzx ebp, byte [rdx] | ebp = *(rdx); 0x0041dae8 mov ebx, ebp | ebx = ebp; 0x0041daea and bl, 0xc0 | bl &= 0xc0; 0x0041daed cmp bl, 0x80 | | if (bl != 0x80) { 0x0041daf0 jne 0x41dbe4 | goto label_6; | } 0x0041daf6 movzx ebx, byte [r9 + 2] | ebx = *((r9 + 2)); 0x0041dafb mov edx, ebx | edx = ebx; 0x0041dafd and dl, 0xc0 | dl &= 0xc0; 0x0041db00 cmp dl, 0x80 | | if (dl != 0x80) { 0x0041db03 jne 0x41dbe4 | goto label_6; | } 0x0041db09 movzx r14d, byte [r9 + 3] | r14d = *((r9 + 3)); 0x0041db0e mov edx, r14d | edx = r14d; 0x0041db11 and dl, 0xc0 | dl &= 0xc0; 0x0041db14 cmp dl, 0x80 | | if (dl != 0x80) { 0x0041db17 jne 0x41dbe4 | goto label_6; | } 0x0041db1d and r10d, 7 | r10d &= 7; 0x0041db21 shl r10d, 0x12 | r10d <<= 0x12; 0x0041db25 and ebp, 0x3f | ebp &= 0x3f; 0x0041db28 shl ebp, 0xc | ebp <<= 0xc; 0x0041db2b or ebp, r10d | ebp |= r10d; 0x0041db2e and ebx, 0x3f | ebx &= 0x3f; 0x0041db31 shl ebx, 6 | ebx <<= 6; 0x0041db34 or ebx, ebp | ebx |= ebp; 0x0041db36 and r14d, 0x3f | r14d &= 0x3f; 0x0041db3a lea ebp, [r14 + rbx - 0x10000] | ebp = r14 + rbx - 0x10000; 0x0041db42 mov rdx, r11 | rdx = r11; 0x0041db45 cmp ebp, 0x100000 | | if (ebp < 0x100000) { 0x0041db4b jb 0x41da10 | goto label_0; | } 0x0041db51 or ebx, r14d | ebx |= r14d; 0x0041db54 xor ecx, ecx | ecx = 0; 0x0041db56 cmp ebx, 0x110000 | 0x0041db5c setb cl | cl = (ebx < 0x110000) ? 1 : 0; 0x0041db5f lea ecx, [rcx + rcx - 6] | ecx = rcx + rcx - 6; 0x0041db63 mov dword [rdi], ecx | *(rdi) = ecx; 0x0041db65 jmp 0x41db6d | goto label_1; 0x0041db67 mov dword [rdi], 0xfffffffe | *(rdi) = 0xfffffffe; | do { | label_1: 0x0041db6d mov qword [rsi], r9 | *(rsi) = r9; 0x0041db70 pop rbx | 0x0041db71 pop r14 | r14 = rbx; 0x0041db73 pop rbp | 0x0041db74 ret | return rax; | label_4: 0x0041db75 mov dword [rdi], 0 | *(rdi) = 0; 0x0041db7b mov rax, r8 | rax = r8; 0x0041db7e jmp 0x41db6d | | } while (1); | label_7: 0x0041db80 mov dword [rdi], 0xfffffffc | *(rdi) = 0xfffffffc; 0x0041db86 jmp 0x41db6d | goto label_1; | label_5: 0x0041db88 mov dword [rdi], 0xffffffff | *(rdi) = 0xffffffff; 0x0041db8e jmp 0x41db6d | goto label_1; | label_8: 0x0041db90 lea r8, [r9 + 2] | r8 = r9 + 2; 0x0041db94 mov ebx, 0xffffffff | ebx = 0xffffffff; 0x0041db99 cmp r8, rcx | | if (r8 == rcx) { 0x0041db9c jne 0x41dbb0 | 0x0041db9e mov cl, byte [rdx] | cl = *(rdx); 0x0041dba0 and cl, 0xc0 | cl &= 0xc0; 0x0041dba3 xor ebx, ebx | ebx = 0; 0x0041dba5 cmp cl, 0x80 | 0x0041dba8 sete bl | bl = (cl == 0x80) ? 1 : 0; 0x0041dbab add ebx, ebx | ebx += ebx; 0x0041dbad or ebx, 0xfffffffd | ebx |= 0xfffffffd; | } 0x0041dbb0 mov dword [rdi], ebx | *(rdi) = ebx; 0x0041dbb2 jmp 0x41db6d | goto label_1; | label_9: 0x0041dbb4 mov dword [rdi], 0xfffffff9 | *(rdi) = 0xfffffff9; 0x0041dbba jmp 0x41db6d | goto label_1; | label_10: 0x0041dbbc mov dword [rdi], 0xfffffffb | *(rdi) = 0xfffffffb; 0x0041dbc2 jmp 0x41db6d | goto label_1; | label_11: 0x0041dbc4 mov dword [rdi], 0xffffffff | *(rdi) = 0xffffffff; 0x0041dbca cmp rdx, rcx | | if (rdx >= rcx) { 0x0041dbcd jae 0x41db6d | goto label_1; | } | do { 0x0041dbcf movzx ebx, byte [rdx] | ebx = *(rdx); 0x0041dbd2 and bl, 0xc0 | bl &= 0xc0; 0x0041dbd5 cmp bl, 0x80 | | if (bl != 0x80) { 0x0041dbd8 jne 0x41dbe4 | goto label_6; | } 0x0041dbda inc rdx | rdx++; 0x0041dbdd cmp rcx, rdx | 0x0041dbe0 jne 0x41dbcf | | } while (rcx != rdx); 0x0041dbe2 jmp 0x41db6d | goto label_1; | label_6: 0x0041dbe4 mov dword [rdi], 0xfffffffd | *(rdi) = 0xfffffffd; 0x0041dbea jmp 0x41db6d | goto label_1; | label_2: 0x0041dbec xor eax, eax | eax = 0; | label_3: 0x0041dbee mov dword [rdi], 0 | *(rdi) = 0; 0x0041dbf4 mov r9, rdx | r9 = rdx; 0x0041dbf7 jmp 0x41db6d | goto label_1; | }