#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 *********************************************************************
}
-/* 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
}
-/* 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.
*(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;
}
#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