summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTor Aamodt <[email protected]>2010-07-16 23:13:34 -0800
committerTor Aamodt <[email protected]>2010-07-16 23:13:34 -0800
commitd67e0e6d7c50a5c6f567e387e17782f022553264 (patch)
tree814766699be6d3ede2b7d74f2bdfb060cbc196cd /src
parent55506aed771c40e93f374cffb04c6e48b34e6003 (diff)
template compiled with "make noinline=1" now parses, runs, passes
[git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 6857]
Diffstat (limited to 'src')
-rw-r--r--src/cuda-sim/ptx.l10
-rw-r--r--src/cuda-sim/ptx.y3
-rw-r--r--src/cuda-sim/ptx_ir.cc21
-rw-r--r--src/cuda-sim/ptx_ir.h2
4 files changed, 28 insertions, 8 deletions
diff --git a/src/cuda-sim/ptx.l b/src/cuda-sim/ptx.l
index 0ab7522..0d66bfd 100644
--- a/src/cuda-sim/ptx.l
+++ b/src/cuda-sim/ptx.l
@@ -174,8 +174,8 @@ xor TC; ptx_lval.int_value = XOR_OP; return OPCODE;
\.const TC; return CONST_DIRECTIVE;
\.entry TC; return ENTRY_DIRECTIVE;
\.extern TC; return EXTERN_DIRECTIVE;
-\.file TC; return FILE_DIRECTIVE;
-\.func TC; return FUNC_DIRECTIVE;
+\.file TC; BEGIN(INITIAL); return FILE_DIRECTIVE;
+\.func TC; BEGIN(NOT_OPCODE); return FUNC_DIRECTIVE;
\.global TC; return GLOBAL_DIRECTIVE;
\.local TC; return LOCAL_DIRECTIVE;
\.loc TC; return LOC_DIRECTIVE;
@@ -220,8 +220,8 @@ xor TC; ptx_lval.int_value = XOR_OP; return OPCODE;
"%warpid" TC; ptx_lval.int_value = WARPID_REG; return SPECIAL_REGISTER;
"WARP_SZ" TC; ptx_lval.int_value = WARPSZ_REG; return SPECIAL_REGISTER;
-[a-zA-Z][a-zA-Z0-9_$]* TC; ptx_lval.string_value = strdup(yytext); return IDENTIFIER;
-[_$%][a-zA-Z0-9_$]+ TC; ptx_lval.string_value = strdup(yytext); return IDENTIFIER;
+[a-zA-Z_][a-zA-Z0-9_$]* TC; ptx_lval.string_value = strdup(yytext); return IDENTIFIER;
+[$%][a-zA-Z0-9_$]+ TC; ptx_lval.string_value = strdup(yytext); return IDENTIFIER;
[0-9]+\.[0-9]+ TC; sscanf(yytext,"%lf", &ptx_lval.double_value); return DOUBLE_OPERAND;
@@ -340,7 +340,7 @@ xor TC; ptx_lval.int_value = XOR_OP; return OPCODE;
";" TC; BEGIN(INITIAL); return SEMI_COLON;
"!" TC; return EXCLAMATION;
"=" TC; return EQUALS;
-"{" TC; return LEFT_BRACE;
+"{" TC; BEGIN(INITIAL); return LEFT_BRACE;
"}" TC; return RIGHT_BRACE;
\. TC; return PERIOD;
diff --git a/src/cuda-sim/ptx.y b/src/cuda-sim/ptx.y
index dd69fe5..9ddb214 100644
--- a/src/cuda-sim/ptx.y
+++ b/src/cuda-sim/ptx.y
@@ -217,7 +217,7 @@ input: /* empty */
| input function_decl
;
-function_defn: function_decl { set_symtab($1); } LEFT_BRACE statement_list RIGHT_BRACE { end_function(); }
+function_defn: function_decl { set_symtab($1); start_function_definition(); } LEFT_BRACE statement_list RIGHT_BRACE { end_function(); }
| function_decl { set_symtab($1); } block_spec LEFT_BRACE statement_list RIGHT_BRACE { end_function(); }
;
@@ -255,6 +255,7 @@ directive_statement: variable_declaration SEMI_COLON
| TARGET_DIRECTIVE IDENTIFIER
| FILE_DIRECTIVE INT_OPERAND STRING { add_file($2,$3); }
| LOC_DIRECTIVE INT_OPERAND INT_OPERAND INT_OPERAND
+ | PRAGMA_DIRECTIVE STRING SEMI_COLON { add_pragma($2); }
;
variable_declaration: variable_spec identifier_list { add_variables(); }
diff --git a/src/cuda-sim/ptx_ir.cc b/src/cuda-sim/ptx_ir.cc
index 542426a..c981802 100644
--- a/src/cuda-sim/ptx_ir.cc
+++ b/src/cuda-sim/ptx_ir.cc
@@ -181,6 +181,14 @@ void start_function( int entry_point )
g_entry_func_param_index=0;
}
+static bool g_in_function_definition = false;
+
+void start_function_definition()
+{
+ DPRINTF("start_function_definition");
+ g_in_function_definition = true;
+}
+
char *g_add_identifier_cached__identifier = NULL;
int g_add_identifier_cached__array_dim;
int g_add_identifier_cached__array_ident;
@@ -222,12 +230,14 @@ void end_function()
{
DPRINTF("end_function");
+ g_in_function_definition = false;
init_directive_state();
init_instruction_state();
g_max_regs_per_thread = mymax( g_max_regs_per_thread, (g_current_symbol_table->next_reg_num()-1));
g_func_info->add_inst( g_instructions );
g_instructions.clear();
gpgpu_ptx_assemble( g_func_info->get_name(), g_func_info );
+ g_current_symbol_table = g_global_symbol_table;
DPRINTF("function %s, PC = %d\n", g_func_info->get_name().c_str(), g_func_info->get_start_PC());
}
@@ -472,8 +482,10 @@ void add_identifier( const char *identifier, int array_dim, unsigned array_ident
if ( ti.is_param() ) {
- g_func_info->add_param_name_and_type(g_entry_func_param_index,identifier, ti.scalar_type() );
- g_entry_func_param_index++;
+ if( !g_in_function_definition ) {
+ g_func_info->add_param_name_and_type(g_entry_func_param_index,identifier, ti.scalar_type() );
+ g_entry_func_param_index++;
+ }
}
}
@@ -1268,6 +1280,11 @@ extern "C" void set_symtab(void*symtab)
g_current_symbol_table = (symbol_table*)symtab;
}
+extern "C" void add_pragma( const char *str )
+{
+ printf("GPGPU-Sim: Warning -- ignoring pragma '%s'\n", str );
+}
+
unsigned ptx_kernel_shmem_size( void *kernel_impl )
{
function_info *f = (function_info*)kernel_impl;
diff --git a/src/cuda-sim/ptx_ir.h b/src/cuda-sim/ptx_ir.h
index 82d5b4c..aca3556 100644
--- a/src/cuda-sim/ptx_ir.h
+++ b/src/cuda-sim/ptx_ir.h
@@ -1176,6 +1176,7 @@ extern "C" {
#endif
void start_function( int entry_point );
+ void start_function_definition();
void add_function_name( const char *fname );
void init_directive_state();
void add_directive();
@@ -1210,6 +1211,7 @@ extern "C" {
void add_file( unsigned num, const char *filename );
void *reset_symtab();
void set_symtab(void*);
+ void add_pragma( const char *str );
#define NON_ARRAY_IDENTIFIER 1