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

Side by Side Diff: src/code-stubs.cc

Issue 2415133002: [stubs] Gets rid of the Smi(Add/Sub)WithOverflow macros. (Closed)
Patch Set: Created 4 years, 2 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
« no previous file with comments | « src/code-stub-assembler.cc ('k') | src/interpreter/interpreter.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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/code-stubs.h" 5 #include "src/code-stubs.h"
6 6
7 #include <sstream> 7 #include <sstream>
8 8
9 #include "src/ast/ast.h" 9 #include "src/ast/ast.h"
10 #include "src/bootstrapper.h" 10 #include "src/bootstrapper.h"
(...skipping 674 matching lines...) Expand 10 before | Expand all | Expand 10 after
685 assembler->Bind(&if_lhsissmi); 685 assembler->Bind(&if_lhsissmi);
686 { 686 {
687 // Check if the {rhs} is also a Smi. 687 // Check if the {rhs} is also a Smi.
688 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); 688 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler);
689 assembler->Branch(assembler->TaggedIsSmi(rhs), &if_rhsissmi, 689 assembler->Branch(assembler->TaggedIsSmi(rhs), &if_rhsissmi,
690 &if_rhsisnotsmi); 690 &if_rhsisnotsmi);
691 691
692 assembler->Bind(&if_rhsissmi); 692 assembler->Bind(&if_rhsissmi);
693 { 693 {
694 // Try fast Smi addition first. 694 // Try fast Smi addition first.
695 Node* pair = assembler->SmiAddWithOverflow(lhs, rhs); 695 Node* pair =
696 assembler->IntPtrAddWithOverflow(assembler->BitcastTaggedToWord(lhs),
697 assembler->BitcastTaggedToWord(rhs));
696 Node* overflow = assembler->Projection(1, pair); 698 Node* overflow = assembler->Projection(1, pair);
697 699
698 // Check if the Smi additon overflowed. 700 // Check if the Smi additon overflowed.
699 Label if_overflow(assembler), if_notoverflow(assembler); 701 Label if_overflow(assembler), if_notoverflow(assembler);
700 assembler->Branch(overflow, &if_overflow, &if_notoverflow); 702 assembler->Branch(overflow, &if_overflow, &if_notoverflow);
701 703
702 assembler->Bind(&if_overflow); 704 assembler->Bind(&if_overflow);
703 { 705 {
704 var_fadd_lhs.Bind(assembler->SmiToFloat64(lhs)); 706 var_fadd_lhs.Bind(assembler->SmiToFloat64(lhs));
705 var_fadd_rhs.Bind(assembler->SmiToFloat64(rhs)); 707 var_fadd_rhs.Bind(assembler->SmiToFloat64(rhs));
706 assembler->Goto(&do_fadd); 708 assembler->Goto(&do_fadd);
707 } 709 }
708 710
709 assembler->Bind(&if_notoverflow); 711 assembler->Bind(&if_notoverflow);
710 { 712 {
711 var_type_feedback.Bind( 713 var_type_feedback.Bind(
712 assembler->Int32Constant(BinaryOperationFeedback::kSignedSmall)); 714 assembler->Int32Constant(BinaryOperationFeedback::kSignedSmall));
713 var_result.Bind(assembler->Projection(0, pair)); 715 var_result.Bind(assembler->BitcastWordToTaggedSigned(
716 assembler->Projection(0, pair)));
714 assembler->Goto(&end); 717 assembler->Goto(&end);
715 } 718 }
716 } 719 }
717 720
718 assembler->Bind(&if_rhsisnotsmi); 721 assembler->Bind(&if_rhsisnotsmi);
719 { 722 {
720 // Load the map of {rhs}. 723 // Load the map of {rhs}.
721 Node* rhs_map = assembler->LoadMap(rhs); 724 Node* rhs_map = assembler->LoadMap(rhs);
722 725
723 // Check if the {rhs} is a HeapNumber. 726 // Check if the {rhs} is a HeapNumber.
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
845 assembler->Bind(&if_lhsissmi); 848 assembler->Bind(&if_lhsissmi);
846 { 849 {
847 // Check if the {rhs} is also a Smi. 850 // Check if the {rhs} is also a Smi.
848 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); 851 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler);
849 assembler->Branch(assembler->TaggedIsSmi(rhs), &if_rhsissmi, 852 assembler->Branch(assembler->TaggedIsSmi(rhs), &if_rhsissmi,
850 &if_rhsisnotsmi); 853 &if_rhsisnotsmi);
851 854
852 assembler->Bind(&if_rhsissmi); 855 assembler->Bind(&if_rhsissmi);
853 { 856 {
854 // Try a fast Smi subtraction first. 857 // Try a fast Smi subtraction first.
855 Node* pair = assembler->SmiSubWithOverflow(lhs, rhs); 858 Node* pair =
859 assembler->IntPtrSubWithOverflow(assembler->BitcastTaggedToWord(lhs),
860 assembler->BitcastTaggedToWord(rhs));
856 Node* overflow = assembler->Projection(1, pair); 861 Node* overflow = assembler->Projection(1, pair);
857 862
858 // Check if the Smi subtraction overflowed. 863 // Check if the Smi subtraction overflowed.
859 Label if_overflow(assembler), if_notoverflow(assembler); 864 Label if_overflow(assembler), if_notoverflow(assembler);
860 assembler->Branch(overflow, &if_overflow, &if_notoverflow); 865 assembler->Branch(overflow, &if_overflow, &if_notoverflow);
861 866
862 assembler->Bind(&if_overflow); 867 assembler->Bind(&if_overflow);
863 { 868 {
864 // lhs, rhs - smi and result - number. combined - number. 869 // lhs, rhs - smi and result - number. combined - number.
865 // The result doesn't fit into Smi range. 870 // The result doesn't fit into Smi range.
866 var_fsub_lhs.Bind(assembler->SmiToFloat64(lhs)); 871 var_fsub_lhs.Bind(assembler->SmiToFloat64(lhs));
867 var_fsub_rhs.Bind(assembler->SmiToFloat64(rhs)); 872 var_fsub_rhs.Bind(assembler->SmiToFloat64(rhs));
868 assembler->Goto(&do_fsub); 873 assembler->Goto(&do_fsub);
869 } 874 }
870 875
871 assembler->Bind(&if_notoverflow); 876 assembler->Bind(&if_notoverflow);
872 // lhs, rhs, result smi. combined - smi. 877 // lhs, rhs, result smi. combined - smi.
873 var_type_feedback.Bind( 878 var_type_feedback.Bind(
874 assembler->Int32Constant(BinaryOperationFeedback::kSignedSmall)); 879 assembler->Int32Constant(BinaryOperationFeedback::kSignedSmall));
875 var_result.Bind(assembler->Projection(0, pair)); 880 var_result.Bind(
881 assembler->BitcastWordToTaggedSigned(assembler->Projection(0, pair)));
876 assembler->Goto(&end); 882 assembler->Goto(&end);
877 } 883 }
878 884
879 assembler->Bind(&if_rhsisnotsmi); 885 assembler->Bind(&if_rhsisnotsmi);
880 { 886 {
881 // Load the map of the {rhs}. 887 // Load the map of the {rhs}.
882 Node* rhs_map = assembler->LoadMap(rhs); 888 Node* rhs_map = assembler->LoadMap(rhs);
883 889
884 // Check if {rhs} is a HeapNumber. 890 // Check if {rhs} is a HeapNumber.
885 assembler->GotoUnless(assembler->IsHeapNumberMap(rhs_map), 891 assembler->GotoUnless(assembler->IsHeapNumberMap(rhs_map),
(...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after
1452 { 1458 {
1453 value = value_var.value(); 1459 value = value_var.value();
1454 1460
1455 Label if_issmi(assembler), if_isnotsmi(assembler); 1461 Label if_issmi(assembler), if_isnotsmi(assembler);
1456 assembler->Branch(assembler->TaggedIsSmi(value), &if_issmi, &if_isnotsmi); 1462 assembler->Branch(assembler->TaggedIsSmi(value), &if_issmi, &if_isnotsmi);
1457 1463
1458 assembler->Bind(&if_issmi); 1464 assembler->Bind(&if_issmi);
1459 { 1465 {
1460 // Try fast Smi addition first. 1466 // Try fast Smi addition first.
1461 Node* one = assembler->SmiConstant(Smi::FromInt(1)); 1467 Node* one = assembler->SmiConstant(Smi::FromInt(1));
1462 Node* pair = assembler->SmiAddWithOverflow(value, one); 1468 Node* pair = assembler->IntPtrAddWithOverflow(
1469 assembler->BitcastTaggedToWord(value),
1470 assembler->BitcastTaggedToWord(one));
1463 Node* overflow = assembler->Projection(1, pair); 1471 Node* overflow = assembler->Projection(1, pair);
1464 1472
1465 // Check if the Smi addition overflowed. 1473 // Check if the Smi addition overflowed.
1466 Label if_overflow(assembler), if_notoverflow(assembler); 1474 Label if_overflow(assembler), if_notoverflow(assembler);
1467 assembler->Branch(overflow, &if_overflow, &if_notoverflow); 1475 assembler->Branch(overflow, &if_overflow, &if_notoverflow);
1468 1476
1469 assembler->Bind(&if_notoverflow); 1477 assembler->Bind(&if_notoverflow);
1470 var_type_feedback.Bind(assembler->Word32Or( 1478 var_type_feedback.Bind(assembler->Word32Or(
1471 var_type_feedback.value(), 1479 var_type_feedback.value(),
1472 assembler->Int32Constant(BinaryOperationFeedback::kSignedSmall))); 1480 assembler->Int32Constant(BinaryOperationFeedback::kSignedSmall)));
1473 result_var.Bind(assembler->Projection(0, pair)); 1481 result_var.Bind(
1482 assembler->BitcastWordToTaggedSigned(assembler->Projection(0, pair)));
1474 assembler->Goto(&end); 1483 assembler->Goto(&end);
1475 1484
1476 assembler->Bind(&if_overflow); 1485 assembler->Bind(&if_overflow);
1477 { 1486 {
1478 var_finc_value.Bind(assembler->SmiToFloat64(value)); 1487 var_finc_value.Bind(assembler->SmiToFloat64(value));
1479 assembler->Goto(&do_finc); 1488 assembler->Goto(&do_finc);
1480 } 1489 }
1481 } 1490 }
1482 1491
1483 assembler->Bind(&if_isnotsmi); 1492 assembler->Bind(&if_isnotsmi);
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1562 { 1571 {
1563 value = value_var.value(); 1572 value = value_var.value();
1564 1573
1565 Label if_issmi(assembler), if_isnotsmi(assembler); 1574 Label if_issmi(assembler), if_isnotsmi(assembler);
1566 assembler->Branch(assembler->TaggedIsSmi(value), &if_issmi, &if_isnotsmi); 1575 assembler->Branch(assembler->TaggedIsSmi(value), &if_issmi, &if_isnotsmi);
1567 1576
1568 assembler->Bind(&if_issmi); 1577 assembler->Bind(&if_issmi);
1569 { 1578 {
1570 // Try fast Smi subtraction first. 1579 // Try fast Smi subtraction first.
1571 Node* one = assembler->SmiConstant(Smi::FromInt(1)); 1580 Node* one = assembler->SmiConstant(Smi::FromInt(1));
1572 Node* pair = assembler->SmiSubWithOverflow(value, one); 1581 Node* pair = assembler->IntPtrSubWithOverflow(
1582 assembler->BitcastTaggedToWord(value),
1583 assembler->BitcastTaggedToWord(one));
1573 Node* overflow = assembler->Projection(1, pair); 1584 Node* overflow = assembler->Projection(1, pair);
1574 1585
1575 // Check if the Smi subtraction overflowed. 1586 // Check if the Smi subtraction overflowed.
1576 Label if_overflow(assembler), if_notoverflow(assembler); 1587 Label if_overflow(assembler), if_notoverflow(assembler);
1577 assembler->Branch(overflow, &if_overflow, &if_notoverflow); 1588 assembler->Branch(overflow, &if_overflow, &if_notoverflow);
1578 1589
1579 assembler->Bind(&if_notoverflow); 1590 assembler->Bind(&if_notoverflow);
1580 var_type_feedback.Bind(assembler->Word32Or( 1591 var_type_feedback.Bind(assembler->Word32Or(
1581 var_type_feedback.value(), 1592 var_type_feedback.value(),
1582 assembler->Int32Constant(BinaryOperationFeedback::kSignedSmall))); 1593 assembler->Int32Constant(BinaryOperationFeedback::kSignedSmall)));
1583 result_var.Bind(assembler->Projection(0, pair)); 1594 result_var.Bind(
1595 assembler->BitcastWordToTaggedSigned(assembler->Projection(0, pair)));
1584 assembler->Goto(&end); 1596 assembler->Goto(&end);
1585 1597
1586 assembler->Bind(&if_overflow); 1598 assembler->Bind(&if_overflow);
1587 { 1599 {
1588 var_fdec_value.Bind(assembler->SmiToFloat64(value)); 1600 var_fdec_value.Bind(assembler->SmiToFloat64(value));
1589 assembler->Goto(&do_fdec); 1601 assembler->Goto(&do_fdec);
1590 } 1602 }
1591 } 1603 }
1592 1604
1593 assembler->Bind(&if_isnotsmi); 1605 assembler->Bind(&if_isnotsmi);
(...skipping 1439 matching lines...) Expand 10 before | Expand all | Expand 10 after
3033 3045
3034 if (type == MachineType::Pointer()) { 3046 if (type == MachineType::Pointer()) {
3035 return Representation::External(); 3047 return Representation::External();
3036 } 3048 }
3037 3049
3038 return Representation::Tagged(); 3050 return Representation::Tagged();
3039 } 3051 }
3040 3052
3041 } // namespace internal 3053 } // namespace internal
3042 } // namespace v8 3054 } // namespace v8
OLDNEW
« no previous file with comments | « src/code-stub-assembler.cc ('k') | src/interpreter/interpreter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698