| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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/builtins/builtins-utils.h" | 5 #include "src/builtins/builtins-utils.h" |
| 6 #include "src/builtins/builtins.h" | 6 #include "src/builtins/builtins.h" |
| 7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
| 8 | 8 |
| 9 namespace v8 { | 9 namespace v8 { |
| 10 namespace internal { | 10 namespace internal { |
| 11 | 11 |
| 12 // ----------------------------------------------------------------------------- | 12 // ----------------------------------------------------------------------------- |
| 13 // ES6 section 20.1 Number Objects | 13 // ES6 section 20.1 Number Objects |
| 14 | 14 |
| 15 // ES6 section 20.1.2.2 Number.isFinite ( number ) | 15 // ES6 section 20.1.2.2 Number.isFinite ( number ) |
| 16 void Builtins::Generate_NumberIsFinite(CodeStubAssembler* assembler) { | 16 void Builtins::Generate_NumberIsFinite(CodeStubAssembler* assembler) { |
| 17 typedef CodeStubAssembler::Label Label; | 17 typedef CodeStubAssembler::Label Label; |
| 18 typedef compiler::Node Node; | 18 typedef compiler::Node Node; |
| 19 | 19 |
| 20 Node* number = assembler->Parameter(1); | 20 Node* number = assembler->Parameter(1); |
| 21 | 21 |
| 22 Label return_true(assembler), return_false(assembler); | 22 Label return_true(assembler), return_false(assembler); |
| 23 | 23 |
| 24 // Check if {number} is a Smi. | 24 // Check if {number} is a Smi. |
| 25 assembler->GotoIf(assembler->WordIsSmi(number), &return_true); | 25 assembler->GotoIf(assembler->TaggedIsSmi(number), &return_true); |
| 26 | 26 |
| 27 // Check if {number} is a HeapNumber. | 27 // Check if {number} is a HeapNumber. |
| 28 assembler->GotoUnless( | 28 assembler->GotoUnless( |
| 29 assembler->WordEqual(assembler->LoadMap(number), | 29 assembler->WordEqual(assembler->LoadMap(number), |
| 30 assembler->HeapNumberMapConstant()), | 30 assembler->HeapNumberMapConstant()), |
| 31 &return_false); | 31 &return_false); |
| 32 | 32 |
| 33 // Check if {number} contains a finite, non-NaN value. | 33 // Check if {number} contains a finite, non-NaN value. |
| 34 Node* number_value = assembler->LoadHeapNumberValue(number); | 34 Node* number_value = assembler->LoadHeapNumberValue(number); |
| 35 assembler->BranchIfFloat64IsNaN( | 35 assembler->BranchIfFloat64IsNaN( |
| (...skipping 10 matching lines...) Expand all Loading... |
| 46 // ES6 section 20.1.2.3 Number.isInteger ( number ) | 46 // ES6 section 20.1.2.3 Number.isInteger ( number ) |
| 47 void Builtins::Generate_NumberIsInteger(CodeStubAssembler* assembler) { | 47 void Builtins::Generate_NumberIsInteger(CodeStubAssembler* assembler) { |
| 48 typedef CodeStubAssembler::Label Label; | 48 typedef CodeStubAssembler::Label Label; |
| 49 typedef compiler::Node Node; | 49 typedef compiler::Node Node; |
| 50 | 50 |
| 51 Node* number = assembler->Parameter(1); | 51 Node* number = assembler->Parameter(1); |
| 52 | 52 |
| 53 Label return_true(assembler), return_false(assembler); | 53 Label return_true(assembler), return_false(assembler); |
| 54 | 54 |
| 55 // Check if {number} is a Smi. | 55 // Check if {number} is a Smi. |
| 56 assembler->GotoIf(assembler->WordIsSmi(number), &return_true); | 56 assembler->GotoIf(assembler->TaggedIsSmi(number), &return_true); |
| 57 | 57 |
| 58 // Check if {number} is a HeapNumber. | 58 // Check if {number} is a HeapNumber. |
| 59 assembler->GotoUnless( | 59 assembler->GotoUnless( |
| 60 assembler->WordEqual(assembler->LoadMap(number), | 60 assembler->WordEqual(assembler->LoadMap(number), |
| 61 assembler->HeapNumberMapConstant()), | 61 assembler->HeapNumberMapConstant()), |
| 62 &return_false); | 62 &return_false); |
| 63 | 63 |
| 64 // Load the actual value of {number}. | 64 // Load the actual value of {number}. |
| 65 Node* number_value = assembler->LoadHeapNumberValue(number); | 65 Node* number_value = assembler->LoadHeapNumberValue(number); |
| 66 | 66 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 82 // ES6 section 20.1.2.4 Number.isNaN ( number ) | 82 // ES6 section 20.1.2.4 Number.isNaN ( number ) |
| 83 void Builtins::Generate_NumberIsNaN(CodeStubAssembler* assembler) { | 83 void Builtins::Generate_NumberIsNaN(CodeStubAssembler* assembler) { |
| 84 typedef CodeStubAssembler::Label Label; | 84 typedef CodeStubAssembler::Label Label; |
| 85 typedef compiler::Node Node; | 85 typedef compiler::Node Node; |
| 86 | 86 |
| 87 Node* number = assembler->Parameter(1); | 87 Node* number = assembler->Parameter(1); |
| 88 | 88 |
| 89 Label return_true(assembler), return_false(assembler); | 89 Label return_true(assembler), return_false(assembler); |
| 90 | 90 |
| 91 // Check if {number} is a Smi. | 91 // Check if {number} is a Smi. |
| 92 assembler->GotoIf(assembler->WordIsSmi(number), &return_false); | 92 assembler->GotoIf(assembler->TaggedIsSmi(number), &return_false); |
| 93 | 93 |
| 94 // Check if {number} is a HeapNumber. | 94 // Check if {number} is a HeapNumber. |
| 95 assembler->GotoUnless( | 95 assembler->GotoUnless( |
| 96 assembler->WordEqual(assembler->LoadMap(number), | 96 assembler->WordEqual(assembler->LoadMap(number), |
| 97 assembler->HeapNumberMapConstant()), | 97 assembler->HeapNumberMapConstant()), |
| 98 &return_false); | 98 &return_false); |
| 99 | 99 |
| 100 // Check if {number} contains a NaN value. | 100 // Check if {number} contains a NaN value. |
| 101 Node* number_value = assembler->LoadHeapNumberValue(number); | 101 Node* number_value = assembler->LoadHeapNumberValue(number); |
| 102 assembler->BranchIfFloat64IsNaN(number_value, &return_true, &return_false); | 102 assembler->BranchIfFloat64IsNaN(number_value, &return_true, &return_false); |
| 103 | 103 |
| 104 assembler->Bind(&return_true); | 104 assembler->Bind(&return_true); |
| 105 assembler->Return(assembler->BooleanConstant(true)); | 105 assembler->Return(assembler->BooleanConstant(true)); |
| 106 | 106 |
| 107 assembler->Bind(&return_false); | 107 assembler->Bind(&return_false); |
| 108 assembler->Return(assembler->BooleanConstant(false)); | 108 assembler->Return(assembler->BooleanConstant(false)); |
| 109 } | 109 } |
| 110 | 110 |
| 111 // ES6 section 20.1.2.5 Number.isSafeInteger ( number ) | 111 // ES6 section 20.1.2.5 Number.isSafeInteger ( number ) |
| 112 void Builtins::Generate_NumberIsSafeInteger(CodeStubAssembler* assembler) { | 112 void Builtins::Generate_NumberIsSafeInteger(CodeStubAssembler* assembler) { |
| 113 typedef CodeStubAssembler::Label Label; | 113 typedef CodeStubAssembler::Label Label; |
| 114 typedef compiler::Node Node; | 114 typedef compiler::Node Node; |
| 115 | 115 |
| 116 Node* number = assembler->Parameter(1); | 116 Node* number = assembler->Parameter(1); |
| 117 | 117 |
| 118 Label return_true(assembler), return_false(assembler); | 118 Label return_true(assembler), return_false(assembler); |
| 119 | 119 |
| 120 // Check if {number} is a Smi. | 120 // Check if {number} is a Smi. |
| 121 assembler->GotoIf(assembler->WordIsSmi(number), &return_true); | 121 assembler->GotoIf(assembler->TaggedIsSmi(number), &return_true); |
| 122 | 122 |
| 123 // Check if {number} is a HeapNumber. | 123 // Check if {number} is a HeapNumber. |
| 124 assembler->GotoUnless( | 124 assembler->GotoUnless( |
| 125 assembler->WordEqual(assembler->LoadMap(number), | 125 assembler->WordEqual(assembler->LoadMap(number), |
| 126 assembler->HeapNumberMapConstant()), | 126 assembler->HeapNumberMapConstant()), |
| 127 &return_false); | 127 &return_false); |
| 128 | 128 |
| 129 // Load the actual value of {number}. | 129 // Load the actual value of {number}. |
| 130 Node* number_value = assembler->LoadHeapNumberValue(number); | 130 Node* number_value = assembler->LoadHeapNumberValue(number); |
| 131 | 131 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 Label loop(assembler, &var_input); | 163 Label loop(assembler, &var_input); |
| 164 var_input.Bind(assembler->Parameter(1)); | 164 var_input.Bind(assembler->Parameter(1)); |
| 165 assembler->Goto(&loop); | 165 assembler->Goto(&loop); |
| 166 assembler->Bind(&loop); | 166 assembler->Bind(&loop); |
| 167 { | 167 { |
| 168 // Load the current {input} value. | 168 // Load the current {input} value. |
| 169 Node* input = var_input.value(); | 169 Node* input = var_input.value(); |
| 170 | 170 |
| 171 // Check if the {input} is a HeapObject or a Smi. | 171 // Check if the {input} is a HeapObject or a Smi. |
| 172 Label if_inputissmi(assembler), if_inputisnotsmi(assembler); | 172 Label if_inputissmi(assembler), if_inputisnotsmi(assembler); |
| 173 assembler->Branch(assembler->WordIsSmi(input), &if_inputissmi, | 173 assembler->Branch(assembler->TaggedIsSmi(input), &if_inputissmi, |
| 174 &if_inputisnotsmi); | 174 &if_inputisnotsmi); |
| 175 | 175 |
| 176 assembler->Bind(&if_inputissmi); | 176 assembler->Bind(&if_inputissmi); |
| 177 { | 177 { |
| 178 // The {input} is already a Number, no need to do anything. | 178 // The {input} is already a Number, no need to do anything. |
| 179 assembler->Return(input); | 179 assembler->Return(input); |
| 180 } | 180 } |
| 181 | 181 |
| 182 assembler->Bind(&if_inputisnotsmi); | 182 assembler->Bind(&if_inputisnotsmi); |
| 183 { | 183 { |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 var_rhs.Bind(right); | 504 var_rhs.Bind(right); |
| 505 assembler->Goto(&loop); | 505 assembler->Goto(&loop); |
| 506 assembler->Bind(&loop); | 506 assembler->Bind(&loop); |
| 507 { | 507 { |
| 508 // Load the current {lhs} and {rhs} values. | 508 // Load the current {lhs} and {rhs} values. |
| 509 Node* lhs = var_lhs.value(); | 509 Node* lhs = var_lhs.value(); |
| 510 Node* rhs = var_rhs.value(); | 510 Node* rhs = var_rhs.value(); |
| 511 | 511 |
| 512 // Check if the {lhs} is a Smi or a HeapObject. | 512 // Check if the {lhs} is a Smi or a HeapObject. |
| 513 Label if_lhsissmi(assembler), if_lhsisnotsmi(assembler); | 513 Label if_lhsissmi(assembler), if_lhsisnotsmi(assembler); |
| 514 assembler->Branch(assembler->WordIsSmi(lhs), &if_lhsissmi, &if_lhsisnotsmi); | 514 assembler->Branch(assembler->TaggedIsSmi(lhs), &if_lhsissmi, |
| 515 &if_lhsisnotsmi); |
| 515 | 516 |
| 516 assembler->Bind(&if_lhsissmi); | 517 assembler->Bind(&if_lhsissmi); |
| 517 { | 518 { |
| 518 // Check if the {rhs} is also a Smi. | 519 // Check if the {rhs} is also a Smi. |
| 519 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); | 520 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); |
| 520 assembler->Branch(assembler->WordIsSmi(rhs), &if_rhsissmi, | 521 assembler->Branch(assembler->TaggedIsSmi(rhs), &if_rhsissmi, |
| 521 &if_rhsisnotsmi); | 522 &if_rhsisnotsmi); |
| 522 | 523 |
| 523 assembler->Bind(&if_rhsissmi); | 524 assembler->Bind(&if_rhsissmi); |
| 524 { | 525 { |
| 525 // Try fast Smi addition first. | 526 // Try fast Smi addition first. |
| 526 Node* pair = assembler->SmiAddWithOverflow(lhs, rhs); | 527 Node* pair = assembler->SmiAddWithOverflow(lhs, rhs); |
| 527 Node* overflow = assembler->Projection(1, pair); | 528 Node* overflow = assembler->Projection(1, pair); |
| 528 | 529 |
| 529 // Check if the Smi additon overflowed. | 530 // Check if the Smi additon overflowed. |
| 530 Label if_overflow(assembler), if_notoverflow(assembler); | 531 Label if_overflow(assembler), if_notoverflow(assembler); |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 623 { | 624 { |
| 624 var_lhs.Bind(lhs); | 625 var_lhs.Bind(lhs); |
| 625 var_rhs.Bind(rhs); | 626 var_rhs.Bind(rhs); |
| 626 assembler->Goto(&string_add_convert_right); | 627 assembler->Goto(&string_add_convert_right); |
| 627 } | 628 } |
| 628 | 629 |
| 629 assembler->Bind(&if_lhsisnotstring); | 630 assembler->Bind(&if_lhsisnotstring); |
| 630 { | 631 { |
| 631 // Check if {rhs} is a Smi. | 632 // Check if {rhs} is a Smi. |
| 632 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); | 633 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); |
| 633 assembler->Branch(assembler->WordIsSmi(rhs), &if_rhsissmi, | 634 assembler->Branch(assembler->TaggedIsSmi(rhs), &if_rhsissmi, |
| 634 &if_rhsisnotsmi); | 635 &if_rhsisnotsmi); |
| 635 | 636 |
| 636 assembler->Bind(&if_rhsissmi); | 637 assembler->Bind(&if_rhsissmi); |
| 637 { | 638 { |
| 638 // Check if {lhs} is a Number. | 639 // Check if {lhs} is a Number. |
| 639 Label if_lhsisnumber(assembler), | 640 Label if_lhsisnumber(assembler), |
| 640 if_lhsisnotnumber(assembler, Label::kDeferred); | 641 if_lhsisnotnumber(assembler, Label::kDeferred); |
| 641 assembler->Branch(assembler->Word32Equal( | 642 assembler->Branch(assembler->Word32Equal( |
| 642 lhs_instance_type, | 643 lhs_instance_type, |
| 643 assembler->Int32Constant(HEAP_NUMBER_TYPE)), | 644 assembler->Int32Constant(HEAP_NUMBER_TYPE)), |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 865 var_rhs.Bind(right); | 866 var_rhs.Bind(right); |
| 866 assembler->Goto(&loop); | 867 assembler->Goto(&loop); |
| 867 assembler->Bind(&loop); | 868 assembler->Bind(&loop); |
| 868 { | 869 { |
| 869 // Load the current {lhs} and {rhs} values. | 870 // Load the current {lhs} and {rhs} values. |
| 870 Node* lhs = var_lhs.value(); | 871 Node* lhs = var_lhs.value(); |
| 871 Node* rhs = var_rhs.value(); | 872 Node* rhs = var_rhs.value(); |
| 872 | 873 |
| 873 // Check if the {lhs} is a Smi or a HeapObject. | 874 // Check if the {lhs} is a Smi or a HeapObject. |
| 874 Label if_lhsissmi(assembler), if_lhsisnotsmi(assembler); | 875 Label if_lhsissmi(assembler), if_lhsisnotsmi(assembler); |
| 875 assembler->Branch(assembler->WordIsSmi(lhs), &if_lhsissmi, &if_lhsisnotsmi); | 876 assembler->Branch(assembler->TaggedIsSmi(lhs), &if_lhsissmi, |
| 877 &if_lhsisnotsmi); |
| 876 | 878 |
| 877 assembler->Bind(&if_lhsissmi); | 879 assembler->Bind(&if_lhsissmi); |
| 878 { | 880 { |
| 879 // Check if the {rhs} is also a Smi. | 881 // Check if the {rhs} is also a Smi. |
| 880 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); | 882 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); |
| 881 assembler->Branch(assembler->WordIsSmi(rhs), &if_rhsissmi, | 883 assembler->Branch(assembler->TaggedIsSmi(rhs), &if_rhsissmi, |
| 882 &if_rhsisnotsmi); | 884 &if_rhsisnotsmi); |
| 883 | 885 |
| 884 assembler->Bind(&if_rhsissmi); | 886 assembler->Bind(&if_rhsissmi); |
| 885 { | 887 { |
| 886 // Try a fast Smi subtraction first. | 888 // Try a fast Smi subtraction first. |
| 887 Node* pair = assembler->SmiSubWithOverflow(lhs, rhs); | 889 Node* pair = assembler->SmiSubWithOverflow(lhs, rhs); |
| 888 Node* overflow = assembler->Projection(1, pair); | 890 Node* overflow = assembler->Projection(1, pair); |
| 889 | 891 |
| 890 // Check if the Smi subtraction overflowed. | 892 // Check if the Smi subtraction overflowed. |
| 891 Label if_overflow(assembler), if_notoverflow(assembler); | 893 Label if_overflow(assembler), if_notoverflow(assembler); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 943 Label if_lhsisnumber(assembler), | 945 Label if_lhsisnumber(assembler), |
| 944 if_lhsisnotnumber(assembler, Label::kDeferred); | 946 if_lhsisnotnumber(assembler, Label::kDeferred); |
| 945 Node* number_map = assembler->HeapNumberMapConstant(); | 947 Node* number_map = assembler->HeapNumberMapConstant(); |
| 946 assembler->Branch(assembler->WordEqual(lhs_map, number_map), | 948 assembler->Branch(assembler->WordEqual(lhs_map, number_map), |
| 947 &if_lhsisnumber, &if_lhsisnotnumber); | 949 &if_lhsisnumber, &if_lhsisnotnumber); |
| 948 | 950 |
| 949 assembler->Bind(&if_lhsisnumber); | 951 assembler->Bind(&if_lhsisnumber); |
| 950 { | 952 { |
| 951 // Check if the {rhs} is a Smi. | 953 // Check if the {rhs} is a Smi. |
| 952 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); | 954 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); |
| 953 assembler->Branch(assembler->WordIsSmi(rhs), &if_rhsissmi, | 955 assembler->Branch(assembler->TaggedIsSmi(rhs), &if_rhsissmi, |
| 954 &if_rhsisnotsmi); | 956 &if_rhsisnotsmi); |
| 955 | 957 |
| 956 assembler->Bind(&if_rhsissmi); | 958 assembler->Bind(&if_rhsissmi); |
| 957 { | 959 { |
| 958 // Perform a floating point subtraction. | 960 // Perform a floating point subtraction. |
| 959 var_fsub_lhs.Bind(assembler->LoadHeapNumberValue(lhs)); | 961 var_fsub_lhs.Bind(assembler->LoadHeapNumberValue(lhs)); |
| 960 var_fsub_rhs.Bind(assembler->SmiToFloat64(rhs)); | 962 var_fsub_rhs.Bind(assembler->SmiToFloat64(rhs)); |
| 961 assembler->Goto(&do_fsub); | 963 assembler->Goto(&do_fsub); |
| 962 } | 964 } |
| 963 | 965 |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1038 Label loop(assembler, 2, loop_variables); | 1040 Label loop(assembler, 2, loop_variables); |
| 1039 var_lhs.Bind(left); | 1041 var_lhs.Bind(left); |
| 1040 var_rhs.Bind(right); | 1042 var_rhs.Bind(right); |
| 1041 assembler->Goto(&loop); | 1043 assembler->Goto(&loop); |
| 1042 assembler->Bind(&loop); | 1044 assembler->Bind(&loop); |
| 1043 { | 1045 { |
| 1044 Node* lhs = var_lhs.value(); | 1046 Node* lhs = var_lhs.value(); |
| 1045 Node* rhs = var_rhs.value(); | 1047 Node* rhs = var_rhs.value(); |
| 1046 | 1048 |
| 1047 Label lhs_is_smi(assembler), lhs_is_not_smi(assembler); | 1049 Label lhs_is_smi(assembler), lhs_is_not_smi(assembler); |
| 1048 assembler->Branch(assembler->WordIsSmi(lhs), &lhs_is_smi, &lhs_is_not_smi); | 1050 assembler->Branch(assembler->TaggedIsSmi(lhs), &lhs_is_smi, |
| 1051 &lhs_is_not_smi); |
| 1049 | 1052 |
| 1050 assembler->Bind(&lhs_is_smi); | 1053 assembler->Bind(&lhs_is_smi); |
| 1051 { | 1054 { |
| 1052 Label rhs_is_smi(assembler), rhs_is_not_smi(assembler); | 1055 Label rhs_is_smi(assembler), rhs_is_not_smi(assembler); |
| 1053 assembler->Branch(assembler->WordIsSmi(rhs), &rhs_is_smi, | 1056 assembler->Branch(assembler->TaggedIsSmi(rhs), &rhs_is_smi, |
| 1054 &rhs_is_not_smi); | 1057 &rhs_is_not_smi); |
| 1055 | 1058 |
| 1056 assembler->Bind(&rhs_is_smi); | 1059 assembler->Bind(&rhs_is_smi); |
| 1057 { | 1060 { |
| 1058 // Both {lhs} and {rhs} are Smis. The result is not necessarily a smi, | 1061 // Both {lhs} and {rhs} are Smis. The result is not necessarily a smi, |
| 1059 // in case of overflow. | 1062 // in case of overflow. |
| 1060 var_result.Bind(assembler->SmiMul(lhs, rhs)); | 1063 var_result.Bind(assembler->SmiMul(lhs, rhs)); |
| 1061 assembler->Goto(&return_result); | 1064 assembler->Goto(&return_result); |
| 1062 } | 1065 } |
| 1063 | 1066 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1096 // Check if {lhs} is a HeapNumber. | 1099 // Check if {lhs} is a HeapNumber. |
| 1097 Label lhs_is_number(assembler), | 1100 Label lhs_is_number(assembler), |
| 1098 lhs_is_not_number(assembler, Label::kDeferred); | 1101 lhs_is_not_number(assembler, Label::kDeferred); |
| 1099 assembler->Branch(assembler->WordEqual(lhs_map, number_map), | 1102 assembler->Branch(assembler->WordEqual(lhs_map, number_map), |
| 1100 &lhs_is_number, &lhs_is_not_number); | 1103 &lhs_is_number, &lhs_is_not_number); |
| 1101 | 1104 |
| 1102 assembler->Bind(&lhs_is_number); | 1105 assembler->Bind(&lhs_is_number); |
| 1103 { | 1106 { |
| 1104 // Check if {rhs} is a Smi. | 1107 // Check if {rhs} is a Smi. |
| 1105 Label rhs_is_smi(assembler), rhs_is_not_smi(assembler); | 1108 Label rhs_is_smi(assembler), rhs_is_not_smi(assembler); |
| 1106 assembler->Branch(assembler->WordIsSmi(rhs), &rhs_is_smi, | 1109 assembler->Branch(assembler->TaggedIsSmi(rhs), &rhs_is_smi, |
| 1107 &rhs_is_not_smi); | 1110 &rhs_is_not_smi); |
| 1108 | 1111 |
| 1109 assembler->Bind(&rhs_is_smi); | 1112 assembler->Bind(&rhs_is_smi); |
| 1110 { | 1113 { |
| 1111 // Convert {rhs} to a double and multiply it with the value of {lhs}. | 1114 // Convert {rhs} to a double and multiply it with the value of {lhs}. |
| 1112 var_lhs_float64.Bind(assembler->LoadHeapNumberValue(lhs)); | 1115 var_lhs_float64.Bind(assembler->LoadHeapNumberValue(lhs)); |
| 1113 var_rhs_float64.Bind(assembler->SmiToFloat64(rhs)); | 1116 var_rhs_float64.Bind(assembler->SmiToFloat64(rhs)); |
| 1114 assembler->Goto(&do_fmul); | 1117 assembler->Goto(&do_fmul); |
| 1115 } | 1118 } |
| 1116 | 1119 |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1191 Label loop(assembler, 2, loop_variables); | 1194 Label loop(assembler, 2, loop_variables); |
| 1192 var_dividend.Bind(left); | 1195 var_dividend.Bind(left); |
| 1193 var_divisor.Bind(right); | 1196 var_divisor.Bind(right); |
| 1194 assembler->Goto(&loop); | 1197 assembler->Goto(&loop); |
| 1195 assembler->Bind(&loop); | 1198 assembler->Bind(&loop); |
| 1196 { | 1199 { |
| 1197 Node* dividend = var_dividend.value(); | 1200 Node* dividend = var_dividend.value(); |
| 1198 Node* divisor = var_divisor.value(); | 1201 Node* divisor = var_divisor.value(); |
| 1199 | 1202 |
| 1200 Label dividend_is_smi(assembler), dividend_is_not_smi(assembler); | 1203 Label dividend_is_smi(assembler), dividend_is_not_smi(assembler); |
| 1201 assembler->Branch(assembler->WordIsSmi(dividend), ÷nd_is_smi, | 1204 assembler->Branch(assembler->TaggedIsSmi(dividend), ÷nd_is_smi, |
| 1202 ÷nd_is_not_smi); | 1205 ÷nd_is_not_smi); |
| 1203 | 1206 |
| 1204 assembler->Bind(÷nd_is_smi); | 1207 assembler->Bind(÷nd_is_smi); |
| 1205 { | 1208 { |
| 1206 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); | 1209 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); |
| 1207 assembler->Branch(assembler->WordIsSmi(divisor), &divisor_is_smi, | 1210 assembler->Branch(assembler->TaggedIsSmi(divisor), &divisor_is_smi, |
| 1208 &divisor_is_not_smi); | 1211 &divisor_is_not_smi); |
| 1209 | 1212 |
| 1210 assembler->Bind(&divisor_is_smi); | 1213 assembler->Bind(&divisor_is_smi); |
| 1211 { | 1214 { |
| 1212 Label bailout(assembler); | 1215 Label bailout(assembler); |
| 1213 | 1216 |
| 1214 // Do floating point division if {divisor} is zero. | 1217 // Do floating point division if {divisor} is zero. |
| 1215 assembler->GotoIf( | 1218 assembler->GotoIf( |
| 1216 assembler->WordEqual(divisor, assembler->IntPtrConstant(0)), | 1219 assembler->WordEqual(divisor, assembler->IntPtrConstant(0)), |
| 1217 &bailout); | 1220 &bailout); |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1314 // Check if {dividend} is a HeapNumber. | 1317 // Check if {dividend} is a HeapNumber. |
| 1315 Label dividend_is_number(assembler), | 1318 Label dividend_is_number(assembler), |
| 1316 dividend_is_not_number(assembler, Label::kDeferred); | 1319 dividend_is_not_number(assembler, Label::kDeferred); |
| 1317 assembler->Branch(assembler->WordEqual(dividend_map, number_map), | 1320 assembler->Branch(assembler->WordEqual(dividend_map, number_map), |
| 1318 ÷nd_is_number, ÷nd_is_not_number); | 1321 ÷nd_is_number, ÷nd_is_not_number); |
| 1319 | 1322 |
| 1320 assembler->Bind(÷nd_is_number); | 1323 assembler->Bind(÷nd_is_number); |
| 1321 { | 1324 { |
| 1322 // Check if {divisor} is a Smi. | 1325 // Check if {divisor} is a Smi. |
| 1323 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); | 1326 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); |
| 1324 assembler->Branch(assembler->WordIsSmi(divisor), &divisor_is_smi, | 1327 assembler->Branch(assembler->TaggedIsSmi(divisor), &divisor_is_smi, |
| 1325 &divisor_is_not_smi); | 1328 &divisor_is_not_smi); |
| 1326 | 1329 |
| 1327 assembler->Bind(&divisor_is_smi); | 1330 assembler->Bind(&divisor_is_smi); |
| 1328 { | 1331 { |
| 1329 // Convert {divisor} to a double and use it for a floating point | 1332 // Convert {divisor} to a double and use it for a floating point |
| 1330 // division. | 1333 // division. |
| 1331 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend)); | 1334 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend)); |
| 1332 var_divisor_float64.Bind(assembler->SmiToFloat64(divisor)); | 1335 var_divisor_float64.Bind(assembler->SmiToFloat64(divisor)); |
| 1333 assembler->Goto(&do_fdiv); | 1336 assembler->Goto(&do_fdiv); |
| 1334 } | 1337 } |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1411 Label loop(assembler, 2, loop_variables); | 1414 Label loop(assembler, 2, loop_variables); |
| 1412 var_dividend.Bind(left); | 1415 var_dividend.Bind(left); |
| 1413 var_divisor.Bind(right); | 1416 var_divisor.Bind(right); |
| 1414 assembler->Goto(&loop); | 1417 assembler->Goto(&loop); |
| 1415 assembler->Bind(&loop); | 1418 assembler->Bind(&loop); |
| 1416 { | 1419 { |
| 1417 Node* dividend = var_dividend.value(); | 1420 Node* dividend = var_dividend.value(); |
| 1418 Node* divisor = var_divisor.value(); | 1421 Node* divisor = var_divisor.value(); |
| 1419 | 1422 |
| 1420 Label dividend_is_smi(assembler), dividend_is_not_smi(assembler); | 1423 Label dividend_is_smi(assembler), dividend_is_not_smi(assembler); |
| 1421 assembler->Branch(assembler->WordIsSmi(dividend), ÷nd_is_smi, | 1424 assembler->Branch(assembler->TaggedIsSmi(dividend), ÷nd_is_smi, |
| 1422 ÷nd_is_not_smi); | 1425 ÷nd_is_not_smi); |
| 1423 | 1426 |
| 1424 assembler->Bind(÷nd_is_smi); | 1427 assembler->Bind(÷nd_is_smi); |
| 1425 { | 1428 { |
| 1426 Label dividend_is_not_zero(assembler); | 1429 Label dividend_is_not_zero(assembler); |
| 1427 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); | 1430 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); |
| 1428 assembler->Branch(assembler->WordIsSmi(divisor), &divisor_is_smi, | 1431 assembler->Branch(assembler->TaggedIsSmi(divisor), &divisor_is_smi, |
| 1429 &divisor_is_not_smi); | 1432 &divisor_is_not_smi); |
| 1430 | 1433 |
| 1431 assembler->Bind(&divisor_is_smi); | 1434 assembler->Bind(&divisor_is_smi); |
| 1432 { | 1435 { |
| 1433 // Compute the modulus of two Smis. | 1436 // Compute the modulus of two Smis. |
| 1434 var_result.Bind(assembler->SmiMod(dividend, divisor)); | 1437 var_result.Bind(assembler->SmiMod(dividend, divisor)); |
| 1435 assembler->Goto(&return_result); | 1438 assembler->Goto(&return_result); |
| 1436 } | 1439 } |
| 1437 | 1440 |
| 1438 assembler->Bind(&divisor_is_not_smi); | 1441 assembler->Bind(&divisor_is_not_smi); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1472 // Check if {dividend} is a HeapNumber. | 1475 // Check if {dividend} is a HeapNumber. |
| 1473 Label dividend_is_number(assembler), | 1476 Label dividend_is_number(assembler), |
| 1474 dividend_is_not_number(assembler, Label::kDeferred); | 1477 dividend_is_not_number(assembler, Label::kDeferred); |
| 1475 assembler->Branch(assembler->WordEqual(dividend_map, number_map), | 1478 assembler->Branch(assembler->WordEqual(dividend_map, number_map), |
| 1476 ÷nd_is_number, ÷nd_is_not_number); | 1479 ÷nd_is_number, ÷nd_is_not_number); |
| 1477 | 1480 |
| 1478 assembler->Bind(÷nd_is_number); | 1481 assembler->Bind(÷nd_is_number); |
| 1479 { | 1482 { |
| 1480 // Check if {divisor} is a Smi. | 1483 // Check if {divisor} is a Smi. |
| 1481 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); | 1484 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); |
| 1482 assembler->Branch(assembler->WordIsSmi(divisor), &divisor_is_smi, | 1485 assembler->Branch(assembler->TaggedIsSmi(divisor), &divisor_is_smi, |
| 1483 &divisor_is_not_smi); | 1486 &divisor_is_not_smi); |
| 1484 | 1487 |
| 1485 assembler->Bind(&divisor_is_smi); | 1488 assembler->Bind(&divisor_is_smi); |
| 1486 { | 1489 { |
| 1487 // Convert {divisor} to a double and compute {dividend}'s modulus with | 1490 // Convert {divisor} to a double and compute {dividend}'s modulus with |
| 1488 // it. | 1491 // it. |
| 1489 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend)); | 1492 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend)); |
| 1490 var_divisor_float64.Bind(assembler->SmiToFloat64(divisor)); | 1493 var_divisor_float64.Bind(assembler->SmiToFloat64(divisor)); |
| 1491 assembler->Goto(&do_fmod); | 1494 assembler->Goto(&do_fmod); |
| 1492 } | 1495 } |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1701 compiler::Node* lhs = assembler->Parameter(0); | 1704 compiler::Node* lhs = assembler->Parameter(0); |
| 1702 compiler::Node* rhs = assembler->Parameter(1); | 1705 compiler::Node* rhs = assembler->Parameter(1); |
| 1703 compiler::Node* context = assembler->Parameter(2); | 1706 compiler::Node* context = assembler->Parameter(2); |
| 1704 | 1707 |
| 1705 assembler->Return(assembler->StrictEqual(CodeStubAssembler::kNegateResult, | 1708 assembler->Return(assembler->StrictEqual(CodeStubAssembler::kNegateResult, |
| 1706 lhs, rhs, context)); | 1709 lhs, rhs, context)); |
| 1707 } | 1710 } |
| 1708 | 1711 |
| 1709 } // namespace internal | 1712 } // namespace internal |
| 1710 } // namespace v8 | 1713 } // namespace v8 |
| OLD | NEW |