X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fpowerpc%2Flinux%2Fmd-abi.c;h=184bb07905d5600a490f87a8af80b224060ba6e1;hb=fa3fb41985bc911b5300f144b740159ac0c1eea0;hp=c26a7f0c04b6b0c1b1b27edd2f9605d613ffdff8;hpb=bfb7d15b502b8170ec8a9b348c546418c0e44ace;p=cacao.git diff --git a/src/vm/jit/powerpc/linux/md-abi.c b/src/vm/jit/powerpc/linux/md-abi.c index c26a7f0c0..184bb0790 100644 --- a/src/vm/jit/powerpc/linux/md-abi.c +++ b/src/vm/jit/powerpc/linux/md-abi.c @@ -1,9 +1,7 @@ /* src/vm/jit/powerpc/linux/md-abi.c - functions for PowerPC Linux 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. @@ -22,32 +20,26 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - $Id: md-abi.c 7814 2007-04-25 19:36:15Z twisti $ - */ #include "config.h" #include - -#include "vm/types.h" +#include #include "vm/jit/powerpc/linux/md-abi.h" +#include "vm/descriptor.hpp" #include "vm/global.h" #include "vm/jit/abi.h" - -#include "vmcore/descriptor.h" - - -#define _ALIGN(a) do { if ((a) & 1) (a)++; } while (0) +#include "vm/jit/stack.h" /* register descripton arrays *************************************************/ -s4 nregdescint[] = { +int nregdescint[] = { /* zero, sp, NO(sys), a0/v0, a1/v1, a2, a3, a4, */ REG_RES, REG_RES, REG_RES, REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_ARG, @@ -70,7 +62,7 @@ const char *abi_registers_integer_name[] = { "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", }; -const s4 abi_registers_integer_argument[] = { +const int abi_registers_integer_argument[] = { 3, /* a0 */ 4, /* a1 */ 5, /* a2 */ @@ -81,7 +73,7 @@ const s4 abi_registers_integer_argument[] = { 10, /* a7 */ }; -const s4 abi_registers_integer_saved[] = { +const int abi_registers_integer_saved[] = { 14, /* s0 */ 15, /* s1 */ 24, /* s2 */ @@ -94,7 +86,7 @@ const s4 abi_registers_integer_saved[] = { 31, /* s9 */ }; -const s4 abi_registers_integer_temporary[] = { +const int abi_registers_integer_temporary[] = { 17, /* t0 */ 18, /* t1 */ 19, /* t2 */ @@ -105,7 +97,7 @@ const s4 abi_registers_integer_temporary[] = { }; -s4 nregdescfloat[] = { +int nregdescfloat[] = { /*ftmp3, fa0/v0, fa1, fa2, fa3, fa4, fa5, fa6, */ REG_RES, REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_ARG, @@ -122,7 +114,7 @@ s4 nregdescfloat[] = { }; -const s4 abi_registers_float_argument[] = { +const int abi_registers_float_argument[] = { 1, /* fa0 */ 2, /* fa1 */ 3, /* fa2 */ @@ -133,7 +125,7 @@ const s4 abi_registers_float_argument[] = { 8, /* fa7 */ }; -const s4 abi_registers_float_saved[] = { +const int abi_registers_float_saved[] = { 14, /* fs0 */ 15, /* fs1 */ 24, /* fs2 */ @@ -146,7 +138,7 @@ const s4 abi_registers_float_saved[] = { 31, /* fs9 */ }; -const s4 abi_registers_float_temporary[] = { +const int abi_registers_float_temporary[] = { 9, /* ft0 */ 10, /* ft1 */ 11, /* ft2 */ @@ -181,10 +173,114 @@ const s4 abi_registers_float_temporary[] = { void md_param_alloc(methoddesc *md) { paramdesc *pd; - s4 i; - s4 iarg; - s4 farg; - s4 stacksize; + int i; + int iarg; + int farg; + int stacksize; + + /* set default values */ + + iarg = 0; + farg = 0; + stacksize = LA_SIZE_IN_POINTERS; + + /* get params field of methoddesc */ + + pd = md->params; + + for (i = 0; i < md->paramcount; i++, pd++) { + switch (md->paramtypes[i].type) { + case TYPE_INT: + case TYPE_ADR: + if (iarg < INT_ARG_CNT) { + pd->inmemory = false; + pd->index = iarg; + pd->regoff = abi_registers_integer_argument[iarg]; + iarg++; + } + else { + pd->inmemory = true; + pd->index = stacksize; + pd->regoff = stacksize * 8; + stacksize++; + } + break; + + case TYPE_LNG: + if (iarg < INT_ARG_CNT - 1) { + ALIGN_2(iarg); + pd->inmemory = false; + pd->index = PACK_REGS(iarg + 1, iarg); + pd->regoff = + PACK_REGS(abi_registers_integer_argument[iarg + 1], + abi_registers_integer_argument[iarg]); + iarg += 2; + } + else { + pd->inmemory = true; + pd->index = stacksize; + pd->regoff = stacksize * 8; + iarg = INT_ARG_CNT; + stacksize++; + } + break; + + case TYPE_FLT: + case TYPE_DBL: + if (farg < FLT_ARG_CNT) { + pd->inmemory = false; + pd->index = farg; + pd->regoff = abi_registers_float_argument[farg]; + farg++; + } + else { + pd->inmemory = true; + pd->index = stacksize; + pd->regoff = stacksize * 8; + stacksize++; + } + break; + + default: + assert(0); + } + } + + /* Since R3/R4, F1 (==A0/A1, A0) are used for passing return + values, this argument register usage has to be regarded, + too. */ + + if (IS_INT_LNG_TYPE(md->returntype.type)) { + if (iarg < (IS_2_WORD_TYPE(md->returntype.type) ? 2 : 1)) + iarg = IS_2_WORD_TYPE(md->returntype.type) ? 2 : 1; + } + else { + if (IS_FLT_DBL_TYPE(md->returntype.type)) + if (farg < 1) + farg = 1; + } + + /* fill register and stack usage */ + + md->argintreguse = iarg; + md->argfltreguse = farg; + md->memuse = stacksize; +} + + +/* md_param_alloc_native ******************************************************* + + Pre-allocate arguments according the native ABI. + +*******************************************************************************/ + +void md_param_alloc_native(methoddesc *md) +{ + paramdesc *pd; + int i; + int iarg; + int farg; + int stacksize; /* set default values */ @@ -207,14 +303,14 @@ void md_param_alloc(methoddesc *md) } else { pd->inmemory = true; - pd->regoff = stacksize; + pd->regoff = stacksize * 4; stacksize++; } break; case TYPE_LNG: if (iarg < INT_ARG_CNT - 1) { - _ALIGN(iarg); + ALIGN_2(iarg); pd->inmemory = false; pd->regoff = PACK_REGS(abi_registers_integer_argument[iarg + 1], @@ -222,9 +318,9 @@ void md_param_alloc(methoddesc *md) iarg += 2; } else { - _ALIGN(stacksize); + ALIGN_2(stacksize); pd->inmemory = true; - pd->regoff = stacksize; + pd->regoff = stacksize * 4; iarg = INT_ARG_CNT; stacksize += 2; } @@ -238,7 +334,7 @@ void md_param_alloc(methoddesc *md) } else { pd->inmemory = true; - pd->regoff = stacksize; + pd->regoff = stacksize * 4; stacksize++; } break; @@ -250,9 +346,9 @@ void md_param_alloc(methoddesc *md) farg++; } else { - _ALIGN(stacksize); + ALIGN_2(stacksize); pd->inmemory = true; - pd->regoff = stacksize; + pd->regoff = stacksize * 4; stacksize += 2; } break; @@ -284,21 +380,6 @@ void md_param_alloc(methoddesc *md) } -/* md_param_alloc_native ******************************************************* - - Pre-allocate arguments according the native ABI. - -*******************************************************************************/ - -void md_param_alloc_native(methoddesc *md) -{ - /* On PowerPC 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, if @@ -319,16 +400,19 @@ 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; + codeinfo *code; registerdata *rd; methoddesc *md; + varinfo *v; /* get required compiler data */ - m = jd->m; - rd = jd->rd; + m = jd->m; + code = jd->code; + rd = jd->rd; md = m->parseddesc; @@ -336,32 +420,37 @@ void md_return_alloc(jitdata *jd, stackptr stackslot) their argument register -> so leafmethods with paramcount > 0 could already use R3 == a00! */ - if (!jd->isleafmethod || (md->paramcount == 0)) { + if (!code_is_leafmethod(code) || (md->paramcount == 0)) { /* Only precolor the stackslot, if it is not a SAVEDVAR <-> has not to survive method invokations. */ if (!(stackslot->flags & SAVEDVAR)) { - VAR(stackslot->varnum)->flags = PREALLOC; + v = VAR(stackslot->varnum); + v->flags = PREALLOC; - if (IS_INT_LNG_TYPE(md->returntype.type)) { - if (!IS_2_WORD_TYPE(md->returntype.type)) { - if (rd->argintreguse < 1) - rd->argintreguse = 1; + switch (md->returntype.type) { + case TYPE_INT: + case TYPE_ADR: + if (rd->argintreguse < 1) + rd->argintreguse = 1; - VAR(stackslot->varnum)->vv.regoff = REG_RESULT; - } - else { - if (rd->argintreguse < 2) - rd->argintreguse = 2; + v->vv.regoff = REG_RESULT; + break; - VAR(stackslot->varnum)->vv.regoff = REG_RESULT_PACKED; - } - } - else { /* float/double */ + case TYPE_LNG: + if (rd->argintreguse < 2) + rd->argintreguse = 2; + + v->vv.regoff = REG_RESULT_PACKED; + break; + + case TYPE_FLT: + case TYPE_DBL: if (rd->argfltreguse < 1) rd->argfltreguse = 1; - - VAR(stackslot->varnum)->vv.regoff = REG_FRESULT; + + v->vv.regoff = REG_FRESULT; + break; } } } @@ -379,4 +468,5 @@ void md_return_alloc(jitdata *jd, stackptr stackslot) * c-basic-offset: 4 * tab-width: 4 * End: + * vim:noexpandtab:sw=4:ts=4: */