Mercurial > hg > graal-jvmci-8
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 |