Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Side by Side Diff: src/builtins/builtins-number.cc

Issue 2424403002: [builtins] Migrate Number.parseInt to TurboFan builtin. (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/builtins/builtins.h ('k') | src/js/v8natives.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 {
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 // TODO(bmeurer): This could be more efficient if necessary. 249 // TODO(bmeurer): This could be more efficient if necessary.
250 Callable callable = CodeFactory::ToString(assembler->isolate()); 250 Callable callable = CodeFactory::ToString(assembler->isolate());
251 var_input.Bind(assembler->CallStub(callable, context, input)); 251 var_input.Bind(assembler->CallStub(callable, context, input));
252 assembler->Goto(&loop); 252 assembler->Goto(&loop);
253 } 253 }
254 } 254 }
255 } 255 }
256 } 256 }
257 } 257 }
258 258
259 // ES6 section 20.1.2.13 Number.parseInt ( string, radix )
260 void Builtins::Generate_NumberParseInt(CodeStubAssembler* assembler) {
261 typedef CodeStubAssembler::Label Label;
262 typedef compiler::Node Node;
263
264 Node* input = assembler->Parameter(1);
265 Node* radix = assembler->Parameter(2);
266 Node* context = assembler->Parameter(5);
267
268 // Check if {radix} is treated as 10 (i.e. undefined, 0 or 10).
269 Label if_radix10(assembler), if_generic(assembler, Label::kDeferred);
270 assembler->GotoIf(assembler->WordEqual(radix, assembler->UndefinedConstant()),
271 &if_radix10);
272 assembler->GotoIf(
273 assembler->WordEqual(radix, assembler->SmiConstant(Smi::FromInt(10))),
274 &if_radix10);
275 assembler->GotoIf(
276 assembler->WordEqual(radix, assembler->SmiConstant(Smi::FromInt(0))),
277 &if_radix10);
278 assembler->Goto(&if_generic);
279
280 assembler->Bind(&if_radix10);
281 {
282 // Check if we can avoid the ToString conversion on {input}.
283 Label if_inputissmi(assembler), if_inputisheapnumber(assembler),
284 if_inputisstring(assembler);
285 assembler->GotoIf(assembler->TaggedIsSmi(input), &if_inputissmi);
286 Node* input_map = assembler->LoadMap(input);
287 assembler->GotoIf(
288 assembler->WordEqual(input_map, assembler->UndefinedConstant()),
289 &if_inputisheapnumber);
290 Node* input_instance_type = assembler->LoadMapInstanceType(input_map);
291 assembler->Branch(assembler->IsStringInstanceType(input_instance_type),
292 &if_inputisstring, &if_generic);
293
294 assembler->Bind(&if_inputissmi);
295 {
296 // Just return the {input}.
297 assembler->Return(input);
298 }
299
300 assembler->Bind(&if_inputisheapnumber);
301 {
302 // Check if the absolute {input} value is in the ]0.01,1e9[ range.
303 Node* input_value = assembler->LoadHeapNumberValue(input);
304 Node* input_value_abs = assembler->Float64Abs(input_value);
305
306 assembler->GotoIf(assembler->Float64LessThan(
307 input_value_abs, assembler->Float64Constant(0.01)),
308 &if_generic);
309 assembler->GotoIf(assembler->Float64LessThan(
310 assembler->Float64Constant(1e9), input_value_abs),
311 &if_generic);
312
313 // Return the truncated int32 value, and return the tagged result.
314 Node* input_value32 = assembler->TruncateFloat64ToWord32(input_value);
315 Node* result = assembler->SmiFromWord32(input_value32);
316 assembler->Return(result);
317 }
318
319 assembler->Bind(&if_inputisstring);
320 {
321 // Check if the String {input} has a cached array index.
322 Node* input_hash = assembler->LoadNameHashField(input);
323 Node* input_bit = assembler->Word32And(
324 input_hash,
325 assembler->Int32Constant(String::kContainsCachedArrayIndexMask));
326 assembler->GotoIf(
327 assembler->Word32NotEqual(input_bit, assembler->Int32Constant(0)),
328 &if_generic);
329
330 // Return the cached array index as result.
331 Node* input_index =
332 assembler->BitFieldDecode<String::ArrayIndexValueBits>(input_hash);
333 Node* result = assembler->SmiTag(input_index);
334 assembler->Return(result);
335 }
336 }
337
338 assembler->Bind(&if_generic);
339 {
340 Node* result =
341 assembler->CallRuntime(Runtime::kStringParseInt, context, input, radix);
342 assembler->Return(result);
343 }
344 }
345
259 // ES6 section 20.1.3.2 Number.prototype.toExponential ( fractionDigits ) 346 // ES6 section 20.1.3.2 Number.prototype.toExponential ( fractionDigits )
260 BUILTIN(NumberPrototypeToExponential) { 347 BUILTIN(NumberPrototypeToExponential) {
261 HandleScope scope(isolate); 348 HandleScope scope(isolate);
262 Handle<Object> value = args.at<Object>(0); 349 Handle<Object> value = args.at<Object>(0);
263 Handle<Object> fraction_digits = args.atOrUndefined(isolate, 1); 350 Handle<Object> fraction_digits = args.atOrUndefined(isolate, 1);
264 351
265 // Unwrap the receiver {value}. 352 // Unwrap the receiver {value}.
266 if (value->IsJSValue()) { 353 if (value->IsJSValue()) {
267 value = handle(Handle<JSValue>::cast(value)->value(), isolate); 354 value = handle(Handle<JSValue>::cast(value)->value(), isolate);
268 } 355 }
(...skipping 1441 matching lines...) Expand 10 before | Expand all | Expand 10 after
1710 compiler::Node* lhs = assembler->Parameter(0); 1797 compiler::Node* lhs = assembler->Parameter(0);
1711 compiler::Node* rhs = assembler->Parameter(1); 1798 compiler::Node* rhs = assembler->Parameter(1);
1712 compiler::Node* context = assembler->Parameter(2); 1799 compiler::Node* context = assembler->Parameter(2);
1713 1800
1714 assembler->Return(assembler->StrictEqual(CodeStubAssembler::kNegateResult, 1801 assembler->Return(assembler->StrictEqual(CodeStubAssembler::kNegateResult,
1715 lhs, rhs, context)); 1802 lhs, rhs, context));
1716 } 1803 }
1717 1804
1718 } // namespace internal 1805 } // namespace internal
1719 } // namespace v8 1806 } // namespace v8
OLDNEW
« no previous file with comments | « src/builtins/builtins.h ('k') | src/js/v8natives.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698