// File: /workspace/github_cpp_makefile_star2_O1/NishadSaraf[P]Championship-Simulator/src/cache.cc
// Function: CACHE::return_data(PACKET*)
void CACHE::return_data(PACKET *packet)
{
    // check MSHR information
    int mshr_index = check_mshr(packet);

    // sanity check
    if (mshr_index == -1) {
        cerr << "[" << NAME << "_MSHR] " << __func__ << " instr_id: " << packet->instr_id << " cannot find a matching entry!";
        cerr << " full_addr: " << hex << packet->full_addr;
        cerr << " address: " << packet->address << dec;
        cerr << " event: " << packet->event_cycle << " current: " << current_core_cycle[packet->cpu] << endl;
        assert(0);
    }

    // MSHR holds the most updated information about this request
    // no need to do memcpy
    MSHR.num_returned++;
    MSHR.entry[mshr_index].returned = COMPLETED;
    MSHR.entry[mshr_index].data = packet->data;

    // ADD LATENCY
    if (MSHR.entry[mshr_index].event_cycle < current_core_cycle[packet->cpu])
        MSHR.entry[mshr_index].event_cycle = current_core_cycle[packet->cpu] + LATENCY;
    else
        MSHR.entry[mshr_index].event_cycle += LATENCY;

    update_fill_cycle();

    DP (if (warmup_complete[packet->cpu]) {
    cout << "[" << NAME << "_MSHR] " <<  __func__ << " instr_id: " << MSHR.entry[mshr_index].instr_id;
    cout << " address: " << hex << MSHR.entry[mshr_index].address << " full_addr: " << MSHR.entry[mshr_index].full_addr;
    cout << " data: " << MSHR.entry[mshr_index].data << dec << " num_returned: " << MSHR.num_returned;
    cout << " index: " << mshr_index << " occupancy: " << MSHR.occupancy;
    cout << " event: " << MSHR.entry[mshr_index].event_cycle << " current: " << current_core_cycle[packet->cpu] << " next: " << MSHR.next_fill_cycle << endl; });
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq %rsi, %rbx
movq %rdi, %r15
movl 0x7388(%rdi), %ecx
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
testq %rcx, %rcx
je 0x663a
movq 0x340(%rbx), %rdx
movl $0x340, %esi            # imm = 0x340
addq 0xca20(%r15), %rsi
xorl %edi, %edi
cmpq %rdx, (%rsi)
je 0x6638
incq %rdi
addq $0x380, %rsi            # imm = 0x380
cmpq %rdi, %rcx
jne 0x6622
jmp 0x663a
movl %edi, %eax
cmpl $-0x1, %eax
je 0x66ac
incl 0xc9c0(%r15)
movq 0xca20(%r15), %rcx
cltq
imulq $0x380, %rax, %rax      # imm = 0x380
movb $0x2, 0x32c(%rcx,%rax)
movq 0x360(%rbx), %rdx
movq %rdx, 0x360(%rcx,%rax)
movq 0x378(%rcx,%rax), %rdx
movl 0x330(%rbx), %esi
leaq 0x7a83e(%rip), %rdi     # 0x80ec0
movq (%rdi,%rsi,8), %rsi
cmpq %rsi, %rdx
cmovaq %rdx, %rsi
movl 0x738c(%r15), %edx
addq %rdx, %rsi
movq %rsi, 0x378(%rcx,%rax)
movq %r15, %rdi
popq %rbx
popq %r14
popq %r15
jmp 0x3fe4
movq 0x1393d(%rip), %r14     # 0x19ff0
leaq 0xd9d6(%rip), %rsi      # 0x14090
movq %r14, %rdi
callq 0x3250
addq $0x7350, %r15           # imm = 0x7350
movq %rax, %rdi
movq %r15, %rsi
callq 0x31e0
leaq 0xdbc4(%rip), %rsi      # 0x1429f
movq %rax, %rdi
callq 0x3250
leaq 0xdbbd(%rip), %rsi      # 0x142a7
movq %rax, %rdi
callq 0x3250
leaq 0xe827(%rip), %rsi      # 0x14f20
movq %rax, %rdi
callq 0x3250
movq 0x368(%rbx), %rsi
movq %rax, %rdi
callq 0x3090
leaq 0xdb9c(%rip), %rsi      # 0x142b3
movq %rax, %rdi
callq 0x3250
leaq 0xda68(%rip), %rsi      # 0x1418e
movq %r14, %rdi
callq 0x3250
movq (%rax), %rcx
movq -0x18(%rcx), %rcx
movl 0x18(%rax,%rcx), %edx
andl $-0x4b, %edx
orl $0x8, %edx
movl %edx, 0x18(%rax,%rcx)
movq 0x348(%rbx), %rsi
movq %rax, %rdi
callq 0x3090
leaq 0xda2a(%rip), %rsi      # 0x14183
movq %r14, %rdi
callq 0x3250
movq 0x340(%rbx), %rsi
movq %rax, %rdi
callq 0x3090
movq (%rax), %rcx
movq -0x18(%rcx), %rcx
movl 0x18(%rax,%rcx), %edx
andl $-0x4b, %edx
orl $0x2, %edx
movl %edx, 0x18(%rax,%rcx)
leaq 0xda0f(%rip), %rsi      # 0x1419b
movq %r14, %rdi
callq 0x3250
movq 0x378(%rbx), %rsi
movq %rax, %rdi
callq 0x3090
leaq 0xdb28(%rip), %rsi      # 0x142d2
movq %rax, %rdi
callq 0x3250
movl 0x330(%rbx), %ecx
leaq 0x7a701(%rip), %rdx     # 0x80ec0
movq (%rdx,%rcx,8), %rsi
movq %rax, %rdi
callq 0x3090
movq %rax, %rdi
callq 0x3110
leaq 0xd88d(%rip), %rdi      # 0x14067
leaq 0xd888(%rip), %rsi      # 0x14069
leaq 0xdaf5(%rip), %rcx      # 0x142dd
movl $0x4f4, %edx            # imm = 0x4F4
callq 0x3160