ALIGN_DOUBLES_IN_MEMORY.
* src/vm/jit/arm/md-abi.c (md_param_alloc): Changed to 8-byte stackslots and
set pd->index correctly.
* src/vm/jit/arm/codegen.c: Changed to 8-byte stackslots (spilled regs and
arguments only).
* src/vm/jit/arm/asmpart.S (asm_vm_call_method): Reimplemented to fit new
argument passing. Changed to 8-byte stackslots.
* src/vm/vm.c (vm_array_store_flt, vm_array_store_dbl)
[SUPPORT_PASS_FLOATARGS_IN_INTREGS]: Fixed.
* src/vm/vm.c: Added ARM ifdefs.
* src/vm/vm.h: Added ARM ifdefs.
* src/native/jni.c: Added ARM ifdefs.
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: jni.c 8106 2007-06-19 22:50:17Z twisti $
+ $Id: jni.c 8127 2007-06-21 11:55:56Z michi $
*/
*******************************************************************************/
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__ARM__)
java_objectheader *_Jv_jni_invokeNative(methodinfo *m, java_objectheader *o,
java_objectarray *params)
{
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: arch.h 7695 2007-04-12 19:49:34Z twisti $
+ $Id: arch.h 8127 2007-06-21 11:55:56Z michi $
*/
#endif
-#define HAS_4BYTE_STACKSLOT
#define SUPPORT_COMBINE_INTEGER_REGISTERS
#define SUPPORT_PASS_FLOATARGS_IN_INTREGS
-#define ALIGN_LONGS_IN_MEMORY /* Align Longs and/or Doubles at */
-#define ALIGN_DOUBLES_IN_MEMORY /* 2*Stackslotsize relativ to stackframe */
-/* Memory Positions for not Interface Stackslots (allocate_scratch_registers) */
-/* are not properly aligned in case HAS_4_BYTE_STACKSLOT is not defined! */
-/* For HAS_4_BYTE_STACKSLOT archs no distinction is made between long and */
-/* define SUPPORT_COMBINE_INTEGER_REGISTERS */
-
/* branches *******************************************************************/
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: asmpart.S 7932 2007-05-22 07:00:57Z michi $
+ $Id: asmpart.S 8127 2007-06-21 11:55:56Z michi $
*/
.word _no_threads_exceptionptr
#endif
-asm_jitcompilerptr:
- .word asm_call_jit_compiler
-
asm_criticalsections:
#if defined(ENABLE_THREADS)
.word _crit_begin
/* asm_vm_call_method_float:
asm_vm_call_method_double: */
SAVE_SCRATCH_REGISTERS /* save our personal scratch regs */
- stmfd sp!, {v1} /* V1 is used to recompute SP ... */
- mov v1, #0 /* ... when using stack arguments */
- ldr ip, asm_jitcompilerptr
- str ip, [sp, #-4]! /* store fake address */
- mov mptr, sp /* set method pointer */
+ stmfd sp!, {v1} /* V1 is used to remember SP */
+ str a0, [sp, #-4]! /* store methods entrypoint */
- mov itmp1, a0 /* pass methodinfo* via ITMP1 */
+ mov v1, sp /* remember SP */
- cmp a1, #0 /* do we have arguments? */
- ble asm_calljava_copyfinish /* no -> do not care :-) */
+ mov itmp1, a1 /* address of data structure */
+ mov itmp3, a2 /* stack argument count */
- /* REMEMBER: stack space for arguments is reserved here! */
- /* TODO: we possibly reserve to much here */
- mov v1, a1, lsl #3 /* how much stack do we alloc? */
- sub sp, sp, v1 /* allocate stack for arguments! */
+ ldr a0, [itmp1], #8 /* load argument registers */
+ ldr a1, [itmp1], #8
+ ldr a2, [itmp1], #8
+ ldr a3, [itmp1], #8
+
+ cmp itmp3, #0 /* do we have stack arguments? */
+ ble asm_calljava_copyfinish /* no -> do not care :-) */
- mov itmp3, #0 /* stack position */
+ mov itmp2, #0
+ sub sp, sp, itmp3, lsl #3 /* create stackframe for arguments */
asm_calljava_copyloop: /* reorder stack arguments! */
-#if defined(__ARMEL__)
- ldr ip, [a2,#offvmargtype] /* align 2_WORD_TYPEs */
- tst ip, #1
- tstne itmp3, #4
- addne itmp3, itmp3, #4
- ldr ip, [a2,#offvmargdata] /* get LOW word of argument */
- str ip, [sp, itmp3]
- add itmp3, itmp3, #4
- ldr ip, [a2,#offvmargtype] /* is it a 2_WORD_TYPE? */
- tst ip, #1
- ldrne ip, [a2,#offvmargdata + 4] /* yes -> get HIGH word of argument */
- strne ip, [sp, itmp3]
- addne itmp3, itmp3, #4
-#else /* defined(__ARMEB__) */
- ldr ip, [a2,#offvmargtype + 4] /* get our item type (it is u8) */
- tst ip, #1 /* align 2_WORD_TYPEs */
- tstne itmp3, #4
- addne itmp3, itmp3, #4
- teq ip, #2 /* is it a TYPE_FLOAT? */
- ldreq ip, [a2,#offvmargdata] /* yes -> get LOW word of float */
- streq ip, [sp, itmp3]
- addeq itmp3, itmp3, #4
- beq asm_calljava_copydone
- tst ip, #1 /* is it a 2_WORD_TYPE? */
- ldrne ip, [a2,#offvmargdata] /* yes -> get HIGH word of argument */
- strne ip, [sp, itmp3]
- addne itmp3, itmp3, #4
- ldr ip, [a2,#offvmargdata + 4] /* get LOW word of argument */
- str ip, [sp, itmp3]
- add itmp3, itmp3, #4
-asm_calljava_copydone:
-#endif
- add a2, a2, #sizevmarg /* next argument block */
- subs a1, a1, #1
+ ldr ip, [itmp1], #4 /* load argument */
+ str ip, [sp, itmp2] /* store argument on stack */
+ add itmp2, itmp2, #4 /* next stackslot */
+ ldr ip, [itmp1], #4 /* load argument */
+ str ip, [sp, itmp2] /* store argument on stack */
+ add itmp2, itmp2, #4 /* next stackslot */
+ subs itmp3, itmp3, #1 /* next argument */
bgt asm_calljava_copyloop
- /* REMEMBER: first four args are passed in regs, take them out again */
- ldmfd sp, {a0, a1, a2, a3} /* load first four args to register */
- cmp v1, #16 /* do we have four arguments? */
- addlt sp, sp, v1
- movlt v1, #0
- addge sp, sp, #16
- subge v1, v1, #16
-
asm_calljava_copyfinish:
+ mov mptr, v1 /* set method pointer */
+
/* REMEMBER: do the method call just like in java! */
ldr ip, [mptr] /* fake virtual function call */
- mov lr, pc
- mov pc, ip
-fake2:
- sub ip, pc, #(fake2 - asm_vm_call_method)+8
+ mov lr, pc
+ mov pc, ip
+fake:
+ sub ip, pc, #(fake - asm_vm_call_method)+8
- add sp, sp, v1 /* free stack arguments! */
+ mov sp, v1 /* restore SP */
add sp, sp, #4 /* free fake address */
ldmfd sp!, {v1}
RESTORE_SCRATCH_REGS_AND_RETURN /* return to caller, restore regs */
bl builtin_throw_exception /* throw the exception */
mov res1, #0 /* return NULL */
mov res2, #0 /* return NULL */
- add sp, sp, v1 /* free stack arguments! */
+ mov sp, v1 /* restore SP */
add sp, sp, #4 /* free fake address */
ldmfd sp!, {v1}
RESTORE_SCRATCH_REGS_AND_RETURN /* return to caller, restore regs */
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: codegen.c 8123 2007-06-20 23:50:55Z michi $
+ $Id: codegen.c 8127 2007-06-21 11:55:56Z michi $
*/
savedregs_num = (jd->isleafmethod) ? 0 : 1; /* space to save the LR */
savedregs_num += (INT_SAV_CNT - rd->savintreguse);
- savedregs_num += (FLT_SAV_CNT - rd->savfltreguse);
+ /*savedregs_num += (FLT_SAV_CNT - rd->savfltreguse);*/
+ assert((FLT_SAV_CNT - rd->savfltreguse) == 0);
spilledregs_num = rd->memuse;
spilledregs_num++;
#endif
- cd->stackframesize = (spilledregs_num + savedregs_num) * 4;
+ cd->stackframesize = spilledregs_num * 8 + savedregs_num * 4;
/* XXX QUICK FIX: We shouldn't align the stack in Java code, but
only in native stubs. */
*/
if (checksync && (m->flags & ACC_SYNCHRONIZED))
- (void) dseg_add_unique_s4(cd, (rd->memuse + 1) * 4);/* IsSync */
+ (void) dseg_add_unique_s4(cd, rd->memuse * 8 + 4);/* IsSync */
else
#endif
(void) dseg_add_unique_s4(cd, 0); /* IsSync */
if (checksync && (m->flags & ACC_SYNCHRONIZED)) {
/* stack offset for monitor argument */
- s1 = rd->memuse;
+ s1 = rd->memuse * 8;
# if !defined(NDEBUG)
if (JITDATA_HAS_FLAG_VERBOSECALL(jd)) {
M_STMFD(BITMASK_ARGS, REG_SP);
- s1 += 4;
+ s1 += 4 * 4;
}
# endif
emit_nullpointer_check_force(cd, iptr, REG_A0);
}
- M_STR(REG_A0, REG_SP, s1 * 4);
+ M_STR(REG_A0, REG_SP, s1);
disp = dseg_add_functionptr(cd, LOCK_monitor_enter);
M_DSEG_BRANCH(disp);
s1 = (s4) (cd->mcodeptr - cd->mcodebase);
if (checksync && (m->flags & ACC_SYNCHRONIZED)) {
/* stack offset for monitor argument */
- s1 = rd->memuse;
+ s1 = rd->memuse * 8;
/* we need to save the proper return value */
case ICMD_FRETURN: /* XXX TWISTI: is that correct? */
case ICMD_DRETURN:
M_STMFD(BITMASK_RESULT, REG_SP);
- s1 += 2;
+ s1 += 2 * 4;
break;
}
- M_LDR(REG_A0, REG_SP, s1 * 4);
+ M_LDR(REG_A0, REG_SP, s1);
disp = dseg_add_functionptr(cd, LOCK_monitor_exit);
M_DSEG_BRANCH(disp);
/* calculate stackframe size */
- cd->stackframesize = (
- 1 + /* return address */
- sizeof(stackframeinfo) / SIZEOF_VOID_P + /* stackframeinfo */
- sizeof(localref_table) / SIZEOF_VOID_P + /* localref_table */
- nmd->memuse /* stack arguments */
- ) * 4;
+ cd->stackframesize =
+ 4 + /* return address */
+ sizeof(stackframeinfo) + /* stackframeinfo */
+ sizeof(localref_table) + /* localref_table */
+ nmd->memuse * 4; /* stack arguments */
/* align stack to 8-byte */
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: md-abi.c 8123 2007-06-20 23:50:55Z michi $
+ $Id: md-abi.c 8127 2007-06-21 11:55:56Z michi $
*/
case TYPE_FLT:
if (reguse < INT_ARG_CNT) {
pd->inmemory = false;
+ pd->index = reguse;
pd->regoff = abi_registers_integer_argument[reguse];
reguse++;
}
else {
pd->inmemory = true;
- pd->regoff = stacksize * 4;
+ pd->index = stacksize;
+ pd->regoff = stacksize * 8;
stacksize++;
}
break;
if (reguse < INT_ARG_CNT) {
pd->inmemory = false;
#if defined(__ARMEL__)
+ pd->index = PACK_REGS(reguse, reguse + 1);
pd->regoff =
PACK_REGS(abi_registers_integer_argument[reguse],
abi_registers_integer_argument[reguse + 1]);
#else
+ pd->index = PACK_REGS(reguse + 1, reguse);
pd->regoff =
PACK_REGS(abi_registers_integer_argument[reguse + 1],
abi_registers_integer_argument[reguse]);
}
else {
- ALIGN_2(stacksize);
+ /*ALIGN_2(stacksize);*/
pd->inmemory = true;
- pd->regoff = stacksize * 4;
- stacksize += 2;
+ pd->index = stacksize;
+ pd->regoff = stacksize * 8;
+ /*stacksize += 2;*/
+ stacksize++;
}
break;
}
case TYPE_FLT:
if (reguse < INT_ARG_CNT) {
pd->inmemory = false;
+ pd->index = -1;
pd->regoff = abi_registers_integer_argument[reguse];
reguse++;
}
else {
pd->inmemory = true;
+ pd->index = -1;
pd->regoff = stacksize * 4;
stacksize++;
}
#endif
pd->inmemory = false;
#if defined(__ARMEL__)
+ pd->index = -1;
pd->regoff =
PACK_REGS(abi_registers_integer_argument[reguse],
abi_registers_integer_argument[reguse + 1]);
#else
+ pd->index = -1;
pd->regoff =
PACK_REGS(abi_registers_integer_argument[reguse + 1],
abi_registers_integer_argument[reguse]);
else if (reguse < INT_ARG_CNT) {
pd->inmemory = false;
# if defined(__ARMEL__)
+ pd->index = -1;
pd->regoff =
PACK_REGS(abi_registers_integer_argument[reguse],
abi_registers_integer_argument[INT_ARG_CNT]);
# else
+ pd->index = -1;
pd->regoff =
PACK_REGS(abi_registers_integer_argument[INT_ARG_CNT],
abi_registers_integer_argument[reguse]);
ALIGN_2(stacksize);
#endif
pd->inmemory = true;
+ pd->index = -1;
pd->regoff = stacksize * 4;
reguse = INT_ARG_CNT;
stacksize += 2;
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: vm.c 8120 2007-06-20 22:11:24Z twisti $
+ $Id: vm.c 8127 2007-06-21 11:55:56Z michi $
*/
int32_t index;
if (!pd->inmemory) {
+#if defined(SUPPORT_PASS_FLOATARGS_IN_INTREGS)
+ index = pd->index;
+#else
index = INT_ARG_CNT + pd->index;
+#endif
#if WORDS_BIGENDIAN == 1 && !defined(__POWERPC64__)
array[index] = value >> 32;
#else
{
int32_t index;
- if (!pd->inmemory)
- index = INT_ARG_CNT + pd->index;
- else
- index = ARG_CNT + pd->index;
+ if (!pd->inmemory) {
+#if SIZEOF_VOID_P != 8 && defined(SUPPORT_PASS_FLOATARGS_IN_INTREGS)
+ index = GET_LOW_REG(pd->index);
+ array[index] = value & 0x00000000ffffffff;
- array[index] = value;
+ index = GET_HIGH_REG(pd->index);
+ array[index] = value >> 32;
+#else
+ index = INT_ARG_CNT + pd->index;
+ array[index] = value;
+#endif
+ }
+ else {
+ index = ARG_CNT + pd->index;
+ array[index] = value;
+ }
}
*******************************************************************************/
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__ARM__)
static void vm_vmargs_from_valist(methodinfo *m, java_objectheader *o,
vm_arg *vmargs, va_list ap)
{
*******************************************************************************/
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__ARM__)
static void vm_vmargs_from_jvalue(methodinfo *m, java_objectheader *o,
vm_arg *vmargs, jvalue *args)
{
*******************************************************************************/
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__ARM__)
bool vm_vmargs_from_objectarray(methodinfo *m, java_objectheader *o,
vm_arg *vmargs, java_objectarray *params)
{
java_objectheader *vm_call_method_valist(methodinfo *m, java_objectheader *o,
va_list ap)
{
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__ARM__)
s4 vmargscount;
vm_arg *vmargs;
java_objectheader *ro;
java_objectheader *vm_call_method_jvalue(methodinfo *m, java_objectheader *o,
jvalue *args)
{
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__ARM__)
s4 vmargscount;
vm_arg *vmargs;
java_objectheader *ro;
*******************************************************************************/
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__ARM__)
java_objectheader *vm_call_method_vmarg(methodinfo *m, s4 vmargscount,
vm_arg *vmargs)
{
*******************************************************************************/
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__ARM__)
s4 vm_call_method_int_vmarg(methodinfo *m, s4 vmargscount, vm_arg *vmargs)
{
s4 i;
*******************************************************************************/
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__ARM__)
s4 vm_call_method_int_valist(methodinfo *m, java_objectheader *o, va_list ap)
{
s4 vmargscount;
*******************************************************************************/
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__ARM__)
s4 vm_call_method_int_jvalue(methodinfo *m, java_objectheader *o, jvalue *args)
{
s4 vmargscount;
*******************************************************************************/
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__ARM__)
s8 vm_call_method_long_vmarg(methodinfo *m, s4 vmargscount, vm_arg *vmargs)
{
s8 l;
*******************************************************************************/
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__ARM__)
s8 vm_call_method_long_valist(methodinfo *m, java_objectheader *o, va_list ap)
{
s4 vmargscount;
*******************************************************************************/
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__ARM__)
s8 vm_call_method_long_jvalue(methodinfo *m, java_objectheader *o, jvalue *args)
{
s4 vmargscount;
*******************************************************************************/
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__ARM__)
float vm_call_method_float_vmarg(methodinfo *m, s4 vmargscount, vm_arg *vmargs)
{
float f;
*******************************************************************************/
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__ARM__)
float vm_call_method_float_valist(methodinfo *m, java_objectheader *o,
va_list ap)
{
*******************************************************************************/
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__ARM__)
float vm_call_method_float_jvalue(methodinfo *m, java_objectheader *o,
jvalue *args)
{
*******************************************************************************/
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__ARM__)
double vm_call_method_double_vmarg(methodinfo *m, s4 vmargscount,
vm_arg *vmargs)
{
*******************************************************************************/
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__ARM__)
double vm_call_method_double_valist(methodinfo *m, java_objectheader *o,
va_list ap)
{
*******************************************************************************/
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__ARM__)
double vm_call_method_double_jvalue(methodinfo *m, java_objectheader *o,
jvalue *args)
{
void vm_abort(const char *text, ...);
/* Java method calling functions */
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__ARM__)
bool vm_vmargs_from_objectarray(methodinfo *m, java_objectheader *o,
vm_arg *vmargs, java_objectarray *params);
#else
java_objectheader *vm_call_method_jvalue(methodinfo *m, java_objectheader *o,
jvalue *args);
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__ARM__)
java_objectheader *vm_call_method_vmarg(methodinfo *m, s4 vmargscount,
vm_arg *vmargs);
s4 vm_call_method_int_vmarg(methodinfo *m, s4 vmargscount, vm_arg *vmargs);