v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
builtins-global-gen.cc
Go to the documentation of this file.
1// Copyright 2017 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
8
9namespace v8 {
10namespace internal {
11
13
14// ES #sec-isfinite-number
15TF_BUILTIN(GlobalIsFinite, CodeStubAssembler) {
16 auto context = Parameter<Context>(Descriptor::kContext);
17
18 Label return_true(this), return_false(this);
19
20 // We might need to loop once for ToNumber conversion.
21 TVARIABLE(Object, var_num);
22 Label loop(this, &var_num);
23 var_num = Parameter<Object>(Descriptor::kNumber);
24 Goto(&loop);
25 BIND(&loop);
26 {
27 TNode<Object> num = var_num.value();
28
29 // Check if {num} is a Smi or a HeapObject.
30 GotoIf(TaggedIsSmi(num), &return_true);
31 TNode<HeapObject> num_heap_object = CAST(num);
32
33 // Check if {num_heap_object} is a HeapNumber.
34 Label if_numisheapnumber(this),
35 if_numisnotheapnumber(this, Label::kDeferred);
36 Branch(IsHeapNumber(num_heap_object), &if_numisheapnumber,
37 &if_numisnotheapnumber);
38
39 BIND(&if_numisheapnumber);
40 {
41 // Check if {num_heap_object} contains a finite, non-NaN value.
42 TNode<Float64T> num_value = LoadHeapNumberValue(num_heap_object);
43 BranchIfFloat64IsNaN(Float64Sub(num_value, num_value), &return_false,
44 &return_true);
45 }
46
47 BIND(&if_numisnotheapnumber);
48 {
49 // Need to convert {num_heap_object} to a Number first.
50 var_num =
51 CallBuiltin(Builtin::kNonNumberToNumber, context, num_heap_object);
52 Goto(&loop);
53 }
54 }
55
56 BIND(&return_true);
57 Return(TrueConstant());
58
59 BIND(&return_false);
60 Return(FalseConstant());
61}
62
63// ES6 #sec-isnan-number
65 auto context = Parameter<Context>(Descriptor::kContext);
66
67 Label return_true(this), return_false(this);
68
69 // We might need to loop once for ToNumber conversion.
70 TVARIABLE(Object, var_num);
71 Label loop(this, &var_num);
72 var_num = Parameter<Object>(Descriptor::kNumber);
73 Goto(&loop);
74 BIND(&loop);
75 {
76 TNode<Object> num = var_num.value();
77
78 // Check if {num} is a Smi or a HeapObject.
79 GotoIf(TaggedIsSmi(num), &return_false);
80 TNode<HeapObject> num_heap_object = CAST(num);
81
82 // Check if {num_heap_object} is a HeapNumber.
83 Label if_numisheapnumber(this),
84 if_numisnotheapnumber(this, Label::kDeferred);
85 Branch(IsHeapNumber(num_heap_object), &if_numisheapnumber,
86 &if_numisnotheapnumber);
87
88 BIND(&if_numisheapnumber);
89 {
90 // Check if {num_heap_object} contains a NaN.
91 TNode<Float64T> num_value = LoadHeapNumberValue(num_heap_object);
92 BranchIfFloat64IsNaN(num_value, &return_true, &return_false);
93 }
94
95 BIND(&if_numisnotheapnumber);
96 {
97 // Need to convert {num_heap_object} to a Number first.
98 var_num =
99 CallBuiltin(Builtin::kNonNumberToNumber, context, num_heap_object);
100 Goto(&loop);
101 }
102 }
103
104 BIND(&return_true);
105 Return(TrueConstant());
106
107 BIND(&return_false);
108 Return(FalseConstant());
109}
110
112
113} // namespace internal
114} // namespace v8
#define BIND(label)
#define TVARIABLE(...)
#define TF_BUILTIN(Name, AssemblerBase)
#define CAST(x)