* src/toolbox/Makefile.am (libtoolbox_la_SOURCES): Added set.[ch]
[cacao.git] / src / vm / jit / allocator / simplereg.c
index 3a480b0609039ba9a2005a3abe2bcdaaae7f681c..f5cd6fce9f2b665cb917c91e55fbcbd22d6fa442 100644 (file)
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
    02111-1307, USA.
 
-   $Id: simplereg.c 7713 2007-04-15 21:49:48Z twisti $
-
 */
 
 
 #include "config.h"
 
 #include <assert.h>
+#include <stdint.h>
 
 #include "vm/types.h"
 
@@ -66,6 +65,15 @@ static void simplereg_allocate_locals(jitdata *jd);
 static void simplereg_allocate_temporaries(jitdata *jd);
 
 
+/* size of a stackslot used by the internal ABI */
+
+#if defined(HAS_4BYTE_STACKSLOT)
+# define SIZE_OF_STACKSLOT 4
+#else 
+# define SIZE_OF_STACKSLOT 8
+#endif
+
+
 /* total number of registers */
 
 #if defined(HAS_ADDRESS_REGISTER_FILE)
@@ -201,7 +209,7 @@ static void simplereg_allocate_temporaries(jitdata *jd);
 
 #define NEW_MEM_SLOT(r)                                              \
     do {                                                             \
-        (r) = rd->memuse;                                            \
+        (r) = rd->memuse * SIZE_OF_STACKSLOT;                        \
         rd->memuse += memneeded + 1;                                 \
     } while (0)
 
@@ -209,7 +217,7 @@ static void simplereg_allocate_temporaries(jitdata *jd);
     do {                                                             \
         if ( (memneeded) && (rd->memuse & 1))                        \
             rd->memuse++;                                            \
-        (r) = rd->memuse;                                            \
+        (r) = rd->memuse * SIZE_OF_STACKSLOT;                        \
         rd->memuse += memneeded + 1;                                 \
     } while (0)
 
@@ -219,7 +227,7 @@ static void simplereg_allocate_temporaries(jitdata *jd);
                        PUSH_BACK(rd->freemem, rd->freememtop, rd->memuse);      \
             rd->memuse++;                                            \
                }                                                            \
-        (r) = rd->memuse;                                            \
+        (r) = rd->memuse * SIZE_OF_STACKSLOT;                        \
         rd->memuse += memneeded + 1;                                 \
     } while (0)
 
@@ -309,6 +317,7 @@ bool regalloc(jitdata *jd)
 static void simplereg_allocate_interfaces(jitdata *jd)
 {
        methodinfo   *m;
+       codeinfo     *code;
        codegendata  *cd;
        registerdata *rd;
 
@@ -326,22 +335,23 @@ static void simplereg_allocate_interfaces(jitdata *jd)
 
        /* get required compiler data */
 
-       m  = jd->m;
-       cd = jd->cd;
-       rd = jd->rd;
+       m    = jd->m;
+       code = jd->code;
+       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)) {
+       if (checksync && code_is_synchronized(code)) {
                /* reserve 0(%esp) for Monitorenter/exit Argument on i386 */
                if (rd->memuse < 1)
                        rd->memuse = 1;
        }
 #endif
 
-       if (jd->isleafmethod) {
+       if (code_is_leafmethod(code)) {
                /* Reserve argument register, which will be used for Locals acting */
                /* as Parameters */
                if (rd->argintreguse < m->parseddesc->argintreguse)
@@ -388,7 +398,7 @@ static void simplereg_allocate_interfaces(jitdata *jd)
                        if (!saved) {
 #if defined(HAS_ADDRESS_REGISTER_FILE)
                                if (IS_ADR_TYPE(t)) {
-                                       if (!jd->isleafmethod && AVAIL_ARG_ADR) {
+                                       if (!code_is_leafmethod(code) && AVAIL_ARG_ADR) {
                                                flags |= ARGREG;
                                                TAKE_ARG_ADR(regoff);
                                        } 
@@ -401,7 +411,7 @@ static void simplereg_allocate_interfaces(jitdata *jd)
                                        } 
                                        else {
                                                flags |= INMEMORY;
-                                               regoff = rd->memuse++;
+                                               regoff = rd->memuse++ * SIZE_OF_STACKSLOT;
                                        }                                               
                                } 
                                else /* !IS_ADR_TYPE */
@@ -431,7 +441,7 @@ static void simplereg_allocate_interfaces(jitdata *jd)
                                                fltalloc = s * 5 + t;
                                        }
                                        else { /* !IS_FLT_DBL_TYPE(t) */
-#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
+#if (SIZEOF_VOID_P == 4) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                                /*
                                                 * for i386 put all longs in memory
                                                 */
@@ -440,7 +450,7 @@ static void simplereg_allocate_interfaces(jitdata *jd)
                                                        NEW_MEM_SLOT_INT_LNG(regoff);
                                                } 
                                                else
-#endif /* defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE...GISTERS) */
+#endif
                                                        if (intalloc >= 0) {
                                                                /* Reuse memory slot(s)/register(s) for shared interface slots */
                                                                flags |= jd->interface_map[intalloc].flags & ~SAVEDVAR;
@@ -483,7 +493,7 @@ static void simplereg_allocate_interfaces(jitdata *jd)
                                        }
                                        else {
                                                flags |= INMEMORY;
-                                               regoff = rd->memuse++;
+                                               regoff = rd->memuse++ * SIZE_OF_STACKSLOT;
                                        }                                               
                                } 
                                else
@@ -506,7 +516,7 @@ static void simplereg_allocate_interfaces(jitdata *jd)
                                                fltalloc = s * 5 + t;
                                        }
                                        else { /* IS_INT_LNG */
-#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
+#if (SIZEOF_VOID_P == 4) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                                /*
                                                 * for i386 put all longs in memory
                                                 */
@@ -564,7 +574,7 @@ static void simplereg_allocate_locals_leafmethod(jitdata *jd)
        registerdata *rd;
        methoddesc *md;
 
-       int     p, s, t, tt, lm;
+       int     p, s, t, tt, varindex;
        int     intalloc, fltalloc;
        varinfo *v;
        int     intregsneeded = 0;
@@ -592,11 +602,11 @@ static void simplereg_allocate_locals_leafmethod(jitdata *jd)
                intalloc = -1; fltalloc = -1;
                for (tt = 0; tt <= 4; tt++) {
                        t = typeloop[tt];
-                       lm = jd->local_map[s * 5 + t];
-                       if (lm == UNUSED)
+                       varindex = jd->local_map[s * 5 + t];
+                       if (varindex == UNUSED)
                                continue;
 
-                       v = VAR(lm);
+                       v = VAR(varindex);
 
 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                        intregsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
@@ -645,7 +655,7 @@ static void simplereg_allocate_locals_leafmethod(jitdata *jd)
                                }
                                else {
                                        v->flags |= INMEMORY;
-                                       v->vv.regoff = rd->memuse++;
+                                       v->vv.regoff = rd->memuse++ * SIZE_OF_STACKSLOT;
                                }                                               
                        } 
                        else {
@@ -685,7 +695,7 @@ static void simplereg_allocate_locals_leafmethod(jitdata *jd)
 
                                } 
                                else {
-#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
+#if (SIZEOF_VOID_P == 4) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                        /*
                                         * for i386 put all longs in memory
                                         */
@@ -767,10 +777,11 @@ static void simplereg_allocate_locals_leafmethod(jitdata *jd)
        
 static void simplereg_allocate_locals(jitdata *jd)
 {
+       codeinfo     *code;
        codegendata  *cd;
        registerdata *rd;
 
-       int     s, t, tt, lm;
+       int     s, t, tt, varindex;
        int     intalloc, fltalloc;
        varinfo *v;
        int     memneeded = 0;
@@ -781,10 +792,11 @@ static void simplereg_allocate_locals(jitdata *jd)
 
        /* get required compiler data */
 
-       cd = jd->cd;
-       rd = jd->rd;
+       code = jd->code;
+       cd   = jd->cd;
+       rd   = jd->rd;
 
-       if (jd->isleafmethod) {
+       if (code_is_leafmethod(code)) {
                simplereg_allocate_locals_leafmethod(jd);
                return;
        }
@@ -794,11 +806,11 @@ static void simplereg_allocate_locals(jitdata *jd)
                for (tt=0; tt<=4; tt++) {
                        t = typeloop[tt];
 
-                       lm = jd->local_map[s * 5 + t];
-                       if (lm == UNUSED)
+                       varindex = jd->local_map[s * 5 + t];
+                       if (varindex == UNUSED)
                                continue;
 
-                       v = VAR(lm);
+                       v = VAR(varindex);
 
 #ifdef SUPPORT_COMBINE_INTEGER_REGISTERS
                                intregsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
@@ -816,7 +828,7 @@ static void simplereg_allocate_locals(jitdata *jd)
                                        }
                                        else {
                                                v->flags = INMEMORY;
-                                               v->vv.regoff = rd->memuse++;
+                                               v->vv.regoff = rd->memuse++ * SIZE_OF_STACKSLOT;
                                        }
                                } 
                                else {
@@ -837,7 +849,7 @@ static void simplereg_allocate_locals(jitdata *jd)
                                        fltalloc = jd->local_map[s * 5 + t];
                                }
                                else {
-#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
+#if (SIZEOF_VOID_P == 4) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                        /*
                                         * for i386 put all longs in memory
                                         */
@@ -866,7 +878,7 @@ static void simplereg_allocate_locals(jitdata *jd)
                                                        v->flags = INMEMORY;
                                                        NEW_MEM_SLOT_INT_LNG(v->vv.regoff);
                                                }
-#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
+#if (SIZEOF_VOID_P == 4) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                        }
 #endif
                                        intalloc = jd->local_map[s * 5 + t];
@@ -1056,7 +1068,7 @@ static void simplereg_new_temp(jitdata *jd, s4 index)
                                        }
                                } 
                                else {
-#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
+#if (SIZEOF_VOID_P == 4) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                        /*
                                         * for i386 put all longs in memory
                                         */
@@ -1112,7 +1124,7 @@ static void simplereg_new_temp(jitdata *jd, s4 index)
 
                                } 
                                else {
-#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
+#if (SIZEOF_VOID_P == 4) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                        /*
                                         * for i386 put all longs in memory
                                         */
@@ -1167,14 +1179,16 @@ static void simplereg_free(registerdata *rd, s4 flags, s4 regoff, s4 type)
 
        /* if this is a copy of another variable, just decrement the copy counter */
 
-       /* XXX split reg/mem variables on arm may need special handling here */
-
        if (flags & INMEMORY) {
+               int32_t memindex;
+
                if (flags & INOUT)
                        return;
 
-               if (regoff < rd->memcopycountsize && rd->memcopycount[regoff]) {
-                       rd->memcopycount[regoff]--;
+               memindex = regoff / SIZE_OF_STACKSLOT;
+
+               if (memindex < rd->memcopycountsize && rd->memcopycount[memindex]) {
+                       rd->memcopycount[memindex]--;
                        return;
                }
        }
@@ -1336,7 +1350,7 @@ static void simplereg_allocate_temporaries(jitdata *jd)
 
                        /* assert that all copy counts are zero */
 
-#if !defined(NDEBUG)
+#if !defined(NDEBUG) && !defined(ENABLE_SSA)
                        for (i=0; i < TOTAL_REG_CNT; ++i)
                                assert(rd->regcopycount[i] == 0);
 #endif
@@ -1543,32 +1557,6 @@ static void simplereg_allocate_temporaries(jitdata *jd)
                                case ICMD_IF_LCMPGT:
                                case ICMD_IF_LCMPLE:
 
-                               case ICMD_IF_FCMPEQ:
-                               case ICMD_IF_FCMPNE:
-
-                               case ICMD_IF_FCMPL_LT:
-                               case ICMD_IF_FCMPL_GE:
-                               case ICMD_IF_FCMPL_GT:
-                               case ICMD_IF_FCMPL_LE:
-
-                               case ICMD_IF_FCMPG_LT:
-                               case ICMD_IF_FCMPG_GE:
-                               case ICMD_IF_FCMPG_GT:
-                               case ICMD_IF_FCMPG_LE:
-
-                               case ICMD_IF_DCMPEQ:
-                               case ICMD_IF_DCMPNE:
-
-                               case ICMD_IF_DCMPL_LT:
-                               case ICMD_IF_DCMPL_GE:
-                               case ICMD_IF_DCMPL_GT:
-                               case ICMD_IF_DCMPL_LE:
-
-                               case ICMD_IF_DCMPG_LT:
-                               case ICMD_IF_DCMPG_GE:
-                               case ICMD_IF_DCMPG_GT:
-                               case ICMD_IF_DCMPG_LE:
-
                                case ICMD_IF_ACMPEQ:
                                case ICMD_IF_ACMPNE:
 
@@ -1601,14 +1589,15 @@ static void simplereg_allocate_temporaries(jitdata *jd)
                                                v = VAROP(iptr->dst);
 
                                                if (v->flags & INMEMORY) {
-                                                       if (v->vv.regoff >= rd->memcopycountsize) {
-                                                               int newsize = (v->vv.regoff + 1) * 2;
+                                                       int32_t memindex = v->vv.regoff / SIZE_OF_STACKSLOT;
+                                                       if (memindex >= rd->memcopycountsize) {
+                                                               int newsize = (memindex + 1) * 2;
                                                                i = rd->memcopycountsize;
                                                                rd->memcopycount = DMREALLOC(rd->memcopycount, int, i, newsize);
                                                                MZERO(rd->memcopycount + i, int, newsize - i);
                                                                rd->memcopycountsize = newsize;
                                                        }
-                                                       rd->memcopycount[v->vv.regoff]++;
+                                                       rd->memcopycount[memindex]++;
                                                }
                                                else {
                                                        /* XXX split reg/mem variables on arm may need special handling here */