summaryrefslogtreecommitdiff
path: root/orc/orcprogram.c
diff options
context:
space:
mode:
Diffstat (limited to 'orc/orcprogram.c')
-rw-r--r--orc/orcprogram.c48
1 files changed, 48 insertions, 0 deletions
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;