// File: /workspace/github_cpp_makefile_star2_O2/CMU-SAFARI[P]MQSim/src/ssd/NVM_PHY_ONFI_NVDDR2.cpp
// Function: SSD_Components::NVM_PHY_ONFI_NVDDR2::Send_command_to_chip(std::__cxx11::list<SSD_Components::NVM_Transaction_Flash*, std::allocator<SSD_Components::NVM_Transaction_Flash*>>&)
void NVM_PHY_ONFI_NVDDR2::Send_command_to_chip(std::list<NVM_Transaction_Flash*>& transaction_list)
	{
		ONFI_Channel_NVDDR2* target_channel = channels[transaction_list.front()->Address.ChannelID];

		NVM::FlashMemory::Flash_Chip* targetChip = target_channel->Chips[transaction_list.front()->Address.ChipID];
		ChipBookKeepingEntry* chipBKE = &bookKeepingTable[transaction_list.front()->Address.ChannelID][transaction_list.front()->Address.ChipID];
		DieBookKeepingEntry* dieBKE = &chipBKE->Die_book_keeping_records[transaction_list.front()->Address.DieID];

		/*If this is not a die-interleaved command execution, and the channel is already busy,
		* then something illegarl is happening*/
		if (target_channel->GetStatus() == BusChannelStatus::BUSY && chipBKE->OngoingDieCMDTransfers.size() == 0) {
			PRINT_ERROR("Bus " << target_channel->ChannelID << ": starting communication on a busy flash channel!");
		}

		sim_time_type suspendTime = 0;
		if (!dieBKE->Free) {
			if (transaction_list.front()->SuspendRequired) {
				switch (dieBKE->ActiveTransactions.front()->Type) {
					case Transaction_Type::WRITE:
						Stats::IssuedSuspendProgramCMD++;
						suspendTime = target_channel->ProgramSuspendCommandTime + targetChip->GetSuspendProgramTime();
						break;
					case Transaction_Type::ERASE:
						Stats::IssuedSuspendEraseCMD++;
						suspendTime = target_channel->EraseSuspendCommandTime + targetChip->GetSuspendEraseTime();
						break;
					default:
						PRINT_ERROR("Read suspension is not supported!")
				}
				targetChip->Suspend(transaction_list.front()->Address.DieID);
				dieBKE->PrepareSuspend();
				if (chipBKE->OngoingDieCMDTransfers.size()) {
					chipBKE->PrepareSuspend();
				}
			} else {
				PRINT_ERROR("Read suspension is not supported!")
			}
		}

		dieBKE->Free = false;
		dieBKE->ActiveCommand = new NVM::FlashMemory::Flash_Command();
		for (std::list<NVM_Transaction_Flash*>::iterator it = transaction_list.begin();
			it != transaction_list.end(); it++) {
			dieBKE->ActiveTransactions.push_back(*it);
			dieBKE->ActiveCommand->Address.push_back((*it)->Address);
			NVM::FlashMemory::PageMetadata metadata;
			metadata.LPA = (*it)->LPA;
			dieBKE->ActiveCommand->Meta_data.push_back(metadata);
		}

		switch (transaction_list.front()->Type) {
			case Transaction_Type::READ:
				if (transaction_list.size() == 1) {
					Stats::IssuedReadCMD++;
					dieBKE->ActiveCommand->CommandCode = CMD_READ_PAGE;
					DEBUG("Chip " << targetChip->ChannelID << ", " << targetChip->ChipID << ", " << transaction_list.front()->Address.DieID << ": Sending read command to chip for LPA: " << transaction_list.front()->LPA)
				} else {
					Stats::IssuedMultiplaneReadCMD++;
					dieBKE->ActiveCommand->CommandCode = CMD_READ_PAGE_MULTIPLANE;
					DEBUG("Chip " << targetChip->ChannelID << ", " << targetChip->ChipID << ", " << transaction_list.front()->Address.DieID << ": Sending multi-plane read command to chip for LPA: " << transaction_list.front()->LPA)
				}

				for (std::list<NVM_Transaction_Flash*>::iterator it = transaction_list.begin();
					it != transaction_list.end(); it++) {
					(*it)->STAT_transfer_time += target_channel->ReadCommandTime[transaction_list.size()];
				}
				if (chipBKE->OngoingDieCMDTransfers.size() == 0) {
					targetChip->StartCMDXfer();
					chipBKE->Status = ChipStatus::CMD_IN;
					chipBKE->Last_transfer_finish_time = Simulator->Time() + suspendTime + target_channel->ReadCommandTime[transaction_list.size()];
					Simulator->Register_sim_event(Simulator->Time() + suspendTime + target_channel->ReadCommandTime[transaction_list.size()], this,
						dieBKE, (int)NVDDR2_SimEventType::READ_CMD_ADDR_TRANSFERRED);
				} else {
					dieBKE->DieInterleavedTime = suspendTime + target_channel->ReadCommandTime[transaction_list.size()];
					chipBKE->Last_transfer_finish_time += suspendTime + target_channel->ReadCommandTime[transaction_list.size()];
				}
				chipBKE->OngoingDieCMDTransfers.push(dieBKE);

				dieBKE->Expected_finish_time = chipBKE->Last_transfer_finish_time + targetChip->Get_command_execution_latency(dieBKE->ActiveCommand->CommandCode, dieBKE->ActiveCommand->Address[0].PageID);
				if (chipBKE->Expected_command_exec_finish_time < dieBKE->Expected_finish_time) {
					chipBKE->Expected_command_exec_finish_time = dieBKE->Expected_finish_time;
				}
				break;
			case Transaction_Type::WRITE:
				if (((NVM_Transaction_Flash_WR*)transaction_list.front())->ExecutionMode == WriteExecutionModeType::SIMPLE) {
					if (transaction_list.size() == 1) {
						Stats::IssuedProgramCMD++;
						dieBKE->ActiveCommand->CommandCode = CMD_PROGRAM_PAGE;
						DEBUG("Chip " << targetChip->ChannelID << ", " << targetChip->ChipID << ", " << transaction_list.front()->Address.DieID << ": Sending program command to chip for LPA: " << transaction_list.front()->LPA)
					} else {
						Stats::IssuedMultiplaneProgramCMD++;
						dieBKE->ActiveCommand->CommandCode = CMD_PROGRAM_PAGE_MULTIPLANE;
						DEBUG("Chip " << targetChip->ChannelID << ", " << targetChip->ChipID << ", " << transaction_list.front()->Address.DieID << ": Sending multi-plane program command to chip for LPA: " << transaction_list.front()->LPA)
					}

					sim_time_type data_transfer_time = 0;

					for (std::list<NVM_Transaction_Flash*>::iterator it = transaction_list.begin();
						it != transaction_list.end(); it++) {
						(*it)->STAT_transfer_time += target_channel->ProgramCommandTime[transaction_list.size()] + NVDDR2DataInTransferTime((*it)->Data_and_metadata_size_in_byte, target_channel);
						data_transfer_time += NVDDR2DataInTransferTime((*it)->Data_and_metadata_size_in_byte, target_channel);
					}
					if (chipBKE->OngoingDieCMDTransfers.size() == 0) {
						targetChip->StartCMDDataInXfer();
						chipBKE->Status = ChipStatus::CMD_DATA_IN;
						chipBKE->Last_transfer_finish_time = Simulator->Time() + suspendTime + target_channel->ProgramCommandTime[transaction_list.size()] + data_transfer_time;
						Simulator->Register_sim_event(Simulator->Time() + suspendTime + target_channel->ProgramCommandTime[transaction_list.size()] + data_transfer_time,
							this, dieBKE, (int)NVDDR2_SimEventType::PROGRAM_CMD_ADDR_DATA_TRANSFERRED);
					} else {
						dieBKE->DieInterleavedTime = suspendTime + target_channel->ProgramCommandTime[transaction_list.size()] + data_transfer_time;
						chipBKE->Last_transfer_finish_time += suspendTime + target_channel->ProgramCommandTime[transaction_list.size()] + data_transfer_time;
					}
					chipBKE->OngoingDieCMDTransfers.push(dieBKE);

					dieBKE->Expected_finish_time = chipBKE->Last_transfer_finish_time + targetChip->Get_command_execution_latency(dieBKE->ActiveCommand->CommandCode, dieBKE->ActiveCommand->Address[0].PageID);
					if (chipBKE->Expected_command_exec_finish_time < dieBKE->Expected_finish_time) {
						chipBKE->Expected_command_exec_finish_time = dieBKE->Expected_finish_time;
					}
				} else {
					//Copyback write for GC

					if (transaction_list.size() == 1) {
						Stats::IssuedCopybackReadCMD++;
						dieBKE->ActiveCommand->CommandCode = CMD_READ_PAGE_COPYBACK;
					} else {
						Stats::IssuedMultiplaneCopybackProgramCMD++;
						dieBKE->ActiveCommand->CommandCode = CMD_READ_PAGE_COPYBACK_MULTIPLANE;
					}

					for (std::list<NVM_Transaction_Flash*>::iterator it = transaction_list.begin();
						it != transaction_list.end(); it++) {
						(*it)->STAT_transfer_time += target_channel->ReadCommandTime[transaction_list.size()];
					}
					if (chipBKE->OngoingDieCMDTransfers.size() == 0) {
						targetChip->StartCMDXfer();
						chipBKE->Status = ChipStatus::CMD_IN;
						chipBKE->Last_transfer_finish_time = Simulator->Time() + suspendTime + target_channel->ReadCommandTime[transaction_list.size()];
						Simulator->Register_sim_event(Simulator->Time() + suspendTime + target_channel->ReadCommandTime[transaction_list.size()], this,
							dieBKE, (int)NVDDR2_SimEventType::READ_CMD_ADDR_TRANSFERRED);
					} else {
						dieBKE->DieInterleavedTime = suspendTime + target_channel->ReadCommandTime[transaction_list.size()];
						chipBKE->Last_transfer_finish_time += suspendTime + target_channel->ReadCommandTime[transaction_list.size()];
					}
					chipBKE->OngoingDieCMDTransfers.push(dieBKE);

					dieBKE->Expected_finish_time = chipBKE->Last_transfer_finish_time + targetChip->Get_command_execution_latency(dieBKE->ActiveCommand->CommandCode, dieBKE->ActiveCommand->Address[0].PageID);
					if (chipBKE->Expected_command_exec_finish_time < dieBKE->Expected_finish_time) {
						chipBKE->Expected_command_exec_finish_time = dieBKE->Expected_finish_time;
					}
				}
				break;
			case Transaction_Type::ERASE:
				//DEBUG2("Chip " << targetChip->ChannelID << ", " << targetChip->ChipID << ", " << transaction_list.front()->Address.DieID << ": Sending erase command to chip")
				if (transaction_list.size() == 1) {
					Stats::IssuedEraseCMD++;
					dieBKE->ActiveCommand->CommandCode = CMD_ERASE_BLOCK;
				} else {
					Stats::IssuedMultiplaneEraseCMD++;
					dieBKE->ActiveCommand->CommandCode = CMD_ERASE_BLOCK_MULTIPLANE;
				}

				for (std::list<NVM_Transaction_Flash*>::iterator it = transaction_list.begin();
					it != transaction_list.end(); it++) {
					(*it)->STAT_transfer_time += target_channel->EraseCommandTime[transaction_list.size()];
				}
				if (chipBKE->OngoingDieCMDTransfers.size() == 0) {
					targetChip->StartCMDXfer();
					chipBKE->Status = ChipStatus::CMD_IN;
					chipBKE->Last_transfer_finish_time = Simulator->Time() + suspendTime + target_channel->EraseCommandTime[transaction_list.size()];
					Simulator->Register_sim_event(Simulator->Time() + suspendTime + target_channel->EraseCommandTime[transaction_list.size()],
						this, dieBKE, (int)NVDDR2_SimEventType::ERASE_SETUP_COMPLETED);
				} else {
					dieBKE->DieInterleavedTime = suspendTime + target_channel->EraseCommandTime[transaction_list.size()];
					chipBKE->Last_transfer_finish_time += suspendTime + target_channel->EraseCommandTime[transaction_list.size()];
				}
				chipBKE->OngoingDieCMDTransfers.push(dieBKE);

				dieBKE->Expected_finish_time = chipBKE->Last_transfer_finish_time + targetChip->Get_command_execution_latency(dieBKE->ActiveCommand->CommandCode, dieBKE->ActiveCommand->Address[0].PageID);
				if (chipBKE->Expected_command_exec_finish_time < dieBKE->Expected_finish_time) {
					chipBKE->Expected_command_exec_finish_time = dieBKE->Expected_finish_time;
				}
				break;
			default:
				throw std::invalid_argument("NVM_PHY_ONFI_NVDDR2: Unhandled event specified!");
		}

		target_channel->SetStatus(BusChannelStatus::BUSY, targetChip);
	}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x28, %rsp
movq %rsi, %r12
movq %rdi, %r14
movq (%rsi), %rax
movq 0x10(%rax), %rax
movl 0x38(%rax), %ecx
movl 0x3c(%rax), %edx
movq 0x88(%rdi), %rsi
movq 0x90(%rdi), %rdi
movq (%rsi,%rcx,8), %rbx
movq 0x8(%rbx), %rsi
movq (%rsi,%rdx,8), %r15
movq (%rdi,%rcx,8), %rcx
shlq $0x7, %rdx
movl 0x40(%rax), %eax
imulq $0x68, %rax, %rbp
addq 0x8(%rcx,%rdx), %rbp
leaq (%rcx,%rdx), %r13
movq %rbp, (%rsp)
cmpl $0x0, 0x14(%rbx)
jne 0x37f4b
leaq 0x28(%r13), %rdi
callq 0x39c24
testq %rax, %rax
je 0x384c9
cmpb $0x0, 0x48(%rbp)
movq %r15, 0x8(%rsp)
movq %r14, 0x18(%rsp)
je 0x37f63
xorl %r15d, %r15d
jmp 0x37ffe
movq (%r12), %rax
movq 0x10(%rax), %rax
cmpb $0x1, 0x68(%rax)
jne 0x384a7
movq 0x8(%rbp), %rax
movq 0x10(%rax), %rax
movl 0x8(%rax), %eax
cmpl $0x2, %eax
je 0x37fa9
cmpl $0x1, %eax
jne 0x384a7
leaq 0x2a723(%rip), %rax     # 0x626b8
incq (%rax)
movq 0xa0(%rbx), %r14
movq %r15, %rdi
callq 0x1ed8a
jmp 0x37fc2
leaq 0x2a738(%rip), %rax     # 0x626e8
incq (%rax)
movq 0xd0(%rbx), %r14
movq %r15, %rdi
callq 0x1ed90
movq %r15, %rdi
movq %rax, %r15
addq %r14, %r15
movq (%r12), %rax
movq 0x10(%rax), %rax
movl 0x40(%rax), %esi
callq 0x1eb0a
movq %rbp, %rdi
callq 0x39114
movq %r13, %r14
leaq 0x28(%r13), %rdi
callq 0x39c24
testq %rax, %rax
je 0x37ffe
movb $0x1, 0x20(%r14)
andl $0x0, 0x7c(%r14)
movb $0x0, 0x48(%rbp)
pushq $0x38
popq %rdi
callq 0x7370
xorps %xmm0, %xmm0
movaps %xmm0, (%rax)
movaps %xmm0, 0x10(%rax)
andq $0x0, 0x30(%rax)
movaps %xmm0, 0x20(%rax)
movq %rax, (%rbp)
leaq 0x20(%rsp), %rbp
movq %r12, %r14
movq (%r14), %r14
cmpq %r12, %r14
je 0x3807c
movq (%rsp), %rdi
addq $0x8, %rdi
leaq 0x10(%r14), %rsi
callq 0x27294
movq (%rsp), %rax
movq (%rax), %rdi
addq $0x8, %rdi
movq 0x10(%r14), %rsi
addq $0x38, %rsi
callq 0x2657a
movq 0x10(%r14), %rax
movq 0x58(%rax), %rax
movq %rax, 0x20(%rsp)
movq (%rsp), %rax
movq (%rax), %rdi
addq $0x20, %rdi
movq %rbp, %rsi
callq 0x3916e
jmp 0x38029
movq (%r12), %rcx
movq 0x10(%rcx), %rax
movl 0x8(%rax), %edx
testl %edx, %edx
je 0x38116
cmpl $0x1, %edx
movq %r13, %r14
je 0x380c1
cmpl $0x2, %edx
jne 0x38523
movq 0x10(%r12), %rax
xorl %edx, %edx
cmpq $0x1, %rax
sete %sil
jne 0x381fa
leaq 0x2a60c(%rip), %rdi     # 0x626c8
jmp 0x38201
cmpl $0x0, 0xa8(%rax)
movq 0x10(%r12), %rsi
je 0x38271
cmpq $0x1, %rsi
leaq 0x2a5ca(%rip), %rax     # 0x626a8
cmoveq 0x29eca(%rip), %rax     # 0x61fb0
pushq $0x35
popq %rdx
movl $0x321, %edi            # imm = 0x321
cmoveq %rdx, %rdi
incq (%rax)
movq (%rsp), %rax
movq (%rax), %rax
movq %rdi, (%rax)
cmpq %r12, %rcx
je 0x38169
movq 0x28(%rbx,%rsi,8), %rax
movq 0x10(%rcx), %rdx
addq %rax, 0x30(%rdx)
movq (%rcx), %rcx
jmp 0x380ff
movq 0x10(%r12), %rax
xorl %edx, %edx
cmpq $0x1, %rax
setne %sil
movq %r13, %r14
jne 0x38133
leaq 0x2a537(%rip), %rdi     # 0x62668
jmp 0x3813a
leaq 0x2a546(%rip), %rdi     # 0x62680
movb %sil, %dl
incq (%rdi)
leaq 0x30(,%rdx,2), %rdx
movq (%rsp), %rsi
movq (%rsi), %rsi
movq %rdx, (%rsi)
cmpq %r12, %rcx
je 0x38169
movq 0x28(%rbx,%rax,8), %rdx
movq 0x10(%rcx), %rsi
addq %rdx, 0x30(%rsi)
movq (%rcx), %rcx
jmp 0x38152
leaq 0x28(%r14), %rbp
movq %rbp, %rdi
callq 0x39c24
testq %rax, %rax
je 0x38199
movq 0x10(%r12), %rax
movq 0x28(%rbx,%rax,8), %rcx
addq %r15, %rcx
movq (%rsp), %rdx
movq %rcx, 0x60(%rdx)
addq 0x28(%rbx,%rax,8), %r15
jmp 0x38263
movq 0x8(%rsp), %r13
movq %r13, %rdi
callq 0x3918e
movl $0x1, (%r14)
callq 0x1f784
movq %rax, %rdi
callq 0x1fafc
addq %r15, %rax
movq 0x10(%r12), %rcx
addq 0x28(%rbx,%rcx,8), %rax
movq %rax, 0x18(%r14)
callq 0x1f784
movq %rax, 0x10(%rsp)
callq 0x1f784
movq %rax, %rdi
callq 0x1fafc
addq %rax, %r15
movq 0x10(%r12), %rax
addq 0x28(%rbx,%rax,8), %r15
movq (%rsp), %rcx
pushq $0x1
jmp 0x382ee
leaq 0x2a4d7(%rip), %rdi     # 0x626d8
movb %sil, %dl
incq (%rdi)
xorq $0x60d1, %rdx           # imm = 0x60D1
movq (%rsp), %rsi
movq (%rsi), %rsi
movq %rdx, (%rsi)
cmpq %r12, %rcx
je 0x38232
movq 0xa8(%rbx,%rax,8), %rdx
movq 0x10(%rcx), %rsi
addq %rdx, 0x30(%rsi)
movq (%rcx), %rcx
jmp 0x38218
leaq 0x28(%r14), %rbp
movq %rbp, %rdi
callq 0x39c24
testq %rax, %rax
je 0x3828c
movq 0x10(%r12), %rax
movq 0xa8(%rbx,%rax,8), %rcx
addq %r15, %rcx
movq (%rsp), %rdx
movq %rcx, 0x60(%rdx)
addq 0xa8(%rbx,%rax,8), %r15
addq %r15, 0x18(%r14)
movq 0x8(%rsp), %r13
jmp 0x38302
xorl %eax, %eax
cmpq $0x1, %rsi
sete %dl
jne 0x3835c
leaq 0x2a409(%rip), %rdi     # 0x62690
jmp 0x38363
movq 0x8(%rsp), %r13
movq %r13, %rdi
callq 0x3918e
movl $0x1, (%r14)
callq 0x1f784
movq %rax, %rdi
callq 0x1fafc
addq %r15, %rax
movq 0x10(%r12), %rcx
addq 0xa8(%rbx,%rcx,8), %rax
movq %rax, 0x18(%r14)
callq 0x1f784
movq %rax, 0x10(%rsp)
callq 0x1f784
movq %rax, %rdi
callq 0x1fafc
addq %rax, %r15
movq 0x10(%r12), %rax
addq 0xa8(%rbx,%rax,8), %r15
movq (%rsp), %rcx
pushq $0x4
popq %r8
movq 0x10(%rsp), %rdi
movq %r15, %rsi
movq 0x18(%rsp), %rdx
callq 0x1fb00
movq %rsp, %r15
movq %rbp, %rdi
movq %r15, %rsi
callq 0x39dae
movq 0x18(%r14), %r12
movq (%r15), %rax
movq (%rax), %rax
movq (%rax), %rsi
movq 0x8(%rax), %rax
movl 0x14(%rax), %edx
movq %r13, %rdi
callq 0x1f456
addq %r12, %rax
movq (%r15), %rcx
movq %rax, 0x50(%rcx)
cmpq %rax, 0x10(%r14)
movq %r13, %rdx
jae 0x38343
movq %rax, 0x10(%r14)
movq %rbx, %rdi
xorl %esi, %esi
callq 0x391c2
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
leaq 0x2a33d(%rip), %rdi     # 0x626a0
movb %dl, %al
xorq $0x8011, %rax           # imm = 0x8011
incq (%rdi)
movq (%rsp), %rdx
movq (%rdx), %rdx
movq %rax, (%rdx)
xorl %ebp, %ebp
cmpq %r12, %rcx
je 0x383ad
movq 0x10(%rcx), %rdi
movl 0x50(%rdi), %eax
xorl %edx, %edx
divl 0xd8(%rbx)
shrl %eax
imulq 0x70(%rbx), %rax
movq 0x30(%rdi), %rdx
addq 0x78(%rbx,%rsi,8), %rdx
addq %rax, %rdx
movq %rdx, 0x30(%rdi)
addq %rax, %rbp
movq (%rcx), %rcx
jmp 0x3837a
leaq 0x28(%r14), %r13
movq %r13, %rdi
callq 0x39c24
testq %rax, %rax
je 0x383e9
movq 0x10(%r12), %rax
addq %r15, %rbp
movq 0x78(%rbx,%rax,8), %rcx
addq %rbp, %rcx
movq (%rsp), %rdx
movq %rcx, 0x60(%rdx)
addq 0x78(%rbx,%rax,8), %rbp
addq %rbp, 0x18(%r14)
movq 0x8(%rsp), %rbp
movq %r14, %r15
jmp 0x3845d
movq 0x8(%rsp), %rdi
callq 0x391a8
movl $0x2, (%r14)
callq 0x1f784
movq %rax, %rdi
callq 0x1fafc
movq 0x10(%r12), %rcx
addq %r15, %rbp
addq %rbp, %rax
addq 0x78(%rbx,%rcx,8), %rax
movq %rax, 0x18(%r14)
callq 0x1f784
movq %r14, %r15
movq %rax, %r14
callq 0x1f784
movq %rax, %rdi
callq 0x1fafc
movq 0x10(%r12), %rcx
addq %rax, %rbp
addq 0x78(%rbx,%rcx,8), %rbp
movq (%rsp), %rcx
pushq $0x2
popq %r8
movq %r14, %rdi
movq %rbp, %rsi
movq 0x8(%rsp), %rbp
movq 0x18(%rsp), %rdx
callq 0x1fb00
movq %rsp, %r14
movq %r13, %rdi
movq %r14, %rsi
callq 0x39dae
movq 0x18(%r15), %r12
movq (%r14), %rax
movq (%rax), %rax
movq (%rax), %rsi
movq 0x8(%rax), %rax
movl 0x14(%rax), %edx
movq %rbp, %rdi
callq 0x1f456
addq %r12, %rax
movq (%r14), %rcx
movq %rax, 0x50(%rcx)
cmpq %rax, 0x10(%r15)
movq %rbp, %rdx
jae 0x38343
movq %rax, 0x10(%r15)
jmp 0x38343
movq 0x29b42(%rip), %rbx     # 0x61ff0
leaq 0xc0d3(%rip), %rsi      # 0x44588
movq %rbx, %rdi
callq 0x7360
leaq 0xfe2f(%rip), %rsi      # 0x482f3
movq %rbx, %rdi
jmp 0x38502
movq 0x29b20(%rip), %r14     # 0x61ff0
leaq 0xc0b1(%rip), %rsi      # 0x44588
movq %r14, %rdi
callq 0x7360
leaq 0xfdd6(%rip), %rsi      # 0x482bc
movq %r14, %rdi
callq 0x7360
movl (%rbx), %esi
movq %rax, %rdi
callq 0x7470
leaq 0xfdc2(%rip), %rsi      # 0x482c1
movq %rax, %rdi
callq 0x7360
movq %rax, %rdi
callq 0x71a0
movq 0x29aba(%rip), %rdi     # 0x61fd0
callq 0x73d0
pushq $0x1
popq %rdi
callq 0x73e0
pushq $0x10
popq %rdi
callq 0x71b0
movq %rax, %rbx
leaq 0xfde0(%rip), %rsi      # 0x48315
movq %rax, %rdi
callq 0x7620
movq 0x29a84(%rip), %rsi     # 0x61fc8
movq 0x29a5d(%rip), %rdx     # 0x61fa8
movq %rbx, %rdi
callq 0x7590
movq %rax, %r14
movq %rbx, %rdi
callq 0x72a0
movq %r14, %rdi
callq 0x75d0