| 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/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
| 10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
| (...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 491 | 491 |
| 492 void StringLengthStub::GenerateAssembly(CodeStubAssembler* assembler) const { | 492 void StringLengthStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
| 493 compiler::Node* value = assembler->Parameter(0); | 493 compiler::Node* value = assembler->Parameter(0); |
| 494 compiler::Node* string = | 494 compiler::Node* string = |
| 495 assembler->LoadObjectField(value, JSValue::kValueOffset); | 495 assembler->LoadObjectField(value, JSValue::kValueOffset); |
| 496 compiler::Node* result = | 496 compiler::Node* result = |
| 497 assembler->LoadObjectField(string, String::kLengthOffset); | 497 assembler->LoadObjectField(string, String::kLengthOffset); |
| 498 assembler->Return(result); | 498 assembler->Return(result); |
| 499 } | 499 } |
| 500 | 500 |
| 501 compiler::Node* AddStub::Generate(CodeStubAssembler* assembler, | 501 void AddStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
| 502 compiler::Node* left, compiler::Node* right, | |
| 503 compiler::Node* context) { | |
| 504 typedef CodeStubAssembler::Label Label; | 502 typedef CodeStubAssembler::Label Label; |
| 505 typedef compiler::Node Node; | 503 typedef compiler::Node Node; |
| 506 typedef CodeStubAssembler::Variable Variable; | 504 typedef CodeStubAssembler::Variable Variable; |
| 507 | 505 |
| 506 Node* context = assembler->Parameter(2); |
| 507 |
| 508 // Shared entry for floating point addition. | 508 // Shared entry for floating point addition. |
| 509 Label do_fadd(assembler), end(assembler); | 509 Label do_fadd(assembler); |
| 510 Variable var_fadd_lhs(assembler, MachineRepresentation::kFloat64), | 510 Variable var_fadd_lhs(assembler, MachineRepresentation::kFloat64), |
| 511 var_fadd_rhs(assembler, MachineRepresentation::kFloat64); | 511 var_fadd_rhs(assembler, MachineRepresentation::kFloat64); |
| 512 | 512 |
| 513 // We might need to loop several times due to ToPrimitive, ToString and/or | 513 // We might need to loop several times due to ToPrimitive, ToString and/or |
| 514 // ToNumber conversions. | 514 // ToNumber conversions. |
| 515 Variable var_lhs(assembler, MachineRepresentation::kTagged), | 515 Variable var_lhs(assembler, MachineRepresentation::kTagged), |
| 516 var_rhs(assembler, MachineRepresentation::kTagged), | 516 var_rhs(assembler, MachineRepresentation::kTagged); |
| 517 var_result(assembler, MachineRepresentation::kTagged); | |
| 518 Variable* loop_vars[2] = {&var_lhs, &var_rhs}; | 517 Variable* loop_vars[2] = {&var_lhs, &var_rhs}; |
| 519 Label loop(assembler, 2, loop_vars); | 518 Label loop(assembler, 2, loop_vars); |
| 520 var_lhs.Bind(left); | 519 var_lhs.Bind(assembler->Parameter(0)); |
| 521 var_rhs.Bind(right); | 520 var_rhs.Bind(assembler->Parameter(1)); |
| 522 assembler->Goto(&loop); | 521 assembler->Goto(&loop); |
| 523 assembler->Bind(&loop); | 522 assembler->Bind(&loop); |
| 524 { | 523 { |
| 525 // Load the current {lhs} and {rhs} values. | 524 // Load the current {lhs} and {rhs} values. |
| 526 Node* lhs = var_lhs.value(); | 525 Node* lhs = var_lhs.value(); |
| 527 Node* rhs = var_rhs.value(); | 526 Node* rhs = var_rhs.value(); |
| 528 | 527 |
| 529 // Check if the {lhs} is a Smi or a HeapObject. | 528 // Check if the {lhs} is a Smi or a HeapObject. |
| 530 Label if_lhsissmi(assembler), if_lhsisnotsmi(assembler); | 529 Label if_lhsissmi(assembler), if_lhsisnotsmi(assembler); |
| 531 assembler->Branch(assembler->WordIsSmi(lhs), &if_lhsissmi, &if_lhsisnotsmi); | 530 assembler->Branch(assembler->WordIsSmi(lhs), &if_lhsissmi, &if_lhsisnotsmi); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 548 assembler->Branch(overflow, &if_overflow, &if_notoverflow); | 547 assembler->Branch(overflow, &if_overflow, &if_notoverflow); |
| 549 | 548 |
| 550 assembler->Bind(&if_overflow); | 549 assembler->Bind(&if_overflow); |
| 551 { | 550 { |
| 552 var_fadd_lhs.Bind(assembler->SmiToFloat64(lhs)); | 551 var_fadd_lhs.Bind(assembler->SmiToFloat64(lhs)); |
| 553 var_fadd_rhs.Bind(assembler->SmiToFloat64(rhs)); | 552 var_fadd_rhs.Bind(assembler->SmiToFloat64(rhs)); |
| 554 assembler->Goto(&do_fadd); | 553 assembler->Goto(&do_fadd); |
| 555 } | 554 } |
| 556 | 555 |
| 557 assembler->Bind(&if_notoverflow); | 556 assembler->Bind(&if_notoverflow); |
| 558 var_result.Bind(assembler->Projection(0, pair)); | 557 assembler->Return(assembler->Projection(0, pair)); |
| 559 assembler->Goto(&end); | |
| 560 } | 558 } |
| 561 | 559 |
| 562 assembler->Bind(&if_rhsisnotsmi); | 560 assembler->Bind(&if_rhsisnotsmi); |
| 563 { | 561 { |
| 564 // Load the map of {rhs}. | 562 // Load the map of {rhs}. |
| 565 Node* rhs_map = assembler->LoadObjectField(rhs, HeapObject::kMapOffset); | 563 Node* rhs_map = assembler->LoadObjectField(rhs, HeapObject::kMapOffset); |
| 566 | 564 |
| 567 // Check if the {rhs} is a HeapNumber. | 565 // Check if the {rhs} is a HeapNumber. |
| 568 Label if_rhsisnumber(assembler), | 566 Label if_rhsisnumber(assembler), |
| 569 if_rhsisnotnumber(assembler, Label::kDeferred); | 567 if_rhsisnotnumber(assembler, Label::kDeferred); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 590 rhs_instance_type, | 588 rhs_instance_type, |
| 591 assembler->Int32Constant(FIRST_NONSTRING_TYPE)), | 589 assembler->Int32Constant(FIRST_NONSTRING_TYPE)), |
| 592 &if_rhsisstring, &if_rhsisnotstring); | 590 &if_rhsisstring, &if_rhsisnotstring); |
| 593 | 591 |
| 594 assembler->Bind(&if_rhsisstring); | 592 assembler->Bind(&if_rhsisstring); |
| 595 { | 593 { |
| 596 // Convert {lhs}, which is a Smi, to a String and concatenate the | 594 // Convert {lhs}, which is a Smi, to a String and concatenate the |
| 597 // resulting string with the String {rhs}. | 595 // resulting string with the String {rhs}. |
| 598 Callable callable = CodeFactory::StringAdd( | 596 Callable callable = CodeFactory::StringAdd( |
| 599 assembler->isolate(), STRING_ADD_CONVERT_LEFT, NOT_TENURED); | 597 assembler->isolate(), STRING_ADD_CONVERT_LEFT, NOT_TENURED); |
| 600 var_result.Bind(assembler->CallStub(callable, context, lhs, rhs)); | 598 assembler->TailCallStub(callable, context, lhs, rhs); |
| 601 assembler->Goto(&end); | |
| 602 } | 599 } |
| 603 | 600 |
| 604 assembler->Bind(&if_rhsisnotstring); | 601 assembler->Bind(&if_rhsisnotstring); |
| 605 { | 602 { |
| 606 // Check if {rhs} is a JSReceiver. | 603 // Check if {rhs} is a JSReceiver. |
| 607 Label if_rhsisreceiver(assembler, Label::kDeferred), | 604 Label if_rhsisreceiver(assembler, Label::kDeferred), |
| 608 if_rhsisnotreceiver(assembler, Label::kDeferred); | 605 if_rhsisnotreceiver(assembler, Label::kDeferred); |
| 609 assembler->Branch( | 606 assembler->Branch( |
| 610 assembler->Int32LessThanOrEqual( | 607 assembler->Int32LessThanOrEqual( |
| 611 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), | 608 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 645 lhs_instance_type, | 642 lhs_instance_type, |
| 646 assembler->Int32Constant(FIRST_NONSTRING_TYPE)), | 643 assembler->Int32Constant(FIRST_NONSTRING_TYPE)), |
| 647 &if_lhsisstring, &if_lhsisnotstring); | 644 &if_lhsisstring, &if_lhsisnotstring); |
| 648 | 645 |
| 649 assembler->Bind(&if_lhsisstring); | 646 assembler->Bind(&if_lhsisstring); |
| 650 { | 647 { |
| 651 // Convert {rhs} to a String (using the sequence of ToPrimitive with | 648 // Convert {rhs} to a String (using the sequence of ToPrimitive with |
| 652 // no hint followed by ToString) and concatenate the strings. | 649 // no hint followed by ToString) and concatenate the strings. |
| 653 Callable callable = CodeFactory::StringAdd( | 650 Callable callable = CodeFactory::StringAdd( |
| 654 assembler->isolate(), STRING_ADD_CONVERT_RIGHT, NOT_TENURED); | 651 assembler->isolate(), STRING_ADD_CONVERT_RIGHT, NOT_TENURED); |
| 655 var_result.Bind(assembler->CallStub(callable, context, lhs, rhs)); | 652 assembler->TailCallStub(callable, context, lhs, rhs); |
| 656 assembler->Goto(&end); | |
| 657 } | 653 } |
| 658 | 654 |
| 659 assembler->Bind(&if_lhsisnotstring); | 655 assembler->Bind(&if_lhsisnotstring); |
| 660 { | 656 { |
| 661 // Check if {rhs} is a Smi. | 657 // Check if {rhs} is a Smi. |
| 662 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); | 658 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); |
| 663 assembler->Branch(assembler->WordIsSmi(rhs), &if_rhsissmi, | 659 assembler->Branch(assembler->WordIsSmi(rhs), &if_rhsissmi, |
| 664 &if_rhsisnotsmi); | 660 &if_rhsisnotsmi); |
| 665 | 661 |
| 666 assembler->Bind(&if_rhsissmi); | 662 assembler->Bind(&if_rhsissmi); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 724 rhs_instance_type, | 720 rhs_instance_type, |
| 725 assembler->Int32Constant(FIRST_NONSTRING_TYPE)), | 721 assembler->Int32Constant(FIRST_NONSTRING_TYPE)), |
| 726 &if_rhsisstring, &if_rhsisnotstring); | 722 &if_rhsisstring, &if_rhsisnotstring); |
| 727 | 723 |
| 728 assembler->Bind(&if_rhsisstring); | 724 assembler->Bind(&if_rhsisstring); |
| 729 { | 725 { |
| 730 // Convert {lhs} to a String (using the sequence of ToPrimitive with | 726 // Convert {lhs} to a String (using the sequence of ToPrimitive with |
| 731 // no hint followed by ToString) and concatenate the strings. | 727 // no hint followed by ToString) and concatenate the strings. |
| 732 Callable callable = CodeFactory::StringAdd( | 728 Callable callable = CodeFactory::StringAdd( |
| 733 assembler->isolate(), STRING_ADD_CONVERT_LEFT, NOT_TENURED); | 729 assembler->isolate(), STRING_ADD_CONVERT_LEFT, NOT_TENURED); |
| 734 var_result.Bind(assembler->CallStub(callable, context, lhs, rhs)); | 730 assembler->TailCallStub(callable, context, lhs, rhs); |
| 735 assembler->Goto(&end); | |
| 736 } | 731 } |
| 737 | 732 |
| 738 assembler->Bind(&if_rhsisnotstring); | 733 assembler->Bind(&if_rhsisnotstring); |
| 739 { | 734 { |
| 740 // Check if {lhs} is a HeapNumber. | 735 // Check if {lhs} is a HeapNumber. |
| 741 Label if_lhsisnumber(assembler), if_lhsisnotnumber(assembler); | 736 Label if_lhsisnumber(assembler), if_lhsisnotnumber(assembler); |
| 742 assembler->Branch(assembler->Word32Equal( | 737 assembler->Branch(assembler->Word32Equal( |
| 743 lhs_instance_type, | 738 lhs_instance_type, |
| 744 assembler->Int32Constant(HEAP_NUMBER_TYPE)), | 739 assembler->Int32Constant(HEAP_NUMBER_TYPE)), |
| 745 &if_lhsisnumber, &if_lhsisnotnumber); | 740 &if_lhsisnumber, &if_lhsisnotnumber); |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 847 } | 842 } |
| 848 } | 843 } |
| 849 } | 844 } |
| 850 } | 845 } |
| 851 | 846 |
| 852 assembler->Bind(&do_fadd); | 847 assembler->Bind(&do_fadd); |
| 853 { | 848 { |
| 854 Node* lhs_value = var_fadd_lhs.value(); | 849 Node* lhs_value = var_fadd_lhs.value(); |
| 855 Node* rhs_value = var_fadd_rhs.value(); | 850 Node* rhs_value = var_fadd_rhs.value(); |
| 856 Node* value = assembler->Float64Add(lhs_value, rhs_value); | 851 Node* value = assembler->Float64Add(lhs_value, rhs_value); |
| 857 var_result.Bind(assembler->ChangeFloat64ToTagged(value)); | 852 Node* result = assembler->ChangeFloat64ToTagged(value); |
| 858 assembler->Goto(&end); | 853 assembler->Return(result); |
| 859 } | 854 } |
| 860 assembler->Bind(&end); | |
| 861 return var_result.value(); | |
| 862 } | 855 } |
| 863 | 856 |
| 864 compiler::Node* SubtractStub::Generate(CodeStubAssembler* assembler, | 857 void SubtractStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
| 865 compiler::Node* left, | |
| 866 compiler::Node* right, | |
| 867 compiler::Node* context) { | |
| 868 typedef CodeStubAssembler::Label Label; | 858 typedef CodeStubAssembler::Label Label; |
| 869 typedef compiler::Node Node; | 859 typedef compiler::Node Node; |
| 870 typedef CodeStubAssembler::Variable Variable; | 860 typedef CodeStubAssembler::Variable Variable; |
| 871 | 861 |
| 862 Node* context = assembler->Parameter(2); |
| 863 |
| 872 // Shared entry for floating point subtraction. | 864 // Shared entry for floating point subtraction. |
| 873 Label do_fsub(assembler), end(assembler); | 865 Label do_fsub(assembler); |
| 874 Variable var_fsub_lhs(assembler, MachineRepresentation::kFloat64), | 866 Variable var_fsub_lhs(assembler, MachineRepresentation::kFloat64), |
| 875 var_fsub_rhs(assembler, MachineRepresentation::kFloat64); | 867 var_fsub_rhs(assembler, MachineRepresentation::kFloat64); |
| 876 | 868 |
| 877 // We might need to loop several times due to ToPrimitive and/or ToNumber | 869 // We might need to loop several times due to ToPrimitive and/or ToNumber |
| 878 // conversions. | 870 // conversions. |
| 879 Variable var_lhs(assembler, MachineRepresentation::kTagged), | 871 Variable var_lhs(assembler, MachineRepresentation::kTagged), |
| 880 var_rhs(assembler, MachineRepresentation::kTagged), | 872 var_rhs(assembler, MachineRepresentation::kTagged); |
| 881 var_result(assembler, MachineRepresentation::kTagged); | |
| 882 Variable* loop_vars[2] = {&var_lhs, &var_rhs}; | 873 Variable* loop_vars[2] = {&var_lhs, &var_rhs}; |
| 883 Label loop(assembler, 2, loop_vars); | 874 Label loop(assembler, 2, loop_vars); |
| 884 var_lhs.Bind(left); | 875 var_lhs.Bind(assembler->Parameter(0)); |
| 885 var_rhs.Bind(right); | 876 var_rhs.Bind(assembler->Parameter(1)); |
| 886 assembler->Goto(&loop); | 877 assembler->Goto(&loop); |
| 887 assembler->Bind(&loop); | 878 assembler->Bind(&loop); |
| 888 { | 879 { |
| 889 // Load the current {lhs} and {rhs} values. | 880 // Load the current {lhs} and {rhs} values. |
| 890 Node* lhs = var_lhs.value(); | 881 Node* lhs = var_lhs.value(); |
| 891 Node* rhs = var_rhs.value(); | 882 Node* rhs = var_rhs.value(); |
| 892 | 883 |
| 893 // Check if the {lhs} is a Smi or a HeapObject. | 884 // Check if the {lhs} is a Smi or a HeapObject. |
| 894 Label if_lhsissmi(assembler), if_lhsisnotsmi(assembler); | 885 Label if_lhsissmi(assembler), if_lhsisnotsmi(assembler); |
| 895 assembler->Branch(assembler->WordIsSmi(lhs), &if_lhsissmi, &if_lhsisnotsmi); | 886 assembler->Branch(assembler->WordIsSmi(lhs), &if_lhsissmi, &if_lhsisnotsmi); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 913 | 904 |
| 914 assembler->Bind(&if_overflow); | 905 assembler->Bind(&if_overflow); |
| 915 { | 906 { |
| 916 // The result doesn't fit into Smi range. | 907 // The result doesn't fit into Smi range. |
| 917 var_fsub_lhs.Bind(assembler->SmiToFloat64(lhs)); | 908 var_fsub_lhs.Bind(assembler->SmiToFloat64(lhs)); |
| 918 var_fsub_rhs.Bind(assembler->SmiToFloat64(rhs)); | 909 var_fsub_rhs.Bind(assembler->SmiToFloat64(rhs)); |
| 919 assembler->Goto(&do_fsub); | 910 assembler->Goto(&do_fsub); |
| 920 } | 911 } |
| 921 | 912 |
| 922 assembler->Bind(&if_notoverflow); | 913 assembler->Bind(&if_notoverflow); |
| 923 var_result.Bind(assembler->Projection(0, pair)); | 914 assembler->Return(assembler->Projection(0, pair)); |
| 924 assembler->Goto(&end); | |
| 925 } | 915 } |
| 926 | 916 |
| 927 assembler->Bind(&if_rhsisnotsmi); | 917 assembler->Bind(&if_rhsisnotsmi); |
| 928 { | 918 { |
| 929 // Load the map of the {rhs}. | 919 // Load the map of the {rhs}. |
| 930 Node* rhs_map = assembler->LoadMap(rhs); | 920 Node* rhs_map = assembler->LoadMap(rhs); |
| 931 | 921 |
| 932 // Check if {rhs} is a HeapNumber. | 922 // Check if {rhs} is a HeapNumber. |
| 933 Label if_rhsisnumber(assembler), | 923 Label if_rhsisnumber(assembler), |
| 934 if_rhsisnotnumber(assembler, Label::kDeferred); | 924 if_rhsisnotnumber(assembler, Label::kDeferred); |
| 935 Node* number_map = assembler->HeapNumberMapConstant(); | 925 Node* number_map = assembler->HeapNumberMapConstant(); |
| 936 assembler->Branch(assembler->WordEqual(rhs_map, number_map), | 926 assembler->Branch(assembler->WordEqual(rhs_map, number_map), |
| 937 &if_rhsisnumber, &if_rhsisnotnumber); | 927 &if_rhsisnumber, &if_rhsisnotnumber); |
| 938 | 928 |
| 939 assembler->Bind(&if_rhsisnumber); | 929 assembler->Bind(&if_rhsisnumber); |
| 940 { | 930 { |
| 941 // Perform a floating point subtraction. | 931 // Perform a floating point subtraction. |
| 942 var_fsub_lhs.Bind(assembler->SmiToFloat64(lhs)); | 932 var_fsub_lhs.Bind(assembler->SmiToFloat64(lhs)); |
| 943 var_fsub_rhs.Bind(assembler->LoadHeapNumberValue(rhs)); | 933 var_fsub_rhs.Bind(assembler->LoadHeapNumberValue(rhs)); |
| 944 assembler->Goto(&do_fsub); | 934 assembler->Goto(&do_fsub); |
| 945 } | 935 } |
| 946 | 936 |
| 947 assembler->Bind(&if_rhsisnotnumber); | 937 assembler->Bind(&if_rhsisnotnumber); |
| 948 { | 938 { |
| 949 // Convert the {rhs} to a Number first. | 939 // Convert the {rhs} to a Number first. |
| 950 Callable callable = | 940 Callable callable = CodeFactory::NonNumberToNumber(isolate()); |
| 951 CodeFactory::NonNumberToNumber(assembler->isolate()); | |
| 952 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); | 941 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); |
| 953 assembler->Goto(&loop); | 942 assembler->Goto(&loop); |
| 954 } | 943 } |
| 955 } | 944 } |
| 956 } | 945 } |
| 957 | 946 |
| 958 assembler->Bind(&if_lhsisnotsmi); | 947 assembler->Bind(&if_lhsisnotsmi); |
| 959 { | 948 { |
| 960 // Load the map of the {lhs}. | 949 // Load the map of the {lhs}. |
| 961 Node* lhs_map = assembler->LoadMap(lhs); | 950 Node* lhs_map = assembler->LoadMap(lhs); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 997 { | 986 { |
| 998 // Perform a floating point subtraction. | 987 // Perform a floating point subtraction. |
| 999 var_fsub_lhs.Bind(assembler->LoadHeapNumberValue(lhs)); | 988 var_fsub_lhs.Bind(assembler->LoadHeapNumberValue(lhs)); |
| 1000 var_fsub_rhs.Bind(assembler->LoadHeapNumberValue(rhs)); | 989 var_fsub_rhs.Bind(assembler->LoadHeapNumberValue(rhs)); |
| 1001 assembler->Goto(&do_fsub); | 990 assembler->Goto(&do_fsub); |
| 1002 } | 991 } |
| 1003 | 992 |
| 1004 assembler->Bind(&if_rhsisnotnumber); | 993 assembler->Bind(&if_rhsisnotnumber); |
| 1005 { | 994 { |
| 1006 // Convert the {rhs} to a Number first. | 995 // Convert the {rhs} to a Number first. |
| 1007 Callable callable = | 996 Callable callable = CodeFactory::NonNumberToNumber(isolate()); |
| 1008 CodeFactory::NonNumberToNumber(assembler->isolate()); | |
| 1009 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); | 997 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); |
| 1010 assembler->Goto(&loop); | 998 assembler->Goto(&loop); |
| 1011 } | 999 } |
| 1012 } | 1000 } |
| 1013 } | 1001 } |
| 1014 | 1002 |
| 1015 assembler->Bind(&if_lhsisnotnumber); | 1003 assembler->Bind(&if_lhsisnotnumber); |
| 1016 { | 1004 { |
| 1017 // Convert the {lhs} to a Number first. | 1005 // Convert the {lhs} to a Number first. |
| 1018 Callable callable = | 1006 Callable callable = CodeFactory::NonNumberToNumber(isolate()); |
| 1019 CodeFactory::NonNumberToNumber(assembler->isolate()); | |
| 1020 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); | 1007 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); |
| 1021 assembler->Goto(&loop); | 1008 assembler->Goto(&loop); |
| 1022 } | 1009 } |
| 1023 } | 1010 } |
| 1024 } | 1011 } |
| 1025 | 1012 |
| 1026 assembler->Bind(&do_fsub); | 1013 assembler->Bind(&do_fsub); |
| 1027 { | 1014 { |
| 1028 Node* lhs_value = var_fsub_lhs.value(); | 1015 Node* lhs_value = var_fsub_lhs.value(); |
| 1029 Node* rhs_value = var_fsub_rhs.value(); | 1016 Node* rhs_value = var_fsub_rhs.value(); |
| 1030 Node* value = assembler->Float64Sub(lhs_value, rhs_value); | 1017 Node* value = assembler->Float64Sub(lhs_value, rhs_value); |
| 1031 var_result.Bind(assembler->ChangeFloat64ToTagged(value)); | 1018 Node* result = assembler->ChangeFloat64ToTagged(value); |
| 1032 assembler->Goto(&end); | 1019 assembler->Return(result); |
| 1033 } | 1020 } |
| 1034 assembler->Bind(&end); | |
| 1035 return var_result.value(); | |
| 1036 } | 1021 } |
| 1037 | 1022 |
| 1038 // static | 1023 void MultiplyStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
| 1039 compiler::Node* MultiplyStub::Generate(CodeStubAssembler* assembler, | |
| 1040 compiler::Node* left, | |
| 1041 compiler::Node* right, | |
| 1042 compiler::Node* context) { | |
| 1043 using compiler::Node; | 1024 using compiler::Node; |
| 1044 typedef CodeStubAssembler::Label Label; | 1025 typedef CodeStubAssembler::Label Label; |
| 1045 typedef CodeStubAssembler::Variable Variable; | 1026 typedef CodeStubAssembler::Variable Variable; |
| 1046 | 1027 |
| 1028 Node* context = assembler->Parameter(2); |
| 1029 |
| 1047 // Shared entry point for floating point multiplication. | 1030 // Shared entry point for floating point multiplication. |
| 1048 Label do_fmul(assembler); | 1031 Label do_fmul(assembler); |
| 1049 Variable var_lhs_float64(assembler, MachineRepresentation::kFloat64), | 1032 Variable var_lhs_float64(assembler, MachineRepresentation::kFloat64), |
| 1050 var_rhs_float64(assembler, MachineRepresentation::kFloat64); | 1033 var_rhs_float64(assembler, MachineRepresentation::kFloat64); |
| 1051 | 1034 |
| 1052 Node* number_map = assembler->HeapNumberMapConstant(); | 1035 Node* number_map = assembler->HeapNumberMapConstant(); |
| 1053 | 1036 |
| 1054 // We might need to loop one or two times due to ToNumber conversions. | 1037 // We might need to loop one or two times due to ToNumber conversions. |
| 1055 Variable var_lhs(assembler, MachineRepresentation::kTagged), | 1038 Variable var_lhs(assembler, MachineRepresentation::kTagged), |
| 1056 var_rhs(assembler, MachineRepresentation::kTagged); | 1039 var_rhs(assembler, MachineRepresentation::kTagged); |
| 1057 Variable* loop_variables[] = {&var_lhs, &var_rhs}; | 1040 Variable* loop_variables[] = {&var_lhs, &var_rhs}; |
| 1058 Label loop(assembler, 2, loop_variables); | 1041 Label loop(assembler, 2, loop_variables); |
| 1059 var_lhs.Bind(left); | 1042 var_lhs.Bind(assembler->Parameter(0)); |
| 1060 var_rhs.Bind(right); | 1043 var_rhs.Bind(assembler->Parameter(1)); |
| 1061 assembler->Goto(&loop); | 1044 assembler->Goto(&loop); |
| 1062 assembler->Bind(&loop); | 1045 assembler->Bind(&loop); |
| 1063 { | 1046 { |
| 1064 Node* lhs = var_lhs.value(); | 1047 Node* lhs = var_lhs.value(); |
| 1065 Node* rhs = var_rhs.value(); | 1048 Node* rhs = var_rhs.value(); |
| 1066 | 1049 |
| 1067 Label lhs_is_smi(assembler), lhs_is_not_smi(assembler); | 1050 Label lhs_is_smi(assembler), lhs_is_not_smi(assembler); |
| 1068 assembler->Branch(assembler->WordIsSmi(lhs), &lhs_is_smi, &lhs_is_not_smi); | 1051 assembler->Branch(assembler->WordIsSmi(lhs), &lhs_is_smi, &lhs_is_not_smi); |
| 1069 | 1052 |
| 1070 assembler->Bind(&lhs_is_smi); | 1053 assembler->Bind(&lhs_is_smi); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1160 var_lhs.Bind(rhs); | 1143 var_lhs.Bind(rhs); |
| 1161 var_rhs.Bind(lhs); | 1144 var_rhs.Bind(lhs); |
| 1162 assembler->Goto(&loop); | 1145 assembler->Goto(&loop); |
| 1163 } | 1146 } |
| 1164 } | 1147 } |
| 1165 } | 1148 } |
| 1166 | 1149 |
| 1167 assembler->Bind(&lhs_is_not_number); | 1150 assembler->Bind(&lhs_is_not_number); |
| 1168 { | 1151 { |
| 1169 // Convert {lhs} to a Number and loop. | 1152 // Convert {lhs} to a Number and loop. |
| 1170 Callable callable = | 1153 Callable callable = CodeFactory::NonNumberToNumber(isolate()); |
| 1171 CodeFactory::NonNumberToNumber(assembler->isolate()); | |
| 1172 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); | 1154 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); |
| 1173 assembler->Goto(&loop); | 1155 assembler->Goto(&loop); |
| 1174 } | 1156 } |
| 1175 } | 1157 } |
| 1176 } | 1158 } |
| 1177 | 1159 |
| 1178 assembler->Bind(&do_fmul); | 1160 assembler->Bind(&do_fmul); |
| 1179 { | 1161 { |
| 1180 Node* value = | 1162 Node* value = |
| 1181 assembler->Float64Mul(var_lhs_float64.value(), var_rhs_float64.value()); | 1163 assembler->Float64Mul(var_lhs_float64.value(), var_rhs_float64.value()); |
| 1182 Node* result = assembler->ChangeFloat64ToTagged(value); | 1164 Node* result = assembler->ChangeFloat64ToTagged(value); |
| 1183 return result; | 1165 assembler->Return(result); |
| 1184 } | 1166 } |
| 1185 } | 1167 } |
| 1186 | 1168 |
| 1187 // static | 1169 void DivideStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
| 1188 compiler::Node* DivideStub::Generate(CodeStubAssembler* assembler, | |
| 1189 compiler::Node* left, | |
| 1190 compiler::Node* right, | |
| 1191 compiler::Node* context) { | |
| 1192 using compiler::Node; | 1170 using compiler::Node; |
| 1193 typedef CodeStubAssembler::Label Label; | 1171 typedef CodeStubAssembler::Label Label; |
| 1194 typedef CodeStubAssembler::Variable Variable; | 1172 typedef CodeStubAssembler::Variable Variable; |
| 1195 | 1173 |
| 1174 Node* context = assembler->Parameter(2); |
| 1175 |
| 1196 // Shared entry point for floating point division. | 1176 // Shared entry point for floating point division. |
| 1197 Label do_fdiv(assembler), end(assembler); | 1177 Label do_fdiv(assembler); |
| 1198 Variable var_dividend_float64(assembler, MachineRepresentation::kFloat64), | 1178 Variable var_dividend_float64(assembler, MachineRepresentation::kFloat64), |
| 1199 var_divisor_float64(assembler, MachineRepresentation::kFloat64); | 1179 var_divisor_float64(assembler, MachineRepresentation::kFloat64); |
| 1200 | 1180 |
| 1201 Node* number_map = assembler->HeapNumberMapConstant(); | 1181 Node* number_map = assembler->HeapNumberMapConstant(); |
| 1202 | 1182 |
| 1203 // We might need to loop one or two times due to ToNumber conversions. | 1183 // We might need to loop one or two times due to ToNumber conversions. |
| 1204 Variable var_dividend(assembler, MachineRepresentation::kTagged), | 1184 Variable var_dividend(assembler, MachineRepresentation::kTagged), |
| 1205 var_divisor(assembler, MachineRepresentation::kTagged), | 1185 var_divisor(assembler, MachineRepresentation::kTagged); |
| 1206 var_result(assembler, MachineRepresentation::kTagged); | |
| 1207 Variable* loop_variables[] = {&var_dividend, &var_divisor}; | 1186 Variable* loop_variables[] = {&var_dividend, &var_divisor}; |
| 1208 Label loop(assembler, 2, loop_variables); | 1187 Label loop(assembler, 2, loop_variables); |
| 1209 var_dividend.Bind(left); | 1188 var_dividend.Bind(assembler->Parameter(0)); |
| 1210 var_divisor.Bind(right); | 1189 var_divisor.Bind(assembler->Parameter(1)); |
| 1211 assembler->Goto(&loop); | 1190 assembler->Goto(&loop); |
| 1212 assembler->Bind(&loop); | 1191 assembler->Bind(&loop); |
| 1213 { | 1192 { |
| 1214 Node* dividend = var_dividend.value(); | 1193 Node* dividend = var_dividend.value(); |
| 1215 Node* divisor = var_divisor.value(); | 1194 Node* divisor = var_divisor.value(); |
| 1216 | 1195 |
| 1217 Label dividend_is_smi(assembler), dividend_is_not_smi(assembler); | 1196 Label dividend_is_smi(assembler), dividend_is_not_smi(assembler); |
| 1218 assembler->Branch(assembler->WordIsSmi(dividend), ÷nd_is_smi, | 1197 assembler->Branch(assembler->WordIsSmi(dividend), ÷nd_is_smi, |
| 1219 ÷nd_is_not_smi); | 1198 ÷nd_is_not_smi); |
| 1220 | 1199 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1274 | 1253 |
| 1275 // TODO(epertoso): consider adding a machine instruction that returns | 1254 // TODO(epertoso): consider adding a machine instruction that returns |
| 1276 // both the result and the remainder. | 1255 // both the result and the remainder. |
| 1277 Node* untagged_result = | 1256 Node* untagged_result = |
| 1278 assembler->Int32Div(untagged_dividend, untagged_divisor); | 1257 assembler->Int32Div(untagged_dividend, untagged_divisor); |
| 1279 Node* truncated = | 1258 Node* truncated = |
| 1280 assembler->IntPtrMul(untagged_result, untagged_divisor); | 1259 assembler->IntPtrMul(untagged_result, untagged_divisor); |
| 1281 // Do floating point division if the remainder is not 0. | 1260 // Do floating point division if the remainder is not 0. |
| 1282 assembler->GotoIf( | 1261 assembler->GotoIf( |
| 1283 assembler->Word32NotEqual(untagged_dividend, truncated), &bailout); | 1262 assembler->Word32NotEqual(untagged_dividend, truncated), &bailout); |
| 1284 var_result.Bind(assembler->SmiTag(untagged_result)); | 1263 assembler->Return(assembler->SmiTag(untagged_result)); |
| 1285 assembler->Goto(&end); | |
| 1286 | 1264 |
| 1287 // Bailout: convert {dividend} and {divisor} to double and do double | 1265 // Bailout: convert {dividend} and {divisor} to double and do double |
| 1288 // division. | 1266 // division. |
| 1289 assembler->Bind(&bailout); | 1267 assembler->Bind(&bailout); |
| 1290 { | 1268 { |
| 1291 var_dividend_float64.Bind(assembler->SmiToFloat64(dividend)); | 1269 var_dividend_float64.Bind(assembler->SmiToFloat64(dividend)); |
| 1292 var_divisor_float64.Bind(assembler->SmiToFloat64(divisor)); | 1270 var_divisor_float64.Bind(assembler->SmiToFloat64(divisor)); |
| 1293 assembler->Goto(&do_fdiv); | 1271 assembler->Goto(&do_fdiv); |
| 1294 } | 1272 } |
| 1295 } | 1273 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1309 // Convert {dividend} to a double and divide it with the value of | 1287 // Convert {dividend} to a double and divide it with the value of |
| 1310 // {divisor}. | 1288 // {divisor}. |
| 1311 var_dividend_float64.Bind(assembler->SmiToFloat64(dividend)); | 1289 var_dividend_float64.Bind(assembler->SmiToFloat64(dividend)); |
| 1312 var_divisor_float64.Bind(assembler->LoadHeapNumberValue(divisor)); | 1290 var_divisor_float64.Bind(assembler->LoadHeapNumberValue(divisor)); |
| 1313 assembler->Goto(&do_fdiv); | 1291 assembler->Goto(&do_fdiv); |
| 1314 } | 1292 } |
| 1315 | 1293 |
| 1316 assembler->Bind(&divisor_is_not_number); | 1294 assembler->Bind(&divisor_is_not_number); |
| 1317 { | 1295 { |
| 1318 // Convert {divisor} to a number and loop. | 1296 // Convert {divisor} to a number and loop. |
| 1319 Callable callable = | 1297 Callable callable = CodeFactory::NonNumberToNumber(isolate()); |
| 1320 CodeFactory::NonNumberToNumber(assembler->isolate()); | |
| 1321 var_divisor.Bind(assembler->CallStub(callable, context, divisor)); | 1298 var_divisor.Bind(assembler->CallStub(callable, context, divisor)); |
| 1322 assembler->Goto(&loop); | 1299 assembler->Goto(&loop); |
| 1323 } | 1300 } |
| 1324 } | 1301 } |
| 1325 } | 1302 } |
| 1326 | 1303 |
| 1327 assembler->Bind(÷nd_is_not_smi); | 1304 assembler->Bind(÷nd_is_not_smi); |
| 1328 { | 1305 { |
| 1329 Node* dividend_map = assembler->LoadMap(dividend); | 1306 Node* dividend_map = assembler->LoadMap(dividend); |
| 1330 | 1307 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1365 // Both {dividend} and {divisor} are HeapNumbers. Load their values | 1342 // Both {dividend} and {divisor} are HeapNumbers. Load their values |
| 1366 // and divide them. | 1343 // and divide them. |
| 1367 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend)); | 1344 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend)); |
| 1368 var_divisor_float64.Bind(assembler->LoadHeapNumberValue(divisor)); | 1345 var_divisor_float64.Bind(assembler->LoadHeapNumberValue(divisor)); |
| 1369 assembler->Goto(&do_fdiv); | 1346 assembler->Goto(&do_fdiv); |
| 1370 } | 1347 } |
| 1371 | 1348 |
| 1372 assembler->Bind(&divisor_is_not_number); | 1349 assembler->Bind(&divisor_is_not_number); |
| 1373 { | 1350 { |
| 1374 // Convert {divisor} to a number and loop. | 1351 // Convert {divisor} to a number and loop. |
| 1375 Callable callable = | 1352 Callable callable = CodeFactory::NonNumberToNumber(isolate()); |
| 1376 CodeFactory::NonNumberToNumber(assembler->isolate()); | |
| 1377 var_divisor.Bind(assembler->CallStub(callable, context, divisor)); | 1353 var_divisor.Bind(assembler->CallStub(callable, context, divisor)); |
| 1378 assembler->Goto(&loop); | 1354 assembler->Goto(&loop); |
| 1379 } | 1355 } |
| 1380 } | 1356 } |
| 1381 } | 1357 } |
| 1382 | 1358 |
| 1383 assembler->Bind(÷nd_is_not_number); | 1359 assembler->Bind(÷nd_is_not_number); |
| 1384 { | 1360 { |
| 1385 // Convert {dividend} to a Number and loop. | 1361 // Convert {dividend} to a Number and loop. |
| 1386 Callable callable = | 1362 Callable callable = CodeFactory::NonNumberToNumber(isolate()); |
| 1387 CodeFactory::NonNumberToNumber(assembler->isolate()); | |
| 1388 var_dividend.Bind(assembler->CallStub(callable, context, dividend)); | 1363 var_dividend.Bind(assembler->CallStub(callable, context, dividend)); |
| 1389 assembler->Goto(&loop); | 1364 assembler->Goto(&loop); |
| 1390 } | 1365 } |
| 1391 } | 1366 } |
| 1392 } | 1367 } |
| 1393 | 1368 |
| 1394 assembler->Bind(&do_fdiv); | 1369 assembler->Bind(&do_fdiv); |
| 1395 { | 1370 { |
| 1396 Node* value = assembler->Float64Div(var_dividend_float64.value(), | 1371 Node* value = assembler->Float64Div(var_dividend_float64.value(), |
| 1397 var_divisor_float64.value()); | 1372 var_divisor_float64.value()); |
| 1398 var_result.Bind(assembler->ChangeFloat64ToTagged(value)); | 1373 Node* result = assembler->ChangeFloat64ToTagged(value); |
| 1399 assembler->Goto(&end); | 1374 assembler->Return(result); |
| 1400 } | 1375 } |
| 1401 assembler->Bind(&end); | |
| 1402 return var_result.value(); | |
| 1403 } | 1376 } |
| 1404 | 1377 |
| 1405 // static | 1378 void BitwiseAndStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
| 1406 compiler::Node* ModulusStub::Generate(CodeStubAssembler* assembler, | 1379 using compiler::Node; |
| 1407 compiler::Node* left, | 1380 |
| 1408 compiler::Node* right, | 1381 Node* lhs = assembler->Parameter(0); |
| 1409 compiler::Node* context) { | 1382 Node* rhs = assembler->Parameter(1); |
| 1383 Node* context = assembler->Parameter(2); |
| 1384 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs); |
| 1385 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs); |
| 1386 Node* value = assembler->Word32And(lhs_value, rhs_value); |
| 1387 Node* result = assembler->ChangeInt32ToTagged(value); |
| 1388 assembler->Return(result); |
| 1389 } |
| 1390 |
| 1391 void ModulusStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
| 1410 using compiler::Node; | 1392 using compiler::Node; |
| 1411 typedef CodeStubAssembler::Label Label; | 1393 typedef CodeStubAssembler::Label Label; |
| 1412 typedef CodeStubAssembler::Variable Variable; | 1394 typedef CodeStubAssembler::Variable Variable; |
| 1413 | 1395 |
| 1396 Node* context = assembler->Parameter(2); |
| 1397 |
| 1414 // Shared entry point for floating point modulus. | 1398 // Shared entry point for floating point modulus. |
| 1415 Label do_fmod(assembler); | 1399 Label do_fmod(assembler); |
| 1416 Variable var_dividend_float64(assembler, MachineRepresentation::kFloat64), | 1400 Variable var_dividend_float64(assembler, MachineRepresentation::kFloat64), |
| 1417 var_divisor_float64(assembler, MachineRepresentation::kFloat64); | 1401 var_divisor_float64(assembler, MachineRepresentation::kFloat64); |
| 1418 | 1402 |
| 1419 Node* number_map = assembler->HeapNumberMapConstant(); | 1403 Node* number_map = assembler->HeapNumberMapConstant(); |
| 1420 | 1404 |
| 1421 // We might need to loop one or two times due to ToNumber conversions. | 1405 // We might need to loop one or two times due to ToNumber conversions. |
| 1422 Variable var_dividend(assembler, MachineRepresentation::kTagged), | 1406 Variable var_dividend(assembler, MachineRepresentation::kTagged), |
| 1423 var_divisor(assembler, MachineRepresentation::kTagged); | 1407 var_divisor(assembler, MachineRepresentation::kTagged); |
| 1424 Variable* loop_variables[] = {&var_dividend, &var_divisor}; | 1408 Variable* loop_variables[] = {&var_dividend, &var_divisor}; |
| 1425 Label loop(assembler, 2, loop_variables); | 1409 Label loop(assembler, 2, loop_variables); |
| 1426 var_dividend.Bind(left); | 1410 var_dividend.Bind(assembler->Parameter(0)); |
| 1427 var_divisor.Bind(right); | 1411 var_divisor.Bind(assembler->Parameter(1)); |
| 1428 assembler->Goto(&loop); | 1412 assembler->Goto(&loop); |
| 1429 assembler->Bind(&loop); | 1413 assembler->Bind(&loop); |
| 1430 { | 1414 { |
| 1431 Node* dividend = var_dividend.value(); | 1415 Node* dividend = var_dividend.value(); |
| 1432 Node* divisor = var_divisor.value(); | 1416 Node* divisor = var_divisor.value(); |
| 1433 | 1417 |
| 1434 Label dividend_is_smi(assembler), dividend_is_not_smi(assembler); | 1418 Label dividend_is_smi(assembler), dividend_is_not_smi(assembler); |
| 1435 assembler->Branch(assembler->WordIsSmi(dividend), ÷nd_is_smi, | 1419 assembler->Branch(assembler->WordIsSmi(dividend), ÷nd_is_smi, |
| 1436 ÷nd_is_not_smi); | 1420 ÷nd_is_not_smi); |
| 1437 | 1421 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1464 // Convert {dividend} to a double and compute its modulus with the | 1448 // Convert {dividend} to a double and compute its modulus with the |
| 1465 // value of {dividend}. | 1449 // value of {dividend}. |
| 1466 var_dividend_float64.Bind(assembler->SmiToFloat64(dividend)); | 1450 var_dividend_float64.Bind(assembler->SmiToFloat64(dividend)); |
| 1467 var_divisor_float64.Bind(assembler->LoadHeapNumberValue(divisor)); | 1451 var_divisor_float64.Bind(assembler->LoadHeapNumberValue(divisor)); |
| 1468 assembler->Goto(&do_fmod); | 1452 assembler->Goto(&do_fmod); |
| 1469 } | 1453 } |
| 1470 | 1454 |
| 1471 assembler->Bind(&divisor_is_not_number); | 1455 assembler->Bind(&divisor_is_not_number); |
| 1472 { | 1456 { |
| 1473 // Convert {divisor} to a number and loop. | 1457 // Convert {divisor} to a number and loop. |
| 1474 Callable callable = | 1458 Callable callable = CodeFactory::NonNumberToNumber(isolate()); |
| 1475 CodeFactory::NonNumberToNumber(assembler->isolate()); | |
| 1476 var_divisor.Bind(assembler->CallStub(callable, context, divisor)); | 1459 var_divisor.Bind(assembler->CallStub(callable, context, divisor)); |
| 1477 assembler->Goto(&loop); | 1460 assembler->Goto(&loop); |
| 1478 } | 1461 } |
| 1479 } | 1462 } |
| 1480 } | 1463 } |
| 1481 | 1464 |
| 1482 assembler->Bind(÷nd_is_not_smi); | 1465 assembler->Bind(÷nd_is_not_smi); |
| 1483 { | 1466 { |
| 1484 Node* dividend_map = assembler->LoadMap(dividend); | 1467 Node* dividend_map = assembler->LoadMap(dividend); |
| 1485 | 1468 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1520 // Both {dividend} and {divisor} are HeapNumbers. Load their values | 1503 // Both {dividend} and {divisor} are HeapNumbers. Load their values |
| 1521 // and compute their modulus. | 1504 // and compute their modulus. |
| 1522 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend)); | 1505 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend)); |
| 1523 var_divisor_float64.Bind(assembler->LoadHeapNumberValue(divisor)); | 1506 var_divisor_float64.Bind(assembler->LoadHeapNumberValue(divisor)); |
| 1524 assembler->Goto(&do_fmod); | 1507 assembler->Goto(&do_fmod); |
| 1525 } | 1508 } |
| 1526 | 1509 |
| 1527 assembler->Bind(&divisor_is_not_number); | 1510 assembler->Bind(&divisor_is_not_number); |
| 1528 { | 1511 { |
| 1529 // Convert {divisor} to a number and loop. | 1512 // Convert {divisor} to a number and loop. |
| 1530 Callable callable = | 1513 Callable callable = CodeFactory::NonNumberToNumber(isolate()); |
| 1531 CodeFactory::NonNumberToNumber(assembler->isolate()); | |
| 1532 var_divisor.Bind(assembler->CallStub(callable, context, divisor)); | 1514 var_divisor.Bind(assembler->CallStub(callable, context, divisor)); |
| 1533 assembler->Goto(&loop); | 1515 assembler->Goto(&loop); |
| 1534 } | 1516 } |
| 1535 } | 1517 } |
| 1536 } | 1518 } |
| 1537 | 1519 |
| 1538 assembler->Bind(÷nd_is_not_number); | 1520 assembler->Bind(÷nd_is_not_number); |
| 1539 { | 1521 { |
| 1540 // Convert {dividend} to a Number and loop. | 1522 // Convert {dividend} to a Number and loop. |
| 1541 Callable callable = | 1523 Callable callable = CodeFactory::NonNumberToNumber(isolate()); |
| 1542 CodeFactory::NonNumberToNumber(assembler->isolate()); | |
| 1543 var_dividend.Bind(assembler->CallStub(callable, context, dividend)); | 1524 var_dividend.Bind(assembler->CallStub(callable, context, dividend)); |
| 1544 assembler->Goto(&loop); | 1525 assembler->Goto(&loop); |
| 1545 } | 1526 } |
| 1546 } | 1527 } |
| 1547 } | 1528 } |
| 1548 | 1529 |
| 1549 assembler->Bind(&do_fmod); | 1530 assembler->Bind(&do_fmod); |
| 1550 { | 1531 { |
| 1551 Node* value = assembler->Float64Mod(var_dividend_float64.value(), | 1532 Node* value = assembler->Float64Mod(var_dividend_float64.value(), |
| 1552 var_divisor_float64.value()); | 1533 var_divisor_float64.value()); |
| 1553 Node* result = assembler->ChangeFloat64ToTagged(value); | 1534 Node* result = assembler->ChangeFloat64ToTagged(value); |
| 1554 return result; | 1535 assembler->Return(result); |
| 1555 } | 1536 } |
| 1556 } | 1537 } |
| 1557 | 1538 |
| 1558 // static | 1539 void ShiftLeftStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
| 1559 compiler::Node* ShiftLeftStub::Generate(CodeStubAssembler* assembler, | |
| 1560 compiler::Node* left, | |
| 1561 compiler::Node* right, | |
| 1562 compiler::Node* context) { | |
| 1563 using compiler::Node; | 1540 using compiler::Node; |
| 1564 | 1541 |
| 1565 Node* lhs_value = assembler->TruncateTaggedToWord32(context, left); | 1542 Node* lhs = assembler->Parameter(0); |
| 1566 Node* rhs_value = assembler->TruncateTaggedToWord32(context, right); | 1543 Node* rhs = assembler->Parameter(1); |
| 1544 Node* context = assembler->Parameter(2); |
| 1545 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs); |
| 1546 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs); |
| 1567 Node* shift_count = | 1547 Node* shift_count = |
| 1568 assembler->Word32And(rhs_value, assembler->Int32Constant(0x1f)); | 1548 assembler->Word32And(rhs_value, assembler->Int32Constant(0x1f)); |
| 1569 Node* value = assembler->Word32Shl(lhs_value, shift_count); | 1549 Node* value = assembler->Word32Shl(lhs_value, shift_count); |
| 1570 Node* result = assembler->ChangeInt32ToTagged(value); | 1550 Node* result = assembler->ChangeInt32ToTagged(value); |
| 1571 return result; | 1551 assembler->Return(result); |
| 1572 } | 1552 } |
| 1573 | 1553 |
| 1574 compiler::Node* ShiftRightStub::Generate(CodeStubAssembler* assembler, | 1554 void ShiftRightStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
| 1575 compiler::Node* left, | |
| 1576 compiler::Node* right, | |
| 1577 compiler::Node* context) { | |
| 1578 using compiler::Node; | 1555 using compiler::Node; |
| 1579 | 1556 |
| 1580 Node* lhs_value = assembler->TruncateTaggedToWord32(context, left); | 1557 Node* lhs = assembler->Parameter(0); |
| 1581 Node* rhs_value = assembler->TruncateTaggedToWord32(context, right); | 1558 Node* rhs = assembler->Parameter(1); |
| 1559 Node* context = assembler->Parameter(2); |
| 1560 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs); |
| 1561 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs); |
| 1582 Node* shift_count = | 1562 Node* shift_count = |
| 1583 assembler->Word32And(rhs_value, assembler->Int32Constant(0x1f)); | 1563 assembler->Word32And(rhs_value, assembler->Int32Constant(0x1f)); |
| 1584 Node* value = assembler->Word32Sar(lhs_value, shift_count); | 1564 Node* value = assembler->Word32Sar(lhs_value, shift_count); |
| 1585 Node* result = assembler->ChangeInt32ToTagged(value); | 1565 Node* result = assembler->ChangeInt32ToTagged(value); |
| 1586 return result; | 1566 assembler->Return(result); |
| 1587 } | 1567 } |
| 1588 | 1568 |
| 1589 compiler::Node* ShiftRightLogicalStub::Generate(CodeStubAssembler* assembler, | 1569 void ShiftRightLogicalStub::GenerateAssembly( |
| 1590 compiler::Node* left, | 1570 CodeStubAssembler* assembler) const { |
| 1591 compiler::Node* right, | |
| 1592 compiler::Node* context) { | |
| 1593 using compiler::Node; | 1571 using compiler::Node; |
| 1594 | 1572 |
| 1595 Node* lhs_value = assembler->TruncateTaggedToWord32(context, left); | 1573 Node* lhs = assembler->Parameter(0); |
| 1596 Node* rhs_value = assembler->TruncateTaggedToWord32(context, right); | 1574 Node* rhs = assembler->Parameter(1); |
| 1575 Node* context = assembler->Parameter(2); |
| 1576 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs); |
| 1577 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs); |
| 1597 Node* shift_count = | 1578 Node* shift_count = |
| 1598 assembler->Word32And(rhs_value, assembler->Int32Constant(0x1f)); | 1579 assembler->Word32And(rhs_value, assembler->Int32Constant(0x1f)); |
| 1599 Node* value = assembler->Word32Shr(lhs_value, shift_count); | 1580 Node* value = assembler->Word32Shr(lhs_value, shift_count); |
| 1600 Node* result = assembler->ChangeUint32ToTagged(value); | 1581 Node* result = assembler->ChangeUint32ToTagged(value); |
| 1601 return result; | 1582 assembler->Return(result); |
| 1602 } | 1583 } |
| 1603 | 1584 |
| 1604 compiler::Node* BitwiseAndStub::Generate(CodeStubAssembler* assembler, | 1585 void BitwiseOrStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
| 1605 compiler::Node* left, | |
| 1606 compiler::Node* right, | |
| 1607 compiler::Node* context) { | |
| 1608 using compiler::Node; | 1586 using compiler::Node; |
| 1609 | 1587 |
| 1610 Node* lhs_value = assembler->TruncateTaggedToWord32(context, left); | 1588 Node* lhs = assembler->Parameter(0); |
| 1611 Node* rhs_value = assembler->TruncateTaggedToWord32(context, right); | 1589 Node* rhs = assembler->Parameter(1); |
| 1612 Node* value = assembler->Word32And(lhs_value, rhs_value); | 1590 Node* context = assembler->Parameter(2); |
| 1591 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs); |
| 1592 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs); |
| 1593 Node* value = assembler->Word32Or(lhs_value, rhs_value); |
| 1613 Node* result = assembler->ChangeInt32ToTagged(value); | 1594 Node* result = assembler->ChangeInt32ToTagged(value); |
| 1614 return result; | 1595 assembler->Return(result); |
| 1615 } | 1596 } |
| 1616 | 1597 |
| 1617 compiler::Node* BitwiseOrStub::Generate(CodeStubAssembler* assembler, | 1598 void BitwiseXorStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
| 1618 compiler::Node* left, | |
| 1619 compiler::Node* right, | |
| 1620 compiler::Node* context) { | |
| 1621 using compiler::Node; | 1599 using compiler::Node; |
| 1622 | 1600 |
| 1623 Node* lhs_value = assembler->TruncateTaggedToWord32(context, left); | 1601 Node* lhs = assembler->Parameter(0); |
| 1624 Node* rhs_value = assembler->TruncateTaggedToWord32(context, right); | 1602 Node* rhs = assembler->Parameter(1); |
| 1625 Node* value = assembler->Word32Or(lhs_value, rhs_value); | 1603 Node* context = assembler->Parameter(2); |
| 1626 Node* result = assembler->ChangeInt32ToTagged(value); | 1604 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs); |
| 1627 return result; | 1605 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs); |
| 1628 } | |
| 1629 | |
| 1630 compiler::Node* BitwiseXorStub::Generate(CodeStubAssembler* assembler, | |
| 1631 compiler::Node* left, | |
| 1632 compiler::Node* right, | |
| 1633 compiler::Node* context) { | |
| 1634 using compiler::Node; | |
| 1635 Node* lhs_value = assembler->TruncateTaggedToWord32(context, left); | |
| 1636 Node* rhs_value = assembler->TruncateTaggedToWord32(context, right); | |
| 1637 Node* value = assembler->Word32Xor(lhs_value, rhs_value); | 1606 Node* value = assembler->Word32Xor(lhs_value, rhs_value); |
| 1638 Node* result = assembler->ChangeInt32ToTagged(value); | 1607 Node* result = assembler->ChangeInt32ToTagged(value); |
| 1639 return result; | 1608 assembler->Return(result); |
| 1640 } | 1609 } |
| 1641 | 1610 |
| 1642 void IncStub::GenerateAssembly(CodeStubAssembler* assembler) const { | 1611 void IncStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
| 1643 typedef CodeStubAssembler::Label Label; | 1612 typedef CodeStubAssembler::Label Label; |
| 1644 typedef compiler::Node Node; | 1613 typedef compiler::Node Node; |
| 1645 typedef CodeStubAssembler::Variable Variable; | 1614 typedef CodeStubAssembler::Variable Variable; |
| 1646 | 1615 |
| 1647 Node* context = assembler->Parameter(1); | 1616 Node* context = assembler->Parameter(1); |
| 1648 | 1617 |
| 1649 // Shared entry for floating point increment. | 1618 // Shared entry for floating point increment. |
| (...skipping 2656 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4306 if (type->Is(Type::UntaggedPointer())) { | 4275 if (type->Is(Type::UntaggedPointer())) { |
| 4307 return Representation::External(); | 4276 return Representation::External(); |
| 4308 } | 4277 } |
| 4309 | 4278 |
| 4310 DCHECK(!type->Is(Type::Untagged())); | 4279 DCHECK(!type->Is(Type::Untagged())); |
| 4311 return Representation::Tagged(); | 4280 return Representation::Tagged(); |
| 4312 } | 4281 } |
| 4313 | 4282 |
| 4314 } // namespace internal | 4283 } // namespace internal |
| 4315 } // namespace v8 | 4284 } // namespace v8 |
| OLD | NEW |