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);
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;
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:
}
}
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);
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:
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,
{
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);
--- /dev/null
+
+#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);
+}
+