From 0409cab630fcbc940d3bee5a3ea6ce6f20cc0f83 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Sun, 26 Apr 2009 20:52:59 -0700 Subject: [PATCH] Pull various fixes from neon branch --- examples/simple.c | 4 +- orc-test/orctest.c | 99 ++++++++++++++++++++++++++++---------------------- orc/orcexecutor.c | 9 ++++- orc/orcprogram.h | 3 +- testsuite/test-schro.c | 74 +++++++++++-------------------------- testsuite/test4.c | 10 +++-- 6 files changed, 95 insertions(+), 104 deletions(-) diff --git a/examples/simple.c b/examples/simple.c index 2b5aa1a..b620e13 100644 --- a/examples/simple.c +++ b/examples/simple.c @@ -36,7 +36,7 @@ main (int argc, char *argv[]) { orc_init (); - test9(); + test1(); exit(0); } @@ -67,7 +67,7 @@ test1(void) src2[i] = rand()&0xf; } - //orc_executor_run (ex); + orc_executor_run (ex); //orc_executor_emulate (ex); for(i=0;i +#include +#include #include #include @@ -93,22 +95,22 @@ print_array_val (void *array, int size, int i) switch (size) { case 1: { - int8_t *a = array; - printf(" %4d", a[i]); + uint8_t *a = array; + printf(" %4u", a[i]); return a[i]; } break; case 2: { - int16_t *a = array; - printf(" %5d", a[i]); + uint16_t *a = array; + printf(" %5u", a[i]); return a[i]; } break; case 4: { - int32_t *a = array; - printf(" %10d", a[i]); + uint32_t *a = array; + printf(" %10u", a[i]); return a[i]; } break; @@ -117,6 +119,41 @@ print_array_val (void *array, int size, int i) } } +int delign_index = 1; + +void * +alloc_array (int n, int size, void **m_ptr) +{ + unsigned char *ptr = malloc (n*size+256*2); + memset (ptr, 0xa5, n*size+256*2); + if (m_ptr) *m_ptr = ptr; + + delign_index++; + delign_index &= 0xf; + + return (ptr + 256 + size*delign_index); +} + +int +check_bounds (void *ptr, int n, int size) +{ + unsigned char *data = ptr; + int i; + + for(i=0;i<100;i++){ + if (data[-1-i] != 0xa5) { + ORC_ERROR("early bounds failure at %d", i); + return FALSE; + } + if (data[n*size+i] != 0xa5) { + ORC_ERROR("late bounds failure at %d", i); + return FALSE; + } + } + + return TRUE; +} + int orc_test_compare_output (OrcProgram *program) { @@ -126,6 +163,8 @@ orc_test_compare_output (OrcProgram *program) int dest_index; void *dest_exec; void *dest_emul; + void *ptr_exec; + void *ptr_emul; int i; ret = orc_program_compile (program); @@ -142,7 +181,7 @@ orc_test_compare_output (OrcProgram *program) if (program->vars[i].vartype == ORC_VAR_TYPE_SRC) { uint8_t *data; - data = malloc(n*program->vars[i].size); + data = alloc_array (n,program->vars[i].size, NULL); orc_test_random_bits (data, n*program->vars[i].size); orc_executor_set_array (ex, i, data); } else if (program->vars[i].vartype == ORC_VAR_TYPE_DEST) { @@ -155,10 +194,8 @@ orc_test_compare_output (OrcProgram *program) return FALSE; } - dest_exec = malloc(n*program->vars[dest_index].size); - memset (dest_exec, 0xa5, n*program->vars[dest_index].size); - dest_emul = malloc(n*program->vars[dest_index].size); - memset (dest_emul, 0xa5, n*program->vars[dest_index].size); + dest_exec = alloc_array (n, program->vars[dest_index].size, &ptr_exec); + dest_emul = alloc_array (n, program->vars[dest_index].size, &ptr_emul); orc_executor_set_array (ex, dest_index, dest_exec); orc_executor_run (ex); @@ -191,45 +228,19 @@ orc_test_compare_output (OrcProgram *program) printf("\n"); } -#if 0 - switch (program->vars[dest_index].size) { - case 1: - { - uint8_t *a = dest_emul; - uint8_t *b = dest_exec; - for(i=0;ivars[dest_index].size)) { + printf("out of bounds failure\n"); + + return FALSE; + } + free (ptr_exec); + free (ptr_emul); orc_executor_free (ex); return TRUE; diff --git a/orc/orcexecutor.c b/orc/orcexecutor.c index 668d3a4..8c643c3 100644 --- a/orc/orcexecutor.c +++ b/orc/orcexecutor.c @@ -36,12 +36,19 @@ orc_executor_run (OrcExecutor *ex) func = ex->program->code_exec; if (func) { func (ex); + //ORC_ERROR("counters %d %d %d", ex->counter1, ex->counter2, ex->counter3); } else { orc_executor_emulate (ex); } } void +orc_executor_set_program (OrcExecutor *ex, OrcProgram *program) +{ + ex->program = program; +} + +void orc_executor_set_array (OrcExecutor *ex, int var, void *ptr) { ex->arrays[var] = ptr; @@ -56,7 +63,7 @@ orc_executor_set_array_str (OrcExecutor *ex, const char *name, void *ptr) } void -orc_executor_set_parameter (OrcExecutor *ex, int var, int value) +orc_executor_set_param (OrcExecutor *ex, int var, int value) { ex->params[var] = value; } diff --git a/orc/orcprogram.h b/orc/orcprogram.h index 6c51d4d..e932ac8 100644 --- a/orc/orcprogram.h +++ b/orc/orcprogram.h @@ -325,9 +325,10 @@ void orc_program_powerpc_reset_alloc (OrcProgram *program); OrcExecutor * orc_executor_new (OrcProgram *program); void orc_executor_free (OrcExecutor *ex); +void orc_executor_set_program (OrcExecutor *ex, OrcProgram *program); void orc_executor_set_array (OrcExecutor *ex, int var, void *ptr); void orc_executor_set_array_str (OrcExecutor *ex, const char *name, void *ptr); -void orc_executor_set_parameter (OrcExecutor *ex, int var, int value); +void orc_executor_set_param (OrcExecutor *ex, int var, int value); void orc_executor_set_param_str (OrcExecutor *ex, const char *name, int value); int orc_executor_get_accumulator (OrcExecutor *ex, int var, int value); int orc_executor_get_accumulator_str (OrcExecutor *ex, const char *name, int value); diff --git a/testsuite/test-schro.c b/testsuite/test-schro.c index a8d4bc1..e63afb1 100644 --- a/testsuite/test-schro.c +++ b/testsuite/test-schro.c @@ -26,86 +26,56 @@ get_program (int type) d1 = orc_program_add_destination (p, 2, "d1"); orc_program_add_source (p, 2, "s1"); orc_program_add_source (p, 2, "s2"); - orc_program_add_source (p, 2, "s3"); orc_program_add_constant (p, 2, 2, "c1"); orc_program_add_constant (p, 2, 2, "c2"); orc_program_add_temporary (p, 2, "t1"); - orc_program_append_str (p, "addw", "t1", "s2", "s3"); + orc_program_append_str (p, "addw", "t1", "s1", "s2"); orc_program_append_str (p, "addw", "t1", "t1", "c1"); orc_program_append_str (p, "shrsw", "t1", "t1", "c2"); - orc_program_append_str (p, "addw", "d1", "s1", "t1"); + orc_program_append_str (p, "addw", "d1", "d1", "t1"); break; case 1: p = orc_program_new (); d1 = orc_program_add_destination (p, 2, "d1"); orc_program_add_source (p, 2, "s1"); orc_program_add_source (p, 2, "s2"); - orc_program_add_source (p, 2, "s3"); orc_program_add_constant (p, 2, 2, "c1"); orc_program_add_constant (p, 2, 2, "c2"); orc_program_add_temporary (p, 2, "t1"); - orc_program_append_str (p, "addw", "t1", "s2", "s3"); + orc_program_append_str (p, "addw", "t1", "s1", "s2"); orc_program_append_str (p, "addw", "t1", "t1", "c1"); orc_program_append_str (p, "shrsw", "t1", "t1", "c2"); - orc_program_append_str (p, "subw", "d1", "s1", "t1"); + orc_program_append_str (p, "subw", "d1", "d1", "t1"); break; case 2: p = orc_program_new (); orc_program_add_destination (p, 2, "d1"); orc_program_add_source (p, 2, "s1"); orc_program_add_source (p, 2, "s2"); - orc_program_add_source (p, 2, "s3"); -#if 1 orc_program_add_constant (p, 2, 1, "c1"); orc_program_add_constant (p, 2, 1, "c2"); -#else - orc_program_add_constant (p, 2, 0x8000, "c1"); -#endif orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 2, "t3"); -#if 1 - orc_program_append_str (p, "addw", "t1", "s2", "s3"); + orc_program_append_str (p, "addw", "t1", "s1", "s2"); orc_program_append_str (p, "addw", "t1", "t1", "c1"); orc_program_append_str (p, "shrsw", "t1", "t1", "c2"); -#else - orc_program_append_str (p, "xorw", "t1", "c1", "s2"); - orc_program_append_str (p, "xorw", "t2", "c1", "s3"); - orc_program_append_str (p, "avguw", "t3", "t1", "t2"); - orc_program_append_str (p, "xorw", "t1", "c1", "t3"); -#endif - orc_program_append_str (p, "addw", "d1", "s1", "t1"); + orc_program_append_str (p, "addw", "d1", "d1", "t1"); break; case 3: p = orc_program_new (); orc_program_add_destination (p, 2, "d1"); orc_program_add_source (p, 2, "s1"); orc_program_add_source (p, 2, "s2"); - orc_program_add_source (p, 2, "s3"); -#if 1 orc_program_add_constant (p, 2, 1, "c1"); orc_program_add_constant (p, 2, 1, "c2"); -#else - orc_program_add_constant (p, 2, 0x8000, "c1"); -#endif orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 2, "t3"); -#if 1 - orc_program_append_str (p, "addw", "t1", "s2", "s3"); + orc_program_append_str (p, "addw", "t1", "s1", "s2"); orc_program_append_str (p, "addw", "t1", "t1", "c1"); orc_program_append_str (p, "shrsw", "t1", "t1", "c2"); -#else - orc_program_append_str (p, "xorw", "t1", "c1", "s2"); - orc_program_append_str (p, "xorw", "t2", "c1", "s3"); - orc_program_append_str (p, "avguw", "t3", "t1", "t2"); - orc_program_append_str (p, "xorw", "t1", "c1", "t3"); -#endif - orc_program_append_str (p, "subw", "d1", "s1", "t1"); + orc_program_append_str (p, "subw", "d1", "d1", "t1"); break; case 4: p = orc_program_new_dss (2,2,2); @@ -134,24 +104,22 @@ get_program (int type) break; case 8: p = orc_program_new_dss (2,2,2); - orc_program_add_source (p, 2, "s3"); - orc_program_add_temporary (p, 4, "t1"); - orc_program_add_temporary (p, 2, "t2"); + orc_program_add_temporary (p, 2, "t1"); + orc_program_add_temporary (p, 4, "t2"); orc_program_add_parameter (p, 2, "p1"); orc_program_add_parameter (p, 4, "p2"); - orc_program_add_parameter (p, 2, "p3"); - - orc_program_append_str (p, "addw", "t1", "s2", "s3"); - orc_program_append_str (p, "mulswl", "t1", "t1", "p1"); - orc_program_append_str (p, "addl", "t1", "t1", "p2"); - orc_program_append_str (p, "shll", "t1", "s1", "p3"); - orc_program_append_ds_str (p, "convlw", "t2", "t1"); - orc_program_append_str (p, "addl", "d1", "t2", "s1"); + orc_program_add_parameter (p, 4, "p3"); + + orc_program_append_str (p, "addw", "t1", "s1", "s2"); + orc_program_append_str (p, "mulswl", "t2", "t1", "p1"); + orc_program_append_str (p, "addl", "t2", "t2", "p2"); + orc_program_append_str (p, "shll", "t2", "t2", "p3"); + orc_program_append_ds_str (p, "convlw", "t1", "t2"); + orc_program_append_str (p, "addw", "d1", "d1", "t1"); break; case 9: p = orc_program_new (); orc_program_add_destination (p, 2, "d1"); - orc_program_add_source (p, 2, "s1"); orc_program_add_source (p, 2, "s20"); orc_program_add_source (p, 2, "s21"); orc_program_add_source (p, 2, "s22"); @@ -168,12 +136,11 @@ get_program (int type) orc_program_append_str (p, "subw", "t1", "t1", "t2"); orc_program_append_str (p, "addw", "t1", "t1", "p1"); orc_program_append_str (p, "shrsw", "t1", "t1", "p2"); - orc_program_append_str (p, "addw", "d1", "s1", "t1"); + orc_program_append_str (p, "addw", "d1", "d1", "t1"); break; case 10: p = orc_program_new (); orc_program_add_destination (p, 2, "d1"); - orc_program_add_source (p, 2, "s1"); orc_program_add_source (p, 2, "s20"); orc_program_add_source (p, 2, "s21"); orc_program_add_source (p, 2, "s22"); @@ -190,7 +157,7 @@ get_program (int type) orc_program_append_str (p, "subw", "t1", "t1", "t2"); orc_program_append_str (p, "addw", "t1", "t1", "p1"); orc_program_append_str (p, "shrsw", "t1", "t1", "p2"); - orc_program_append_str (p, "subw", "d1", "s1", "t1"); + orc_program_append_str (p, "subw", "d1", "d1", "t1"); break; case 11: p = orc_program_new_dss (2,2,2); @@ -330,6 +297,7 @@ main (int argc, char *argv[]) int i; orc_init(); + orc_test_init(); for(i=0;i<18;i++){ printf("/* %d */\n", i); diff --git a/testsuite/test4.c b/testsuite/test4.c index 3df4273..3edd754 100644 --- a/testsuite/test4.c +++ b/testsuite/test4.c @@ -41,15 +41,19 @@ test_opcode (OrcStaticOpcode *opcode) char s[40]; int ret; - p = orc_program_new_dss (opcode->dest_size[0], - opcode->src_size[0], opcode->src_size[1]); + if (opcode->src_size[1] == 0) { + p = orc_program_new_ds (opcode->dest_size[0], opcode->src_size[0]); + } else { + p = orc_program_new_dss (opcode->dest_size[0], opcode->src_size[0], + opcode->src_size[1]); + } sprintf(s, "test_%s", opcode->name); orc_program_set_name (p, s); orc_program_append_str (p, opcode->name, "d1", "s1", "s2"); - ret = orc_program_compile_for_target (p, orc_target_get_by_name("arm")); + ret = orc_program_compile_for_target (p, orc_target_get_by_name("neon")); if (!ret) { error = TRUE; goto out; -- 2.7.4