From 038230b3873cb655b7e7716219ceed0c60cd6d64 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Sat, 24 Sep 2011 16:00:25 -0700 Subject: [PATCH] Fix up c64x-c backend --- orc-test/orctest.c | 5 +- orc/orcprogram-c64x-c.c | 55 ++++++++++++----- testsuite/Makefile.am | 4 ++ testsuite/compile_opcodes_sys_c64x.c | 114 +++++++++++++++++++++++++++++++++++ 4 files changed, 161 insertions(+), 17 deletions(-) create mode 100644 testsuite/compile_opcodes_sys_c64x.c 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 +#include + +#include +#include + + +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;in_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;in_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;in_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); +} + -- 2.7.4