1 /*
   2  * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   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
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 // InvocationCounters are used to trigger actions when a limit (threshold) is reached.
  26 // For different states, different limits and actions can be defined in the initialization
  27 // routine of InvocationCounters.
  28 //
  29 // Implementation notes: For space reasons, state & counter are both encoded in one word,
  30 // The state is encoded using some of the least significant bits, the counter is using the
  31 // more significant bits. The counter is incremented before a method is activated and an
  32 // action is triggered when when count() > limit().
  33 
  34 class InvocationCounter VALUE_OBJ_CLASS_SPEC {
  35   friend class VMStructs;
  36  private:                             // bit no: |31  3|  2  | 1 0 |
  37   unsigned int _counter;              // format: [count|carry|state]
  38 
  39   enum PrivateConstants {
  40     number_of_state_bits = 2,
  41     number_of_carry_bits = 1,
  42     number_of_noncount_bits = number_of_state_bits + number_of_carry_bits,
  43     number_of_count_bits = BitsPerInt - number_of_noncount_bits,
  44     state_limit          = nth_bit(number_of_state_bits),
  45     count_grain          = nth_bit(number_of_state_bits + number_of_carry_bits),
  46     carry_mask           = right_n_bits(number_of_carry_bits) << number_of_state_bits,
  47     state_mask           = right_n_bits(number_of_state_bits),
  48     status_mask          = right_n_bits(number_of_state_bits + number_of_carry_bits),
  49     count_mask           = ((int)(-1) ^ status_mask)
  50   };
  51 
  52  public:
  53   static int InterpreterInvocationLimit;        // CompileThreshold scaled for interpreter use
  54   static int InterpreterBackwardBranchLimit;    // A separate threshold for on stack replacement
  55   static int InterpreterProfileLimit;           // Profiling threshold scaled for interpreter use
  56 
  57   typedef address (*Action)(methodHandle method, TRAPS);
  58 
  59   enum PublicConstants {
  60     count_increment      = count_grain,          // use this value to increment the 32bit _counter word
  61     count_mask_value     = count_mask,           // use this value to mask the backedge counter
  62     count_shift          = number_of_noncount_bits,
  63     count_limit          = nth_bit(number_of_count_bits - 1)
  64   };
  65 
  66   enum State {
  67     wait_for_nothing,                            // do nothing when count() > limit()
  68     wait_for_compile,                            // introduce nmethod when count() > limit()
  69     number_of_states                             // must be <= state_limit
  70   };
  71 
  72   // Manipulation
  73   void reset();                                  // sets state to wait state
  74   void init();                                   // sets state into original state
  75   void set_state(State state);                   // sets state and initializes counter correspondingly
  76   inline void set(State state, int count);       // sets state and counter
  77   inline void decay();                           // decay counter (divide by two)
  78   void set_carry();                              // set the sticky carry bit
  79   void set_carry_flag()                          {  _counter |= carry_mask; }
  80 
  81   // Accessors
  82   State  state() const                           { return (State)(_counter & state_mask); }
  83   bool   carry() const                           { return (_counter & carry_mask) != 0; }
  84   int    limit() const                           { return CompileThreshold; }
  85   Action action() const                          { return _action[state()]; }
  86   int    count() const                           { return _counter >> number_of_noncount_bits; }
  87 
  88   int   get_InvocationLimit() const              { return InterpreterInvocationLimit >> number_of_noncount_bits; }
  89   int   get_BackwardBranchLimit() const          { return InterpreterBackwardBranchLimit >> number_of_noncount_bits; }
  90   int   get_ProfileLimit() const                 { return InterpreterProfileLimit >> number_of_noncount_bits; }
  91 
  92   // Test counter using scaled limits like the asm interpreter would do rather than doing
  93   // the shifts to normalize the counter.
  94 
  95   bool   reached_InvocationLimit() const         { return _counter >= (unsigned int) InterpreterInvocationLimit; }
  96   bool   reached_BackwardBranchLimit() const     { return _counter >= (unsigned int) InterpreterBackwardBranchLimit; }
  97 
  98   // Do this just like asm interpreter does for max speed
  99   bool   reached_ProfileLimit(InvocationCounter *back_edge_count) const {
 100     return (_counter && count_mask) + back_edge_count->_counter >= (unsigned int) InterpreterProfileLimit;
 101   }
 102 
 103   void increment()                               { _counter += count_increment; }
 104 
 105 
 106   // Printing
 107   void   print();
 108   void   print_short();
 109 
 110   // Miscellaneous
 111   static ByteSize counter_offset()               { return byte_offset_of(InvocationCounter, _counter); }
 112   static void reinitialize(bool delay_overflow);
 113 
 114  private:
 115   static int         _init  [number_of_states];  // the counter limits
 116   static Action      _action[number_of_states];  // the actions
 117 
 118   static void        def(State state, int init, Action action);
 119   static const char* state_as_string(State state);
 120   static const char* state_as_short_string(State state);
 121 };
 122 
 123 inline void InvocationCounter::set(State state, int count) {
 124   assert(0 <= state && state < number_of_states, "illegal state");
 125   int carry = (_counter & carry_mask);    // the carry bit is sticky
 126   _counter = (count << number_of_noncount_bits) | carry | state;
 127 }
 128 
 129 inline void InvocationCounter::decay() {
 130   int c = count();
 131   int new_count = c >> 1;
 132   // prevent from going to zero, to distinguish from never-executed methods
 133   if (c > 0 && new_count == 0) new_count = 1;
 134   set(state(), new_count);
 135 }
 136