Various code generation fixes
authorDavid Schleef <ds@schleef.org>
Sun, 15 Mar 2009 06:42:34 +0000 (23:42 -0700)
committerDavid Schleef <ds@schleef.org>
Sun, 15 Mar 2009 06:42:34 +0000 (23:42 -0700)
orc/orcprogram-arm.c
orc/orcprogram-sse.c
orc/orcprogram.c
orc/x86.c
testsuite/Makefile.am
testsuite/test3.c [new file with mode: 0644]
testsuite/test4.c [new file with mode: 0644]

index 8bde93c..371dff5 100644 (file)
@@ -31,8 +31,8 @@ arm_emit_prologue (OrcProgram *program)
   unsigned int regs = 0;
   int i;
 
-  orc_program_append_code(program,".global _binary_dump_start\n");
-  orc_program_append_code(program,"_binary_dump_start:\n");
+  orc_program_append_code(program,".global %s\n", program->name);
+  orc_program_append_code(program,"%s:\n", program->name);
 
   for(i=0;i<16;i++){
     if (program->used_regs[ORC_GP_REG_BASE + i] &&
index 9c4e2a9..90f4c7a 100644 (file)
@@ -367,8 +367,7 @@ sse_emit_loop (OrcProgram *program)
       }
       rule->emit (program, rule->emit_user, insn);
     } else {
-      ORC_ASM_CODE(program,"No rule for: %s\n", opcode->name);
-      program->error = TRUE;
+      ORC_PROGRAM_ERROR(program,"No rule for: %s", opcode->name);
     }
 
     for(k=0;k<opcode->n_dest;k++){
index 7319664..7d5d375 100644 (file)
@@ -15,7 +15,19 @@ void orc_program_rewrite_vars (OrcProgram *program);
 void orc_program_rewrite_vars2 (OrcProgram *program);
 void orc_program_do_regs (OrcProgram *program);
 
+#if defined(HAVE_I386)
 int _orc_default_target = ORC_TARGET_SSE;
+#elif defined(HAVE_AMD64)
+int _orc_default_target = ORC_TARGET_SSE;
+#elif defined(HAVE_ARM)
+int _orc_default_target = ORC_TARGET_ARM;
+#elif defined(HAVE_POWERPC)
+int _orc_default_target = ORC_TARGET_ALTIVEC;
+#else
+int _orc_default_target = ORC_TARGET_C;
+#endif
+
+
 
 OrcProgram *
 orc_program_new (void)
@@ -348,7 +360,10 @@ orc_program_compile (OrcProgram *program)
   }
 
   orc_program_assign_rules (program);
+  if (program->error) goto error;
+
   orc_program_rewrite_vars (program);
+  if (program->error) goto error;
 
   if (program->target != ORC_TARGET_C) {
     orc_program_global_reg_alloc (program);
@@ -357,6 +372,7 @@ orc_program_compile (OrcProgram *program)
   }
 
   orc_program_rewrite_vars2 (program);
+  if (program->error) goto error;
 
   if (program->target != ORC_TARGET_C) {
     orc_program_allocate_codemem (program);
@@ -381,14 +397,12 @@ orc_program_compile (OrcProgram *program)
     default:
       break;
   }
+  if (program->error) goto error;
 
-  orc_program_dump_code (program);
-
-  if (program->error) {
-    ORC_ERROR("program failed to compile");
-    return FALSE;
-  }
   return TRUE;
+error:
+  ORC_ERROR("program failed to compile");
+  return FALSE;
 }
 
 void
@@ -400,6 +414,10 @@ orc_program_assign_rules (OrcProgram *program)
     OrcInstruction *insn = program->insns + i;
 
     insn->rule = insn->opcode->rules + program->target;
+
+    if (insn->rule == NULL || insn->rule->emit == NULL) {
+      ORC_PROGRAM_ERROR(program, "No rule for: %s", insn->opcode->name);
+    }
   }
 }
 
index 8a5fb86..ef45c4d 100644 (file)
--- a/orc/x86.c
+++ b/orc/x86.c
@@ -956,8 +956,8 @@ x86_do_fixups (OrcProgram *program)
 void
 x86_emit_prologue (OrcProgram *program)
 {
-  orc_program_append_code(program,".global _binary_dump_start\n");
-  orc_program_append_code(program,"_binary_dump_start:\n");
+  orc_program_append_code(program,".global %s\n", program->name);
+  orc_program_append_code(program,"%s:\n", program->name);
   if (x86_64) {
     int i;
     for(i=0;i<16;i++){
index 0289c6c..30aaefd 100644 (file)
@@ -1,7 +1,7 @@
 
-TESTS = test1 test2
+TESTS = test1 test2 test3 test4
 
-noinst_PROGRAMS = test1 test2
+noinst_PROGRAMS = test1 test2 test3 test4
 
 AM_CFLAGS = $(ORC_CFLAGS)
 LIBS = $(ORC_LIBS)
diff --git a/testsuite/test3.c b/testsuite/test3.c
new file mode 100644 (file)
index 0000000..81dd927
--- /dev/null
@@ -0,0 +1,64 @@
+
+#include "config.h"
+
+#include <stdio.h>
+
+#include <orc/orc.h>
+
+
+int error = FALSE;
+
+void test_opcode (const char *name);
+
+int
+main (int argc, char *argv[])
+{
+  int i;
+  OrcOpcode *opcode_list;
+  int n_opcodes;
+
+  orc_init();
+
+  n_opcodes = orc_opcode_get_list (&opcode_list);
+
+  //printf("%s", orc_target_get_asm_preamble (ORC_TARGET_C));
+
+  for(i=0;i<n_opcodes;i++){
+    printf("/* %s %d %d %p */\n",
+        opcode_list[i].name,
+        opcode_list[i].n_src,
+        opcode_list[i].n_dest,
+        opcode_list[i].emulate
+        );
+    test_opcode (opcode_list[i].name);
+  }
+
+  if (error) return 1;
+  return 0;
+}
+
+void
+test_opcode (const char *name)
+{
+  OrcProgram *p;
+  char s[40];
+  int ret;
+
+  p = orc_program_new_dss (2,2,2);
+
+  sprintf(s, "test_%s", name);
+  orc_program_set_name (p, s);
+
+  orc_program_append_str (p, name, "d1", "s1", "s2");
+
+  ret = orc_program_compile (p);
+  if (!ret) {
+    error = TRUE;
+  }
+
+  printf("%s", orc_program_get_asm_code (p));
+
+  orc_program_free (p);
+}
+
+
diff --git a/testsuite/test4.c b/testsuite/test4.c
new file mode 100644 (file)
index 0000000..9ada233
--- /dev/null
@@ -0,0 +1,66 @@
+
+#include "config.h"
+
+#include <stdio.h>
+
+#include <orc/orc.h>
+
+
+int error = FALSE;
+
+void test_opcode (const char *name);
+
+int
+main (int argc, char *argv[])
+{
+  int i;
+  OrcOpcode *opcode_list;
+  int n_opcodes;
+
+  orc_init();
+
+  n_opcodes = orc_opcode_get_list (&opcode_list);
+
+  //printf("%s", orc_target_get_asm_preamble (ORC_TARGET_C));
+
+  for(i=0;i<n_opcodes;i++){
+    printf("/* %s %d %d %p */\n",
+        opcode_list[i].name,
+        opcode_list[i].n_src,
+        opcode_list[i].n_dest,
+        opcode_list[i].emulate
+        );
+    test_opcode (opcode_list[i].name);
+  }
+
+  if (error) return 1;
+  return 0;
+}
+
+void
+test_opcode (const char *name)
+{
+  OrcProgram *p;
+  char s[40];
+  int ret;
+
+  p = orc_program_new_dss (2,2,2);
+
+  sprintf(s, "test_%s", name);
+  orc_program_set_name (p, s);
+
+  orc_program_append_str (p, name, "d1", "s1", "s2");
+
+  ret = orc_program_compile_for_target (p, ORC_TARGET_ARM);
+  if (!ret) {
+    error = TRUE;
+    goto out;
+  }
+
+  printf("%s", orc_program_get_asm_code (p));
+
+out:
+  orc_program_free (p);
+}
+
+