Pull various fixes from neon branch
authorDavid Schleef <ds@schleef.org>
Mon, 27 Apr 2009 03:52:59 +0000 (20:52 -0700)
committerDavid Schleef <ds@schleef.org>
Mon, 27 Apr 2009 03:52:59 +0000 (20:52 -0700)
examples/simple.c
orc-test/orctest.c
orc/orcexecutor.c
orc/orcprogram.h
testsuite/test-schro.c
testsuite/test4.c

index 2b5aa1a..b620e13 100644 (file)
@@ -36,7 +36,7 @@ main (int argc, char *argv[])
 {
   orc_init ();
 
-  test9();
+  test1();
 
   exit(0);
 }
@@ -67,7 +67,7 @@ test1(void)
       src2[i] = rand()&0xf;
     }
 
-    //orc_executor_run (ex);
+    orc_executor_run (ex);
     //orc_executor_emulate (ex);
 
     for(i=0;i<N;i++){
index 6ca905b..e6d3901 100644 (file)
@@ -1,5 +1,7 @@
 
 #include <orc-test/orctest.h>
+#include <orc/orc.h>
+#include <orc/orcdebug.h>
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -93,22 +95,22 @@ print_array_val (void *array, int size, int i)
   switch (size) {
     case 1:
       {
-        int8_t *a = array;
-        printf(" %4d", a[i]);
+        uint8_t *a = array;
+        printf(" %4u", a[i]);
         return a[i];
       }
       break;
     case 2:
       {
-        int16_t *a = array;
-        printf(" %5d", a[i]);
+        uint16_t *a = array;
+        printf(" %5u", a[i]);
         return a[i];
       }
       break;
     case 4:
       {
-        int32_t *a = array;
-        printf(" %10d", a[i]);
+        uint32_t *a = array;
+        printf(" %10u", a[i]);
         return a[i];
       }
       break;
@@ -117,6 +119,41 @@ print_array_val (void *array, int size, int i)
   }
 }
 
+int delign_index = 1;
+
+void *
+alloc_array (int n, int size, void **m_ptr)
+{
+  unsigned char *ptr = malloc (n*size+256*2);
+  memset (ptr, 0xa5, n*size+256*2);
+  if (m_ptr) *m_ptr = ptr;
+
+  delign_index++;
+  delign_index &= 0xf;
+
+  return (ptr + 256 + size*delign_index);
+}
+
+int
+check_bounds (void *ptr, int n, int size)
+{
+  unsigned char *data = ptr;
+  int i;
+
+  for(i=0;i<100;i++){
+    if (data[-1-i] != 0xa5) {
+      ORC_ERROR("early bounds failure at %d", i);
+      return FALSE;
+    }
+    if (data[n*size+i] != 0xa5) {
+      ORC_ERROR("late bounds failure at %d", i);
+      return FALSE;
+    }
+  }
+
+  return TRUE;
+}
+
 int
 orc_test_compare_output (OrcProgram *program)
 {
@@ -126,6 +163,8 @@ orc_test_compare_output (OrcProgram *program)
   int dest_index;
   void *dest_exec;
   void *dest_emul;
+  void *ptr_exec;
+  void *ptr_emul;
   int i;
 
   ret = orc_program_compile (program);
@@ -142,7 +181,7 @@ orc_test_compare_output (OrcProgram *program)
 
     if (program->vars[i].vartype == ORC_VAR_TYPE_SRC) {
       uint8_t *data;
-      data = malloc(n*program->vars[i].size);
+      data = alloc_array (n,program->vars[i].size, NULL);
       orc_test_random_bits (data, n*program->vars[i].size);
       orc_executor_set_array (ex, i, data);
     } else if (program->vars[i].vartype == ORC_VAR_TYPE_DEST) {
@@ -155,10 +194,8 @@ orc_test_compare_output (OrcProgram *program)
     return FALSE;
   }
 
-  dest_exec = malloc(n*program->vars[dest_index].size);
-  memset (dest_exec, 0xa5, n*program->vars[dest_index].size);
-  dest_emul = malloc(n*program->vars[dest_index].size);
-  memset (dest_emul, 0xa5, n*program->vars[dest_index].size);
+  dest_exec = alloc_array (n, program->vars[dest_index].size, &ptr_exec);
+  dest_emul = alloc_array (n, program->vars[dest_index].size, &ptr_emul);
 
   orc_executor_set_array (ex, dest_index, dest_exec);
   orc_executor_run (ex);
@@ -191,45 +228,19 @@ orc_test_compare_output (OrcProgram *program)
 
       printf("\n");
     }
-#if 0
-    switch (program->vars[dest_index].size) {
-      case 1:
-        {
-          uint8_t *a = dest_emul;
-          uint8_t *b = dest_exec;
-          for(i=0;i<n;i++){
-            printf("%d: %d %d %c\n", i, a[i], b[i], (a[i]==b[i])?' ':'*');
-          }
-        }
-        break;
-      case 2:
-        {
-          uint16_t *a = dest_emul;
-          uint16_t *b = dest_exec;
-          for(i=0;i<n;i++){
-            printf("%d: %d %d %c\n", i, a[i], b[i], (a[i]==b[i])?' ':'*');
-          }
-        }
-        break;
-      case 4:
-        {
-          uint32_t *a = dest_emul;
-          uint32_t *b = dest_exec;
-          for(i=0;i<n;i++){
-            printf("%d: %d %d %c\n", i, a[i], b[i], (a[i]==b[i])?' ':'*');
-          }
-        }
-        break;
-      default:
-        return FALSE;
-    }
-#endif
 
     printf("%s", orc_program_get_asm_code (program));
 
     return FALSE;
   }
+  if (!check_bounds (dest_exec, n, program->vars[dest_index].size)) {
+    printf("out of bounds failure\n");
+
+    return FALSE;
+  }
 
+  free (ptr_exec);
+  free (ptr_emul);
   orc_executor_free (ex);
 
   return TRUE;
index 668d3a4..8c643c3 100644 (file)
@@ -36,12 +36,19 @@ orc_executor_run (OrcExecutor *ex)
   func = ex->program->code_exec;
   if (func) {
     func (ex);
+    //ORC_ERROR("counters %d %d %d", ex->counter1, ex->counter2, ex->counter3);
   } else {
     orc_executor_emulate (ex);
   }
 }
 
 void
+orc_executor_set_program (OrcExecutor *ex, OrcProgram *program)
+{
+  ex->program = program;
+}
+
+void
 orc_executor_set_array (OrcExecutor *ex, int var, void *ptr)
 {
   ex->arrays[var] = ptr;
@@ -56,7 +63,7 @@ orc_executor_set_array_str (OrcExecutor *ex, const char *name, void *ptr)
 }
 
 void
-orc_executor_set_parameter (OrcExecutor *ex, int var, int value)
+orc_executor_set_param (OrcExecutor *ex, int var, int value)
 {
   ex->params[var] = value;
 }
index 6c51d4d..e932ac8 100644 (file)
@@ -325,9 +325,10 @@ void orc_program_powerpc_reset_alloc (OrcProgram *program);
 
 OrcExecutor * orc_executor_new (OrcProgram *program);
 void orc_executor_free (OrcExecutor *ex);
+void orc_executor_set_program (OrcExecutor *ex, OrcProgram *program);
 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_parameter (OrcExecutor *ex, int var, int value);
+void orc_executor_set_param (OrcExecutor *ex, int var, int value);
 void orc_executor_set_param_str (OrcExecutor *ex, const char *name, int value);
 int orc_executor_get_accumulator (OrcExecutor *ex, int var, int value);
 int orc_executor_get_accumulator_str (OrcExecutor *ex, const char *name, int value);
index a8d4bc1..e63afb1 100644 (file)
@@ -26,86 +26,56 @@ get_program (int type)
     d1 = orc_program_add_destination (p, 2, "d1");
     orc_program_add_source (p, 2, "s1");
     orc_program_add_source (p, 2, "s2");
-    orc_program_add_source (p, 2, "s3");
     orc_program_add_constant (p, 2, 2, "c1");
     orc_program_add_constant (p, 2, 2, "c2");
     orc_program_add_temporary (p, 2, "t1");
 
-    orc_program_append_str (p, "addw", "t1", "s2", "s3");
+    orc_program_append_str (p, "addw", "t1", "s1", "s2");
     orc_program_append_str (p, "addw", "t1", "t1", "c1");
     orc_program_append_str (p, "shrsw", "t1", "t1", "c2");
-    orc_program_append_str (p, "addw", "d1", "s1", "t1");
+    orc_program_append_str (p, "addw", "d1", "d1", "t1");
     break;
   case 1:
     p = orc_program_new ();
     d1 = orc_program_add_destination (p, 2, "d1");
     orc_program_add_source (p, 2, "s1");
     orc_program_add_source (p, 2, "s2");
-    orc_program_add_source (p, 2, "s3");
     orc_program_add_constant (p, 2, 2, "c1");
     orc_program_add_constant (p, 2, 2, "c2");
     orc_program_add_temporary (p, 2, "t1");
 
-    orc_program_append_str (p, "addw", "t1", "s2", "s3");
+    orc_program_append_str (p, "addw", "t1", "s1", "s2");
     orc_program_append_str (p, "addw", "t1", "t1", "c1");
     orc_program_append_str (p, "shrsw", "t1", "t1", "c2");
-    orc_program_append_str (p, "subw", "d1", "s1", "t1");
+    orc_program_append_str (p, "subw", "d1", "d1", "t1");
     break;
   case 2:
     p = orc_program_new ();
     orc_program_add_destination (p, 2, "d1");
     orc_program_add_source (p, 2, "s1");
     orc_program_add_source (p, 2, "s2");
-    orc_program_add_source (p, 2, "s3");
-#if 1
     orc_program_add_constant (p, 2, 1, "c1");
     orc_program_add_constant (p, 2, 1, "c2");
-#else
-    orc_program_add_constant (p, 2, 0x8000, "c1");
-#endif
     orc_program_add_temporary (p, 2, "t1");
-    orc_program_add_temporary (p, 2, "t2");
-    orc_program_add_temporary (p, 2, "t3");
 
-#if 1
-    orc_program_append_str (p, "addw", "t1", "s2", "s3");
+    orc_program_append_str (p, "addw", "t1", "s1", "s2");
     orc_program_append_str (p, "addw", "t1", "t1", "c1");
     orc_program_append_str (p, "shrsw", "t1", "t1", "c2");
-#else
-    orc_program_append_str (p, "xorw", "t1", "c1", "s2");
-    orc_program_append_str (p, "xorw", "t2", "c1", "s3");
-    orc_program_append_str (p, "avguw", "t3", "t1", "t2");
-    orc_program_append_str (p, "xorw", "t1", "c1", "t3");
-#endif
-    orc_program_append_str (p, "addw", "d1", "s1", "t1");
+    orc_program_append_str (p, "addw", "d1", "d1", "t1");
     break;
   case 3:
     p = orc_program_new ();
     orc_program_add_destination (p, 2, "d1");
     orc_program_add_source (p, 2, "s1");
     orc_program_add_source (p, 2, "s2");
-    orc_program_add_source (p, 2, "s3");
-#if 1
     orc_program_add_constant (p, 2, 1, "c1");
     orc_program_add_constant (p, 2, 1, "c2");
-#else
-    orc_program_add_constant (p, 2, 0x8000, "c1");
-#endif
     orc_program_add_temporary (p, 2, "t1");
-    orc_program_add_temporary (p, 2, "t2");
-    orc_program_add_temporary (p, 2, "t3");
 
-#if 1
-    orc_program_append_str (p, "addw", "t1", "s2", "s3");
+    orc_program_append_str (p, "addw", "t1", "s1", "s2");
     orc_program_append_str (p, "addw", "t1", "t1", "c1");
     orc_program_append_str (p, "shrsw", "t1", "t1", "c2");
-#else
-    orc_program_append_str (p, "xorw", "t1", "c1", "s2");
-    orc_program_append_str (p, "xorw", "t2", "c1", "s3");
-    orc_program_append_str (p, "avguw", "t3", "t1", "t2");
-    orc_program_append_str (p, "xorw", "t1", "c1", "t3");
-#endif
-    orc_program_append_str (p, "subw", "d1", "s1", "t1");
+    orc_program_append_str (p, "subw", "d1", "d1", "t1");
     break;
   case 4:
     p = orc_program_new_dss (2,2,2);
@@ -134,24 +104,22 @@ get_program (int type)
     break;
   case 8:
     p = orc_program_new_dss (2,2,2);
-    orc_program_add_source (p, 2, "s3");
-    orc_program_add_temporary (p, 4, "t1");
-    orc_program_add_temporary (p, 2, "t2");
+    orc_program_add_temporary (p, 2, "t1");
+    orc_program_add_temporary (p, 4, "t2");
     orc_program_add_parameter (p, 2, "p1");
     orc_program_add_parameter (p, 4, "p2");
-    orc_program_add_parameter (p, 2, "p3");
-
-    orc_program_append_str (p, "addw", "t1", "s2", "s3");
-    orc_program_append_str (p, "mulswl", "t1", "t1", "p1");
-    orc_program_append_str (p, "addl", "t1", "t1", "p2");
-    orc_program_append_str (p, "shll", "t1", "s1", "p3");
-    orc_program_append_ds_str (p, "convlw", "t2", "t1");
-    orc_program_append_str (p, "addl", "d1", "t2", "s1");
+    orc_program_add_parameter (p, 4, "p3");
+
+    orc_program_append_str (p, "addw", "t1", "s1", "s2");
+    orc_program_append_str (p, "mulswl", "t2", "t1", "p1");
+    orc_program_append_str (p, "addl", "t2", "t2", "p2");
+    orc_program_append_str (p, "shll", "t2", "t2", "p3");
+    orc_program_append_ds_str (p, "convlw", "t1", "t2");
+    orc_program_append_str (p, "addw", "d1", "d1", "t1");
     break;
   case 9:
     p = orc_program_new ();
     orc_program_add_destination (p, 2, "d1");
-    orc_program_add_source (p, 2, "s1");
     orc_program_add_source (p, 2, "s20");
     orc_program_add_source (p, 2, "s21");
     orc_program_add_source (p, 2, "s22");
@@ -168,12 +136,11 @@ get_program (int type)
     orc_program_append_str (p, "subw", "t1", "t1", "t2");
     orc_program_append_str (p, "addw", "t1", "t1", "p1");
     orc_program_append_str (p, "shrsw", "t1", "t1", "p2");
-    orc_program_append_str (p, "addw", "d1", "s1", "t1");
+    orc_program_append_str (p, "addw", "d1", "d1", "t1");
     break;
   case 10:
     p = orc_program_new ();
     orc_program_add_destination (p, 2, "d1");
-    orc_program_add_source (p, 2, "s1");
     orc_program_add_source (p, 2, "s20");
     orc_program_add_source (p, 2, "s21");
     orc_program_add_source (p, 2, "s22");
@@ -190,7 +157,7 @@ get_program (int type)
     orc_program_append_str (p, "subw", "t1", "t1", "t2");
     orc_program_append_str (p, "addw", "t1", "t1", "p1");
     orc_program_append_str (p, "shrsw", "t1", "t1", "p2");
-    orc_program_append_str (p, "subw", "d1", "s1", "t1");
+    orc_program_append_str (p, "subw", "d1", "d1", "t1");
     break;
   case 11:
     p = orc_program_new_dss (2,2,2);
@@ -330,6 +297,7 @@ main (int argc, char *argv[])
   int i;
 
   orc_init();
+  orc_test_init();
 
   for(i=0;i<18;i++){
     printf("/* %d */\n", i);
index 3df4273..3edd754 100644 (file)
@@ -41,15 +41,19 @@ test_opcode (OrcStaticOpcode *opcode)
   char s[40];
   int ret;
 
-  p = orc_program_new_dss (opcode->dest_size[0],
-        opcode->src_size[0], opcode->src_size[1]);
+  if (opcode->src_size[1] == 0) {
+    p = orc_program_new_ds (opcode->dest_size[0], opcode->src_size[0]);
+  } else {
+    p = orc_program_new_dss (opcode->dest_size[0], opcode->src_size[0],
+        opcode->src_size[1]);
+  }
 
   sprintf(s, "test_%s", opcode->name);
   orc_program_set_name (p, s);
 
   orc_program_append_str (p, opcode->name, "d1", "s1", "s2");
 
-  ret = orc_program_compile_for_target (p, orc_target_get_by_name("arm"));
+  ret = orc_program_compile_for_target (p, orc_target_get_by_name("neon"));
   if (!ret) {
     error = TRUE;
     goto out;