/* src/vm/jit/powerpc64/linux/md-abi.c - functions for PowerPC64 Linux 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: Roland Lezuo
-
- Changes:
-
- $Id: md-abi.c 5978 2006-11-13 21:43:41Z tbfg $
+ $Id: md-abi.c 7452 2007-03-04 23:32:24Z twisti $
*/
#include "config.h"
+
+#include <assert.h>
+
#include "vm/types.h"
#include "vm/jit/powerpc64/linux/md-abi.h"
-#include "vm/descriptor.h"
#include "vm/global.h"
+
#include "vm/jit/abi.h"
-#include <assert.h>
+
+#include "vmcore/descriptor.h"
#define CACAO_ALIGN(a) do { if ((a) & 1) (a)++; } while (0)
REG_END
};
-char *regs[] = {
+const char *abi_registers_integer_name[] = {
"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
"r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
"r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
iarg = 0;
farg = 0;
arg = 0;
- stacksize = LA_SIZE_IN_POINTERS + PA_SIZE_IN_POINTERS;
+ stacksize = LA_SIZE_IN_POINTERS;
stackcount = 0;
/* get params field of methoddesc */
case TYPE_LNG:
case TYPE_INT:
case TYPE_ADR:
- if (arg < INT_ARG_CNT) {
+ if (iarg < INT_ARG_CNT) {
pd->inmemory = false;
pd->regoff = iarg;
iarg++;
} else {
pd->inmemory = true;
pd->regoff = stacksize + stackcount;
- stackcount++;
}
break;
case TYPE_FLT:
farg++;
if (arg < INT_ARG_CNT) {
iarg++; /* yes, that is true, floating arguments take int register slots away */
- stackcount++;
}
} else {
pd->inmemory = true;
- pd->regoff = stacksize + stackcount + 1;
- stackcount++;
+ pd->regoff = stacksize + stackcount ;
}
break;
default:
assert(0);
}
arg++;
+ stackcount++;
}
/* Since R3, F1 (==A0, A0) are used for passing return values, this */
farg = 1;
}
- /* fill register and stack usage */
+ /* fill register and stack usage, parameter areas is at least PA_SIZE_IN_POINTERS */
md->argintreguse = iarg;
md->argfltreguse = farg;
- md->memuse = stacksize + stackcount;
+ md->memuse = stacksize + (stackcount<PA_SIZE_IN_POINTERS? PA_SIZE_IN_POINTERS: stackcount);
+}
+
+
+/* md_param_alloc_native *******************************************************
+
+ Pre-allocate arguments according the native ABI.
+
+*******************************************************************************/
+
+void md_param_alloc_native(methoddesc *md)
+{
+ /* On PowerPC64 we use the same ABI for JIT method calls as for
+ native method calls. */
+
+ md_param_alloc(md);
}