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);
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: md-abi.c 7713 2007-04-15 21:49:48Z twisti $
+ $Id: md-abi.c 7931 2007-05-21 14:42:28Z twisti $
*/
s4 stacksize;
/* set default values */
- reguse = 0;
+
+ reguse = 0;
stacksize = 0;
/* get params field of methoddesc */
+
pd = md->params;
for (i = 0; i < md->paramcount; i++, pd++) {
case TYPE_LNG:
case TYPE_DBL:
- if (reguse+1 < INT_ARG_CNT) {
+ /* interally we use the EABI */
+
+ ALIGN_2(reguse);
+
+ if (reguse < INT_ARG_CNT) {
pd->inmemory = false;
#if defined(__ARMEL__)
pd->regoff =
#endif
reguse += 2;
}
- else if (reguse < INT_ARG_CNT) {
- pd->inmemory = false;
-#if defined(__ARMEL__)
- pd->regoff =
- PACK_REGS(abi_registers_integer_argument[reguse],
- abi_registers_integer_argument[INT_ARG_CNT]);
-#else
- pd->regoff =
- PACK_REGS(abi_registers_integer_argument[INT_ARG_CNT],
- abi_registers_integer_argument[reguse]);
-#endif
- reguse++;
- stacksize++;
- }
else {
- pd->inmemory = true;
- pd->regoff = stacksize;
- stacksize += 2;
+ pd->inmemory = true;
+ pd->regoff = stacksize;
+ stacksize += 2;
}
break;
}
*******************************************************************************/
-#define ALIGN_2(a) do { if ((a) & 0x1) (a)++; } while (0)
-
void md_param_alloc_native(methoddesc *md)
{
paramdesc *pd;