summaryrefslogtreecommitdiff
path: root/src/cuda-sim
diff options
context:
space:
mode:
Diffstat (limited to 'src/cuda-sim')
-rw-r--r--src/cuda-sim/cuda-sim.cc3
-rw-r--r--src/cuda-sim/instructions.cc29
-rw-r--r--src/cuda-sim/ptx_ir.h1
-rw-r--r--src/cuda-sim/ptx_parser.cc4
4 files changed, 34 insertions, 3 deletions
diff --git a/src/cuda-sim/cuda-sim.cc b/src/cuda-sim/cuda-sim.cc
index e0cd3f9..b85ba95 100644
--- a/src/cuda-sim/cuda-sim.cc
+++ b/src/cuda-sim/cuda-sim.cc
@@ -1270,6 +1270,7 @@ void function_info::ptx_jit_config(std::map<unsigned long long, size_t> mallocPt
assert(param.find("<")==std::string::npos);
assert(param.find("*")==std::string::npos);
}
+ printf("%s\n", param.c_str());
if(param.find("*")!=std::string::npos){
paramIsPointer.push_back(true);
}else{
@@ -1288,7 +1289,7 @@ void function_info::ptx_jit_config(std::map<unsigned long long, size_t> mallocPt
param_t param_value = p.get_value();
offsets.push_back((unsigned)p.get_offset());
- if (paramIsPointer[i->first]){
+ if (paramIsPointer[i->first] && (*(unsigned long long*)param_value.pdata != 0)){
//is pointer
assert(param_value.size==sizeof(void*)&&"MisID'd this param as pointer");
size_t array_size = 0;
diff --git a/src/cuda-sim/instructions.cc b/src/cuda-sim/instructions.cc
index fe36902..31fc434 100644
--- a/src/cuda-sim/instructions.cc
+++ b/src/cuda-sim/instructions.cc
@@ -1459,7 +1459,34 @@ void breakaddr_impl( const ptx_instruction *pI, ptx_thread_info *thread )
assert(pI->has_pred() == false); // pdom analysis cannot handle if this instruction is predicated
}
-void brev_impl( const ptx_instruction *pI, ptx_thread_info *thread ) { inst_not_implemented(pI); }
+void brev_impl( const ptx_instruction *pI, ptx_thread_info *thread )
+{
+ ptx_reg_t src1_data, data;
+ const operand_info &dst = pI->dst();
+ const operand_info &src1 = pI->src1();
+ unsigned i_type = pI->get_type();
+ src1_data = thread->get_operand_value(src1, dst, i_type, thread, 1);
+
+ unsigned msb;
+ switch(i_type){
+ case B32_TYPE:
+ msb = 31;
+ for (unsigned i=0; i<=msb; i++) {
+ if((src1_data.u32 & (1 << i)))
+ data.u32 |= 1 << (msb - i);
+ }
+ break;
+ case B64_TYPE:
+ msb = 63;
+ for (unsigned i=0; i<=msb; i++) {
+ if((src1_data.u64 & (1 << i)))
+ data.u64 |= 1 << (msb - i);
+ }
+ break;
+ default: assert(0);
+ }
+ thread->set_operand_value(dst,data, i_type, thread, pI);
+}
void brkpt_impl( const ptx_instruction *pI, ptx_thread_info *thread ) { inst_not_implemented(pI); }
void call_impl( const ptx_instruction *pI, ptx_thread_info *thread )
diff --git a/src/cuda-sim/ptx_ir.h b/src/cuda-sim/ptx_ir.h
index e726ab9..768b3e7 100644
--- a/src/cuda-sim/ptx_ir.h
+++ b/src/cuda-sim/ptx_ir.h
@@ -1297,6 +1297,7 @@ public:
unsigned offset = 0;
if (m_param_configs.size()>0){
unsigned offset_nom = m_param_configs.back().first + m_param_configs.back().second;
+ //ensure offset matches alignment requirements
offset = offset_nom%alignment ? (offset_nom/alignment + 1) * alignment : offset_nom;
}
m_param_configs.push_back(std::pair<size_t,unsigned>(size, offset));
diff --git a/src/cuda-sim/ptx_parser.cc b/src/cuda-sim/ptx_parser.cc
index e6d6325..0ba9a5b 100644
--- a/src/cuda-sim/ptx_parser.cc
+++ b/src/cuda-sim/ptx_parser.cc
@@ -571,7 +571,9 @@ void add_function_arg()
if( g_func_info ) {
PTX_PARSE_DPRINTF("add_function_arg \"%s\"", g_last_symbol->name().c_str() );
g_func_info->add_arg(g_last_symbol);
- g_func_info->add_config_param( g_size, g_alignment_spec );
+ unsigned alignment = (g_alignment_spec==-1) ? g_size : g_alignment_spec;
+ assert(alignment==1||alignment==2||alignment==4||alignment==8||alignment==16);//known valid alignment values
+ g_func_info->add_config_param( g_size, alignment);
}
}