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

Side by Side Diff: src/compiler/bytecode-graph-builder.cc

Issue 1546683002: [Interpreter] Add support for jumps using constants with wide operands. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase. Created 4 years, 11 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/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 1446 matching lines...) Expand 10 before | Expand all | Expand 10 after
1457 BuildJump(); 1457 BuildJump();
1458 } 1458 }
1459 1459
1460 1460
1461 void BytecodeGraphBuilder::VisitJumpConstant( 1461 void BytecodeGraphBuilder::VisitJumpConstant(
1462 const interpreter::BytecodeArrayIterator& iterator) { 1462 const interpreter::BytecodeArrayIterator& iterator) {
1463 BuildJump(); 1463 BuildJump();
1464 } 1464 }
1465 1465
1466 1466
1467 void BytecodeGraphBuilder::VisitJumpConstantWide(
1468 const interpreter::BytecodeArrayIterator& iterator) {
1469 BuildJump();
1470 }
1471
1472
1467 void BytecodeGraphBuilder::VisitJumpIfTrue( 1473 void BytecodeGraphBuilder::VisitJumpIfTrue(
1468 const interpreter::BytecodeArrayIterator& iterator) { 1474 const interpreter::BytecodeArrayIterator& iterator) {
1469 Node* condition = BuildCondition(jsgraph()->TrueConstant()); 1475 BuildJumpIfEqual(jsgraph()->TrueConstant());
1470 BuildConditionalJump(condition);
1471 } 1476 }
1472 1477
1473 1478
1474 void BytecodeGraphBuilder::VisitJumpIfTrueConstant( 1479 void BytecodeGraphBuilder::VisitJumpIfTrueConstant(
1475 const interpreter::BytecodeArrayIterator& iterator) { 1480 const interpreter::BytecodeArrayIterator& iterator) {
1476 Node* condition = BuildCondition(jsgraph()->TrueConstant()); 1481 BuildJumpIfEqual(jsgraph()->TrueConstant());
1477 BuildConditionalJump(condition); 1482 }
1483
1484
1485 void BytecodeGraphBuilder::VisitJumpIfTrueConstantWide(
1486 const interpreter::BytecodeArrayIterator& iterator) {
1487 BuildJumpIfEqual(jsgraph()->TrueConstant());
1478 } 1488 }
1479 1489
1480 1490
1481 void BytecodeGraphBuilder::VisitJumpIfFalse( 1491 void BytecodeGraphBuilder::VisitJumpIfFalse(
1482 const interpreter::BytecodeArrayIterator& iterator) { 1492 const interpreter::BytecodeArrayIterator& iterator) {
1483 Node* condition = BuildCondition(jsgraph()->FalseConstant()); 1493 BuildJumpIfEqual(jsgraph()->FalseConstant());
1484 BuildConditionalJump(condition);
1485 } 1494 }
1486 1495
1487 1496
1488 void BytecodeGraphBuilder::VisitJumpIfFalseConstant( 1497 void BytecodeGraphBuilder::VisitJumpIfFalseConstant(
1489 const interpreter::BytecodeArrayIterator& iterator) { 1498 const interpreter::BytecodeArrayIterator& iterator) {
1490 Node* condition = BuildCondition(jsgraph()->FalseConstant()); 1499 BuildJumpIfEqual(jsgraph()->FalseConstant());
1491 BuildConditionalJump(condition); 1500 }
1501
1502
1503 void BytecodeGraphBuilder::VisitJumpIfFalseConstantWide(
1504 const interpreter::BytecodeArrayIterator& iterator) {
1505 BuildJumpIfEqual(jsgraph()->FalseConstant());
1492 } 1506 }
1493 1507
1494 1508
1495 void BytecodeGraphBuilder::VisitJumpIfToBooleanTrue( 1509 void BytecodeGraphBuilder::VisitJumpIfToBooleanTrue(
1496 const interpreter::BytecodeArrayIterator& iterator) { 1510 const interpreter::BytecodeArrayIterator& iterator) {
1497 Node* condition = BuildToBooleanCondition(jsgraph()->TrueConstant()); 1511 BuildJumpIfToBooleanEqual(jsgraph()->TrueConstant());
1498 BuildConditionalJump(condition);
1499 } 1512 }
1500 1513
1501 1514
1502 void BytecodeGraphBuilder::VisitJumpIfToBooleanTrueConstant( 1515 void BytecodeGraphBuilder::VisitJumpIfToBooleanTrueConstant(
1503 const interpreter::BytecodeArrayIterator& iterator) { 1516 const interpreter::BytecodeArrayIterator& iterator) {
1504 Node* condition = BuildToBooleanCondition(jsgraph()->TrueConstant()); 1517 BuildJumpIfToBooleanEqual(jsgraph()->TrueConstant());
1505 BuildConditionalJump(condition); 1518 }
1519
1520
1521 void BytecodeGraphBuilder::VisitJumpIfToBooleanTrueConstantWide(
1522 const interpreter::BytecodeArrayIterator& iterator) {
1523 BuildJumpIfToBooleanEqual(jsgraph()->TrueConstant());
1506 } 1524 }
1507 1525
1508 1526
1509 void BytecodeGraphBuilder::VisitJumpIfToBooleanFalse( 1527 void BytecodeGraphBuilder::VisitJumpIfToBooleanFalse(
1510 const interpreter::BytecodeArrayIterator& iterator) { 1528 const interpreter::BytecodeArrayIterator& iterator) {
1511 Node* condition = BuildToBooleanCondition(jsgraph()->FalseConstant()); 1529 BuildJumpIfToBooleanEqual(jsgraph()->FalseConstant());
1512 BuildConditionalJump(condition);
1513 } 1530 }
1514 1531
1515 1532
1516 void BytecodeGraphBuilder::VisitJumpIfToBooleanFalseConstant( 1533 void BytecodeGraphBuilder::VisitJumpIfToBooleanFalseConstant(
1517 const interpreter::BytecodeArrayIterator& iterator) { 1534 const interpreter::BytecodeArrayIterator& iterator) {
1518 Node* condition = BuildToBooleanCondition(jsgraph()->FalseConstant()); 1535 BuildJumpIfToBooleanEqual(jsgraph()->FalseConstant());
1519 BuildConditionalJump(condition); 1536 }
1537
1538
1539 void BytecodeGraphBuilder::VisitJumpIfToBooleanFalseConstantWide(
1540 const interpreter::BytecodeArrayIterator& iterator) {
1541 BuildJumpIfToBooleanEqual(jsgraph()->FalseConstant());
1520 } 1542 }
1521 1543
1522 1544
1523 void BytecodeGraphBuilder::VisitJumpIfNull( 1545 void BytecodeGraphBuilder::VisitJumpIfNull(
1524 const interpreter::BytecodeArrayIterator& iterator) { 1546 const interpreter::BytecodeArrayIterator& iterator) {
1525 Node* condition = BuildCondition(jsgraph()->NullConstant()); 1547 BuildJumpIfEqual(jsgraph()->NullConstant());
1526 BuildConditionalJump(condition);
1527 } 1548 }
1528 1549
1529 1550
1530 void BytecodeGraphBuilder::VisitJumpIfNullConstant( 1551 void BytecodeGraphBuilder::VisitJumpIfNullConstant(
1531 const interpreter::BytecodeArrayIterator& iterator) { 1552 const interpreter::BytecodeArrayIterator& iterator) {
1532 Node* condition = BuildCondition(jsgraph()->NullConstant()); 1553 BuildJumpIfEqual(jsgraph()->NullConstant());
1533 BuildConditionalJump(condition); 1554 }
1555
1556
1557 void BytecodeGraphBuilder::VisitJumpIfNullConstantWide(
1558 const interpreter::BytecodeArrayIterator& iterator) {
1559 BuildJumpIfEqual(jsgraph()->NullConstant());
1534 } 1560 }
1535 1561
1536 1562
1537 void BytecodeGraphBuilder::VisitJumpIfUndefined( 1563 void BytecodeGraphBuilder::VisitJumpIfUndefined(
1538 const interpreter::BytecodeArrayIterator& iterator) { 1564 const interpreter::BytecodeArrayIterator& iterator) {
1539 Node* condition = BuildCondition(jsgraph()->UndefinedConstant()); 1565 BuildJumpIfEqual(jsgraph()->UndefinedConstant());
1540 BuildConditionalJump(condition);
1541 } 1566 }
1542 1567
1543 1568
1544 void BytecodeGraphBuilder::VisitJumpIfUndefinedConstant( 1569 void BytecodeGraphBuilder::VisitJumpIfUndefinedConstant(
1545 const interpreter::BytecodeArrayIterator& iterator) { 1570 const interpreter::BytecodeArrayIterator& iterator) {
1546 Node* condition = BuildCondition(jsgraph()->UndefinedConstant()); 1571 BuildJumpIfEqual(jsgraph()->UndefinedConstant());
1547 BuildConditionalJump(condition);
1548 } 1572 }
1549 1573
1550 1574
1575 void BytecodeGraphBuilder::VisitJumpIfUndefinedConstantWide(
1576 const interpreter::BytecodeArrayIterator& iterator) {
1577 BuildJumpIfEqual(jsgraph()->UndefinedConstant());
1578 }
1579
1580
1551 void BytecodeGraphBuilder::VisitReturn( 1581 void BytecodeGraphBuilder::VisitReturn(
1552 const interpreter::BytecodeArrayIterator& iterator) { 1582 const interpreter::BytecodeArrayIterator& iterator) {
1553 Node* control = 1583 Node* control =
1554 NewNode(common()->Return(), environment()->LookupAccumulator()); 1584 NewNode(common()->Return(), environment()->LookupAccumulator());
1555 UpdateControlDependencyToLeaveFunction(control); 1585 UpdateControlDependencyToLeaveFunction(control);
1556 set_environment(nullptr); 1586 set_environment(nullptr);
1557 } 1587 }
1558 1588
1559 1589
1560 void BytecodeGraphBuilder::VisitForInPrepare( 1590 void BytecodeGraphBuilder::VisitForInPrepare(
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
1682 int source_offset = bytecode_iterator()->current_offset(); 1712 int source_offset = bytecode_iterator()->current_offset();
1683 NewBranch(condition); 1713 NewBranch(condition);
1684 Environment* if_false_environment = environment()->CopyForConditional(); 1714 Environment* if_false_environment = environment()->CopyForConditional();
1685 NewIfTrue(); 1715 NewIfTrue();
1686 BuildJump(source_offset, bytecode_iterator()->GetJumpTargetOffset()); 1716 BuildJump(source_offset, bytecode_iterator()->GetJumpTargetOffset());
1687 set_environment(if_false_environment); 1717 set_environment(if_false_environment);
1688 NewIfFalse(); 1718 NewIfFalse();
1689 } 1719 }
1690 1720
1691 1721
1692 Node* BytecodeGraphBuilder::BuildCondition(Node* comperand) { 1722 void BytecodeGraphBuilder::BuildJumpIfEqual(Node* comperand) {
1693 Node* accumulator = environment()->LookupAccumulator(); 1723 Node* accumulator = environment()->LookupAccumulator();
1694 return NewNode(javascript()->StrictEqual(), accumulator, comperand); 1724 Node* condition =
1725 NewNode(javascript()->StrictEqual(), accumulator, comperand);
1726 BuildConditionalJump(condition);
1695 } 1727 }
1696 1728
1697 1729
1698 Node* BytecodeGraphBuilder::BuildToBooleanCondition(Node* comperand) { 1730 void BytecodeGraphBuilder::BuildJumpIfToBooleanEqual(Node* comperand) {
1699 Node* accumulator = environment()->LookupAccumulator(); 1731 Node* accumulator = environment()->LookupAccumulator();
1700 Node* to_boolean = 1732 Node* to_boolean =
1701 NewNode(javascript()->ToBoolean(ToBooleanHint::kAny), accumulator); 1733 NewNode(javascript()->ToBoolean(ToBooleanHint::kAny), accumulator);
1702 return NewNode(javascript()->StrictEqual(), to_boolean, comperand); 1734 Node* condition = NewNode(javascript()->StrictEqual(), to_boolean, comperand);
1735 BuildConditionalJump(condition);
1703 } 1736 }
1704 1737
1705 1738
1706 Node** BytecodeGraphBuilder::EnsureInputBufferSize(int size) { 1739 Node** BytecodeGraphBuilder::EnsureInputBufferSize(int size) {
1707 if (size > input_buffer_size_) { 1740 if (size > input_buffer_size_) {
1708 size = size + kInputBufferSizeIncrement + input_buffer_size_; 1741 size = size + kInputBufferSizeIncrement + input_buffer_size_;
1709 input_buffer_ = local_zone()->NewArray<Node*>(size); 1742 input_buffer_ = local_zone()->NewArray<Node*>(size);
1710 input_buffer_size_ = size; 1743 input_buffer_size_ = size;
1711 } 1744 }
1712 return input_buffer_; 1745 return input_buffer_;
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
1853 1886
1854 void BytecodeGraphBuilder::UpdateControlDependencyToLeaveFunction(Node* exit) { 1887 void BytecodeGraphBuilder::UpdateControlDependencyToLeaveFunction(Node* exit) {
1855 if (environment()->IsMarkedAsUnreachable()) return; 1888 if (environment()->IsMarkedAsUnreachable()) return;
1856 environment()->MarkAsUnreachable(); 1889 environment()->MarkAsUnreachable();
1857 exit_controls_.push_back(exit); 1890 exit_controls_.push_back(exit);
1858 } 1891 }
1859 1892
1860 } // namespace compiler 1893 } // namespace compiler
1861 } // namespace internal 1894 } // namespace internal
1862 } // namespace v8 1895 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698