* src/vm/jit/allocator/simplreg: Removed #if defined(NEW_VAR) over some functions.
authorchristian <none@none>
Thu, 7 Sep 2006 14:00:39 +0000 (14:00 +0000)
committerchristian <none@none>
Thu, 7 Sep 2006 14:00:39 +0000 (14:00 +0000)
--HG--
branch : unified_variables

src/vm/jit/allocator/simplereg.c

index 499204dd4c36a5566b4f031b5a160e77c7057252..fac73df9f0fd088cdb94790aee0c7d530afd8695 100644 (file)
@@ -32,7 +32,7 @@
             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 $
 
 */
 
@@ -94,7 +94,6 @@ bool new_regalloc(jitdata *jd)
        return true;
 }
 
-#if defined(NEW_VAR)
 /* interface_regalloc **********************************************************
 
    Allocates registers for all interface variables.
@@ -273,780 +272,126 @@ static void interface_regalloc(jitdata *jd)
                                                                                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.
@@ -1059,7 +404,7 @@ static void local_regalloc(jitdata *jd)
        codegendata  *cd;
        registerdata *rd;
 
-       int     p, s, t, tt;
+       int     p, s, t, tt,lm;
        int     intalloc, fltalloc;
        varinfo *v;
        int     intregsneeded = 0;
@@ -1088,11 +433,12 @@ static void local_regalloc(jitdata *jd)
                        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
@@ -1145,8 +491,8 @@ static void local_regalloc(jitdata *jd)
 #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,
@@ -1182,7 +528,7 @@ static void local_regalloc(jitdata *jd)
                                                        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)
@@ -1202,15 +548,15 @@ static void local_regalloc(jitdata *jd)
 #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) {
@@ -1251,7 +597,7 @@ static void local_regalloc(jitdata *jd)
                                                                                                   rd->argintregs[iargcnt + 1]);
                                                                else
 #endif
-                                                                       v->regoff = rd->argintregs[iargcnt];
+                                                               v->regoff = rd->argintregs[iargcnt];
                                                                iargcnt += intregsneeded + 1;
                                                        }
                                                        else if (rd->savintreguse > intregsneeded) {
@@ -1277,7 +623,7 @@ static void local_regalloc(jitdata *jd)
                                                                rd->memuse += memneeded + 1;
                                                        }
                                                }
-                                               intalloc = t;
+                                               intalloc = jd->local_map[s * 5 + t];
                                        }
 #ifdef HAS_ADDRESS_REGISTER_FILE
                                }
@@ -1298,9 +644,13 @@ static void local_regalloc(jitdata *jd)
                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
@@ -1321,8 +671,8 @@ static void local_regalloc(jitdata *jd)
 #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;
@@ -1338,7 +688,7 @@ static void local_regalloc(jitdata *jd)
                                                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)
@@ -1357,15 +707,15 @@ static void local_regalloc(jitdata *jd)
                                        } 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;
@@ -1392,17 +742,16 @@ static void local_regalloc(jitdata *jd)
 #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)
 {