; assembly | /* r2dec pseudo code output */ | /* bblb_schedulegenerationutil.t/assume @ 0x40b940 */ | #include | ; (fcn) method.BloombergLP::bblb::ScheduleGenerationUtil.generateFromBusinessDayOfMonth_bsl::vector_BloombergLP::bdlt::Date__bsl::allocator_BloombergLP::bdlt::Date_____BloombergLP::bdlt::Date_const__BloombergLP::bdlt::Date_const__int__int__int__BloombergLP::b () | int64_t method_BloombergLP::bblb::ScheduleGenerationUtil_generateFromBusinessDayOfMonth_bsl::vector_BloombergLP::bdlt::Date_bsl::allocator_BloombergLP::bdlt::Date_BloombergLP::bdlt::Date_const_BloombergLP::bdlt::Date_const_int_int_int_BloombergLP::b (int64_t arg_50h, int64_t arg_58h, int64_t arg6, int64_t arg5, int64_t arg4, int64_t arg3, int64_t arg2, uint32_t arg1) { | int64_t var_4h; | uint32_t var_8h; | uint32_t var_ch; | uint32_t var_10h; | uint32_t var_14h; | r9 = arg6; | r8 = arg5; | rcx = arg4; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* BloombergLP::bblb::ScheduleGenerationUtil::generateFromBusinessDayOfMonth(bsl::vector >*, BloombergLP::bdlt::Date const&, BloombergLP::bdlt::Date const&, int, int, int, BloombergLP::bdlt::Calendar const&, int) */ 0x0040b940 push rbp | 0x0040b941 push r15 | 0x0040b943 push r14 | 0x0040b945 push r13 | 0x0040b947 push r12 | 0x0040b949 push rbx | 0x0040b94a sub rsp, 0x18 | 0x0040b94e mov r13d, r9d | r13d = r9d; 0x0040b951 mov ebx, r8d | ebx = r8d; 0x0040b954 mov r15d, ecx | r15d = ecx; 0x0040b957 mov rbp, rdx | 0x0040b95a mov r14, rdi | r14 = rdi; 0x0040b95d dec ebx | ebx--; 0x0040b95f mov rax, qword [rdi] | rax = *(rdi); 0x0040b962 cmp qword [rdi + 8], rax | | if (*((rdi + 8)) != rax) { 0x0040b966 je 0x40b96c | 0x0040b968 mov qword [r14 + 8], rax | *((r14 + 8)) = rax; | } 0x0040b96c mov ecx, dword [rsi] | 0x0040b96e mov rdi, rsp | 0x0040b971 lea rsi, [rsp + 4] | 0x0040b976 lea rdx, [rsp + 0x14] | 0x0040b97b call 0x414270 | BloombergLP::bdlt::PosixDateImpUtil::serialToYmd(int*,int*,int*,int) (rsp, rsp + 4, rsp + 0x14, *(rsi)); 0x0040b980 mov eax, dword [rsp] | eax = *(rsp); 0x0040b983 lea eax, [rax + rax*2] | eax = rax * 3; 0x0040b986 mov ecx, dword [rsp + 4] | ecx = *((rsp + 4)); 0x0040b98a lea r12d, [rcx + rax*4 - 1] | r12d = rcx + rax*4 - 1; 0x0040b98f mov ecx, dword [rbp] | 0x0040b992 mov rdi, rsp | 0x0040b995 lea rsi, [rsp + 4] | 0x0040b99a lea rdx, [rsp + 0x10] | 0x0040b99f call 0x414270 | BloombergLP::bdlt::PosixDateImpUtil::serialToYmd(int*,int*,int*,int) (rsp, rsp + 4, rsp + 0x10, *(rbp)); 0x0040b9a4 mov eax, dword [rsp] | eax = *(rsp); 0x0040b9a7 lea eax, [rax + rax*2] | eax = rax * 3; 0x0040b9aa mov ecx, dword [rsp + 4] | ecx = *((rsp + 4)); 0x0040b9ae lea edi, [rcx + rax*4 - 1] | edi = rcx + rax*4 - 1; 0x0040b9b2 lea eax, [r15 + r15*2] | eax = r15 * 3; 0x0040b9b6 lea esi, [rbx + rax*4] | esi = rbx + rax*4; 0x0040b9b9 mov dword [rsp + 0xc], r12d | *((rsp + 0xc)) = r12d; 0x0040b9be sub r12d, esi | r12d -= esi; | if (r12d > 0) { 0x0040b9c1 jle 0x40b9d5 | 0x0040b9c3 mov eax, r12d | eax = r12d; 0x0040b9c6 xor edx, edx | edx = 0; 0x0040b9c8 div r13d | eax = edx:eax / r13d; | edx = edx:eax % r13d; 0x0040b9cb test edx, edx | | if (edx != 0) { 0x0040b9cd je 0x40b9d5 | 0x0040b9cf mov ebp, eax | 0x0040b9d1 inc ebp | ebp++; 0x0040b9d3 jmp 0x40b9de | | } | } else { 0x0040b9d5 mov eax, r12d | eax = r12d; 0x0040b9d8 cdq | edx:eax = (int64_t) eax; 0x0040b9d9 idiv r13d | eax = edx:eax / r13d; | edx = edx:eax % r13d; 0x0040b9dc mov ebp, eax | | } 0x0040b9de mov ecx, edi | ecx = edi; 0x0040b9e0 sub ecx, esi | ecx -= esi; 0x0040b9e2 js 0x40b9ee | | while (edx == 0) { 0x0040b9e4 mov eax, ecx | eax = ecx; 0x0040b9e6 cdq | edx:eax = (int64_t) eax; 0x0040b9e7 idiv r13d | eax = edx:eax / r13d; | edx = edx:eax % r13d; 0x0040b9ea mov ebx, eax | ebx = eax; 0x0040b9ec jmp 0x40b9ff | goto label_1; 0x0040b9ee mov eax, ecx | eax = ecx; 0x0040b9f0 neg eax | eax = -eax; 0x0040b9f2 xor edx, edx | edx = 0; 0x0040b9f4 div r13d | eax = edx:eax / r13d; | edx = edx:eax % r13d; 0x0040b9f7 test edx, edx | 0x0040b9f9 je 0x40b9e4 | | } 0x0040b9fb mov ebx, eax | ebx = eax; 0x0040b9fd not ebx | ebx = ~ebx; | label_1: 0x0040b9ff imul ebp, r13d | ebp *= r13d; 0x0040ba03 add ebp, esi | ebp += esi; 0x0040ba05 cmp ebp, 0x1d4bf | | if (ebp > 0x1d4bf) { 0x0040ba0b jg 0x40bab1 | goto label_0; | } 0x0040ba11 imul ebx, r13d | ebx *= r13d; 0x0040ba15 add ebx, esi | ebx += esi; 0x0040ba17 cmp ebx, 0xc | | if (ebx < 0xc) { 0x0040ba1a jl 0x40bab1 | goto label_0; | } 0x0040ba20 mov dword [rsp + 8], edi | *((rsp + 8)) = edi; 0x0040ba24 mov r12d, dword [rsp + 0x58] | r12d = *((rsp + 0x58)); 0x0040ba29 mov r15, qword [rsp + 0x50] | r15 = *((rsp + 0x50)); 0x0040ba2e mov dword [rsp], 1 | *(rsp) = 1; 0x0040ba35 movsxd rax, ebp | rax = (int64_t) ebp; 0x0040ba38 imul rdx, rax, 0x2aaaaaab | rdx = rax * 0x2aaaaaab; 0x0040ba3f mov rax, rdx | rax = rdx; 0x0040ba42 shr rax, 0x3f | rax >>= 0x3f; 0x0040ba46 sar rdx, 0x21 | rdx >>= 0x21; 0x0040ba4a add edx, eax | edx += eax; 0x0040ba4c lea eax, [rdx*4] | eax = rdx*4; 0x0040ba53 lea eax, [rax + rax*2] | eax = rax * 3; 0x0040ba56 neg eax | eax = -eax; 0x0040ba58 lea ecx, [rbp + rax + 1] | 0x0040ba5c mov rdi, rsp | 0x0040ba5f mov rsi, r15 | 0x0040ba62 mov r8d, r12d | 0x0040ba65 call 0x40d600 | eax = BloombergLP::bdlt::CalendarUtil::nthBusinessDayOfMonthOrMaxIfValid(BloombergLP::bdlt::Date*,BloombergLP::bdlt::Calendarconst&,int,int,int) (rsp, r15, rdx, rbp + rax + 1, r12d); 0x0040ba6a test eax, eax | | if (eax != 0) { 0x0040ba6c jne 0x40bab1 | goto label_0; | } 0x0040ba6e mov edi, dword [rsp] | 0x0040ba71 call 0x4141b0 | eax = BloombergLP::bdlt::PosixDateImpUtil::serialToDay(int) (*(rsp), rsi); 0x0040ba76 mov rsi, r15 | 0x0040ba79 mov r15d, eax | r15d = eax; 0x0040ba7c mov dword [rsp], 1 | *(rsp) = 1; 0x0040ba83 mov eax, ebx | eax = ebx; 0x0040ba85 mov edx, 0xaaaaaaab | 0x0040ba8a imul rdx, rax | rdx *= rax; 0x0040ba8e shr rdx, 0x23 | rdx >>= 0x23; 0x0040ba92 lea eax, [rdx*4] | eax = rdx*4; 0x0040ba99 lea eax, [rax + rax*2] | eax = rax * 3; 0x0040ba9c neg eax | eax = -eax; 0x0040ba9e lea ecx, [rbx + rax + 1] | 0x0040baa2 mov rdi, rsp | 0x0040baa5 mov r8d, r12d | 0x0040baa8 call 0x40d600 | eax = BloombergLP::bdlt::CalendarUtil::nthBusinessDayOfMonthOrMaxIfValid(BloombergLP::bdlt::Date*,BloombergLP::bdlt::Calendarconst&,int,int,int) (rsp, r15, 0xaaaaaaab, rbx + rax + 1, r12d); 0x0040baad test eax, eax | 0x0040baaf je 0x40bac0 | | while (r15d > 0x1d4bf) { | label_0: 0x0040bab1 add rsp, 0x18 | 0x0040bab5 pop rbx | 0x0040bab6 pop r12 | 0x0040bab8 pop r13 | 0x0040baba pop r14 | 0x0040babc pop r15 | 0x0040babe pop rbp | 0x0040babf ret | return rax; 0x0040bac0 mov edi, dword [rsp] | 0x0040bac3 call 0x4141b0 | eax = BloombergLP::bdlt::PosixDateImpUtil::serialToDay(int) (*(rsp), rsi); 0x0040bac8 xor ecx, ecx | ecx = 0; 0x0040baca cmp r15d, dword [rsp + 0x14] | 0x0040bacf mov r15d, 0 | r15d = 0; | if (r15d < *((rsp + 0x14))) { 0x0040bad5 cmovl r15d, r13d | r15d = r13d; | } 0x0040bad9 cmp ebp, dword [rsp + 0xc] | | if (ebp != *((rsp + 0xc))) { 0x0040badd cmovne r15d, ecx | r15d = ecx; | } 0x0040bae1 add r15d, ebp | r15d += ebp; 0x0040bae4 cmp eax, dword [rsp + 0x10] | 0x0040bae8 mov eax, 0 | eax = 0; | if (eax > *((rsp + 0x10))) { 0x0040baed cmovg eax, r13d | eax = r13d; | } 0x0040baf1 cmp ebx, dword [rsp + 8] | | if (ebx != *((rsp + 8))) { 0x0040baf5 cmovne eax, ecx | eax = ecx; | } 0x0040baf8 cmp r15d, 0x1d4bf | 0x0040baff jg 0x40bab1 | | } 0x0040bb01 sub ebx, eax | ebx -= eax; 0x0040bb03 cmp ebx, 0xc | | if (ebx < 0xc) { 0x0040bb06 jl 0x40bab1 | goto label_0; | } 0x0040bb08 mov eax, ebx | eax = ebx; 0x0040bb0a sub eax, r15d | eax -= r15d; 0x0040bb0d cdq | edx:eax = (int64_t) eax; 0x0040bb0e idiv r13d | eax = edx:eax / r13d; | edx = edx:eax % r13d; 0x0040bb11 inc eax | eax++; 0x0040bb13 movsxd rsi, eax | rsi = (int64_t) eax; 0x0040bb16 mov rdi, r14 | 0x0040bb19 call 0x40c170 | bsl::vector>::reserve(unsigned long) (r14, rsi); 0x0040bb1e cmp ebx, r15d | | if (ebx < r15d) { 0x0040bb21 jl 0x40bab1 | goto label_0; | } 0x0040bb23 mov rbp, rsp | 0x0040bb26 nop word cs:[rax + rax] | | do { 0x0040bb30 mov dword [rsp], 1 | *(rsp) = 1; 0x0040bb37 movsxd rax, r15d | rax = (int64_t) r15d; 0x0040bb3a imul rdx, rax, 0x2aaaaaab | rdx = rax * 0x2aaaaaab; 0x0040bb41 mov rcx, rdx | rcx = rdx; 0x0040bb44 shr rcx, 0x3f | rcx >>= 0x3f; 0x0040bb48 sar rdx, 0x21 | rdx >>= 0x21; 0x0040bb4c add edx, ecx | edx += ecx; 0x0040bb4e lea ecx, [rdx*4] | ecx = rdx*4; 0x0040bb55 lea ecx, [rcx + rcx*2] | ecx = rcx * 3; 0x0040bb58 neg ecx | ecx = -ecx; 0x0040bb5a lea ecx, [rax + rcx + 1] | 0x0040bb5e mov rdi, rbp | 0x0040bb61 mov rsi, qword [rsp + 0x50] | 0x0040bb66 mov r8d, r12d | 0x0040bb69 call 0x40d600 | eax = BloombergLP::bdlt::CalendarUtil::nthBusinessDayOfMonthOrMaxIfValid(BloombergLP::bdlt::Date*,BloombergLP::bdlt::Calendarconst&,int,int,int) (rbp, *((rsp + 0x50)), rdx, rax + rcx + 1, r12d); 0x0040bb6e test eax, eax | | if (eax != 0) { 0x0040bb70 jne 0x40bb8a | goto label_2; | } 0x0040bb72 mov rdi, r14 | 0x0040bb75 mov rsi, rbp | 0x0040bb78 call 0x40c290 | bsl::vector>::push_back(BloombergLP::bdlt::Dateconst&) (r14, rbp); 0x0040bb7d add r15d, r13d | r15d += r13d; 0x0040bb80 cmp r15d, ebx | 0x0040bb83 jle 0x40bb30 | | } while (r15d <= ebx); 0x0040bb85 jmp 0x40bab1 | goto label_0; | label_2: 0x0040bb8a mov rax, qword [r14] | rax = *(r14); 0x0040bb8d cmp qword [r14 + 8], rax | | if (*((r14 + 8)) == rax) { 0x0040bb91 je 0x40bab1 | goto label_0; | } 0x0040bb97 mov qword [r14 + 8], rax | *((r14 + 8)) = rax; 0x0040bb9b jmp 0x40bab1 | goto label_0; | }