diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/cuda-sim/instructions.cc | 52 | ||||
| -rw-r--r-- | src/cuda-sim/ptx_ir.h | 43 | ||||
| -rw-r--r-- | src/cuda-sim/ptx_sim.h | 30 |
3 files changed, 98 insertions, 27 deletions
diff --git a/src/cuda-sim/instructions.cc b/src/cuda-sim/instructions.cc index 99e81e5..49b27d2 100644 --- a/src/cuda-sim/instructions.cc +++ b/src/cuda-sim/instructions.cc @@ -34,7 +34,6 @@ #include <stdlib.h> #include <math.h> #include <fenv.h> - #include "cuda-math.h" #include "../abstract_hardware_model.h" #include "ptx_loader.h" @@ -100,14 +99,15 @@ ptx_reg_t ptx_thread_info::get_operand_value( const operand_info &op, operand_in { ptx_reg_t result, tmp; + if(op.get_double_operand_type() == 0) { if(((opType != BB128_TYPE) && (opType != BB64_TYPE) && (opType != FF64_TYPE)) || (op.get_addr_space() != undefined_space)) { if ( op.is_reg() ) { result = get_reg( op.get_symbol() ); } else if ( op.is_builtin()) { - result = get_builtin( op.get_int(), op.get_addr_offset() ); + result.u32 = get_builtin( op.get_int(), op.get_addr_offset() ); } else if(op.is_immediate_address()){ - result = op.get_addr_offset(); + result.u64 = op.get_addr_offset(); } else if ( op.is_memory_operand() ) { // a few options here... const symbol *sym = op.get_symbol(); @@ -118,18 +118,18 @@ ptx_reg_t ptx_thread_info::get_operand_value( const operand_info &op, operand_in const symbol *name = op.get_symbol(); result.u64 = get_reg(name).u64 + op.get_addr_offset(); } else if ( info.is_param_kernel() ) { - result = sym->get_address() + op.get_addr_offset(); + result.u64 = sym->get_address() + op.get_addr_offset(); } else if ( info.is_param_local() ) { - result = sym->get_address() + op.get_addr_offset(); + result.u64 = sym->get_address() + op.get_addr_offset(); } else if ( info.is_global() ) { assert( op.get_addr_offset() == 0 ); - result = sym->get_address(); + result.u64 = sym->get_address(); } else if ( info.is_local() ) { - result = sym->get_address() + op.get_addr_offset(); + result.u64 = sym->get_address() + op.get_addr_offset(); } else if ( info.is_const() ) { - result = sym->get_address() + op.get_addr_offset(); + result.u64 = sym->get_address() + op.get_addr_offset(); } else if ( op.is_shared() ) { - result = op.get_symbol()->get_address() + op.get_addr_offset(); + result.u64 = op.get_symbol()->get_address() + op.get_addr_offset(); } else { const char *name = op.name().c_str(); printf("GPGPU-Sim PTX: ERROR ** get_operand_value : unknown memory operand type for %s\n", name ); @@ -139,15 +139,15 @@ ptx_reg_t ptx_thread_info::get_operand_value( const operand_info &op, operand_in } else if ( op.is_literal() ) { result = op.get_literal_value(); } else if ( op.is_label() ) { - result = op.get_symbol()->get_address(); + result.u64 = op.get_symbol()->get_address(); } else if ( op.is_shared() ) { - result = op.get_symbol()->get_address(); + result.u64 = op.get_symbol()->get_address(); } else if ( op.is_const() ) { - result = op.get_symbol()->get_address(); + result.u64 = op.get_symbol()->get_address(); } else if ( op.is_global() ) { - result = op.get_symbol()->get_address(); + result.u64 = op.get_symbol()->get_address(); } else if ( op.is_local() ) { - result = op.get_symbol()->get_address(); + result.u64 = op.get_symbol()->get_address(); } else { const char *name = op.name().c_str(); printf("GPGPU-Sim PTX: ERROR ** get_operand_value : unknown operand type for %s\n", name ); @@ -171,40 +171,40 @@ ptx_reg_t ptx_thread_info::get_operand_value( const operand_info &op, operand_in } } else if (op.get_double_operand_type() == 1) { ptx_reg_t firstHalf, secondHalf; - firstHalf = get_reg( op.vec_symbol(0) ).u64; - secondHalf = get_reg( op.vec_symbol(1) ).u64; + firstHalf.u64 = get_reg( op.vec_symbol(0) ).u64; + secondHalf.u64 = get_reg( op.vec_symbol(1) ).u64; if(op.get_operand_lohi() == 1) secondHalf.u64 = secondHalf.u64 & 0xFFFF; else if(op.get_operand_lohi() == 2) secondHalf.u64 = (secondHalf.u64>>16) & 0xFFFF; - result = firstHalf.u64 + secondHalf.u64; + result.u64 = firstHalf.u64 + secondHalf.u64; } else if (op.get_double_operand_type() == 2) { // s[reg1 += reg2] // reg1 is incremented after value is returned: the value returned is s[reg1] ptx_reg_t firstHalf, secondHalf; - firstHalf = get_reg(op.vec_symbol(0)).u64; - secondHalf = get_reg(op.vec_symbol(1)).u64; + firstHalf.u64 = get_reg(op.vec_symbol(0)).u64; + secondHalf.u64 = get_reg(op.vec_symbol(1)).u64; if(op.get_operand_lohi() == 1) secondHalf.u64 = secondHalf.u64 & 0xFFFF; else if(op.get_operand_lohi() == 2) secondHalf.u64 = (secondHalf.u64>>16) & 0xFFFF; - result = firstHalf.u64; - firstHalf = firstHalf.u64 + secondHalf.u64; + result.u64 = firstHalf.u64; + firstHalf.u64 = firstHalf.u64 + secondHalf.u64; set_reg(op.vec_symbol(0),firstHalf); } else if (op.get_double_operand_type() == 3) { // s[reg += immediate] // reg is incremented after value is returned: the value returned is s[reg] ptx_reg_t firstHalf; - firstHalf = get_reg(op.get_symbol()).u64; - result = firstHalf.u64; - firstHalf = firstHalf.u64 + op.get_addr_offset(); + firstHalf.u64 = get_reg(op.get_symbol()).u64; + result.u64 = firstHalf.u64; + firstHalf.u64 = firstHalf.u64 + op.get_addr_offset(); set_reg(op.get_symbol(),firstHalf); } ptx_reg_t finalResult; memory_space *mem = NULL; - size_t size; - int t; + size_t size=0; + int t=0; finalResult.u64=0; //complete other cases for reading from memory, such as reading from other const memory diff --git a/src/cuda-sim/ptx_ir.h b/src/cuda-sim/ptx_ir.h index 26469d5..d8ceeea 100644 --- a/src/cuda-sim/ptx_ir.h +++ b/src/cuda-sim/ptx_ir.h @@ -142,7 +142,7 @@ private: enum operand_type { reg_t, vector_t, builtin_t, address_t, memory_t, float_op_t, double_op_t, int_t, unsigned_t, symbolic_t, label_t, v_reg_t, v_float_op_t, v_double_op_t, - v_int_t, v_unsigned_t + v_int_t, v_unsigned_t, undef_t }; class operand_info; @@ -349,6 +349,7 @@ class operand_info { public: operand_info() { + init(); m_is_non_arch_reg = false; m_addr_space = undefined_space; m_operand_lohi = 0; @@ -358,9 +359,12 @@ public: m_uid = get_uid(); m_valid = false; m_immediate_address=false; + m_addr_offset = 0; + m_value.m_symbolic=NULL; } operand_info( const symbol *addr ) { + init(); m_is_non_arch_reg = false; m_addr_space = undefined_space; m_operand_lohi = 0; @@ -401,6 +405,7 @@ public: } operand_info( const symbol *addr1, const symbol *addr2 ) { + init(); m_is_non_arch_reg = false; m_addr_space = undefined_space; m_operand_lohi = 0; @@ -423,6 +428,7 @@ public: } operand_info( int builtin_id, int dim_mod ) { + init(); m_is_non_arch_reg = false; m_addr_space = undefined_space; m_operand_lohi = 0; @@ -441,6 +447,7 @@ public: } operand_info( const symbol *addr, int offset ) { + init(); m_is_non_arch_reg = false; m_addr_space = undefined_space; m_operand_lohi = 0; @@ -459,6 +466,7 @@ public: } operand_info( unsigned x ) { + init(); m_is_non_arch_reg = false; m_addr_space = undefined_space; m_operand_lohi = 0; @@ -477,6 +485,7 @@ public: } operand_info( int x ) { + init(); m_is_non_arch_reg = false; m_addr_space = undefined_space; m_operand_lohi = 0; @@ -495,6 +504,7 @@ public: } operand_info( float x ) { + init(); m_is_non_arch_reg = false; m_addr_space = undefined_space; m_operand_lohi = 0; @@ -513,6 +523,7 @@ public: } operand_info( double x ) { + init(); m_is_non_arch_reg = false; m_addr_space = undefined_space; m_operand_lohi = 0; @@ -531,6 +542,7 @@ public: } operand_info( const symbol *s1, const symbol *s2, const symbol *s3, const symbol *s4 ) { + init(); m_is_non_arch_reg = false; m_addr_space = undefined_space; m_operand_lohi = 0; @@ -551,7 +563,36 @@ public: m_is_return_var = false; m_immediate_address=false; } + void init() + { + m_uid=(unsigned)-1; + m_valid=false; + m_vector=false; + m_type=undef_t; + m_immediate_address=false; + m_addr_space=undefined_space; + m_operand_lohi=0; + m_double_operand_type=0; + m_operand_neg=false; + m_const_mem_offset=(unsigned)-1; + m_value.m_int=0; + m_value.m_unsigned=(unsigned)-1; + m_value.m_float=0; + m_value.m_double=0; + for(unsigned i=0; i<4; i++){ + m_value.m_vint[i]=0; + m_value.m_vunsigned[i]=0; + m_value.m_vfloat[i]=0; + m_value.m_vdouble[i]=0; + } + m_value.m_symbolic=NULL; + m_value.m_vector_symbolic=NULL; + m_addr_offset=0; + m_neg_pred=0; + m_is_return_var=0; + m_is_non_arch_reg=0; + } void make_memory_operand() { m_type = memory_t;} void set_return() { m_is_return_var = true; } void set_immediate_addr() {m_immediate_address=true;} diff --git a/src/cuda-sim/ptx_sim.h b/src/cuda-sim/ptx_sim.h index 929ed98..1d30eb6 100644 --- a/src/cuda-sim/ptx_sim.h +++ b/src/cuda-sim/ptx_sim.h @@ -57,11 +57,41 @@ union ptx_reg_t { ptx_reg_t() { bits.ms = 0; bits.ls = 0; + u128.low=0; + u128.lowest=0; + u128.highest=0; + u128.high=0; + s8=0; + s16=0; + s32=0; + s64=0; + u8=0; + u16=0; + u64=0; + f16=0; + f32=0; + f64=0; + pred=0; } ptx_reg_t(unsigned x) { bits.ms = 0; bits.ls = 0; + u128.low=0; + u128.lowest=0; + u128.highest=0; + u128.high=0; + s8=0; + s16=0; + s32=0; + s64=0; + u8=0; + u16=0; + u64=0; + f16=0; + f32=0; + f64=0; + pred=0; u32 = x; } operator unsigned int() { return u32;} |
