* Removed all Id tags.
[cacao.git] / src / vm / jit / alpha / md-abi.c
index 51c501dcb8030e15ab72bcc22a947e4592b1978e..2bc665662a31b3fed76332acc6aa5d8f13092798 100644 (file)
@@ -1,6 +1,6 @@
 /* src/vm/jit/alpha/md-abi.c - functions for Alpha ABI
 
-   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: Christian Thalinger
-
-   Changes: Christian Ullrich
-
-   $Id: md-abi.c 5595 2006-09-30 23:06:36Z edwin $
-
 */
 
 
 
 #include "vm/jit/alpha/md-abi.h"
 
-#include "vm/descriptor.h"
 #include "vm/global.h"
+
 #include "vm/jit/abi.h"
 
+#include "vmcore/descriptor.h"
+
 
 /* register descripton array **************************************************/
 
@@ -61,6 +55,47 @@ s4 nregdescint[] = {
        REG_END
 };
 
+const char *abi_registers_integer_name[] = {
+       "v0",  "t0",  "t1",  "t2",  "t3",  "t4",  "t5",  "t6",
+       "t7",  "s0",  "s1",  "s2",  "s3",  "s4",  "s5",  "s6",
+       "a0",  "a1",  "a2",  "a3",  "a4",  "a5",  "t8",  "t9",
+       "t10", "t11", "ra",  "pv",  "at",  "gp",  "sp",  "zero"
+};
+
+const s4 abi_registers_integer_argument[] = {
+       16, /* a0  */
+       17, /* a1  */
+       18, /* a2  */
+       19, /* a3  */
+       20, /* a4  */
+       21, /* a5  */
+};
+
+const s4 abi_registers_integer_saved[] = {
+       9,  /* s0  */
+       10, /* s1  */
+       11, /* s2  */
+       12, /* s3  */
+       13, /* s4  */
+       14, /* s5  */
+       15, /* s6  */
+};
+
+const s4 abi_registers_integer_temporary[] = {
+       1,  /* t0  */
+       2,  /* t1  */
+       3,  /* t2  */
+       4,  /* t3  */
+       5,  /* t4  */
+       6,  /* t5  */
+       7,  /* t6  */
+       8,  /* t7  */
+       22, /* t8  */
+       23, /* t9  */
+       24, /* t10 */
+};
+
+
 s4 nregdescfloat[] = {
        REG_RET, REG_TMP, REG_SAV, REG_SAV, REG_SAV, REG_SAV, REG_SAV, REG_SAV,
        REG_SAV, REG_SAV, REG_TMP, REG_TMP, REG_TMP, REG_TMP, REG_TMP, REG_TMP, 
@@ -70,6 +105,43 @@ s4 nregdescfloat[] = {
 };
 
 
+const s4 abi_registers_float_argument[] = {
+       16, /* fa0  */
+       17, /* fa1  */
+       18, /* fa2  */
+       19, /* fa3  */
+       20, /* fa4  */
+       21, /* fa5  */
+};
+
+const s4 abi_registers_float_saved[] = {
+       2,  /* fs0  */
+       3,  /* fs1  */
+       4,  /* fs2  */
+       5,  /* fs3  */
+       6,  /* fs4  */
+       7,  /* fs5  */
+       8,  /* fs6  */
+       9,  /* fs7  */
+};
+
+const s4 abi_registers_float_temporary[] = {
+       1,  /* ft0  */
+       10, /* ft1  */
+       11, /* ft2  */
+       12, /* ft3  */
+       13, /* ft4  */
+       14, /* ft5  */
+       15, /* ft6  */
+       22, /* ft7  */
+       23, /* ft8  */
+       24, /* ft9  */
+       25, /* ft10 */
+       26, /* ft11 */
+       27, /* ft12 */
+};
+
+
 /* md_param_alloc **************************************************************
 
    Allocate the parameters of the given method descriptor according to the
@@ -86,7 +158,7 @@ void md_param_alloc(methoddesc *md)
 
        /* set default values */
 
-       reguse = 0;
+       reguse    = 0;
        stacksize = 0;
 
        /* get params field of methoddesc */
@@ -100,13 +172,15 @@ void md_param_alloc(methoddesc *md)
                case TYPE_LNG:
                        if (i < INT_ARG_CNT) {
                                pd->inmemory = false;
-                               pd->regoff = reguse;
+                               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;
@@ -115,13 +189,15 @@ void md_param_alloc(methoddesc *md)
                case TYPE_DBL:
                        if (i < FLT_ARG_CNT) {
                                pd->inmemory = false;
-                               pd->regoff = reguse;
+                               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;
@@ -134,6 +210,21 @@ void md_param_alloc(methoddesc *md)
 }
 
 
+/* md_param_alloc_native *******************************************************
+
+   Pre-allocate arguments according to the native ABI.
+
+*******************************************************************************/
+
+void md_param_alloc_native(methoddesc *md)
+{
+       /* On Alpha we use the same ABI for JIT method calls as for native
+          method calls. */
+
+       md_param_alloc(md);
+}
+
+
 /* md_return_alloc *************************************************************
 
    Precolor the Java Stackelement containing the Return Value. Since
@@ -143,15 +234,13 @@ void md_param_alloc(methoddesc *md)
    (SAVEDVAR)
 
    --- in
-   m:                       Methodinfo of current method
-   return_type:             Return Type of the Method (TYPE_INT.. TYPE_ADR)
-                                                       TYPE_VOID is not allowed!
+   jd:                      jitdata of the current method
    stackslot:               Java Stackslot to contain the Return Value
    
    --- out
    if precoloring was possible:
-   jd->var[stackslot->varnum]->flags       = PREALLOC
-                                        ->regoff      =[REG_RESULT|REG_FRESULT]
+   VAR(stackslot->varnum)->flags       = PREALLOC
+                                    ->vv.regoff   = [REG_RESULT|REG_FRESULT]
    rd->arg[flt|int]reguse   set to a value according the register usage
 
    NOTE: Do not pass a LOCALVAR in stackslot->varnum.
@@ -164,8 +253,6 @@ void md_return_alloc(jitdata *jd, stackptr stackslot)
 
        /* get required compiler data */
 
-       return;
-
        m = jd->m;
 
        md = m->parseddesc;
@@ -174,17 +261,12 @@ void md_return_alloc(jitdata *jd, stackptr stackslot)
           not to survive method invokations. */
 
        if (!(stackslot->flags & SAVEDVAR)) {
-/*             stackslot->varkind = ARGVAR; */
-/*             stackslot->varnum  = -1; */
-/*             stackslot->flags   = 0; */
 
                VAR(stackslot->varnum)->flags = PREALLOC;
 
                if (IS_INT_LNG_TYPE(md->returntype.type))
-/*                     stackslot->regoff = REG_RESULT; */
                        VAR(stackslot->varnum)->vv.regoff = REG_RESULT;
                else
-/*                     stackslot->regoff = REG_FRESULT; */
                        VAR(stackslot->varnum)->vv.regoff = REG_FRESULT;
        }
 }