diff options
| author | Ahmed El-Shafiey <[email protected]> | 2012-08-14 13:53:25 -0800 |
|---|---|---|
| committer | Andrew Boktor <[email protected]> | 2014-08-14 13:48:54 -0700 |
| commit | 0ce06988a6a13f9a8f48f2230b1b9727ee86081e (patch) | |
| tree | 08a4f172a71b3a9b0de5bea1b1c74f38d97036cb /src/cuda-sim | |
| parent | 8f2b4a6f61ef30d86b9bae7c92ed62f223550a76 (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.cc | 3 | ||||
| -rw-r--r-- | src/cuda-sim/instructions.cc | 4 | ||||
| -rw-r--r-- | src/cuda-sim/ptx.y | 1 | ||||
| -rw-r--r-- | src/cuda-sim/ptx_ir.h | 20 | ||||
| -rw-r--r-- | src/cuda-sim/ptx_parser.cc | 17 | ||||
| -rw-r--r-- | src/cuda-sim/ptx_parser.h | 2 |
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 } |
