| 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 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 546 typedef compiler::Node Node; | 546 typedef compiler::Node Node; |
| 547 typedef CodeStubAssembler::Variable Variable; | 547 typedef CodeStubAssembler::Variable Variable; |
| 548 | 548 |
| 549 // Shared entry for floating point addition. | 549 // Shared entry for floating point addition. |
| 550 Label do_fadd(assembler), if_lhsisnotnumber(assembler, Label::kDeferred), | 550 Label do_fadd(assembler), if_lhsisnotnumber(assembler, Label::kDeferred), |
| 551 check_rhsisoddball(assembler, Label::kDeferred), | 551 check_rhsisoddball(assembler, Label::kDeferred), |
| 552 call_with_oddball_feedback(assembler), call_with_any_feedback(assembler), | 552 call_with_oddball_feedback(assembler), call_with_any_feedback(assembler), |
| 553 call_add_stub(assembler), end(assembler); | 553 call_add_stub(assembler), end(assembler); |
| 554 Variable var_fadd_lhs(assembler, MachineRepresentation::kFloat64), | 554 Variable var_fadd_lhs(assembler, MachineRepresentation::kFloat64), |
| 555 var_fadd_rhs(assembler, MachineRepresentation::kFloat64), | 555 var_fadd_rhs(assembler, MachineRepresentation::kFloat64), |
| 556 var_type_feedback(assembler, MachineRepresentation::kWord32), | 556 var_type_feedback(assembler, MachineRepresentation::kTaggedSigned), |
| 557 var_result(assembler, MachineRepresentation::kTagged); | 557 var_result(assembler, MachineRepresentation::kTagged); |
| 558 | 558 |
| 559 // Check if the {lhs} is a Smi or a HeapObject. | 559 // Check if the {lhs} is a Smi or a HeapObject. |
| 560 Label if_lhsissmi(assembler), if_lhsisnotsmi(assembler); | 560 Label if_lhsissmi(assembler), if_lhsisnotsmi(assembler); |
| 561 assembler->Branch(assembler->TaggedIsSmi(lhs), &if_lhsissmi, &if_lhsisnotsmi); | 561 assembler->Branch(assembler->TaggedIsSmi(lhs), &if_lhsissmi, &if_lhsisnotsmi); |
| 562 | 562 |
| 563 assembler->Bind(&if_lhsissmi); | 563 assembler->Bind(&if_lhsissmi); |
| 564 { | 564 { |
| 565 // Check if the {rhs} is also a Smi. | 565 // Check if the {rhs} is also a Smi. |
| 566 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); | 566 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 582 assembler->Bind(&if_overflow); | 582 assembler->Bind(&if_overflow); |
| 583 { | 583 { |
| 584 var_fadd_lhs.Bind(assembler->SmiToFloat64(lhs)); | 584 var_fadd_lhs.Bind(assembler->SmiToFloat64(lhs)); |
| 585 var_fadd_rhs.Bind(assembler->SmiToFloat64(rhs)); | 585 var_fadd_rhs.Bind(assembler->SmiToFloat64(rhs)); |
| 586 assembler->Goto(&do_fadd); | 586 assembler->Goto(&do_fadd); |
| 587 } | 587 } |
| 588 | 588 |
| 589 assembler->Bind(&if_notoverflow); | 589 assembler->Bind(&if_notoverflow); |
| 590 { | 590 { |
| 591 var_type_feedback.Bind( | 591 var_type_feedback.Bind( |
| 592 assembler->Int32Constant(BinaryOperationFeedback::kSignedSmall)); | 592 assembler->SmiConstant(BinaryOperationFeedback::kSignedSmall)); |
| 593 var_result.Bind(assembler->BitcastWordToTaggedSigned( | 593 var_result.Bind(assembler->BitcastWordToTaggedSigned( |
| 594 assembler->Projection(0, pair))); | 594 assembler->Projection(0, pair))); |
| 595 assembler->Goto(&end); | 595 assembler->Goto(&end); |
| 596 } | 596 } |
| 597 } | 597 } |
| 598 | 598 |
| 599 assembler->Bind(&if_rhsisnotsmi); | 599 assembler->Bind(&if_rhsisnotsmi); |
| 600 { | 600 { |
| 601 // Load the map of {rhs}. | 601 // Load the map of {rhs}. |
| 602 Node* rhs_map = assembler->LoadMap(rhs); | 602 Node* rhs_map = assembler->LoadMap(rhs); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 643 | 643 |
| 644 var_fadd_lhs.Bind(assembler->LoadHeapNumberValue(lhs)); | 644 var_fadd_lhs.Bind(assembler->LoadHeapNumberValue(lhs)); |
| 645 var_fadd_rhs.Bind(assembler->LoadHeapNumberValue(rhs)); | 645 var_fadd_rhs.Bind(assembler->LoadHeapNumberValue(rhs)); |
| 646 assembler->Goto(&do_fadd); | 646 assembler->Goto(&do_fadd); |
| 647 } | 647 } |
| 648 } | 648 } |
| 649 | 649 |
| 650 assembler->Bind(&do_fadd); | 650 assembler->Bind(&do_fadd); |
| 651 { | 651 { |
| 652 var_type_feedback.Bind( | 652 var_type_feedback.Bind( |
| 653 assembler->Int32Constant(BinaryOperationFeedback::kNumber)); | 653 assembler->SmiConstant(BinaryOperationFeedback::kNumber)); |
| 654 Node* value = | 654 Node* value = |
| 655 assembler->Float64Add(var_fadd_lhs.value(), var_fadd_rhs.value()); | 655 assembler->Float64Add(var_fadd_lhs.value(), var_fadd_rhs.value()); |
| 656 Node* result = assembler->AllocateHeapNumberWithValue(value); | 656 Node* result = assembler->AllocateHeapNumberWithValue(value); |
| 657 var_result.Bind(result); | 657 var_result.Bind(result); |
| 658 assembler->Goto(&end); | 658 assembler->Goto(&end); |
| 659 } | 659 } |
| 660 | 660 |
| 661 assembler->Bind(&if_lhsisnotnumber); | 661 assembler->Bind(&if_lhsisnotnumber); |
| 662 { | 662 { |
| 663 // No checks on rhs are done yet. We just know lhs is not a number or Smi. | 663 // No checks on rhs are done yet. We just know lhs is not a number or Smi. |
| (...skipping 26 matching lines...) Expand all Loading... |
| 690 assembler->GotoIf(assembler->TaggedIsSmi(rhs), &call_with_any_feedback); | 690 assembler->GotoIf(assembler->TaggedIsSmi(rhs), &call_with_any_feedback); |
| 691 | 691 |
| 692 Node* rhs_instance_type = assembler->LoadInstanceType(rhs); | 692 Node* rhs_instance_type = assembler->LoadInstanceType(rhs); |
| 693 | 693 |
| 694 // Exit unless {rhs} is a string. Since {lhs} is a string we no longer | 694 // Exit unless {rhs} is a string. Since {lhs} is a string we no longer |
| 695 // need an Oddball check. | 695 // need an Oddball check. |
| 696 assembler->GotoUnless(assembler->IsStringInstanceType(rhs_instance_type), | 696 assembler->GotoUnless(assembler->IsStringInstanceType(rhs_instance_type), |
| 697 &call_with_any_feedback); | 697 &call_with_any_feedback); |
| 698 | 698 |
| 699 var_type_feedback.Bind( | 699 var_type_feedback.Bind( |
| 700 assembler->Int32Constant(BinaryOperationFeedback::kString)); | 700 assembler->SmiConstant(BinaryOperationFeedback::kString)); |
| 701 Callable callable = CodeFactory::StringAdd( | 701 Callable callable = CodeFactory::StringAdd( |
| 702 assembler->isolate(), STRING_ADD_CHECK_NONE, NOT_TENURED); | 702 assembler->isolate(), STRING_ADD_CHECK_NONE, NOT_TENURED); |
| 703 var_result.Bind(assembler->CallStub(callable, context, lhs, rhs)); | 703 var_result.Bind(assembler->CallStub(callable, context, lhs, rhs)); |
| 704 | 704 |
| 705 assembler->Goto(&end); | 705 assembler->Goto(&end); |
| 706 } | 706 } |
| 707 } | 707 } |
| 708 | 708 |
| 709 assembler->Bind(&check_rhsisoddball); | 709 assembler->Bind(&check_rhsisoddball); |
| 710 { | 710 { |
| 711 // Check if rhs is an oddball. At this point we know lhs is either a | 711 // Check if rhs is an oddball. At this point we know lhs is either a |
| 712 // Smi or number or oddball and rhs is not a number or Smi. | 712 // Smi or number or oddball and rhs is not a number or Smi. |
| 713 Node* rhs_instance_type = assembler->LoadInstanceType(rhs); | 713 Node* rhs_instance_type = assembler->LoadInstanceType(rhs); |
| 714 Node* rhs_is_oddball = assembler->Word32Equal( | 714 Node* rhs_is_oddball = assembler->Word32Equal( |
| 715 rhs_instance_type, assembler->Int32Constant(ODDBALL_TYPE)); | 715 rhs_instance_type, assembler->Int32Constant(ODDBALL_TYPE)); |
| 716 assembler->Branch(rhs_is_oddball, &call_with_oddball_feedback, | 716 assembler->Branch(rhs_is_oddball, &call_with_oddball_feedback, |
| 717 &call_with_any_feedback); | 717 &call_with_any_feedback); |
| 718 } | 718 } |
| 719 | 719 |
| 720 assembler->Bind(&call_with_oddball_feedback); | 720 assembler->Bind(&call_with_oddball_feedback); |
| 721 { | 721 { |
| 722 var_type_feedback.Bind( | 722 var_type_feedback.Bind( |
| 723 assembler->Int32Constant(BinaryOperationFeedback::kNumberOrOddball)); | 723 assembler->SmiConstant(BinaryOperationFeedback::kNumberOrOddball)); |
| 724 assembler->Goto(&call_add_stub); | 724 assembler->Goto(&call_add_stub); |
| 725 } | 725 } |
| 726 | 726 |
| 727 assembler->Bind(&call_with_any_feedback); | 727 assembler->Bind(&call_with_any_feedback); |
| 728 { | 728 { |
| 729 var_type_feedback.Bind( | 729 var_type_feedback.Bind( |
| 730 assembler->Int32Constant(BinaryOperationFeedback::kAny)); | 730 assembler->SmiConstant(BinaryOperationFeedback::kAny)); |
| 731 assembler->Goto(&call_add_stub); | 731 assembler->Goto(&call_add_stub); |
| 732 } | 732 } |
| 733 | 733 |
| 734 assembler->Bind(&call_add_stub); | 734 assembler->Bind(&call_add_stub); |
| 735 { | 735 { |
| 736 Callable callable = CodeFactory::Add(assembler->isolate()); | 736 Callable callable = CodeFactory::Add(assembler->isolate()); |
| 737 var_result.Bind(assembler->CallStub(callable, context, lhs, rhs)); | 737 var_result.Bind(assembler->CallStub(callable, context, lhs, rhs)); |
| 738 assembler->Goto(&end); | 738 assembler->Goto(&end); |
| 739 } | 739 } |
| 740 | 740 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 752 typedef CodeStubAssembler::Label Label; | 752 typedef CodeStubAssembler::Label Label; |
| 753 typedef compiler::Node Node; | 753 typedef compiler::Node Node; |
| 754 typedef CodeStubAssembler::Variable Variable; | 754 typedef CodeStubAssembler::Variable Variable; |
| 755 | 755 |
| 756 // Shared entry for floating point subtraction. | 756 // Shared entry for floating point subtraction. |
| 757 Label do_fsub(assembler), end(assembler), call_subtract_stub(assembler), | 757 Label do_fsub(assembler), end(assembler), call_subtract_stub(assembler), |
| 758 if_lhsisnotnumber(assembler), check_rhsisoddball(assembler), | 758 if_lhsisnotnumber(assembler), check_rhsisoddball(assembler), |
| 759 call_with_any_feedback(assembler); | 759 call_with_any_feedback(assembler); |
| 760 Variable var_fsub_lhs(assembler, MachineRepresentation::kFloat64), | 760 Variable var_fsub_lhs(assembler, MachineRepresentation::kFloat64), |
| 761 var_fsub_rhs(assembler, MachineRepresentation::kFloat64), | 761 var_fsub_rhs(assembler, MachineRepresentation::kFloat64), |
| 762 var_type_feedback(assembler, MachineRepresentation::kWord32), | 762 var_type_feedback(assembler, MachineRepresentation::kTaggedSigned), |
| 763 var_result(assembler, MachineRepresentation::kTagged); | 763 var_result(assembler, MachineRepresentation::kTagged); |
| 764 | 764 |
| 765 // Check if the {lhs} is a Smi or a HeapObject. | 765 // Check if the {lhs} is a Smi or a HeapObject. |
| 766 Label if_lhsissmi(assembler), if_lhsisnotsmi(assembler); | 766 Label if_lhsissmi(assembler), if_lhsisnotsmi(assembler); |
| 767 assembler->Branch(assembler->TaggedIsSmi(lhs), &if_lhsissmi, &if_lhsisnotsmi); | 767 assembler->Branch(assembler->TaggedIsSmi(lhs), &if_lhsissmi, &if_lhsisnotsmi); |
| 768 | 768 |
| 769 assembler->Bind(&if_lhsissmi); | 769 assembler->Bind(&if_lhsissmi); |
| 770 { | 770 { |
| 771 // Check if the {rhs} is also a Smi. | 771 // Check if the {rhs} is also a Smi. |
| 772 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); | 772 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 790 // lhs, rhs - smi and result - number. combined - number. | 790 // lhs, rhs - smi and result - number. combined - number. |
| 791 // The result doesn't fit into Smi range. | 791 // The result doesn't fit into Smi range. |
| 792 var_fsub_lhs.Bind(assembler->SmiToFloat64(lhs)); | 792 var_fsub_lhs.Bind(assembler->SmiToFloat64(lhs)); |
| 793 var_fsub_rhs.Bind(assembler->SmiToFloat64(rhs)); | 793 var_fsub_rhs.Bind(assembler->SmiToFloat64(rhs)); |
| 794 assembler->Goto(&do_fsub); | 794 assembler->Goto(&do_fsub); |
| 795 } | 795 } |
| 796 | 796 |
| 797 assembler->Bind(&if_notoverflow); | 797 assembler->Bind(&if_notoverflow); |
| 798 // lhs, rhs, result smi. combined - smi. | 798 // lhs, rhs, result smi. combined - smi. |
| 799 var_type_feedback.Bind( | 799 var_type_feedback.Bind( |
| 800 assembler->Int32Constant(BinaryOperationFeedback::kSignedSmall)); | 800 assembler->SmiConstant(BinaryOperationFeedback::kSignedSmall)); |
| 801 var_result.Bind( | 801 var_result.Bind( |
| 802 assembler->BitcastWordToTaggedSigned(assembler->Projection(0, pair))); | 802 assembler->BitcastWordToTaggedSigned(assembler->Projection(0, pair))); |
| 803 assembler->Goto(&end); | 803 assembler->Goto(&end); |
| 804 } | 804 } |
| 805 | 805 |
| 806 assembler->Bind(&if_rhsisnotsmi); | 806 assembler->Bind(&if_rhsisnotsmi); |
| 807 { | 807 { |
| 808 // Load the map of the {rhs}. | 808 // Load the map of the {rhs}. |
| 809 Node* rhs_map = assembler->LoadMap(rhs); | 809 Node* rhs_map = assembler->LoadMap(rhs); |
| 810 | 810 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 853 // Perform a floating point subtraction. | 853 // Perform a floating point subtraction. |
| 854 var_fsub_lhs.Bind(assembler->LoadHeapNumberValue(lhs)); | 854 var_fsub_lhs.Bind(assembler->LoadHeapNumberValue(lhs)); |
| 855 var_fsub_rhs.Bind(assembler->LoadHeapNumberValue(rhs)); | 855 var_fsub_rhs.Bind(assembler->LoadHeapNumberValue(rhs)); |
| 856 assembler->Goto(&do_fsub); | 856 assembler->Goto(&do_fsub); |
| 857 } | 857 } |
| 858 } | 858 } |
| 859 | 859 |
| 860 assembler->Bind(&do_fsub); | 860 assembler->Bind(&do_fsub); |
| 861 { | 861 { |
| 862 var_type_feedback.Bind( | 862 var_type_feedback.Bind( |
| 863 assembler->Int32Constant(BinaryOperationFeedback::kNumber)); | 863 assembler->SmiConstant(BinaryOperationFeedback::kNumber)); |
| 864 Node* lhs_value = var_fsub_lhs.value(); | 864 Node* lhs_value = var_fsub_lhs.value(); |
| 865 Node* rhs_value = var_fsub_rhs.value(); | 865 Node* rhs_value = var_fsub_rhs.value(); |
| 866 Node* value = assembler->Float64Sub(lhs_value, rhs_value); | 866 Node* value = assembler->Float64Sub(lhs_value, rhs_value); |
| 867 var_result.Bind(assembler->AllocateHeapNumberWithValue(value)); | 867 var_result.Bind(assembler->AllocateHeapNumberWithValue(value)); |
| 868 assembler->Goto(&end); | 868 assembler->Goto(&end); |
| 869 } | 869 } |
| 870 | 870 |
| 871 assembler->Bind(&if_lhsisnotnumber); | 871 assembler->Bind(&if_lhsisnotnumber); |
| 872 { | 872 { |
| 873 // No checks on rhs are done yet. We just know lhs is not a number or Smi. | 873 // No checks on rhs are done yet. We just know lhs is not a number or Smi. |
| 874 // Check if lhs is an oddball. | 874 // Check if lhs is an oddball. |
| 875 Node* lhs_instance_type = assembler->LoadInstanceType(lhs); | 875 Node* lhs_instance_type = assembler->LoadInstanceType(lhs); |
| 876 Node* lhs_is_oddball = assembler->Word32Equal( | 876 Node* lhs_is_oddball = assembler->Word32Equal( |
| 877 lhs_instance_type, assembler->Int32Constant(ODDBALL_TYPE)); | 877 lhs_instance_type, assembler->Int32Constant(ODDBALL_TYPE)); |
| 878 assembler->GotoUnless(lhs_is_oddball, &call_with_any_feedback); | 878 assembler->GotoUnless(lhs_is_oddball, &call_with_any_feedback); |
| 879 | 879 |
| 880 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); | 880 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); |
| 881 assembler->Branch(assembler->TaggedIsSmi(rhs), &if_rhsissmi, | 881 assembler->Branch(assembler->TaggedIsSmi(rhs), &if_rhsissmi, |
| 882 &if_rhsisnotsmi); | 882 &if_rhsisnotsmi); |
| 883 | 883 |
| 884 assembler->Bind(&if_rhsissmi); | 884 assembler->Bind(&if_rhsissmi); |
| 885 { | 885 { |
| 886 var_type_feedback.Bind( | 886 var_type_feedback.Bind( |
| 887 assembler->Int32Constant(BinaryOperationFeedback::kNumberOrOddball)); | 887 assembler->SmiConstant(BinaryOperationFeedback::kNumberOrOddball)); |
| 888 assembler->Goto(&call_subtract_stub); | 888 assembler->Goto(&call_subtract_stub); |
| 889 } | 889 } |
| 890 | 890 |
| 891 assembler->Bind(&if_rhsisnotsmi); | 891 assembler->Bind(&if_rhsisnotsmi); |
| 892 { | 892 { |
| 893 // Load the map of the {rhs}. | 893 // Load the map of the {rhs}. |
| 894 Node* rhs_map = assembler->LoadMap(rhs); | 894 Node* rhs_map = assembler->LoadMap(rhs); |
| 895 | 895 |
| 896 // Check if {rhs} is a HeapNumber. | 896 // Check if {rhs} is a HeapNumber. |
| 897 assembler->GotoUnless(assembler->IsHeapNumberMap(rhs_map), | 897 assembler->GotoUnless(assembler->IsHeapNumberMap(rhs_map), |
| 898 &check_rhsisoddball); | 898 &check_rhsisoddball); |
| 899 | 899 |
| 900 var_type_feedback.Bind( | 900 var_type_feedback.Bind( |
| 901 assembler->Int32Constant(BinaryOperationFeedback::kNumberOrOddball)); | 901 assembler->SmiConstant(BinaryOperationFeedback::kNumberOrOddball)); |
| 902 assembler->Goto(&call_subtract_stub); | 902 assembler->Goto(&call_subtract_stub); |
| 903 } | 903 } |
| 904 } | 904 } |
| 905 | 905 |
| 906 assembler->Bind(&check_rhsisoddball); | 906 assembler->Bind(&check_rhsisoddball); |
| 907 { | 907 { |
| 908 // Check if rhs is an oddball. At this point we know lhs is either a | 908 // Check if rhs is an oddball. At this point we know lhs is either a |
| 909 // Smi or number or oddball and rhs is not a number or Smi. | 909 // Smi or number or oddball and rhs is not a number or Smi. |
| 910 Node* rhs_instance_type = assembler->LoadInstanceType(rhs); | 910 Node* rhs_instance_type = assembler->LoadInstanceType(rhs); |
| 911 Node* rhs_is_oddball = assembler->Word32Equal( | 911 Node* rhs_is_oddball = assembler->Word32Equal( |
| 912 rhs_instance_type, assembler->Int32Constant(ODDBALL_TYPE)); | 912 rhs_instance_type, assembler->Int32Constant(ODDBALL_TYPE)); |
| 913 assembler->GotoUnless(rhs_is_oddball, &call_with_any_feedback); | 913 assembler->GotoUnless(rhs_is_oddball, &call_with_any_feedback); |
| 914 | 914 |
| 915 var_type_feedback.Bind( | 915 var_type_feedback.Bind( |
| 916 assembler->Int32Constant(BinaryOperationFeedback::kNumberOrOddball)); | 916 assembler->SmiConstant(BinaryOperationFeedback::kNumberOrOddball)); |
| 917 assembler->Goto(&call_subtract_stub); | 917 assembler->Goto(&call_subtract_stub); |
| 918 } | 918 } |
| 919 | 919 |
| 920 assembler->Bind(&call_with_any_feedback); | 920 assembler->Bind(&call_with_any_feedback); |
| 921 { | 921 { |
| 922 var_type_feedback.Bind( | 922 var_type_feedback.Bind( |
| 923 assembler->Int32Constant(BinaryOperationFeedback::kAny)); | 923 assembler->SmiConstant(BinaryOperationFeedback::kAny)); |
| 924 assembler->Goto(&call_subtract_stub); | 924 assembler->Goto(&call_subtract_stub); |
| 925 } | 925 } |
| 926 | 926 |
| 927 assembler->Bind(&call_subtract_stub); | 927 assembler->Bind(&call_subtract_stub); |
| 928 { | 928 { |
| 929 Callable callable = CodeFactory::Subtract(assembler->isolate()); | 929 Callable callable = CodeFactory::Subtract(assembler->isolate()); |
| 930 var_result.Bind(assembler->CallStub(callable, context, lhs, rhs)); | 930 var_result.Bind(assembler->CallStub(callable, context, lhs, rhs)); |
| 931 assembler->Goto(&end); | 931 assembler->Goto(&end); |
| 932 } | 932 } |
| 933 | 933 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 948 typedef CodeStubAssembler::Variable Variable; | 948 typedef CodeStubAssembler::Variable Variable; |
| 949 | 949 |
| 950 // Shared entry point for floating point multiplication. | 950 // Shared entry point for floating point multiplication. |
| 951 Label do_fmul(assembler), if_lhsisnotnumber(assembler, Label::kDeferred), | 951 Label do_fmul(assembler), if_lhsisnotnumber(assembler, Label::kDeferred), |
| 952 check_rhsisoddball(assembler, Label::kDeferred), | 952 check_rhsisoddball(assembler, Label::kDeferred), |
| 953 call_with_oddball_feedback(assembler), call_with_any_feedback(assembler), | 953 call_with_oddball_feedback(assembler), call_with_any_feedback(assembler), |
| 954 call_multiply_stub(assembler), end(assembler); | 954 call_multiply_stub(assembler), end(assembler); |
| 955 Variable var_lhs_float64(assembler, MachineRepresentation::kFloat64), | 955 Variable var_lhs_float64(assembler, MachineRepresentation::kFloat64), |
| 956 var_rhs_float64(assembler, MachineRepresentation::kFloat64), | 956 var_rhs_float64(assembler, MachineRepresentation::kFloat64), |
| 957 var_result(assembler, MachineRepresentation::kTagged), | 957 var_result(assembler, MachineRepresentation::kTagged), |
| 958 var_type_feedback(assembler, MachineRepresentation::kWord32); | 958 var_type_feedback(assembler, MachineRepresentation::kTaggedSigned); |
| 959 | 959 |
| 960 Label lhs_is_smi(assembler), lhs_is_not_smi(assembler); | 960 Label lhs_is_smi(assembler), lhs_is_not_smi(assembler); |
| 961 assembler->Branch(assembler->TaggedIsSmi(lhs), &lhs_is_smi, &lhs_is_not_smi); | 961 assembler->Branch(assembler->TaggedIsSmi(lhs), &lhs_is_smi, &lhs_is_not_smi); |
| 962 | 962 |
| 963 assembler->Bind(&lhs_is_smi); | 963 assembler->Bind(&lhs_is_smi); |
| 964 { | 964 { |
| 965 Label rhs_is_smi(assembler), rhs_is_not_smi(assembler); | 965 Label rhs_is_smi(assembler), rhs_is_not_smi(assembler); |
| 966 assembler->Branch(assembler->TaggedIsSmi(rhs), &rhs_is_smi, | 966 assembler->Branch(assembler->TaggedIsSmi(rhs), &rhs_is_smi, |
| 967 &rhs_is_not_smi); | 967 &rhs_is_not_smi); |
| 968 | 968 |
| 969 assembler->Bind(&rhs_is_smi); | 969 assembler->Bind(&rhs_is_smi); |
| 970 { | 970 { |
| 971 // Both {lhs} and {rhs} are Smis. The result is not necessarily a smi, | 971 // Both {lhs} and {rhs} are Smis. The result is not necessarily a smi, |
| 972 // in case of overflow. | 972 // in case of overflow. |
| 973 var_result.Bind(assembler->SmiMul(lhs, rhs)); | 973 var_result.Bind(assembler->SmiMul(lhs, rhs)); |
| 974 var_type_feedback.Bind(assembler->SelectInt32Constant( | 974 var_type_feedback.Bind(assembler->SelectSmiConstant( |
| 975 assembler->TaggedIsSmi(var_result.value()), | 975 assembler->TaggedIsSmi(var_result.value()), |
| 976 BinaryOperationFeedback::kSignedSmall, | 976 BinaryOperationFeedback::kSignedSmall, |
| 977 BinaryOperationFeedback::kNumber)); | 977 BinaryOperationFeedback::kNumber)); |
| 978 assembler->Goto(&end); | 978 assembler->Goto(&end); |
| 979 } | 979 } |
| 980 | 980 |
| 981 assembler->Bind(&rhs_is_not_smi); | 981 assembler->Bind(&rhs_is_not_smi); |
| 982 { | 982 { |
| 983 Node* rhs_map = assembler->LoadMap(rhs); | 983 Node* rhs_map = assembler->LoadMap(rhs); |
| 984 | 984 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1026 // multiply them. | 1026 // multiply them. |
| 1027 var_lhs_float64.Bind(assembler->LoadHeapNumberValue(lhs)); | 1027 var_lhs_float64.Bind(assembler->LoadHeapNumberValue(lhs)); |
| 1028 var_rhs_float64.Bind(assembler->LoadHeapNumberValue(rhs)); | 1028 var_rhs_float64.Bind(assembler->LoadHeapNumberValue(rhs)); |
| 1029 assembler->Goto(&do_fmul); | 1029 assembler->Goto(&do_fmul); |
| 1030 } | 1030 } |
| 1031 } | 1031 } |
| 1032 | 1032 |
| 1033 assembler->Bind(&do_fmul); | 1033 assembler->Bind(&do_fmul); |
| 1034 { | 1034 { |
| 1035 var_type_feedback.Bind( | 1035 var_type_feedback.Bind( |
| 1036 assembler->Int32Constant(BinaryOperationFeedback::kNumber)); | 1036 assembler->SmiConstant(BinaryOperationFeedback::kNumber)); |
| 1037 Node* value = | 1037 Node* value = |
| 1038 assembler->Float64Mul(var_lhs_float64.value(), var_rhs_float64.value()); | 1038 assembler->Float64Mul(var_lhs_float64.value(), var_rhs_float64.value()); |
| 1039 Node* result = assembler->AllocateHeapNumberWithValue(value); | 1039 Node* result = assembler->AllocateHeapNumberWithValue(value); |
| 1040 var_result.Bind(result); | 1040 var_result.Bind(result); |
| 1041 assembler->Goto(&end); | 1041 assembler->Goto(&end); |
| 1042 } | 1042 } |
| 1043 | 1043 |
| 1044 assembler->Bind(&if_lhsisnotnumber); | 1044 assembler->Bind(&if_lhsisnotnumber); |
| 1045 { | 1045 { |
| 1046 // No checks on rhs are done yet. We just know lhs is not a number or Smi. | 1046 // No checks on rhs are done yet. We just know lhs is not a number or Smi. |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1067 Node* rhs_instance_type = assembler->LoadInstanceType(rhs); | 1067 Node* rhs_instance_type = assembler->LoadInstanceType(rhs); |
| 1068 Node* rhs_is_oddball = assembler->Word32Equal( | 1068 Node* rhs_is_oddball = assembler->Word32Equal( |
| 1069 rhs_instance_type, assembler->Int32Constant(ODDBALL_TYPE)); | 1069 rhs_instance_type, assembler->Int32Constant(ODDBALL_TYPE)); |
| 1070 assembler->Branch(rhs_is_oddball, &call_with_oddball_feedback, | 1070 assembler->Branch(rhs_is_oddball, &call_with_oddball_feedback, |
| 1071 &call_with_any_feedback); | 1071 &call_with_any_feedback); |
| 1072 } | 1072 } |
| 1073 | 1073 |
| 1074 assembler->Bind(&call_with_oddball_feedback); | 1074 assembler->Bind(&call_with_oddball_feedback); |
| 1075 { | 1075 { |
| 1076 var_type_feedback.Bind( | 1076 var_type_feedback.Bind( |
| 1077 assembler->Int32Constant(BinaryOperationFeedback::kNumberOrOddball)); | 1077 assembler->SmiConstant(BinaryOperationFeedback::kNumberOrOddball)); |
| 1078 assembler->Goto(&call_multiply_stub); | 1078 assembler->Goto(&call_multiply_stub); |
| 1079 } | 1079 } |
| 1080 | 1080 |
| 1081 assembler->Bind(&call_with_any_feedback); | 1081 assembler->Bind(&call_with_any_feedback); |
| 1082 { | 1082 { |
| 1083 var_type_feedback.Bind( | 1083 var_type_feedback.Bind( |
| 1084 assembler->Int32Constant(BinaryOperationFeedback::kAny)); | 1084 assembler->SmiConstant(BinaryOperationFeedback::kAny)); |
| 1085 assembler->Goto(&call_multiply_stub); | 1085 assembler->Goto(&call_multiply_stub); |
| 1086 } | 1086 } |
| 1087 | 1087 |
| 1088 assembler->Bind(&call_multiply_stub); | 1088 assembler->Bind(&call_multiply_stub); |
| 1089 { | 1089 { |
| 1090 Callable callable = CodeFactory::Multiply(assembler->isolate()); | 1090 Callable callable = CodeFactory::Multiply(assembler->isolate()); |
| 1091 var_result.Bind(assembler->CallStub(callable, context, lhs, rhs)); | 1091 var_result.Bind(assembler->CallStub(callable, context, lhs, rhs)); |
| 1092 assembler->Goto(&end); | 1092 assembler->Goto(&end); |
| 1093 } | 1093 } |
| 1094 | 1094 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1109 typedef CodeStubAssembler::Variable Variable; | 1109 typedef CodeStubAssembler::Variable Variable; |
| 1110 | 1110 |
| 1111 // Shared entry point for floating point division. | 1111 // Shared entry point for floating point division. |
| 1112 Label do_fdiv(assembler), dividend_is_not_number(assembler, Label::kDeferred), | 1112 Label do_fdiv(assembler), dividend_is_not_number(assembler, Label::kDeferred), |
| 1113 check_divisor_for_oddball(assembler, Label::kDeferred), | 1113 check_divisor_for_oddball(assembler, Label::kDeferred), |
| 1114 call_with_oddball_feedback(assembler), call_with_any_feedback(assembler), | 1114 call_with_oddball_feedback(assembler), call_with_any_feedback(assembler), |
| 1115 call_divide_stub(assembler), end(assembler); | 1115 call_divide_stub(assembler), end(assembler); |
| 1116 Variable var_dividend_float64(assembler, MachineRepresentation::kFloat64), | 1116 Variable var_dividend_float64(assembler, MachineRepresentation::kFloat64), |
| 1117 var_divisor_float64(assembler, MachineRepresentation::kFloat64), | 1117 var_divisor_float64(assembler, MachineRepresentation::kFloat64), |
| 1118 var_result(assembler, MachineRepresentation::kTagged), | 1118 var_result(assembler, MachineRepresentation::kTagged), |
| 1119 var_type_feedback(assembler, MachineRepresentation::kWord32); | 1119 var_type_feedback(assembler, MachineRepresentation::kTaggedSigned); |
| 1120 | 1120 |
| 1121 Label dividend_is_smi(assembler), dividend_is_not_smi(assembler); | 1121 Label dividend_is_smi(assembler), dividend_is_not_smi(assembler); |
| 1122 assembler->Branch(assembler->TaggedIsSmi(dividend), ÷nd_is_smi, | 1122 assembler->Branch(assembler->TaggedIsSmi(dividend), ÷nd_is_smi, |
| 1123 ÷nd_is_not_smi); | 1123 ÷nd_is_not_smi); |
| 1124 | 1124 |
| 1125 assembler->Bind(÷nd_is_smi); | 1125 assembler->Bind(÷nd_is_smi); |
| 1126 { | 1126 { |
| 1127 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); | 1127 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); |
| 1128 assembler->Branch(assembler->TaggedIsSmi(divisor), &divisor_is_smi, | 1128 assembler->Branch(assembler->TaggedIsSmi(divisor), &divisor_is_smi, |
| 1129 &divisor_is_not_smi); | 1129 &divisor_is_not_smi); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1175 } | 1175 } |
| 1176 assembler->Bind(&divisor_is_not_minus_one); | 1176 assembler->Bind(&divisor_is_not_minus_one); |
| 1177 | 1177 |
| 1178 Node* untagged_result = | 1178 Node* untagged_result = |
| 1179 assembler->Int32Div(untagged_dividend, untagged_divisor); | 1179 assembler->Int32Div(untagged_dividend, untagged_divisor); |
| 1180 Node* truncated = assembler->Int32Mul(untagged_result, untagged_divisor); | 1180 Node* truncated = assembler->Int32Mul(untagged_result, untagged_divisor); |
| 1181 // Do floating point division if the remainder is not 0. | 1181 // Do floating point division if the remainder is not 0. |
| 1182 assembler->GotoIf(assembler->Word32NotEqual(untagged_dividend, truncated), | 1182 assembler->GotoIf(assembler->Word32NotEqual(untagged_dividend, truncated), |
| 1183 &bailout); | 1183 &bailout); |
| 1184 var_type_feedback.Bind( | 1184 var_type_feedback.Bind( |
| 1185 assembler->Int32Constant(BinaryOperationFeedback::kSignedSmall)); | 1185 assembler->SmiConstant(BinaryOperationFeedback::kSignedSmall)); |
| 1186 var_result.Bind(assembler->SmiFromWord32(untagged_result)); | 1186 var_result.Bind(assembler->SmiFromWord32(untagged_result)); |
| 1187 assembler->Goto(&end); | 1187 assembler->Goto(&end); |
| 1188 | 1188 |
| 1189 // Bailout: convert {dividend} and {divisor} to double and do double | 1189 // Bailout: convert {dividend} and {divisor} to double and do double |
| 1190 // division. | 1190 // division. |
| 1191 assembler->Bind(&bailout); | 1191 assembler->Bind(&bailout); |
| 1192 { | 1192 { |
| 1193 var_dividend_float64.Bind(assembler->SmiToFloat64(dividend)); | 1193 var_dividend_float64.Bind(assembler->SmiToFloat64(dividend)); |
| 1194 var_divisor_float64.Bind(assembler->SmiToFloat64(divisor)); | 1194 var_divisor_float64.Bind(assembler->SmiToFloat64(divisor)); |
| 1195 assembler->Goto(&do_fdiv); | 1195 assembler->Goto(&do_fdiv); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1246 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend)); | 1246 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend)); |
| 1247 var_divisor_float64.Bind(assembler->LoadHeapNumberValue(divisor)); | 1247 var_divisor_float64.Bind(assembler->LoadHeapNumberValue(divisor)); |
| 1248 assembler->Goto(&do_fdiv); | 1248 assembler->Goto(&do_fdiv); |
| 1249 } | 1249 } |
| 1250 } | 1250 } |
| 1251 } | 1251 } |
| 1252 | 1252 |
| 1253 assembler->Bind(&do_fdiv); | 1253 assembler->Bind(&do_fdiv); |
| 1254 { | 1254 { |
| 1255 var_type_feedback.Bind( | 1255 var_type_feedback.Bind( |
| 1256 assembler->Int32Constant(BinaryOperationFeedback::kNumber)); | 1256 assembler->SmiConstant(BinaryOperationFeedback::kNumber)); |
| 1257 Node* value = assembler->Float64Div(var_dividend_float64.value(), | 1257 Node* value = assembler->Float64Div(var_dividend_float64.value(), |
| 1258 var_divisor_float64.value()); | 1258 var_divisor_float64.value()); |
| 1259 var_result.Bind(assembler->AllocateHeapNumberWithValue(value)); | 1259 var_result.Bind(assembler->AllocateHeapNumberWithValue(value)); |
| 1260 assembler->Goto(&end); | 1260 assembler->Goto(&end); |
| 1261 } | 1261 } |
| 1262 | 1262 |
| 1263 assembler->Bind(÷nd_is_not_number); | 1263 assembler->Bind(÷nd_is_not_number); |
| 1264 { | 1264 { |
| 1265 // We just know dividend is not a number or Smi. No checks on divisor yet. | 1265 // We just know dividend is not a number or Smi. No checks on divisor yet. |
| 1266 // Check if dividend is an oddball. | 1266 // Check if dividend is an oddball. |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1287 Node* divisor_instance_type = assembler->LoadInstanceType(divisor); | 1287 Node* divisor_instance_type = assembler->LoadInstanceType(divisor); |
| 1288 Node* divisor_is_oddball = assembler->Word32Equal( | 1288 Node* divisor_is_oddball = assembler->Word32Equal( |
| 1289 divisor_instance_type, assembler->Int32Constant(ODDBALL_TYPE)); | 1289 divisor_instance_type, assembler->Int32Constant(ODDBALL_TYPE)); |
| 1290 assembler->Branch(divisor_is_oddball, &call_with_oddball_feedback, | 1290 assembler->Branch(divisor_is_oddball, &call_with_oddball_feedback, |
| 1291 &call_with_any_feedback); | 1291 &call_with_any_feedback); |
| 1292 } | 1292 } |
| 1293 | 1293 |
| 1294 assembler->Bind(&call_with_oddball_feedback); | 1294 assembler->Bind(&call_with_oddball_feedback); |
| 1295 { | 1295 { |
| 1296 var_type_feedback.Bind( | 1296 var_type_feedback.Bind( |
| 1297 assembler->Int32Constant(BinaryOperationFeedback::kNumberOrOddball)); | 1297 assembler->SmiConstant(BinaryOperationFeedback::kNumberOrOddball)); |
| 1298 assembler->Goto(&call_divide_stub); | 1298 assembler->Goto(&call_divide_stub); |
| 1299 } | 1299 } |
| 1300 | 1300 |
| 1301 assembler->Bind(&call_with_any_feedback); | 1301 assembler->Bind(&call_with_any_feedback); |
| 1302 { | 1302 { |
| 1303 var_type_feedback.Bind( | 1303 var_type_feedback.Bind( |
| 1304 assembler->Int32Constant(BinaryOperationFeedback::kAny)); | 1304 assembler->SmiConstant(BinaryOperationFeedback::kAny)); |
| 1305 assembler->Goto(&call_divide_stub); | 1305 assembler->Goto(&call_divide_stub); |
| 1306 } | 1306 } |
| 1307 | 1307 |
| 1308 assembler->Bind(&call_divide_stub); | 1308 assembler->Bind(&call_divide_stub); |
| 1309 { | 1309 { |
| 1310 Callable callable = CodeFactory::Divide(assembler->isolate()); | 1310 Callable callable = CodeFactory::Divide(assembler->isolate()); |
| 1311 var_result.Bind(assembler->CallStub(callable, context, dividend, divisor)); | 1311 var_result.Bind(assembler->CallStub(callable, context, dividend, divisor)); |
| 1312 assembler->Goto(&end); | 1312 assembler->Goto(&end); |
| 1313 } | 1313 } |
| 1314 | 1314 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1328 typedef CodeStubAssembler::Variable Variable; | 1328 typedef CodeStubAssembler::Variable Variable; |
| 1329 | 1329 |
| 1330 // Shared entry point for floating point division. | 1330 // Shared entry point for floating point division. |
| 1331 Label do_fmod(assembler), dividend_is_not_number(assembler, Label::kDeferred), | 1331 Label do_fmod(assembler), dividend_is_not_number(assembler, Label::kDeferred), |
| 1332 check_divisor_for_oddball(assembler, Label::kDeferred), | 1332 check_divisor_for_oddball(assembler, Label::kDeferred), |
| 1333 call_with_oddball_feedback(assembler), call_with_any_feedback(assembler), | 1333 call_with_oddball_feedback(assembler), call_with_any_feedback(assembler), |
| 1334 call_modulus_stub(assembler), end(assembler); | 1334 call_modulus_stub(assembler), end(assembler); |
| 1335 Variable var_dividend_float64(assembler, MachineRepresentation::kFloat64), | 1335 Variable var_dividend_float64(assembler, MachineRepresentation::kFloat64), |
| 1336 var_divisor_float64(assembler, MachineRepresentation::kFloat64), | 1336 var_divisor_float64(assembler, MachineRepresentation::kFloat64), |
| 1337 var_result(assembler, MachineRepresentation::kTagged), | 1337 var_result(assembler, MachineRepresentation::kTagged), |
| 1338 var_type_feedback(assembler, MachineRepresentation::kWord32); | 1338 var_type_feedback(assembler, MachineRepresentation::kTaggedSigned); |
| 1339 | 1339 |
| 1340 Label dividend_is_smi(assembler), dividend_is_not_smi(assembler); | 1340 Label dividend_is_smi(assembler), dividend_is_not_smi(assembler); |
| 1341 assembler->Branch(assembler->TaggedIsSmi(dividend), ÷nd_is_smi, | 1341 assembler->Branch(assembler->TaggedIsSmi(dividend), ÷nd_is_smi, |
| 1342 ÷nd_is_not_smi); | 1342 ÷nd_is_not_smi); |
| 1343 | 1343 |
| 1344 assembler->Bind(÷nd_is_smi); | 1344 assembler->Bind(÷nd_is_smi); |
| 1345 { | 1345 { |
| 1346 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); | 1346 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); |
| 1347 assembler->Branch(assembler->TaggedIsSmi(divisor), &divisor_is_smi, | 1347 assembler->Branch(assembler->TaggedIsSmi(divisor), &divisor_is_smi, |
| 1348 &divisor_is_not_smi); | 1348 &divisor_is_not_smi); |
| 1349 | 1349 |
| 1350 assembler->Bind(&divisor_is_smi); | 1350 assembler->Bind(&divisor_is_smi); |
| 1351 { | 1351 { |
| 1352 var_result.Bind(assembler->SmiMod(dividend, divisor)); | 1352 var_result.Bind(assembler->SmiMod(dividend, divisor)); |
| 1353 var_type_feedback.Bind(assembler->SelectInt32Constant( | 1353 var_type_feedback.Bind(assembler->SelectSmiConstant( |
| 1354 assembler->TaggedIsSmi(var_result.value()), | 1354 assembler->TaggedIsSmi(var_result.value()), |
| 1355 BinaryOperationFeedback::kSignedSmall, | 1355 BinaryOperationFeedback::kSignedSmall, |
| 1356 BinaryOperationFeedback::kNumber)); | 1356 BinaryOperationFeedback::kNumber)); |
| 1357 assembler->Goto(&end); | 1357 assembler->Goto(&end); |
| 1358 } | 1358 } |
| 1359 | 1359 |
| 1360 assembler->Bind(&divisor_is_not_smi); | 1360 assembler->Bind(&divisor_is_not_smi); |
| 1361 { | 1361 { |
| 1362 Node* divisor_map = assembler->LoadMap(divisor); | 1362 Node* divisor_map = assembler->LoadMap(divisor); |
| 1363 | 1363 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1407 // and divide them. | 1407 // and divide them. |
| 1408 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend)); | 1408 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend)); |
| 1409 var_divisor_float64.Bind(assembler->LoadHeapNumberValue(divisor)); | 1409 var_divisor_float64.Bind(assembler->LoadHeapNumberValue(divisor)); |
| 1410 assembler->Goto(&do_fmod); | 1410 assembler->Goto(&do_fmod); |
| 1411 } | 1411 } |
| 1412 } | 1412 } |
| 1413 | 1413 |
| 1414 assembler->Bind(&do_fmod); | 1414 assembler->Bind(&do_fmod); |
| 1415 { | 1415 { |
| 1416 var_type_feedback.Bind( | 1416 var_type_feedback.Bind( |
| 1417 assembler->Int32Constant(BinaryOperationFeedback::kNumber)); | 1417 assembler->SmiConstant(BinaryOperationFeedback::kNumber)); |
| 1418 Node* value = assembler->Float64Mod(var_dividend_float64.value(), | 1418 Node* value = assembler->Float64Mod(var_dividend_float64.value(), |
| 1419 var_divisor_float64.value()); | 1419 var_divisor_float64.value()); |
| 1420 var_result.Bind(assembler->AllocateHeapNumberWithValue(value)); | 1420 var_result.Bind(assembler->AllocateHeapNumberWithValue(value)); |
| 1421 assembler->Goto(&end); | 1421 assembler->Goto(&end); |
| 1422 } | 1422 } |
| 1423 | 1423 |
| 1424 assembler->Bind(÷nd_is_not_number); | 1424 assembler->Bind(÷nd_is_not_number); |
| 1425 { | 1425 { |
| 1426 // No checks on divisor yet. We just know dividend is not a number or Smi. | 1426 // No checks on divisor yet. We just know dividend is not a number or Smi. |
| 1427 // Check if dividend is an oddball. | 1427 // Check if dividend is an oddball. |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1448 Node* divisor_instance_type = assembler->LoadInstanceType(divisor); | 1448 Node* divisor_instance_type = assembler->LoadInstanceType(divisor); |
| 1449 Node* divisor_is_oddball = assembler->Word32Equal( | 1449 Node* divisor_is_oddball = assembler->Word32Equal( |
| 1450 divisor_instance_type, assembler->Int32Constant(ODDBALL_TYPE)); | 1450 divisor_instance_type, assembler->Int32Constant(ODDBALL_TYPE)); |
| 1451 assembler->Branch(divisor_is_oddball, &call_with_oddball_feedback, | 1451 assembler->Branch(divisor_is_oddball, &call_with_oddball_feedback, |
| 1452 &call_with_any_feedback); | 1452 &call_with_any_feedback); |
| 1453 } | 1453 } |
| 1454 | 1454 |
| 1455 assembler->Bind(&call_with_oddball_feedback); | 1455 assembler->Bind(&call_with_oddball_feedback); |
| 1456 { | 1456 { |
| 1457 var_type_feedback.Bind( | 1457 var_type_feedback.Bind( |
| 1458 assembler->Int32Constant(BinaryOperationFeedback::kNumberOrOddball)); | 1458 assembler->SmiConstant(BinaryOperationFeedback::kNumberOrOddball)); |
| 1459 assembler->Goto(&call_modulus_stub); | 1459 assembler->Goto(&call_modulus_stub); |
| 1460 } | 1460 } |
| 1461 | 1461 |
| 1462 assembler->Bind(&call_with_any_feedback); | 1462 assembler->Bind(&call_with_any_feedback); |
| 1463 { | 1463 { |
| 1464 var_type_feedback.Bind( | 1464 var_type_feedback.Bind( |
| 1465 assembler->Int32Constant(BinaryOperationFeedback::kAny)); | 1465 assembler->SmiConstant(BinaryOperationFeedback::kAny)); |
| 1466 assembler->Goto(&call_modulus_stub); | 1466 assembler->Goto(&call_modulus_stub); |
| 1467 } | 1467 } |
| 1468 | 1468 |
| 1469 assembler->Bind(&call_modulus_stub); | 1469 assembler->Bind(&call_modulus_stub); |
| 1470 { | 1470 { |
| 1471 Callable callable = CodeFactory::Modulus(assembler->isolate()); | 1471 Callable callable = CodeFactory::Modulus(assembler->isolate()); |
| 1472 var_result.Bind(assembler->CallStub(callable, context, dividend, divisor)); | 1472 var_result.Bind(assembler->CallStub(callable, context, dividend, divisor)); |
| 1473 assembler->Goto(&end); | 1473 assembler->Goto(&end); |
| 1474 } | 1474 } |
| 1475 | 1475 |
| (...skipping 733 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2209 } | 2209 } |
| 2210 | 2210 |
| 2211 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) | 2211 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) |
| 2212 : PlatformCodeStub(isolate) {} | 2212 : PlatformCodeStub(isolate) {} |
| 2213 | 2213 |
| 2214 InternalArrayConstructorStub::InternalArrayConstructorStub(Isolate* isolate) | 2214 InternalArrayConstructorStub::InternalArrayConstructorStub(Isolate* isolate) |
| 2215 : PlatformCodeStub(isolate) {} | 2215 : PlatformCodeStub(isolate) {} |
| 2216 | 2216 |
| 2217 } // namespace internal | 2217 } // namespace internal |
| 2218 } // namespace v8 | 2218 } // namespace v8 |
| OLD | NEW |