From a60fdaca134c28fb774993f3f2555fd6afbb1352 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Wed, 28 May 2008 13:10:04 -0700 Subject: [orc] add functions to refer to variables by name --- orc/orcexecutor.c | 8 ++++++++ orc/orcprogram.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ orc/orcprogram.h | 7 +++++++ 3 files changed, 63 insertions(+) diff --git a/orc/orcexecutor.c b/orc/orcexecutor.c index a8f976e..8c221ff 100644 --- a/orc/orcexecutor.c +++ b/orc/orcexecutor.c @@ -44,6 +44,14 @@ orc_executor_set_array (OrcExecutor *ex, int var, void *ptr) ex->arrays[var] = 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) { 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) { @@ -135,6 +150,39 @@ orc_program_append (OrcProgram *program, const char *name, int arg0, program->n_insns++; } +int +orc_program_find_var_by_name (OrcProgram *program, const char *name) +{ + int i; + + for(i=0;in_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) { 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); -- cgit v1.2.3