Mercurial > hg > truffle
comparison src/share/vm/c1/c1_LIRGenerator.cpp @ 1330:4a9cc99938e3
Merge
author | acorn |
---|---|
date | Fri, 26 Mar 2010 11:10:26 -0400 |
parents | 76c1d7d13ec5 |
children | 9f5b60a14736 |
comparison
equal
deleted
inserted
replaced
1329:84043c7507b9 | 1330:4a9cc99938e3 |
---|---|
2282 __ move(LIR_Assembler::osrBufferPointer(), result); | 2282 __ move(LIR_Assembler::osrBufferPointer(), result); |
2283 } | 2283 } |
2284 | 2284 |
2285 | 2285 |
2286 void LIRGenerator::invoke_load_arguments(Invoke* x, LIRItemList* args, const LIR_OprList* arg_list) { | 2286 void LIRGenerator::invoke_load_arguments(Invoke* x, LIRItemList* args, const LIR_OprList* arg_list) { |
2287 int i = x->has_receiver() ? 1 : 0; | 2287 int i = (x->has_receiver() || x->is_invokedynamic()) ? 1 : 0; |
2288 for (; i < args->length(); i++) { | 2288 for (; i < args->length(); i++) { |
2289 LIRItem* param = args->at(i); | 2289 LIRItem* param = args->at(i); |
2290 LIR_Opr loc = arg_list->at(i); | 2290 LIR_Opr loc = arg_list->at(i); |
2291 if (loc->is_register()) { | 2291 if (loc->is_register()) { |
2292 param->load_item_force(loc); | 2292 param->load_item_force(loc); |
2319 LIRItemList* LIRGenerator::invoke_visit_arguments(Invoke* x) { | 2319 LIRItemList* LIRGenerator::invoke_visit_arguments(Invoke* x) { |
2320 LIRItemList* argument_items = new LIRItemList(); | 2320 LIRItemList* argument_items = new LIRItemList(); |
2321 if (x->has_receiver()) { | 2321 if (x->has_receiver()) { |
2322 LIRItem* receiver = new LIRItem(x->receiver(), this); | 2322 LIRItem* receiver = new LIRItem(x->receiver(), this); |
2323 argument_items->append(receiver); | 2323 argument_items->append(receiver); |
2324 } | |
2325 if (x->is_invokedynamic()) { | |
2326 // Insert a dummy for the synthetic MethodHandle argument. | |
2327 argument_items->append(NULL); | |
2324 } | 2328 } |
2325 int idx = x->has_receiver() ? 1 : 0; | 2329 int idx = x->has_receiver() ? 1 : 0; |
2326 for (int i = 0; i < x->number_of_arguments(); i++) { | 2330 for (int i = 0; i < x->number_of_arguments(); i++) { |
2327 LIRItem* param = new LIRItem(x->argument_at(i), this); | 2331 LIRItem* param = new LIRItem(x->argument_at(i), this); |
2328 argument_items->append(param); | 2332 argument_items->append(param); |
2369 result_register = result_register_for(x->type()); | 2373 result_register = result_register_for(x->type()); |
2370 } | 2374 } |
2371 | 2375 |
2372 CodeEmitInfo* info = state_for(x, x->state()); | 2376 CodeEmitInfo* info = state_for(x, x->state()); |
2373 | 2377 |
2378 // invokedynamics can deoptimize. | |
2379 CodeEmitInfo* deopt_info = x->is_invokedynamic() ? state_for(x, x->state_before()) : NULL; | |
2380 | |
2374 invoke_load_arguments(x, args, arg_list); | 2381 invoke_load_arguments(x, args, arg_list); |
2375 | 2382 |
2376 if (x->has_receiver()) { | 2383 if (x->has_receiver()) { |
2377 args->at(0)->load_item_force(LIR_Assembler::receiverOpr()); | 2384 args->at(0)->load_item_force(LIR_Assembler::receiverOpr()); |
2378 receiver = args->at(0)->result(); | 2385 receiver = args->at(0)->result(); |
2405 int entry_offset = instanceKlass::vtable_start_offset() + x->vtable_index() * vtableEntry::size(); | 2412 int entry_offset = instanceKlass::vtable_start_offset() + x->vtable_index() * vtableEntry::size(); |
2406 int vtable_offset = entry_offset * wordSize + vtableEntry::method_offset_in_bytes(); | 2413 int vtable_offset = entry_offset * wordSize + vtableEntry::method_offset_in_bytes(); |
2407 __ call_virtual(x->target(), receiver, result_register, vtable_offset, arg_list, info); | 2414 __ call_virtual(x->target(), receiver, result_register, vtable_offset, arg_list, info); |
2408 } | 2415 } |
2409 break; | 2416 break; |
2417 case Bytecodes::_invokedynamic: { | |
2418 ciBytecodeStream bcs(x->scope()->method()); | |
2419 bcs.force_bci(x->bci()); | |
2420 assert(bcs.cur_bc() == Bytecodes::_invokedynamic, "wrong stream"); | |
2421 ciCPCache* cpcache = bcs.get_cpcache(); | |
2422 | |
2423 // Get CallSite offset from constant pool cache pointer. | |
2424 int index = bcs.get_method_index(); | |
2425 size_t call_site_offset = cpcache->get_f1_offset(index); | |
2426 | |
2427 // If this invokedynamic call site hasn't been executed yet in | |
2428 // the interpreter, the CallSite object in the constant pool | |
2429 // cache is still null and we need to deoptimize. | |
2430 if (cpcache->is_f1_null_at(index)) { | |
2431 // Cannot re-use same xhandlers for multiple CodeEmitInfos, so | |
2432 // clone all handlers. This is handled transparently in other | |
2433 // places by the CodeEmitInfo cloning logic but is handled | |
2434 // specially here because a stub isn't being used. | |
2435 x->set_exception_handlers(new XHandlers(x->exception_handlers())); | |
2436 | |
2437 DeoptimizeStub* deopt_stub = new DeoptimizeStub(deopt_info); | |
2438 __ jump(deopt_stub); | |
2439 } | |
2440 | |
2441 // Use the receiver register for the synthetic MethodHandle | |
2442 // argument. | |
2443 receiver = LIR_Assembler::receiverOpr(); | |
2444 LIR_Opr tmp = new_register(objectType); | |
2445 | |
2446 // Load CallSite object from constant pool cache. | |
2447 __ oop2reg(cpcache->constant_encoding(), tmp); | |
2448 __ load(new LIR_Address(tmp, call_site_offset, T_OBJECT), tmp); | |
2449 | |
2450 // Load target MethodHandle from CallSite object. | |
2451 __ load(new LIR_Address(tmp, java_dyn_CallSite::target_offset_in_bytes(), T_OBJECT), receiver); | |
2452 | |
2453 __ call_dynamic(x->target(), receiver, result_register, | |
2454 SharedRuntime::get_resolve_opt_virtual_call_stub(), | |
2455 arg_list, info); | |
2456 break; | |
2457 } | |
2410 default: | 2458 default: |
2411 ShouldNotReachHere(); | 2459 ShouldNotReachHere(); |
2412 break; | 2460 break; |
2413 } | 2461 } |
2414 | 2462 |