352 _num_fp_args++;
353 }
354 }
355
356 virtual void pass_double()
357 {
358 intptr_t from_obj = *(intptr_t*)(_from+Interpreter::local_offset_in_bytes(1));
359 _from -= 2*Interpreter::stackElementSize;
360
361 if (_num_fp_args < Argument::n_float_register_parameters_c) {
362 *_fp_args++ = from_obj;
363 *_fp_identifiers |= (1 << _num_fp_args); // mark as double
364 _num_fp_args++;
365 } else {
366 *_to++ = from_obj;
367 _num_fp_args++;
368 }
369 }
370
371 public:
372 SlowSignatureHandler(methodHandle method, address from, intptr_t* to)
373 : NativeSignatureIterator(method)
374 {
375 _from = from;
376 _to = to;
377
378 _int_args = to - (method->is_static() ? 16 : 17);
379 _fp_args = to - 8;
380 _fp_identifiers = to - 9;
381 *(int*) _fp_identifiers = 0;
382 _num_int_args = (method->is_static() ? 1 : 0);
383 _num_fp_args = 0;
384 }
385
386 // n.b. allow extra 1 for the JNI_Env in c_rarg0
387 unsigned int get_call_format()
388 {
389 unsigned int call_format = ((_num_int_args + 1) << 6) | (_num_fp_args << 2);
390
391 switch (method()->result_type()) {
392 case T_VOID:
|
352 _num_fp_args++;
353 }
354 }
355
356 virtual void pass_double()
357 {
358 intptr_t from_obj = *(intptr_t*)(_from+Interpreter::local_offset_in_bytes(1));
359 _from -= 2*Interpreter::stackElementSize;
360
361 if (_num_fp_args < Argument::n_float_register_parameters_c) {
362 *_fp_args++ = from_obj;
363 *_fp_identifiers |= (1 << _num_fp_args); // mark as double
364 _num_fp_args++;
365 } else {
366 *_to++ = from_obj;
367 _num_fp_args++;
368 }
369 }
370
371 public:
372 SlowSignatureHandler(const methodHandle& method, address from, intptr_t* to)
373 : NativeSignatureIterator(method)
374 {
375 _from = from;
376 _to = to;
377
378 _int_args = to - (method->is_static() ? 16 : 17);
379 _fp_args = to - 8;
380 _fp_identifiers = to - 9;
381 *(int*) _fp_identifiers = 0;
382 _num_int_args = (method->is_static() ? 1 : 0);
383 _num_fp_args = 0;
384 }
385
386 // n.b. allow extra 1 for the JNI_Env in c_rarg0
387 unsigned int get_call_format()
388 {
389 unsigned int call_format = ((_num_int_args + 1) << 6) | (_num_fp_args << 2);
390
391 switch (method()->result_type()) {
392 case T_VOID:
|