parse: Add 'align %d' for array alignment
authorDavid Schleef <ds@schleef.org>
Sun, 15 May 2011 23:43:42 +0000 (16:43 -0700)
committerDavid Schleef <ds@schleef.org>
Sun, 15 May 2011 23:43:42 +0000 (16:43 -0700)
orc/orcparse.c
orc/orcprogram.c
orc/orcprogram.h

index ecdb897..385ee26 100644 (file)
@@ -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;i<n_tokens;i++){
+          if (strcmp (token[i], "align") == 0) {
+            if (i == n_tokens - 1) {
+              orc_parse_log (parser, "error: line %d: .source align requires alignment value\n",
+                  parser->line_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;i<n_tokens;i++){
+          if (strcmp (token[i], "align") == 0) {
+            if (i == n_tokens - 1) {
+              orc_parse_log (parser, "error: line %d: .source align requires alignment value\n",
+                  parser->line_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);
index 3e99308..0371b2b 100644 (file)
@@ -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)
 {
index 812c7eb..8c07199 100644 (file)
@@ -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);