| 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/compiler/bytecode-graph-builder.h" | 5 #include "src/compiler/bytecode-graph-builder.h" | 
| 6 | 6 | 
| 7 #include "src/compiler/bytecode-branch-analysis.h" | 7 #include "src/compiler/bytecode-branch-analysis.h" | 
| 8 #include "src/compiler/linkage.h" | 8 #include "src/compiler/linkage.h" | 
| 9 #include "src/compiler/operator-properties.h" | 9 #include "src/compiler/operator-properties.h" | 
| 10 #include "src/interpreter/bytecodes.h" | 10 #include "src/interpreter/bytecodes.h" | 
| (...skipping 995 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1006   UpdateControlDependencyToLeaveFunction(control); | 1006   UpdateControlDependencyToLeaveFunction(control); | 
| 1007   environment()->BindAccumulator(value); | 1007   environment()->BindAccumulator(value); | 
| 1008 } | 1008 } | 
| 1009 | 1009 | 
| 1010 | 1010 | 
| 1011 void BytecodeGraphBuilder::BuildBinaryOp( | 1011 void BytecodeGraphBuilder::BuildBinaryOp( | 
| 1012     const Operator* js_op, const interpreter::BytecodeArrayIterator& iterator) { | 1012     const Operator* js_op, const interpreter::BytecodeArrayIterator& iterator) { | 
| 1013   Node* left = environment()->LookupRegister(iterator.GetRegisterOperand(0)); | 1013   Node* left = environment()->LookupRegister(iterator.GetRegisterOperand(0)); | 
| 1014   Node* right = environment()->LookupAccumulator(); | 1014   Node* right = environment()->LookupAccumulator(); | 
| 1015   Node* node = NewNode(js_op, left, right); | 1015   Node* node = NewNode(js_op, left, right); | 
| 1016 |  | 
| 1017   AddEmptyFrameStateInputs(node); | 1016   AddEmptyFrameStateInputs(node); | 
| 1018   environment()->BindAccumulator(node); | 1017   environment()->BindAccumulator(node); | 
| 1019 } | 1018 } | 
| 1020 | 1019 | 
| 1021 | 1020 | 
| 1022 void BytecodeGraphBuilder::VisitAdd( | 1021 void BytecodeGraphBuilder::VisitAdd( | 
| 1023     const interpreter::BytecodeArrayIterator& iterator) { | 1022     const interpreter::BytecodeArrayIterator& iterator) { | 
| 1024   BinaryOperationHints hints = BinaryOperationHints::Any(); | 1023   BinaryOperationHints hints = BinaryOperationHints::Any(); | 
| 1025   BuildBinaryOp(javascript()->Add(language_mode(), hints), iterator); | 1024   BuildBinaryOp(javascript()->Add(language_mode(), hints), iterator); | 
| 1026 } | 1025 } | 
| (...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1362     const interpreter::BytecodeArrayIterator& iterator) { | 1361     const interpreter::BytecodeArrayIterator& iterator) { | 
| 1363   Node* control = | 1362   Node* control = | 
| 1364       NewNode(common()->Return(), environment()->LookupAccumulator()); | 1363       NewNode(common()->Return(), environment()->LookupAccumulator()); | 
| 1365   UpdateControlDependencyToLeaveFunction(control); | 1364   UpdateControlDependencyToLeaveFunction(control); | 
| 1366   set_environment(nullptr); | 1365   set_environment(nullptr); | 
| 1367 } | 1366 } | 
| 1368 | 1367 | 
| 1369 | 1368 | 
| 1370 void BytecodeGraphBuilder::VisitForInPrepare( | 1369 void BytecodeGraphBuilder::VisitForInPrepare( | 
| 1371     const interpreter::BytecodeArrayIterator& iterator) { | 1370     const interpreter::BytecodeArrayIterator& iterator) { | 
| 1372   UNIMPLEMENTED(); | 1371   Node* receiver = | 
|  | 1372       environment()->LookupRegister(iterator.GetRegisterOperand(0)); | 
|  | 1373   // Prepare for-in cache. | 
|  | 1374   Node* prepare = NewNode(javascript()->ForInPrepare(), receiver); | 
|  | 1375   AddEmptyFrameStateInputs(prepare); | 
|  | 1376 | 
|  | 1377   // Move cache info from ForInPrepare into interpreter frame for de-opt. | 
|  | 1378   Node* cache_type = NewNode(common()->Projection(0), prepare); | 
|  | 1379   Node* cache_array = NewNode(common()->Projection(1), prepare); | 
|  | 1380   Node* cache_length = NewNode(common()->Projection(2), prepare); | 
|  | 1381   interpreter::Register cache_type_register = iterator.GetRegisterOperand(1); | 
|  | 1382   interpreter::Register cache_array_register = iterator.GetRegisterOperand(2); | 
|  | 1383   interpreter::Register cache_length_register = iterator.GetRegisterOperand(3); | 
|  | 1384   environment()->BindRegister(cache_type_register, cache_type); | 
|  | 1385   environment()->BindRegister(cache_array_register, cache_array); | 
|  | 1386   environment()->BindRegister(cache_length_register, cache_length); | 
|  | 1387 } | 
|  | 1388 | 
|  | 1389 | 
|  | 1390 void BytecodeGraphBuilder::VisitForInDone( | 
|  | 1391     const interpreter::BytecodeArrayIterator& iterator) { | 
|  | 1392   Node* index = environment()->LookupRegister(iterator.GetRegisterOperand(0)); | 
|  | 1393   Node* cache_length = | 
|  | 1394       environment()->LookupRegister(iterator.GetRegisterOperand(1)); | 
|  | 1395   Node* exit_cond = NewNode(javascript()->ForInDone(), index, cache_length); | 
|  | 1396   AddEmptyFrameStateInputs(exit_cond); | 
|  | 1397   environment()->BindAccumulator(exit_cond); | 
| 1373 } | 1398 } | 
| 1374 | 1399 | 
| 1375 | 1400 | 
| 1376 void BytecodeGraphBuilder::VisitForInNext( | 1401 void BytecodeGraphBuilder::VisitForInNext( | 
| 1377     const interpreter::BytecodeArrayIterator& iterator) { | 1402     const interpreter::BytecodeArrayIterator& iterator) { | 
| 1378   UNIMPLEMENTED(); | 1403   Node* receiver = | 
|  | 1404       environment()->LookupRegister(iterator.GetRegisterOperand(0)); | 
|  | 1405   Node* cache_type = | 
|  | 1406       environment()->LookupRegister(iterator.GetRegisterOperand(1)); | 
|  | 1407   Node* cache_array = | 
|  | 1408       environment()->LookupRegister(iterator.GetRegisterOperand(2)); | 
|  | 1409   Node* index = environment()->LookupRegister(iterator.GetRegisterOperand(3)); | 
|  | 1410   Node* value = NewNode(javascript()->ForInNext(), receiver, cache_array, | 
|  | 1411                         cache_type, index); | 
|  | 1412   AddEmptyFrameStateInputs(value); | 
|  | 1413   environment()->BindAccumulator(value); | 
| 1379 } | 1414 } | 
| 1380 | 1415 | 
| 1381 | 1416 | 
| 1382 void BytecodeGraphBuilder::VisitForInDone( | 1417 void BytecodeGraphBuilder::VisitForInStep( | 
| 1383     const interpreter::BytecodeArrayIterator& iterator) { | 1418     const interpreter::BytecodeArrayIterator& iterator) { | 
| 1384   UNIMPLEMENTED(); | 1419   Node* index = environment()->LookupRegister(iterator.GetRegisterOperand(0)); | 
|  | 1420   index = NewNode(javascript()->ForInStep(), index); | 
|  | 1421   AddEmptyFrameStateInputs(index); | 
|  | 1422   environment()->BindRegister(iterator.GetRegisterOperand(0), index); | 
| 1385 } | 1423 } | 
| 1386 | 1424 | 
| 1387 | 1425 | 
| 1388 void BytecodeGraphBuilder::MergeEnvironmentsOfBackwardBranches( | 1426 void BytecodeGraphBuilder::MergeEnvironmentsOfBackwardBranches( | 
| 1389     int source_offset, int target_offset) { | 1427     int source_offset, int target_offset) { | 
| 1390   DCHECK_GE(source_offset, target_offset); | 1428   DCHECK_GE(source_offset, target_offset); | 
| 1391   const ZoneVector<int>* back_branches = | 1429   const ZoneVector<int>* back_branches = | 
| 1392       branch_analysis()->BackwardBranchesTargetting(target_offset); | 1430       branch_analysis()->BackwardBranchesTargetting(target_offset); | 
| 1393   if (back_branches->back() == source_offset) { | 1431   if (back_branches->back() == source_offset) { | 
| 1394     // The set of back branches is complete, merge them. | 1432     // The set of back branches is complete, merge them. | 
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1626 | 1664 | 
| 1627 void BytecodeGraphBuilder::UpdateControlDependencyToLeaveFunction(Node* exit) { | 1665 void BytecodeGraphBuilder::UpdateControlDependencyToLeaveFunction(Node* exit) { | 
| 1628   if (environment()->IsMarkedAsUnreachable()) return; | 1666   if (environment()->IsMarkedAsUnreachable()) return; | 
| 1629   environment()->MarkAsUnreachable(); | 1667   environment()->MarkAsUnreachable(); | 
| 1630   exit_controls_.push_back(exit); | 1668   exit_controls_.push_back(exit); | 
| 1631 } | 1669 } | 
| 1632 | 1670 | 
| 1633 }  // namespace compiler | 1671 }  // namespace compiler | 
| 1634 }  // namespace internal | 1672 }  // namespace internal | 
| 1635 }  // namespace v8 | 1673 }  // namespace v8 | 
| OLD | NEW | 
|---|