5 #include "src/compiler/js-graph.h" 7 #include "src/code-factory.h" 8 #include "src/compiler/node-properties.h" 9 #include "src/compiler/typer.h" 10 #include "src/objects-inl.h" 16 #define GET_CACHED_FIELD(ptr, expr) (*(ptr)) ? *(ptr) : (*(ptr) = (expr)) 18 #define DEFINE_GETTER(name, expr) \ 19 Node* JSGraph::name() { return GET_CACHED_FIELD(&name##_, expr); } 21 Node* JSGraph::CEntryStubConstant(
int result_size, SaveFPRegsMode save_doubles,
22 ArgvMode argv_mode,
bool builtin_exit_frame) {
23 if (save_doubles == kDontSaveFPRegs && argv_mode == kArgvOnStack) {
24 DCHECK(result_size >= 1 && result_size <= 3);
25 if (!builtin_exit_frame) {
27 if (result_size == 1) {
28 ptr = &CEntryStub1Constant_;
29 }
else if (result_size == 2) {
30 ptr = &CEntryStub2Constant_;
32 DCHECK_EQ(3, result_size);
33 ptr = &CEntryStub3Constant_;
35 return GET_CACHED_FIELD(ptr, HeapConstant(CodeFactory::CEntry(
36 isolate(), result_size, save_doubles,
37 argv_mode, builtin_exit_frame)));
39 Node** ptr = builtin_exit_frame ? &CEntryStub1WithBuiltinExitFrameConstant_
40 : &CEntryStub1Constant_;
41 return GET_CACHED_FIELD(ptr, HeapConstant(CodeFactory::CEntry(
42 isolate(), result_size, save_doubles,
43 argv_mode, builtin_exit_frame)));
45 return HeapConstant(CodeFactory::CEntry(isolate(), result_size, save_doubles,
46 argv_mode, builtin_exit_frame));
49 Node* JSGraph::Constant(Handle<Object> value) {
52 if (value->IsNumber()) {
53 return Constant(value->Number());
54 }
else if (value->IsUndefined(isolate())) {
55 return UndefinedConstant();
56 }
else if (value->IsTrue(isolate())) {
57 return TrueConstant();
58 }
else if (value->IsFalse(isolate())) {
59 return FalseConstant();
60 }
else if (value->IsNull(isolate())) {
61 return NullConstant();
62 }
else if (value->IsTheHole(isolate())) {
63 return TheHoleConstant();
65 return HeapConstant(Handle<HeapObject>::cast(value));
69 Node* JSGraph::Constant(
const ObjectRef& ref) {
70 if (ref.IsSmi())
return Constant(ref.AsSmi());
71 OddballType oddball_type =
72 ref.AsHeapObject().GetHeapObjectType().oddball_type();
73 if (ref.IsHeapNumber()) {
74 return Constant(ref.AsHeapNumber().value());
75 }
else if (oddball_type == OddballType::kUndefined) {
76 DCHECK(ref.object().equals(isolate()->factory()->undefined_value()));
77 return UndefinedConstant();
78 }
else if (oddball_type == OddballType::kNull) {
79 DCHECK(ref.object().equals(isolate()->factory()->null_value()));
80 return NullConstant();
81 }
else if (oddball_type == OddballType::kHole) {
82 DCHECK(ref.object().equals(isolate()->factory()->the_hole_value()));
83 return TheHoleConstant();
84 }
else if (oddball_type == OddballType::kBoolean) {
85 if (ref.object().equals(isolate()->factory()->true_value())) {
86 return TrueConstant();
88 DCHECK(ref.object().equals(isolate()->factory()->false_value()));
89 return FalseConstant();
92 return HeapConstant(ref.AsHeapObject().object());
96 Node* JSGraph::Constant(
double value) {
97 if (bit_cast<int64_t>(value) == bit_cast<int64_t>(0.0))
return ZeroConstant();
98 if (bit_cast<int64_t>(value) == bit_cast<int64_t>(1.0))
return OneConstant();
99 return NumberConstant(value);
102 Node* JSGraph::NumberConstant(
double value) {
103 Node** loc = cache_.FindNumberConstant(value);
104 if (*loc ==
nullptr) {
105 *loc = graph()->NewNode(common()->NumberConstant(value));
110 Node* JSGraph::HeapConstant(Handle<HeapObject> value) {
111 Node** loc = cache_.FindHeapConstant(value);
112 if (*loc ==
nullptr) {
113 *loc = graph()->NewNode(common()->HeapConstant(value));
118 void JSGraph::GetCachedNodes(NodeVector* nodes) {
119 cache_.GetCachedNodes(nodes);
120 #define DO_CACHED_FIELD(name) \ 121 if (name##_) nodes->push_back(name##_); 123 CACHED_GLOBAL_LIST(DO_CACHED_FIELD)
124 CACHED_CENTRY_LIST(DO_CACHED_FIELD)
125 #undef DO_CACHED_FIELD 128 DEFINE_GETTER(AllocateInNewSpaceStubConstant,
129 HeapConstant(BUILTIN_CODE(isolate(), AllocateInNewSpace)))
131 DEFINE_GETTER(AllocateInOldSpaceStubConstant,
132 HeapConstant(BUILTIN_CODE(isolate(), AllocateInOldSpace)))
134 DEFINE_GETTER(ArrayConstructorStubConstant,
135 HeapConstant(BUILTIN_CODE(isolate(), ArrayConstructorImpl)))
137 DEFINE_GETTER(BooleanMapConstant, HeapConstant(factory()->boolean_map()))
139 DEFINE_GETTER(ToNumberBuiltinConstant,
140 HeapConstant(BUILTIN_CODE(isolate(), ToNumber)))
142 DEFINE_GETTER(EmptyFixedArrayConstant,
143 HeapConstant(factory()->empty_fixed_array()))
145 DEFINE_GETTER(EmptyStringConstant, HeapConstant(factory()->empty_string()))
147 DEFINE_GETTER(FixedArrayMapConstant, HeapConstant(factory()->fixed_array_map()))
149 DEFINE_GETTER(PropertyArrayMapConstant,
150 HeapConstant(factory()->property_array_map()))
152 DEFINE_GETTER(FixedDoubleArrayMapConstant,
153 HeapConstant(factory()->fixed_double_array_map()))
155 DEFINE_GETTER(HeapNumberMapConstant, HeapConstant(factory()->heap_number_map()))
157 DEFINE_GETTER(OptimizedOutConstant, HeapConstant(factory()->optimized_out()))
159 DEFINE_GETTER(StaleRegisterConstant, HeapConstant(factory()->stale_register()))
161 DEFINE_GETTER(UndefinedConstant, HeapConstant(factory()->undefined_value()))
163 DEFINE_GETTER(TheHoleConstant, HeapConstant(factory()->the_hole_value()))
165 DEFINE_GETTER(TrueConstant, HeapConstant(factory()->true_value()))
167 DEFINE_GETTER(FalseConstant, HeapConstant(factory()->false_value()))
169 DEFINE_GETTER(NullConstant, HeapConstant(factory()->null_value()))
171 DEFINE_GETTER(ZeroConstant, NumberConstant(0.0))
173 DEFINE_GETTER(OneConstant, NumberConstant(1.0))
175 DEFINE_GETTER(MinusOneConstant, NumberConstant(-1.0))
177 DEFINE_GETTER(NaNConstant,
178 NumberConstant(
std::numeric_limits<
double>::quiet_NaN()))
180 DEFINE_GETTER(EmptyStateValues,
181 graph()->NewNode(common()->StateValues(0,
182 SparseInputMask::Dense())))
184 DEFINE_GETTER(SingleDeadTypedStateValues,
185 graph()->NewNode(common()->TypedStateValues(
186 new (graph()->zone()->New(sizeof(ZoneVector<MachineType>)))
187 ZoneVector<MachineType>(0, graph()->zone()),
188 SparseInputMask(SparseInputMask::kEndMarker << 1))))
191 #undef GET_CACHED_FIELD