neon: test
authorDavid Schleef <ds@schleef.org>
Fri, 26 Jun 2009 18:15:58 +0000 (11:15 -0700)
committerDavid Schleef <ds@schleef.org>
Fri, 26 Jun 2009 18:15:58 +0000 (11:15 -0700)
orc/orcprogram-neon.c
orc/orcprogram.c
orc/orcprogram.h

index 34c6a90..aeb4843 100644 (file)
@@ -188,6 +188,31 @@ orc_compiler_neon_init (OrcCompiler *compiler)
     compiler->loop_shift = loop_shift;
   }
 
+  switch (orc_program_get_max_accumulator_size (compiler->program)) {
+    case 0:
+      loop_shift = 4;
+      break;
+    case 1:
+      loop_shift = 3;
+      break;
+    case 2:
+      loop_shift = 2;
+      break;
+    case 4:
+      loop_shift = 1;
+      break;
+    case 8:
+      loop_shift = 0;
+      break;
+    default:
+      ORC_ERROR("unhandled max var size %d",
+          orc_program_get_max_var_size (compiler->program));
+      break;
+  }
+  if (loop_shift < compiler->loop_shift) {
+    compiler->loop_shift = loop_shift;
+  }
+
   compiler->need_mask_regs = TRUE;
 }
 
index a469903..f109c0e 100644 (file)
@@ -561,3 +561,29 @@ orc_program_get_max_array_size (OrcProgram *program)
   return max;
 }
 
+/**
+ * orc_program_get_max_accumulator_size:
+ * @program: a pointer to an OrcProgram structure
+ *
+ * Returns the size of the largest array used in the program.
+ * 
+ * Returns: the number of bytes
+ */
+int
+orc_program_get_max_accumulator_size (OrcProgram *program)
+{
+  int i;
+  int max;
+
+  max = 0;
+  for(i=0;i<ORC_N_VARIABLES;i++){
+    if (program->vars[i].size) {
+      if (program->vars[i].vartype == ORC_VAR_TYPE_ACCUMULATOR) {
+        max = MAX(max, program->vars[i].size);
+      }
+    }
+  }
+
+  return max;
+}
+
index b395e64..5932f5d 100644 (file)
@@ -496,6 +496,7 @@ void orc_target_register (OrcTarget *target);
 OrcTarget *orc_target_get_by_name (const char *target_name);
 int orc_program_get_max_var_size (OrcProgram *program);
 int orc_program_get_max_array_size (OrcProgram *program);
+int orc_program_get_max_accumulator_size (OrcProgram *program);
 
 #endif