hotspot/src/share/vm/c1/c1_LIRGenerator.cpp
changeset 17000 11bf92e571a2
parent 16620 294771974de2
child 17002 d86c9dfa4a5f
equal deleted inserted replaced
16665:482e60f4f893 17000:11bf92e571a2
     1 /*
     1 /*
     2  * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
  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);