LCOV - code coverage report
Current view: top level - src/interpreter - bytecode-register.h (source / functions) Hit Total Coverage
Test: app.info Lines: 13 14 92.9 %
Date: 2017-04-26 Functions: 0 0 -

          Line data    Source code
       1             : // Copyright 2015 the V8 project authors. All rights reserved.
       2             : // Use of this source code is governed by a BSD-style license that can be
       3             : // found in the LICENSE file.
       4             : 
       5             : #ifndef V8_INTERPRETER_BYTECODE_REGISTER_H_
       6             : #define V8_INTERPRETER_BYTECODE_REGISTER_H_
       7             : 
       8             : #include "src/interpreter/bytecodes.h"
       9             : 
      10             : #include "src/frames.h"
      11             : #include "src/globals.h"
      12             : 
      13             : namespace v8 {
      14             : namespace internal {
      15             : namespace interpreter {
      16             : 
      17             : // An interpreter Register which is located in the function's Register file
      18             : // in its stack-frame. Register hold parameters, this, and expression values.
      19             : class V8_EXPORT_PRIVATE Register final {
      20             :  public:
      21    13675506 :   explicit Register(int index = kInvalidIndex) : index_(index) {}
      22             : 
      23   203333030 :   int index() const { return index_; }
      24             :   bool is_parameter() const { return index() < 0; }
      25        1360 :   bool is_valid() const { return index_ != kInvalidIndex; }
      26             : 
      27             :   static Register FromParameterIndex(int index, int parameter_count);
      28             :   int ToParameterIndex(int parameter_count) const;
      29             : 
      30             :   // Returns an invalid register.
      31             :   static Register invalid_value() { return Register(); }
      32             : 
      33             :   // Returns the register for the function's closure object.
      34             :   static Register function_closure();
      35             :   bool is_function_closure() const;
      36             : 
      37             :   // Returns the register which holds the current context object.
      38             :   static Register current_context();
      39             :   bool is_current_context() const;
      40             : 
      41             :   // Returns the register for the incoming new target value.
      42             :   static Register new_target();
      43             :   bool is_new_target() const;
      44             : 
      45             :   // Returns the register for the bytecode array.
      46             :   static Register bytecode_array();
      47             :   bool is_bytecode_array() const;
      48             : 
      49             :   // Returns the register for the saved bytecode offset.
      50             :   static Register bytecode_offset();
      51             :   bool is_bytecode_offset() const;
      52             : 
      53             :   // Returns a register that can be used to represent the accumulator
      54             :   // within code in the interpreter, but should never be emitted in
      55             :   // bytecode.
      56             :   static Register virtual_accumulator();
      57             : 
      58             :   OperandSize SizeOfOperand() const;
      59             : 
      60    45428121 :   int32_t ToOperand() const { return kRegisterFileStartOffset - index_; }
      61             :   static Register FromOperand(int32_t operand) {
      62    20509159 :     return Register(kRegisterFileStartOffset - operand);
      63             :   }
      64             : 
      65             :   static bool AreContiguous(Register reg1, Register reg2,
      66             :                             Register reg3 = Register(),
      67             :                             Register reg4 = Register(),
      68             :                             Register reg5 = Register());
      69             : 
      70             :   std::string ToString(int parameter_count) const;
      71             : 
      72             :   bool operator==(const Register& other) const {
      73           0 :     return index() == other.index();
      74             :   }
      75             :   bool operator!=(const Register& other) const {
      76             :     return index() != other.index();
      77             :   }
      78             :   bool operator<(const Register& other) const {
      79             :     return index() < other.index();
      80             :   }
      81             :   bool operator<=(const Register& other) const {
      82             :     return index() <= other.index();
      83             :   }
      84             :   bool operator>(const Register& other) const {
      85             :     return index() > other.index();
      86             :   }
      87             :   bool operator>=(const Register& other) const {
      88             :     return index() >= other.index();
      89             :   }
      90             : 
      91             :  private:
      92             :   static const int kInvalidIndex = kMaxInt;
      93             :   static const int kRegisterFileStartOffset =
      94             :       InterpreterFrameConstants::kRegisterFileFromFp / kPointerSize;
      95             : 
      96             :   void* operator new(size_t size) = delete;
      97             :   void operator delete(void* p) = delete;
      98             : 
      99             :   int index_;
     100             : };
     101             : 
     102             : class RegisterList {
     103             :  public:
     104     6829010 :   RegisterList() : first_reg_index_(Register().index()), register_count_(0) {}
     105             :   RegisterList(int first_reg_index, int register_count)
     106    75210580 :       : first_reg_index_(first_reg_index), register_count_(register_count) {}
     107             : 
     108             :   // Increases the size of the register list by one.
     109     9010906 :   void IncrementRegisterCount() { register_count_++; }
     110             : 
     111             :   // Returns a new RegisterList which is a truncated version of this list, with
     112             :   // |count| registers.
     113             :   const RegisterList Truncate(int new_count) {
     114             :     DCHECK_GE(new_count, 0);
     115             :     DCHECK_LT(new_count, register_count_);
     116             :     return RegisterList(first_reg_index_, new_count);
     117             :   }
     118             : 
     119             :   const Register operator[](size_t i) const {
     120             :     DCHECK_LT(static_cast<int>(i), register_count_);
     121    12464512 :     return Register(first_reg_index_ + static_cast<int>(i));
     122             :   }
     123             : 
     124    16397059 :   const Register first_register() const {
     125    79853548 :     return (register_count() == 0) ? Register(0) : (*this)[0];
     126             :   }
     127             : 
     128    10944472 :   const Register last_register() const {
     129     9977692 :     return (register_count() == 0) ? Register(0) : (*this)[register_count_ - 1];
     130             :   }
     131             : 
     132             :   int register_count() const { return register_count_; }
     133             : 
     134             :  private:
     135             :   int first_reg_index_;
     136             :   int register_count_;
     137             : };
     138             : 
     139             : }  // namespace interpreter
     140             : }  // namespace internal
     141             : }  // namespace v8
     142             : 
     143             : #endif  // V8_INTERPRETER_BYTECODE_REGISTER_H_

Generated by: LCOV version 1.10