Improve errors, use long jumps on x86
authorDavid Schleef <ds@schleef.org>
Tue, 7 Apr 2009 03:33:03 +0000 (20:33 -0700)
committerDavid Schleef <ds@schleef.org>
Tue, 7 Apr 2009 03:37:33 +0000 (20:37 -0700)
orc/orccodemem.c
orc/orcprogram-sse.c
orc/x86.c

index b8659aa..a533893 100644 (file)
@@ -26,8 +26,7 @@ orc_compiler_allocate_codemem (OrcCompiler *compiler)
   fd = mkstemp (filename);
   if (fd == -1) {
     /* FIXME oh crap */
-    ORC_ERROR ("failed to create temp file");
-    compiler->error = TRUE;
+    ORC_PROGRAM_ERROR (compiler, "failed to create temp file");
     return;
   }
   unlink (filename);
index ad42361..5d94a34 100644 (file)
@@ -108,6 +108,8 @@ orc_compiler_sse_init (OrcCompiler *compiler)
           orc_program_get_max_var_size (compiler->program));
       break;
   }
+
+  compiler->long_jumps = TRUE;
 }
 
 void
index bda38d7..6a365d7 100644 (file)
--- a/orc/x86.c
+++ b/orc/x86.c
@@ -151,7 +151,7 @@ x86_emit_push (OrcCompiler *compiler, int size, int reg)
 {
 
   if (size == 1) {
-    compiler->error = 1;
+    ORC_PROGRAM_ERROR(compiler, "bad size");
   } else if (size == 2) {
     ORC_ASM_CODE(compiler,"  pushw %%%s\n", x86_get_regname_16(reg));
     *compiler->codeptr++ = 0x66;
@@ -167,7 +167,7 @@ x86_emit_pop (OrcCompiler *compiler, int size, int reg)
 {
 
   if (size == 1) {
-    compiler->error = 1;
+    ORC_PROGRAM_ERROR(compiler, "bad size");
   } else if (size == 2) {
     ORC_ASM_CODE(compiler,"  popw %%%s\n", x86_get_regname_16(reg));
     *compiler->codeptr++ = 0x66;
@@ -869,7 +869,12 @@ void x86_emit_jmp (OrcCompiler *compiler, int label)
       (compiler->labels[label]!=NULL) ? 'b' : 'f');
 
   if (compiler->long_jumps) {
-    ORC_PROGRAM_ERROR(compiler, "unimplemented");
+    *compiler->codeptr++ = 0xe9;
+    x86_add_fixup (compiler, compiler->codeptr, label, 1);
+    *compiler->codeptr++ = 0xfc;
+    *compiler->codeptr++ = 0xff;
+    *compiler->codeptr++ = 0xff;
+    *compiler->codeptr++ = 0xff;
   } else {
     *compiler->codeptr++ = 0xeb;
     x86_add_fixup (compiler, compiler->codeptr, label, 0);
@@ -883,7 +888,13 @@ void x86_emit_jle (OrcCompiler *compiler, int label)
       (compiler->labels[label]!=NULL) ? 'b' : 'f');
 
   if (compiler->long_jumps) {
-    ORC_PROGRAM_ERROR(compiler, "unimplemented");
+    *compiler->codeptr++ = 0x0f;
+    *compiler->codeptr++ = 0x8e;
+    x86_add_fixup (compiler, compiler->codeptr, label, 1);
+    *compiler->codeptr++ = 0xfc;
+    *compiler->codeptr++ = 0xff;
+    *compiler->codeptr++ = 0xff;
+    *compiler->codeptr++ = 0xff;
   } else {
     *compiler->codeptr++ = 0x7e;
     x86_add_fixup (compiler, compiler->codeptr, label, 0);
@@ -950,8 +961,7 @@ x86_do_fixups (OrcCompiler *compiler)
 
       diff = ((int8_t)ptr[0]) + (label - ptr);
       if (diff != (int8_t)diff) {
-        ORC_WARNING("short jump too long");
-        compiler->error = TRUE;
+        ORC_PROGRAM_ERROR(compiler, "short jump too long");
       }
 
       ptr[0] = diff;