Michael Starzinger
Edwin Steiner
- $Id: simplereg.c 5404 2006-09-07 13:29:05Z christian $
+ $Id: simplereg.c 5406 2006-09-07 14:00:39Z christian $
*/
return true;
}
-#if defined(NEW_VAR)
/* interface_regalloc **********************************************************
Allocates registers for all interface variables.
if (intregsneeded)
v->regoff=PACK_REGS(
rd->savintregs[rd->savintreguse],
- rd->savintregs[rd->savintreguse + 1]);
- else
-#endif
- v->regoff =
- rd->savintregs[rd->savintreguse];
- }
- else {
- v->flags |= INMEMORY;
-#if defined(ALIGN_LONGS_IN_MEMORY)
- /* Align longs in Memory */
- if ( (memneeded) && (rd->memuse & 1))
- rd->memuse++;
-#endif
- v->regoff = rd->memuse;
- rd->memuse += memneeded + 1;
- }
-
- intalloc = jd->interface_map[s * 5 + t];
- } /* if (IS_FLT_DBL_TYPE(t)) */
- }
- } else { /* (saved) */
-/* now the same like above, but without a chance to take a temporary register */
-#ifdef HAS_ADDRESS_REGISTER_FILE
- if (IS_ADR_TYPE(t)) {
- if (rd->savadrreguse > 0) {
- v->regoff = rd->savadrregs[--rd->savadrreguse];
- }
- else {
- v->flags |= INMEMORY;
- v->regoff = rd->memuse++;
- }
- } else
-#endif
- {
- if (IS_FLT_DBL_TYPE(t)) {
- if (fltalloc >= 0) {
- v->flags |= jd->var[fltalloc].flags & INMEMORY;
- v->regoff = jd->var[fltalloc].regoff;
- } else
- if (rd->savfltreguse > 0) {
- v->regoff =
- rd->savfltregs[--rd->savfltreguse];
- }
- else {
- v->flags |= INMEMORY;
-#if defined(ALIGN_DOUBLES_IN_MEMORY)
- /* Align doubles in Memory */
- if ( (memneeded) && (rd->memuse & 1))
- rd->memuse++;
-#endif
- v->regoff = rd->memuse;
- rd->memuse += memneeded + 1;
- }
- fltalloc = jd->interface_map[s * 5 + t];
- }
- else { /* IS_INT_LNG */
-#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
- /*
- * for i386 put all longs in memory
- */
- if (IS_2_WORD_TYPE(t)) {
- v->flags |= INMEMORY;
-#if defined(ALIGN_LONGS_IN_MEMORY)
- /* Align longs in Memory */
- if (rd->memuse & 1)
- rd->memuse++;
-#endif
- v->regoff = rd->memuse;
- rd->memuse += memneeded + 1;
- } else
-#endif
- {
- if (intalloc >= 0) {
- v->flags |= jd->var[intalloc].flags
- & INMEMORY;
-#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
- if (!(v->flags & INMEMORY)
- && IS_2_WORD_TYPE(jd->var[intalloc].type))
- v->regoff =
- GET_LOW_REG(
- jd->var[intalloc].regoff);
- else
-#endif
- v->regoff =
- jd->var[intalloc].regoff;
- } else {
- if (rd->savintreguse > intregsneeded) {
- rd->savintreguse -= intregsneeded + 1;
-#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
- if (intregsneeded)
- v->regoff = PACK_REGS(
- rd->savintregs[rd->savintreguse],
- rd->savintregs[rd->savintreguse + 1]);
- else
-#endif
- v->regoff =
- rd->savintregs[rd->savintreguse];
- } else {
- v->flags |= INMEMORY;
-#if defined(ALIGN_LONGS_IN_MEMORY)
- /* Align longs in Memory */
- if ( (memneeded) && (rd->memuse & 1))
- rd->memuse++;
-#endif
- v->regoff = rd->memuse;
- rd->memuse += memneeded + 1;
- }
- }
- intalloc = t;
- }
- } /* if (IS_FLT_DBL_TYPE(t) else */
- } /* if (IS_ADR_TYPE(t)) else */
- } /* if (saved) else */
- /* if (type >= 0) */
- } /* for t */
- } /* for s */
-}
-#else
-/* interface_regalloc **********************************************************
-
- Allocates registers for all interface variables.
-
-*******************************************************************************/
-
-static void interface_regalloc(jitdata *jd)
-{
- methodinfo *m;
- codegendata *cd;
- registerdata *rd;
-
- int s, t, tt, saved;
- int intalloc, fltalloc; /* Remember allocated Register/Memory offset */
- /* in case a more vars are packed into this interface slot */
- varinfo *v;
- int intregsneeded = 0;
- int memneeded = 0;
- /* allocate LNG and DBL Types first to ensure 2 memory slots or registers */
- /* on HAS_4BYTE_STACKSLOT architectures */
- int typeloop[] = { TYPE_LNG, TYPE_DBL, TYPE_INT, TYPE_FLT, TYPE_ADR };
-
- /* get required compiler data */
-
- m = jd->m;
- cd = jd->cd;
- rd = jd->rd;
-
- /* rd->memuse was already set in stack.c to allocate stack space
- for passing arguments to called methods. */
-
-#if defined(__I386__)
- if (checksync && (m->flags & ACC_SYNCHRONIZED)) {
- /* reserve 0(%esp) for Monitorenter/exit Argument on i386 */
- if (rd->memuse < 1)
- rd->memuse = 1;
- }
-#endif
-
- if (jd->isleafmethod) {
- /* Reserve argument register, which will be used for Locals acting */
- /* as Parameters */
- if (rd->argintreguse < m->parseddesc->argintreguse)
- rd->argintreguse = m->parseddesc->argintreguse;
- if (rd->argfltreguse < m->parseddesc->argfltreguse)
- rd->argfltreguse = m->parseddesc->argfltreguse;
-#ifdef HAS_ADDRESS_REGISTER_FILE
- if (rd->argadrreguse < m->parseddesc->argadrreguse)
- rd->argadrreguse = m->parseddesc->argadrreguse;
-#endif
-
- }
-
- for (s = 0; s < cd->maxstack; s++) {
- intalloc = -1; fltalloc = -1;
- saved = (rd->interfaces[s][TYPE_INT].flags |
- rd->interfaces[s][TYPE_LNG].flags |
- rd->interfaces[s][TYPE_FLT].flags |
- rd->interfaces[s][TYPE_DBL].flags |
- rd->interfaces[s][TYPE_ADR].flags) & SAVEDVAR;
-
- for (tt = 0; tt <= 4; tt++) {
- t = typeloop[tt];
- v = &rd->interfaces[s][t];
- if (v->type >= 0) {
-#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
- intregsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
-#endif
-#if defined(HAS_4BYTE_STACKSLOT)
- memneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
-#endif
- if (!saved) {
-#if defined(HAS_ADDRESS_REGISTER_FILE)
- if (IS_ADR_TYPE(t)) {
- if (!jd->isleafmethod
- &&(rd->argadrreguse < ADR_ARG_CNT)) {
- v->regoff = rd->argadrregs[rd->argadrreguse++];
- } else if (rd->tmpadrreguse > 0) {
- v->regoff = rd->tmpadrregs[--rd->tmpadrreguse];
- } else if (rd->savadrreguse > 0) {
- v->regoff = rd->savadrregs[--rd->savadrreguse];
- } else {
- v->flags |= INMEMORY;
- v->regoff = rd->memuse++;
- }
- } else /* !IS_ADR_TYPE */
-#endif /* defined(HAS_ADDRESS_REGISTER_FILE) */
- {
- if (IS_FLT_DBL_TYPE(t)) {
- if (fltalloc >= 0) {
- /* Reuse memory slot(s)/register(s) for shared interface slots */
- v->flags |= rd->interfaces[s][fltalloc].flags
- & INMEMORY;
- v->regoff = rd->interfaces[s][fltalloc].regoff;
- } else if (rd->argfltreguse < FLT_ARG_CNT) {
- v->regoff = rd->argfltregs[rd->argfltreguse++];
- } else if (rd->tmpfltreguse > 0) {
- v->regoff = rd->tmpfltregs[--rd->tmpfltreguse];
- } else if (rd->savfltreguse > 0) {
- v->regoff = rd->savfltregs[--rd->savfltreguse];
- } else {
- v->flags |= INMEMORY;
-#if defined(ALIGN_DOUBLES_IN_MEMORY)
- /* Align doubles in Memory */
- if ( (memneeded) && (rd->memuse & 1))
- rd->memuse++;
-#endif
- v->regoff = rd->memuse;
- rd->memuse += memneeded + 1;
- }
- fltalloc = t;
- } else { /* !IS_FLT_DBL_TYPE(t) */
-#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
- /*
- * for i386 put all longs in memory
- */
- if (IS_2_WORD_TYPE(t)) {
- v->flags |= INMEMORY;
-#if defined(ALIGN_LONGS_IN_MEMORY)
- /* Align longs in Memory */
- if (rd->memuse & 1)
- rd->memuse++;
-#endif
- v->regoff = rd->memuse;
- rd->memuse += memneeded + 1;
- } else
-#endif /* defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE...GISTERS) */
- if (intalloc >= 0) {
- /* Reuse memory slot(s)/register(s) for shared interface slots */
- v->flags |=
- rd->interfaces[s][intalloc].flags
- & INMEMORY;
-#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
- if (!(v->flags & INMEMORY)
- && IS_2_WORD_TYPE(intalloc))
- v->regoff = GET_LOW_REG(
- rd->interfaces[s][intalloc].regoff);
- else
-#endif
- v->regoff =
- rd->interfaces[s][intalloc].regoff;
- } else
- if (rd->argintreguse + intregsneeded
- < INT_ARG_CNT) {
-#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
- if (intregsneeded)
- v->regoff=PACK_REGS(
- rd->argintregs[rd->argintreguse],
- rd->argintregs[rd->argintreguse + 1]);
- else
-#endif
- v->regoff =
- rd->argintregs[rd->argintreguse];
- rd->argintreguse += intregsneeded + 1;
- }
- else if (rd->tmpintreguse > intregsneeded) {
- rd->tmpintreguse -= intregsneeded + 1;
-#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
- if (intregsneeded)
- v->regoff=PACK_REGS(
- rd->tmpintregs[rd->tmpintreguse],
- rd->tmpintregs[rd->tmpintreguse + 1]);
- else
-#endif
- v->regoff =
- rd->tmpintregs[rd->tmpintreguse];
- }
- else if (rd->savintreguse > intregsneeded) {
- rd->savintreguse -= intregsneeded + 1;
- v->regoff =
- rd->savintregs[rd->savintreguse];
-#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
- if (intregsneeded)
- v->regoff=PACK_REGS(
- rd->savintregs[rd->savintreguse],
- rd->savintregs[rd->savintreguse + 1]);
- else
-#endif
- v->regoff =
- rd->savintregs[rd->savintreguse];
- }
- else {
- v->flags |= INMEMORY;
-#if defined(ALIGN_LONGS_IN_MEMORY)
- /* Align longs in Memory */
- if ( (memneeded) && (rd->memuse & 1))
- rd->memuse++;
-#endif
- v->regoff = rd->memuse;
- rd->memuse += memneeded + 1;
- }
-
- intalloc = t;
- } /* if (IS_FLT_DBL_TYPE(t)) */
- }
- } else { /* (saved) */
-/* now the same like above, but without a chance to take a temporary register */
-#ifdef HAS_ADDRESS_REGISTER_FILE
- if (IS_ADR_TYPE(t)) {
- if (rd->savadrreguse > 0) {
- v->regoff = rd->savadrregs[--rd->savadrreguse];
- }
- else {
- v->flags |= INMEMORY;
- v->regoff = rd->memuse++;
- }
- } else
-#endif
- {
- if (IS_FLT_DBL_TYPE(t)) {
- if (fltalloc >= 0) {
- v->flags |= rd->interfaces[s][fltalloc].flags
- & INMEMORY;
- v->regoff = rd->interfaces[s][fltalloc].regoff;
- } else
- if (rd->savfltreguse > 0) {
- v->regoff = rd->savfltregs[--rd->savfltreguse];
- }
- else {
- v->flags |= INMEMORY;
-#if defined(ALIGN_DOUBLES_IN_MEMORY)
- /* Align doubles in Memory */
- if ( (memneeded) && (rd->memuse & 1))
- rd->memuse++;
-#endif
- v->regoff = rd->memuse;
- rd->memuse += memneeded + 1;
- }
- fltalloc = t;
- }
- else { /* IS_INT_LNG */
-#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
- /*
- * for i386 put all longs in memory
- */
- if (IS_2_WORD_TYPE(t)) {
- v->flags |= INMEMORY;
-#if defined(ALIGN_LONGS_IN_MEMORY)
- /* Align longs in Memory */
- if (rd->memuse & 1)
- rd->memuse++;
-#endif
- v->regoff = rd->memuse;
- rd->memuse += memneeded + 1;
- } else
-#endif
- {
- if (intalloc >= 0) {
- v->flags |=
- rd->interfaces[s][intalloc].flags & INMEMORY;
-#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
- if (!(v->flags & INMEMORY)
- && IS_2_WORD_TYPE(intalloc))
- v->regoff =
- GET_LOW_REG(
- rd->interfaces[s][intalloc].regoff);
- else
-#endif
- v->regoff =
- rd->interfaces[s][intalloc].regoff;
- } else {
- if (rd->savintreguse > intregsneeded) {
- rd->savintreguse -= intregsneeded + 1;
-#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
- if (intregsneeded)
- v->regoff = PACK_REGS(
- rd->savintregs[rd->savintreguse],
- rd->savintregs[rd->savintreguse + 1]);
- else
-#endif
- v->regoff =
- rd->savintregs[rd->savintreguse];
- } else {
- v->flags |= INMEMORY;
-#if defined(ALIGN_LONGS_IN_MEMORY)
- /* Align longs in Memory */
- if ( (memneeded) && (rd->memuse & 1))
- rd->memuse++;
-#endif
- v->regoff = rd->memuse;
- rd->memuse += memneeded + 1;
- }
- }
- intalloc = t;
- }
- } /* if (IS_FLT_DBL_TYPE(t) else */
- } /* if (IS_ADR_TYPE(t)) else */
- } /* if (saved) else */
- } /* if (type >= 0) */
- } /* for t */
- } /* for s */
-}
-#endif /* defined(NEW_VAR) */
-
-
-#if defined(NEW_VAR)
-/* local_regalloc **************************************************************
-
- Allocates registers for all local variables.
-
-*******************************************************************************/
-
-static void local_regalloc(jitdata *jd)
-{
- methodinfo *m;
- codegendata *cd;
- registerdata *rd;
-
- int p, s, t, tt,lm;
- int intalloc, fltalloc;
- varinfo *v;
- int intregsneeded = 0;
- int memneeded = 0;
- int typeloop[] = { TYPE_LNG, TYPE_DBL, TYPE_INT, TYPE_FLT, TYPE_ADR };
- int fargcnt, iargcnt;
-#ifdef HAS_ADDRESS_REGISTER_FILE
- int aargcnt;
-#endif
-
- /* get required compiler data */
-
- m = jd->m;
- cd = jd->cd;
- rd = jd->rd;
-
- if (jd->isleafmethod) {
- methoddesc *md = m->parseddesc;
-
- iargcnt = rd->argintreguse;
- fargcnt = rd->argfltreguse;
-#ifdef HAS_ADDRESS_REGISTER_FILE
- aargcnt = rd->argadrreguse;
-#endif
- for (p = 0, s = 0; s < cd->maxlocals; s++, p++) {
- intalloc = -1; fltalloc = -1;
- for (tt = 0; tt <= 4; tt++) {
- t = typeloop[tt];
- lm = jd->local_map[s * 5 + t];
- if (lm == UNUSED)
- continue;
-
- v = &(jd->var[lm]);
-
-#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
- intregsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
-#endif
-#if defined(HAS_4BYTE_STACKSLOT)
- memneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
-#endif
-
- /*
- * The order of
- *
- * #ifdef HAS_ADDRESS_REGISTER_FILE
- * if (IS_ADR_TYPE) {
- * ...
- * } else
- * #endif
- * if (IS_FLT_DBL) {
- * ...
- * } else { / int & lng
- * ...
- * }
- *
- * must not to be changed!
- */
-
-#ifdef HAS_ADDRESS_REGISTER_FILE
- if (IS_ADR_TYPE(t)) {
- if ((p < md->paramcount) && !md->params[p].inmemory) {
- v->flags = 0;
- v->regoff = rd->argadrregs[md->params[p].regoff];
- }
- else if (rd->tmpadrreguse > 0) {
- v->flags = 0;
- v->regoff = rd->tmpadrregs[--rd->tmpadrreguse];
- }
- /* use unused argument registers as local registers */
- else if ((p >= md->paramcount) &&
- (aargcnt < ADR_ARG_CNT)) {
- v->flags = 0;
- v->regoff = rd->argadrregs[aargcnt++];
- }
- else if (rd->savadrreguse > 0) {
- v->flags = 0;
- v->regoff = rd->savadrregs[--rd->savadrreguse];
- }
- else {
- v->flags |= INMEMORY;
- v->regoff = rd->memuse++;
- }
- } else {
-#endif
- if (IS_FLT_DBL_TYPE(t)) {
- if (fltalloc >= 0) {
- v->flags = jd->var[fltalloc].flags;
- v->regoff = jd->var[fltalloc].regoff;
- }
-#if !defined(SUPPORT_PASS_FLOATARGS_IN_INTREGS)
- /* We can only use float arguments as local variables,
- * if we do not pass them in integer registers. */
- else if ((p < md->paramcount) &&
- !md->params[p].inmemory) {
- v->flags = 0;
- v->regoff = rd->argfltregs[md->params[p].regoff];
- }
-#endif
- else if (rd->tmpfltreguse > 0) {
- v->flags = 0;
- v->regoff = rd->tmpfltregs[--rd->tmpfltreguse];
- }
- /* use unused argument registers as local registers */
- else if ((p >= md->paramcount) &&
- (fargcnt < FLT_ARG_CNT)) {
- v->flags = 0;
- v->regoff = rd->argfltregs[fargcnt];
- fargcnt++;
- }
- else if (rd->savfltreguse > 0) {
- v->flags = 0;
- v->regoff = rd->savfltregs[--rd->savfltreguse];
- }
- else {
- v->flags = INMEMORY;
-#if defined(ALIGN_DOUBLES_IN_MEMORY)
- /* Align doubles in Memory */
- if ( (memneeded) && (rd->memuse & 1))
- rd->memuse++;
-#endif
- v->regoff = rd->memuse;
- rd->memuse += memneeded + 1;
- }
- fltalloc = jd->local_map[s * 5 + t];
-
- } else {
-#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
- /*
- * for i386 put all longs in memory
- */
- if (IS_2_WORD_TYPE(t)) {
- v->flags = INMEMORY;
-#if defined(ALIGN_LONGS_IN_MEMORY)
- /* Align longs in Memory */
- if (rd->memuse & 1)
- rd->memuse++;
-#endif
- v->regoff = rd->memuse;
- rd->memuse += memneeded + 1;
- } else
-#endif
- {
- if (intalloc >= 0) {
- v->flags = jd->var[intalloc].flags;
-#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
- if (!(v->flags & INMEMORY)
- && IS_2_WORD_TYPE(jd->var[intalloc].type))
- v->regoff = GET_LOW_REG(
- jd->var[intalloc].regoff);
- else
-#endif
- v->regoff = jd->var[intalloc].regoff;
- }
- else if ((p < md->paramcount) &&
- !md->params[p].inmemory) {
- v->flags = 0;
-#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
- if (IS_2_WORD_TYPE(t))
- v->regoff = PACK_REGS(
- rd->argintregs[GET_LOW_REG(md->params[p].regoff)],
- rd->argintregs[GET_HIGH_REG(md->params[p].regoff)]);
- else
-#endif
- v->regoff =
- rd->argintregs[md->params[p].regoff];
- }
- else if (rd->tmpintreguse > intregsneeded) {
- rd->tmpintreguse -= intregsneeded + 1;
- v->flags = 0;
-#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
- if (intregsneeded)
- v->regoff = PACK_REGS(
- rd->tmpintregs[rd->tmpintreguse],
- rd->tmpintregs[rd->tmpintreguse + 1]);
- else
-#endif
- v->regoff =
- rd->tmpintregs[rd->tmpintreguse];
- }
- /*
- * use unused argument registers as local registers
- */
- else if ((p >= m->parseddesc->paramcount) &&
- (iargcnt + intregsneeded < INT_ARG_CNT)) {
- v->flags = 0;
-#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
- if (intregsneeded)
- v->regoff=PACK_REGS(
- rd->argintregs[iargcnt],
- rd->argintregs[iargcnt + 1]);
- else
-#endif
- v->regoff = rd->argintregs[iargcnt];
- iargcnt += intregsneeded + 1;
- }
- else if (rd->savintreguse > intregsneeded) {
- rd->savintreguse -= intregsneeded + 1;
- v->flags = 0;
-#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
- if (intregsneeded)
- v->regoff = PACK_REGS(
- rd->savintregs[rd->savintreguse],
- rd->savintregs[rd->savintreguse + 1]);
- else
+ rd->savintregs[rd->savintreguse + 1]);
+ else
#endif
- v->regoff =rd->savintregs[rd->savintreguse];
- }
- else {
- v->flags = INMEMORY;
+ v->regoff =
+ rd->savintregs[rd->savintreguse];
+ }
+ else {
+ v->flags |= INMEMORY;
#if defined(ALIGN_LONGS_IN_MEMORY)
- /* Align longs in Memory */
- if ( (memneeded) && (rd->memuse & 1))
- rd->memuse++;
-#endif
- v->regoff = rd->memuse;
- rd->memuse += memneeded + 1;
- }
- }
- intalloc = jd->local_map[s * 5 + t];
- }
-#ifdef HAS_ADDRESS_REGISTER_FILE
- }
+ /* Align longs in Memory */
+ if ( (memneeded) && (rd->memuse & 1))
+ rd->memuse++;
#endif
- } /* for (tt=0;...) */
-
- /* If the current parameter is a 2-word type, the next local slot */
- /* is skipped. */
-
- if (p < md->paramcount)
- if (IS_2_WORD_TYPE(md->paramtypes[p].type))
- s++;
- }
- return;
- }
-
- for (s = 0; s < cd->maxlocals; s++) {
- intalloc = -1; fltalloc = -1;
- for (tt=0; tt<=4; tt++) {
- t = typeloop[tt];
-
- lm = jd->local_map[s * 5 + t];
- if (lm == UNUSED)
- continue;
-
- v = &(jd->var[lm]);
+ v->regoff = rd->memuse;
+ rd->memuse += memneeded + 1;
+ }
-#ifdef SUPPORT_COMBINE_INTEGER_REGISTERS
- intregsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
-#endif
-#if defined(HAS_4BYTE_STACKSLOT)
- memneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
-#endif
+ intalloc = jd->interface_map[s * 5 + t];
+ } /* if (IS_FLT_DBL_TYPE(t)) */
+ }
+ } else { /* (saved) */
+/* now the same like above, but without a chance to take a temporary register */
#ifdef HAS_ADDRESS_REGISTER_FILE
- if ( IS_ADR_TYPE(t) ) {
- if (rd->savadrreguse > 0) {
- v->flags = 0;
- v->regoff = rd->savadrregs[--rd->savadrreguse];
- }
- else {
- v->flags = INMEMORY;
- v->regoff = rd->memuse++;
- }
- } else {
+ if (IS_ADR_TYPE(t)) {
+ if (rd->savadrreguse > 0) {
+ v->regoff = rd->savadrregs[--rd->savadrreguse];
+ }
+ else {
+ v->flags |= INMEMORY;
+ v->regoff = rd->memuse++;
+ }
+ } else
#endif
- if (IS_FLT_DBL_TYPE(t)) {
- if (fltalloc >= 0) {
- v->flags = jd->var[fltalloc].flags;
- v->regoff = jd->var[fltalloc].regoff;
- }
- else if (rd->savfltreguse > 0) {
- v->flags = 0;
- v->regoff = rd->savfltregs[--rd->savfltreguse];
- }
- else {
- v->flags = INMEMORY;
+ {
+ if (IS_FLT_DBL_TYPE(t)) {
+ if (fltalloc >= 0) {
+ v->flags |= jd->var[fltalloc].flags & INMEMORY;
+ v->regoff = jd->var[fltalloc].regoff;
+ } else
+ if (rd->savfltreguse > 0) {
+ v->regoff =
+ rd->savfltregs[--rd->savfltreguse];
+ }
+ else {
+ v->flags |= INMEMORY;
#if defined(ALIGN_DOUBLES_IN_MEMORY)
- /* Align doubles in Memory */
- if ( (memneeded) && (rd->memuse & 1))
- rd->memuse++;
+ /* Align doubles in Memory */
+ if ( (memneeded) && (rd->memuse & 1))
+ rd->memuse++;
#endif
- v->regoff = rd->memuse;
- rd->memuse += memneeded + 1;
- }
- fltalloc = jd->local_map[s * 5 + t];
- }
- else {
+ v->regoff = rd->memuse;
+ rd->memuse += memneeded + 1;
+ }
+ fltalloc = jd->interface_map[s * 5 + t];
+ }
+ else { /* IS_INT_LNG */
#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
- /*
- * for i386 put all longs in memory
- */
- if (IS_2_WORD_TYPE(t)) {
- v->flags = INMEMORY;
+ /*
+ * for i386 put all longs in memory
+ */
+ if (IS_2_WORD_TYPE(t)) {
+ v->flags |= INMEMORY;
#if defined(ALIGN_LONGS_IN_MEMORY)
- /* Align longs in Memory */
- if (rd->memuse & 1)
- rd->memuse++;
+ /* Align longs in Memory */
+ if (rd->memuse & 1)
+ rd->memuse++;
#endif
- v->regoff = rd->memuse;
- rd->memuse += memneeded + 1;
- } else {
+ v->regoff = rd->memuse;
+ rd->memuse += memneeded + 1;
+ } else
#endif
- if (intalloc >= 0) {
- v->flags = jd->var[intalloc].flags;
+ {
+ if (intalloc >= 0) {
+ v->flags |= jd->var[intalloc].flags
+ & INMEMORY;
#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
- if (!(v->flags & INMEMORY)
- && IS_2_WORD_TYPE(jd->var[intalloc].type))
- v->regoff = GET_LOW_REG(
- jd->var[intalloc].regoff);
- else
+ if (!(v->flags & INMEMORY)
+ && IS_2_WORD_TYPE(jd->var[intalloc].type))
+ v->regoff =
+ GET_LOW_REG(
+ jd->var[intalloc].regoff);
+ else
#endif
- v->regoff = jd->var[intalloc].regoff;
- }
- else if (rd->savintreguse > intregsneeded) {
- rd->savintreguse -= intregsneeded+1;
- v->flags = 0;
+ v->regoff =
+ jd->var[intalloc].regoff;
+ } else {
+ if (rd->savintreguse > intregsneeded) {
+ rd->savintreguse -= intregsneeded + 1;
#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
- if (intregsneeded)
- v->regoff = PACK_REGS(
- rd->savintregs[rd->savintreguse],
- rd->savintregs[rd->savintreguse + 1]);
- else
+ if (intregsneeded)
+ v->regoff = PACK_REGS(
+ rd->savintregs[rd->savintreguse],
+ rd->savintregs[rd->savintreguse + 1]);
+ else
#endif
- v->regoff =rd->savintregs[rd->savintreguse];
- }
- else {
- v->flags = INMEMORY;
+ v->regoff =
+ rd->savintregs[rd->savintreguse];
+ } else {
+ v->flags |= INMEMORY;
#if defined(ALIGN_LONGS_IN_MEMORY)
- /* Align longs in Memory */
- if ( (memneeded) && (rd->memuse & 1))
- rd->memuse++;
-#endif
- v->regoff = rd->memuse;
- rd->memuse += memneeded + 1;
- }
-#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
- }
-#endif
- intalloc = jd->local_map[s * 5 + t];
- }
-#ifdef HAS_ADDRESS_REGISTER_FILE
- }
+ /* Align longs in Memory */
+ if ( (memneeded) && (rd->memuse & 1))
+ rd->memuse++;
#endif
-
- }
- }
+ v->regoff = rd->memuse;
+ rd->memuse += memneeded + 1;
+ }
+ }
+ intalloc = t;
+ }
+ } /* if (IS_FLT_DBL_TYPE(t) else */
+ } /* if (IS_ADR_TYPE(t)) else */
+ } /* if (saved) else */
+ /* if (type >= 0) */
+ } /* for t */
+ } /* for s */
}
-#else
+
+
+
/* local_regalloc **************************************************************
Allocates registers for all local variables.
codegendata *cd;
registerdata *rd;
- int p, s, t, tt;
+ int p, s, t, tt,lm;
int intalloc, fltalloc;
varinfo *v;
int intregsneeded = 0;
intalloc = -1; fltalloc = -1;
for (tt = 0; tt <= 4; tt++) {
t = typeloop[tt];
- v = &rd->locals[s][t];
-
- if (v->type < 0)
+ lm = jd->local_map[s * 5 + t];
+ if (lm == UNUSED)
continue;
+ v = &(jd->var[lm]);
+
#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
intregsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
#endif
#endif
if (IS_FLT_DBL_TYPE(t)) {
if (fltalloc >= 0) {
- v->flags = rd->locals[s][fltalloc].flags;
- v->regoff = rd->locals[s][fltalloc].regoff;
+ v->flags = jd->var[fltalloc].flags;
+ v->regoff = jd->var[fltalloc].regoff;
}
#if !defined(SUPPORT_PASS_FLOATARGS_IN_INTREGS)
/* We can only use float arguments as local variables,
v->regoff = rd->memuse;
rd->memuse += memneeded + 1;
}
- fltalloc = t;
+ fltalloc = jd->local_map[s * 5 + t];
} else {
#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
#endif
{
if (intalloc >= 0) {
- v->flags = rd->locals[s][intalloc].flags;
+ v->flags = jd->var[intalloc].flags;
#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
if (!(v->flags & INMEMORY)
- && IS_2_WORD_TYPE(intalloc))
+ && IS_2_WORD_TYPE(jd->var[intalloc].type))
v->regoff = GET_LOW_REG(
- rd->locals[s][intalloc].regoff);
+ jd->var[intalloc].regoff);
else
#endif
- v->regoff = rd->locals[s][intalloc].regoff;
+ v->regoff = jd->var[intalloc].regoff;
}
else if ((p < md->paramcount) &&
!md->params[p].inmemory) {
rd->argintregs[iargcnt + 1]);
else
#endif
- v->regoff = rd->argintregs[iargcnt];
+ v->regoff = rd->argintregs[iargcnt];
iargcnt += intregsneeded + 1;
}
else if (rd->savintreguse > intregsneeded) {
rd->memuse += memneeded + 1;
}
}
- intalloc = t;
+ intalloc = jd->local_map[s * 5 + t];
}
#ifdef HAS_ADDRESS_REGISTER_FILE
}
intalloc = -1; fltalloc = -1;
for (tt=0; tt<=4; tt++) {
t = typeloop[tt];
- v = &rd->locals[s][t];
- if (v->type >= 0) {
+ lm = jd->local_map[s * 5 + t];
+ if (lm == UNUSED)
+ continue;
+
+ v = &(jd->var[lm]);
+
#ifdef SUPPORT_COMBINE_INTEGER_REGISTERS
intregsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
#endif
#endif
if (IS_FLT_DBL_TYPE(t)) {
if (fltalloc >= 0) {
- v->flags = rd->locals[s][fltalloc].flags;
- v->regoff = rd->locals[s][fltalloc].regoff;
+ v->flags = jd->var[fltalloc].flags;
+ v->regoff = jd->var[fltalloc].regoff;
}
else if (rd->savfltreguse > 0) {
v->flags = 0;
v->regoff = rd->memuse;
rd->memuse += memneeded + 1;
}
- fltalloc = t;
+ fltalloc = jd->local_map[s * 5 + t];
}
else {
#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
} else {
#endif
if (intalloc >= 0) {
- v->flags = rd->locals[s][intalloc].flags;
+ v->flags = jd->var[intalloc].flags;
#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
if (!(v->flags & INMEMORY)
- && IS_2_WORD_TYPE(intalloc))
+ && IS_2_WORD_TYPE(jd->var[intalloc].type))
v->regoff = GET_LOW_REG(
- rd->locals[s][intalloc].regoff);
+ jd->var[intalloc].regoff);
else
#endif
- v->regoff = rd->locals[s][intalloc].regoff;
+ v->regoff = jd->var[intalloc].regoff;
}
else if (rd->savintreguse > intregsneeded) {
rd->savintreguse -= intregsneeded+1;
#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
}
#endif
- intalloc = t;
+ intalloc = jd->local_map[s * 5 + t];
}
#ifdef HAS_ADDRESS_REGISTER_FILE
}
#endif
- }
}
}
}
-#endif /* defined(NEW_VAR) */
+
static void reg_init_temp(methodinfo *m, registerdata *rd)
{