Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/GStreamer/orc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schleef <ds@schleef.org>2011-09-25 03:00:25 +0400
committerDavid Schleef <ds@schleef.org>2011-09-25 03:00:25 +0400
commit038230b3873cb655b7e7716219ceed0c60cd6d64 (patch)
tree22a3fca1ece1ac48939c3bf06871b3715bd9b2ed
parentb06d6f77247a37db49c7ca0ff582e0e47c7ff11f (diff)
Fix up c64x-c backend
-rw-r--r--orc-test/orctest.c5
-rw-r--r--orc/orcprogram-c64x-c.c55
-rw-r--r--testsuite/Makefile.am4
-rw-r--r--testsuite/compile_opcodes_sys_c64x.c114
4 files changed, 161 insertions, 17 deletions
diff --git a/orc-test/orctest.c b/orc-test/orctest.c
index a847765..b82ce5a 100644
--- a/orc-test/orctest.c
+++ b/orc-test/orctest.c
@@ -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);
diff --git a/orc/orcprogram-c64x-c.c b/orc/orcprogram-c64x-c.c
index de66a18..8361fee 100644
--- a/orc/orcprogram-c64x-c.c
+++ b/orc/orcprogram-c64x-c.c
@@ -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);
diff --git a/testsuite/Makefile.am b/testsuite/Makefile.am
index 2e0044b..fdae171 100644
--- a/testsuite/Makefile.am
+++ b/testsuite/Makefile.am
@@ -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
index 0000000..0e64a52
--- /dev/null
+++ b/testsuite/compile_opcodes_sys_c64x.c
@@ -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);
+}
+