/* src/vm/jit/allocator/simplereg.c - register allocator
- Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
- C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
- E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
- J. Wenninger, Institut f. Computersprachen - TU Wien
+ Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
+ R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
+ C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
+ Institut f. Computersprachen - TU Wien
This file is part of CACAO.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- 02110-1301, USA.
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ 02111-1307, USA.
- Contact: cacao@cacaojvm.org
+ Contact: cacao@complang.tuwien.ac.at
Authors: Andreas Krall
Christian Ullrich
Michael Starzinger
- $Id: simplereg.c 4381 2006-01-28 14:18:06Z twisti $
+ $Id: simplereg.c 4386 2006-01-30 11:26:34Z christian $
*/
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;
}
*/
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 !defined(HAS_4BYTE_STACKSLOT) */
if (intalloc >= 0) {
/* Reuse memory slot(s)/register(s) for shared interface slots */
v->flags |=
v->regoff =
rd->interfaces[s][intalloc].regoff;
} else
-/* #endif *//* !defined(HAS_4BYTE_STACKSLOT) */
if (!m->isleafmethod &&
(rd->argintreguse
+ intregsneeded < INT_ARG_CNT)) {
}
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;
}
}
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;
}
*/
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 !defined(HAS_4BYTE_STACKSLOT) */
if (intalloc >= 0) {
v->flags |=
rd->interfaces[s][intalloc].flags & INMEMORY;
#endif
v->regoff =
rd->interfaces[s][intalloc].regoff;
- } else
-/* #endif */
- {
+ } else {
if (rd->savintreguse > intregsneeded) {
rd->savintreguse -= intregsneeded + 1;
#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
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;
}
v->flags = 0;
v->regoff = rd->argadrregs[md->params[p].regoff];
}
- if (rd->tmpadrreguse > 0) {
+ else if (rd->tmpadrreguse > 0) {
v->flags = 0;
v->regoff = rd->tmpadrregs[--rd->tmpadrreguse];
}
- else if (rd->savadrreguse > 0) {
- v->flags = 0;
- v->regoff = rd->savadrregs[--rd->savadrreguse];
- }
/* 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++;
v->flags = 0;
v->regoff = rd->tmpfltregs[--rd->tmpfltreguse];
}
- else if (rd->savfltreguse > 0) {
- v->flags = 0;
- v->regoff = rd->savfltregs[--rd->savfltreguse];
- }
/* use unused argument registers as local registers */
else if ((p >= md->paramcount) &&
(fargcnt < FLT_ARG_CNT)) {
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;
}
*/
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
v->flags = 0;
#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
if (IS_2_WORD_TYPE(t))
-/* For ARM: - if GET_LOW_REG(md->params[p].regoff) == R4, prevent here that */
-/* rd->argintregs[GET_HIGH_REG(md->...)) is used! */
v->regoff = PACK_REGS(
rd->argintregs[GET_LOW_REG(md->params[p].regoff)],
rd->argintregs[GET_HIGH_REG(md->params[p].regoff)]);
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;
#endif
v->regoff =rd->savintregs[rd->savintreguse];
}
- /*
- * use unused argument registers as local registers
- */
- else if ((p >= md->paramcount) &&
- (iargcnt < INT_ARG_CNT)) {
- v->flags = 0;
- v->regoff = rd->argintregs[iargcnt];
- iargcnt++;
- }
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;
}
}
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;
}
*/
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 {
}
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;
}
rd->freememtop--;;
s->regoff = rd->freemem[rd->freememtop];
} else {
-#if defined(HAS_4BYTE_STACKSLOT)
+#if defined(ALIGN_LONGS_IN_MEMORY) || defined(ALIGN_DOUBLES_IN_MEMORY)
/* align 2 Word Types */
if ((memneeded) && ((rd->memuse & 1) == 1)) {
/* Put patched memory slot on freemem */
rd->freemem[rd->freememtop++] = rd->memuse;
rd->memuse++;
}
-#endif /*defined(HAS_4BYTE_STACKSLOT) */
+#endif /* defined(ALIGN_LONGS_IN_MEMORY) || defined(ALIGN_DOUBLES_IN_MEMORY) */
s->regoff = rd->memuse;
rd->memuse += memneeded + 1;
}