Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(277)

Side by Side Diff: src/interpreter/interpreter.cc

Issue 1830593002: [Interpreter] Move BytecodeHasHandler() from Interpreter to Bytecodes. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@fix-codelog
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW
« src/interpreter/bytecodes.h ('K') | « src/interpreter/bytecodes.cc ('k') | src/log.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698