< prev index next >
src/share/vm/opto/matcher.cpp
Print this page
@@ -1257,17 +1257,20 @@
if( call != NULL && call->is_CallRuntime() )
out_arg_limit_per_call = OptoReg::add(out_arg_limit_per_call,C->varargs_C_out_slots_killed());
// Do the normal argument list (parameters) register masks
- int argcnt = cnt - TypeFunc::Parms;
+ // Null entry point is a special cast where the target of the call
+ // is in a register.
+ int adj = (call != NULL && call->entry_point() == NULL) ? 1 : 0;
+ int argcnt = cnt - TypeFunc::Parms - adj;
if( argcnt > 0 ) { // Skip it all if we have no args
BasicType *sig_bt = NEW_RESOURCE_ARRAY( BasicType, argcnt );
VMRegPair *parm_regs = NEW_RESOURCE_ARRAY( VMRegPair, argcnt );
int i;
for( i = 0; i < argcnt; i++ ) {
- sig_bt[i] = domain->field_at(i+TypeFunc::Parms)->basic_type();
+ sig_bt[i] = domain->field_at(i+TypeFunc::Parms+adj)->basic_type();
}
// V-call to pick proper calling convention
call->calling_convention( sig_bt, parm_regs, argcnt );
#ifdef ASSERT
@@ -1304,11 +1307,11 @@
// Return results now can have 2 bits returned.
// Compute max over all outgoing arguments both per call-site
// and over the entire method.
for( i = 0; i < argcnt; i++ ) {
// Address of incoming argument mask to fill in
- RegMask *rm = &mcall->_in_rms[i+TypeFunc::Parms];
+ RegMask *rm = &mcall->_in_rms[i+TypeFunc::Parms+adj];
if( !parm_regs[i].first()->is_valid() &&
!parm_regs[i].second()->is_valid() ) {
continue; // Avoid Halves
}
// Grab first register, adjust stack slots and insert in mask.
< prev index next >