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 19 matching lines...) Expand all Loading... |
30 DCHECK(FLAG_ignition); | 30 DCHECK(FLAG_ignition); |
31 if (IsDispatchTableInitialized()) return; | 31 if (IsDispatchTableInitialized()) return; |
32 Zone zone; | 32 Zone zone; |
33 HandleScope scope(isolate_); | 33 HandleScope scope(isolate_); |
34 | 34 |
35 #define GENERATE_CODE(Name, ...) \ | 35 #define GENERATE_CODE(Name, ...) \ |
36 { \ | 36 { \ |
37 InterpreterAssembler assembler(isolate_, &zone, Bytecode::k##Name); \ | 37 InterpreterAssembler assembler(isolate_, &zone, Bytecode::k##Name); \ |
38 Do##Name(&assembler); \ | 38 Do##Name(&assembler); \ |
39 Handle<Code> code = assembler.GenerateCode(); \ | 39 Handle<Code> code = assembler.GenerateCode(); \ |
40 TraceCodegen(code, #Name); \ | 40 dispatch_table_[Bytecodes::ToByte(Bytecode::k##Name)] = *code; \ |
| 41 TraceCodegen(code); \ |
41 LOG_CODE_EVENT(isolate_, \ | 42 LOG_CODE_EVENT(isolate_, \ |
42 CodeCreateEvent(Logger::BYTECODE_HANDLER_TAG, \ | 43 CodeCreateEvent(Logger::BYTECODE_HANDLER_TAG, \ |
43 AbstractCode::cast(*code), #Name)); \ | 44 AbstractCode::cast(*code), #Name)); \ |
44 dispatch_table_[Bytecodes::ToByte(Bytecode::k##Name)] = *code; \ | |
45 } | 45 } |
46 BYTECODE_LIST(GENERATE_CODE) | 46 BYTECODE_LIST(GENERATE_CODE) |
47 #undef GENERATE_CODE | 47 #undef GENERATE_CODE |
48 } | 48 } |
49 | 49 |
50 Code* Interpreter::GetBytecodeHandler(Bytecode bytecode) { | 50 Code* Interpreter::GetBytecodeHandler(Bytecode bytecode) { |
51 DCHECK(IsDispatchTableInitialized()); | 51 DCHECK(IsDispatchTableInitialized()); |
52 return dispatch_table_[Bytecodes::ToByte(bytecode)]; | 52 return dispatch_table_[Bytecodes::ToByte(bytecode)]; |
53 } | 53 } |
54 | 54 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 } | 109 } |
110 | 110 |
111 bool Interpreter::IsDispatchTableInitialized() { | 111 bool Interpreter::IsDispatchTableInitialized() { |
112 if (FLAG_trace_ignition) { | 112 if (FLAG_trace_ignition) { |
113 // Regenerate table to add bytecode tracing operations. | 113 // Regenerate table to add bytecode tracing operations. |
114 return false; | 114 return false; |
115 } | 115 } |
116 return dispatch_table_[0] != nullptr; | 116 return dispatch_table_[0] != nullptr; |
117 } | 117 } |
118 | 118 |
119 void Interpreter::TraceCodegen(Handle<Code> code, const char* name) { | 119 void Interpreter::TraceCodegen(Handle<Code> code) { |
120 #ifdef ENABLE_DISASSEMBLER | 120 #ifdef ENABLE_DISASSEMBLER |
121 if (FLAG_trace_ignition_codegen) { | 121 if (FLAG_trace_ignition_codegen) { |
122 OFStream os(stdout); | 122 OFStream os(stdout); |
123 code->Disassemble(name, os); | 123 code->Disassemble(nullptr, os); |
124 os << std::flush; | 124 os << std::flush; |
125 } | 125 } |
126 #endif // ENABLE_DISASSEMBLER | 126 #endif // ENABLE_DISASSEMBLER |
127 } | 127 } |
128 | 128 |
| 129 const char* Interpreter::LookupNameOfBytecodeHandler(Code* code) { |
| 130 #ifdef ENABLE_DISASSEMBLER |
| 131 #define RETURN_NAME(Name, ...) \ |
| 132 if (dispatch_table_[Bytecodes::ToByte(Bytecode::k##Name)] == code) { \ |
| 133 return #Name; \ |
| 134 } |
| 135 BYTECODE_LIST(RETURN_NAME) |
| 136 #undef RETURN_NAME |
| 137 #endif // ENABLE_DISASSEMBLER |
| 138 return nullptr; |
| 139 } |
| 140 |
129 // LdaZero | 141 // LdaZero |
130 // | 142 // |
131 // Load literal '0' into the accumulator. | 143 // Load literal '0' into the accumulator. |
132 void Interpreter::DoLdaZero(InterpreterAssembler* assembler) { | 144 void Interpreter::DoLdaZero(InterpreterAssembler* assembler) { |
133 Node* zero_value = __ NumberConstant(0.0); | 145 Node* zero_value = __ NumberConstant(0.0); |
134 __ SetAccumulator(zero_value); | 146 __ SetAccumulator(zero_value); |
135 __ Dispatch(); | 147 __ Dispatch(); |
136 } | 148 } |
137 | 149 |
138 | 150 |
(...skipping 1769 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1908 Node* index = __ LoadRegister(index_reg); | 1920 Node* index = __ LoadRegister(index_reg); |
1909 Node* one = __ SmiConstant(Smi::FromInt(1)); | 1921 Node* one = __ SmiConstant(Smi::FromInt(1)); |
1910 Node* result = __ SmiAdd(index, one); | 1922 Node* result = __ SmiAdd(index, one); |
1911 __ SetAccumulator(result); | 1923 __ SetAccumulator(result); |
1912 __ Dispatch(); | 1924 __ Dispatch(); |
1913 } | 1925 } |
1914 | 1926 |
1915 } // namespace interpreter | 1927 } // namespace interpreter |
1916 } // namespace internal | 1928 } // namespace internal |
1917 } // namespace v8 | 1929 } // namespace v8 |
OLD | NEW |