Merged branch subtype-trunk into default.
[cacao.git] / src / vm / jit / mips / md-abi.c
index c11bdb6de2ef9c6436dc53cb79b2043a4bd5eb54..da2af84aaae52957cb26bee8dd77ec23638f0339 100644 (file)
@@ -1,9 +1,7 @@
 /* src/vm/jit/mips/md-abi.c - functions for MIPS ABI
 
-   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
+   Copyright (C) 1996-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.
 
-   $Id: md-abi.c 8012 2007-06-05 10:14:29Z twisti $
-
 */
 
 
 #include "config.h"
+
+#include <stdarg.h>
+#include <stdint.h>
+
 #include "vm/types.h"
 
 #include "vm/jit/mips/md-abi.h"
 
+#include "mm/memory.hpp"
+
+#include "vm/descriptor.hpp"
 #include "vm/global.h"
+#include "vm/method.hpp"
 
 #include "vm/jit/abi.h"
-
-#include "vmcore/descriptor.h"
+#include "vm/jit/stack.h"
 
 
 /* register descripton array **************************************************/
@@ -281,7 +284,7 @@ void md_param_alloc(methoddesc *md)
                case TYPE_INT:
                case TYPE_ADR:
                case TYPE_LNG:
-                       if (i < INT_ARG_CNT) {
+                       if (reguse < INT_ARG_CNT) {
                                pd->inmemory = false;
                                pd->regoff   = abi_registers_integer_argument[reguse];
                                reguse++;
@@ -289,13 +292,14 @@ void md_param_alloc(methoddesc *md)
                        }
                        else {
                                pd->inmemory = true;
-                               pd->regoff   = stacksize;
+                               pd->regoff   = stacksize * 8;
                                stacksize++;
                        }
                        break;
+
                case TYPE_FLT:
                case TYPE_DBL:
-                       if (i < FLT_ARG_CNT) {
+                       if (reguse < FLT_ARG_CNT) {
                                pd->inmemory = false;
                                pd->regoff   = abi_registers_float_argument[reguse];
                                reguse++;
@@ -303,7 +307,7 @@ void md_param_alloc(methoddesc *md)
                        }
                        else {
                                pd->inmemory = true;
-                               pd->regoff   = stacksize;
+                               pd->regoff   = stacksize * 8;
                                stacksize++;
                        }
                        break;
@@ -330,13 +334,15 @@ void md_param_alloc(methoddesc *md)
                case TYPE_ADR:
                        if (reguse < INT_ARG_CNT) {
                                pd->inmemory = false;
+                               pd->index    = reguse;
                                pd->regoff   = abi_registers_integer_argument[reguse];
                                reguse++;
                                md->argintreguse = reguse;
                        }
                        else {
                                pd->inmemory = true;
-                               pd->regoff   = stacksize;
+                               pd->index    = stacksize;
+                               pd->regoff   = stacksize * 8;
                                stacksize++;
                        }
                        break;
@@ -347,10 +353,12 @@ void md_param_alloc(methoddesc *md)
                        if (reguse < INT_ARG_CNT) {
                                pd->inmemory = false;
 #  if WORDS_BIGENDIAN == 1
+                               pd->index    = PACK_REGS(reguse + 1, reguse);
                                pd->regoff   =
                                        PACK_REGS(abi_registers_integer_argument[reguse + 1],
                                                          abi_registers_integer_argument[reguse]);
 #  else
+                               pd->index    = PACK_REGS(reguse, reguse + 1);
                                pd->regoff   =
                                        PACK_REGS(abi_registers_integer_argument[reguse],
                                                          abi_registers_integer_argument[reguse + 1]);
@@ -360,7 +368,8 @@ void md_param_alloc(methoddesc *md)
                        }
                        else {
                                pd->inmemory = true;
-                               pd->regoff   = stacksize;
+                               pd->index    = stacksize;
+                               pd->regoff   = stacksize * 8;
                                stacksize++;
                        }
                        break;
@@ -369,13 +378,15 @@ void md_param_alloc(methoddesc *md)
                case TYPE_DBL:
                        if (reguse < FLT_ARG_CNT) {
                                pd->inmemory = false;
+                               pd->index    = reguse;
                                pd->regoff   = abi_registers_float_argument[reguse];
                                reguse++;
                                md->argfltreguse = reguse;
                        }
                        else {
                                pd->inmemory = true;
-                               pd->regoff   = stacksize;
+                               pd->index    = stacksize;
+                               pd->regoff   = stacksize * 8;
                                stacksize++;
                        }
                        break;
@@ -404,7 +415,7 @@ void md_param_alloc(methoddesc *md)
                        }
                        else {
                                pd->inmemory = true;
-                               pd->regoff   = stacksize;
+                               pd->regoff   = stacksize * 8;
                        }
                        stacksize++;
                        break;
@@ -429,7 +440,7 @@ void md_param_alloc(methoddesc *md)
                        }
                        else {
                                pd->inmemory = true;
-                               pd->regoff   = stacksize;
+                               pd->regoff   = stacksize * 8;
                        }
                        stacksize += 2;
                        break;
@@ -529,7 +540,7 @@ void md_param_alloc_native(methoddesc *md)
                                        ALIGN_2(stacksize);
 
                                        pd->inmemory = true;
-                                       pd->regoff   = stacksize;
+                                       pd->regoff   = stacksize * 4;
                                }
                                stacksize += 2;
                        }
@@ -544,7 +555,7 @@ void md_param_alloc_native(methoddesc *md)
                                }
                                else {
                                        pd->inmemory = true;
-                                       pd->regoff   = stacksize;
+                                       pd->regoff   = stacksize * 4;
                                }
                                stacksize++;
                        }
@@ -569,7 +580,7 @@ void md_param_alloc_native(methoddesc *md)
                        }
                        else {
                                pd->inmemory = true;
-                               pd->regoff   = stacksize;
+                               pd->regoff   = stacksize * 4;
                        }
                        stacksize++;
                        break;
@@ -593,7 +604,7 @@ void md_param_alloc_native(methoddesc *md)
                        }
                        else {
                                pd->inmemory = true;
-                               pd->regoff   = stacksize;
+                               pd->regoff   = stacksize * 4;
                        }
                        stacksize += 2;
                        break;
@@ -629,7 +640,7 @@ void md_param_alloc_native(methoddesc *md)
 
 *******************************************************************************/
 
-void md_return_alloc(jitdata *jd, stackptr stackslot)
+void md_return_alloc(jitdata *jd, stackelement_t *stackslot)
 {
        methodinfo *m;
        methoddesc *md;