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