X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fmips%2Fmd.c;h=d675d64ceddc7b5fc5c28c93211d639038e42855;hb=9f859ad50d3d5d98c185d40b86b2179bc4dc9aeb;hp=9b48914cfdd8008efb74f093d32b812393e4c776;hpb=f7db226e3c71ac938141af3bbf0102154a5cedd1;p=cacao.git diff --git a/src/vm/jit/mips/md.c b/src/vm/jit/mips/md.c index 9b48914cf..d675d64ce 100644 --- a/src/vm/jit/mips/md.c +++ b/src/vm/jit/mips/md.c @@ -22,8 +22,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - $Id: md.c 7252 2007-01-29 21:09:01Z twisti $ - */ @@ -40,6 +38,7 @@ #include "vm/global.h" #include "vm/vm.h" +#include "vm/jit/codegen-common.h" /* REMOVEME: only for codegendata */ #include "vm/jit/stacktrace.h" #if !defined(NDEBUG) && defined(ENABLE_DISASSEMBLER) @@ -48,63 +47,6 @@ #endif -/* md_codegen_patch_branch ***************************************************** - - Back-patches a branch instruction. - -*******************************************************************************/ - -void md_codegen_patch_branch(codegendata *cd, s4 branchmpc, s4 targetmpc) -{ - s4 *mcodeptr; - s4 mcode; - s4 disp; /* branch displacement */ - s4 lo; - s4 hi; - - /* calculate the patch position */ - - mcodeptr = (s4 *) (cd->mcodebase + branchmpc); - - /* get the instruction before the exception point */ - - mcode = mcodeptr[-1]; - - /* check for: ori t9,t9,0 */ - - if ((mcode >> 16) == 0x3739) { - /* Calculate the branch displacement. For jumps we need a - displacement relative to PV. */ - - disp = targetmpc; - - lo = (short) disp; - hi = (short) ((disp - lo) >> 16); - - /* patch the two instructions before the mcodeptr */ - - mcodeptr[-2] |= (hi & 0x0000ffff); - mcodeptr[-1] |= (lo & 0x0000ffff); - } - else { - /* Calculate the branch displacement. For branches we need a - displacement relative and shifted to the branch PC. */ - - disp = (targetmpc - branchmpc) >> 2; - - /* On the MIPS we can only branch signed 16-bit instruction words - (signed 18-bit = 32KB = +/- 16KB). Check this! */ - - if ((disp < (s4) 0xffff8000) || (disp > (s4) 0x00007fff)) - vm_abort("jump displacement is out of range: %d > +/-%d", disp, 0x00007fff); - - /* patch the branch instruction before the mcodeptr */ - - mcodeptr[-1] |= (disp & 0x0000ffff); - } -} - - /* md_stacktrace_get_returnaddress ********************************************* Returns the return address of the current stackframe, specified by @@ -343,7 +285,6 @@ void md_dcacheflush(u1 *addr, s4 nbytes) void md_patch_replacement_point(codeinfo *code, s4 index, rplpoint *rp, u1 *savedmcode) { - s4 disp; union { u8 both; u4 words[2]; @@ -357,19 +298,9 @@ void md_patch_replacement_point(codeinfo *code, s4 index, rplpoint *rp, /* save the current machine code */ *(u8*)(savedmcode) = *(u8*)(rp->pc); - /* make machine code for patching */ - - disp = ((u4*)code->replacementstubs - (u4*)rp->pc) - + index * REPLACEMENT_STUB_SIZE - - 1; - - if ((disp < (s4) 0xffff8000) || (disp > (s4) 0x00007fff)) - vm_abort("Jump offset is out of range: %d > +/-%d", - disp, 0x00007fff); - - /* BR */ - mcode.words[0] = (((0x04) << 26) | ((0) << 21) | ((0) << 16) | ((disp) & 0xffff)); - mcode.words[1] = 0; /* NOP in delay slot */ + /* build the machine code for the patch */ + assert(0); /* XXX build trap instruction below */ + mcode.both = 0; /* write the new machine code */ *(u8*)(rp->pc) = mcode.both;