/* src/vm/jit/sparc64/md-abi.c - functions for Sparc ABI
- Copyright (C) 1996-2005, 2006 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, 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.h 4357 2006-01-22 23:33:38Z twisti $
-
*/
#include "vm/jit/sparc64/md-abi.h"
+#include "vm/descriptor.hpp"
#include "vm/global.h"
#include "vm/jit/abi.h"
-
-#include "vmcore/descriptor.h"
+#include "vm/jit/stack.h"
/* temp */
-#include "mm/memory.h"
+#include "mm/memory.hpp"
#include <assert.h>
/* l0 l1 l2 l3 l4 l5 l6 l7 */
REG_SAV, REG_SAV, REG_SAV, REG_SAV, REG_SAV, REG_SAV, REG_SAV, REG_SAV,
- /* i0/v0 i1 i2 i3 i4 pv/i5 fp/i6 ra/i7 */
- REG_RET, REG_SAV, REG_SAV, REG_SAV, REG_SAV, REG_RES, REG_RES, REG_RES,
+ /* i0 i1 i2 i3 i4 pv/i5 fp/i6 ra/i7 */
+ REG_SAV, REG_SAV, REG_SAV, REG_SAV, REG_SAV, REG_RES, REG_RES, REG_RES,
REG_END
-
+};
+
+const char *abi_registers_integer_name[] = {
+ "zero", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
+ "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7",
+ "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
+ "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7"
+};
+
+const s4 abi_registers_integer_argument[] = {
+ 8, /* o0 */
+ 9, /* o1 */
+ 10, /* o2 */
+ 11, /* o3 */
+ 12, /* o4 */
+};
+const s4 abi_registers_integer_saved[] = {
+ 16, /* l0 */
+ 17, /* l1 */
+ 18, /* l2 */
+ 19, /* l3 */
+ 20, /* l4 */
+ 21, /* l5 */
+ 22, /* l6 */
+ 23, /* l7 */
+ 24, /* i0 */
+ 25, /* i1 */
+ 26, /* i2 */
+ 27, /* i3 */
+ 28, /* i4 */
};
+
+
s4 nregdescfloat[] = {
REG_RET, REG_RES, REG_RES, REG_RES, REG_TMP, REG_TMP, REG_TMP, REG_TMP,
- REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_TMP, REG_TMP, REG_TMP, REG_TMP,
+ REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_TMP, REG_TMP, REG_TMP,
REG_END
};
+const s4 abi_registers_float_argument[] = {
+ 8, /* f16 */
+ 9, /* f18 */
+ 10, /* f20 */
+ 11, /* f22 */
+ 12, /* f24 */
+};
+
+const s4 abi_registers_float_temporary[] = {
+ 4, /* f8 */
+ 5, /* f10 */
+ 6, /* f12 */
+ 7, /* f14 */
+ 13, /* f26 */
+ 14, /* f28 */
+ 15, /* f30 */
+};
+
s4 nat_argintregs[] = {
REG_OUT0, REG_OUT1, REG_OUT2, REG_OUT3, REG_OUT4, REG_OUT5
};
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 {
+ }
+ else {
pd->inmemory = true;
- pd->regoff = stacksize;
+ pd->index = stacksize;
+ pd->regoff = stacksize * 8;
stacksize++;
}
break;
+
case TYPE_FLT:
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 {
+ }
+ else {
pd->inmemory = true;
- pd->regoff = stacksize;
+ pd->index = stacksize;
+ pd->regoff = stacksize * 8;
stacksize++;
}
break;
}
+ assert(pd->regoff != 26);
}
/* Since O0 is used for passing return values, this */
md->memuse = stacksize;
}
-/* md_native_param_alloc **************************************************************
-
- XXX
-*******************************************************************************/
+/* md_param_alloc_native *******************************************************
+ *
+ * Pre-allocate arguments according to the native ABI.
+ *
+ * *******************************************************************************/
-void md_native_param_alloc(methoddesc *md)
+void md_param_alloc_native(methoddesc *md)
{
paramdesc *pd;
s4 i;
s4 reguse;
s4 stacksize;
+ s4 min_nat_regs;
+ /* Note: regoff will be set relative to a stack base of $sp+16 */
+
/* set default values */
-
reguse = 0;
- stacksize = 6;
+ stacksize = 6; /* abi params: allocated, but not used */
+
+ /* when we are above this, we have to increase the stacksize with every */
+ /* single argument to create the proper argument array */
+ min_nat_regs = MIN(INT_NATARG_CNT, FLT_NATARG_CNT);
/* get params field of methoddesc */
case TYPE_LNG:
if (i < INT_NATARG_CNT) {
pd->inmemory = false;
- pd->regoff = reguse;
+ pd->regoff = nat_argintregs[reguse];
reguse++;
md->argintreguse = reguse;
} else {
pd->inmemory = true;
- pd->regoff = reguse;
+ pd->regoff = reguse * 8;
reguse++;
- stacksize++;
}
break;
case TYPE_FLT:
md->argfltreguse = reguse;
} else {
pd->inmemory = true;
- pd->regoff = reguse;
+ pd->regoff = reguse * 8;
reguse++;
- stacksize++;
}
+
break;
}
+
+ if (i >= min_nat_regs)
+ stacksize++;
}
/* Since O0 is used for passing return values, this */
md->memuse = stacksize;
}
-/* reg_setup *******************************************************************
-
- TODO
-
-*******************************************************************************/
-
-void md_native_reg_setup(jitdata *jd)
-{
- methodinfo *m;
- registerdata *rd;
- s4 i;
-
- /* get required compiler data */
-
- m = jd->m;
- rd = jd->rd;
-
- /* setup the integer register table */
-
-
- rd->argintregs = DMNEW(s4, INT_NATARG_CNT);
- rd->argintreguse = 0;
-
- for (rd->argintreguse = 0, i = 8; rd->argintreguse < INT_NATARG_CNT; i++) {
- rd->argintregs[rd->argintreguse++] = i;
- }
-
- assert(rd->argintreguse == INT_NATARG_CNT);
-
- /* setup the float register table */
-
- rd->argfltregs = DMNEW(s4, FLT_NATARG_CNT);
-
- rd->argfltreguse = 0;
-
-
- for (rd->argfltreguse = 0, i = 0; rd->argfltreguse < FLT_NATARG_CNT; i++) {
- rd->argfltregs[rd->argfltreguse++] = i;
- }
- assert(rd->argfltreguse == FLT_NATARG_CNT);
-
-}
-
/* md_return_alloc *************************************************************
XXX
*******************************************************************************/
-void md_return_alloc(jitdata *jd, stackptr stackslot)
+void md_return_alloc(jitdata *jd, stackelement_t* stackslot)
{
/* XXX */
}
* c-basic-offset: 4
* tab-width: 4
* End:
+ * vim:noexpandtab:sw=4:ts=4:
*/