+ 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) {
+ 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;
+ }
+ }
+
+
+ /* 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;