parse: Add accumulator, support for type names
authorDavid Schleef <ds@schleef.org>
Mon, 15 Jun 2009 18:06:42 +0000 (11:06 -0700)
committerDavid Schleef <ds@schleef.org>
Mon, 15 Jun 2009 18:27:10 +0000 (11:27 -0700)
orc/orcparse.c
orc/orcprogram.c
orc/orcprogram.h

index 5f3af6f..6fb9c08 100644 (file)
@@ -112,18 +112,33 @@ orc_parse (const char *code, OrcProgram ***programs)
         parser->creg_index = 1;
       } else if (strcmp (token[0], ".source") == 0) {
         int size = strtol (token[1], NULL, 0);
-        orc_program_add_source (parser->program, size, token[2]);
+        int var;
+        var = orc_program_add_source (parser->program, size, token[2]);
+        if (n_tokens > 3) {
+          orc_program_set_type_name (parser->program, var, token[3]);
+        }
       } else if (strcmp (token[0], ".dest") == 0) {
         int size = strtol (token[1], NULL, 0);
-        orc_program_add_destination (parser->program, size, token[2]);
+        int var;
+        var = orc_program_add_destination (parser->program, size, token[2]);
+        if (n_tokens > 3) {
+          orc_program_set_type_name (parser->program, var, token[3]);
+        }
+      } else if (strcmp (token[0], ".accumulator") == 0) {
+        int size = strtol (token[1], NULL, 0);
+        int var;
+        var = orc_program_add_accumulator (parser->program, size, token[2]);
+        if (n_tokens > 3) {
+          orc_program_set_type_name (parser->program, var, token[3]);
+        }
       } else if (strcmp (token[0], ".temp") == 0) {
         int size = strtol (token[1], NULL, 0);
         orc_program_add_temporary (parser->program, size, token[2]);
       } else if (strcmp (token[0], ".param") == 0) {
-        int size = 2;
-        orc_program_add_parameter (parser->program, size, token[1]);
+        int size = strtol (token[1], NULL, 0);
+        orc_program_add_parameter (parser->program, size, token[2]);
       } else {
-        //printf("ERROR: unknown directive: %s\n", token[0]);
+        ORC_ERROR("ERROR: unknown directive: %s", token[0]);
       }
     } else {
       OrcStaticOpcode *o;
index 7497152..11393ca 100644 (file)
@@ -348,6 +348,12 @@ orc_program_add_accumulator (OrcProgram *program, int size, const char *name)
   return i;
 }
 
+void
+orc_program_set_type_name (OrcProgram *program, int var, const char *type_name)
+{
+  program->vars[var].type_name = strdup(type_name);
+}
+
 /**
  * orc_program_append_ds:
  * @program: a pointer to an OrcProgram structure
index 2941e9a..2f13baa 100644 (file)
@@ -165,6 +165,7 @@ typedef enum {
 struct _OrcVariable {
   /*< private >*/
   char *name;
+  char *type_name;
 
   int size;
   OrcVarType vartype;
@@ -444,6 +445,7 @@ int orc_program_add_destination (OrcProgram *program, int size, const char *name
 int orc_program_add_constant (OrcProgram *program, int size, int value, const char *name);
 int orc_program_add_parameter (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);
 
 OrcExecutor * orc_executor_new (OrcProgram *program);
 void orc_executor_free (OrcExecutor *ex);