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