918 return opr; |
918 return opr; |
919 } |
919 } |
920 |
920 |
921 |
921 |
922 LIR_Opr LIRGenerator::force_to_spill(LIR_Opr value, BasicType t) { |
922 LIR_Opr LIRGenerator::force_to_spill(LIR_Opr value, BasicType t) { |
923 assert(type2size[t] == type2size[value->type()], "size mismatch"); |
923 assert(type2size[t] == type2size[value->type()], |
|
924 err_msg_res("size mismatch: t=%s, value->type()=%s", type2name(t), type2name(value->type()))); |
924 if (!value->is_register()) { |
925 if (!value->is_register()) { |
925 // force into a register |
926 // force into a register |
926 LIR_Opr r = new_register(value->type()); |
927 LIR_Opr r = new_register(value->type()); |
927 __ move(value, r); |
928 __ move(value, r); |
928 value = r; |
929 value = r; |
2660 __ move(LIR_Assembler::osrBufferPointer(), result); |
2661 __ move(LIR_Assembler::osrBufferPointer(), result); |
2661 } |
2662 } |
2662 |
2663 |
2663 |
2664 |
2664 void LIRGenerator::invoke_load_arguments(Invoke* x, LIRItemList* args, const LIR_OprList* arg_list) { |
2665 void LIRGenerator::invoke_load_arguments(Invoke* x, LIRItemList* args, const LIR_OprList* arg_list) { |
2665 int i = (x->has_receiver() || x->is_invokedynamic()) ? 1 : 0; |
2666 assert(args->length() == arg_list->length(), |
2666 for (; i < args->length(); i++) { |
2667 err_msg_res("args=%d, arg_list=%d", args->length(), arg_list->length())); |
|
2668 for (int i = x->has_receiver() ? 1 : 0; i < args->length(); i++) { |
2667 LIRItem* param = args->at(i); |
2669 LIRItem* param = args->at(i); |
2668 LIR_Opr loc = arg_list->at(i); |
2670 LIR_Opr loc = arg_list->at(i); |
2669 if (loc->is_register()) { |
2671 if (loc->is_register()) { |
2670 param->load_item_force(loc); |
2672 param->load_item_force(loc); |
2671 } else { |
2673 } else { |
2701 LIRItemList* argument_items = new LIRItemList(); |
2703 LIRItemList* argument_items = new LIRItemList(); |
2702 if (x->has_receiver()) { |
2704 if (x->has_receiver()) { |
2703 LIRItem* receiver = new LIRItem(x->receiver(), this); |
2705 LIRItem* receiver = new LIRItem(x->receiver(), this); |
2704 argument_items->append(receiver); |
2706 argument_items->append(receiver); |
2705 } |
2707 } |
2706 if (x->is_invokedynamic()) { |
|
2707 // Insert a dummy for the synthetic MethodHandle argument. |
|
2708 argument_items->append(NULL); |
|
2709 } |
|
2710 int idx = x->has_receiver() ? 1 : 0; |
|
2711 for (int i = 0; i < x->number_of_arguments(); i++) { |
2708 for (int i = 0; i < x->number_of_arguments(); i++) { |
2712 LIRItem* param = new LIRItem(x->argument_at(i), this); |
2709 LIRItem* param = new LIRItem(x->argument_at(i), this); |
2713 argument_items->append(param); |
2710 argument_items->append(param); |
2714 idx += (param->type()->is_double_word() ? 2 : 1); |
|
2715 } |
2711 } |
2716 return argument_items; |
2712 return argument_items; |
2717 } |
2713 } |
2718 |
2714 |
2719 |
2715 |
2754 result_register = result_register_for(x->type()); |
2750 result_register = result_register_for(x->type()); |
2755 } |
2751 } |
2756 |
2752 |
2757 CodeEmitInfo* info = state_for(x, x->state()); |
2753 CodeEmitInfo* info = state_for(x, x->state()); |
2758 |
2754 |
2759 // invokedynamics can deoptimize. |
|
2760 CodeEmitInfo* deopt_info = x->is_invokedynamic() ? state_for(x, x->state_before()) : NULL; |
|
2761 |
|
2762 invoke_load_arguments(x, args, arg_list); |
2755 invoke_load_arguments(x, args, arg_list); |
2763 |
2756 |
2764 if (x->has_receiver()) { |
2757 if (x->has_receiver()) { |
2765 args->at(0)->load_item_force(LIR_Assembler::receiverOpr()); |
2758 args->at(0)->load_item_force(LIR_Assembler::receiverOpr()); |
2766 receiver = args->at(0)->result(); |
2759 receiver = args->at(0)->result(); |
2805 int vtable_offset = entry_offset * wordSize + vtableEntry::method_offset_in_bytes(); |
2798 int vtable_offset = entry_offset * wordSize + vtableEntry::method_offset_in_bytes(); |
2806 __ call_virtual(target, receiver, result_register, vtable_offset, arg_list, info); |
2799 __ call_virtual(target, receiver, result_register, vtable_offset, arg_list, info); |
2807 } |
2800 } |
2808 break; |
2801 break; |
2809 case Bytecodes::_invokedynamic: { |
2802 case Bytecodes::_invokedynamic: { |
2810 ciBytecodeStream bcs(x->scope()->method()); |
|
2811 bcs.force_bci(x->state()->bci()); |
|
2812 assert(bcs.cur_bc() == Bytecodes::_invokedynamic, "wrong stream"); |
|
2813 ciCPCache* cpcache = bcs.get_cpcache(); |
|
2814 |
|
2815 // Get CallSite offset from constant pool cache pointer. |
|
2816 int index = bcs.get_method_index(); |
|
2817 size_t call_site_offset = cpcache->get_f1_offset(index); |
|
2818 |
|
2819 // Load CallSite object from constant pool cache. |
|
2820 LIR_Opr call_site = new_register(objectType); |
|
2821 __ oop2reg(cpcache->constant_encoding(), call_site); |
|
2822 __ move_wide(new LIR_Address(call_site, call_site_offset, T_OBJECT), call_site); |
|
2823 |
|
2824 // If this invokedynamic call site hasn't been executed yet in |
|
2825 // the interpreter, the CallSite object in the constant pool |
|
2826 // cache is still null and we need to deoptimize. |
|
2827 if (cpcache->is_f1_null_at(index)) { |
|
2828 // Only deoptimize if the CallSite object is still null; we don't |
|
2829 // recompile methods in C1 after deoptimization so this call site |
|
2830 // might be resolved the next time we execute it after OSR. |
|
2831 DeoptimizeStub* deopt_stub = new DeoptimizeStub(deopt_info); |
|
2832 __ cmp(lir_cond_equal, call_site, LIR_OprFact::oopConst(NULL)); |
|
2833 __ branch(lir_cond_equal, T_OBJECT, deopt_stub); |
|
2834 } |
|
2835 |
|
2836 // Use the receiver register for the synthetic MethodHandle |
|
2837 // argument. |
|
2838 receiver = LIR_Assembler::receiverOpr(); |
|
2839 |
|
2840 // Load target MethodHandle from CallSite object. |
|
2841 __ load(new LIR_Address(call_site, java_lang_invoke_CallSite::target_offset_in_bytes(), T_OBJECT), receiver); |
|
2842 |
|
2843 __ call_dynamic(target, receiver, result_register, |
2803 __ call_dynamic(target, receiver, result_register, |
2844 SharedRuntime::get_resolve_opt_virtual_call_stub(), |
2804 SharedRuntime::get_resolve_static_call_stub(), |
2845 arg_list, info); |
2805 arg_list, info); |
2846 break; |
2806 break; |
2847 } |
2807 } |
2848 default: |
2808 default: |
2849 fatal(err_msg("unexpected bytecode: %s", Bytecodes::name(x->code()))); |
2809 fatal(err_msg("unexpected bytecode: %s", Bytecodes::name(x->code()))); |