Add orc_program_append_2() for instruction flags
authorDavid Schleef <ds@schleef.org>
Mon, 9 Aug 2010 23:56:13 +0000 (16:56 -0700)
committerDavid Schleef <ds@schleef.org>
Mon, 9 Aug 2010 23:58:50 +0000 (16:58 -0700)
orc/orcfunctions.c
orc/orcprogram.c
orc/orcprogram.h
tools/orcc.c

index cadb618..6f9e701 100644 (file)
@@ -155,7 +155,7 @@ orc_memcpy (void * d1, const void * s1, int n)
       orc_program_add_destination (p, 1, "d1");
       orc_program_add_source (p, 1, "s1");
 
-      orc_program_append (p, "copyb", ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1);
+      orc_program_append_2 (p, "copyb", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1, -1);
 
       result = orc_program_compile (p);
     }
@@ -240,7 +240,7 @@ orc_memset (void * d1, int p1, int n)
       orc_program_add_destination (p, 1, "d1");
       orc_program_add_parameter (p, 1, "p1");
 
-      orc_program_append (p, "copyb", ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1);
+      orc_program_append_2 (p, "copyb", 0, ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1, -1);
 
       result = orc_program_compile (p);
     }
index 8f9dc28..bfc0d3c 100644 (file)
@@ -494,6 +494,53 @@ orc_program_append (OrcProgram *program, const char *name, int arg0,
 }
 
 /**
+ * orc_program_append_ds_2:
+ * @program: a pointer to an OrcProgram structure
+ * @name: name of instruction
+ * @arg0: index of first variable
+ * @arg1: index of second variable
+ * @arg2: index of third variable
+ * @arg3: index of fourth variable
+ *
+ * Appends an instruction to the program, with arguments @arg0,
+ * @arg1, @arg2, and @arg3.
+ */
+void
+orc_program_append_2 (OrcProgram *program, const char *name, unsigned int flags,
+    int arg0, int arg1, int arg2, int arg3)
+{
+  OrcInstruction *insn;
+  int args[4];
+  int i;
+
+  insn = program->insns + program->n_insns;
+
+  insn->opcode = orc_opcode_find_by_name (name);
+  if (!insn->opcode) {
+    ORC_ERROR ("unknown opcode: %s", name);
+  }
+  insn->flags = flags;
+  args[0] = arg0;
+  args[1] = arg1;
+  args[2] = arg2;
+  args[3] = arg3;
+  insn->flags = flags;
+  i = 0;
+  insn->dest_args[0] = args[i++];
+  if (insn->opcode->dest_size[1] != 0) {
+    insn->dest_args[1] = args[i++];
+  }
+  if (insn->opcode->src_size[0] != 0) {
+    insn->src_args[0] = args[i++];
+  }
+  if (insn->opcode->src_size[1] != 0) {
+    insn->src_args[1] = args[i++];
+  }
+  
+  program->n_insns++;
+}
+
+/**
  * orc_program_find_var_by_name:
  * @program: a pointer to an OrcProgram structure
  * @name: name of instruction
index bb7a18c..b3862ff 100644 (file)
@@ -568,6 +568,8 @@ void orc_program_set_constant_n (OrcProgram *program, int n);
 void orc_program_set_constant_m (OrcProgram *program, int m);
 
 void orc_program_append (OrcProgram *p, const char *opcode, int arg0, int arg1, int arg2);
+void orc_program_append_2 (OrcProgram *program, const char *name,
+    unsigned int flags, int arg0, int arg1, int arg2, int arg3);
 void orc_program_append_str (OrcProgram *p, const char *opcode,
     const char * arg0, const char * arg1, const char * arg2);
 void orc_program_append_str_2 (OrcProgram *program, const char *name,
index e855523..1e115db 100644 (file)
@@ -659,14 +659,31 @@ output_code (OrcProgram *p, FILE *output)
 
   for(i=0;i<p->n_insns;i++){
     OrcInstruction *insn = p->insns + i;
-    if (p->vars[insn->src_args[1]].size != 0) {
-      fprintf(output, "      orc_program_append (p, \"%s\", %s, %s, %s);\n",
-          insn->opcode->name, enumnames[insn->dest_args[0]],
-          enumnames[insn->src_args[0]], enumnames[insn->src_args[1]]);
+
+    if (compat < ORC_VERSION(0,4,6,1)) {
+      if (insn->flags) {
+        REQUIRE(0,4,6,1);
+      }
+
+      if (p->vars[insn->src_args[1]].size != 0) {
+        fprintf(output, "      orc_program_append (p, \"%s\", %s, %s, %s);\n",
+            insn->opcode->name, enumnames[insn->dest_args[0]],
+            enumnames[insn->src_args[0]], enumnames[insn->src_args[1]]);
+      } else {
+        fprintf(output, "      orc_program_append_ds (p, \"%s\", %s, %s);\n",
+            insn->opcode->name, enumnames[insn->dest_args[0]],
+            enumnames[insn->src_args[0]]);
+      }
     } else {
-      fprintf(output, "      orc_program_append_ds (p, \"%s\", %s, %s);\n",
-          insn->opcode->name, enumnames[insn->dest_args[0]],
-          enumnames[insn->src_args[0]]);
+      if (p->vars[insn->src_args[1]].size != 0) {
+        fprintf(output, "      orc_program_append_2 (p, \"%s\", %d, %s, %s, %s, -1);\n",
+            insn->opcode->name, insn->flags, enumnames[insn->dest_args[0]],
+            enumnames[insn->src_args[0]], enumnames[insn->src_args[1]]);
+      } else {
+        fprintf(output, "      orc_program_append_2 (p, \"%s\", %d, %s, %s, -1, -1);\n",
+            insn->opcode->name, insn->flags, enumnames[insn->dest_args[0]],
+            enumnames[insn->src_args[0]]);
+      }
     }
   }