From 32e045d5a5af3756c6735908bef02677d5ff560d Mon Sep 17 00:00:00 2001 From: David Schleef Date: Sun, 15 May 2011 16:43:42 -0700 Subject: [PATCH] parse: Add 'align %d' for array alignment --- orc/orcparse.c | 32 ++++++++++++++++++++++++++++---- orc/orcprogram.c | 11 +++++++++++ orc/orcprogram.h | 2 ++ 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/orc/orcparse.c b/orc/orcparse.c index ecdb897..385ee26 100644 --- a/orc/orcparse.c +++ b/orc/orcparse.c @@ -161,16 +161,40 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log) } else if (strcmp (token[0], ".source") == 0) { int size = strtol (token[1], NULL, 0); int var; + int i; var = orc_program_add_source (parser->program, size, token[2]); - if (n_tokens > 3) { - orc_program_set_type_name (parser->program, var, token[3]); + for(i=3;iline_number); + } else { + int alignment = strtol (token[i+1], NULL, 0); + orc_program_set_var_alignment (parser->program, var, alignment); + i++; + } + } else { + orc_program_set_type_name (parser->program, var, token[i]); + } } } else if (strcmp (token[0], ".dest") == 0) { int size = strtol (token[1], NULL, 0); int var; + int i; var = orc_program_add_destination (parser->program, size, token[2]); - if (n_tokens > 3) { - orc_program_set_type_name (parser->program, var, token[3]); + for(i=3;iline_number); + } else { + int alignment = strtol (token[i+1], NULL, 0); + orc_program_set_var_alignment (parser->program, var, alignment); + i++; + } + } else { + orc_program_set_type_name (parser->program, var, token[i]); + } } } else if (strcmp (token[0], ".accumulator") == 0) { int size = strtol (token[1], NULL, 0); diff --git a/orc/orcprogram.c b/orc/orcprogram.c index 3e99308..0371b2b 100644 --- a/orc/orcprogram.c +++ b/orc/orcprogram.c @@ -305,6 +305,7 @@ orc_program_add_source (OrcProgram *program, int size, const char *name) program->vars[i].vartype = ORC_VAR_TYPE_SRC; program->vars[i].size = size; + program->vars[i].alignment = size; program->vars[i].name = strdup(name); program->n_src_vars++; @@ -328,6 +329,7 @@ orc_program_add_destination (OrcProgram *program, int size, const char *name) program->vars[i].vartype = ORC_VAR_TYPE_DEST; program->vars[i].size = size; + program->vars[i].alignment = size; program->vars[i].name = strdup(name); program->n_dest_vars++; @@ -557,6 +559,15 @@ orc_program_set_type_name (OrcProgram *program, int var, const char *type_name) } void +orc_program_set_var_alignment (OrcProgram *program, int var, int alignment) +{ + program->vars[var].alignment = alignment; + if (alignment >= 16) { + program->vars[var].is_aligned = TRUE; + } +} + +void orc_program_set_sampling_type (OrcProgram *program, int var, int sampling_type) { diff --git a/orc/orcprogram.h b/orc/orcprogram.h index 812c7eb..8c07199 100644 --- a/orc/orcprogram.h +++ b/orc/orcprogram.h @@ -222,6 +222,7 @@ struct _OrcVariable { int alloc; int is_chained; int is_aligned; + int alignment; int is_uncached; orc_union64 value; @@ -692,6 +693,7 @@ int orc_program_add_parameter_double (OrcProgram *program, int size, const char int orc_program_add_parameter_int64 (OrcProgram *program, int size, const char *name); int orc_program_add_accumulator (OrcProgram *program, int size, const char *name); void orc_program_set_type_name (OrcProgram *program, int var, const char *type_name); +void orc_program_set_var_alignment (OrcProgram *program, int var, int alignment); void orc_program_set_sampling_type (OrcProgram *program, int var, int sampling_type); OrcExecutor * orc_executor_new (OrcProgram *program); -- 2.7.4