X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fx86_64%2Fmd-abi.c;h=9ae511b14cf585da2310a9ee858cabc74953fd4b;hb=b09cdc3299b9caac1cbf3c735d7b4d927e7c23af;hp=031093b7a5881e825ad8ac213cc4d54ebd3f093d;hpb=7cc5df629c9a6c592a402395e8125c71c1e86ae7;p=cacao.git diff --git a/src/vm/jit/x86_64/md-abi.c b/src/vm/jit/x86_64/md-abi.c index 031093b7a..9ae511b14 100644 --- a/src/vm/jit/x86_64/md-abi.c +++ b/src/vm/jit/x86_64/md-abi.c @@ -1,9 +1,7 @@ /* src/vm/jit/x86_64/md-abi.c - functions for x86_64 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,8 +20,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - $Id: md-abi.c 7248 2007-01-29 19:28:12Z twisti $ - */ @@ -34,6 +30,10 @@ #include "vm/global.h" +#include "vm/jit/abi.h" +#include "vm/jit/jit.h" /* for REG_* (maybe can be removed) */ +#include "vm/jit/stack.h" + #include "vmcore/descriptor.h" @@ -45,11 +45,42 @@ s4 nregdescint[] = { REG_END }; -char *regs[] = { +const char *abi_registers_integer_name[] = { "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" }; +const s4 abi_registers_integer_argument[] = { + 7, /* a0 */ + 6, /* a1 */ + 2, /* a2 */ + 1, /* a3 */ + 8, /* a4 */ + 9, /* a5 */ +}; + +const s4 abi_registers_integer_saved[] = { + 5, /* s0 */ + 12, /* s1 */ + 13, /* s2 */ + 14, /* s3 */ + 15, /* s4 */ +}; + +const s4 abi_registers_integer_temporary[] = { + 3, /* t0 */ +}; + + +/* float registers ************************************************************* + + xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, + (fa0) (fa1) (fa2) (fa3) (fa4) (fa5) (fa6) (fa7) + + xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15 + (ftmp1) (ftmp2) (ftmp3) (ft0) (ft1) (ft2) (ft3) (ft4) + +*******************************************************************************/ s4 nregdescfloat[] = { REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_ARG, @@ -58,6 +89,30 @@ s4 nregdescfloat[] = { }; +const s4 abi_registers_float_argument[] = { + 0, /* fa0 */ + 1, /* fa1 */ + 2, /* fa2 */ + 3, /* fa3 */ + 4, /* fa4 */ + 5, /* fa5 */ + 6, /* fa6 */ + 7, /* fa7 */ +}; + +const s4 abi_registers_float_saved[] = { + -1, +}; + +const s4 abi_registers_float_temporary[] = { + 11, /* ft0 */ + 12, /* ft1 */ + 13, /* ft2 */ + 14, /* ft3 */ + 15, /* ft4 */ +}; + + /* md_param_alloc ************************************************************** XXX @@ -74,8 +129,8 @@ void md_param_alloc(methoddesc *md) /* set default values */ - iarg = 0; - farg = 0; + iarg = 0; + farg = 0; stacksize = 0; /* get params field of methoddesc */ @@ -89,32 +144,32 @@ void md_param_alloc(methoddesc *md) case TYPE_LNG: if (iarg < INT_ARG_CNT) { pd->inmemory = false; - pd->regoff = iarg; + pd->index = iarg; + pd->regoff = abi_registers_integer_argument[iarg]; + iarg++; } else { pd->inmemory = true; - pd->regoff = stacksize; - } - if (iarg < INT_ARG_CNT) - iarg++; - else + pd->index = stacksize; + pd->regoff = stacksize * 8; stacksize++; + } break; case TYPE_FLT: case TYPE_DBL: if (farg < FLT_ARG_CNT) { pd->inmemory = false; - pd->regoff = farg; + pd->index = farg; + pd->regoff = abi_registers_float_argument[farg]; + farg++; } else { pd->inmemory = true; - pd->regoff = stacksize; - } - if (farg < FLT_ARG_CNT) - farg++; - else + pd->index = stacksize; + pd->regoff = stacksize * 8; stacksize++; + } break; } } @@ -134,6 +189,21 @@ 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 x86_64 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. Only @@ -155,16 +225,18 @@ void md_param_alloc(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; /* get required compiler data */ - m = jd->m; - rd = jd->rd; + m = jd->m; + code = jd->code; + rd = jd->rd; md = m->parseddesc; @@ -178,7 +250,7 @@ void md_return_alloc(jitdata *jd, stackptr stackslot) to their argument register -> so leafmethods with paramcount > 0 could already use 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 */