diff options
author | David Schleef <ds@ginger.bigkitten.com> | 2008-05-21 18:36:23 -0700 |
---|---|---|
committer | David Schleef <ds@ginger.bigkitten.com> | 2008-05-21 18:36:23 -0700 |
commit | 4501aa11a1b6a8c0f8921ffbba7bc070917795f4 (patch) | |
tree | 227048c1aee8011fe9fb8a860420fa23d920bf5e | |
parent | fdf3c5067916e0a823b3e57c9338fca2f718084b (diff) | |
download | liboil-4501aa11a1b6a8c0f8921ffbba7bc070917795f4.tar.gz |
[orc] Add more complicated example. Fix valgrind problems.
-rw-r--r-- | examples/orc/simple.c | 76 | ||||
-rw-r--r-- | orc/orcexecutor.c | 19 | ||||
-rw-r--r-- | orc/orcprogram-powerpc.c | 3 | ||||
-rw-r--r-- | orc/orcprogram-x86.c | 2 | ||||
-rw-r--r-- | orc/orcprogram.c | 10 | ||||
-rw-r--r-- | orc/orcprogram.h | 22 |
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]; }; |