3061 assert(frequency == 0 || is_power_of_2(frequency + 1), "Frequency must be x^2 - 1 or 0"); |
3061 assert(frequency == 0 || is_power_of_2(frequency + 1), "Frequency must be x^2 - 1 or 0"); |
3062 int level = _compilation->env()->comp_level(); |
3062 int level = _compilation->env()->comp_level(); |
3063 assert(level > CompLevel_simple, "Shouldn't be here"); |
3063 assert(level > CompLevel_simple, "Shouldn't be here"); |
3064 |
3064 |
3065 int offset = -1; |
3065 int offset = -1; |
3066 LIR_Opr counter_holder = new_register(T_METADATA); |
3066 LIR_Opr counter_holder; |
3067 LIR_Opr meth; |
|
3068 if (level == CompLevel_limited_profile) { |
3067 if (level == CompLevel_limited_profile) { |
3069 offset = in_bytes(backedge ? Method::backedge_counter_offset() : |
3068 address counters_adr = method->ensure_method_counters(); |
3070 Method::invocation_counter_offset()); |
3069 counter_holder = new_pointer_register(); |
3071 __ metadata2reg(method->constant_encoding(), counter_holder); |
3070 __ move(LIR_OprFact::intptrConst(counters_adr), counter_holder); |
3072 meth = counter_holder; |
3071 offset = in_bytes(backedge ? MethodCounters::backedge_counter_offset() : |
|
3072 MethodCounters::invocation_counter_offset()); |
3073 } else if (level == CompLevel_full_profile) { |
3073 } else if (level == CompLevel_full_profile) { |
|
3074 counter_holder = new_register(T_METADATA); |
3074 offset = in_bytes(backedge ? MethodData::backedge_counter_offset() : |
3075 offset = in_bytes(backedge ? MethodData::backedge_counter_offset() : |
3075 MethodData::invocation_counter_offset()); |
3076 MethodData::invocation_counter_offset()); |
3076 ciMethodData* md = method->method_data_or_null(); |
3077 ciMethodData* md = method->method_data_or_null(); |
3077 assert(md != NULL, "Sanity"); |
3078 assert(md != NULL, "Sanity"); |
3078 __ metadata2reg(md->constant_encoding(), counter_holder); |
3079 __ metadata2reg(md->constant_encoding(), counter_holder); |
3079 meth = new_register(T_METADATA); |
|
3080 __ metadata2reg(method->constant_encoding(), meth); |
|
3081 } else { |
3080 } else { |
3082 ShouldNotReachHere(); |
3081 ShouldNotReachHere(); |
3083 } |
3082 } |
3084 LIR_Address* counter = new LIR_Address(counter_holder, offset, T_INT); |
3083 LIR_Address* counter = new LIR_Address(counter_holder, offset, T_INT); |
3085 LIR_Opr result = new_register(T_INT); |
3084 LIR_Opr result = new_register(T_INT); |
3086 __ load(counter, result); |
3085 __ load(counter, result); |
3087 __ add(result, LIR_OprFact::intConst(InvocationCounter::count_increment), result); |
3086 __ add(result, LIR_OprFact::intConst(InvocationCounter::count_increment), result); |
3088 __ store(result, counter); |
3087 __ store(result, counter); |
3089 if (notify) { |
3088 if (notify) { |
3090 LIR_Opr mask = load_immediate(frequency << InvocationCounter::count_shift, T_INT); |
3089 LIR_Opr mask = load_immediate(frequency << InvocationCounter::count_shift, T_INT); |
|
3090 LIR_Opr meth = new_register(T_METADATA); |
|
3091 __ metadata2reg(method->constant_encoding(), meth); |
3091 __ logical_and(result, mask, result); |
3092 __ logical_and(result, mask, result); |
3092 __ cmp(lir_cond_equal, result, LIR_OprFact::intConst(0)); |
3093 __ cmp(lir_cond_equal, result, LIR_OprFact::intConst(0)); |
3093 // The bci for info can point to cmp for if's we want the if bci |
3094 // The bci for info can point to cmp for if's we want the if bci |
3094 CodeStub* overflow = new CounterOverflowStub(info, bci, meth); |
3095 CodeStub* overflow = new CounterOverflowStub(info, bci, meth); |
3095 __ branch(lir_cond_equal, T_INT, overflow); |
3096 __ branch(lir_cond_equal, T_INT, overflow); |