OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/interpreter/interpreter.h" | 5 #include "src/interpreter/interpreter.h" |
6 | 6 |
7 #include "src/ast/prettyprinter.h" | 7 #include "src/ast/prettyprinter.h" |
8 #include "src/code-factory.h" | 8 #include "src/code-factory.h" |
9 #include "src/compiler.h" | 9 #include "src/compiler.h" |
10 #include "src/factory.h" | 10 #include "src/factory.h" |
(...skipping 21 matching lines...) Expand all Loading... |
32 if (IsDispatchTableInitialized()) return; | 32 if (IsDispatchTableInitialized()) return; |
33 Zone zone; | 33 Zone zone; |
34 HandleScope scope(isolate_); | 34 HandleScope scope(isolate_); |
35 | 35 |
36 // Generate bytecode handlers for all bytecodes and scales. | 36 // Generate bytecode handlers for all bytecodes and scales. |
37 for (OperandScale operand_scale = OperandScale::kSingle; | 37 for (OperandScale operand_scale = OperandScale::kSingle; |
38 operand_scale <= OperandScale::kMaxValid; | 38 operand_scale <= OperandScale::kMaxValid; |
39 operand_scale = Bytecodes::NextOperandScale(operand_scale)) { | 39 operand_scale = Bytecodes::NextOperandScale(operand_scale)) { |
40 #define GENERATE_CODE(Name, ...) \ | 40 #define GENERATE_CODE(Name, ...) \ |
41 { \ | 41 { \ |
42 if (BytecodeHasHandler(Bytecode::k##Name, operand_scale)) { \ | 42 if (Bytecodes::BytecodeHasHandler(Bytecode::k##Name, operand_scale)) { \ |
43 InterpreterAssembler assembler(isolate_, &zone, Bytecode::k##Name, \ | 43 InterpreterAssembler assembler(isolate_, &zone, Bytecode::k##Name, \ |
44 operand_scale); \ | 44 operand_scale); \ |
45 Do##Name(&assembler); \ | 45 Do##Name(&assembler); \ |
46 Handle<Code> code = assembler.GenerateCode(); \ | 46 Handle<Code> code = assembler.GenerateCode(); \ |
47 size_t index = GetDispatchTableIndex(Bytecode::k##Name, operand_scale); \ | 47 size_t index = GetDispatchTableIndex(Bytecode::k##Name, operand_scale); \ |
48 dispatch_table_[index] = *code; \ | 48 dispatch_table_[index] = *code; \ |
49 TraceCodegen(code); \ | 49 TraceCodegen(code); \ |
50 LOG_CODE_EVENT( \ | 50 LOG_CODE_EVENT( \ |
51 isolate_, \ | 51 isolate_, \ |
52 CodeCreateEvent( \ | 52 CodeCreateEvent( \ |
(...skipping 11 matching lines...) Expand all Loading... |
64 for (size_t index = 0; index < arraysize(dispatch_table_); ++index) { | 64 for (size_t index = 0; index < arraysize(dispatch_table_); ++index) { |
65 if (dispatch_table_[index] == nullptr) { | 65 if (dispatch_table_[index] == nullptr) { |
66 dispatch_table_[index] = dispatch_table_[illegal_index]; | 66 dispatch_table_[index] = dispatch_table_[illegal_index]; |
67 } | 67 } |
68 } | 68 } |
69 } | 69 } |
70 | 70 |
71 Code* Interpreter::GetBytecodeHandler(Bytecode bytecode, | 71 Code* Interpreter::GetBytecodeHandler(Bytecode bytecode, |
72 OperandScale operand_scale) { | 72 OperandScale operand_scale) { |
73 DCHECK(IsDispatchTableInitialized()); | 73 DCHECK(IsDispatchTableInitialized()); |
74 DCHECK(BytecodeHasHandler(bytecode, operand_scale)); | 74 DCHECK(Bytecodes::BytecodeHasHandler(bytecode, operand_scale)); |
75 size_t index = GetDispatchTableIndex(bytecode, operand_scale); | 75 size_t index = GetDispatchTableIndex(bytecode, operand_scale); |
76 return dispatch_table_[index]; | 76 return dispatch_table_[index]; |
77 } | 77 } |
78 | 78 |
79 // static | 79 // static |
80 size_t Interpreter::GetDispatchTableIndex(Bytecode bytecode, | 80 size_t Interpreter::GetDispatchTableIndex(Bytecode bytecode, |
81 OperandScale operand_scale) { | 81 OperandScale operand_scale) { |
82 static const size_t kEntriesPerOperandScale = 1u << kBitsPerByte; | 82 static const size_t kEntriesPerOperandScale = 1u << kBitsPerByte; |
83 size_t index = static_cast<size_t>(bytecode); | 83 size_t index = static_cast<size_t>(bytecode); |
84 OperandScale current_scale = OperandScale::kSingle; | 84 OperandScale current_scale = OperandScale::kSingle; |
85 while (current_scale != operand_scale) { | 85 while (current_scale != operand_scale) { |
86 index += kEntriesPerOperandScale; | 86 index += kEntriesPerOperandScale; |
87 current_scale = Bytecodes::NextOperandScale(current_scale); | 87 current_scale = Bytecodes::NextOperandScale(current_scale); |
88 } | 88 } |
89 return index; | 89 return index; |
90 } | 90 } |
91 | 91 |
92 // static | |
93 bool Interpreter::BytecodeHasHandler(Bytecode bytecode, | |
94 OperandScale operand_scale) { | |
95 return operand_scale == OperandScale::kSingle || | |
96 Bytecodes::IsBytecodeWithScalableOperands(bytecode); | |
97 } | |
98 | |
99 void Interpreter::IterateDispatchTable(ObjectVisitor* v) { | 92 void Interpreter::IterateDispatchTable(ObjectVisitor* v) { |
100 v->VisitPointers( | 93 v->VisitPointers( |
101 reinterpret_cast<Object**>(&dispatch_table_[0]), | 94 reinterpret_cast<Object**>(&dispatch_table_[0]), |
102 reinterpret_cast<Object**>(&dispatch_table_[0] + kDispatchTableSize)); | 95 reinterpret_cast<Object**>(&dispatch_table_[0] + kDispatchTableSize)); |
103 } | 96 } |
104 | 97 |
105 // static | 98 // static |
106 int Interpreter::InterruptBudget() { | 99 int Interpreter::InterruptBudget() { |
107 // TODO(ignition): Tune code size multiplier. | 100 // TODO(ignition): Tune code size multiplier. |
108 const int kCodeSizeMultiplier = 32; | 101 const int kCodeSizeMultiplier = 32; |
(...skipping 1499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1608 // Illegal | 1601 // Illegal |
1609 // | 1602 // |
1610 // An invalid bytecode aborting execution if dispatched. | 1603 // An invalid bytecode aborting execution if dispatched. |
1611 void Interpreter::DoIllegal(InterpreterAssembler* assembler) { | 1604 void Interpreter::DoIllegal(InterpreterAssembler* assembler) { |
1612 __ Abort(kInvalidBytecode); | 1605 __ Abort(kInvalidBytecode); |
1613 } | 1606 } |
1614 | 1607 |
1615 } // namespace interpreter | 1608 } // namespace interpreter |
1616 } // namespace internal | 1609 } // namespace internal |
1617 } // namespace v8 | 1610 } // namespace v8 |
OLD | NEW |