* Removed all Id tags.
[cacao.git] / src / vm / jit / reg.c
index 04f1b65719ecf5b705a4734a17db8377b671bc98..699b362befc08de266cbc692e4cc69d680791719 100644 (file)
@@ -1,9 +1,9 @@
 /* src/vm/jit/reg.c - register allocator setup
 
-   Copyright (C) 1996-2005 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
+   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
 
    This file is part of CACAO.
 
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.
-
-   Contact: cacao@complang.tuwien.ac.at
-
-   Authors: Andreas Krall
-
-   Changes: Stefan Ring
-            Christian Thalinger
-                       Christian Ullrich
-            Michael Starzinger
-
-   $Id: reg.c 4056 2006-01-02 13:05:56Z christian $
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
 
 */
 
 
 #include "config.h"
-#include "vm/types.h"
 
-#include "assert.h"
+#include <assert.h>
+
+#include "vm/types.h"
 
 #include "arch.h"
 #include "md-abi.h"
 
 #include "mm/memory.h"
+#include "vm/jit/abi.h"
 #include "vm/jit/reg.h"
 
-#include "md-abi.inc"
 
 /* reg_setup *******************************************************************
 
 
 *******************************************************************************/
 
-void reg_setup(methodinfo *m, registerdata *rd, t_inlining_globals *id)
+void reg_setup(jitdata *jd)
 {
-       s4 i;
-       varinfo5 *v;
-       
+       methodinfo   *m;
+       registerdata *rd;
+       s4            i;
+
+       /* get required compiler data */
+
+       m  = jd->m;
+       rd = jd->rd;
+
        /* 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);
@@ -92,29 +79,11 @@ void reg_setup(methodinfo *m, registerdata *rd, t_inlining_globals *id)
                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 */
 
@@ -125,7 +94,7 @@ void reg_setup(methodinfo *m, registerdata *rd, t_inlining_globals *id)
        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;
@@ -153,7 +122,6 @@ void reg_setup(methodinfo *m, registerdata *rd, t_inlining_globals *id)
                
        /* 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);
@@ -175,56 +143,30 @@ void reg_setup(methodinfo *m, registerdata *rd, t_inlining_globals *id)
                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, id->cummaxstack);
+       rd->freemem    = DMNEW(s4, m->maxstack);
 #if defined(HAS_4BYTE_STACKSLOT)
-       rd->freemem_2  = DMNEW(s4, id->cummaxstack);
+       rd->freemem_2  = DMNEW(s4, m->maxstack);
 #endif
-       rd->locals     = DMNEW(varinfo5, id->cumlocals);
-       rd->interfaces = DMNEW(varinfo5, id->cummaxstack);
-       for (v = rd->locals, i = id->cumlocals; 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;
-       }
-
-       for (v = rd->interfaces, i = id->cummaxstack; 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;
-       }
 
 #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  */
                        /* value, if appropriate */
 #endif
 
-       /* Set rd->argxxxreguse to XXX_ARG_CNBT to not use unused argument        */
+       /* Set rd->arg*reguse to *_ARG_CNBT to not use unused argument            */
        /* registers as temp registers  */
 #if defined(HAS_ADDRESS_REGISTER_FILE)
        rd->argadrreguse = 0;
@@ -233,6 +175,7 @@ void reg_setup(methodinfo *m, registerdata *rd, t_inlining_globals *id)
        rd->argfltreguse = 0;
 }
 
+
 /*
  * These are local overrides for various environment variables in Emacs.
  * Please do not remove this and leave it at the end of the file, where
@@ -244,4 +187,5 @@ void reg_setup(methodinfo *m, registerdata *rd, t_inlining_globals *id)
  * c-basic-offset: 4
  * tab-width: 4
  * End:
+ * vim:noexpandtab:sw=4:ts=4:
  */