Mercurial > hg > truffle
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()))); |