OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 | 197 |
198 | 198 |
199 template <class Stub> | 199 template <class Stub> |
200 class CodeStubGraphBuilder: public CodeStubGraphBuilderBase { | 200 class CodeStubGraphBuilder: public CodeStubGraphBuilderBase { |
201 public: | 201 public: |
202 explicit CodeStubGraphBuilder(Stub* stub) | 202 explicit CodeStubGraphBuilder(Stub* stub) |
203 : CodeStubGraphBuilderBase(Isolate::Current(), stub) {} | 203 : CodeStubGraphBuilderBase(Isolate::Current(), stub) {} |
204 | 204 |
205 protected: | 205 protected: |
206 virtual HValue* BuildCodeStub() { | 206 virtual HValue* BuildCodeStub() { |
207 if (casted_stub()->IsMiss()) { | 207 if (casted_stub()->IsUninitialized()) { |
| 208 return BuildCodeUninitializedStub(); |
| 209 } else { |
208 return BuildCodeInitializedStub(); | 210 return BuildCodeInitializedStub(); |
209 } else { | |
210 return BuildCodeUninitializedStub(); | |
211 } | 211 } |
212 } | 212 } |
213 | 213 |
214 virtual HValue* BuildCodeInitializedStub() { | 214 virtual HValue* BuildCodeInitializedStub() { |
215 UNIMPLEMENTED(); | 215 UNIMPLEMENTED(); |
216 return NULL; | 216 return NULL; |
217 } | 217 } |
218 | 218 |
219 virtual HValue* BuildCodeUninitializedStub() { | 219 virtual HValue* BuildCodeUninitializedStub() { |
220 // Force a deopt that falls back to the runtime. | 220 // Force a deopt that falls back to the runtime. |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
269 template <class Stub> | 269 template <class Stub> |
270 static Handle<Code> DoGenerateCode(Stub* stub) { | 270 static Handle<Code> DoGenerateCode(Stub* stub) { |
271 Isolate* isolate = Isolate::Current(); | 271 Isolate* isolate = Isolate::Current(); |
272 CodeStub::Major major_key = | 272 CodeStub::Major major_key = |
273 static_cast<HydrogenCodeStub*>(stub)->MajorKey(); | 273 static_cast<HydrogenCodeStub*>(stub)->MajorKey(); |
274 CodeStubInterfaceDescriptor* descriptor = | 274 CodeStubInterfaceDescriptor* descriptor = |
275 isolate->code_stub_interface_descriptor(major_key); | 275 isolate->code_stub_interface_descriptor(major_key); |
276 if (descriptor->register_param_count_ < 0) { | 276 if (descriptor->register_param_count_ < 0) { |
277 stub->InitializeInterfaceDescriptor(isolate, descriptor); | 277 stub->InitializeInterfaceDescriptor(isolate, descriptor); |
278 } | 278 } |
279 // The miss case without stack parameters can use a light-weight stub to enter | 279 |
| 280 // If we are uninitialized we can use a light-weight stub to enter |
280 // the runtime that is significantly faster than using the standard | 281 // the runtime that is significantly faster than using the standard |
281 // stub-failure deopt mechanism. | 282 // stub-failure deopt mechanism. |
282 if (stub->IsMiss() && descriptor->stack_parameter_count_ == NULL) { | 283 if (stub->IsUninitialized() && descriptor->has_miss_handler()) { |
| 284 ASSERT(descriptor->stack_parameter_count_ == NULL); |
283 return stub->GenerateLightweightMissCode(isolate); | 285 return stub->GenerateLightweightMissCode(isolate); |
284 } else { | |
285 CodeStubGraphBuilder<Stub> builder(stub); | |
286 LChunk* chunk = OptimizeGraph(builder.CreateGraph()); | |
287 return chunk->Codegen(); | |
288 } | 286 } |
| 287 CodeStubGraphBuilder<Stub> builder(stub); |
| 288 LChunk* chunk = OptimizeGraph(builder.CreateGraph()); |
| 289 return chunk->Codegen(); |
289 } | 290 } |
290 | 291 |
291 | 292 |
292 template <> | 293 template <> |
293 HValue* CodeStubGraphBuilder<FastCloneShallowArrayStub>::BuildCodeStub() { | 294 HValue* CodeStubGraphBuilder<FastCloneShallowArrayStub>::BuildCodeStub() { |
294 Zone* zone = this->zone(); | 295 Zone* zone = this->zone(); |
295 Factory* factory = isolate()->factory(); | 296 Factory* factory = isolate()->factory(); |
296 HValue* undefined = graph()->GetConstantUndefined(); | 297 HValue* undefined = graph()->GetConstantUndefined(); |
297 AllocationSiteMode alloc_site_mode = casted_stub()->allocation_site_mode(); | 298 AllocationSiteMode alloc_site_mode = casted_stub()->allocation_site_mode(); |
298 FastCloneShallowArrayStub::Mode mode = casted_stub()->mode(); | 299 FastCloneShallowArrayStub::Mode mode = casted_stub()->mode(); |
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
651 return new_object; | 652 return new_object; |
652 } | 653 } |
653 | 654 |
654 | 655 |
655 Handle<Code> ArrayNArgumentsConstructorStub::GenerateCode() { | 656 Handle<Code> ArrayNArgumentsConstructorStub::GenerateCode() { |
656 return DoGenerateCode(this); | 657 return DoGenerateCode(this); |
657 } | 658 } |
658 | 659 |
659 | 660 |
660 template <> | 661 template <> |
661 HValue* CodeStubGraphBuilder<CompareNilICStub>::BuildCodeUninitializedStub() { | 662 HValue* CodeStubGraphBuilder<CompareNilICStub>::BuildCodeInitializedStub() { |
662 CompareNilICStub* stub = casted_stub(); | 663 CompareNilICStub* stub = casted_stub(); |
663 HIfContinuation continuation; | 664 HIfContinuation continuation; |
664 Handle<Map> sentinel_map(graph()->isolate()->heap()->meta_map()); | 665 Handle<Map> sentinel_map(graph()->isolate()->heap()->meta_map()); |
665 BuildCompareNil(GetParameter(0), stub->GetKind(), | 666 BuildCompareNil(GetParameter(0), stub->GetKind(), |
666 stub->GetTypes(), sentinel_map, | 667 stub->GetTypes(), sentinel_map, |
667 RelocInfo::kNoPosition, &continuation); | 668 RelocInfo::kNoPosition, &continuation); |
668 IfBuilder if_nil(this, &continuation); | 669 IfBuilder if_nil(this, &continuation); |
669 if_nil.Then(); | 670 if_nil.Then(); |
670 if (continuation.IsFalseReachable()) { | 671 if (continuation.IsFalseReachable()) { |
671 if_nil.Else(); | 672 if_nil.Else(); |
672 if_nil.Return(graph()->GetConstantSmi0()); | 673 if_nil.Return(graph()->GetConstantSmi0()); |
673 } | 674 } |
674 if_nil.End(); | 675 if_nil.End(); |
675 return continuation.IsTrueReachable() | 676 return continuation.IsTrueReachable() |
676 ? graph()->GetConstantSmi1() | 677 ? graph()->GetConstantSmi1() |
677 : graph()->GetConstantUndefined(); | 678 : graph()->GetConstantUndefined(); |
678 } | 679 } |
679 | 680 |
680 | 681 |
681 Handle<Code> CompareNilICStub::GenerateCode() { | 682 Handle<Code> CompareNilICStub::GenerateCode() { |
682 return DoGenerateCode(this); | 683 return DoGenerateCode(this); |
683 } | 684 } |
684 | 685 |
685 } } // namespace v8::internal | 686 } } // namespace v8::internal |
OLD | NEW |