OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |