* src/vm/jit/powerpc/arch.h: We have leaf-method optimization in place.
authorMichael Starzinger <michi@complang.tuwien.ac.at>
Tue, 3 Nov 2009 18:15:49 +0000 (19:15 +0100)
committerMichael Starzinger <michi@complang.tuwien.ac.at>
Tue, 3 Nov 2009 18:15:49 +0000 (19:15 +0100)
* src/vm/jit/powerpc/md.c (md_patch_replacement_point): Fixed.
* src/vm/jit/replace.cpp: Fixed replacement for big-endian 32-bit machines.

src/vm/jit/powerpc/arch.h
src/vm/jit/powerpc/md.c
src/vm/jit/replace.cpp

index 6e0f1fce58f313191cdd64be9082dffd0f1a375c..978f1facdbddaeebd3e3199cfb0b9d4b6ce89a67 100644 (file)
 
 #define STACKFRMAE_RA_BETWEEN_FRAMES              0
 #define STACKFRAME_RA_TOP_OF_FRAME                0
-#define STACKFRAME_LEAFMETHODS_RA_REGISTER        0
+#define STACKFRAME_LEAFMETHODS_RA_REGISTER        1
 #define STACKFRAME_SYNC_NEEDS_TWO_SLOTS           1
 
 
index 2c9333b359d38a2a5fff55cdf66c43f18ef17603..ee362634644c1892e6b39e200a1c569b3dc79b7d 100644 (file)
@@ -240,8 +240,8 @@ void md_patch_replacement_point(u1 *pc, u1 *savedmcode, bool revert)
                /* save the current machine code */
                *(u4*)(savedmcode) = *(u4*)(pc);
 
-               /* build the machine code for the patch */
-               assert(0); /* XXX build trap instruction below */
+               // Build the machine code for the patch. On PowerPC we use
+               // an illegal instruction which really is just 0, believe me!
                mcode = 0;
 
                /* write the new machine code */
index 395ad1d792236b20551798082333a4bb6e322454..12f1ba9e3ece34eb149190ac7aed3c6914791808 100644 (file)
@@ -1531,7 +1531,7 @@ void md_pop_stackframe(executionstate_t *es)
 # if STACKFRAME_LEAFMETHODS_RA_REGISTER
        if (!code_is_leafmethod(es->code))
 # endif
-               es->ra = (u1*) (ptrint) basesp[LA_LR_OFFSET / sizeof(stackslot_t)];
+               es->ra = *((uint8_t**) ((intptr_t) basesp + LA_LR_OFFSET));
 #endif /* REPLACE_RA_LINKAGE_AREA */
 
        /* restore saved int registers */
@@ -1540,7 +1540,8 @@ void md_pop_stackframe(executionstate_t *es)
        for (i=0; i<es->code->savedintcount; ++i) {
                while (nregdescint[--reg] != REG_SAV)
                        ;
-               es->intregs[reg] = *--basesp;
+               basesp -= 1;
+               es->intregs[reg] = *((uintptr_t*) basesp);
        }
 
        /* restore saved flt registers */
@@ -1551,7 +1552,7 @@ void md_pop_stackframe(executionstate_t *es)
                while (nregdescfloat[--reg] != REG_SAV)
                        ;
                basesp -= STACK_SLOTS_PER_FLOAT;
-               es->fltregs[reg] = *(double*)basesp;
+               es->fltregs[reg] = *((double*) basesp);
        }
 
 #if defined(HAS_ADDRESS_REGISTER_FILE)
@@ -1561,7 +1562,8 @@ void md_pop_stackframe(executionstate_t *es)
        for (i=0; i<es->code->savedadrcount; ++i) {
                while (nregdescadr[--reg] != REG_SAV)
                        ;
-               es->adrregs[reg] = *--basesp;
+               basesp -= 1;
+               es->adrregs[reg] = *((uintptr_t*) basesp);
        }
 #endif
 
@@ -1677,7 +1679,7 @@ void md_push_stackframe(executionstate_t *es, codeinfo *calleecode, u1 *ra)
 # if STACKFRAME_LEAFMETHODS_RA_REGISTER
        if (!code_is_leafmethod(calleecode))
 # endif
-               basesp[LA_LR_OFFSET / sizeof(stackslot_t)] = (ptrint) ra;
+               *((uint8_t**) ((intptr_t) basesp + LA_LR_OFFSET)) = ra;
 #endif /* REPLACE_RA_LINKAGE_AREA */
 
        /* save int registers */
@@ -1686,7 +1688,8 @@ void md_push_stackframe(executionstate_t *es, codeinfo *calleecode, u1 *ra)
        for (i=0; i<calleecode->savedintcount; ++i) {
                while (nregdescint[--reg] != REG_SAV)
                        ;
-               *--basesp = es->intregs[reg];
+               basesp -= 1;
+               *((uintptr_t*) basesp) = es->intregs[reg];
 
                /* XXX may not clobber saved regs used by native code! */
 #if !defined(NDEBUG) && 0
@@ -1702,7 +1705,7 @@ void md_push_stackframe(executionstate_t *es, codeinfo *calleecode, u1 *ra)
                while (nregdescfloat[--reg] != REG_SAV)
                        ;
                basesp -= STACK_SLOTS_PER_FLOAT;
-               *(double*)basesp = es->fltregs[reg];
+               *((double*) basesp) = es->fltregs[reg];
 
                /* XXX may not clobber saved regs used by native code! */
 #if !defined(NDEBUG) && 0
@@ -1717,7 +1720,8 @@ void md_push_stackframe(executionstate_t *es, codeinfo *calleecode, u1 *ra)
        for (i=0; i<calleecode->savedadrcount; ++i) {
                while (nregdescadr[--reg] != REG_SAV)
                        ;
-               *--basesp = es->adrregs[reg];
+               basesp -= 1;
+               *((uintptr_t*) basesp) = es->adrregs[reg];
 
                /* XXX may not clobber saved regs used by native code! */
 #if !defined(NDEBUG) && 0
@@ -1768,7 +1772,7 @@ u1* replace_pop_activation_record(executionstate_t *es,
        frame->syncslotcount = count;
        frame->syncslots = (replace_val_t*) DumpMemory::allocate(sizeof(replace_val_t) * count);
        for (i=0; i<count; ++i) {
-               frame->syncslots[i].p = sp[es->code->memuse + i]; /* XXX md_ function */
+               frame->syncslots[i].p = *((intptr_t*) (sp + es->code->memuse + i)); /* XXX md_ function */
        }
 
        /* pop the stackframe */
@@ -2096,7 +2100,7 @@ void replace_push_activation_record(executionstate_t *es,
        count = code_get_sync_slot_count(calleecode);
        assert(count == calleeframe->syncslotcount);
        for (i=0; i<count; ++i) {
-               sp[calleecode->memuse + i] = calleeframe->syncslots[i].p;
+               *((intptr_t*) (sp + calleecode->memuse + i)) = calleeframe->syncslots[i].p;
        }
 
        /* redirect future invocations */