Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: codegen.c 7929 2007-05-21 11:45:31Z michi $
+ $Id: codegen.c 7931 2007-05-21 14:42:28Z twisti $
*/
/* ATTENTION: we use interger registers for all arguments (even float) */
#if !defined(ENABLE_SOFTFLOAT)
- if (IS_INT_LNG_TYPE(t)) { /* integer args */
+ if (IS_INT_LNG_TYPE(t)) {
#endif
- if (!md->params[i].inmemory) { /* register arguments */
- if (!(var->flags & INMEMORY)) { /* reg arg -> register */
- if (GET_LOW_REG(var->vv.regoff) == REG_SPLIT || GET_HIGH_REG(var->vv.regoff) == REG_SPLIT) {
- /* TODO: remove this!!! */
- dolog("SPLIT in local var: %x>%x (%s.%s)", s1, var->vv.regoff, m->class->name->text, m->name->text);
- assert(s1 == var->vv.regoff);
- }
- s3 = var->vv.regoff;
- SPLIT_OPEN(t, s1, REG_ITMP1);
- SPLIT_LOAD(t, s1, cd->stackframesize);
- SPLIT_OPEN(t, s3, REG_ITMP1);
-
+ if (!md->params[i].inmemory) {
+ if (!(var->flags & INMEMORY)) {
if (IS_2_WORD_TYPE(t))
- M_LNGMOVE(s1, s3);
+ M_LNGMOVE(s1, var->vv.regoff);
else
- M_INTMOVE(s1, s3);
-
- SPLIT_STORE_AND_CLOSE(t, s3, cd->stackframesize);
+ M_INTMOVE(s1, var->vv.regoff);
}
- else { /* reg arg -> spilled */
- SPLIT_OPEN(t, s1, REG_ITMP1);
- SPLIT_LOAD(t, s1, cd->stackframesize);
-
+ else {
if (IS_2_WORD_TYPE(t))
M_LST(s1, REG_SP, var->vv.regoff * 4);
else
M_IST(s1, REG_SP, var->vv.regoff * 4);
- /* no SPLIT_CLOSE here because arg is fully spilled now */
}
}
else { /* stack arguments */
}
}
#if !defined(ENABLE_SOFTFLOAT)
- } else { /* floating args */
- if (!md->params[i].inmemory) { /* register arguments */
- if (!(var->flags & INMEMORY)) { /* reg arg -> register */
- SPLIT_OPEN(t, s1, REG_ITMP1);
- SPLIT_LOAD(t, s1, cd->stackframesize);
+ }
+ else {
+ if (!md->params[i].inmemory) {
+ if (!(var->flags & INMEMORY)) {
M_CAST_INT_TO_FLT_TYPED(t, s1, var->vv.regoff);
}
- else { /* reg arg -> spilled */
- SPLIT_OPEN(t, s1, REG_ITMP1);
- SPLIT_LOAD(t, s1, cd->stackframesize);
-
+ else {
if (IS_2_WORD_TYPE(t))
M_LST(s1, REG_SP, var->vv.regoff * 4);
else
M_IST(s1, REG_SP, var->vv.regoff * 4);
- /* no SPLIT_CLOSE here because arg is fully spilled now */
}
}
- else { /* stack arguments */
- if (!(var->flags & INMEMORY)) { /* stack arg -> register */
+ else {
+ if (!(var->flags & INMEMORY)) {
if (IS_2_WORD_TYPE(t))
M_DLD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 4);
else
M_FLD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 4);
}
- else { /* stack arg -> spilled */
+ else {
/* Reuse Memory Position on Caller Stack */
var->vv.regoff = cd->stackframesize + s1;
}
if (IS_INT_LNG_TYPE(var->type)) {
#endif /* !defined(ENABLE_SOFTFLOAT) */
if (!md->params[s3].inmemory) {
- SPLIT_OPEN(var->type, s1, REG_ITMP2);
s1 = emit_load(jd, iptr, var, d);
if (IS_2_WORD_TYPE(var->type))
M_LNGMOVE(s1, d);
else
M_INTMOVE(s1, d);
-
- SPLIT_STORE_AND_CLOSE(var->type, d, 0);
}
else {
if (IS_2_WORD_TYPE(var->type)) {
else {
if (!md->params[s3].inmemory) {
s1 = emit_load(jd, iptr, var, REG_FTMP1);
- SPLIT_OPEN(var->type, d, REG_ITMP1);
M_CAST_FLT_TO_INT_TYPED(var->type, s1, d);
- SPLIT_STORE_AND_CLOSE(var->type, d, 0);
}
else {
s1 = emit_load(jd, iptr, var, REG_FTMP1);