* src/mm/memory.cpp,
[cacao.git] / src / vm / jit / reg.c
index 8fbb78b705679a313acb522a1b6d76d7d8f74e69..8dff2425134056e04f727d2b2641da7edee7dede 100644 (file)
@@ -1,6 +1,6 @@
 /* src/vm/jit/reg.c - register allocator setup
 
-   Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
    C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
    E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
    J. Wenninger, Institut f. Computersprachen - TU Wien
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Contact: cacao@cacaojvm.org
-
-   Authors: Andreas Krall
-
-   Changes: Stefan Ring
-            Christian Thalinger
-            Christian Ullrich
-            Michael Starzinger
-            Edwin Steiner
-
-   $Id: reg.c 4959 2006-05-26 12:09:29Z edwin $
-
 */
 
 
@@ -46,7 +34,7 @@
 #include "arch.h"
 #include "md-abi.h"
 
-#include "mm/memory.h"
+#include "mm/memory.hpp"
 #include "vm/jit/abi.h"
 #include "vm/jit/reg.h"
 
@@ -62,7 +50,6 @@ void reg_setup(jitdata *jd)
        methodinfo   *m;
        registerdata *rd;
        s4            i;
-       varinfo5     *v;
 
        /* get required compiler data */
 
@@ -71,15 +58,6 @@ void reg_setup(jitdata *jd)
 
        /* setup the integer register table */
 
-#if defined(__ARM__)
-       /* On ARM longs can be split across argument regs and stack. This is
-        * signed by setting the HIGH_REG to INT_ARG_CNT in md_param_alloc().
-        * Here we make sure it resolves to a special dummy reg (REG_SPLIT). */
-       rd->argintregs = DMNEW(s4, INT_ARG_CNT + 1);
-       rd->argintregs[INT_ARG_CNT] = REG_SPLIT;
-#else
-       rd->argintregs = DMNEW(s4, INT_ARG_CNT);
-#endif
        rd->tmpintregs = DMNEW(s4, INT_TMP_CNT);
        rd->savintregs = DMNEW(s4, INT_SAV_CNT);
        rd->freeargintregs = DMNEW(s4, INT_ARG_CNT);
@@ -101,29 +79,11 @@ void reg_setup(jitdata *jd)
                case REG_TMP:
                        rd->tmpintregs[rd->tmpintreguse++] = i; 
                        break;
-               case REG_ARG:
-                       rd->argintregs[rd->argintreguse++] = i;
-                       break;
                }
        }
        assert(rd->savintreguse == INT_SAV_CNT);
        assert(rd->tmpintreguse == INT_TMP_CNT);
-       assert(rd->argintreguse == INT_ARG_CNT);
-
-#if defined(__X86_64__)
-       /* 
-        * on x86_64 the argument registers are not in ascending order 
-        * a00 (%rdi) <-> a03 (%rcx) and a01 (%rsi) <-> a02 (%rdx)
-        */
-       i = rd->argintregs[3];
-       rd->argintregs[3] = rd->argintregs[0];
-       rd->argintregs[0] = i;
-
-       i = rd->argintregs[2];
-       rd->argintregs[2] = rd->argintregs[1];
-       rd->argintregs[1] = i;
-#endif
-               
+
 #ifdef HAS_ADDRESS_REGISTER_FILE
        /* setup the address register table */
 
@@ -134,7 +94,7 @@ void reg_setup(jitdata *jd)
        rd->freetmpadrregs = DMNEW(s4, ADR_TMP_CNT);
        rd->freesavadrregs = DMNEW(s4, ADR_SAV_CNT);
 
-       rd->adrreg_argnum = 0;
+       /*rd->adrreg_argnum = 0; XXX ask twisti */
        rd->argadrreguse = 0;
        rd->tmpadrreguse = 0;
        rd->savadrreguse = 0;
@@ -159,10 +119,9 @@ void reg_setup(jitdata *jd)
        assert(rd->tmpadrreguse == ADR_TMP_CNT);
        assert(rd->argadrreguse == ADR_ARG_CNT);
 #endif
-               
+
        /* setup the float register table */
 
-       rd->argfltregs = DMNEW(s4, FLT_ARG_CNT);
        rd->tmpfltregs = DMNEW(s4, FLT_TMP_CNT);
        rd->savfltregs = DMNEW(s4, FLT_SAV_CNT);
        rd->freeargfltregs = DMNEW(s4, FLT_ARG_CNT);
@@ -184,61 +143,19 @@ void reg_setup(jitdata *jd)
                case REG_TMP:
                        rd->tmpfltregs[rd->tmpfltreguse++] = i;
                        break;
-               case REG_ARG:
-                       rd->argfltregs[rd->argfltreguse++] = i;
-                       break;
                }
        }
        assert(rd->savfltreguse == FLT_SAV_CNT);
        assert(rd->tmpfltreguse == FLT_TMP_CNT);
-       assert(rd->argfltreguse == FLT_ARG_CNT);
-
 
        rd->freemem    = DMNEW(s4, m->maxstack);
-#if defined(HAS_4BYTE_STACKSLOT)
-       rd->freemem_2  = DMNEW(s4, m->maxstack);
-#endif
-       rd->locals     = DMNEW(varinfo5, m->maxlocals);
-       rd->interfaces = DMNEW(varinfo5, m->maxstack);
-       for (v = rd->locals, i = m->maxlocals; i > 0; v++, i--) {
-               v[0][TYPE_INT].type = -1;
-               v[0][TYPE_LNG].type = -1;
-               v[0][TYPE_FLT].type = -1;
-               v[0][TYPE_DBL].type = -1;
-               v[0][TYPE_ADR].type = -1;
-
-               v[0][TYPE_INT].regoff = 0;
-               v[0][TYPE_LNG].regoff = 0;
-               v[0][TYPE_FLT].regoff = 0;
-               v[0][TYPE_DBL].regoff = 0;
-               v[0][TYPE_ADR].regoff = 0;
-       }
-
-       for (v = rd->interfaces, i = m->maxstack; i > 0; v++, i--) {
-               v[0][TYPE_INT].type = -1;
-               v[0][TYPE_INT].flags = 0;
-               v[0][TYPE_LNG].type = -1;
-               v[0][TYPE_LNG].flags = 0;
-               v[0][TYPE_FLT].type = -1;
-               v[0][TYPE_FLT].flags = 0;
-               v[0][TYPE_DBL].type = -1;
-               v[0][TYPE_DBL].flags = 0;
-               v[0][TYPE_ADR].type = -1;
-               v[0][TYPE_ADR].flags = 0;
-
-               v[0][TYPE_INT].regoff = 0;
-               v[0][TYPE_LNG].regoff = 0;
-               v[0][TYPE_FLT].regoff = 0;
-               v[0][TYPE_DBL].regoff = 0;
-               v[0][TYPE_ADR].regoff = 0;
-       }
 
 #if defined(SPECIALMEMUSE)
 # if defined(__DARWIN__)
        /* 6*4=24 byte linkage area + 8*4=32 byte minimum parameter Area */
-       rd->memuse = LA_WORD_SIZE + INT_ARG_CNT; 
+       rd->memuse = LA_SIZE_IN_POINTERS + INT_ARG_CNT; 
 # else
-       rd->memuse = LA_WORD_SIZE;
+       rd->memuse = LA_SIZE_IN_POINTERS;
 # endif
 #else
        rd->memuse = 0; /* init to zero -> analyse_stack will set it to a higher  */