* src/vm/jit/jit.c: Moved to .cpp.
[cacao.git] / src / vm / jit / powerpc64 / md.c
index 8517ab5e61ff8582d4be7c4cdca24573df2391d5..15b564227e38b010872290989fd36e2874bfdd83 100644 (file)
 #include "md-abi.h"
 
 #include "vm/jit/powerpc64/codegen.h"
+#include "vm/jit/powerpc64/md.h"
 
-#include "vm/exceptions.h"
 #include "vm/global.h"
 
-#include "vm/jit/asmpart.h"
-#include "vm/jit/codegen-common.h"
-#include "vm/jit/jit.h"
-#include "vm/jit/md.h"
+#include "vm/jit/jit.hpp"
+#include "vm/jit/trap.h"
 
 
 /* md_init *********************************************************************
@@ -57,65 +55,6 @@ void md_init(void)
 }
 
 
-/* md_stacktrace_get_returnaddress *********************************************
-
-   Returns the return address of the current stackframe, specified by
-   the passed stack pointer and the stack frame size.
-
-*******************************************************************************/
-
-u1 *md_stacktrace_get_returnaddress(u1 *sp, u4 framesize)
-{
-       u1 *ra;
-
-       /* on PowerPC the return address is located in the linkage area */
-
-       ra = *((u1 **) (sp + framesize + LA_LR_OFFSET));
-
-       return ra;
-}
-
-/* md_codegen_patch_branch *****************************************************
-
-   Back-patches a branch instruction.
-   Changes the dispacment of the jump instruction.
-
-*******************************************************************************/
-
-void md_codegen_patch_branch(codegendata *cd, s4 branchmpc, s4 targetmpc)
-{
-       s4 *mcodeptr;
-       s4  disp;                           /* branch displacement                */
-       s4  mcode;              
-
-       /* calculate the patch position */
-       mcodeptr = (s4 *) (cd->mcodebase + branchmpc);
-
-       /* Calculate the branch displacement. */
-       disp = targetmpc - branchmpc + 4;
-       mcode = mcodeptr[-1];
-
-       if ((mcode & 0xfc000000) == 0x40000000) {
-               /* conditional jump bcx */
-               if ((disp < (s4) 0xffff8000) || (disp > (s4) 0x00007fff))
-                       vm_abort("jump displacement is out of range: %d > +/-%d", disp, 0x00007fff);
-
-               mcode &= 0xffff0000;
-               mcode |= (((disp)& M_BCMASK));
-       } else if ((mcode & 0xfc000000) == 0x48000000) {
-               /* unconditional jump bx */
-               if ((disp < (s4) 0xfc000000) || (disp > (s4) 0x03ffffff))
-                       vm_abort("jump displacement is out of range: %d > +/-%d", disp, 0x0cffffff);
-               mcode &= 0xfc000000;
-               mcode |= (((disp)& M_BMASK));
-       } else {
-               vm_abort("md_codegen_patch_branch, patching unsupported branch: %xd", mcode);
-       }
-
-       mcodeptr[-1] = mcode;
-}
-
-
 /* md_jit_method_patch_address *************************************************
 
    Gets the patch address of the currently compiled method. The offset
@@ -218,106 +157,6 @@ void *md_jit_method_patch_address(void *pv, void *ra, void *mptr)
 }
 
 
-/* md_codegen_get_pv_from_pc ***************************************************
-
-   Machine code:
-
-   7d6802a6    mflr    r11
-   39cbffe0    addi    r14,r11,-32
-
-   or
-
-   7d6802a6    mflr    r11
-   3dcbffff    addis   r14,r11,-1
-   39ce68b0    addi    r14,r13,26800
-
-*******************************************************************************/
-
-u1 *md_codegen_get_pv_from_pc(u1 *ra)
-{
-       u1 *pv;
-       u4  mcode;
-       s4  offset;
-
-       /* get first instruction word after jump */
-
-       mcode = *((u4 *) (ra + 1 * 4));
-
-       /* check if we have 2 instructions (addis, addi) */
-
-       if ((mcode >> 16) == 0x3dcb) {
-               /* get displacement of first instruction (addis) */
-
-               offset = (s4) (mcode << 16);
-
-               /* get displacement of second instruction (addi) */
-
-               mcode = *((u4 *) (ra + 2 * 4));
-
-               /* check for addi instruction */
-
-               assert((mcode >> 16) == 0x39ce);
-
-               offset += (s2) (mcode & 0x0000ffff);
-       }
-       else if ((mcode >> 16) == 0x39cb) {
-               /* get offset of first instruction (addi) */
-
-               offset = (s2) (mcode & 0x0000ffff);
-       }
-       else {
-               vm_abort("md_codegen_get_pv_from_pc: unknown instruction %x", mcode);
-
-               /* keep compiler happy */
-
-               offset = 0;
-       }
-
-       /* calculate PV via RA + offset */
-
-       pv = ra + offset;
-
-       return pv;
-}
-
-
-/* md_cacheflush ***************************************************************
-
-   Calls the system's function to flush the instruction and data
-   cache.
-
-*******************************************************************************/
-
-void md_cacheflush(u1 *addr, s4 nbytes)
-{
-       asm_cacheflush(addr, nbytes);
-}
-
-
-/* md_icacheflush **************************************************************
-
-   Calls the system's function to flush the instruction cache.
-
-*******************************************************************************/
-
-void md_icacheflush(u1 *addr, s4 nbytes)
-{
-       asm_cacheflush(addr, nbytes);
-}
-
-
-/* md_dcacheflush **************************************************************
-
-   Calls the system's function to flush the data cache.
-
-*******************************************************************************/
-
-void md_dcacheflush(u1 *addr, s4 nbytes)
-{
-       asm_cacheflush(addr, nbytes);
-}
-
-
 /* md_patch_replacement_point **************************************************
 
    Patch the given replacement point.
@@ -338,7 +177,7 @@ void md_patch_replacement_point(u1 *pc, u1 *savedmcode, bool revert)
                *(u4*)(savedmcode) = *(u4*)(pc);
 
                /* build the machine code for the patch */
-               mcode = (0x80000000 | (EXCEPTION_HARDWARE_PATCHER));
+               mcode = (0x80000000 | TRAP_PATCHER);
 
                /* write the new machine code */
                *(u4*)(pc) = (u4) mcode;
@@ -349,6 +188,7 @@ void md_patch_replacement_point(u1 *pc, u1 *savedmcode, bool revert)
 }
 #endif /* defined(ENABLE_REPLACEMENT) */
 
+
 /*
  * These are local overrides for various environment variables in Emacs.
  * Please do not remove this and leave it at the end of the file, where