; assembly | /* r2dec pseudo code output */ | /* bdlc_flathashmap.t/assume @ 0x4536c0 */ | #include | ; (fcn) fcn.004536c0 () | int64_t fcn_004536c0 (void * arg3, uint32_t arg2, size_t arg1) { | int64_t var_4h; | signed int64_t var_8h; | int64_t var_10h; | void * var_20h; | int64_t var_28h; | void * var_30h; | int64_t var_38h; | int64_t var_40h; | int64_t var_48h; | int64_t var_50h; | int64_t var_58h; | int64_t var_60h; | int64_t var_68h; | int64_t var_70h; | int64_t var_80h; | int64_t var_88h; | uint32_t var_90h; | int64_t var_98h; | int64_t var_a0h; | int64_t var_130h; | int64_t var_190h; | int64_t var_198h; | rdx = arg3; | rsi = arg2; | rdi = arg1; 0x004536c0 push rbp | 0x004536c1 push r15 | 0x004536c3 push r14 | 0x004536c5 push r13 | 0x004536c7 push r12 | 0x004536c9 push rbx | 0x004536ca sub rsp, 0x1a8 | 0x004536d1 mov rbx, rdx | rbx = rdx; 0x004536d4 mov r15, rsi | r15 = rsi; 0x004536d7 mov r12, rdi | r12 = rdi; 0x004536da mov rax, qword [rdx + 0x20] | rax = *((rdx + 0x20)); 0x004536de mov qword [rsp + 0x30], rax | *((rsp + 0x30)) = rax; 0x004536e3 movups xmm0, xmmword [rdx] | __asm ("movups xmm0, xmmword [rdx]"); 0x004536e6 movups xmm1, xmmword [rdx + 0x10] | __asm ("movups xmm1, xmmword [rdx + 0x10]"); 0x004536ea movaps xmmword [rsp + 0x20], xmm1 | *((rsp + 0x20)) = xmm1; 0x004536ef movaps xmmword [rsp + 0x10], xmm0 | *((rsp + 0x10)) = xmm0; 0x004536f4 mov rax, qword [rip + 0x25874d] | rax = BloombergLP::bslma::Default::s_defaultAllocator; 0x004536fb test rax, rax | | if (rax == 0) { 0x004536fe jne 0x453705 | 0x00453700 call 0x460860 | rax = BloombergLP::bslma::Default::determineAndReturnDefaultAllocator() (); | } 0x00453705 mov qword [rsp + 0x38], rax | *((rsp + 0x38)) = rax; 0x0045370a mov ebp, 0x17 | 0x0045370f cmp qword [rsp + 0x30], 0x17 | | if (*((rsp + 0x30)) != 0x17) { 0x00453715 je 0x45377b | 0x00453717 mov r14, qword [rbx + 0x18] | r14 = *((rbx + 0x18)); 0x0045371b mov ebp, 0x17 | 0x00453720 cmp r14, 0x17 | | if (r14 > 0x17) { 0x00453724 cmova rbp, r14 | | } 0x00453728 mov qword [rsp + 0x10], 0 | *((rsp + 0x10)) = 0; 0x00453731 mov qword [rsp + 0x28], r14 | *((rsp + 0x28)) = r14; 0x00453736 mov qword [rsp + 0x30], rbp | *((rsp + 0x30)) = rbp; | if (r14 <= 0x17) { 0x0045373b ja 0x453747 | 0x0045373d lea rdi, [rsp + 0x10] | rdi = rsp + 0x10; 0x00453742 inc r14 | r14++; 0x00453745 jmp 0x453761 | | } else { 0x00453747 lea rsi, [rbp + 1] | rsi = rbp + 1; 0x0045374b mov rcx, qword [rax] | rcx = *(rax); 0x0045374e mov rdi, rax | rdi = rax; 0x00453751 call qword [rcx + 0x10] | rax = uint64_t (*rcx + 0x10)() (); 0x00453754 mov rdi, rax | rdi = rax; 0x00453757 mov qword [rsp + 0x10], rax | *((rsp + 0x10)) = rax; 0x0045375c inc r14 | r14++; | if (r14 == 0) { 0x0045375f je 0x45377b | goto label_0; | } | } 0x00453761 cmp qword [rbx + 0x20], 0x17 | 0x00453766 mov rsi, rbx | rsi = rbx; | if (*((rbx + 0x20)) != 0x17) { 0x00453769 je 0x45376e | 0x0045376b mov rsi, qword [rbx] | | } 0x0045376e mov rdx, r14 | 0x00453771 call 0x403f70 | memcpy (rdi, *(rbx), r14); 0x00453776 mov rbp, qword [rsp + 0x30] | rbp = *((rsp + 0x30)); | } | label_0: 0x0045377b movsd xmm0, qword [rbx + 0x30] | xmm0 = *((rbx + 0x30)); 0x00453780 movsd qword [rsp + 0x40], xmm0 | *((rsp + 0x40)) = xmm0; 0x00453786 mov qword [rsp + 0x190], 0 | *((rsp + 0x190)) = 0; 0x00453792 mov byte [rsp + 0x198], 0 | *((rsp + 0x198)) = 0; 0x0045379a movdqa xmm0, xmmword [rip + 0x3449e] | __asm ("movdqa xmm0, xmmword [0x00487c40]"); 0x004537a2 movdqu xmmword [rsp + 0x130], xmm0 | __asm ("movdqu xmmword [rsp + 0x130], xmm0"); 0x004537ab cmp rbp, 0x17 | | if (rbp != 0x17) { 0x004537af je 0x4537b8 | 0x004537b1 mov rsi, qword [rsp + 0x10] | rsi = *((rsp + 0x10)); 0x004537b6 jmp 0x4537bd | | } else { 0x004537b8 lea rsi, [rsp + 0x10] | | } 0x004537bd mov rdx, qword [rsp + 0x28] | 0x004537c2 lea rdi, [rsp + 0x70] | 0x004537c7 call 0x45f7a0 | BloombergLP::bslh::SpookyHashAlgorithmImp::update(voidconst*,unsigned long) (rsp + 0x70, rsp + 0x10, *((rsp + 0x28))); 0x004537cc mov rax, qword [rsp + 0x28] | rax = *((rsp + 0x28)); 0x004537d1 mov qword [rsp + 8], rax | *((rsp + 8)) = rax; 0x004537d6 lea rdi, [rsp + 0x70] | 0x004537db lea rsi, [rsp + 8] | 0x004537e0 mov edx, 8 | 0x004537e5 call 0x45f7a0 | BloombergLP::bslh::SpookyHashAlgorithmImp::update(voidconst*,unsigned long) (rsp + 0x70, rsp + 8, 8); 0x004537ea lea r14, [rsp + 0x70] | r14 = rsp + 0x70; 0x004537ef lea rsi, [rsp + 8] | 0x004537f4 lea rdx, [rsp + 0x68] | 0x004537f9 mov rdi, r14 | 0x004537fc call 0x45ed20 | BloombergLP::bslh::SpookyHashAlgorithmImp::finalize(unsigned long long*,unsigned long long*) (r14, rsp + 8, rsp + 0x68); 0x00453801 movabs rbp, 0x9e3779b97f4a7c15 | 0x0045380b imul rbp, qword [rsp + 8] | rbp *= *((rsp + 8)); 0x00453811 cmp qword [rsp + 0x30], 0x17 | | if (*((rsp + 0x30)) != 0x17) { 0x00453817 je 0x453829 | 0x00453819 mov rsi, qword [rsp + 0x10] | rsi = *((rsp + 0x10)); 0x0045381e mov rdi, qword [rsp + 0x38] | rdi = *((rsp + 0x38)); 0x00453823 mov rax, qword [rdi] | rax = *(rdi); 0x00453826 call qword [rax + 0x18] | uint64_t (*rax + 0x18)() (); | } 0x00453829 mov rax, qword [rbx + 0x20] | rax = *((rbx + 0x20)); 0x0045382d mov qword [rsp + 0x90], rax | *((rsp + 0x90)) = rax; 0x00453835 movups xmm0, xmmword [rbx] | __asm ("movups xmm0, xmmword [rbx]"); 0x00453838 movups xmm1, xmmword [rbx + 0x10] | __asm ("movups xmm1, xmmword [rbx + 0x10]"); 0x0045383c movaps xmmword [rsp + 0x80], xmm1 | *((rsp + 0x80)) = xmm1; 0x00453844 movaps xmmword [rsp + 0x70], xmm0 | *((rsp + 0x70)) = xmm0; 0x00453849 mov rax, qword [rip + 0x2585f8] | rax = BloombergLP::bslma::Default::s_defaultAllocator; 0x00453850 test rax, rax | | if (rax == 0) { 0x00453853 jne 0x45385a | 0x00453855 call 0x460860 | rax = BloombergLP::bslma::Default::determineAndReturnDefaultAllocator() (); | } 0x0045385a mov qword [rsp + 0x98], rax | *((rsp + 0x98)) = rax; 0x00453862 cmp qword [rsp + 0x90], 0x17 | | if (*((rsp + 0x90)) != 0x17) { 0x0045386b je 0x4538de | 0x0045386d mov rcx, qword [rbx + 0x18] | rcx = *((rbx + 0x18)); 0x00453871 cmp rcx, 0x17 | 0x00453875 mov esi, 0x17 | esi = 0x17; | if (rcx > 0x17) { 0x0045387a cmova rsi, rcx | rsi = rcx; | } 0x0045387e mov qword [rsp + 0x70], 0 | *((rsp + 0x70)) = 0; 0x00453887 mov qword [rsp + 0x88], rcx | *((rsp + 0x88)) = rcx; 0x0045388f mov qword [rsp + 0x90], rsi | *((rsp + 0x90)) = rsi; 0x00453897 cmp rcx, 0x18 | | if (rcx >= 0x18) { 0x0045389b jb 0x4538b9 | 0x0045389d inc rsi | rsi++; 0x004538a0 mov rcx, qword [rax] | rcx = *(rax); 0x004538a3 mov rdi, rax | rdi = rax; 0x004538a6 call qword [rcx + 0x10] | rax = uint64_t (*rcx + 0x10)() (); 0x004538a9 mov qword [rsp + 0x70], rax | *((rsp + 0x70)) = rax; 0x004538ae cmp qword [rsp + 0x90], 0x17 | | if (*((rsp + 0x90)) != 0x17) { 0x004538b7 jne 0x4538bc | goto label_1; | } | } 0x004538b9 mov rax, r14 | rax = r14; | label_1: 0x004538bc mov rdx, qword [rsp + 0x88] | rdx = *((rsp + 0x88)); 0x004538c4 inc rdx | rdx++; | if (rdx == 0) { 0x004538c7 je 0x4538de | goto label_2; | } 0x004538c9 cmp qword [rbx + 0x20], 0x17 | 0x004538ce mov rsi, rbx | rsi = rbx; | if (*((rbx + 0x20)) != 0x17) { 0x004538d1 je 0x4538d6 | 0x004538d3 mov rsi, qword [rbx] | | } 0x004538d6 mov rdi, rax | 0x004538d9 call 0x403f70 | memcpy (rax, *(rbx), rdx); | } | label_2: 0x004538de mov qword [rsp + 0x60], rbx | *((rsp + 0x60)) = rbx; 0x004538e3 movq xmm0, qword [rbx + 0x30] | xmm0 = *((rbx + 0x30)); 0x004538e8 movq qword [rsp + 0xa0], xmm0 | *((rsp + 0xa0)) = xmm0; 0x004538f1 lea rsi, [rsp + 0x70] | rsi = rsp + 0x70; 0x004538f6 mov rdi, r15 | rdi = r15; 0x004538f9 mov rdx, rbp | rdx = rbp; 0x004538fc call 0x453b90 | rax = BloombergLP::bdlc::FlatHashTable,bsl::allocator>,bsl::pair,bsl::allocator>,double>,BloombergLP::bdlc::FlatHashMap_EntryUtil,bsl::allocator>,double,bsl::pair,bsl::allocator>,double>>,BloombergLP::bslh::FibonacciBadHashWrapper,bsl::allocator>>>,bsl::equal_to,bsl::allocator>>>::findKey(bsl::basic_string,bsl::allocator>const&,unsigned long)const (); 0x00453901 mov r13, rax | r13 = rax; 0x00453904 mov rbx, qword [r15 + 0x18] | rbx = *((r15 + 0x18)); 0x00453908 cmp rax, rbx | 0x0045390b mov qword [rsp + 0x58], rbp | *((rsp + 0x58)) = rbp; | if (rax != rbx) { 0x00453910 jne 0x453990 | goto label_3; | } 0x00453912 mov rax, r13 | rax = r13; 0x00453915 shr rax, 3 | rax >>= 3; 0x00453919 lea rcx, [rax*8] | rcx = rax*8; 0x00453921 sub rcx, rax | rcx -= rax; 0x00453924 mov rax, r13 | rax = r13; 0x00453927 cmp qword [r15 + 0x10], rcx | | if (*((r15 + 0x10)) >= rcx) { 0x0045392b jb 0x45394a | 0x0045392d lea rax, [r13 + r13] | rax = r13 + r13; 0x00453932 test r13, r13 | 0x00453935 mov esi, 0x20 | esi = 0x20; | if (r13 != 0) { 0x0045393a cmovne rsi, rax | rsi = rax; | } 0x0045393e mov rdi, r15 | rdi = r15; 0x00453941 call 0x453d10 | BloombergLP::bdlc::FlatHashTable,bsl::allocator>,bsl::pair,bsl::allocator>,double>,BloombergLP::bdlc::FlatHashMap_EntryUtil,bsl::allocator>,double,bsl::pair,bsl::allocator>,double>>,BloombergLP::bslh::FibonacciBadHashWrapper,bsl::allocator>>>,bsl::equal_to,bsl::allocator>>>::rehashRaw(unsigned long) (); 0x00453946 mov rax, qword [r15 + 0x18] | rax = *((r15 + 0x18)); | } 0x0045394a test rax, rax | | if (rax == 0) { 0x0045394d je 0x4539a3 | goto label_4; | } 0x0045394f mov cl, byte [r15 + 0x20] | cl = *((r15 + 0x20)); 0x00453953 shr rbp, cl | rbp >>= cl; 0x00453956 mov rcx, qword [r15 + 8] | rcx = *((r15 + 8)); 0x0045395a shl rbp, 4 | rbp <<= 4; 0x0045395e lea rdx, [rax - 1] | rdx = rax - 1; 0x00453962 xor esi, esi | esi = 0; 0x00453964 nop word cs:[rax + rax] | 0x0045396e nop | | do { 0x00453970 movdqu xmm0, xmmword [rcx + rbp] | __asm ("movdqu xmm0, xmmword [rcx + rbp]"); 0x00453975 pmovmskb edi, xmm0 | __asm ("pmovmskb edi, xmm0"); 0x00453979 test di, di | | if (di != 0) { 0x0045397c jne 0x4539a5 | goto label_5; | } 0x0045397e add rbp, 0x10 | rbp += 0x10; 0x00453982 and rbp, rdx | rbp &= rdx; 0x00453985 add rsi, 0x10 | rsi += 0x10; 0x00453989 cmp rsi, rax | 0x0045398c jb 0x453970 | | } while (rsi < rax); 0x0045398e jmp 0x4539ae | goto label_6; | label_3: 0x00453990 xor r8d, r8d | r8d = 0; 0x00453993 mov rbp, r13 | 0x00453996 cmp qword [rsp + 0x90], 0x17 | | if (*((rsp + 0x90)) == 0x17) { 0x0045399f jne 0x4539bc | 0x004539a1 jmp 0x4539e1 | goto label_7; | label_4: 0x004539a3 jmp 0x4539ae | goto label_6; | label_5: 0x004539a5 movzx eax, di | eax = (int32_t) di; 0x004539a8 bsf eax, eax | __asm ("bsf eax, eax"); 0x004539ab add rbp, rax | rbp += rax; | label_6: 0x004539ae mov r8b, 1 | r8b = 1; 0x004539b1 cmp qword [rsp + 0x90], 0x17 | | if (*((rsp + 0x90)) == 0x17) { 0x004539ba je 0x4539e1 | goto label_7; | } | } 0x004539bc mov rsi, qword [rsp + 0x70] | rsi = *((rsp + 0x70)); 0x004539c1 mov rdi, qword [rsp + 0x98] | rdi = *((rsp + 0x98)); 0x004539c9 mov rax, qword [rdi] | rax = *(rdi); 0x004539cc mov r14, r15 | r14 = r15; 0x004539cf mov r15, r12 | r15 = r12; 0x004539d2 mov r12d, r8d | r12d = r8d; 0x004539d5 call qword [rax + 0x18] | uint64_t (*rax + 0x18)() (); 0x004539d8 mov r8d, r12d | r8d = r12d; 0x004539db mov r12, r15 | r12 = r15; 0x004539de mov r15, r14 | r15 = r14; | label_7: 0x004539e1 cmp r13, rbx | | if (r13 == rbx) { 0x004539e4 jne 0x453aec | 0x004539ea mov qword [rsp + 0x50], r12 | *((rsp + 0x50)) = r12; 0x004539ef mov r14, qword [r15] | r14 = *(r15); 0x004539f2 mov rdi, qword [r15 + 0x28] | rdi = *((r15 + 0x28)); 0x004539f6 imul r13, rbp, 0x38 | r13 = rbp * 0x38; 0x004539fa lea r12, [r14 + r13] | r12 = r14 + r13; 0x004539fe test rdi, rdi | 0x00453a01 mov rbx, qword [rsp + 0x60] | rbx = *((rsp + 0x60)); | if (rdi == 0) { 0x00453a06 jne 0x453a26 | 0x00453a08 mov rdi, qword [rip + 0x258439] | rdi = BloombergLP::bslma::Default::s_defaultAllocator; 0x00453a0f test rdi, rdi | | if (rdi != 0) { 0x00453a12 jne 0x453a26 | goto label_8; | } 0x00453a14 mov dword [rsp + 4], r8d | *((rsp + 4)) = r8d; 0x00453a19 call 0x460860 | rax = BloombergLP::bslma::Default::determineAndReturnDefaultAllocator() (); 0x00453a1e mov r8d, dword [rsp + 4] | r8d = *((rsp + 4)); 0x00453a23 mov rdi, rax | rdi = rax; | } | label_8: 0x00453a26 mov rax, qword [rbx + 0x20] | rax = *((rbx + 0x20)); 0x00453a2a mov qword [r12 + 0x20], rax | *((r12 + 0x20)) = rax; 0x00453a2f movups xmm0, xmmword [rbx] | __asm ("movups xmm0, xmmword [rbx]"); 0x00453a32 movups xmm1, xmmword [rbx + 0x10] | __asm ("movups xmm1, xmmword [rbx + 0x10]"); 0x00453a36 movups xmmword [r12 + 0x10], xmm1 | __asm ("movups xmmword [r12 + 0x10], xmm1"); 0x00453a3c movups xmmword [r12], xmm0 | __asm ("movups xmmword [r12], xmm0"); 0x00453a41 mov qword [r14 + r13 + 0x28], rdi | *((r14 + r13 + 0x28)) = rdi; 0x00453a46 cmp qword [r14 + r13 + 0x20], 0x17 | | if (*((r14 + r13 + 0x20)) != 0x17) { 0x00453a4c je 0x453ac8 | 0x00453a4e lea rcx, [r14 + r13 + 0x20] | rcx = r14 + r13 + 0x20; 0x00453a53 mov rax, qword [rbx + 0x18] | rax = *((rbx + 0x18)); 0x00453a57 cmp rax, 0x17 | 0x00453a5b mov esi, 0x17 | esi = 0x17; | if (rax > 0x17) { 0x00453a60 cmova rsi, rax | rsi = rax; | } 0x00453a64 mov qword [r12], 0 | *(r12) = 0; 0x00453a6c mov qword [r14 + r13 + 0x18], rax | *((r14 + r13 + 0x18)) = rax; 0x00453a71 mov qword [rcx], rsi | *(rcx) = rsi; 0x00453a74 cmp rax, 0x18 | | if (rax >= 0x18) { 0x00453a78 jb 0x453aa1 | 0x00453a7a inc rsi | rsi++; 0x00453a7d mov rax, qword [rdi] | rax = *(rdi); 0x00453a80 mov dword [rsp + 4], r8d | *((rsp + 4)) = r8d; 0x00453a85 mov qword [rsp + 0x48], rcx | *((rsp + 0x48)) = rcx; 0x00453a8a call qword [rax + 0x10] | rax = uint64_t (*rax + 0x10)() (); 0x00453a8d mov rcx, qword [rsp + 0x48] | rcx = *((rsp + 0x48)); 0x00453a92 mov r8d, dword [rsp + 4] | r8d = *((rsp + 4)); 0x00453a97 mov qword [r12], rax | *(r12) = rax; 0x00453a9b cmp qword [rcx], 0x17 | | if (*(rcx) != 0x17) { 0x00453a9f jne 0x453aa4 | goto label_9; | } | } 0x00453aa1 mov rax, r12 | rax = r12; | label_9: 0x00453aa4 mov rdx, qword [rcx - 8] | rdx = *((rcx - 8)); 0x00453aa8 inc rdx | rdx++; | if (rdx == 0) { 0x00453aab je 0x453ac8 | goto label_10; | } 0x00453aad mov r12d, r8d | r12d = r8d; 0x00453ab0 cmp qword [rbx + 0x20], 0x17 | 0x00453ab5 mov rsi, rbx | rsi = rbx; | if (*((rbx + 0x20)) != 0x17) { 0x00453ab8 je 0x453abd | 0x00453aba mov rsi, qword [rbx] | | } 0x00453abd mov rdi, rax | 0x00453ac0 call 0x403f70 | memcpy (rax, *(rbx), rdx); 0x00453ac5 mov r8d, r12d | r8d = r12d; | } | label_10: 0x00453ac8 movq xmm0, qword [rbx + 0x30] | xmm0 = *((rbx + 0x30)); 0x00453acd movq qword [r14 + r13 + 0x30], xmm0 | *((r14 + r13 + 0x30)) = xmm0; 0x00453ad4 mov rcx, qword [rsp + 0x58] | rcx = *((rsp + 0x58)); 0x00453ad9 and cl, 0x7f | cl &= 0x7f; 0x00453adc mov rax, qword [r15 + 8] | rax = *((r15 + 8)); 0x00453ae0 mov byte [rax + rbp], cl | *((rax + rbp)) = cl; 0x00453ae3 inc qword [r15 + 0x10] | *((r15 + 0x10))++; 0x00453ae7 mov r12, qword [rsp + 0x50] | r12 = *((rsp + 0x50)); | } 0x00453aec imul rax, rbp, 0x38 | rax = rbp * 0x38; 0x00453af0 add rax, qword [r15] | rax += *(r15); 0x00453af3 mov rcx, qword [r15 + 8] | rcx = *((r15 + 8)); 0x00453af7 add rcx, rbp | rcx += rbp; 0x00453afa not rbp | rbp = ~rbp; 0x00453afd add rbp, qword [r15 + 0x18] | rbp += *((r15 + 0x18)); 0x00453b01 mov qword [r12], rax | *(r12) = rax; 0x00453b05 mov qword [r12 + 8], rcx | *((r12 + 8)) = rcx; 0x00453b0a mov qword [r12 + 0x10], rbp | *((r12 + 0x10)) = rbp; 0x00453b0f mov byte [r12 + 0x18], r8b | *((r12 + 0x18)) = r8b; 0x00453b14 mov rax, r12 | rax = r12; 0x00453b17 add rsp, 0x1a8 | 0x00453b1e pop rbx | 0x00453b1f pop r12 | 0x00453b21 pop r13 | 0x00453b23 pop r14 | 0x00453b25 pop r15 | 0x00453b27 pop rbp | 0x00453b28 ret | return rax; | }