; assembly | /* r2dec pseudo code output */ | /* bdlpcre_regex.t/assume @ 0x42bbd0 */ | #include | ; (fcn) method.int_BloombergLP::bdlpcre::RegEx::replaceImp_std::__1::basic_string_char__std::__1::char_traits_char___std::__1.allocator_char______std::__1::basic_string_char__std::__1::char_traits_char___std::__1::allocator_char_____int__std::__1::basic_string () | uint64_t method_int_BloombergLP::bdlpcre::RegEx::replaceImp_std::_1::basic_string_char_std::_1::char_traits_char_std::_1_allocator_char_std::_1::basic_string_char_std::_1::char_traits_char_std::_1::allocator_char_int_std::_1::basic_string (int64_t arg6, int64_t arg5, int64_t arg4, int64_t arg3, int64_t arg2, int64_t arg1) { | int64_t var_8h_2; | int64_t var_ch; | int64_t var_10h; | int64_t var_18h_2; | int64_t var_20h_2; | int64_t var_28h_2; | int64_t var_30h_2; | int64_t var_38h_2; | int64_t var_40h_2; | int64_t var_8h; | r9 = arg6; | r8 = arg5; | rcx = arg4; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* int BloombergLP::bdlpcre::RegEx::replaceImp, std::__1::allocator > >(std::__1::basic_string, std::__1::allocator >*, int*, std::__1::basic_string_view > const&, std::__1::basic_string_view > const&, unsigned long, bool) const */ 0x0042bbd0 push rbp | 0x0042bbd1 push r15 | 0x0042bbd3 push r14 | 0x0042bbd5 push r13 | 0x0042bbd7 push r12 | 0x0042bbd9 push rbx | 0x0042bbda sub rsp, 0x48 | 0x0042bbde mov rbp, r9 | 0x0042bbe1 mov r13, r8 | r13 = r8; 0x0042bbe4 mov r15, rcx | r15 = rcx; 0x0042bbe7 mov qword [rsp + 0x38], rdx | *((rsp + 0x38)) = rdx; 0x0042bbec mov r12, rsi | r12 = rsi; 0x0042bbef mov qword [rsp + 0x18], rdi | *((rsp + 0x18)) = rdi; 0x0042bbf4 mov r14, qword [rdi + 0x60] | r14 = *((rdi + 0x60)); 0x0042bbf8 call 0x403cb0 | rax = pthread_self (); 0x0042bbfd mov rbx, rax | rbx = rax; 0x0042bc00 cmp qword [r14 + 0x20], rax | | if (*((r14 + 0x20)) == rax) { 0x0042bc04 jne 0x42bc1b | 0x0042bc06 mov rax, qword [r14 + 0x38] | rax = *((r14 + 0x38)); 0x0042bc0a mov qword [rsp + 0x30], rax | *((rsp + 0x30)) = rax; 0x0042bc0f movups xmm0, xmmword [r14 + 0x28] | __asm ("movups xmm0, xmmword [r14 + 0x28]"); 0x0042bc14 movaps xmmword [rsp + 0x20], xmm0 | *((rsp + 0x20)) = xmm0; 0x0042bc19 jmp 0x42bc36 | | } else { 0x0042bc1b lea rsi, [rsp + 0x20] | 0x0042bc20 mov rdi, r14 | 0x0042bc23 call 0x42a600 | eax = BloombergLP::bdlpcre::RegEx_MatchContext::allocateMatchContext(BloombergLP::bdlpcre::RegEx_MatchContextData*)const (r14, rsp + 0x20); 0x0042bc28 mov r14d, 0xffffffff | r14d = 0xffffffff; 0x0042bc2e test eax, eax | | if (eax != 0) { 0x0042bc30 jne 0x42bdb5 | goto label_0; | } | } 0x0042bc36 mov eax, ebp | eax = ebp; 0x0042bc38 shl eax, 0xf | eax <<= 0xf; 0x0042bc3b movzx eax, ax | eax = (int32_t) ax; 0x0042bc3e mov edx, ebp | edx = ebp; 0x0042bc40 shl edx, 7 | edx <<= 7; 0x0042bc43 mov esi, edx | esi = edx; 0x0042bc45 and esi, 0x100 | esi &= 0x100; 0x0042bc4b and edx, 0x200 | edx &= 0x200; 0x0042bc51 mov edi, ebp | edi = ebp; 0x0042bc53 and edi, 8 | edi &= 8; 0x0042bc56 shl edi, 8 | edi <<= 8; 0x0042bc59 and ebp, 0x10 | ebp &= 0x10; 0x0042bc5c shl ebp, 6 | ebp <<= 6; 0x0042bc5f movzx ecx, byte [rsp + 0x80] | ecx = *((rsp + 0x80)); 0x0042bc67 shl ecx, 0x1e | ecx <<= 0x1e; 0x0042bc6a or ecx, esi | ecx |= esi; 0x0042bc6c or ecx, eax | ecx |= eax; 0x0042bc6e or ecx, edx | ecx |= edx; 0x0042bc70 or ecx, edi | ecx |= edi; 0x0042bc72 mov al, byte [r12] | al = *(r12); 0x0042bc76 test al, 1 | 0x0042bc78 mov qword [rsp + 0x10], rbx | *((rsp + 0x10)) = rbx; | if ((al & 1) == 0) { 0x0042bc7d jne 0x42bc87 | 0x0042bc7f movzx esi, al | esi = (int32_t) al; 0x0042bc82 shr rsi, 1 | rsi >>= 1; 0x0042bc85 jmp 0x42bc8c | | } else { 0x0042bc87 mov rsi, qword [r12 + 8] | rsi = *((r12 + 8)); | } 0x0042bc8c lea ecx, [rbp + rcx + 0x1000] | ecx = rbp + rcx + 0x1000; 0x0042bc93 mov dword [rsp + 0xc], ecx | *((rsp + 0xc)) = ecx; 0x0042bc97 mov qword [rsp], rsi | *(rsp) = rsi; 0x0042bc9b lea rcx, [r12 + 1] | rcx = r12 + 1; 0x0042bca0 mov qword [rsp + 0x40], rcx | *((rsp + 0x40)) = rcx; 0x0042bca5 nop word cs:[rax + rax] | 0x0042bcaf nop | | do { 0x0042bcb0 mov ecx, eax | ecx = eax; 0x0042bcb2 and cl, 1 | cl &= 1; | if (cl == 0) { 0x0042bcb5 jne 0x42bcd0 | 0x0042bcb7 shr al, 1 | al >>= 1; 0x0042bcb9 movzx eax, al | eax = (int32_t) al; 0x0042bcbc cmp rsi, rax | | if (rsi <= rax) { 0x0042bcbf ja 0x42bcda | 0x0042bcc1 jmp 0x42bcec | | } else { 0x0042bcd0 mov rax, qword [r12 + 8] | rax = *((r12 + 8)); 0x0042bcd5 cmp rsi, rax | | if (rsi <= rax) { 0x0042bcd8 jbe 0x42bcec | goto label_1; | } | } 0x0042bcda mov rdi, r12 | rdi = r12; 0x0042bcdd xor edx, edx | edx = 0; 0x0042bcdf call 0x404120 | std::_1::basic_string,std::_1::allocator>::resize(unsigned long,char) (); 0x0042bce4 movzx ecx, byte [r12] | ecx = *(r12); 0x0042bce9 and cl, 1 | cl &= 1; | } | label_1: 0x0042bcec mov rax, qword [rsp + 0x18] | rax = *((rsp + 0x18)); 0x0042bcf1 mov rdi, qword [rax + 0x48] | rdi = *((rax + 0x48)); 0x0042bcf5 mov rsi, qword [r15] | rsi = *(r15); 0x0042bcf8 mov rdx, qword [r15 + 8] | rdx = *((r15 + 8)); 0x0042bcfc mov r10, qword [rsp + 0x20] | r10 = *((rsp + 0x20)); 0x0042bd01 mov r9, qword [rsp + 0x28] | r9 = *((rsp + 0x28)); 0x0042bd06 mov r11, qword [r13] | r11 = *(r13); 0x0042bd0a mov rbx, qword [r13 + 8] | rbx = *((r13 + 8)); 0x0042bd0e mov rax, qword [rsp + 0x40] | rax = *((rsp + 0x40)); 0x0042bd13 test cl, cl | | if (cl != 0) { 0x0042bd15 je 0x42bd1c | 0x0042bd17 mov rax, qword [r12 + 0x10] | rax = *((r12 + 0x10)); | } 0x0042bd1c sub rsp, 8 | 0x0042bd20 xor ecx, ecx | ecx = 0; 0x0042bd22 mov r8d, dword [rsp + 0x14] | r8d = *((rsp + 0x14)); 0x0042bd27 lea rbp, [rsp + 8] | rbp = rsp + 8; 0x0042bd2c push rbp | 0x0042bd2d push rax | 0x0042bd2e push rbx | 0x0042bd2f push r11 | 0x0042bd31 push r10 | 0x0042bd33 call 0x4d0690 | eax = pcre2_substitute_8 (); 0x0042bd38 add rsp, 0x30 | 0x0042bd3c cmp eax, 0xffffffd0 | | if (eax != 0xffffffd0) { 0x0042bd3f jne 0x42bd4f | goto label_2; | } 0x0042bd41 mov rsi, qword [rsp] | rsi = *(rsp); 0x0042bd45 movzx eax, byte [r12] | eax = *(r12); 0x0042bd4a jmp 0x42bcb0 | | } while (1); | label_2: 0x0042bd4f mov r14d, eax | r14d = eax; 0x0042bd52 test eax, eax | | if (eax >= 0) { 0x0042bd54 js 0x42bd6b | 0x0042bd56 mov rsi, qword [rsp] | rsi = *(rsp); 0x0042bd5a mov rdi, r12 | rdi = r12; 0x0042bd5d xor edx, edx | edx = 0; 0x0042bd5f call 0x404120 | std::_1::basic_string,std::_1::allocator>::resize(unsigned long,char) (); 0x0042bd64 mov rcx, qword [rsp + 0x10] | rcx = *((rsp + 0x10)); 0x0042bd69 jmp 0x42bd88 | | } else { 0x0042bd6b cmp r14d, 0xffffffff | 0x0042bd6f mov rcx, qword [rsp + 0x10] | rcx = *((rsp + 0x10)); | if (r14d != 0xffffffff) { 0x0042bd74 je 0x42bd7a | 0x0042bd76 mov r14d, dword [rsp] | r14d = *(rsp); | } 0x0042bd7a mov rax, qword [rsp + 0x38] | rax = *((rsp + 0x38)); 0x0042bd7f mov dword [rax], r14d | *(rax) = r14d; 0x0042bd82 mov r14d, 0xffffffff | r14d = 0xffffffff; | } 0x0042bd88 mov rax, qword [rsp + 0x18] | rax = *((rsp + 0x18)); 0x0042bd8d mov rax, qword [rax + 0x60] | rax = *((rax + 0x60)); 0x0042bd91 cmp qword [rax + 0x20], rcx | | if (*((rax + 0x20)) != rcx) { 0x0042bd95 je 0x42bdb5 | 0x0042bd97 mov rdi, qword [rsp + 0x28] | rdi = *((rsp + 0x28)); 0x0042bd9c call 0x4cc070 | pcre2_match_data_free_8 (); 0x0042bda1 mov rdi, qword [rsp + 0x30] | rdi = *((rsp + 0x30)); 0x0042bda6 call 0x47e0f0 | pcre2_jit_stack_free_8 (); 0x0042bdab mov rdi, qword [rsp + 0x20] | rdi = *((rsp + 0x20)); 0x0042bdb0 call 0x4627d0 | pcre2_match_context_free_8 (); | } | label_0: 0x0042bdb5 mov eax, r14d | eax = r14d; 0x0042bdb8 add rsp, 0x48 | 0x0042bdbc pop rbx | 0x0042bdbd pop r12 | 0x0042bdbf pop r13 | 0x0042bdc1 pop r14 | 0x0042bdc3 pop r15 | 0x0042bdc5 pop rbp | 0x0042bdc6 ret | return rax; | }