* Merged in twisti-branch.
[cacao.git] / src / vm / jit / i386 / md.c
index 47a9ddf6a1db1fee4a2ba24cc5d857cf98b8e019..d083a042d438305e397165be3511d4ef313032b5 100644 (file)
@@ -1,6 +1,6 @@
 /* src/vm/jit/i386/md.c - machine dependent i386 functions
 
-   Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
    C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
    E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
    J. Wenninger, Institut f. Computersprachen - TU Wien
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Contact: cacao@cacaojvm.org
-
-   Authors: Christian Thalinger
-            Edwin Steiner
-
-   $Id: md.c 6140 2006-12-07 22:45:09Z edwin $
+   $Id: md.c 7571 2007-03-24 22:37:09Z twisti $
 
 */
 
 #include "vm/types.h"
 
 #include "vm/global.h"
+
 #include "vm/jit/asmpart.h"
 #include "vm/jit/codegen-common.h"
+#include "vm/jit/md.h"
 
 #if !defined(NDEBUG) && defined(ENABLE_DISASSEMBLER)
-#include "vm/options.h" /* XXX debug */
+#include "vmcore/options.h" /* XXX debug */
 #include "vm/jit/disass.h" /* XXX debug */
 #endif
 
@@ -60,34 +57,6 @@ void md_init(void)
 }
 
 
-/* md_codegen_patch_branch *****************************************************
-
-   Back-patches a branch instruction.
-
-*******************************************************************************/
-
-void md_codegen_patch_branch(codegendata *cd, s4 branchmpc, s4 targetmpc)
-{
-       s4 *mcodeptr;
-       s4  disp;                           /* branch displacement                */
-
-       /* calculate the patch position */
-
-       mcodeptr = (s4 *) (cd->mcodebase + branchmpc);
-
-       /* Calculate the branch displacement. */
-
-       disp = targetmpc - branchmpc;
-
-       /* I don't think we have to check for branch-displacement
-          overflow, +/-2GB should be enough. */
-
-       /* patch the branch instruction before the mcodeptr */
-
-       mcodeptr[-1] = disp;
-}
-
-
 /* md_stacktrace_get_returnaddress *********************************************
 
    Returns the return address of the current stackframe, specified by
@@ -248,27 +217,46 @@ void md_dcacheflush(u1 *addr, s4 nbytes)
 
 *******************************************************************************/
 
-void md_patch_replacement_point(rplpoint *rp)
+#if defined(ENABLE_REPLACEMENT)
+void md_patch_replacement_point(codeinfo *code, s4 index, rplpoint *rp, u1 *savedmcode)
 {
-    u8 mcode;
+       s4 disp;
+       u8 mcode;
 
        /* XXX this is probably unsafe! */
 
-       /* save the current machine code */
-       mcode = *(u8*)rp->pc;
+       if (index < 0) {
+               /* write spinning instruction */
+               *(u2*)(rp->pc) = 0xebfe;
+
+               /* write 5th byte */
+               rp->pc[4] = savedmcode[4];
 
-       /* write spinning instruction */
-       *(u2*)(rp->pc) = 0xebfe;
+               /* write first word */
+               *(u4*)(rp->pc) = *(u4*)(savedmcode);
+       }
+       else {
+               /* save the current machine code */
+               *(u4*)(savedmcode) = *(u4*)(rp->pc);
+               savedmcode[4] = rp->pc[4];
+
+               /* build the machine code for the patch */
+               disp = (code->replacementstubs - rp->pc)
+                          + index * REPLACEMENT_STUB_SIZE
+                          - 5;
 
-       /* write 5th byte */
-       rp->pc[4] = (rp->mcode >> 32);
+               mcode = 0xe9 | ((u8) disp << 8);
 
-       /* write first word */
-    *(u4*)(rp->pc) = (u4) rp->mcode;
+               /* write spinning instruction */
+               *(u2*)(rp->pc) = 0xebfe;
+
+               /* write 5th byte */
+               rp->pc[4] = (mcode >> 32);
+
+               /* write first word */
+               *(u4*)(rp->pc) = (u4) mcode;
+       }
 
-       /* store saved mcode */
-       rp->mcode = mcode;
-       
 #if !defined(NDEBUG) && defined(ENABLE_DISASSEMBLER) && 0
        {
                u1* u1ptr = rp->pc;
@@ -279,6 +267,7 @@ void md_patch_replacement_point(rplpoint *rp)
                        
     /* XXX if required asm_cacheflush(rp->pc,8); */
 }
+#endif /* defined(ENABLE_REPLACEMENT) */
 
 /*
  * These are local overrides for various environment variables in Emacs.