summaryrefslogtreecommitdiff
path: root/src/cuda-sim
diff options
context:
space:
mode:
authorAhmed El-Shafiey <[email protected]>2012-08-14 13:53:25 -0800
committerAndrew Boktor <[email protected]>2014-08-14 13:48:54 -0700
commit0ce06988a6a13f9a8f48f2230b1b9727ee86081e (patch)
tree08a4f172a71b3a9b0de5bea1b1c74f38d97036cb /src/cuda-sim
parent8f2b4a6f61ef30d86b9bae7c92ed62f223550a76 (diff)
Fixing bugs 169, 170, 171
[git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 13761]
Diffstat (limited to 'src/cuda-sim')
-rw-r--r--src/cuda-sim/cuda-sim.cc3
-rw-r--r--src/cuda-sim/instructions.cc4
-rw-r--r--src/cuda-sim/ptx.y1
-rw-r--r--src/cuda-sim/ptx_ir.h20
-rw-r--r--src/cuda-sim/ptx_parser.cc17
-rw-r--r--src/cuda-sim/ptx_parser.h2
6 files changed, 41 insertions, 6 deletions
diff --git a/src/cuda-sim/cuda-sim.cc b/src/cuda-sim/cuda-sim.cc
index 4cad472..e6677fa 100644
--- a/src/cuda-sim/cuda-sim.cc
+++ b/src/cuda-sim/cuda-sim.cc
@@ -813,6 +813,9 @@ void ptx_instruction::pre_decode()
// TODO: first address register in $r1+=$r2 should be an output register as well
}
}
+ else if(o.is_immediate_address()){
+
+ }
// Regular PTX operand
else if (o.get_symbol()->type()->get_key().is_reg()) { // Memory operand contains a register
ar1 = o.reg_num();
diff --git a/src/cuda-sim/instructions.cc b/src/cuda-sim/instructions.cc
index a7685aa..237bfd5 100644
--- a/src/cuda-sim/instructions.cc
+++ b/src/cuda-sim/instructions.cc
@@ -106,7 +106,9 @@ ptx_reg_t ptx_thread_info::get_operand_value( const operand_info &op, operand_in
result = get_reg( op.get_symbol() );
} else if ( op.is_builtin()) {
result = get_builtin( op.get_int(), op.get_addr_offset() );
- } else if ( op.is_memory_operand() ) {
+ } else if(op.is_immediate_address()){
+ result = op.get_addr_offset();
+ } else if ( op.is_memory_operand() ) {
// a few options here...
const symbol *sym = op.get_symbol();
const type_info *type = sym->type();
diff --git a/src/cuda-sim/ptx.y b/src/cuda-sim/ptx.y
index 8b65796..2c01a70 100644
--- a/src/cuda-sim/ptx.y
+++ b/src/cuda-sim/ptx.y
@@ -527,6 +527,7 @@ address_expression: IDENTIFIER { add_address_operand($1,0); }
| IDENTIFIER LO_OPTION { add_address_operand($1,0); change_operand_lohi(1);}
| IDENTIFIER HI_OPTION { add_address_operand($1,0); change_operand_lohi(2); }
| IDENTIFIER PLUS INT_OPERAND { add_address_operand($1,$3); }
+ | INT_OPERAND { add_address_operand2($1); }
;
%%
diff --git a/src/cuda-sim/ptx_ir.h b/src/cuda-sim/ptx_ir.h
index 15c6743..4078e6b 100644
--- a/src/cuda-sim/ptx_ir.h
+++ b/src/cuda-sim/ptx_ir.h
@@ -342,6 +342,7 @@ public:
m_const_mem_offset = 0;
m_uid = get_uid();
m_valid = false;
+ m_immediate_address=false;
}
operand_info( const symbol *addr )
{
@@ -376,6 +377,7 @@ public:
m_vector = false;
m_neg_pred = false;
m_is_return_var = false;
+ m_immediate_address=false;
}
operand_info( const symbol *addr1, const symbol *addr2 )
{
@@ -396,6 +398,7 @@ public:
m_vector = false;
m_neg_pred = false;
m_is_return_var = false;
+ m_immediate_address=false;
}
operand_info( int builtin_id, int dim_mod )
{
@@ -412,6 +415,7 @@ public:
m_addr_offset = dim_mod;
m_neg_pred = false;
m_is_return_var = false;
+ m_immediate_address=false;
}
operand_info( const symbol *addr, int offset )
{
@@ -428,6 +432,7 @@ public:
m_addr_offset = offset;
m_neg_pred = false;
m_is_return_var = false;
+ m_immediate_address=false;
}
operand_info( unsigned x )
{
@@ -441,9 +446,10 @@ public:
m_vector = false;
m_type = unsigned_t;
m_value.m_unsigned = x;
- m_addr_offset = 0;
+ m_addr_offset = x;
m_neg_pred = false;
m_is_return_var = false;
+ m_immediate_address=true;
}
operand_info( int x )
{
@@ -460,6 +466,7 @@ public:
m_addr_offset = 0;
m_neg_pred = false;
m_is_return_var = false;
+ m_immediate_address=false;
}
operand_info( float x )
{
@@ -476,6 +483,7 @@ public:
m_addr_offset = 0;
m_neg_pred = false;
m_is_return_var = false;
+ m_immediate_address=false;
}
operand_info( double x )
{
@@ -492,6 +500,7 @@ public:
m_addr_offset = 0;
m_neg_pred = false;
m_is_return_var = false;
+ m_immediate_address=false;
}
operand_info( const symbol *s1, const symbol *s2, const symbol *s3, const symbol *s4 )
{
@@ -512,11 +521,12 @@ public:
m_addr_offset = 0;
m_neg_pred = false;
m_is_return_var = false;
+ m_immediate_address=false;
}
void make_memory_operand() { m_type = memory_t;}
void set_return() { m_is_return_var = true; }
-
+ void set_immediate_addr() {m_immediate_address=true;}
const std::string &name() const
{
assert( m_type == symbolic_t || m_type == reg_t || m_type == address_t || m_type == memory_t || m_type == label_t);
@@ -606,6 +616,10 @@ public:
return (m_addr_space!=undefined_space);
}
+ bool is_immediate_address() const {
+ return m_immediate_address;
+ }
+
bool is_literal() const { return m_type == int_t ||
m_type == float_op_t ||
m_type == double_op_t ||
@@ -678,7 +692,7 @@ private:
bool m_valid;
bool m_vector;
enum operand_type m_type;
-
+ bool m_immediate_address;
enum _memory_space_t m_addr_space;
int m_operand_lohi;
int m_double_operand_type;
diff --git a/src/cuda-sim/ptx_parser.cc b/src/cuda-sim/ptx_parser.cc
index cc97b72..76d9a9c 100644
--- a/src/cuda-sim/ptx_parser.cc
+++ b/src/cuda-sim/ptx_parser.cc
@@ -689,8 +689,8 @@ void change_memory_addr_space(const char *identifier)
if(!strcmp(l, "l"))
{
g_operands.back().set_addr_space(local_space);
- parse_assert(g_current_symbol_table->lookup(identifier) != NULL, "Local memory segment was not defined.");
- g_operands.back().set_const_mem_offset(g_current_symbol_table->lookup(identifier)->get_address());
+ //parse_assert(g_current_symbol_table->lookup(identifier) != NULL, "Local memory segment was not defined.");
+ //g_operands.back().set_const_mem_offset(g_current_symbol_table->lookup(identifier)->get_address());
recognizedType = true;
}
@@ -711,6 +711,13 @@ void change_operand_lohi( int lohi )
}
+void set_immediate_operand_type ()
+{
+ DPRINTF("set_immediate_operand_type");
+ assert( !g_operands.empty() );
+ g_operands.back().set_immediate_addr();
+}
+
void change_double_operand_type( int operand_type )
{
/*
@@ -809,6 +816,12 @@ void add_address_operand( const char *identifier, int offset )
g_operands.push_back( operand_info(s,offset) );
}
+void add_address_operand2( int offset )
+{
+ DPRINTF("add_address_operand");
+ g_operands.push_back( operand_info((unsigned)offset) );
+}
+
void add_array_initializer()
{
g_last_symbol->add_initializer(g_operands);
diff --git a/src/cuda-sim/ptx_parser.h b/src/cuda-sim/ptx_parser.h
index 561fd74..57d763e 100644
--- a/src/cuda-sim/ptx_parser.h
+++ b/src/cuda-sim/ptx_parser.h
@@ -64,6 +64,7 @@ void add_literal_int( int value );
void add_literal_float( float value );
void add_literal_double( double value );
void add_address_operand( const char *identifier, int offset );
+void add_address_operand2( int offset );
void add_label( const char *idenfiier );
void add_vector_spec(int spec );
void add_space_spec( enum _memory_space_t spec, int value );
@@ -89,6 +90,7 @@ void change_memory_addr_space( const char *identifier );
void change_operand_lohi( int lohi );
void change_double_operand_type( int addr_type );
void change_operand_neg( );
+void set_immediate_operand_type( );
void version_header(double a);
#ifdef __cplusplus
}