summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schleef <ds@ginger.bigkitten.com>2008-05-28 13:10:04 -0700
committerDavid Schleef <ds@ginger.bigkitten.com>2008-05-28 13:10:04 -0700
commita60fdaca134c28fb774993f3f2555fd6afbb1352 (patch)
tree904b230378d96aff2587bc756656c0ae597a14df
parent8c46abcb0bf8effe7776894a47c1952864174c71 (diff)
downloadliboil-a60fdaca134c28fb774993f3f2555fd6afbb1352.tar.gz
[orc] add functions to refer to variables by name
-rw-r--r--orc/orcexecutor.c8
-rw-r--r--orc/orcprogram.c48
-rw-r--r--orc/orcprogram.h7
3 files changed, 63 insertions, 0 deletions
diff --git a/orc/orcexecutor.c b/orc/orcexecutor.c
index a8f976e..8c221ff 100644
--- a/orc/orcexecutor.c
+++ b/orc/orcexecutor.c
@@ -45,6 +45,14 @@ orc_executor_set_array (OrcExecutor *ex, int var, void *ptr)
}
void
+orc_executor_set_array_str (OrcExecutor *ex, const char *name, void *ptr)
+{
+ int var;
+ var = orc_program_find_var_by_name (ex->program, name);
+ ex->arrays[var] = ptr;
+}
+
+void
orc_executor_set_n (OrcExecutor *ex, int n)
{
ex->n = n;
diff --git a/orc/orcprogram.c b/orc/orcprogram.c
index 52bff06..c944e09 100644
--- a/orc/orcprogram.c
+++ b/orc/orcprogram.c
@@ -32,6 +32,21 @@ orc_program_new (void)
return p;
}
+OrcProgram *
+orc_program_new_dss (const char *type_d1, const char *type_s1,
+ const char *type_s2)
+{
+ OrcProgram *p;
+
+ p = orc_program_new ();
+
+ orc_program_add_destination (p, type_d1, "d1");
+ orc_program_add_source (p, type_d1, "s1");
+ orc_program_add_source (p, type_d1, "s2");
+
+ return p;
+}
+
void
orc_program_free (OrcProgram *program)
{
@@ -136,6 +151,39 @@ orc_program_append (OrcProgram *program, const char *name, int arg0,
}
int
+orc_program_find_var_by_name (OrcProgram *program, const char *name)
+{
+ int i;
+
+ for(i=0;i<program->n_vars;i++){
+ if (strcmp (program->vars[i].name, name) == 0) {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+void
+orc_program_append_str (OrcProgram *program, const char *name,
+ const char *arg1, const char *arg2, const char *arg3)
+{
+ OrcInstruction *insn;
+
+ insn = program->insns + program->n_insns;
+
+ insn->opcode = orc_opcode_find_by_name (name);
+ if (!insn->opcode) {
+ printf("unknown opcode: %s\n", name);
+ }
+ insn->args[0] = orc_program_find_var_by_name (program, arg1);
+ insn->args[1] = orc_program_find_var_by_name (program, arg2);
+ insn->args[2] = orc_program_find_var_by_name (program, arg3);
+
+ program->n_insns++;
+}
+
+int
orc_program_allocate_register (OrcProgram *program, int data_reg)
{
int i;
diff --git a/orc/orcprogram.h b/orc/orcprogram.h
index 3ae3e00..3281f0e 100644
--- a/orc/orcprogram.h
+++ b/orc/orcprogram.h
@@ -210,10 +210,14 @@ enum {
void orc_init (void);
OrcProgram * orc_program_new (void);
+OrcProgram * orc_program_new_dss (const char *type1, const char *type2,
+ const char *type3);
OrcOpcode * orc_opcode_find_by_name (const char *name);
void orc_opcode_init (void);
void orc_program_append (OrcProgram *p, const char *opcode, int arg0, int arg1, int arg2);
+void orc_program_append_str (OrcProgram *p, const char *opcode,
+ const char * arg0, const char * arg1, const char * arg2);
void orc_x86_init (void);
void orc_powerpc_init (void);
@@ -227,6 +231,8 @@ void orc_program_assemble_powerpc (OrcProgram *p);
void orc_program_assemble_c (OrcProgram *p);
void orc_program_free (OrcProgram *program);
+int orc_program_find_var_by_name (OrcProgram *program, const char *name);
+
int orc_program_add_temporary (OrcProgram *program, const char *type, const char *name);
int orc_program_dup_temporary (OrcProgram *program, int i, int j);
int orc_program_add_source (OrcProgram *program, const char *type, const char *name);
@@ -245,6 +251,7 @@ void orc_type_register (const char *name, int size);
OrcExecutor * orc_executor_new (OrcProgram *program);
void orc_executor_free (OrcExecutor *ex);
void orc_executor_set_array (OrcExecutor *ex, int var, void *ptr);
+void orc_executor_set_array_str (OrcExecutor *ex, const char *name, void *ptr);
void orc_executor_set_n (OrcExecutor *ex, int n);
void orc_executor_emulate (OrcExecutor *ex);
void orc_executor_run (OrcExecutor *ex);