#include <orc-test/orctest.h>
+#include <orc/orc.h>
+#include <orc/orcdebug.h>
#include <stdio.h>
#include <stdlib.h>
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;
}
}
+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)
{
int dest_index;
void *dest_exec;
void *dest_emul;
+ void *ptr_exec;
+ void *ptr_emul;
int i;
ret = orc_program_compile (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) {
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);
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;i<n;i++){
- printf("%d: %d %d %c\n", i, a[i], b[i], (a[i]==b[i])?' ':'*');
- }
- }
- break;
- case 2:
- {
- uint16_t *a = dest_emul;
- uint16_t *b = dest_exec;
- for(i=0;i<n;i++){
- printf("%d: %d %d %c\n", i, a[i], b[i], (a[i]==b[i])?' ':'*');
- }
- }
- break;
- case 4:
- {
- uint32_t *a = dest_emul;
- uint32_t *b = dest_exec;
- for(i=0;i<n;i++){
- printf("%d: %d %d %c\n", i, a[i], b[i], (a[i]==b[i])?' ':'*');
- }
- }
- break;
- default:
- return FALSE;
- }
-#endif
printf("%s", orc_program_get_asm_code (program));
return FALSE;
}
+ if (!check_bounds (dest_exec, n, program->vars[dest_index].size)) {
+ printf("out of bounds failure\n");
+
+ return FALSE;
+ }
+ free (ptr_exec);
+ free (ptr_emul);
orc_executor_free (ex);
return TRUE;
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);
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");
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");
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);
int i;
orc_init();
+ orc_test_init();
for(i=0;i<18;i++){
printf("/* %d */\n", i);