summaryrefslogtreecommitdiff
path: root/src/cuda-sim/instructions.cc
diff options
context:
space:
mode:
authorTor Aamodt <[email protected]>2010-07-18 11:46:54 -0800
committerTor Aamodt <[email protected]>2010-07-18 11:46:54 -0800
commit75c79ed8cfa88ed424928eccecea8c37c7a92615 (patch)
treeba5a2b6ce42c6fc8295006e75fc1b44d4fe19994 /src/cuda-sim/instructions.cc
parentcc404275f9226185e436e1da483ee58ee85c38ca (diff)
refactoring
[git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 6880]
Diffstat (limited to 'src/cuda-sim/instructions.cc')
-rw-r--r--src/cuda-sim/instructions.cc87
1 files changed, 46 insertions, 41 deletions
diff --git a/src/cuda-sim/instructions.cc b/src/cuda-sim/instructions.cc
index 75dc072..46bc52b 100644
--- a/src/cuda-sim/instructions.cc
+++ b/src/cuda-sim/instructions.cc
@@ -685,7 +685,7 @@ void brkpt_impl( const ptx_instruction *pI, ptx_thread_info *thread ) { inst_not
extern int gpgpu_simd_model;
#define POST_DOMINATOR 1 /* must match enum value in shader.h */
void get_pdom_stack_top_info( unsigned sid, unsigned tid, unsigned *npc, unsigned *rpc );
-void decode_space( memory_space_t &space, ptx_thread_info *thread, const operand_info &op, memory_space *&mem, addr_t &addr);
+void decode_space( memory_space_t &space, const ptx_thread_info *thread, const operand_info &op, memory_space *&mem, addr_t &addr);
void my_cuda_printf(const char *fmtstr,const char *arg_list)
{
@@ -725,6 +725,49 @@ void my_cuda_printf(const char *fmtstr,const char *arg_list)
}
+void gpgpusim_cuda_vprintf(const ptx_instruction * pI, const ptx_thread_info * thread, const function_info * target_func, unsigned n_return, unsigned n_args )
+{
+ char *fmtstr = NULL;
+ char *arg_list = NULL;
+ assert( n_args == 2 );
+ for( unsigned arg=0; arg < n_args; arg ++ ) {
+ const operand_info &actual_param_op = pI->operand_lookup(n_return+1+arg);
+ const symbol *formal_param = target_func->get_arg(arg);
+ unsigned size=formal_param->get_size_in_bytes();
+ assert( formal_param->is_param_local() );
+ assert( actual_param_op.is_param_local() );
+ addr_t from_addr = actual_param_op.get_symbol()->get_address();
+ char buffer[1024];
+ assert(size<1024);
+ thread->m_local_mem->read(from_addr,size,buffer);
+ addr_t addr = (addr_t)*(unsigned long long*)((void*)buffer); // should be pointer to generic memory location
+ memory_space *mem=NULL;
+ memory_space_t space = generic_space;
+ decode_space(space,thread,actual_param_op,mem,addr); // figure out which space
+ if( arg == 0 ) {
+ unsigned len = 0;
+ char b = 0;
+ do { // figure out length
+ mem->read(addr+len,1,&b);
+ len++;
+ } while(b);
+ fmtstr = (char*)malloc(len+64);
+ for( int i=0; i < len; i++ )
+ mem->read(addr+i,1,fmtstr+i);
+ //mem->read(addr,len,fmtstr);
+ } else {
+ unsigned len = thread->get_finfo()->local_mem_framesize();
+ arg_list = (char*)malloc(len+64);
+ for( int i=0; i < len; i++ )
+ mem->read(addr+i,1,arg_list+i);
+ //mem->read(addr,len,arg_list);
+ }
+ }
+ my_cuda_printf(fmtstr,arg_list);
+ free(fmtstr);
+ free(arg_list);
+}
+
void call_impl( const ptx_instruction *pI, ptx_thread_info *thread )
{
static unsigned call_uid_next = 1;
@@ -789,45 +832,7 @@ void call_impl( const ptx_instruction *pI, ptx_thread_info *thread )
std::list< std::pair<const symbol*, ptx_reg_t> >::iterator a;
std::string fname = target_func->get_name();
if( fname == "vprintf" ) {
- char *fmtstr = NULL;
- char *arg_list = NULL;
- assert( n_args == 2 );
- for( unsigned arg=0; arg < n_args; arg ++ ) {
- const operand_info &actual_param_op = pI->operand_lookup(n_return+1+arg);
- const symbol *formal_param = target_func->get_arg(arg);
- unsigned size=formal_param->get_size_in_bytes();
- assert( formal_param->is_param_local() );
- assert( actual_param_op.is_param_local() );
- addr_t from_addr = actual_param_op.get_symbol()->get_address();
- char buffer[1024];
- assert(size<1024);
- thread->m_local_mem->read(from_addr,size,buffer);
- addr_t addr = (addr_t)*(unsigned long long*)((void*)buffer); // should be pointer to generic memory location
- memory_space *mem=NULL;
- memory_space_t space = generic_space;
- decode_space(space,thread,actual_param_op,mem,addr); // figure out which space
- if( arg == 0 ) {
- unsigned len = 0;
- char b = 0;
- do { // figure out length
- mem->read(addr+len,1,&b);
- len++;
- } while(b);
- fmtstr = (char*)malloc(len+64);
- for( int i=0; i < len; i++ )
- mem->read(addr+i,1,fmtstr+i);
- //mem->read(addr,len,fmtstr);
- } else {
- unsigned len = thread->get_finfo()->local_mem_framesize();
- arg_list = (char*)malloc(len+64);
- for( int i=0; i < len; i++ )
- mem->read(addr+i,1,arg_list+i);
- //mem->read(addr,len,arg_list);
- }
- }
- my_cuda_printf(fmtstr,arg_list);
- free(fmtstr);
- free(arg_list);
+ gpgpusim_cuda_vprintf(pI, thread, target_func, n_return, n_args);
} else {
// note register for corresponding return instruction to place result into
const symbol *return_var_src = NULL;
@@ -1535,7 +1540,7 @@ void isspacep_impl( const ptx_instruction *pI, ptx_thread_info *thread )
thread->set_operand_value(dst,p);
}
-void decode_space( memory_space_t &space, ptx_thread_info *thread, const operand_info &op, memory_space *&mem, addr_t &addr)
+void decode_space( memory_space_t &space, const ptx_thread_info *thread, const operand_info &op, memory_space *&mem, addr_t &addr)
{
unsigned smid = thread->get_hw_sid();
unsigned hwtid = thread->get_hw_tid();