X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fsparc64%2Fmd-abi.c;h=51a53a8fb402f638d1738c0d4678c0b6b7f24240;hb=fa3fb41985bc911b5300f144b740159ac0c1eea0;hp=2e89ba8b6fc151b5eb50ad297222e4fcb6547adf;hpb=74390d8d25a8c33e8189b3ec19fe3fdfb0083c9a;p=cacao.git diff --git a/src/vm/jit/sparc64/md-abi.c b/src/vm/jit/sparc64/md-abi.c index 2e89ba8b6..51a53a8fb 100644 --- a/src/vm/jit/sparc64/md-abi.c +++ b/src/vm/jit/sparc64/md-abi.c @@ -1,9 +1,7 @@ /* 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. @@ -22,8 +20,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - $Id: md-abi.h 4357 2006-01-22 23:33:38Z twisti $ - */ @@ -32,14 +28,14 @@ #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 @@ -56,20 +52,69 @@ s4 nregdescint[] = { /* 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 }; @@ -115,30 +160,37 @@ 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 { + } + 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 */ @@ -153,23 +205,30 @@ void md_param_alloc(methoddesc *md) 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 */ @@ -182,15 +241,14 @@ void md_native_param_alloc(methoddesc *md) 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: @@ -202,12 +260,15 @@ void md_native_param_alloc(methoddesc *md) 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 */ @@ -222,56 +283,13 @@ void md_native_param_alloc(methoddesc *md) 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 */ } @@ -288,4 +306,5 @@ void md_return_alloc(jitdata *jd, stackptr stackslot) * c-basic-offset: 4 * tab-width: 4 * End: + * vim:noexpandtab:sw=4:ts=4: */