summaryrefslogtreecommitdiff
path: root/src/cuda-sim/ptx_sim.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/cuda-sim/ptx_sim.cc')
-rw-r--r--src/cuda-sim/ptx_sim.cc24
1 files changed, 12 insertions, 12 deletions
diff --git a/src/cuda-sim/ptx_sim.cc b/src/cuda-sim/ptx_sim.cc
index cf0236a..3974408 100644
--- a/src/cuda-sim/ptx_sim.cc
+++ b/src/cuda-sim/ptx_sim.cc
@@ -369,29 +369,29 @@ extern void set_operand_value( const symbol *dst, const ptx_reg_t &data );
bool ptx_thread_info::callstack_pop()
{
assert( !m_callstack.empty() );
- assert( m_local_mem_stack_pointer >= m_func_info->local_mem_framesize() );
- m_symbol_table = m_callstack.back().m_symbol_table;
- m_NPC = m_callstack.back().m_PC;
- m_RPC_updated = true;
- m_last_was_call = false;
- m_RPC = m_callstack.back().m_RPC;
+ assert( m_local_mem_stack_pointer >= m_callstack.back().m_func_info->local_mem_framesize() );
const symbol *rv_src = m_callstack.back().m_return_var_src;
const symbol *rv_dst = m_callstack.back().m_return_var_dst;
- assert( !((rv_src != NULL) ^ (rv_dst != NULL)) );
+ assert( !((rv_src != NULL) ^ (rv_dst != NULL)) ); // ensure caller and callee agree on whether there is a return value
- // TODO: read param local memory source
- ptx_reg_t rval;
+ // read return value from callee frame
+ arg_buffer_t buffer;
if( rv_src != NULL )
- rval = get_operand_value(rv_src);
+ buffer = copy_arg_to_buffer(this, operand_info(rv_src), rv_dst );
+ m_symbol_table = m_callstack.back().m_symbol_table;
+ m_NPC = m_callstack.back().m_PC;
+ m_RPC_updated = true;
+ m_last_was_call = false;
+ m_RPC = m_callstack.back().m_RPC;
m_func_info = m_callstack.back().m_func_info;
m_local_mem_stack_pointer -= m_func_info->local_mem_framesize();
m_callstack.pop_back();
m_regs.pop_back();
- // TODO: write param local memory destination
+ // write return value into caller frame
if( rv_dst != NULL )
- set_operand_value(rv_dst,rval);
+ copy_buffer_to_frame(this, buffer);
return m_callstack.empty();
}