comparison src/share/vm/c1/c1_LIRGenerator.cpp @ 1564:61b2245abf36

6930772: JSR 292 needs to support SPARC C1 Summary: C1 for SPARC needs to support JSR 292. Reviewed-by: never, jrose
author twisti
date Fri, 21 May 2010 02:59:24 -0700
parents 9f5b60a14736
children 87fc6aca31ab
comparison
equal deleted inserted replaced
1563:1a5913bf5e19 1564:61b2245abf36
2369 2369
2370 // emit invoke code 2370 // emit invoke code
2371 bool optimized = x->target_is_loaded() && x->target_is_final(); 2371 bool optimized = x->target_is_loaded() && x->target_is_final();
2372 assert(receiver->is_illegal() || receiver->is_equal(LIR_Assembler::receiverOpr()), "must match"); 2372 assert(receiver->is_illegal() || receiver->is_equal(LIR_Assembler::receiverOpr()), "must match");
2373 2373
2374 // JSR 292
2375 // Preserve the SP over MethodHandle call sites.
2376 ciMethod* target = x->target();
2377 if (target->is_method_handle_invoke()) {
2378 info->set_is_method_handle_invoke(true);
2379 __ move(FrameMap::stack_pointer(), FrameMap::method_handle_invoke_SP_save_opr());
2380 }
2381
2374 switch (x->code()) { 2382 switch (x->code()) {
2375 case Bytecodes::_invokestatic: 2383 case Bytecodes::_invokestatic:
2376 __ call_static(x->target(), result_register, 2384 __ call_static(target, result_register,
2377 SharedRuntime::get_resolve_static_call_stub(), 2385 SharedRuntime::get_resolve_static_call_stub(),
2378 arg_list, info); 2386 arg_list, info);
2379 break; 2387 break;
2380 case Bytecodes::_invokespecial: 2388 case Bytecodes::_invokespecial:
2381 case Bytecodes::_invokevirtual: 2389 case Bytecodes::_invokevirtual:
2382 case Bytecodes::_invokeinterface: 2390 case Bytecodes::_invokeinterface:
2383 // for final target we still produce an inline cache, in order 2391 // for final target we still produce an inline cache, in order
2384 // to be able to call mixed mode 2392 // to be able to call mixed mode
2385 if (x->code() == Bytecodes::_invokespecial || optimized) { 2393 if (x->code() == Bytecodes::_invokespecial || optimized) {
2386 __ call_opt_virtual(x->target(), receiver, result_register, 2394 __ call_opt_virtual(target, receiver, result_register,
2387 SharedRuntime::get_resolve_opt_virtual_call_stub(), 2395 SharedRuntime::get_resolve_opt_virtual_call_stub(),
2388 arg_list, info); 2396 arg_list, info);
2389 } else if (x->vtable_index() < 0) { 2397 } else if (x->vtable_index() < 0) {
2390 __ call_icvirtual(x->target(), receiver, result_register, 2398 __ call_icvirtual(target, receiver, result_register,
2391 SharedRuntime::get_resolve_virtual_call_stub(), 2399 SharedRuntime::get_resolve_virtual_call_stub(),
2392 arg_list, info); 2400 arg_list, info);
2393 } else { 2401 } else {
2394 int entry_offset = instanceKlass::vtable_start_offset() + x->vtable_index() * vtableEntry::size(); 2402 int entry_offset = instanceKlass::vtable_start_offset() + x->vtable_index() * vtableEntry::size();
2395 int vtable_offset = entry_offset * wordSize + vtableEntry::method_offset_in_bytes(); 2403 int vtable_offset = entry_offset * wordSize + vtableEntry::method_offset_in_bytes();
2396 __ call_virtual(x->target(), receiver, result_register, vtable_offset, arg_list, info); 2404 __ call_virtual(target, receiver, result_register, vtable_offset, arg_list, info);
2397 } 2405 }
2398 break; 2406 break;
2399 case Bytecodes::_invokedynamic: { 2407 case Bytecodes::_invokedynamic: {
2400 ciBytecodeStream bcs(x->scope()->method()); 2408 ciBytecodeStream bcs(x->scope()->method());
2401 bcs.force_bci(x->bci()); 2409 bcs.force_bci(x->bci());
2430 __ load(new LIR_Address(tmp, call_site_offset, T_OBJECT), tmp); 2438 __ load(new LIR_Address(tmp, call_site_offset, T_OBJECT), tmp);
2431 2439
2432 // Load target MethodHandle from CallSite object. 2440 // Load target MethodHandle from CallSite object.
2433 __ load(new LIR_Address(tmp, java_dyn_CallSite::target_offset_in_bytes(), T_OBJECT), receiver); 2441 __ load(new LIR_Address(tmp, java_dyn_CallSite::target_offset_in_bytes(), T_OBJECT), receiver);
2434 2442
2435 __ call_dynamic(x->target(), receiver, result_register, 2443 __ call_dynamic(target, receiver, result_register,
2436 SharedRuntime::get_resolve_opt_virtual_call_stub(), 2444 SharedRuntime::get_resolve_opt_virtual_call_stub(),
2437 arg_list, info); 2445 arg_list, info);
2438 break; 2446 break;
2439 } 2447 }
2440 default: 2448 default:
2441 ShouldNotReachHere(); 2449 ShouldNotReachHere();
2442 break; 2450 break;
2451 }
2452
2453 // JSR 292
2454 // Restore the SP after MethodHandle call sites.
2455 if (target->is_method_handle_invoke()) {
2456 __ move(FrameMap::method_handle_invoke_SP_save_opr(), FrameMap::stack_pointer());
2443 } 2457 }
2444 2458
2445 if (x->type()->is_float() || x->type()->is_double()) { 2459 if (x->type()->is_float() || x->type()->is_double()) {
2446 // Force rounding of results from non-strictfp when in strictfp 2460 // Force rounding of results from non-strictfp when in strictfp
2447 // scope (or when we don't know the strictness of the callee, to 2461 // scope (or when we don't know the strictness of the callee, to