LCOV - code coverage report
Current view: top level - src/interpreter - bytecode-register.h (source / functions) Hit Total Coverage
Test: app.info Lines: 11 12 91.7 %
Date: 2019-04-17 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/base/macros.h"
      11             : #include "src/base/platform/platform.h"
      12             : #include "src/frame-constants.h"
      13             : #include "src/globals.h"
      14             : 
      15             : namespace v8 {
      16             : namespace internal {
      17             : namespace interpreter {
      18             : 
      19             : // An interpreter Register which is located in the function's Register file
      20             : // in its stack-frame. Register hold parameters, this, and expression values.
      21             : class V8_EXPORT_PRIVATE Register final {
      22             :  public:
      23    11518587 :   explicit Register(int index = kInvalidIndex) : index_(index) {}
      24             : 
      25   189188639 :   int index() const { return index_; }
      26             :   bool is_parameter() const { return index() < 0; }
      27     5057155 :   bool is_valid() const { return index_ != kInvalidIndex; }
      28             : 
      29             :   static Register FromParameterIndex(int index, int parameter_count);
      30             :   int ToParameterIndex(int parameter_count) const;
      31             : 
      32             :   // Returns an invalid register.
      33             :   static Register invalid_value() { return Register(); }
      34             : 
      35             :   // Returns the register for the function's closure object.
      36             :   static Register function_closure();
      37             :   bool is_function_closure() const;
      38             : 
      39             :   // Returns the register which holds the current context object.
      40             :   static Register current_context();
      41             :   bool is_current_context() const;
      42             : 
      43             :   // Returns the register for the bytecode array.
      44             :   static Register bytecode_array();
      45             :   bool is_bytecode_array() const;
      46             : 
      47             :   // Returns the register for the saved bytecode offset.
      48             :   static Register bytecode_offset();
      49             :   bool is_bytecode_offset() const;
      50             : 
      51             :   // Returns a register that can be used to represent the accumulator
      52             :   // within code in the interpreter, but should never be emitted in
      53             :   // bytecode.
      54             :   static Register virtual_accumulator();
      55             : 
      56             :   OperandSize SizeOfOperand() const;
      57             : 
      58    46524830 :   int32_t ToOperand() const { return kRegisterFileStartOffset - index_; }
      59             :   static Register FromOperand(int32_t operand) {
      60    19400724 :     return Register(kRegisterFileStartOffset - operand);
      61             :   }
      62             : 
      63             :   static bool AreContiguous(Register reg1, Register reg2,
      64             :                             Register reg3 = invalid_value(),
      65             :                             Register reg4 = invalid_value(),
      66             :                             Register reg5 = invalid_value());
      67             : 
      68             :   std::string ToString(int parameter_count) const;
      69             : 
      70             :   bool operator==(const Register& other) const {
      71           0 :     return index() == other.index();
      72             :   }
      73             :   bool operator!=(const Register& other) const {
      74             :     return index() != other.index();
      75             :   }
      76             :   bool operator<(const Register& other) const {
      77             :     return index() < other.index();
      78             :   }
      79             :   bool operator<=(const Register& other) const {
      80             :     return index() <= other.index();
      81             :   }
      82             :   bool operator>(const Register& other) const {
      83             :     return index() > other.index();
      84             :   }
      85             :   bool operator>=(const Register& other) const {
      86             :     return index() >= other.index();
      87             :   }
      88             : 
      89             :  private:
      90             :   DISALLOW_NEW_AND_DELETE()
      91             : 
      92             :   static const int kInvalidIndex = kMaxInt;
      93             :   static const int kRegisterFileStartOffset =
      94             :       InterpreterFrameConstants::kRegisterFileFromFp / kSystemPointerSize;
      95             : 
      96             :   int index_;
      97             : };
      98             : 
      99             : class RegisterList {
     100             :  public:
     101             :   RegisterList()
     102             :       : first_reg_index_(Register::invalid_value().index()),
     103      341956 :         register_count_(0) {}
     104             :   explicit RegisterList(Register r) : RegisterList(r.index(), 1) {}
     105             : 
     106             :   // Returns a new RegisterList which is a truncated version of this list, with
     107             :   // |count| registers.
     108             :   const RegisterList Truncate(int new_count) {
     109             :     DCHECK_GE(new_count, 0);
     110             :     DCHECK_LT(new_count, register_count_);
     111             :     return RegisterList(first_reg_index_, new_count);
     112             :   }
     113             : 
     114             :   const Register operator[](size_t i) const {
     115             :     DCHECK_LT(static_cast<int>(i), register_count_);
     116    11391523 :     return Register(first_reg_index_ + static_cast<int>(i));
     117             :   }
     118             : 
     119             :   const Register first_register() const {
     120    87915472 :     return (register_count() == 0) ? Register(0) : (*this)[0];
     121             :   }
     122             : 
     123             :   const Register last_register() const {
     124     9218294 :     return (register_count() == 0) ? Register(0) : (*this)[register_count_ - 1];
     125             :   }
     126             : 
     127             :   int register_count() const { return register_count_; }
     128             : 
     129             :  private:
     130             :   friend class BytecodeRegisterAllocator;
     131             :   friend class BytecodeDecoder;
     132             :   friend class InterpreterTester;
     133             :   friend class BytecodeUtils;
     134             : 
     135             :   RegisterList(int first_reg_index, int register_count)
     136    81856657 :       : first_reg_index_(first_reg_index), register_count_(register_count) {}
     137             : 
     138             :   // Increases the size of the register list by one.
     139     8392784 :   void IncrementRegisterCount() { register_count_++; }
     140             : 
     141             :   int first_reg_index_;
     142             :   int register_count_;
     143             : };
     144             : 
     145             : }  // namespace interpreter
     146             : }  // namespace internal
     147             : }  // namespace v8
     148             : 
     149             : #endif  // V8_INTERPRETER_BYTECODE_REGISTER_H_

Generated by: LCOV version 1.10