Move common x86 code to x86.c
authorDavid Schleef <ds@schleef.org>
Sun, 8 Mar 2009 23:51:21 +0000 (16:51 -0700)
committerDavid Schleef <ds@schleef.org>
Sun, 8 Mar 2009 23:51:21 +0000 (16:51 -0700)
orc/orcprogram-mmx.c
orc/orcprogram-sse.c
orc/x86.c
orc/x86.h

index 8c677ee..aa61c82 100644 (file)
@@ -24,64 +24,6 @@ void orc_program_rewrite_vars (OrcProgram *program);
 void orc_program_dump (OrcProgram *program);
 
 void
-mmx_emit_prologue (OrcProgram *program)
-{
-  orc_program_append_code(program,".global test\n");
-  orc_program_append_code(program,"test:\n");
-  if (x86_64) {
-
-  } else {
-    x86_emit_push (program, 4, X86_EBP);
-    x86_emit_mov_memoffset_reg (program, 4, 8, X86_ESP, X86_EBP);
-    if (program->used_regs[X86_EDI]) {
-      x86_emit_push (program, 4, X86_EDI);
-    }
-    if (program->used_regs[X86_ESI]) {
-      x86_emit_push (program, 4, X86_ESI);
-    }
-    if (program->used_regs[X86_EBX]) {
-      x86_emit_push (program, 4, X86_EBX);
-    }
-  }
-}
-
-void
-mmx_emit_epilogue (OrcProgram *program)
-{
-  x86_emit_emms (program);
-
-  if (x86_64) {
-
-  } else {
-    if (program->used_regs[X86_EBX]) {
-      x86_emit_pop (program, 4, X86_EBX);
-    }
-    if (program->used_regs[X86_ESI]) {
-      x86_emit_pop (program, 4, X86_ESI);
-    }
-    if (program->used_regs[X86_EDI]) {
-      x86_emit_pop (program, 4, X86_EDI);
-    }
-    x86_emit_pop (program, 4, X86_EBP);
-  }
-  x86_emit_ret (program);
-}
-
-void
-mmx_do_fixups (OrcProgram *program)
-{
-  int i;
-  for(i=0;i<program->n_fixups;i++){
-    if (program->fixups[i].type == 0) {
-      unsigned char *label = program->labels[program->fixups[i].label];
-      unsigned char *ptr = program->fixups[i].ptr;
-
-      ptr[0] += label - ptr;
-    }
-  }
-}
-
-void
 orc_mmx_init (void)
 {
   orc_program_mmx_register_rules ();
@@ -221,7 +163,7 @@ mmx_emit_store_dest (OrcProgram *program, OrcVariable *var)
 void
 orc_program_mmx_assemble (OrcProgram *program)
 {
-  mmx_emit_prologue (program);
+  x86_emit_prologue (program);
 
   x86_emit_mov_memoffset_reg (program, 4, (int)ORC_STRUCT_OFFSET(OrcExecutor,n),
       x86_exec_ptr, X86_ECX);
@@ -271,9 +213,10 @@ orc_program_mmx_assemble (OrcProgram *program)
   x86_emit_jne (program, 2);
   x86_emit_label (program, 3);
 
-  mmx_emit_epilogue (program);
+  x86_emit_emms (program);
+  x86_emit_epilogue (program);
 
-  mmx_do_fixups (program);
+  x86_do_fixups (program);
 }
 
 void
index 6950bfb..445ee1c 100644 (file)
@@ -25,76 +25,6 @@ void orc_program_rewrite_vars (OrcProgram *program);
 void orc_program_dump (OrcProgram *program);
 
 void
-sse_emit_prologue (OrcProgram *program)
-{
-  orc_program_append_code(program,".global _binary_dump_start\n");
-  orc_program_append_code(program,"_binary_dump_start:\n");
-  if (x86_64) {
-
-  } else {
-    x86_emit_push (program, 4, X86_EBP);
-    x86_emit_mov_memoffset_reg (program, 4, 8, X86_ESP, X86_EBP);
-    if (program->used_regs[X86_EDI]) {
-      x86_emit_push (program, 4, X86_EDI);
-    }
-    if (program->used_regs[X86_ESI]) {
-      x86_emit_push (program, 4, X86_ESI);
-    }
-    if (program->used_regs[X86_EBX]) {
-      x86_emit_push (program, 4, X86_EBX);
-    }
-  }
-}
-
-void
-sse_emit_epilogue (OrcProgram *program)
-{
-  if (x86_64) {
-
-  } else {
-    if (program->used_regs[X86_EBX]) {
-      x86_emit_pop (program, 4, X86_EBX);
-    }
-    if (program->used_regs[X86_ESI]) {
-      x86_emit_pop (program, 4, X86_ESI);
-    }
-    if (program->used_regs[X86_EDI]) {
-      x86_emit_pop (program, 4, X86_EDI);
-    }
-    x86_emit_pop (program, 4, X86_EBP);
-  }
-  x86_emit_ret (program);
-}
-
-void
-sse_do_fixups (OrcProgram *program)
-{
-  int i;
-  for(i=0;i<program->n_fixups;i++){
-    if (program->fixups[i].type == 0) {
-      unsigned char *label = program->labels[program->fixups[i].label];
-      unsigned char *ptr = program->fixups[i].ptr;
-      int diff;
-
-      diff = ((int8_t)ptr[0]) + (label - ptr);
-      if (diff != (int8_t)diff) {
-        ORC_WARNING("short jump too long");
-        program->error = TRUE;
-      }
-
-      ptr[0] = diff;
-    } else if (program->fixups[i].type == 1) {
-      unsigned char *label = program->labels[program->fixups[i].label];
-      unsigned char *ptr = program->fixups[i].ptr;
-      int diff;
-
-      diff = ORC_READ_UINT32_LE (ptr) + (label - ptr);
-      ORC_WRITE_UINT32_LE(ptr, diff);
-    }
-  }
-}
-
-void
 orc_sse_init (void)
 {
   orc_program_sse_register_rules ();
@@ -266,7 +196,7 @@ orc_program_sse_assemble (OrcProgram *program)
 
   program->vars[dest_var].is_aligned = FALSE;
 
-  sse_emit_prologue (program);
+  x86_emit_prologue (program);
 
   if (program->loop_shift > 0) {
 
@@ -382,9 +312,9 @@ orc_program_sse_assemble (OrcProgram *program)
     program->loop_shift = save_loop_shift;
   }
 
-  sse_emit_epilogue (program);
+  x86_emit_epilogue (program);
 
-  sse_do_fixups (program);
+  x86_do_fixups (program);
 }
 
 void
index 593c52b..3e7313a 100644 (file)
--- a/orc/x86.c
+++ b/orc/x86.c
@@ -10,6 +10,8 @@
 
 #include <orc/orcprogram.h>
 #include <orc/x86.h>
+#include <orc/orcdebug.h>
+#include <orc/orcutils.h>
 
 #ifdef HAVE_AMD64
 int x86_64 = 1;
@@ -226,7 +228,6 @@ x86_emit_rex (OrcProgram *program, int size, int reg1, int reg2, int reg3)
     if (reg3 == 1 || (x86_get_regnum(reg3)>=8)) rex |= 0x1;
 
     if (rex != 0x40) *program->codeptr++ = rex;
-    //*program->codeptr++ = rex;
   }
 }
 
@@ -925,6 +926,76 @@ void x86_emit_label (OrcProgram *program, int label)
 }
 
 void
+x86_do_fixups (OrcProgram *program)
+{
+  int i;
+  for(i=0;i<program->n_fixups;i++){
+    if (program->fixups[i].type == 0) {
+      unsigned char *label = program->labels[program->fixups[i].label];
+      unsigned char *ptr = program->fixups[i].ptr;
+      int diff;
+
+      diff = ((int8_t)ptr[0]) + (label - ptr);
+      if (diff != (int8_t)diff) {
+        ORC_WARNING("short jump too long");
+        program->error = TRUE;
+      }
+
+      ptr[0] = diff;
+    } else if (program->fixups[i].type == 1) {
+      unsigned char *label = program->labels[program->fixups[i].label];
+      unsigned char *ptr = program->fixups[i].ptr;
+      int diff;
+
+      diff = ORC_READ_UINT32_LE (ptr) + (label - ptr);
+      ORC_WRITE_UINT32_LE(ptr, diff);
+    }
+  }
+}
+
+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");
+  if (x86_64) {
+
+  } else {
+    x86_emit_push (program, 4, X86_EBP);
+    x86_emit_mov_memoffset_reg (program, 4, 8, X86_ESP, X86_EBP);
+    if (program->used_regs[X86_EDI]) {
+      x86_emit_push (program, 4, X86_EDI);
+    }
+    if (program->used_regs[X86_ESI]) {
+      x86_emit_push (program, 4, X86_ESI);
+    }
+    if (program->used_regs[X86_EBX]) {
+      x86_emit_push (program, 4, X86_EBX);
+    }
+  }
+}
+
+void
+x86_emit_epilogue (OrcProgram *program)
+{
+  if (x86_64) {
+
+  } else {
+    if (program->used_regs[X86_EBX]) {
+      x86_emit_pop (program, 4, X86_EBX);
+    }
+    if (program->used_regs[X86_ESI]) {
+      x86_emit_pop (program, 4, X86_ESI);
+    }
+    if (program->used_regs[X86_EDI]) {
+      x86_emit_pop (program, 4, X86_EDI);
+    }
+    x86_emit_pop (program, 4, X86_EBP);
+  }
+  x86_emit_ret (program);
+}
+
+void
 x86_emit_align (OrcProgram *program)
 {
   int diff;
index e32d538..199cf67 100644 (file)
--- a/orc/x86.h
+++ b/orc/x86.h
@@ -50,6 +50,9 @@ void x86_emit_jne (OrcProgram *program, int label);
 void x86_emit_jmp (OrcProgram *program, int label);
 void x86_emit_label (OrcProgram *program, int label);
 void x86_emit_align (OrcProgram *program);
+void x86_do_fixups (OrcProgram *program);
+void x86_emit_prologue (OrcProgram *program);
+void x86_emit_epilogue (OrcProgram *program);
 
 void x86_emit_rex (OrcProgram *program, int size, int reg1, int reg2, int reg3);
 void x86_emit_modrm_memoffset (OrcProgram *program, int reg1, int offset, int reg2);