Changes: Christian Thalinger
Edwin Steiner
- $Id: asmpart.S 6147 2006-12-07 23:54:40Z edwin $
+ $Id: asmpart.S 6154 2006-12-08 00:16:21Z edwin $
*/
mflr itmp3
/* save registers in execution state */
- stw r0 ,( 0*8+4+offes_intregs)(sp)
- stw r1 ,( 1*8+4+offes_intregs)(sp)
- stw r2 ,( 2*8+4+offes_intregs)(sp)
- stw r3 ,( 3*8+4+offes_intregs)(sp)
- stw r4 ,( 4*8+4+offes_intregs)(sp)
- stw r5 ,( 5*8+4+offes_intregs)(sp)
- stw r6 ,( 6*8+4+offes_intregs)(sp)
- stw r7 ,( 7*8+4+offes_intregs)(sp)
- stw r8 ,( 8*8+4+offes_intregs)(sp)
- stw r9 ,( 9*8+4+offes_intregs)(sp)
- stw r10,(10*8+4+offes_intregs)(sp)
- stw r11,(11*8+4+offes_intregs)(sp)
- stw r12,(12*8+4+offes_intregs)(sp)
- stw r13,(13*8+4+offes_intregs)(sp)
- stw r14,(14*8+4+offes_intregs)(sp)
- stw r15,(15*8+4+offes_intregs)(sp)
- stw r16,(16*8+4+offes_intregs)(sp) /* link register stored as itmp3 */
- stw r17,(17*8+4+offes_intregs)(sp)
- stw r18,(18*8+4+offes_intregs)(sp)
- stw r19,(19*8+4+offes_intregs)(sp)
- stw r20,(20*8+4+offes_intregs)(sp)
- stw r21,(21*8+4+offes_intregs)(sp)
- stw r22,(22*8+4+offes_intregs)(sp)
- stw r23,(23*8+4+offes_intregs)(sp)
- stw r24,(24*8+4+offes_intregs)(sp)
- stw r25,(25*8+4+offes_intregs)(sp)
- stw r26,(26*8+4+offes_intregs)(sp)
- stw r27,(27*8+4+offes_intregs)(sp)
- stw r28,(28*8+4+offes_intregs)(sp)
- stw r29,(29*8+4+offes_intregs)(sp)
- stw r30,(30*8+4+offes_intregs)(sp)
- stw r31,(31*8+4+offes_intregs)(sp)
+ stw r0 ,( 0*4+offes_intregs)(sp)
+ stw r1 ,( 1*4+offes_intregs)(sp)
+ stw r2 ,( 2*4+offes_intregs)(sp)
+ stw r3 ,( 3*4+offes_intregs)(sp)
+ stw r4 ,( 4*4+offes_intregs)(sp)
+ stw r5 ,( 5*4+offes_intregs)(sp)
+ stw r6 ,( 6*4+offes_intregs)(sp)
+ stw r7 ,( 7*4+offes_intregs)(sp)
+ stw r8 ,( 8*4+offes_intregs)(sp)
+ stw r9 ,( 9*4+offes_intregs)(sp)
+ stw r10,(10*4+offes_intregs)(sp)
+ stw r11,(11*4+offes_intregs)(sp)
+ stw r12,(12*4+offes_intregs)(sp)
+ stw r13,(13*4+offes_intregs)(sp)
+ stw r14,(14*4+offes_intregs)(sp)
+ stw r15,(15*4+offes_intregs)(sp)
+ stw r16,(16*4+offes_intregs)(sp) /* link register stored as itmp3 */
+ stw r17,(17*4+offes_intregs)(sp)
+ stw r18,(18*4+offes_intregs)(sp)
+ stw r19,(19*4+offes_intregs)(sp)
+ stw r20,(20*4+offes_intregs)(sp)
+ stw r21,(21*4+offes_intregs)(sp)
+ stw r22,(22*4+offes_intregs)(sp)
+ stw r23,(23*4+offes_intregs)(sp)
+ stw r24,(24*4+offes_intregs)(sp)
+ stw r25,(25*4+offes_intregs)(sp)
+ stw r26,(26*4+offes_intregs)(sp)
+ stw r27,(27*4+offes_intregs)(sp)
+ stw r28,(28*4+offes_intregs)(sp)
+ stw r29,(29*4+offes_intregs)(sp)
+ stw r30,(30*4+offes_intregs)(sp)
+ stw r31,(31*4+offes_intregs)(sp)
stfd fr0 ,( 0*8+offes_fltregs)(sp)
stfd fr1 ,( 1*8+offes_fltregs)(sp)
lwz pv,(offes_pv)(sp)
/* copy registers from execution state */
- lwz r0 ,( 0*8+4+offes_intregs)(sp)
- /* r1 is sp */
- /* r2 is reserved */
- lwz a0 ,( 3*8+4+offes_intregs)(sp)
- lwz r4 ,( 4*8+4+offes_intregs)(sp)
- lwz r5 ,( 5*8+4+offes_intregs)(sp)
- lwz r6 ,( 6*8+4+offes_intregs)(sp)
- lwz r7 ,( 7*8+4+offes_intregs)(sp)
- lwz r8 ,( 8*8+4+offes_intregs)(sp)
- lwz r9 ,( 9*8+4+offes_intregs)(sp)
- lwz r10,(10*8+4+offes_intregs)(sp)
- lwz r11,(11*8+4+offes_intregs)(sp)
- lwz r12,(12*8+4+offes_intregs)(sp)
- /* r13 is pv */
- lwz r14,(14*8+4+offes_intregs)(sp)
- lwz r15,(15*8+4+offes_intregs)(sp)
- lwz r16,(16*8+4+offes_intregs)(sp) /* itmp3, later to link register */
- lwz r17,(17*8+4+offes_intregs)(sp)
- lwz r18,(18*8+4+offes_intregs)(sp)
- lwz r19,(19*8+4+offes_intregs)(sp)
- lwz r20,(20*8+4+offes_intregs)(sp)
- lwz r21,(21*8+4+offes_intregs)(sp)
- lwz r22,(22*8+4+offes_intregs)(sp)
- lwz r23,(23*8+4+offes_intregs)(sp)
- lwz r24,(24*8+4+offes_intregs)(sp)
- lwz r25,(25*8+4+offes_intregs)(sp)
- lwz r26,(26*8+4+offes_intregs)(sp)
- lwz r27,(27*8+4+offes_intregs)(sp)
- lwz r28,(28*8+4+offes_intregs)(sp)
- lwz r29,(29*8+4+offes_intregs)(sp)
- lwz r30,(30*8+4+offes_intregs)(sp)
- lwz r31,(31*8+4+offes_intregs)(sp)
+ lwz r0 ,( 0*4+offes_intregs)(sp)
+ /* r1 is sp */
+ /* r2 is reserved */
+ lwz a0 ,( 3*4+offes_intregs)(sp)
+ lwz r4 ,( 4*4+offes_intregs)(sp)
+ lwz r5 ,( 5*4+offes_intregs)(sp)
+ lwz r6 ,( 6*4+offes_intregs)(sp)
+ lwz r7 ,( 7*4+offes_intregs)(sp)
+ lwz r8 ,( 8*4+offes_intregs)(sp)
+ lwz r9 ,( 9*4+offes_intregs)(sp)
+ lwz r10,(10*4+offes_intregs)(sp)
+ lwz r11,(11*4+offes_intregs)(sp)
+ lwz r12,(12*4+offes_intregs)(sp)
+ /* r13 is pv */
+ lwz r14,(14*4+offes_intregs)(sp)
+ lwz r15,(15*4+offes_intregs)(sp)
+ lwz r16,(16*4+offes_intregs)(sp) /* itmp3, later to link register */
+ lwz r17,(17*4+offes_intregs)(sp)
+ lwz r18,(18*4+offes_intregs)(sp)
+ lwz r19,(19*4+offes_intregs)(sp)
+ lwz r20,(20*4+offes_intregs)(sp)
+ lwz r21,(21*4+offes_intregs)(sp)
+ lwz r22,(22*4+offes_intregs)(sp)
+ lwz r23,(23*4+offes_intregs)(sp)
+ lwz r24,(24*4+offes_intregs)(sp)
+ lwz r25,(25*4+offes_intregs)(sp)
+ lwz r26,(26*4+offes_intregs)(sp)
+ lwz r27,(27*4+offes_intregs)(sp)
+ lwz r28,(28*4+offes_intregs)(sp)
+ lwz r29,(29*4+offes_intregs)(sp)
+ lwz r30,(30*4+offes_intregs)(sp)
+ lwz r31,(31*4+offes_intregs)(sp)
lfd fr0 ,( 0*8+offes_fltregs)(sp)
lfd fr1 ,( 1*8+offes_fltregs)(sp)
/*#define REPLACE_VERBOSE*/
#if !defined(NDEBUG)
-static void java_value_print(s4 type, u8 value);
+static void java_value_print(s4 type, replace_val_t value);
#endif /* !defined(NDEBUG) */
#if !defined(NDEBUG) && defined(REPLACE_VERBOSE)
static void replace_read_value(executionstate_t *es,
stackslot_t *sp,
rplalloc *ra,
- u8 *javaval)
+ replace_val_t *javaval)
{
if (ra->flags & INMEMORY) {
/* XXX HAS_4BYTE_STACKSLOT may not be the right discriminant here */
#ifdef HAS_4BYTE_STACKSLOT
if (IS_2_WORD_TYPE(ra->type)) {
- *javaval = *(u8*)(sp + ra->regoff);
+ javaval->l = *(u8*)(sp + ra->regoff);
}
else {
#endif
- *javaval = sp[ra->regoff];
+ javaval->p = sp[ra->regoff];
#ifdef HAS_4BYTE_STACKSLOT
}
#endif
else {
/* allocated register */
if (IS_FLT_DBL_TYPE(ra->type)) {
- *javaval = es->fltregs[ra->regoff];
+ javaval->d = es->fltregs[ra->regoff];
+
+ if (ra->type == TYPE_FLT)
+ javaval->f = javaval->d;
}
else {
- *javaval = es->intregs[ra->regoff];
+#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
+ if (ra->type == TYPE_LNG) {
+ javaval->words.lo = es->intregs[GET_LOW_REG(ra->regoff)];
+ javaval->words.hi = es->intregs[GET_HIGH_REG(ra->regoff)];
+ }
+ else
+#endif /* defined(SUPPORT_COMBINE_INTEGER_REGISTERS) */
+ javaval->p = es->intregs[ra->regoff];
}
}
}
static void replace_write_value(executionstate_t *es,
stackslot_t *sp,
rplalloc *ra,
- u8 *javaval)
+ replace_val_t *javaval)
{
if (ra->flags & INMEMORY) {
/* XXX HAS_4BYTE_STACKSLOT may not be the right discriminant here */
#ifdef HAS_4BYTE_STACKSLOT
if (IS_2_WORD_TYPE(ra->type)) {
- *(u8*)(sp + ra->regoff) = *javaval;
+ *(u8*)(sp + ra->regoff) = javaval->l;
}
else {
#endif
- sp[ra->regoff] = *javaval;
+ sp[ra->regoff] = javaval->p;
#ifdef HAS_4BYTE_STACKSLOT
}
#endif
}
else {
/* allocated register */
- if (IS_FLT_DBL_TYPE(ra->type)) {
- es->fltregs[ra->regoff] = *javaval;
- }
- else {
- es->intregs[ra->regoff] = *javaval;
+ switch (ra->type) {
+ case TYPE_FLT:
+ es->fltregs[ra->regoff] = (double) javaval->f;
+ break;
+ case TYPE_DBL:
+ es->fltregs[ra->regoff] = javaval->d;
+ break;
+#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
+ case TYPE_LNG:
+ es->intregs[GET_LOW_REG(ra->regoff)] = javaval->words.lo;
+ es->intregs[GET_HIGH_REG(ra->regoff)] = javaval->words.hi;
+ break;
+#endif
+ default:
+ es->intregs[ra->regoff] = javaval->p;
}
}
}
frame->id = rp->id;
assert(rp->type >= 0 && rp->type < sizeof(replace_normalize_type_map)/sizeof(s4));
frame->type = replace_normalize_type_map[rp->type];
- frame->instance = 0;
+ frame->instance.a = NULL;
frame->syncslotcount = 0;
frame->syncslots = NULL;
frame->fromrp = rp;
count = m->maxlocals;
frame->javalocalcount = count;
- frame->javalocals = DMNEW(u8, count);
+ frame->javalocals = DMNEW(replace_val_t, count);
frame->javalocaltype = DMNEW(u1, count);
#if !defined(NDEBUG)
/* mark values as undefined */
for (i=0; i<count; ++i) {
- frame->javalocals[i] = (u8) 0x00dead0000dead00ULL;
+ frame->javalocals[i].l = (u8) 0x00dead0000dead00ULL;
frame->javalocaltype[i] = TYPE_VOID;
}
/* some entries in the intregs array are not meaningful */
/*es->intregs[REG_ITMP3] = (u8) 0x11dead1111dead11ULL;*/
- es->intregs[REG_SP ] = (u8) 0x11dead1111dead11ULL;
+ es->intregs[REG_SP ] = (ptrint) 0x11dead1111dead11ULL;
#ifdef REG_PV
- es->intregs[REG_PV ] = (u8) 0x11dead1111dead11ULL;
+ es->intregs[REG_PV ] = (ptrint) 0x11dead1111dead11ULL;
#endif
#endif /* !defined(NDEBUG) */
assert(i < m->maxlocals);
frame->javalocaltype[i] = ra->type;
if (ra->type == TYPE_RET)
- frame->javalocals[i] = ra->regoff;
+ frame->javalocals[i].i = ra->regoff;
else
replace_read_value(es, sp, ra, frame->javalocals + i);
ra++;
/* read stack slots */
frame->javastackdepth = count;
- frame->javastack = DMNEW(u8, count);
+ frame->javastack = DMNEW(replace_val_t, count);
frame->javastacktype = DMNEW(u1, count);
#if !defined(NDEBUG)
/* mark values as undefined */
for (i=0; i<count; ++i) {
- frame->javastack[i] = (u8) 0x00dead0000dead00ULL;
+ frame->javastack[i].l = (u8) 0x00dead0000dead00ULL;
frame->javastacktype[i] = TYPE_VOID;
}
#endif /* !defined(NDEBUG) */
assert(count);
assert(ra->index == RPLALLOC_STACK);
- frame->javastack[i] = sp[-1];
+ assert(ra->type == TYPE_ADR);
+ frame->javastack[i].p = sp[-1];
frame->javastacktype[i] = TYPE_ADR; /* XXX RET */
count--;
i++;
assert(count);
assert(ra->index == RPLALLOC_STACK);
- frame->javastack[i] = es->intregs[REG_ITMP1];
+ assert(ra->type == TYPE_ADR);
+ frame->javastack[i].p = es->intregs[REG_ITMP1];
frame->javastacktype[i] = TYPE_ADR; /* XXX RET */
count--;
i++;
assert(count);
assert(ra->index == RPLALLOC_STACK);
- frame->javastack[i] = 0;
+ frame->javastack[i].l = 0;
frame->javastacktype[i] = TYPE_VOID;
count--;
i++;
assert(calleeframe->syncslots == NULL);
calleeframe->syncslotcount = 1;
- calleeframe->syncslots = DMNEW(u8, 1);
+ calleeframe->syncslots = DMNEW(replace_val_t, 1);
replace_read_value(es,sp,ra,calleeframe->syncslots);
}
}
else {
if (ra->type == TYPE_RET)
- frame->javastack[i] = ra->regoff;
+ frame->javastack[i].i = ra->regoff;
else
replace_read_value(es,sp,ra,frame->javastack + i);
frame->javastacktype[i] = ra->type;
assert(ra->index == RPLALLOC_STACK);
assert(i < frame->javastackdepth);
assert(frame->javastacktype[i] == TYPE_ADR);
- sp[-1] = frame->javastack[i];
+ sp[-1] = frame->javastack[i].p;
count--;
i++;
ra++;
assert(ra->index == RPLALLOC_STACK);
assert(i < frame->javastackdepth);
assert(frame->javastacktype[i] == TYPE_ADR);
- es->intregs[REG_ITMP1] = frame->javastack[i];
+ es->intregs[REG_ITMP1] = frame->javastack[i].p;
count--;
i++;
ra++;
assert(frame->syncslots == NULL);
count = code_get_sync_slot_count(es->code);
frame->syncslotcount = count;
- frame->syncslots = DMNEW(u8, count);
+ frame->syncslots = DMNEW(replace_val_t, count);
for (i=0; i<count; ++i) {
- frame->syncslots[i] = sp[es->code->memuse + i];
+ frame->syncslots[i].p = sp[es->code->memuse + i]; /* XXX */
}
/* restore return address, if part of frame */
while (nregdescfloat[--reg] != REG_SAV)
;
basesp -= STACK_SLOTS_PER_FLOAT;
- es->fltregs[reg] = *(u8*)basesp;
+ es->fltregs[reg] = *(double*)basesp;
}
/* Set the new pc. Subtract one so we do not hit the replacement point */
&& (i != REPLACE_REG_RA)
#endif
)
- es->intregs[i] = 0x33dead3333dead33ULL;
+ es->intregs[i] = (ptrint) 0x33dead3333dead33ULL;
for (i=0; i<FLT_REG_CNT; ++i)
if (nregdescfloat[i] != REG_SAV)
- es->fltregs[i] = 0x33dead3333dead33ULL;
+ *(u8*)&(es->fltregs[i]) = 0x33dead3333dead33ULL;
#endif /* !defined(NDEBUG) */
return ra;
/* we need to know the instance */
- if (!calleeframe->instance) {
+ if (!calleeframe->instance.a) {
DOLOG_SHORT( printf("WARNING: object instance unknown!\n"); );
return;
}
/* get the vftbl */
- obj = (java_objectheader *) (ptrint) calleeframe->instance;
+ obj = calleeframe->instance.a;
vftbl = obj->vftbl;
assert(vftbl->class->vftbl == vftbl);
#endif /* REPLACE_RA_BETWEEN_FRAMES */
#if defined(REPLACE_REG_RA)
- es->intregs[REPLACE_REG_RA] = (u8) (ptrint) ra;
+ es->intregs[REPLACE_REG_RA] = (ptrint) ra;
#endif
/* we move into a new code unit */
*--basesp = es->intregs[reg];
#if !defined(NDEBUG)
- es->intregs[reg] = 0x44dead4444dead44ULL;
+ es->intregs[reg] = (ptrint) 0x44dead4444dead44ULL;
#endif
}
while (nregdescfloat[--reg] != REG_SAV)
;
basesp -= STACK_SLOTS_PER_FLOAT;
- *(u8*)basesp = es->fltregs[reg];
+ *(double*)basesp = es->fltregs[reg];
#if !defined(NDEBUG)
- es->fltregs[reg] = 0x44dead4444dead44ULL;
+ *(u8*)&(es->fltregs[reg]) = 0x44dead4444dead44ULL;
#endif
}
count = code_get_sync_slot_count(calleecode);
assert(count == calleeframe->syncslotcount);
for (i=0; i<count; ++i) {
- sp[calleecode->memuse + i] = calleeframe->syncslots[i];
+ sp[calleecode->memuse + i] = calleeframe->syncslots[i].p;
}
/* set the PV */
if (ra->type == TYPE_RET) {
if (ra->index == RPLALLOC_STACK) {
assert(stacki < frame->javastackdepth);
- if (frame->javastack[stacki] != ra->regoff)
+ if (frame->javastack[stacki].i != ra->regoff)
goto no_match;
stacki++;
}
else {
assert(ra->index >= 0 && ra->index < frame->javalocalcount);
- if (frame->javalocals[ra->index] != ra->regoff)
+ if (frame->javalocals[ra->index].i != ra->regoff)
goto no_match;
}
}
#endif
#if !defined(NDEBUG)
-static void java_value_print(s4 type, u8 value)
+static void java_value_print(s4 type, replace_val_t value)
{
java_objectheader *obj;
utf *u;
- printf("%016llx",(unsigned long long) value);
+ printf("%016llx",(unsigned long long) value.l);
if (type < 0 || type > TYPE_RET)
printf(" <INVALID TYPE:%d>", type);
else
printf(" %s", show_jit_type_names[type]);
- if (type == TYPE_ADR && value != 0) {
- obj = (java_objectheader *) (ptrint) value;
+ if (type == TYPE_ADR && value.a != NULL) {
+ obj = value.a;
putchar(' ');
utf_display_printable_ascii_classname(obj->vftbl->class->name);
printf("\"");
}
}
- else if (type == TYPE_INT || type == TYPE_LNG) {
- printf(" %lld", (long long) value);
+ else if (type == TYPE_INT) {
+ printf(" %ld", (long) value.i);
+ }
+ else if (type == TYPE_LNG) {
+ printf(" %lld", (long long) value.l);
+ }
+ else if (type == TYPE_FLT) {
+ printf(" %f", value.f);
+ }
+ else if (type == TYPE_DBL) {
+ printf(" %f", value.d);
}
}
#endif /* !defined(NDEBUG) */
printf("\ttype: %s\n", replace_type_str[frame->type]);
printf("\n");
- if (frame->instance) {
+ if (frame->instance.a) {
printf("\tinstance: ");
java_value_print(TYPE_ADR, frame->instance);
printf("\n");
for (i=0; i<frame->syncslotcount; ++i) {
printf("\tslot[%2d] = ",i);
#ifdef HAS_4BYTE_STACKSLOT
- printf("%08lx\n",(unsigned long) frame->syncslots[i]);
+ printf("%08lx\n",(unsigned long) frame->syncslots[i].p);
#else
- printf("%016llx\n",(unsigned long long) frame->syncslots[i]);
+ printf("%016llx\n",(unsigned long long) frame->syncslots[i].p);
#endif
}
printf("\n");