summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cuda-sim/instructions.cc52
-rw-r--r--src/cuda-sim/ptx_ir.h43
-rw-r--r--src/cuda-sim/ptx_sim.h30
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;}