summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schleef <ds@ginger.bigkitten.com>2008-05-21 18:36:23 -0700
committerDavid Schleef <ds@ginger.bigkitten.com>2008-05-21 18:36:23 -0700
commit4501aa11a1b6a8c0f8921ffbba7bc070917795f4 (patch)
tree227048c1aee8011fe9fb8a860420fa23d920bf5e
parentfdf3c5067916e0a823b3e57c9338fca2f718084b (diff)
downloadliboil-4501aa11a1b6a8c0f8921ffbba7bc070917795f4.tar.gz
[orc] Add more complicated example. Fix valgrind problems.
-rw-r--r--examples/orc/simple.c76
-rw-r--r--orc/orcexecutor.c19
-rw-r--r--orc/orcprogram-powerpc.c3
-rw-r--r--orc/orcprogram-x86.c2
-rw-r--r--orc/orcprogram.c10
-rw-r--r--orc/orcprogram.h22
6 files changed, 104 insertions, 28 deletions
diff --git a/examples/orc/simple.c b/examples/orc/simple.c
index 4d80282..4cc1e84 100644
--- a/examples/orc/simple.c
+++ b/examples/orc/simple.c
@@ -8,20 +8,24 @@
#include <orc/orcprogram.h>
-#define N 10
+#define N 20
-int16_t src1[N];
+int16_t src1[N+4];
int16_t src2[N];
+int16_t dest_test[N];
+int16_t dest_ref[N];
int16_t dest[N];
void test1(void);
+void test2(void);
int
main (int argc, char *argv[])
{
orc_init ();
- test1();
+ test2();
+
exit(0);
}
@@ -33,7 +37,6 @@ test1(void)
OrcExecutor *ex;
int s1, s2, d1;
-
p = orc_program_new ();
d1 = orc_program_add_destination (p, "s16", "d1");
@@ -72,3 +75,68 @@ test1(void)
}
+void
+test2(void)
+{
+ OrcProgram *p;
+ OrcExecutor *ex;
+ int s1, s2, s3, s4, d1;
+ int t1, t2;
+ int c1, c2, c3;
+
+ p = orc_program_new ();
+
+ d1 = orc_program_add_destination (p, "s16", "d1");
+ s1 = orc_program_add_source (p, "s16", "s1");
+ s2 = orc_program_add_source (p, "s16", "s2");
+ s3 = orc_program_add_source (p, "s16", "s3");
+ s4 = orc_program_add_source (p, "s16", "s4");
+ c1 = orc_program_add_constant (p, "s16", 3, "c1");
+ c2 = orc_program_add_constant (p, "s16", 4, "c2");
+ c3 = orc_program_add_constant (p, "s16", 3, "c3");
+ t1 = orc_program_add_temporary (p, "s16", "t1");
+ t2 = orc_program_add_temporary (p, "s16", "t2");
+
+ orc_program_append (p, "add_s16", t1, s2, s3);
+ orc_program_append (p, "add_s16", t2, s1, s4);
+ orc_program_append (p, "mul_s16", t1, t1, c1);
+ orc_program_append (p, "sub_s16", t1, t1, t2);
+ orc_program_append (p, "add_s16", t1, t1, c2);
+ orc_program_append (p, "rshift_s16", d1, t1, c3);
+
+ orc_program_compile (p);
+
+ ex = orc_executor_new (p);
+ orc_executor_set_n (ex, N);
+ orc_executor_set_array (ex, s1, src1);
+ orc_executor_set_array (ex, s2, src1 + 1);
+ orc_executor_set_array (ex, s3, src1 + 2);
+ orc_executor_set_array (ex, s4, src1 + 3);
+
+ if (1) {
+ int i;
+
+ for(i=0;i<N+3;i++){
+ src1[i] = rand()&0xff;
+ }
+
+ orc_executor_set_array (ex, d1, dest_ref);
+ orc_executor_emulate (ex);
+ for(i=0;i<N;i++){
+ dest_ref[i] = (3*(src1[i+1]+src1[i+2])-(src1[i]+src1[i+3])+4)>>3;
+ }
+
+ orc_executor_set_array (ex, d1, dest_test);
+ orc_executor_run (ex);
+
+ for(i=0;i<N;i++){
+ printf("# %4d %4d %4d %c\n", src1[i], dest_ref[i], dest_test[i],
+ (dest_ref[i] == dest_test[i])?' ':'*');
+ }
+ }
+
+ orc_executor_free (ex);
+ orc_program_free (p);
+}
+
+
diff --git a/orc/orcexecutor.c b/orc/orcexecutor.c
index 306c929..7395ed4 100644
--- a/orc/orcexecutor.c
+++ b/orc/orcexecutor.c
@@ -61,40 +61,41 @@ orc_executor_emulate (OrcExecutor *ex)
OrcInstruction *insn;
OrcOpcode *opcode;
- printf("n %d\n", ex->n);
- printf("n_insns %d\n", program->n_insns);
+ //printf("n %d\n", ex->n);
+ //printf("n_insns %d\n", program->n_insns);
for(i=0;i<ex->n;i++){
+ printf("%d\n", i);
for(j=0;j<program->n_insns;j++){
insn = program->insns + j;
opcode = insn->opcode;
- printf("%d: %s\n", j, insn->opcode->name);
+ //printf("%d: %s\n", j, insn->opcode->name);
/* set up args */
for(k=0;k<opcode->n_src + opcode->n_dest;k++){
ex->args[k] = ex->vars + insn->args[k];
- printf("setting up arg %d as var %d vartype %d\n",
- k, insn->args[k], ex->args[k]->vartype);
+ //printf("setting up arg %d as var %d vartype %d\n",
+ // k, insn->args[k], ex->args[k]->vartype);
if (ex->args[k]->vartype == ORC_VAR_TYPE_SRC) {
void *ptr = ex->arrays[insn->args[k]] + 2*i;
- printf("load %p\n", ptr);
+ //printf("load %p\n", ptr);
ex->args[k]->s16 = *(int16_t *)ptr;
}
}
opcode->emulate (ex, opcode->emulate_user);
- printf("emulate: %d %d %d\n", ex->args[0]->s16,
- ex->args[1]->s16, ex->args[2]->s16);
+ //printf("emulate: %d %d %d\n", ex->args[0]->s16,
+ // ex->args[1]->s16, ex->args[2]->s16);
for(k=0;k<opcode->n_src + opcode->n_dest;k++){
if (ex->args[k]->vartype == ORC_VAR_TYPE_DEST) {
void *ptr = ex->arrays[insn->args[k]] + 2*i;
- printf("store %p\n", ptr);
+ //printf("store %p\n", ptr);
*(int16_t *)ptr = ex->args[k]->s16;
}
}
diff --git a/orc/orcprogram-powerpc.c b/orc/orcprogram-powerpc.c
index 776870a..9ed4683 100644
--- a/orc/orcprogram-powerpc.c
+++ b/orc/orcprogram-powerpc.c
@@ -324,6 +324,7 @@ powerpc_do_fixups (OrcProgram *program)
void
powerpc_flush (OrcProgram *program)
{
+#ifdef HAVE_POWERPC
unsigned char *ptr;
int cache_line_size = 32;
int i;
@@ -340,7 +341,7 @@ powerpc_flush (OrcProgram *program)
__asm__ __volatile__ ("icbi %0,%1" :: "r" (ptr), "r" (i));
}
__asm__ __volatile ("isync");
-
+#endif
}
void
diff --git a/orc/orcprogram-x86.c b/orc/orcprogram-x86.c
index 273d07a..a0829a0 100644
--- a/orc/orcprogram-x86.c
+++ b/orc/orcprogram-x86.c
@@ -219,7 +219,7 @@ orc_x86_init (void)
}
void
-orc_program_reset_alloc (OrcProgram *program)
+orc_program_x86_reset_alloc (OrcProgram *program)
{
int i;
diff --git a/orc/orcprogram.c b/orc/orcprogram.c
index 2c46264..da31111 100644
--- a/orc/orcprogram.c
+++ b/orc/orcprogram.c
@@ -22,7 +22,7 @@ orc_program_new (void)
p = malloc(sizeof(OrcProgram));
memset (p, 0, sizeof(OrcProgram));
- p->rule_set = ORC_RULE_ALTIVEC_1;
+ p->rule_set = ORC_RULE_MMX_1;
p->n_per_loop = 1;
p->loop_shift = 0;
@@ -148,8 +148,8 @@ orc_program_compile (OrcProgram *program)
orc_program_assign_rules (program);
orc_program_rewrite_vars (program);
- //orc_program_x86_reset_alloc (program);
- orc_program_powerpc_reset_alloc (program);
+ orc_program_x86_reset_alloc (program);
+ //orc_program_powerpc_reset_alloc (program);
orc_program_global_reg_alloc (program);
orc_program_do_regs (program);
@@ -157,8 +157,8 @@ orc_program_compile (OrcProgram *program)
orc_program_rewrite_vars2 (program);
orc_program_allocate_codemem (program);
- //orc_program_assemble_x86 (program);
- orc_program_assemble_powerpc (program);
+ orc_program_assemble_x86 (program);
+ //orc_program_assemble_powerpc (program);
//orc_program_assemble_c (program);
orc_program_dump_code (program);
diff --git a/orc/orcprogram.h b/orc/orcprogram.h
index fa97981..b2d2d83 100644
--- a/orc/orcprogram.h
+++ b/orc/orcprogram.h
@@ -19,6 +19,11 @@ typedef void (*OrcOpcodeEmulateFunc)(OrcExecutor *ex, void *user);
typedef void (*OrcRuleEmitFunc)(OrcProgram *p, void *user, OrcInstruction *insn);
#define ORC_N_REGS 100
+#define ORC_N_INSNS 100
+#define ORC_N_VARIABLES 100
+#define ORC_N_REGISTERS 100
+#define ORC_N_FIXUPS 100
+#define ORC_N_LABELS 100
#define ORC_OPCODE_N_ARGS 4
#define ORC_OPCODE_N_RULES 8
@@ -121,17 +126,18 @@ struct _OrcRegister {
int merge;
};
+
struct _OrcProgram {
- OrcInstruction insns[100];
+ OrcInstruction insns[ORC_N_INSNS];
int n_insns;
- OrcVariable vars[100];
+ OrcVariable vars[ORC_N_VARIABLES];
int n_vars;
OrcInstruction *insn;
int rule_set;
- OrcRegister registers[100];
+ OrcRegister registers[ORC_N_REGISTERS];
int n_regs;
unsigned char *code;
@@ -139,9 +145,9 @@ struct _OrcProgram {
unsigned char *codeptr;
int code_size;
- OrcFixup fixups[100];
+ OrcFixup fixups[ORC_N_FIXUPS];
int n_fixups;
- unsigned char *labels[100];
+ unsigned char *labels[ORC_N_LABELS];
int error;
@@ -157,10 +163,10 @@ struct _OrcExecutor {
int n;
int counter;
- void *arrays[10];
+ void *arrays[ORC_N_VARIABLES];
- OrcVariable vars[10];
- OrcVariable *args[4];
+ OrcVariable vars[ORC_N_VARIABLES];
+ OrcVariable *args[ORC_OPCODE_N_ARGS];
};