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 <fstream> | 7 #include <fstream> |
8 #include <memory> | 8 #include <memory> |
9 | 9 |
10 #include "src/ast/prettyprinter.h" | 10 #include "src/ast/prettyprinter.h" |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 | 91 |
92 // Initialization should have been successful. | 92 // Initialization should have been successful. |
93 DCHECK(IsDispatchTableInitialized()); | 93 DCHECK(IsDispatchTableInitialized()); |
94 } | 94 } |
95 | 95 |
96 void Interpreter::InstallBytecodeHandler(Zone* zone, Bytecode bytecode, | 96 void Interpreter::InstallBytecodeHandler(Zone* zone, Bytecode bytecode, |
97 OperandScale operand_scale, | 97 OperandScale operand_scale, |
98 BytecodeGeneratorFunc generator) { | 98 BytecodeGeneratorFunc generator) { |
99 if (!Bytecodes::BytecodeHasHandler(bytecode, operand_scale)) return; | 99 if (!Bytecodes::BytecodeHasHandler(bytecode, operand_scale)) return; |
100 | 100 |
| 101 // TODO(ishell): remove this when code stub assembler graphs verification |
| 102 // is enabled for all stubs. |
| 103 bool sav_csa_verify = FLAG_csa_verify; |
| 104 FLAG_csa_verify = DEBUG_BOOL; |
| 105 |
101 InterpreterDispatchDescriptor descriptor(isolate_); | 106 InterpreterDispatchDescriptor descriptor(isolate_); |
102 compiler::CodeAssemblerState state( | 107 compiler::CodeAssemblerState state( |
103 isolate_, zone, descriptor, Code::ComputeFlags(Code::BYTECODE_HANDLER), | 108 isolate_, zone, descriptor, Code::ComputeFlags(Code::BYTECODE_HANDLER), |
104 Bytecodes::ToString(bytecode), Bytecodes::ReturnCount(bytecode)); | 109 Bytecodes::ToString(bytecode), Bytecodes::ReturnCount(bytecode)); |
105 InterpreterAssembler assembler(&state, bytecode, operand_scale); | 110 InterpreterAssembler assembler(&state, bytecode, operand_scale); |
106 (this->*generator)(&assembler); | 111 (this->*generator)(&assembler); |
107 Handle<Code> code = compiler::CodeAssembler::GenerateCode(&state); | 112 Handle<Code> code = compiler::CodeAssembler::GenerateCode(&state); |
108 size_t index = GetDispatchTableIndex(bytecode, operand_scale); | 113 size_t index = GetDispatchTableIndex(bytecode, operand_scale); |
109 dispatch_table_[index] = code->entry(); | 114 dispatch_table_[index] = code->entry(); |
110 TraceCodegen(code); | 115 TraceCodegen(code); |
111 PROFILE(isolate_, CodeCreateEvent( | 116 PROFILE(isolate_, CodeCreateEvent( |
112 CodeEventListener::BYTECODE_HANDLER_TAG, | 117 CodeEventListener::BYTECODE_HANDLER_TAG, |
113 AbstractCode::cast(*code), | 118 AbstractCode::cast(*code), |
114 Bytecodes::ToString(bytecode, operand_scale).c_str())); | 119 Bytecodes::ToString(bytecode, operand_scale).c_str())); |
| 120 FLAG_csa_verify = sav_csa_verify; |
115 } | 121 } |
116 | 122 |
117 Code* Interpreter::GetBytecodeHandler(Bytecode bytecode, | 123 Code* Interpreter::GetBytecodeHandler(Bytecode bytecode, |
118 OperandScale operand_scale) { | 124 OperandScale operand_scale) { |
119 DCHECK(IsDispatchTableInitialized()); | 125 DCHECK(IsDispatchTableInitialized()); |
120 DCHECK(Bytecodes::BytecodeHasHandler(bytecode, operand_scale)); | 126 DCHECK(Bytecodes::BytecodeHasHandler(bytecode, operand_scale)); |
121 size_t index = GetDispatchTableIndex(bytecode, operand_scale); | 127 size_t index = GetDispatchTableIndex(bytecode, operand_scale); |
122 Address code_entry = dispatch_table_[index]; | 128 Address code_entry = dispatch_table_[index]; |
123 return Code::GetCodeFromTargetAddress(code_entry); | 129 return Code::GetCodeFromTargetAddress(code_entry); |
124 } | 130 } |
(...skipping 753 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
878 Label if_export(assembler), if_import(assembler), end(assembler); | 884 Label if_export(assembler), if_import(assembler), end(assembler); |
879 __ Branch(__ IntPtrGreaterThan(cell_index, __ IntPtrConstant(0)), &if_export, | 885 __ Branch(__ IntPtrGreaterThan(cell_index, __ IntPtrConstant(0)), &if_export, |
880 &if_import); | 886 &if_import); |
881 | 887 |
882 __ Bind(&if_export); | 888 __ Bind(&if_export); |
883 { | 889 { |
884 Node* regular_exports = | 890 Node* regular_exports = |
885 __ LoadObjectField(module, Module::kRegularExportsOffset); | 891 __ LoadObjectField(module, Module::kRegularExportsOffset); |
886 // The actual array index is (cell_index - 1). | 892 // The actual array index is (cell_index - 1). |
887 Node* export_index = __ IntPtrSub(cell_index, __ IntPtrConstant(1)); | 893 Node* export_index = __ IntPtrSub(cell_index, __ IntPtrConstant(1)); |
888 Node* cell = __ LoadFixedArrayElement(regular_exports, export_index); | 894 Node* cell = __ LoadFixedArrayElement(regular_exports, export_index, 0, |
| 895 CodeStubAssembler::INTPTR_PARAMETERS); |
889 __ SetAccumulator(__ LoadObjectField(cell, Cell::kValueOffset)); | 896 __ SetAccumulator(__ LoadObjectField(cell, Cell::kValueOffset)); |
890 __ Goto(&end); | 897 __ Goto(&end); |
891 } | 898 } |
892 | 899 |
893 __ Bind(&if_import); | 900 __ Bind(&if_import); |
894 { | 901 { |
895 Node* regular_imports = | 902 Node* regular_imports = |
896 __ LoadObjectField(module, Module::kRegularImportsOffset); | 903 __ LoadObjectField(module, Module::kRegularImportsOffset); |
897 // The actual array index is (-cell_index - 1). | 904 // The actual array index is (-cell_index - 1). |
898 Node* import_index = __ IntPtrSub(__ IntPtrConstant(-1), cell_index); | 905 Node* import_index = __ IntPtrSub(__ IntPtrConstant(-1), cell_index); |
899 Node* cell = __ LoadFixedArrayElement(regular_imports, import_index); | 906 Node* cell = __ LoadFixedArrayElement(regular_imports, import_index, 0, |
| 907 CodeStubAssembler::INTPTR_PARAMETERS); |
900 __ SetAccumulator(__ LoadObjectField(cell, Cell::kValueOffset)); | 908 __ SetAccumulator(__ LoadObjectField(cell, Cell::kValueOffset)); |
901 __ Goto(&end); | 909 __ Goto(&end); |
902 } | 910 } |
903 | 911 |
904 __ Bind(&end); | 912 __ Bind(&end); |
905 __ Dispatch(); | 913 __ Dispatch(); |
906 } | 914 } |
907 | 915 |
908 // StaModuleVariable <cell_index> <depth> | 916 // StaModuleVariable <cell_index> <depth> |
909 // | 917 // |
(...skipping 11 matching lines...) Expand all Loading... |
921 Label if_export(assembler), if_import(assembler), end(assembler); | 929 Label if_export(assembler), if_import(assembler), end(assembler); |
922 __ Branch(__ IntPtrGreaterThan(cell_index, __ IntPtrConstant(0)), &if_export, | 930 __ Branch(__ IntPtrGreaterThan(cell_index, __ IntPtrConstant(0)), &if_export, |
923 &if_import); | 931 &if_import); |
924 | 932 |
925 __ Bind(&if_export); | 933 __ Bind(&if_export); |
926 { | 934 { |
927 Node* regular_exports = | 935 Node* regular_exports = |
928 __ LoadObjectField(module, Module::kRegularExportsOffset); | 936 __ LoadObjectField(module, Module::kRegularExportsOffset); |
929 // The actual array index is (cell_index - 1). | 937 // The actual array index is (cell_index - 1). |
930 Node* export_index = __ IntPtrSub(cell_index, __ IntPtrConstant(1)); | 938 Node* export_index = __ IntPtrSub(cell_index, __ IntPtrConstant(1)); |
931 Node* cell = __ LoadFixedArrayElement(regular_exports, export_index); | 939 Node* cell = __ LoadFixedArrayElement(regular_exports, export_index, 0, |
| 940 CodeStubAssembler::INTPTR_PARAMETERS); |
932 __ StoreObjectField(cell, Cell::kValueOffset, value); | 941 __ StoreObjectField(cell, Cell::kValueOffset, value); |
933 __ Goto(&end); | 942 __ Goto(&end); |
934 } | 943 } |
935 | 944 |
936 __ Bind(&if_import); | 945 __ Bind(&if_import); |
937 { | 946 { |
938 // Not supported (probably never). | 947 // Not supported (probably never). |
939 __ Abort(kUnsupportedModuleOperation); | 948 __ Abort(kUnsupportedModuleOperation); |
940 __ Goto(&end); | 949 __ Goto(&end); |
941 } | 950 } |
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1352 var_result.Bind(__ BitcastWordToTaggedSigned(__ Projection(0, pair))); | 1361 var_result.Bind(__ BitcastWordToTaggedSigned(__ Projection(0, pair))); |
1353 __ Goto(&end); | 1362 __ Goto(&end); |
1354 } | 1363 } |
1355 } | 1364 } |
1356 __ Bind(&slowpath); | 1365 __ Bind(&slowpath); |
1357 { | 1366 { |
1358 Node* context = __ GetContext(); | 1367 Node* context = __ GetContext(); |
1359 AddWithFeedbackStub stub(__ isolate()); | 1368 AddWithFeedbackStub stub(__ isolate()); |
1360 Callable callable = | 1369 Callable callable = |
1361 Callable(stub.GetCode(), AddWithFeedbackStub::Descriptor(__ isolate())); | 1370 Callable(stub.GetCode(), AddWithFeedbackStub::Descriptor(__ isolate())); |
1362 Node* args[] = {left, right, slot_index, type_feedback_vector, context}; | 1371 Node* args[] = {left, right, __ TruncateWordToWord32(slot_index), |
| 1372 type_feedback_vector, context}; |
1363 var_result.Bind(__ CallStubN(callable, args, 1)); | 1373 var_result.Bind(__ CallStubN(callable, args, 1)); |
1364 __ Goto(&end); | 1374 __ Goto(&end); |
1365 } | 1375 } |
1366 __ Bind(&end); | 1376 __ Bind(&end); |
1367 { | 1377 { |
1368 __ SetAccumulator(var_result.value()); | 1378 __ SetAccumulator(var_result.value()); |
1369 __ Dispatch(); | 1379 __ Dispatch(); |
1370 } | 1380 } |
1371 } | 1381 } |
1372 | 1382 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1406 var_result.Bind(__ BitcastWordToTaggedSigned(__ Projection(0, pair))); | 1416 var_result.Bind(__ BitcastWordToTaggedSigned(__ Projection(0, pair))); |
1407 __ Goto(&end); | 1417 __ Goto(&end); |
1408 } | 1418 } |
1409 } | 1419 } |
1410 __ Bind(&slowpath); | 1420 __ Bind(&slowpath); |
1411 { | 1421 { |
1412 Node* context = __ GetContext(); | 1422 Node* context = __ GetContext(); |
1413 SubtractWithFeedbackStub stub(__ isolate()); | 1423 SubtractWithFeedbackStub stub(__ isolate()); |
1414 Callable callable = Callable( | 1424 Callable callable = Callable( |
1415 stub.GetCode(), SubtractWithFeedbackStub::Descriptor(__ isolate())); | 1425 stub.GetCode(), SubtractWithFeedbackStub::Descriptor(__ isolate())); |
1416 Node* args[] = {left, right, slot_index, type_feedback_vector, context}; | 1426 Node* args[] = {left, right, __ TruncateWordToWord32(slot_index), |
| 1427 type_feedback_vector, context}; |
1417 var_result.Bind(__ CallStubN(callable, args, 1)); | 1428 var_result.Bind(__ CallStubN(callable, args, 1)); |
1418 __ Goto(&end); | 1429 __ Goto(&end); |
1419 } | 1430 } |
1420 __ Bind(&end); | 1431 __ Bind(&end); |
1421 { | 1432 { |
1422 __ SetAccumulator(var_result.value()); | 1433 __ SetAccumulator(var_result.value()); |
1423 __ Dispatch(); | 1434 __ Dispatch(); |
1424 } | 1435 } |
1425 } | 1436 } |
1426 | 1437 |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1697 DoDelete(Runtime::kDeleteProperty_Sloppy, assembler); | 1708 DoDelete(Runtime::kDeleteProperty_Sloppy, assembler); |
1698 } | 1709 } |
1699 | 1710 |
1700 void Interpreter::DoJSCall(InterpreterAssembler* assembler, | 1711 void Interpreter::DoJSCall(InterpreterAssembler* assembler, |
1701 TailCallMode tail_call_mode) { | 1712 TailCallMode tail_call_mode) { |
1702 Node* function_reg = __ BytecodeOperandReg(0); | 1713 Node* function_reg = __ BytecodeOperandReg(0); |
1703 Node* function = __ LoadRegister(function_reg); | 1714 Node* function = __ LoadRegister(function_reg); |
1704 Node* receiver_reg = __ BytecodeOperandReg(1); | 1715 Node* receiver_reg = __ BytecodeOperandReg(1); |
1705 Node* receiver_arg = __ RegisterLocation(receiver_reg); | 1716 Node* receiver_arg = __ RegisterLocation(receiver_reg); |
1706 Node* receiver_args_count = __ BytecodeOperandCount(2); | 1717 Node* receiver_args_count = __ BytecodeOperandCount(2); |
1707 Node* receiver_count = __ Int32Constant(1); | 1718 Node* receiver_count = __ IntPtrConstant(1); |
1708 Node* args_count = __ Int32Sub(receiver_args_count, receiver_count); | 1719 Node* args_count = __ IntPtrSub(receiver_args_count, receiver_count); |
1709 Node* slot_id = __ BytecodeOperandIdx(3); | 1720 Node* slot_id = __ BytecodeOperandIdx(3); |
1710 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | 1721 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
1711 Node* context = __ GetContext(); | 1722 Node* context = __ GetContext(); |
1712 Node* result = | 1723 Node* result = |
1713 __ CallJSWithFeedback(function, context, receiver_arg, args_count, | 1724 __ CallJSWithFeedback(function, context, receiver_arg, args_count, |
1714 slot_id, type_feedback_vector, tail_call_mode); | 1725 slot_id, type_feedback_vector, tail_call_mode); |
1715 __ SetAccumulator(result); | 1726 __ SetAccumulator(result); |
1716 __ Dispatch(); | 1727 __ Dispatch(); |
1717 } | 1728 } |
1718 | 1729 |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1806 | 1817 |
1807 // CallJSRuntime <context_index> <receiver> <arg_count> | 1818 // CallJSRuntime <context_index> <receiver> <arg_count> |
1808 // | 1819 // |
1809 // Call the JS runtime function that has the |context_index| with the receiver | 1820 // Call the JS runtime function that has the |context_index| with the receiver |
1810 // in register |receiver| and |arg_count| arguments in subsequent registers. | 1821 // in register |receiver| and |arg_count| arguments in subsequent registers. |
1811 void Interpreter::DoCallJSRuntime(InterpreterAssembler* assembler) { | 1822 void Interpreter::DoCallJSRuntime(InterpreterAssembler* assembler) { |
1812 Node* context_index = __ BytecodeOperandIdx(0); | 1823 Node* context_index = __ BytecodeOperandIdx(0); |
1813 Node* receiver_reg = __ BytecodeOperandReg(1); | 1824 Node* receiver_reg = __ BytecodeOperandReg(1); |
1814 Node* first_arg = __ RegisterLocation(receiver_reg); | 1825 Node* first_arg = __ RegisterLocation(receiver_reg); |
1815 Node* receiver_args_count = __ BytecodeOperandCount(2); | 1826 Node* receiver_args_count = __ BytecodeOperandCount(2); |
1816 Node* receiver_count = __ Int32Constant(1); | 1827 Node* receiver_count = __ IntPtrConstant(1); |
1817 Node* args_count = __ Int32Sub(receiver_args_count, receiver_count); | 1828 Node* args_count = __ IntPtrSub(receiver_args_count, receiver_count); |
1818 | 1829 |
1819 // Get the function to call from the native context. | 1830 // Get the function to call from the native context. |
1820 Node* context = __ GetContext(); | 1831 Node* context = __ GetContext(); |
1821 Node* native_context = __ LoadNativeContext(context); | 1832 Node* native_context = __ LoadNativeContext(context); |
1822 Node* function = __ LoadContextElement(native_context, context_index); | 1833 Node* function = __ LoadContextElement(native_context, context_index); |
1823 | 1834 |
1824 // Call the function. | 1835 // Call the function. |
1825 Node* result = __ CallJS(function, context, first_arg, args_count, | 1836 Node* result = __ CallJS(function, context, first_arg, args_count, |
1826 TailCallMode::kDisallow); | 1837 TailCallMode::kDisallow); |
1827 __ SetAccumulator(result); | 1838 __ SetAccumulator(result); |
1828 __ Dispatch(); | 1839 __ Dispatch(); |
1829 } | 1840 } |
1830 | 1841 |
1831 // NewWithSpread <first_arg> <arg_count> | 1842 // NewWithSpread <first_arg> <arg_count> |
1832 // | 1843 // |
1833 // Call the constructor in |first_arg| with the new.target in |first_arg + 1| | 1844 // Call the constructor in |first_arg| with the new.target in |first_arg + 1| |
1834 // for the |arg_count - 2| following arguments. The final argument is always a | 1845 // for the |arg_count - 2| following arguments. The final argument is always a |
1835 // spread. | 1846 // spread. |
1836 // | 1847 // |
1837 void Interpreter::DoNewWithSpread(InterpreterAssembler* assembler) { | 1848 void Interpreter::DoNewWithSpread(InterpreterAssembler* assembler) { |
1838 Node* first_arg_reg = __ BytecodeOperandReg(0); | 1849 Node* first_arg_reg = __ BytecodeOperandReg(0); |
1839 Node* first_arg = __ RegisterLocation(first_arg_reg); | 1850 Node* first_arg = __ RegisterLocation(first_arg_reg); |
1840 Node* args_count = __ BytecodeOperandCount(1); | 1851 Node* args_count = __ BytecodeOperandCount(1); |
1841 Node* context = __ GetContext(); | 1852 Node* context = __ GetContext(); |
1842 | 1853 |
1843 // Call into Runtime function NewWithSpread which does everything. | 1854 // Call into Runtime function NewWithSpread which does everything. |
1844 Node* runtime_function = __ Int32Constant(Runtime::kNewWithSpread); | 1855 Node* runtime_function = __ IntPtrConstant(Runtime::kNewWithSpread); |
1845 Node* result = | 1856 Node* result = |
1846 __ CallRuntimeN(runtime_function, context, first_arg, args_count); | 1857 __ CallRuntimeN(runtime_function, context, first_arg, args_count); |
1847 __ SetAccumulator(result); | 1858 __ SetAccumulator(result); |
1848 __ Dispatch(); | 1859 __ Dispatch(); |
1849 } | 1860 } |
1850 | 1861 |
1851 // New <constructor> <first_arg> <arg_count> | 1862 // New <constructor> <first_arg> <arg_count> |
1852 // | 1863 // |
1853 // Call operator new with |constructor| and the first argument in | 1864 // Call operator new with |constructor| and the first argument in |
1854 // register |first_arg| and |arg_count| arguments in subsequent | 1865 // register |first_arg| and |arg_count| arguments in subsequent |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2219 // performs a loop nesting check and potentially triggers OSR in case the | 2230 // performs a loop nesting check and potentially triggers OSR in case the |
2220 // current OSR level matches (or exceeds) the specified |loop_depth|. | 2231 // current OSR level matches (or exceeds) the specified |loop_depth|. |
2221 void Interpreter::DoJumpLoop(InterpreterAssembler* assembler) { | 2232 void Interpreter::DoJumpLoop(InterpreterAssembler* assembler) { |
2222 Node* relative_jump = __ BytecodeOperandImm(0); | 2233 Node* relative_jump = __ BytecodeOperandImm(0); |
2223 Node* loop_depth = __ BytecodeOperandImm(1); | 2234 Node* loop_depth = __ BytecodeOperandImm(1); |
2224 Node* osr_level = __ LoadOSRNestingLevel(); | 2235 Node* osr_level = __ LoadOSRNestingLevel(); |
2225 | 2236 |
2226 // Check if OSR points at the given {loop_depth} are armed by comparing it to | 2237 // Check if OSR points at the given {loop_depth} are armed by comparing it to |
2227 // the current {osr_level} loaded from the header of the BytecodeArray. | 2238 // the current {osr_level} loaded from the header of the BytecodeArray. |
2228 Label ok(assembler), osr_armed(assembler, Label::kDeferred); | 2239 Label ok(assembler), osr_armed(assembler, Label::kDeferred); |
2229 Node* condition = __ Int32GreaterThanOrEqual(loop_depth, osr_level); | 2240 Node* condition = __ IntPtrGreaterThanOrEqual(loop_depth, osr_level); |
2230 __ Branch(condition, &ok, &osr_armed); | 2241 __ Branch(condition, &ok, &osr_armed); |
2231 | 2242 |
2232 __ Bind(&ok); | 2243 __ Bind(&ok); |
2233 __ Jump(relative_jump); | 2244 __ Jump(relative_jump); |
2234 | 2245 |
2235 __ Bind(&osr_armed); | 2246 __ Bind(&osr_armed); |
2236 { | 2247 { |
2237 Callable callable = CodeFactory::InterpreterOnStackReplacement(isolate_); | 2248 Callable callable = CodeFactory::InterpreterOnStackReplacement(isolate_); |
2238 Node* target = __ HeapConstant(callable.code()); | 2249 Node* target = __ HeapConstant(callable.code()); |
2239 Node* context = __ GetContext(); | 2250 Node* context = __ GetContext(); |
(...skipping 27 matching lines...) Expand all Loading... |
2267 // CreateArrayLiteral flags <flags> and constant elements in <element_idx>. | 2278 // CreateArrayLiteral flags <flags> and constant elements in <element_idx>. |
2268 void Interpreter::DoCreateArrayLiteral(InterpreterAssembler* assembler) { | 2279 void Interpreter::DoCreateArrayLiteral(InterpreterAssembler* assembler) { |
2269 Node* literal_index_raw = __ BytecodeOperandIdx(1); | 2280 Node* literal_index_raw = __ BytecodeOperandIdx(1); |
2270 Node* literal_index = __ SmiTag(literal_index_raw); | 2281 Node* literal_index = __ SmiTag(literal_index_raw); |
2271 Node* closure = __ LoadRegister(Register::function_closure()); | 2282 Node* closure = __ LoadRegister(Register::function_closure()); |
2272 Node* context = __ GetContext(); | 2283 Node* context = __ GetContext(); |
2273 Node* bytecode_flags = __ BytecodeOperandFlag(2); | 2284 Node* bytecode_flags = __ BytecodeOperandFlag(2); |
2274 | 2285 |
2275 Label fast_shallow_clone(assembler), | 2286 Label fast_shallow_clone(assembler), |
2276 call_runtime(assembler, Label::kDeferred); | 2287 call_runtime(assembler, Label::kDeferred); |
2277 Node* use_fast_shallow_clone = __ Word32And( | 2288 __ Branch(__ IsSetWord<CreateArrayLiteralFlags::FastShallowCloneBit>( |
2278 bytecode_flags, | 2289 bytecode_flags), |
2279 __ Int32Constant(CreateArrayLiteralFlags::FastShallowCloneBit::kMask)); | 2290 &fast_shallow_clone, &call_runtime); |
2280 __ Branch(use_fast_shallow_clone, &fast_shallow_clone, &call_runtime); | |
2281 | 2291 |
2282 __ Bind(&fast_shallow_clone); | 2292 __ Bind(&fast_shallow_clone); |
2283 { | 2293 { |
2284 DCHECK(FLAG_allocation_site_pretenuring); | 2294 DCHECK(FLAG_allocation_site_pretenuring); |
2285 Node* result = FastCloneShallowArrayStub::Generate( | 2295 Node* result = FastCloneShallowArrayStub::Generate( |
2286 assembler, closure, literal_index, context, &call_runtime, | 2296 assembler, closure, literal_index, context, &call_runtime, |
2287 TRACK_ALLOCATION_SITE); | 2297 TRACK_ALLOCATION_SITE); |
2288 __ SetAccumulator(result); | 2298 __ SetAccumulator(result); |
2289 __ Dispatch(); | 2299 __ Dispatch(); |
2290 } | 2300 } |
2291 | 2301 |
2292 __ Bind(&call_runtime); | 2302 __ Bind(&call_runtime); |
2293 { | 2303 { |
2294 STATIC_ASSERT(CreateArrayLiteralFlags::FlagsBits::kShift == 0); | 2304 Node* flags_raw = |
2295 Node* flags_raw = __ Word32And( | 2305 __ DecodeWord<CreateArrayLiteralFlags::FlagsBits>(bytecode_flags); |
2296 bytecode_flags, | |
2297 __ Int32Constant(CreateArrayLiteralFlags::FlagsBits::kMask)); | |
2298 Node* flags = __ SmiTag(flags_raw); | 2306 Node* flags = __ SmiTag(flags_raw); |
2299 Node* index = __ BytecodeOperandIdx(0); | 2307 Node* index = __ BytecodeOperandIdx(0); |
2300 Node* constant_elements = __ LoadConstantPoolEntry(index); | 2308 Node* constant_elements = __ LoadConstantPoolEntry(index); |
2301 Node* result = | 2309 Node* result = |
2302 __ CallRuntime(Runtime::kCreateArrayLiteral, context, closure, | 2310 __ CallRuntime(Runtime::kCreateArrayLiteral, context, closure, |
2303 literal_index, constant_elements, flags); | 2311 literal_index, constant_elements, flags); |
2304 __ SetAccumulator(result); | 2312 __ SetAccumulator(result); |
2305 __ Dispatch(); | 2313 __ Dispatch(); |
2306 } | 2314 } |
2307 } | 2315 } |
2308 | 2316 |
2309 // CreateObjectLiteral <element_idx> <literal_idx> <flags> | 2317 // CreateObjectLiteral <element_idx> <literal_idx> <flags> |
2310 // | 2318 // |
2311 // Creates an object literal for literal index <literal_idx> with | 2319 // Creates an object literal for literal index <literal_idx> with |
2312 // CreateObjectLiteralFlags <flags> and constant elements in <element_idx>. | 2320 // CreateObjectLiteralFlags <flags> and constant elements in <element_idx>. |
2313 void Interpreter::DoCreateObjectLiteral(InterpreterAssembler* assembler) { | 2321 void Interpreter::DoCreateObjectLiteral(InterpreterAssembler* assembler) { |
2314 Node* literal_index_raw = __ BytecodeOperandIdx(1); | 2322 Node* literal_index_raw = __ BytecodeOperandIdx(1); |
2315 Node* literal_index = __ SmiTag(literal_index_raw); | 2323 Node* literal_index = __ SmiTag(literal_index_raw); |
2316 Node* bytecode_flags = __ BytecodeOperandFlag(2); | 2324 Node* bytecode_flags = __ BytecodeOperandFlag(2); |
2317 Node* closure = __ LoadRegister(Register::function_closure()); | 2325 Node* closure = __ LoadRegister(Register::function_closure()); |
2318 | 2326 |
2319 // Check if we can do a fast clone or have to call the runtime. | 2327 // Check if we can do a fast clone or have to call the runtime. |
2320 Label if_fast_clone(assembler), | 2328 Label if_fast_clone(assembler), |
2321 if_not_fast_clone(assembler, Label::kDeferred); | 2329 if_not_fast_clone(assembler, Label::kDeferred); |
2322 Node* fast_clone_properties_count = | 2330 Node* fast_clone_properties_count = |
2323 __ DecodeWord32<CreateObjectLiteralFlags::FastClonePropertiesCountBits>( | 2331 __ DecodeWord<CreateObjectLiteralFlags::FastClonePropertiesCountBits>( |
2324 bytecode_flags); | 2332 bytecode_flags); |
2325 __ Branch(fast_clone_properties_count, &if_fast_clone, &if_not_fast_clone); | 2333 __ Branch(__ WordNotEqual(fast_clone_properties_count, __ IntPtrConstant(0)), |
| 2334 &if_fast_clone, &if_not_fast_clone); |
2326 | 2335 |
2327 __ Bind(&if_fast_clone); | 2336 __ Bind(&if_fast_clone); |
2328 { | 2337 { |
2329 // If we can do a fast clone do the fast-path in FastCloneShallowObjectStub. | 2338 // If we can do a fast clone do the fast-path in FastCloneShallowObjectStub. |
2330 Node* result = FastCloneShallowObjectStub::GenerateFastPath( | 2339 Node* result = FastCloneShallowObjectStub::GenerateFastPath( |
2331 assembler, &if_not_fast_clone, closure, literal_index, | 2340 assembler, &if_not_fast_clone, closure, literal_index, |
2332 fast_clone_properties_count); | 2341 fast_clone_properties_count); |
2333 __ StoreRegister(result, __ BytecodeOperandReg(3)); | 2342 __ StoreRegister(result, __ BytecodeOperandReg(3)); |
2334 __ Dispatch(); | 2343 __ Dispatch(); |
2335 } | 2344 } |
2336 | 2345 |
2337 __ Bind(&if_not_fast_clone); | 2346 __ Bind(&if_not_fast_clone); |
2338 { | 2347 { |
2339 // If we can't do a fast clone, call into the runtime. | 2348 // If we can't do a fast clone, call into the runtime. |
2340 Node* index = __ BytecodeOperandIdx(0); | 2349 Node* index = __ BytecodeOperandIdx(0); |
2341 Node* constant_elements = __ LoadConstantPoolEntry(index); | 2350 Node* constant_elements = __ LoadConstantPoolEntry(index); |
2342 Node* context = __ GetContext(); | 2351 Node* context = __ GetContext(); |
2343 | 2352 |
2344 STATIC_ASSERT(CreateObjectLiteralFlags::FlagsBits::kShift == 0); | 2353 Node* flags_raw = |
2345 Node* flags_raw = __ Word32And( | 2354 __ DecodeWord<CreateObjectLiteralFlags::FlagsBits>(bytecode_flags); |
2346 bytecode_flags, | |
2347 __ Int32Constant(CreateObjectLiteralFlags::FlagsBits::kMask)); | |
2348 Node* flags = __ SmiTag(flags_raw); | 2355 Node* flags = __ SmiTag(flags_raw); |
2349 | 2356 |
2350 Node* result = | 2357 Node* result = |
2351 __ CallRuntime(Runtime::kCreateObjectLiteral, context, closure, | 2358 __ CallRuntime(Runtime::kCreateObjectLiteral, context, closure, |
2352 literal_index, constant_elements, flags); | 2359 literal_index, constant_elements, flags); |
2353 __ StoreRegister(result, __ BytecodeOperandReg(3)); | 2360 __ StoreRegister(result, __ BytecodeOperandReg(3)); |
2354 // TODO(klaasb) build a single dispatch once the call is inlined | 2361 // TODO(klaasb) build a single dispatch once the call is inlined |
2355 __ Dispatch(); | 2362 __ Dispatch(); |
2356 } | 2363 } |
2357 } | 2364 } |
2358 | 2365 |
2359 // CreateClosure <index> <tenured> | 2366 // CreateClosure <index> <tenured> |
2360 // | 2367 // |
2361 // Creates a new closure for SharedFunctionInfo at position |index| in the | 2368 // Creates a new closure for SharedFunctionInfo at position |index| in the |
2362 // constant pool and with the PretenureFlag <tenured>. | 2369 // constant pool and with the PretenureFlag <tenured>. |
2363 void Interpreter::DoCreateClosure(InterpreterAssembler* assembler) { | 2370 void Interpreter::DoCreateClosure(InterpreterAssembler* assembler) { |
2364 Node* index = __ BytecodeOperandIdx(0); | 2371 Node* index = __ BytecodeOperandIdx(0); |
2365 Node* shared = __ LoadConstantPoolEntry(index); | 2372 Node* shared = __ LoadConstantPoolEntry(index); |
2366 Node* flags = __ BytecodeOperandFlag(1); | 2373 Node* flags = __ BytecodeOperandFlag(1); |
2367 Node* context = __ GetContext(); | 2374 Node* context = __ GetContext(); |
2368 | 2375 |
2369 Label call_runtime(assembler, Label::kDeferred); | 2376 Label call_runtime(assembler, Label::kDeferred); |
2370 Node* fast_new_closure = __ Word32And( | 2377 __ GotoUnless(__ IsSetWord<CreateClosureFlags::FastNewClosureBit>(flags), |
2371 flags, __ Int32Constant(CreateClosureFlags::FastNewClosureBit::kMask)); | 2378 &call_runtime); |
2372 __ GotoUnless(fast_new_closure, &call_runtime); | |
2373 __ SetAccumulator(FastNewClosureStub::Generate(assembler, shared, context)); | 2379 __ SetAccumulator(FastNewClosureStub::Generate(assembler, shared, context)); |
2374 __ Dispatch(); | 2380 __ Dispatch(); |
2375 | 2381 |
2376 __ Bind(&call_runtime); | 2382 __ Bind(&call_runtime); |
2377 { | 2383 { |
2378 STATIC_ASSERT(CreateClosureFlags::PretenuredBit::kShift == 0); | 2384 Node* tenured_raw = __ DecodeWord<CreateClosureFlags::PretenuredBit>(flags); |
2379 Node* tenured_raw = __ Word32And( | |
2380 flags, __ Int32Constant(CreateClosureFlags::PretenuredBit::kMask)); | |
2381 Node* tenured = __ SmiTag(tenured_raw); | 2385 Node* tenured = __ SmiTag(tenured_raw); |
2382 Node* result = __ CallRuntime(Runtime::kInterpreterNewClosure, context, | 2386 Node* result = __ CallRuntime(Runtime::kInterpreterNewClosure, context, |
2383 shared, tenured); | 2387 shared, tenured); |
2384 __ SetAccumulator(result); | 2388 __ SetAccumulator(result); |
2385 __ Dispatch(); | 2389 __ Dispatch(); |
2386 } | 2390 } |
2387 } | 2391 } |
2388 | 2392 |
2389 // CreateBlockContext <index> | 2393 // CreateBlockContext <index> |
2390 // | 2394 // |
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2722 __ Dispatch(); | 2726 __ Dispatch(); |
2723 } | 2727 } |
2724 __ Bind(&if_slow); | 2728 __ Bind(&if_slow); |
2725 { | 2729 { |
2726 // Record the fact that we hit the for-in slow path. | 2730 // Record the fact that we hit the for-in slow path. |
2727 Node* vector_index = __ BytecodeOperandIdx(3); | 2731 Node* vector_index = __ BytecodeOperandIdx(3); |
2728 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | 2732 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
2729 Node* megamorphic_sentinel = | 2733 Node* megamorphic_sentinel = |
2730 __ HeapConstant(TypeFeedbackVector::MegamorphicSentinel(isolate_)); | 2734 __ HeapConstant(TypeFeedbackVector::MegamorphicSentinel(isolate_)); |
2731 __ StoreFixedArrayElement(type_feedback_vector, vector_index, | 2735 __ StoreFixedArrayElement(type_feedback_vector, vector_index, |
2732 megamorphic_sentinel, SKIP_WRITE_BARRIER); | 2736 megamorphic_sentinel, SKIP_WRITE_BARRIER, 0, |
| 2737 CodeStubAssembler::INTPTR_PARAMETERS); |
2733 | 2738 |
2734 // Need to filter the {key} for the {receiver}. | 2739 // Need to filter the {key} for the {receiver}. |
2735 Node* context = __ GetContext(); | 2740 Node* context = __ GetContext(); |
2736 Callable callable = CodeFactory::ForInFilter(assembler->isolate()); | 2741 Callable callable = CodeFactory::ForInFilter(assembler->isolate()); |
2737 Node* result = __ CallStub(callable, context, key, receiver); | 2742 Node* result = __ CallStub(callable, context, key, receiver); |
2738 __ SetAccumulator(result); | 2743 __ SetAccumulator(result); |
2739 __ Dispatch(); | 2744 __ Dispatch(); |
2740 } | 2745 } |
2741 } | 2746 } |
2742 | 2747 |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2866 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, | 2871 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, |
2867 __ SmiTag(new_state)); | 2872 __ SmiTag(new_state)); |
2868 __ SetAccumulator(old_state); | 2873 __ SetAccumulator(old_state); |
2869 | 2874 |
2870 __ Dispatch(); | 2875 __ Dispatch(); |
2871 } | 2876 } |
2872 | 2877 |
2873 } // namespace interpreter | 2878 } // namespace interpreter |
2874 } // namespace internal | 2879 } // namespace internal |
2875 } // namespace v8 | 2880 } // namespace v8 |
OLD | NEW |