Skip to content

Commit 038230b

Browse files
committed
Fix up c64x-c backend
1 parent b06d6f7 commit 038230b

File tree

4 files changed

+161
-17
lines changed

4 files changed

+161
-17
lines changed

orc-test/orctest.c

+3-2
Original file line numberDiff line numberDiff line change
@@ -289,13 +289,13 @@ orc_test_gcc_compile_c64x (OrcProgram *p)
289289

290290
base = "temp-orc-test";
291291

292-
sprintf(source_filename, "%s-source.s", base);
292+
sprintf(source_filename, "%s-source.c", base);
293293
sprintf(obj_filename, "%s-source.obj", base);
294294
sprintf(dis_filename, "%s-source.dis", base);
295295
sprintf(dump_filename, "%s-dump.bin", base);
296296
sprintf(dump_dis_filename, "%s-dump.dis", base);
297297

298-
target = orc_target_get_by_name ("c64x");
298+
target = orc_target_get_by_name ("c64x-c");
299299
flags = orc_target_get_default_flags (target);
300300

301301
result = orc_program_compile_full (p, target, flags);
@@ -307,6 +307,7 @@ orc_test_gcc_compile_c64x (OrcProgram *p)
307307
fflush (stdout);
308308

309309
file = fopen (source_filename, "w");
310+
fprintf(file, "%s", orc_target_get_preamble (target));
310311
fprintf(file, "%s", orc_program_get_asm_code (p));
311312
fclose (file);
312313

orc/orcprogram-c64x-c.c

+40-15
Original file line numberDiff line numberDiff line change
@@ -285,10 +285,10 @@ orc_compiler_c64x_c_assemble (OrcCompiler *compiler)
285285
ORC_ASM_CODE(compiler," int var%d;\n", i);
286286
break;
287287
case ORC_VAR_TYPE_SRC:
288-
ORC_ASM_CODE(compiler," const unsigned char * restrict var%d;\n", i);
288+
ORC_ASM_CODE(compiler," const unsigned char * restrict ptr%d;\n", i);
289289
break;
290290
case ORC_VAR_TYPE_DEST:
291-
ORC_ASM_CODE(compiler," unsigned char * restrict var%d;\n", i);
291+
ORC_ASM_CODE(compiler," unsigned char * restrict ptr%d;\n", i);
292292
break;
293293
case ORC_VAR_TYPE_ACCUMULATOR:
294294
ORC_ASM_CODE(compiler," int var%d = 0;\n", i);
@@ -335,19 +335,19 @@ orc_compiler_c64x_c_assemble (OrcCompiler *compiler)
335335
switch (var->vartype) {
336336
case ORC_VAR_TYPE_SRC:
337337
if (!(compiler->target_flags & ORC_TARGET_C_NOEXEC)) {
338-
ORC_ASM_CODE(compiler," var%d = ORC_PTR_OFFSET(ex->arrays[%d], ex->params[%d] * j);\n",
338+
ORC_ASM_CODE(compiler," ptr%d = ORC_PTR_OFFSET(ex->arrays[%d], ex->params[%d] * j);\n",
339339
i, i, i);
340340
} else {
341-
ORC_ASM_CODE(compiler," var%d = ORC_PTR_OFFSET(%s, %s_stride * j);\n",
341+
ORC_ASM_CODE(compiler," ptr%d = ORC_PTR_OFFSET(%s, %s_stride * j);\n",
342342
i, varnames[i], varnames[i]);
343343
}
344344
break;
345345
case ORC_VAR_TYPE_DEST:
346346
if (!(compiler->target_flags & ORC_TARGET_C_NOEXEC)) {
347-
ORC_ASM_CODE(compiler," var%d = ORC_PTR_OFFSET(ex->arrays[%d], ex->params[%d] * j);\n",
347+
ORC_ASM_CODE(compiler," ptr%d = ORC_PTR_OFFSET(ex->arrays[%d], ex->params[%d] * j);\n",
348348
i, i, i);
349349
} else {
350-
ORC_ASM_CODE(compiler," var%d = ORC_PTR_OFFSET(%s, %s_stride * j);\n",
350+
ORC_ASM_CODE(compiler," ptr%d = ORC_PTR_OFFSET(%s, %s_stride * j);\n",
351351
i, varnames[i], varnames[i]);
352352
}
353353
break;
@@ -362,16 +362,16 @@ orc_compiler_c64x_c_assemble (OrcCompiler *compiler)
362362
switch (var->vartype) {
363363
case ORC_VAR_TYPE_SRC:
364364
if (!(compiler->target_flags & ORC_TARGET_C_NOEXEC)) {
365-
ORC_ASM_CODE(compiler," var%d = ex->arrays[%d];\n", i, i);
365+
ORC_ASM_CODE(compiler," ptr%d = ex->arrays[%d];\n", i, i);
366366
} else {
367-
ORC_ASM_CODE(compiler," var%d = (void *)%s;\n", i, varnames[i]);
367+
ORC_ASM_CODE(compiler," ptr%d = (void *)%s;\n", i, varnames[i]);
368368
}
369369
break;
370370
case ORC_VAR_TYPE_DEST:
371371
if (!(compiler->target_flags & ORC_TARGET_C_NOEXEC)) {
372-
ORC_ASM_CODE(compiler," var%d = ex->arrays[%d];\n", i, i);
372+
ORC_ASM_CODE(compiler," ptr%d = ex->arrays[%d];\n", i, i);
373373
} else {
374-
ORC_ASM_CODE(compiler," var%d = (void *)%s;\n", i, varnames[i]);
374+
ORC_ASM_CODE(compiler," ptr%d = (void *)%s;\n", i, varnames[i]);
375375
}
376376
break;
377377
default:
@@ -386,7 +386,7 @@ orc_compiler_c64x_c_assemble (OrcCompiler *compiler)
386386
}
387387
}
388388
if (loop_shift > 0) {
389-
ORC_ASM_CODE(compiler,"%*s n1 = ((4 - (int)var%d)&0x3) >> %d;\n",
389+
ORC_ASM_CODE(compiler,"%*s n1 = ((4 - (int)ptr%d)&0x3) >> %d;\n",
390390
prefix, "", align_var, get_shift(compiler->vars[align_var].size));
391391
ORC_ASM_CODE(compiler,"%*s n2 = (n - n1) >> %d;\n",
392392
prefix, "", loop_shift);
@@ -491,7 +491,7 @@ emit_loop (OrcCompiler *compiler, int prefix)
491491
switch (var->vartype) {
492492
case ORC_VAR_TYPE_SRC:
493493
case ORC_VAR_TYPE_DEST:
494-
ORC_ASM_CODE(compiler,"%*s var%d += %d;\n", prefix, "",
494+
ORC_ASM_CODE(compiler,"%*s ptr%d += %d;\n", prefix, "",
495495
i, var->size << compiler->loop_shift);
496496
break;
497497
default:
@@ -941,7 +941,22 @@ c_rule_accsadubl (OrcCompiler *p, void *user, OrcInstruction *insn)
941941
dest, dest, src1, src2);
942942
}
943943

944-
static OrcTarget c_target = {
944+
static void
945+
c_rule_loadX (OrcCompiler *p, void *user, OrcInstruction *insn)
946+
{
947+
ORC_ASM_CODE(p," var%d = ptr%d[i];\n", insn->dest_args[0],
948+
insn->src_args[0]);
949+
}
950+
951+
static void
952+
c_rule_storeX (OrcCompiler *p, void *user, OrcInstruction *insn)
953+
{
954+
ORC_ASM_CODE(p," ptr%d[i] = var%d;\n", insn->dest_args[0],
955+
insn->src_args[0]);
956+
}
957+
958+
959+
static OrcTarget c64x_c_target = {
945960
"c64x-c",
946961
FALSE,
947962
ORC_GP_REG_BASE,
@@ -959,12 +974,22 @@ orc_c64x_c_init (void)
959974
{
960975
OrcRuleSet *rule_set;
961976

962-
orc_target_register (&c_target);
977+
orc_target_register (&c64x_c_target);
963978

964-
rule_set = orc_rule_set_new (orc_opcode_set_get("sys"), &c_target, 0);
979+
rule_set = orc_rule_set_new (orc_opcode_set_get("sys"), &c64x_c_target, 0);
965980

966981
#define REG(a) orc_rule_register (rule_set, #a , c_rule_ ## a, NULL);
967982

983+
orc_rule_register (rule_set, "loadb", c_rule_loadX, NULL);
984+
orc_rule_register (rule_set, "loadw", c_rule_loadX, NULL);
985+
orc_rule_register (rule_set, "loadl", c_rule_loadX, NULL);
986+
orc_rule_register (rule_set, "loadq", c_rule_loadX, NULL);
987+
988+
orc_rule_register (rule_set, "storeb", c_rule_storeX, NULL);
989+
orc_rule_register (rule_set, "storew", c_rule_storeX, NULL);
990+
orc_rule_register (rule_set, "storel", c_rule_storeX, NULL);
991+
orc_rule_register (rule_set, "storeq", c_rule_storeX, NULL);
992+
968993
REG(absb);
969994
REG(addb);
970995
REG(addssb);

testsuite/Makefile.am

+4
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ noinst_PROGRAMS += compile_opcodes_sys_neon \
3232
compile_parse_neon
3333
endif
3434

35+
if ENABLE_BACKEND_C64X
36+
noinst_PROGRAMS += compile_opcodes_sys_c64x
37+
endif
38+
3539
AM_CFLAGS = $(ORC_CFLAGS)
3640
LIBS = $(ORC_LIBS) $(top_builddir)/orc-test/liborc-test-@[email protected]
3741

testsuite/compile_opcodes_sys_c64x.c

+114
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
2+
#include "config.h"
3+
4+
#include <stdio.h>
5+
#include <stdlib.h>
6+
7+
#include <orc/orc.h>
8+
#include <orc-test/orctest.h>
9+
10+
11+
int error = FALSE;
12+
13+
void test_opcode (OrcStaticOpcode *opcode);
14+
void test_opcode_const (OrcStaticOpcode *opcode);
15+
void test_opcode_param (OrcStaticOpcode *opcode);
16+
17+
int
18+
main (int argc, char *argv[])
19+
{
20+
int i;
21+
OrcOpcodeSet *opcode_set;
22+
23+
orc_init();
24+
orc_test_init();
25+
26+
opcode_set = orc_opcode_set_get ("sys");
27+
28+
for(i=0;i<opcode_set->n_opcodes;i++){
29+
printf("/* %s %d,%d,%d */\n",
30+
opcode_set->opcodes[i].name,
31+
opcode_set->opcodes[i].dest_size[0],
32+
opcode_set->opcodes[i].src_size[0],
33+
opcode_set->opcodes[i].src_size[1]);
34+
test_opcode (opcode_set->opcodes + i);
35+
exit (0);
36+
}
37+
for(i=0;i<opcode_set->n_opcodes;i++){
38+
printf("/* %s const %d,%d,%d */\n",
39+
opcode_set->opcodes[i].name,
40+
opcode_set->opcodes[i].dest_size[0],
41+
opcode_set->opcodes[i].src_size[0],
42+
opcode_set->opcodes[i].src_size[1]);
43+
test_opcode_const (opcode_set->opcodes + i);
44+
}
45+
for(i=0;i<opcode_set->n_opcodes;i++){
46+
printf("/* %s param %d,%d,%d */\n",
47+
opcode_set->opcodes[i].name,
48+
opcode_set->opcodes[i].dest_size[0],
49+
opcode_set->opcodes[i].src_size[0],
50+
opcode_set->opcodes[i].src_size[1]);
51+
test_opcode_param (opcode_set->opcodes + i);
52+
}
53+
54+
if (error) return 1;
55+
return 0;
56+
}
57+
58+
void
59+
test_opcode (OrcStaticOpcode *opcode)
60+
{
61+
OrcProgram *p;
62+
OrcTestResult ret;
63+
64+
p = orc_test_get_program_for_opcode (opcode);
65+
if (!p) return;
66+
67+
ret = orc_test_gcc_compile_c64x (p);
68+
if (ret == ORC_TEST_FAILED) {
69+
printf("%s", orc_program_get_asm_code (p));
70+
error = TRUE;
71+
return;
72+
}
73+
74+
orc_program_free (p);
75+
}
76+
77+
void
78+
test_opcode_const (OrcStaticOpcode *opcode)
79+
{
80+
OrcProgram *p;
81+
OrcTestResult ret;
82+
83+
p = orc_test_get_program_for_opcode_const (opcode);
84+
if (!p) return;
85+
86+
ret = orc_test_gcc_compile_c64x (p);
87+
if (ret == ORC_TEST_FAILED) {
88+
printf("%s", orc_program_get_asm_code (p));
89+
error = TRUE;
90+
return;
91+
}
92+
93+
orc_program_free (p);
94+
}
95+
96+
void
97+
test_opcode_param (OrcStaticOpcode *opcode)
98+
{
99+
OrcProgram *p;
100+
OrcTestResult ret;
101+
102+
p = orc_test_get_program_for_opcode_param (opcode);
103+
if (!p) return;
104+
105+
ret = orc_test_gcc_compile_c64x (p);
106+
if (ret == ORC_TEST_FAILED) {
107+
printf("%s", orc_program_get_asm_code (p));
108+
error = TRUE;
109+
return;
110+
}
111+
112+
orc_program_free (p);
113+
}
114+

0 commit comments

Comments
 (0)