make all the tests work
authorDavid Schleef <ds@schleef.org>
Sun, 24 May 2009 01:07:39 +0000 (18:07 -0700)
committerDavid Schleef <ds@schleef.org>
Sun, 24 May 2009 01:07:39 +0000 (18:07 -0700)
orc-test/orctest.c
orc-test/orctest.h
orc/opcodes.h
orc/orcprogram-c.c
orc/orcprogram.h
testsuite/compile_opcodes_c.c
testsuite/compile_opcodes_sys.c

index b5d63da..9024a00 100644 (file)
@@ -388,4 +388,95 @@ orc_test_compare_output (OrcProgram *program)
   return TRUE;
 }
 
+OrcProgram *
+orc_test_get_program_for_opcode (OrcStaticOpcode *opcode)
+{
+  OrcProgram *p;
+  char s[40];
+
+  if (opcode->flags & ORC_STATIC_OPCODE_ACCUMULATOR) {
+    if (opcode->src_size[1] == 0) {
+      p = orc_program_new_as (opcode->dest_size[0], opcode->src_size[0]);
+    } else {
+      p = orc_program_new_ass (opcode->dest_size[0], opcode->src_size[0],
+          opcode->src_size[1]);
+    }
+  } else {
+    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);
+
+  if (opcode->flags & ORC_STATIC_OPCODE_ACCUMULATOR) {
+    orc_program_append_str (p, opcode->name, "a1", "s1", "s2");
+  } else {
+    orc_program_append_str (p, opcode->name, "d1", "s1", "s2");
+  }
+
+  return p;
+}
+
+OrcProgram *
+orc_test_get_program_for_opcode_const (OrcStaticOpcode *opcode)
+{
+  OrcProgram *p;
+  char s[40];
+
+  if (opcode->src_size[1] == 0) {
+    return NULL;
+  }
+
+  if (opcode->flags & ORC_STATIC_OPCODE_ACCUMULATOR) {
+    p = orc_program_new_as (opcode->dest_size[0], opcode->src_size[0]);
+  } else {
+    p = orc_program_new_ds (opcode->dest_size[0], opcode->src_size[0]);
+  }
+  orc_program_add_constant (p, opcode->src_size[1], 1, "c1");
+
+  sprintf(s, "test_const_%s", opcode->name);
+  orc_program_set_name (p, s);
+
+  if (opcode->flags & ORC_STATIC_OPCODE_ACCUMULATOR) {
+    orc_program_append_str (p, opcode->name, "a1", "s1", "c1");
+  } else {
+    orc_program_append_str (p, opcode->name, "d1", "s1", "c1");
+  }
+
+  return p;
+}
+
+OrcProgram *
+orc_test_get_program_for_opcode_param (OrcStaticOpcode *opcode)
+{
+  OrcProgram *p;
+  char s[40];
+
+  if (opcode->src_size[1] == 0) {
+    return NULL;
+  }
+
+  if (opcode->flags & ORC_STATIC_OPCODE_ACCUMULATOR) {
+    p = orc_program_new_as (opcode->dest_size[0], opcode->src_size[0]);
+  } else {
+    p = orc_program_new_ds (opcode->dest_size[0], opcode->src_size[0]);
+  }
+  orc_program_add_parameter (p, opcode->src_size[1], "p1");
+
+  sprintf(s, "test_const_%s", opcode->name);
+  orc_program_set_name (p, s);
+
+  if (opcode->flags & ORC_STATIC_OPCODE_ACCUMULATOR) {
+    orc_program_append_str (p, opcode->name, "a1", "s1", "p1");
+  } else {
+    orc_program_append_str (p, opcode->name, "d1", "s1", "p1");
+  }
+
+  return p;
+}
 
index 67f8dec..7b82606 100644 (file)
@@ -18,6 +18,9 @@ OrcTestResult orc_test_gcc_compile (OrcProgram *p);
 void orc_test_random_bits (void *data, int n_bytes);
 OrcTestResult orc_test_compare_output (OrcProgram *program);
 
+OrcProgram *orc_test_get_program_for_opcode (OrcStaticOpcode *opcode);
+OrcProgram *orc_test_get_program_for_opcode_const (OrcStaticOpcode *opcode);
+OrcProgram *orc_test_get_program_for_opcode_param (OrcStaticOpcode *opcode);
 
 ORC_END_DECLS
 
index 96bef07..ebbb6a0 100644 (file)
@@ -102,3 +102,12 @@ BINARY_BW(mulubw, "%s * %s")
 BINARY_WL(mulswl, "%s * %s")
 BINARY_WL(muluwl, "%s * %s")
 
+BINARY_WL(mergewl, "(%s << 16) | (%s)")
+BINARY_BW(mergebw, "(%s << 8) | (%s)")
+UNARY_WB(select0wb, "(%s >> 8)&0xff")
+UNARY_WB(select1wb, "%s & 0xff")
+UNARY_LW(select0lw, "(%s >> 16)&0xffff")
+UNARY_LW(select1lw, "%s & 0xffff")
+UNARY_UW(swapw, "ORC_SWAP_W(%s)")
+UNARY_UL(swapl, "ORC_SWAP_L(%s)")
+
index f9b6089..3aec098 100644 (file)
@@ -28,7 +28,15 @@ orc_target_get_asm_preamble (const char *target)
 {
   return "\n"
     "/* begin Orc C target preamble */\n"
-    "#include <stdint.h>\n"
+    "typedef signed char int8_t;\n"
+    "typedef unsigned char uint8_t;\n"
+    "typedef signed short int16_t;\n"
+    "typedef unsigned short uint16_t;\n"
+    "typedef signed int int32_t;\n"
+    "typedef unsigned int uint32_t;\n"
+    "typedef signed long long int64_t;\n"
+    "typedef unsigned long long uint64_t;\n"
+    "#define ORC_RESTRICT restrict\n"
     "typedef struct _OrcProgram OrcProgram;\n"
     "typedef struct _OrcExecutor OrcExecutor;\n"
     "#define ORC_N_VARIABLES 20\n"
@@ -67,6 +75,8 @@ orc_target_get_asm_preamble (const char *target)
     "#define ORC_CLAMP_UW(x) ORC_CLAMP(x,ORC_UW_MIN,ORC_SB_MAX)\n"
     "#define ORC_CLAMP_SL(x) ORC_CLAMP(x,ORC_SL_MIN,ORC_SB_MAX)\n"
     "#define ORC_CLAMP_UL(x) ORC_CLAMP(x,ORC_UL_MIN,ORC_SB_MAX)\n"
+    "#define ORC_SWAP_W(x) ((((x)&0xff)<<8) | (((x)&0xff00)>>8))\n"
+    "#define ORC_SWAP_L(x) ((((x)&0xff)<<24) | (((x)&0xff00)<<8) | (((x)&0xff0000)>>8) | (((x)&0xff000000)<<24))\n"
     "/* end Orc C target preamble */\n\n";
 }
 
@@ -97,14 +107,18 @@ orc_compiler_c_assemble (OrcCompiler *compiler)
         break;
       case ORC_VAR_TYPE_SRC:
       case ORC_VAR_TYPE_DEST:
-        ORC_ASM_CODE(compiler,"  %s *var%d = ex->arrays[%d];\n",
-            c_get_type_name (var->size), i, i);
+      case ORC_VAR_TYPE_ACCUMULATOR:
+        ORC_ASM_CODE(compiler,"  %s *%s var%d = ex->arrays[%d];\n",
+            c_get_type_name (var->size),
+            (compiler->target_flags & ORC_TARGET_C_C99) ? "restrict " : "",
+            i, i);
         break;
       case ORC_VAR_TYPE_PARAM:
         ORC_ASM_CODE(compiler,"  %s var%d = ex->arrays[%d];\n",
             c_get_type_name (var->size), i, i);
         break;
       default:
+        ORC_COMPILER_ERROR(compiler, "bad vartype");
         break;
     }
 
@@ -123,7 +137,7 @@ orc_compiler_c_assemble (OrcCompiler *compiler)
     if (rule) {
       rule->emit (compiler, rule->emit_user, insn);
     } else {
-      ORC_PROGRAM_ERROR(compiler,"No rule for: %s\n", opcode->name);
+      ORC_COMPILER_ERROR(compiler, "No rule for: %s\n", opcode->name);
       compiler->error = TRUE;
     }
   }
@@ -147,9 +161,11 @@ c_get_name (char *name, OrcCompiler *p, int var)
       break;
     case ORC_VAR_TYPE_SRC:
     case ORC_VAR_TYPE_DEST:
+    case ORC_VAR_TYPE_ACCUMULATOR:
       sprintf(name, "var%d[i]", var);
       break;
     default:
+      ORC_COMPILER_ERROR(p, "bad vartype");
       sprintf(name, "ERROR");
       break;
   }
@@ -165,6 +181,8 @@ c_get_type_name (int size)
       return "int16_t";
     case 4:
       return "int32_t";
+    case 8:
+      return "int64_t";
     default:
       return "ERROR";
   }
@@ -240,6 +258,40 @@ c_rule_ ## name (OrcCompiler *p, void *user, OrcInstruction *insn) \
 #undef UNARY_LW
 #undef UNARY_WB
 
+static void
+c_rule_accw (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+  char dest[20], src1[20];
+
+  c_get_name (dest, p, insn->dest_args[0]);
+  c_get_name (src1, p, insn->src_args[0]);
+
+  ORC_ASM_CODE(p,"    %s = %s + %s;\n", dest, dest, src1);
+}
+
+static void
+c_rule_accl (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+  char dest[20], src1[20];
+
+  c_get_name (dest, p, insn->dest_args[0]);
+  c_get_name (src1, p, insn->src_args[0]);
+
+  ORC_ASM_CODE(p,"    %s = %s + %s;\n", dest, dest, src1);
+}
+
+static void
+c_rule_accsadubl (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+  char dest[20], src1[20], src2[20];
+
+  c_get_name (dest, p, insn->dest_args[0]);
+  c_get_name (src1, p, insn->src_args[0]);
+  c_get_name (src2, p, insn->src_args[1]);
+
+  ORC_ASM_CODE(p,"    %s = %s + ORC_ABS(%s - %s);\n", dest, dest, src1, src2);
+}
+
 static OrcTarget c_target = {
   "c",
   TRUE,
@@ -281,5 +333,8 @@ orc_c_init (void)
 
 #include "opcodes.h"
 
+  orc_rule_register (rule_set, "accw", c_rule_accw, NULL);
+  orc_rule_register (rule_set, "accl", c_rule_accl, NULL);
+  orc_rule_register (rule_set, "accsadubl", c_rule_accsadubl, NULL);
 }
 
index 500aff6..12de717 100644 (file)
@@ -65,6 +65,15 @@ typedef void (*OrcRuleEmitFunc)(OrcCompiler *p, void *user, OrcInstruction *insn
   orc_debug_print(ORC_DEBUG_ERROR, __FILE__, ORC_FUNCTION, __LINE__, __VA_ARGS__); \
 } while (0)
 
+#define ORC_COMPILER_ERROR(compiler, ...) do { \
+  compiler->error = TRUE; \
+  orc_debug_print(ORC_DEBUG_ERROR, __FILE__, ORC_FUNCTION, __LINE__, __VA_ARGS__); \
+} while (0)
+
+enum {
+  ORC_TARGET_C_C99 = (1<<0)
+};
+
 enum {
   ORC_TARGET_SSE_SSE2 = (1<<0),
   ORC_TARGET_SSE_SSE3 = (1<<1),
index 6534d88..14f9f2a 100644 (file)
@@ -4,6 +4,7 @@
 #include <stdio.h>
 
 #include <orc/orc.h>
+#include <orc-test/orctest.h>
 
 
 int error = FALSE;
@@ -17,6 +18,7 @@ main (int argc, char *argv[])
   OrcOpcodeSet *opcode_set;
 
   orc_init();
+  orc_test_init();
 
   opcode_set = orc_opcode_set_get ("sys");
 
@@ -40,20 +42,10 @@ void
 test_opcode (OrcStaticOpcode *opcode)
 {
   OrcProgram *p;
-  char s[40];
   OrcCompileResult result;
 
-  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");
+  p = orc_test_get_program_for_opcode (opcode);
+  if (!p) return;
 
   result = orc_program_compile_for_target (p, orc_target_get_by_name("c"));
   if (!ORC_COMPILE_RESULT_IS_SUCCESSFUL(result)) {
index d7d1df1..5d96e70 100644 (file)
@@ -61,32 +61,9 @@ void
 test_opcode (OrcStaticOpcode *opcode)
 {
   OrcProgram *p;
-  char s[40];
-
-  if (opcode->flags & ORC_STATIC_OPCODE_ACCUMULATOR) {
-    if (opcode->src_size[1] == 0) {
-      p = orc_program_new_as (opcode->dest_size[0], opcode->src_size[0]);
-    } else {
-      p = orc_program_new_ass (opcode->dest_size[0], opcode->src_size[0],
-          opcode->src_size[1]);
-    }
-  } else {
-    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);
 
-  if (opcode->flags & ORC_STATIC_OPCODE_ACCUMULATOR) {
-    orc_program_append_str (p, opcode->name, "a1", "s1", "s2");
-  } else {
-    orc_program_append_str (p, opcode->name, "d1", "s1", "s2");
-  }
+  p = orc_test_get_program_for_opcode (opcode);
+  if (!p) return;
 
   orc_test_gcc_compile (p);
 
@@ -97,18 +74,10 @@ void
 test_opcode_const (OrcStaticOpcode *opcode)
 {
   OrcProgram *p;
-  char s[40];
   int ret;
 
-  if (opcode->src_size[1] == 0) return;
-
-  p = orc_program_new_ds (opcode->dest_size[0], opcode->src_size[0]);
-  orc_program_add_constant (p, opcode->src_size[1], 1, "c1");
-
-  sprintf(s, "test_const_%s", opcode->name);
-  orc_program_set_name (p, s);
-
-  orc_program_append_str (p, opcode->name, "d1", "s1", "c1");
+  p = orc_test_get_program_for_opcode_const (opcode);
+  if (!p) return;
 
   ret = orc_test_gcc_compile (p);
   if (!ret) {
@@ -122,18 +91,10 @@ void
 test_opcode_param (OrcStaticOpcode *opcode)
 {
   OrcProgram *p;
-  char s[40];
   int ret;
 
-  if (opcode->src_size[1] == 0) return;
-
-  p = orc_program_new_ds (opcode->dest_size[0], opcode->src_size[0]);
-  orc_program_add_parameter (p, opcode->src_size[1], "p1");
-
-  sprintf(s, "test_param_%s", opcode->name);
-  orc_program_set_name (p, s);
-
-  orc_program_append_str (p, opcode->name, "d1", "s1", "p1");
+  p = orc_test_get_program_for_opcode_param (opcode);
+  if (!p) return;
 
   ret = orc_test_gcc_compile (p);
   if (!ret) {