Fix up c64x-c backend
authorDavid Schleef <ds@schleef.org>
Sat, 24 Sep 2011 23:00:25 +0000 (16:00 -0700)
committerDavid Schleef <ds@schleef.org>
Sat, 24 Sep 2011 23:00:25 +0000 (16:00 -0700)
orc-test/orctest.c
orc/orcprogram-c64x-c.c
testsuite/Makefile.am
testsuite/compile_opcodes_sys_c64x.c [new file with mode: 0644]

index a847765..b82ce5a 100644 (file)
@@ -289,13 +289,13 @@ orc_test_gcc_compile_c64x (OrcProgram *p)
 
   base = "temp-orc-test";
 
-  sprintf(source_filename, "%s-source.s", base);
+  sprintf(source_filename, "%s-source.c", base);
   sprintf(obj_filename, "%s-source.obj", base);
   sprintf(dis_filename, "%s-source.dis", base);
   sprintf(dump_filename, "%s-dump.bin", base);
   sprintf(dump_dis_filename, "%s-dump.dis", base);
 
-  target = orc_target_get_by_name ("c64x");
+  target = orc_target_get_by_name ("c64x-c");
   flags = orc_target_get_default_flags (target);
 
   result = orc_program_compile_full (p, target, flags);
@@ -307,6 +307,7 @@ orc_test_gcc_compile_c64x (OrcProgram *p)
   fflush (stdout);
 
   file = fopen (source_filename, "w");
+  fprintf(file, "%s", orc_target_get_preamble (target));
   fprintf(file, "%s", orc_program_get_asm_code (p));
   fclose (file);
 
index de66a18..8361fee 100644 (file)
@@ -285,10 +285,10 @@ orc_compiler_c64x_c_assemble (OrcCompiler *compiler)
         ORC_ASM_CODE(compiler,"  int var%d;\n", i);
         break;
       case ORC_VAR_TYPE_SRC:
-        ORC_ASM_CODE(compiler,"  const unsigned char * restrict var%d;\n", i);
+        ORC_ASM_CODE(compiler,"  const unsigned char * restrict ptr%d;\n", i);
         break;
       case ORC_VAR_TYPE_DEST:
-        ORC_ASM_CODE(compiler,"  unsigned char * restrict var%d;\n", i);
+        ORC_ASM_CODE(compiler,"  unsigned char * restrict ptr%d;\n", i);
         break;
       case ORC_VAR_TYPE_ACCUMULATOR:
         ORC_ASM_CODE(compiler,"  int var%d = 0;\n", i);
@@ -335,19 +335,19 @@ orc_compiler_c64x_c_assemble (OrcCompiler *compiler)
       switch (var->vartype) {
         case ORC_VAR_TYPE_SRC:
           if (!(compiler->target_flags & ORC_TARGET_C_NOEXEC)) {
-            ORC_ASM_CODE(compiler,"    var%d = ORC_PTR_OFFSET(ex->arrays[%d], ex->params[%d] * j);\n",
+            ORC_ASM_CODE(compiler,"    ptr%d = ORC_PTR_OFFSET(ex->arrays[%d], ex->params[%d] * j);\n",
                 i, i, i);
           } else {
-            ORC_ASM_CODE(compiler,"    var%d = ORC_PTR_OFFSET(%s, %s_stride * j);\n",
+            ORC_ASM_CODE(compiler,"    ptr%d = ORC_PTR_OFFSET(%s, %s_stride * j);\n",
                 i, varnames[i], varnames[i]);
           }
           break;
         case ORC_VAR_TYPE_DEST:
           if (!(compiler->target_flags & ORC_TARGET_C_NOEXEC)) {
-            ORC_ASM_CODE(compiler,"    var%d = ORC_PTR_OFFSET(ex->arrays[%d], ex->params[%d] * j);\n",
+            ORC_ASM_CODE(compiler,"    ptr%d = ORC_PTR_OFFSET(ex->arrays[%d], ex->params[%d] * j);\n",
                 i, i, i);
           } else {
-            ORC_ASM_CODE(compiler,"    var%d = ORC_PTR_OFFSET(%s, %s_stride * j);\n",
+            ORC_ASM_CODE(compiler,"    ptr%d = ORC_PTR_OFFSET(%s, %s_stride * j);\n",
                 i, varnames[i], varnames[i]);
           }
           break;
@@ -362,16 +362,16 @@ orc_compiler_c64x_c_assemble (OrcCompiler *compiler)
       switch (var->vartype) {
         case ORC_VAR_TYPE_SRC:
           if (!(compiler->target_flags & ORC_TARGET_C_NOEXEC)) {
-            ORC_ASM_CODE(compiler,"  var%d = ex->arrays[%d];\n", i, i);
+            ORC_ASM_CODE(compiler,"  ptr%d = ex->arrays[%d];\n", i, i);
           } else {
-            ORC_ASM_CODE(compiler,"  var%d = (void *)%s;\n", i, varnames[i]);
+            ORC_ASM_CODE(compiler,"  ptr%d = (void *)%s;\n", i, varnames[i]);
           }
           break;
         case ORC_VAR_TYPE_DEST:
           if (!(compiler->target_flags & ORC_TARGET_C_NOEXEC)) {
-            ORC_ASM_CODE(compiler,"  var%d = ex->arrays[%d];\n", i, i);
+            ORC_ASM_CODE(compiler,"  ptr%d = ex->arrays[%d];\n", i, i);
           } else {
-            ORC_ASM_CODE(compiler,"  var%d = (void *)%s;\n", i, varnames[i]);
+            ORC_ASM_CODE(compiler,"  ptr%d = (void *)%s;\n", i, varnames[i]);
           }
           break;
         default:
@@ -386,7 +386,7 @@ orc_compiler_c64x_c_assemble (OrcCompiler *compiler)
     }
   }
   if (loop_shift > 0) {
-    ORC_ASM_CODE(compiler,"%*s  n1 = ((4 - (int)var%d)&0x3) >> %d;\n",
+    ORC_ASM_CODE(compiler,"%*s  n1 = ((4 - (int)ptr%d)&0x3) >> %d;\n",
         prefix, "", align_var, get_shift(compiler->vars[align_var].size));
     ORC_ASM_CODE(compiler,"%*s  n2 = (n - n1) >> %d;\n",
         prefix, "", loop_shift);
@@ -491,7 +491,7 @@ emit_loop (OrcCompiler *compiler, int prefix)
     switch (var->vartype) {
       case ORC_VAR_TYPE_SRC:
       case ORC_VAR_TYPE_DEST:
-        ORC_ASM_CODE(compiler,"%*s    var%d += %d;\n", prefix, "",
+        ORC_ASM_CODE(compiler,"%*s    ptr%d += %d;\n", prefix, "",
             i, var->size << compiler->loop_shift);
         break;
       default:
@@ -941,7 +941,22 @@ c_rule_accsadubl (OrcCompiler *p, void *user, OrcInstruction *insn)
       dest, dest, src1, src2);
 }
 
-static OrcTarget c_target = {
+static void
+c_rule_loadX (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+  ORC_ASM_CODE(p,"    var%d = ptr%d[i];\n", insn->dest_args[0],
+      insn->src_args[0]);
+}
+
+static void
+c_rule_storeX (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+  ORC_ASM_CODE(p,"    ptr%d[i] = var%d;\n", insn->dest_args[0],
+      insn->src_args[0]);
+}
+
+
+static OrcTarget c64x_c_target = {
   "c64x-c",
   FALSE,
   ORC_GP_REG_BASE,
@@ -959,12 +974,22 @@ orc_c64x_c_init (void)
 {
   OrcRuleSet *rule_set;
 
-  orc_target_register (&c_target);
+  orc_target_register (&c64x_c_target);
 
-  rule_set = orc_rule_set_new (orc_opcode_set_get("sys"), &c_target, 0);
+  rule_set = orc_rule_set_new (orc_opcode_set_get("sys"), &c64x_c_target, 0);
 
 #define REG(a) orc_rule_register (rule_set, #a , c_rule_ ## a, NULL);
 
+  orc_rule_register (rule_set, "loadb", c_rule_loadX, NULL);
+  orc_rule_register (rule_set, "loadw", c_rule_loadX, NULL);
+  orc_rule_register (rule_set, "loadl", c_rule_loadX, NULL);
+  orc_rule_register (rule_set, "loadq", c_rule_loadX, NULL);
+
+  orc_rule_register (rule_set, "storeb", c_rule_storeX, NULL);
+  orc_rule_register (rule_set, "storew", c_rule_storeX, NULL);
+  orc_rule_register (rule_set, "storel", c_rule_storeX, NULL);
+  orc_rule_register (rule_set, "storeq", c_rule_storeX, NULL);
+
   REG(absb);
   REG(addb);
   REG(addssb);
index 2e0044b..fdae171 100644 (file)
@@ -32,6 +32,10 @@ noinst_PROGRAMS += compile_opcodes_sys_neon \
        compile_parse_neon
 endif
 
+if ENABLE_BACKEND_C64X
+noinst_PROGRAMS += compile_opcodes_sys_c64x
+endif
+
 AM_CFLAGS = $(ORC_CFLAGS)
 LIBS = $(ORC_LIBS) $(top_builddir)/orc-test/liborc-test-@ORC_MAJORMINOR@.la
 
diff --git a/testsuite/compile_opcodes_sys_c64x.c b/testsuite/compile_opcodes_sys_c64x.c
new file mode 100644 (file)
index 0000000..0e64a52
--- /dev/null
@@ -0,0 +1,114 @@
+
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <orc/orc.h>
+#include <orc-test/orctest.h>
+
+
+int error = FALSE;
+
+void test_opcode (OrcStaticOpcode *opcode);
+void test_opcode_const (OrcStaticOpcode *opcode);
+void test_opcode_param (OrcStaticOpcode *opcode);
+
+int
+main (int argc, char *argv[])
+{
+  int i;
+  OrcOpcodeSet *opcode_set;
+
+  orc_init();
+  orc_test_init();
+
+  opcode_set = orc_opcode_set_get ("sys");
+
+  for(i=0;i<opcode_set->n_opcodes;i++){
+    printf("/* %s %d,%d,%d */\n",
+        opcode_set->opcodes[i].name,
+        opcode_set->opcodes[i].dest_size[0],
+        opcode_set->opcodes[i].src_size[0],
+        opcode_set->opcodes[i].src_size[1]);
+    test_opcode (opcode_set->opcodes + i);
+    exit (0);
+  }
+  for(i=0;i<opcode_set->n_opcodes;i++){
+    printf("/* %s const %d,%d,%d */\n",
+        opcode_set->opcodes[i].name,
+        opcode_set->opcodes[i].dest_size[0],
+        opcode_set->opcodes[i].src_size[0],
+        opcode_set->opcodes[i].src_size[1]);
+    test_opcode_const (opcode_set->opcodes + i);
+  }
+  for(i=0;i<opcode_set->n_opcodes;i++){
+    printf("/* %s param %d,%d,%d */\n",
+        opcode_set->opcodes[i].name,
+        opcode_set->opcodes[i].dest_size[0],
+        opcode_set->opcodes[i].src_size[0],
+        opcode_set->opcodes[i].src_size[1]);
+    test_opcode_param (opcode_set->opcodes + i);
+  }
+
+  if (error) return 1;
+  return 0;
+}
+
+void
+test_opcode (OrcStaticOpcode *opcode)
+{
+  OrcProgram *p;
+  OrcTestResult ret;
+
+  p = orc_test_get_program_for_opcode (opcode);
+  if (!p) return;
+
+  ret = orc_test_gcc_compile_c64x (p);
+  if (ret == ORC_TEST_FAILED) {
+    printf("%s", orc_program_get_asm_code (p));
+    error = TRUE;
+    return;
+  }
+
+  orc_program_free (p);
+}
+
+void
+test_opcode_const (OrcStaticOpcode *opcode)
+{
+  OrcProgram *p;
+  OrcTestResult ret;
+
+  p = orc_test_get_program_for_opcode_const (opcode);
+  if (!p) return;
+
+  ret = orc_test_gcc_compile_c64x (p);
+  if (ret == ORC_TEST_FAILED) {
+    printf("%s", orc_program_get_asm_code (p));
+    error = TRUE;
+    return;
+  }
+
+  orc_program_free (p);
+}
+
+void
+test_opcode_param (OrcStaticOpcode *opcode)
+{
+  OrcProgram *p;
+  OrcTestResult ret;
+
+  p = orc_test_get_program_for_opcode_param (opcode);
+  if (!p) return;
+
+  ret = orc_test_gcc_compile_c64x (p);
+  if (ret == ORC_TEST_FAILED) {
+    printf("%s", orc_program_get_asm_code (p));
+    error = TRUE;
+    return;
+  }
+
+  orc_program_free (p);
+}
+