comparison src/share/vm/c1/c1_LIRGenerator.cpp @ 6616:7a302948f5a4

7192167: JSR 292: C1 has old broken code which needs to be removed Reviewed-by: kvn, roland, jrose
author twisti
date Tue, 21 Aug 2012 10:48:50 -0700
parents 09aad8452938
children c38f13903fdf da91efe96a93
comparison
equal deleted inserted replaced
6615:09aad8452938 6616:7a302948f5a4
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())));