; assembly | /* r2dec pseudo code output */ | /* balber_berutil.t/assume @ 0x45e470 */ | #include | ; (fcn) sym.void__anonymous_namespace_::u::checksumAppend__anonymous_namespace_::u::Md5ChecksumAlgorithm___anonymous_namespace_::u::Md5ChecksumAlgorithm___anonymous_namespace_::u::GetValueFingerprint_const_ () | int64_t void_anonymous_namespace_::u::checksumAppend_anonymous_namespace_::u::Md5ChecksumAlgorithm_anonymous_namespace_::u::Md5ChecksumAlgorithm_anonymous_namespace_::u::GetValueFingerprint_const_ (char * arg2, char * arg1) { | int64_t var_2ch; | int64_t var_30h; | int64_t var_40h; | int64_t var_48h; | int64_t var_50h; | int64_t var_70h; | int64_t var_78h; | int64_t var_80h; | int64_t var_a8h; | int64_t var_b0h; | uint32_t var_b8h; | int64_t var_c0h; | int64_t var_c8h; | int64_t var_cch; | int64_t var_d0h; | int64_t var_107h; | int64_t var_108h; | int64_t var_138h; | int64_t var_145h; | int64_t var_148h; | int64_t var_180h; | rsi = arg2; | rdi = arg1; | /* void (anonymous namespace)::u::checksumAppend<(anonymous namespace)::u::Md5ChecksumAlgorithm>((anonymous namespace)::u::Md5ChecksumAlgorithm&, (anonymous namespace)::u::GetValueFingerprint const&) */ 0x0045e470 push rbp | 0x0045e471 push r15 | 0x0045e473 push r14 | 0x0045e475 push r13 | 0x0045e477 push r12 | 0x0045e479 push rbx | 0x0045e47a sub rsp, 0x188 | 0x0045e481 mov rbx, rsi | rbx = rsi; 0x0045e484 mov r15, rdi | r15 = rdi; 0x0045e487 lea rdi, [rsp + 0x138] | rdi = rsp + 0x138; 0x0045e48f call 0x469630 | BloombergLP::balber::BerEncoderOptions::BerEncoderOptions() (); 0x0045e494 mov eax, dword [rbx + 8] | eax = *((rbx + 8)); 0x0045e497 mov dword [rsp + 0x138], eax | *((rsp + 0x138)) = eax; 0x0045e49e mov al, byte [rbx + 0xc] | al = *((rbx + 0xc)); 0x0045e4a1 mov byte [rsp + 0x145], al | *((rsp + 0x145)) = al; 0x0045e4a8 cmp dword [rbx + 4], 0 | | if (*((rbx + 4)) == 0) { 0x0045e4ac je 0x4641d9 | void (*0x4641d9)() (); | } 0x0045e4b2 xor r13d, r13d | r13d = 0; 0x0045e4b5 lea r14, [rsp + 0x80] | r14 = rsp + 0x80; 0x0045e4bd mov qword [rsp + 0x180], rbx | *((rsp + 0x180)) = rbx; 0x0045e4c5 mov qword [rsp + 0x148], r15 | *((rsp + 0x148)) = r15; 0x0045e4cd jmp 0x45e4e5 | goto label_0; 0x0045e4d0 inc r13d | r13d++; 0x0045e4d3 mov rbx, qword [rsp + 0x180] | rbx = *((rsp + 0x180)); 0x0045e4db cmp r13d, dword [rbx + 4] | | if (r13d == *((rbx + 4))) { 0x0045e4df je 0x4641d9 | void (*0x4641d9)() (); | } | label_0: 0x0045e4e5 mov ebx, dword [rbx] | ebx = *(rbx); 0x0045e4e7 add ebx, r13d | ebx += r13d; 0x0045e4ea cmp byte [rip + 0x4fadb0], 0 | | if (*(obj._anonymous_namespace_::veryVeryVerbose) != 0) { 0x0045e4f1 je 0x45e507 | 0x0045e4f3 mov edi, 0x9591f0 | 0x0045e4f8 mov esi, 0x50780a | 0x0045e4fd mov edx, 0x15 | 0x0045e502 call 0x466ae0 | std::_1::basic_ostream>&std::_1::_put_character_sequence>(std::_1::basic_ostream>&,char const*,unsigned long) (obj.std::__1::cout, "[GetValueFingerprint ", 0x15); | } 0x0045e507 mov dword [rsp + 0x2c], r13d | *((rsp + 0x2c)) = r13d; 0x0045e50c imul ecx, ebx, 0x41c64e6d | ecx = ebx * 0x41c64e6d; 0x0045e512 add ecx, 0x3039 | ecx += 0x3039; 0x0045e518 mov edx, ecx | edx = ecx; 0x0045e51a shr edx, 0x18 | edx >>= 0x18; 0x0045e51d and edx, 0x7f | edx &= 0x7f; 0x0045e520 imul esi, ecx, 0x41c64e6d | esi = ecx * 0x41c64e6d; 0x0045e526 shr ecx, 0x10 | ecx >>= 0x10; 0x0045e529 add esi, 0x3039 | esi += 0x3039; 0x0045e52f mov edi, esi | edi = esi; 0x0045e531 shr edi, 0x18 | edi >>= 0x18; 0x0045e534 and edi, 0x7f | edi &= 0x7f; 0x0045e537 imul eax, esi, 0x41c64e6d | eax = esi * 0x41c64e6d; 0x0045e53d shr esi, 0x10 | esi >>= 0x10; 0x0045e540 xor esi, edi | esi ^= edi; 0x0045e542 movzx ecx, cl | ecx = (int32_t) cl; 0x0045e545 xor ecx, edx | ecx ^= edx; 0x0045e547 add eax, 0x3039 | eax += 0x3039; 0x0045e54c shl esi, 8 | esi <<= 8; 0x0045e54f movzx edx, si | edx = (int32_t) si; 0x0045e552 or edx, ecx | edx |= ecx; 0x0045e554 imul ecx, eax, 0x41c64e6d | ecx = eax * 0x41c64e6d; 0x0045e55a add ecx, 0x3039 | ecx += 0x3039; 0x0045e560 mov esi, eax | esi = eax; 0x0045e562 shr esi, 8 | esi >>= 8; 0x0045e565 and esi, 0x7f0000 | esi &= 0x7f0000; 0x0045e56b and eax, 0xff0000 | eax &= 0xff0000; 0x0045e570 xor eax, esi | eax ^= esi; 0x0045e572 or eax, edx | eax |= edx; 0x0045e574 imul ebp, ecx, 0x41c64e6d | ebp = ecx * 0x41c64e6d; 0x0045e57a add ebp, 0x3039 | ebp += 0x3039; 0x0045e580 mov dword [rsp + 0xc8], ebp | *((rsp + 0xc8)) = ebp; 0x0045e587 mov edx, ebp | edx = ebp; 0x0045e589 shr edx, 0x18 | edx >>= 0x18; 0x0045e58c and edx, 0x7f | edx &= 0x7f; 0x0045e58f mov r13d, ebp | r13d = ebp; 0x0045e592 shr r13d, 0x10 | r13d >>= 0x10; 0x0045e596 xor r13d, edx | r13d ^= edx; 0x0045e599 mov byte [rsp + 0xcc], r13b | *((rsp + 0xcc)) = r13b; 0x0045e5a1 mov edx, ecx | edx = ecx; 0x0045e5a3 shl edx, 8 | edx <<= 8; 0x0045e5a6 and edx, 0xff000000 | edx &= 0xff000000; 0x0045e5ac and ecx, 0x7f000000 | ecx &= 0x7f000000; 0x0045e5b2 xor ecx, edx | ecx ^= edx; 0x0045e5b4 or ecx, eax | ecx |= eax; 0x0045e5b6 movsxd rax, ecx | rax = (int64_t) ecx; 0x0045e5b9 imul rcx, rax, 0x30c30c31 | rcx = rax * 0x30c30c31; 0x0045e5c0 mov rdx, rcx | rdx = rcx; 0x0045e5c3 shr rdx, 0x3f | rdx >>= 0x3f; 0x0045e5c7 sar rcx, 0x22 | rcx >>= 0x22; 0x0045e5cb add ecx, edx | ecx += edx; 0x0045e5cd lea edx, [rcx + rcx*4] | edx = rcx * 5; 0x0045e5d0 lea ecx, [rcx + rdx*4] | ecx = rcx + rdx*4; 0x0045e5d3 sub eax, ecx | eax -= ecx; 0x0045e5d5 mov ecx, eax | ecx = eax; 0x0045e5d7 sar ecx, 0x1f | ecx >>= 0x1f; 0x0045e5da and ecx, 0x14 | ecx &= 0x14; 0x0045e5dd add ecx, eax | ecx += eax; | /* switch table (1 cases) at 0x4e0400 */ 0x0045e5df jmp qword [rcx*8 + 0x4e0400] | 0x0045e5e6 mov dword [rsp + 0xd0], 0 | *((rsp + 0xd0)) = 0; 0x0045e5f1 imul eax, ebp, 0x41c64e6d | eax = ebp * 0x41c64e6d; 0x0045e5f7 add eax, 0x3039 | eax += 0x3039; 0x0045e5fc mov dword [rsp + 0xc8], eax | *((rsp + 0xc8)) = eax; 0x0045e603 mov ecx, eax | ecx = eax; 0x0045e605 shr ecx, 0x18 | ecx >>= 0x18; 0x0045e608 and ecx, 0x7f | ecx &= 0x7f; 0x0045e60b shr eax, 0x10 | eax >>= 0x10; 0x0045e60e xor eax, ecx | eax ^= ecx; 0x0045e610 mov byte [rsp + 0xcc], al | *((rsp + 0xcc)) = al; 0x0045e617 mov rdi, r14 | rdi = r14; 0x0045e61a call 0x4048b0 | std::_1::basic_streambuf>::basic_streambuf() (); 0x0045e61f mov qword [rsp + 0x80], 0x50a390 | *((rsp + 0x80)) = vtable.BloombergLP::bdlsb::MemOutStreamBuf.0; 0x0045e62b mov rax, qword [rip + 0x4fada6] | rax = BloombergLP::bslma::Default::s_defaultAllocator; 0x0045e632 test rax, rax | | if (rax == 0) { 0x0045e635 jne 0x45e63c | 0x0045e637 call 0x4b9920 | rax = BloombergLP::bslma::Default::determineAndReturnDefaultAllocator() (); | } 0x0045e63c mov qword [rsp + 0xc0], rax | *((rsp + 0xc0)) = rax; 0x0045e644 lea rax, [rsp + 0xa8] | rax = rsp + 0xa8; 0x0045e64c xorps xmm0, xmm0 | __asm ("xorps xmm0, xmm0"); 0x0045e64f movups xmmword [rax], xmm0 | __asm ("movups xmmword [rax], xmm0"); 0x0045e652 mov qword [rax + 0x10], 0 | *((rax + 0x10)) = 0; 0x0045e65a mov rdi, r14 | 0x0045e65d mov esi, 1 | 0x0045e662 call 0x46a090 | eax = BloombergLP::balber::BerUtil_LengthImpUtil::putLength(std::_1::basic_streambuf>*,int) (r14, 1); 0x0045e667 test eax, eax | | if (eax != 0) { 0x0045e669 jne 0x462c81 | void (*0x462c81)() (); | } 0x0045e66f and r13b, 1 | r13b &= 1; 0x0045e673 mov rax, qword [rsp + 0xb0] | rax = *((rsp + 0xb0)); 0x0045e67b cmp rax, qword [rsp + 0xb8] | | if (rax == *((rsp + 0xb8))) { 0x0045e683 je 0x462c6f | void (*0x462c6f)() (); | } 0x0045e689 lea rcx, [rax + 1] | rcx = rax + 1; 0x0045e68d mov qword [rsp + 0xb0], rcx | *((rsp + 0xb0)) = rcx; 0x0045e695 mov byte [rax], r13b | *(rax) = r13b; 0x0045e698 jmp 0x462c81 | return void (*0x462c81)() (); | }