Merged subtype branch to new head.
[cacao.git] / src / vm / jit / allocator / lsra.c
index 69972dce98a974ad20bfb778574c8e9c3a43b9b6..83b64c81c00b3578b2b06e9ab60cf490fb76b8c5 100644 (file)
@@ -1,9 +1,7 @@
 /* src/vm/jit/allocator/lsra.c - linear scan register allocator
 
-   Copyright (C) 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
+   Copyright (C) 2005, 2006, 2007, 2008
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
    This file is part of CACAO.
 
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Contact: cacao@cacaojvm.org
-
-   Authors: Christian Ullrich
-            Christian Thalinger
-            Edwin Steiner
-
-   $Id: lsra.c 6286 2007-01-10 10:03:38Z twisti $
-
 */
 
 
 #include "vm/types.h"
 
 #include "mm/memory.h"
+
 #include "toolbox/logging.h"
-#include "vm/builtin.h"
-#include "vm/exceptions.h"
+
+#include "vm/jit/builtin.hpp"
+#include "vm/exceptions.hpp"
 #include "vm/resolve.h"
 #include "vm/options.h"
 #include "vm/statistics.h"
-#include "vm/stringlocal.h"
+
 #include "vm/jit/abi.h"
 #include "vm/jit/reg.h"
+
 #include "vm/jit/allocator/liveness.h"
 #include "vm/jit/allocator/lsra.h"
 
@@ -87,7 +80,7 @@ struct freemem *lsra_getnewmem(int *);
 void lsra_setflags(int *, int);
 
 #ifdef LSRA_DEBUG_VERBOSE 
-void lsra_dump_stack(stackptr );
+void lsra_dump_stack(stackelement_t* );
 void print_lifetimes(jitdata *, int *, int);
 #endif
 
@@ -95,9 +88,9 @@ void print_lifetimes(jitdata *, int *, int);
 void lsra_scan_registers_canditates(jitdata *, int);
 void lsra_join_lifetimes(jitdata *, int);
 
-void _lsra_new_stack( lsradata *, stackptr , int , int, int);
-void _lsra_from_stack(lsradata *, stackptr , int , int, int);
-void lsra_add_ss(struct lifetime *, stackptr );
+void _lsra_new_stack( lsradata *, stackelement_t* , int , int, int);
+void _lsra_from_stack(lsradata *, stackelement_t* , int , int, int);
+void lsra_add_ss(struct lifetime *, stackelement_t* );
 void lsra_usage_local(lsradata *, s4 , int , int , int , int );
 #endif
 
@@ -113,7 +106,7 @@ bool lsra(jitdata *jd)
 #if defined(LSRA_DEBUG_CHECK)
        methodinfo   *m;
        int      b_index;
-       stackptr in,out;
+       stackelement_t* in,out;
        int      ind, outd;
 #endif
 
@@ -1053,7 +1046,7 @@ void lsra_reg_setup(jitdata *jd, struct lsra_register *int_reg,
 
        int_reg->nregdesc = nregdescint;
        flt_reg->nregdesc = nregdescfloat;
-       if (jd->isleafmethod) { 
+       if (code_is_leafmethod(code)) { 
                /* Temp and Argumentregister can be used as saved registers */
 
                int_reg->sav_top = INT_ARG_CNT + INT_TMP_CNT + INT_SAV_CNT;
@@ -1308,7 +1301,7 @@ void lsra_main(jitdata *jd) {
        /* 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;
@@ -1491,7 +1484,7 @@ void _lsra_main(jitdata *jd, int *lifet, int lifetimecount,
                lsra_expire_old_intervalls(jd, lt, reg);
                reg_index = -1;
                temp = false;
-               if (lt->savedvar || jd->isleafmethod) {
+               if (lt->savedvar || code_is_leafmethod(code)) {
                        /* use Saved Reg (in case of leafmethod all regs are saved regs) */
                        if (reg->sav_top > regsneeded) {
 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
@@ -1570,7 +1563,7 @@ void _lsra_expire_old_intervalls(jitdata *jd, struct lifetime *lt,
                if (active[i]->i_end > lt->i_start) break;
 
                /* make active[i]->reg available again */
-               if (jd->isleafmethod) { 
+               if (code_is_leafmethod(code)) { 
                        /* leafmethod -> don't care about type -> put all again into */
                        /* reg->sav_reg */
 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
@@ -1614,7 +1607,7 @@ void _lsra_expire_old_intervalls(jitdata *jd, struct lifetime *lt,
 
 void spill_at_intervall(jitdata *jd, struct lifetime *lt )
 {
-       if (lt->savedvar || jd->isleafmethod) {
+       if (lt->savedvar || code_is_leafmethod(code)) {
                _spill_at_intervall(lt, jd->ls->active_sav, &(jd->ls->active_sav_top));
        } else {
                _spill_at_intervall(lt, jd->ls->active_tmp, &(jd->ls->active_tmp_top));
@@ -1987,7 +1980,7 @@ void lsra_join_lifetimes(jitdata *jd,int b_index) {
        }
 }
 
-struct stackslot *lsra_make_ss(stackptr s, int bb_index)
+struct stackslot *lsra_make_ss(stackelement_t* s, int bb_index)
 {
        struct stackslot *ss;
 
@@ -1997,7 +1990,7 @@ struct stackslot *lsra_make_ss(stackptr s, int bb_index)
        return ss;
 }
 
-void lsra_add_ss(struct lifetime *lt, stackptr s) {
+void lsra_add_ss(struct lifetime *lt, stackelement_t* s) {
        struct stackslot *ss;
 
        /* Stackslot not in list? */
@@ -2014,7 +2007,7 @@ void lsra_add_ss(struct lifetime *lt, stackptr s) {
        }
 }
 
-struct lifetime *get_ss_lifetime(lsradata *ls, stackptr s) {
+struct lifetime *get_ss_lifetime(lsradata *ls, stackelement_t* s) {
        struct lifetime *n;
        
        if (s->varnum >= 0) { /* new stackslot lifetime */
@@ -2086,7 +2079,7 @@ struct lifetime *get_ss_lifetime(lsradata *ls, stackptr s) {
 
 #define lsra_new_stack(ls, s, block, instr) \
        if ((s)->varkind != ARGVAR) _lsra_new_stack(ls, s, block, instr, LSRA_STORE)
-void _lsra_new_stack(lsradata *ls, stackptr s, int block, int instr, int store)
+void _lsra_new_stack(lsradata *ls, stackelement_t* s, int block, int instr, int store)
 {
        struct lifetime *n;
 
@@ -2110,7 +2103,7 @@ void _lsra_new_stack(lsradata *ls, stackptr s, int block, int instr, int store)
        if ((s)->varkind != ARGVAR) _lsra_from_stack(ls, s, block, instr, LSRA_LOAD)
 #define lsra_pop_from_stack(ls, s, block, instr) \
        if ((s)->varkind != ARGVAR) _lsra_from_stack(ls, s, block, instr, LSRA_POP)
-void _lsra_from_stack(lsradata *ls, stackptr s, int block, int instr, int store)
+void _lsra_from_stack(lsradata *ls, stackelement_t* s, int block, int instr, int store)
 {
        struct lifetime *n;
 
@@ -2174,7 +2167,7 @@ void lsra_usage_local(lsradata *ls, s4 v_index, int type, int block, int instr,
 }      
 
 #ifdef LSRA_DEBUG_VERBOSE
-void lsra_dump_stack(stackptr s)
+void lsra_dump_stack(stackelement_t* s)
 {
        while (s!=NULL) {
                printf("%p(R%3i N%3i K%3i T%3i F%3i) ",(void *)s,s->regoff, s->varnum, 
@@ -2194,8 +2187,8 @@ void lsra_scan_registers_canditates(jitdata *jd, int b_index)
        int i;
        int opcode;
        int iindex;
-       stackptr    src;
-       stackptr    dst;
+       stackelement_t*    src;
+       stackelement_t*    dst;
        instruction *iptr;
        bool join_ret; /* for lsra_join* Macros */
        methodinfo *m;