[Liboil-commit] examples/orc orc/orcexecutor.c orc/orcprogram-powerpc.c orc/orcprogram-x86.c orc/orcprogram.c orc/orcprogram.h

David Schleef ds at kemper.freedesktop.org
Wed May 21 18:36:48 PDT 2008


 examples/orc/simple.c    |   76 ++++++++++++++++++++++++++++++++++++++++++++---
 orc/orcexecutor.c        |   19 ++++++-----
 orc/orcprogram-powerpc.c |    3 +
 orc/orcprogram-x86.c     |    2 -
 orc/orcprogram.c         |   10 +++---
 orc/orcprogram.h         |   22 ++++++++-----
 6 files changed, 104 insertions(+), 28 deletions(-)

New commits:
commit 4501aa11a1b6a8c0f8921ffbba7bc070917795f4
Author: David Schleef <ds at ginger.bigkitten.com>
Date:   Wed May 21 18:36:23 2008 -0700

    [orc] Add more complicated example.  Fix valgrind problems.

diff --git a/examples/orc/simple.c b/examples/orc/simple.c
index 4d80282..4cc1e84 100644
--- a/examples/orc/simple.c
+++ b/examples/orc/simple.c
@@ -8,20 +8,24 @@
 
 #include <orc/orcprogram.h>
 
-#define N 10
+#define N 20
 
-int16_t src1[N];
+int16_t src1[N+4];
 int16_t src2[N];
+int16_t dest_test[N];
+int16_t dest_ref[N];
 int16_t dest[N];
 
 void test1(void);
+void test2(void);
 
 int
 main (int argc, char *argv[])
 {
   orc_init ();
 
-  test1();
+  test2();
+
   exit(0);
 }
 
@@ -33,7 +37,6 @@ test1(void)
   OrcExecutor *ex;
   int s1, s2, d1;
 
-
   p = orc_program_new ();
 
   d1 = orc_program_add_destination (p, "s16", "d1");
@@ -72,3 +75,68 @@ test1(void)
 }
 
 
+void
+test2(void)
+{
+  OrcProgram *p;
+  OrcExecutor *ex;
+  int s1, s2, s3, s4, d1;
+  int t1, t2;
+  int c1, c2, c3;
+
+  p = orc_program_new ();
+
+  d1 = orc_program_add_destination (p, "s16", "d1");
+  s1 = orc_program_add_source (p, "s16", "s1");
+  s2 = orc_program_add_source (p, "s16", "s2");
+  s3 = orc_program_add_source (p, "s16", "s3");
+  s4 = orc_program_add_source (p, "s16", "s4");
+  c1 = orc_program_add_constant (p, "s16", 3, "c1");
+  c2 = orc_program_add_constant (p, "s16", 4, "c2");
+  c3 = orc_program_add_constant (p, "s16", 3, "c3");
+  t1 = orc_program_add_temporary (p, "s16", "t1");
+  t2 = orc_program_add_temporary (p, "s16", "t2");
+
+  orc_program_append (p, "add_s16", t1, s2, s3);
+  orc_program_append (p, "add_s16", t2, s1, s4);
+  orc_program_append (p, "mul_s16", t1, t1, c1);
+  orc_program_append (p, "sub_s16", t1, t1, t2);
+  orc_program_append (p, "add_s16", t1, t1, c2);
+  orc_program_append (p, "rshift_s16", d1, t1, c3);
+
+  orc_program_compile (p);
+
+  ex = orc_executor_new (p);
+  orc_executor_set_n (ex, N);
+  orc_executor_set_array (ex, s1, src1);
+  orc_executor_set_array (ex, s2, src1 + 1);
+  orc_executor_set_array (ex, s3, src1 + 2);
+  orc_executor_set_array (ex, s4, src1 + 3);
+
+  if (1) {
+    int i;
+
+    for(i=0;i<N+3;i++){
+      src1[i] = rand()&0xff;
+    }
+
+    orc_executor_set_array (ex, d1, dest_ref);
+    orc_executor_emulate (ex);
+    for(i=0;i<N;i++){
+      dest_ref[i] = (3*(src1[i+1]+src1[i+2])-(src1[i]+src1[i+3])+4)>>3;
+    }
+    
+    orc_executor_set_array (ex, d1, dest_test);
+    orc_executor_run (ex);
+
+    for(i=0;i<N;i++){
+      printf("#  %4d %4d %4d %c\n", src1[i], dest_ref[i], dest_test[i],
+          (dest_ref[i] == dest_test[i])?' ':'*');
+    }
+  }
+
+  orc_executor_free (ex);
+  orc_program_free (p);
+}
+
+
diff --git a/orc/orcexecutor.c b/orc/orcexecutor.c
index 306c929..7395ed4 100644
--- a/orc/orcexecutor.c
+++ b/orc/orcexecutor.c
@@ -61,40 +61,41 @@ orc_executor_emulate (OrcExecutor *ex)
   OrcInstruction *insn;
   OrcOpcode *opcode;
 
-  printf("n %d\n", ex->n);
-  printf("n_insns %d\n", program->n_insns);
+  //printf("n %d\n", ex->n);
+  //printf("n_insns %d\n", program->n_insns);
 
   for(i=0;i<ex->n;i++){
+    printf("%d\n", i);
     for(j=0;j<program->n_insns;j++){
       insn = program->insns + j;
       opcode = insn->opcode;
 
-      printf("%d: %s\n", j, insn->opcode->name);
+      //printf("%d: %s\n", j, insn->opcode->name);
 
       /* set up args */
       for(k=0;k<opcode->n_src + opcode->n_dest;k++){
         ex->args[k] = ex->vars + insn->args[k];
 
-        printf("setting up arg %d as var %d vartype %d\n",
-            k, insn->args[k], ex->args[k]->vartype);
+        //printf("setting up arg %d as var %d vartype %d\n",
+        //    k, insn->args[k], ex->args[k]->vartype);
 
         if (ex->args[k]->vartype == ORC_VAR_TYPE_SRC) {
           void *ptr = ex->arrays[insn->args[k]] + 2*i;
 
-          printf("load %p\n", ptr);
+          //printf("load %p\n", ptr);
           ex->args[k]->s16 = *(int16_t *)ptr;
         }
       }
 
       opcode->emulate (ex, opcode->emulate_user);
-      printf("emulate: %d %d %d\n", ex->args[0]->s16,
-          ex->args[1]->s16, ex->args[2]->s16);
+      //printf("emulate: %d %d %d\n", ex->args[0]->s16,
+      //    ex->args[1]->s16, ex->args[2]->s16);
 
       for(k=0;k<opcode->n_src + opcode->n_dest;k++){
         if (ex->args[k]->vartype == ORC_VAR_TYPE_DEST) {
           void *ptr = ex->arrays[insn->args[k]] + 2*i;
 
-          printf("store %p\n", ptr);
+          //printf("store %p\n", ptr);
           *(int16_t *)ptr = ex->args[k]->s16;
         }
       }
diff --git a/orc/orcprogram-powerpc.c b/orc/orcprogram-powerpc.c
index 776870a..9ed4683 100644
--- a/orc/orcprogram-powerpc.c
+++ b/orc/orcprogram-powerpc.c
@@ -324,6 +324,7 @@ powerpc_do_fixups (OrcProgram *program)
 void
 powerpc_flush (OrcProgram *program)
 {
+#ifdef HAVE_POWERPC
   unsigned char *ptr;
   int cache_line_size = 32;
   int i;
@@ -340,7 +341,7 @@ powerpc_flush (OrcProgram *program)
     __asm__ __volatile__ ("icbi %0,%1" :: "r" (ptr), "r" (i));
   }
   __asm__ __volatile ("isync");
-
+#endif
 }
 
 void
diff --git a/orc/orcprogram-x86.c b/orc/orcprogram-x86.c
index 273d07a..a0829a0 100644
--- a/orc/orcprogram-x86.c
+++ b/orc/orcprogram-x86.c
@@ -219,7 +219,7 @@ orc_x86_init (void)
 }
 
 void
-orc_program_reset_alloc (OrcProgram *program)
+orc_program_x86_reset_alloc (OrcProgram *program)
 {
   int i;
 
diff --git a/orc/orcprogram.c b/orc/orcprogram.c
index 2c46264..da31111 100644
--- a/orc/orcprogram.c
+++ b/orc/orcprogram.c
@@ -22,7 +22,7 @@ orc_program_new (void)
   p = malloc(sizeof(OrcProgram));
   memset (p, 0, sizeof(OrcProgram));
 
-  p->rule_set = ORC_RULE_ALTIVEC_1;
+  p->rule_set = ORC_RULE_MMX_1;
   p->n_per_loop = 1;
   p->loop_shift = 0;
 
@@ -148,8 +148,8 @@ orc_program_compile (OrcProgram *program)
   orc_program_assign_rules (program);
   orc_program_rewrite_vars (program);
 
-  //orc_program_x86_reset_alloc (program);
-  orc_program_powerpc_reset_alloc (program);
+  orc_program_x86_reset_alloc (program);
+  //orc_program_powerpc_reset_alloc (program);
   orc_program_global_reg_alloc (program);
 
   orc_program_do_regs (program);
@@ -157,8 +157,8 @@ orc_program_compile (OrcProgram *program)
   orc_program_rewrite_vars2 (program);
 
   orc_program_allocate_codemem (program);
-  //orc_program_assemble_x86 (program);
-  orc_program_assemble_powerpc (program);
+  orc_program_assemble_x86 (program);
+  //orc_program_assemble_powerpc (program);
   //orc_program_assemble_c (program);
 
   orc_program_dump_code (program);
diff --git a/orc/orcprogram.h b/orc/orcprogram.h
index fa97981..b2d2d83 100644
--- a/orc/orcprogram.h
+++ b/orc/orcprogram.h
@@ -19,6 +19,11 @@ typedef void (*OrcOpcodeEmulateFunc)(OrcExecutor *ex, void *user);
 typedef void (*OrcRuleEmitFunc)(OrcProgram *p, void *user, OrcInstruction *insn);
 
 #define ORC_N_REGS 100
+#define ORC_N_INSNS 100
+#define ORC_N_VARIABLES 100
+#define ORC_N_REGISTERS 100
+#define ORC_N_FIXUPS 100
+#define ORC_N_LABELS 100
 
 #define ORC_OPCODE_N_ARGS 4
 #define ORC_OPCODE_N_RULES 8
@@ -121,17 +126,18 @@ struct _OrcRegister {
   int merge;
 };
 
+
 struct _OrcProgram {
-  OrcInstruction insns[100];
+  OrcInstruction insns[ORC_N_INSNS];
   int n_insns;
 
-  OrcVariable vars[100];
+  OrcVariable vars[ORC_N_VARIABLES];
   int n_vars;
 
   OrcInstruction *insn;
   int rule_set;
 
-  OrcRegister registers[100];
+  OrcRegister registers[ORC_N_REGISTERS];
   int n_regs;
 
   unsigned char *code;
@@ -139,9 +145,9 @@ struct _OrcProgram {
   unsigned char *codeptr;
   int code_size;
   
-  OrcFixup fixups[100];
+  OrcFixup fixups[ORC_N_FIXUPS];
   int n_fixups;
-  unsigned char *labels[100];
+  unsigned char *labels[ORC_N_LABELS];
 
   int error;
 
@@ -157,10 +163,10 @@ struct _OrcExecutor {
   int n;
   int counter;
 
-  void *arrays[10];
+  void *arrays[ORC_N_VARIABLES];
 
-  OrcVariable vars[10];
-  OrcVariable *args[4];
+  OrcVariable vars[ORC_N_VARIABLES];
+  OrcVariable *args[ORC_OPCODE_N_ARGS];
 
 };
 


More information about the Liboil-commit mailing list