| 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 #include "src/code-stub-assembler.h" | 8 #include "src/code-stub-assembler.h" |
| 9 #include "src/compiler.h" | 9 #include "src/compiler.h" |
| 10 #include "src/counters.h" | 10 #include "src/counters.h" |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 isolate, function, | 97 isolate, function, |
| 98 Compiler::GetFunctionFromString(handle(target->native_context(), isolate), | 98 Compiler::GetFunctionFromString(handle(target->native_context(), isolate), |
| 99 Handle<String>::cast(x), | 99 Handle<String>::cast(x), |
| 100 NO_PARSE_RESTRICTION, kNoSourcePosition)); | 100 NO_PARSE_RESTRICTION, kNoSourcePosition)); |
| 101 RETURN_RESULT_OR_FAILURE( | 101 RETURN_RESULT_OR_FAILURE( |
| 102 isolate, | 102 isolate, |
| 103 Execution::Call(isolate, function, target_global_proxy, 0, nullptr)); | 103 Execution::Call(isolate, function, target_global_proxy, 0, nullptr)); |
| 104 } | 104 } |
| 105 | 105 |
| 106 // ES6 section 18.2.2 isFinite ( number ) | 106 // ES6 section 18.2.2 isFinite ( number ) |
| 107 void Builtins::Generate_GlobalIsFinite(compiler::CodeAssemblerState* state) { | 107 TF_BUILTIN(GlobalIsFinite, CodeStubAssembler) { |
| 108 typedef CodeStubAssembler::Label Label; | 108 Node* context = Parameter(4); |
| 109 typedef compiler::Node Node; | |
| 110 typedef CodeStubAssembler::Variable Variable; | |
| 111 CodeStubAssembler assembler(state); | |
| 112 | 109 |
| 113 Node* context = assembler.Parameter(4); | 110 Label return_true(this), return_false(this); |
| 114 | |
| 115 Label return_true(&assembler), return_false(&assembler); | |
| 116 | 111 |
| 117 // We might need to loop once for ToNumber conversion. | 112 // We might need to loop once for ToNumber conversion. |
| 118 Variable var_num(&assembler, MachineRepresentation::kTagged); | 113 Variable var_num(this, MachineRepresentation::kTagged); |
| 119 Label loop(&assembler, &var_num); | 114 Label loop(this, &var_num); |
| 120 var_num.Bind(assembler.Parameter(1)); | 115 var_num.Bind(Parameter(1)); |
| 121 assembler.Goto(&loop); | 116 Goto(&loop); |
| 122 assembler.Bind(&loop); | 117 Bind(&loop); |
| 123 { | 118 { |
| 124 // Load the current {num} value. | |
| 125 Node* num = var_num.value(); | 119 Node* num = var_num.value(); |
| 126 | 120 |
| 127 // Check if {num} is a Smi or a HeapObject. | 121 // Check if {num} is a Smi or a HeapObject. |
| 128 assembler.GotoIf(assembler.TaggedIsSmi(num), &return_true); | 122 GotoIf(TaggedIsSmi(num), &return_true); |
| 129 | 123 |
| 130 // Check if {num} is a HeapNumber. | 124 // Check if {num} is a HeapNumber. |
| 131 Label if_numisheapnumber(&assembler), | 125 Label if_numisheapnumber(this), |
| 132 if_numisnotheapnumber(&assembler, Label::kDeferred); | 126 if_numisnotheapnumber(this, Label::kDeferred); |
| 133 assembler.Branch(assembler.IsHeapNumberMap(assembler.LoadMap(num)), | 127 Branch(IsHeapNumberMap(LoadMap(num)), &if_numisheapnumber, |
| 134 &if_numisheapnumber, &if_numisnotheapnumber); | 128 &if_numisnotheapnumber); |
| 135 | 129 |
| 136 assembler.Bind(&if_numisheapnumber); | 130 Bind(&if_numisheapnumber); |
| 137 { | 131 { |
| 138 // Check if {num} contains a finite, non-NaN value. | 132 // Check if {num} contains a finite, non-NaN value. |
| 139 Node* num_value = assembler.LoadHeapNumberValue(num); | 133 Node* num_value = LoadHeapNumberValue(num); |
| 140 assembler.BranchIfFloat64IsNaN(assembler.Float64Sub(num_value, num_value), | 134 BranchIfFloat64IsNaN(Float64Sub(num_value, num_value), &return_false, |
| 141 &return_false, &return_true); | 135 &return_true); |
| 142 } | 136 } |
| 143 | 137 |
| 144 assembler.Bind(&if_numisnotheapnumber); | 138 Bind(&if_numisnotheapnumber); |
| 145 { | 139 { |
| 146 // Need to convert {num} to a Number first. | 140 // Need to convert {num} to a Number first. |
| 147 Callable callable = CodeFactory::NonNumberToNumber(assembler.isolate()); | 141 Callable callable = CodeFactory::NonNumberToNumber(isolate()); |
| 148 var_num.Bind(assembler.CallStub(callable, context, num)); | 142 var_num.Bind(CallStub(callable, context, num)); |
| 149 assembler.Goto(&loop); | 143 Goto(&loop); |
| 150 } | 144 } |
| 151 } | 145 } |
| 152 | 146 |
| 153 assembler.Bind(&return_true); | 147 Bind(&return_true); |
| 154 assembler.Return(assembler.BooleanConstant(true)); | 148 Return(BooleanConstant(true)); |
| 155 | 149 |
| 156 assembler.Bind(&return_false); | 150 Bind(&return_false); |
| 157 assembler.Return(assembler.BooleanConstant(false)); | 151 Return(BooleanConstant(false)); |
| 158 } | 152 } |
| 159 | 153 |
| 160 // ES6 section 18.2.3 isNaN ( number ) | 154 // ES6 section 18.2.3 isNaN ( number ) |
| 161 void Builtins::Generate_GlobalIsNaN(compiler::CodeAssemblerState* state) { | 155 TF_BUILTIN(GlobalIsNaN, CodeStubAssembler) { |
| 162 typedef CodeStubAssembler::Label Label; | 156 Node* context = Parameter(4); |
| 163 typedef compiler::Node Node; | |
| 164 typedef CodeStubAssembler::Variable Variable; | |
| 165 CodeStubAssembler assembler(state); | |
| 166 | 157 |
| 167 Node* context = assembler.Parameter(4); | 158 Label return_true(this), return_false(this); |
| 168 | |
| 169 Label return_true(&assembler), return_false(&assembler); | |
| 170 | 159 |
| 171 // We might need to loop once for ToNumber conversion. | 160 // We might need to loop once for ToNumber conversion. |
| 172 Variable var_num(&assembler, MachineRepresentation::kTagged); | 161 Variable var_num(this, MachineRepresentation::kTagged); |
| 173 Label loop(&assembler, &var_num); | 162 Label loop(this, &var_num); |
| 174 var_num.Bind(assembler.Parameter(1)); | 163 var_num.Bind(Parameter(1)); |
| 175 assembler.Goto(&loop); | 164 Goto(&loop); |
| 176 assembler.Bind(&loop); | 165 Bind(&loop); |
| 177 { | 166 { |
| 178 // Load the current {num} value. | |
| 179 Node* num = var_num.value(); | 167 Node* num = var_num.value(); |
| 180 | 168 |
| 181 // Check if {num} is a Smi or a HeapObject. | 169 // Check if {num} is a Smi or a HeapObject. |
| 182 assembler.GotoIf(assembler.TaggedIsSmi(num), &return_false); | 170 GotoIf(TaggedIsSmi(num), &return_false); |
| 183 | 171 |
| 184 // Check if {num} is a HeapNumber. | 172 // Check if {num} is a HeapNumber. |
| 185 Label if_numisheapnumber(&assembler), | 173 Label if_numisheapnumber(this), |
| 186 if_numisnotheapnumber(&assembler, Label::kDeferred); | 174 if_numisnotheapnumber(this, Label::kDeferred); |
| 187 assembler.Branch(assembler.IsHeapNumberMap(assembler.LoadMap(num)), | 175 Branch(IsHeapNumberMap(LoadMap(num)), &if_numisheapnumber, |
| 188 &if_numisheapnumber, &if_numisnotheapnumber); | 176 &if_numisnotheapnumber); |
| 189 | 177 |
| 190 assembler.Bind(&if_numisheapnumber); | 178 Bind(&if_numisheapnumber); |
| 191 { | 179 { |
| 192 // Check if {num} contains a NaN. | 180 // Check if {num} contains a NaN. |
| 193 Node* num_value = assembler.LoadHeapNumberValue(num); | 181 Node* num_value = LoadHeapNumberValue(num); |
| 194 assembler.BranchIfFloat64IsNaN(num_value, &return_true, &return_false); | 182 BranchIfFloat64IsNaN(num_value, &return_true, &return_false); |
| 195 } | 183 } |
| 196 | 184 |
| 197 assembler.Bind(&if_numisnotheapnumber); | 185 Bind(&if_numisnotheapnumber); |
| 198 { | 186 { |
| 199 // Need to convert {num} to a Number first. | 187 // Need to convert {num} to a Number first. |
| 200 Callable callable = CodeFactory::NonNumberToNumber(assembler.isolate()); | 188 Callable callable = CodeFactory::NonNumberToNumber(isolate()); |
| 201 var_num.Bind(assembler.CallStub(callable, context, num)); | 189 var_num.Bind(CallStub(callable, context, num)); |
| 202 assembler.Goto(&loop); | 190 Goto(&loop); |
| 203 } | 191 } |
| 204 } | 192 } |
| 205 | 193 |
| 206 assembler.Bind(&return_true); | 194 Bind(&return_true); |
| 207 assembler.Return(assembler.BooleanConstant(true)); | 195 Return(BooleanConstant(true)); |
| 208 | 196 |
| 209 assembler.Bind(&return_false); | 197 Bind(&return_false); |
| 210 assembler.Return(assembler.BooleanConstant(false)); | 198 Return(BooleanConstant(false)); |
| 211 } | 199 } |
| 212 | 200 |
| 213 } // namespace internal | 201 } // namespace internal |
| 214 } // namespace v8 | 202 } // namespace v8 |
| OLD | NEW |