Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/code-stubs.h" | 5 #include "src/code-stubs.h" |
| 6 | 6 |
| 7 #include "src/bailout-reason.h" | 7 #include "src/bailout-reason.h" |
| 8 #include "src/crankshaft/hydrogen.h" | 8 #include "src/crankshaft/hydrogen.h" |
| 9 #include "src/crankshaft/lithium.h" | 9 #include "src/crankshaft/lithium.h" |
| 10 #include "src/field-index.h" | 10 #include "src/field-index.h" |
| (...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 426 is_smi.End(); | 426 is_smi.End(); |
| 427 | 427 |
| 428 return environment()->Pop(); | 428 return environment()->Pop(); |
| 429 } | 429 } |
| 430 | 430 |
| 431 | 431 |
| 432 Handle<Code> TypeofStub::GenerateCode() { return DoGenerateCode(this); } | 432 Handle<Code> TypeofStub::GenerateCode() { return DoGenerateCode(this); } |
| 433 | 433 |
| 434 | 434 |
| 435 template <> | 435 template <> |
| 436 HValue* CodeStubGraphBuilder<FastCloneRegExpStub>::BuildCodeStub() { | |
| 437 HValue* closure = GetParameter(0); | |
| 438 HValue* literal_index = GetParameter(1); | |
| 439 | |
| 440 // This stub is very performance sensitive, the generated code must be tuned | |
| 441 // so that it doesn't build and eager frame. | |
|
Yang
2015/11/25 09:06:10
Haha! Found typo "build an eager frame" :)
| |
| 442 info()->MarkMustNotHaveEagerFrame(); | |
| 443 | |
| 444 HValue* literals_array = Add<HLoadNamedField>( | |
| 445 closure, nullptr, HObjectAccess::ForLiteralsPointer()); | |
| 446 HInstruction* boilerplate = Add<HLoadKeyed>( | |
| 447 literals_array, literal_index, nullptr, FAST_ELEMENTS, NEVER_RETURN_HOLE, | |
| 448 LiteralsArray::kOffsetToFirstLiteral - kHeapObjectTag); | |
| 449 | |
| 450 IfBuilder if_notundefined(this); | |
| 451 if_notundefined.IfNot<HCompareObjectEqAndBranch>( | |
| 452 boilerplate, graph()->GetConstantUndefined()); | |
| 453 if_notundefined.Then(); | |
| 454 { | |
| 455 int result_size = | |
| 456 JSRegExp::kSize + JSRegExp::kInObjectFieldCount * kPointerSize; | |
| 457 HValue* result = | |
| 458 Add<HAllocate>(Add<HConstant>(result_size), HType::JSObject(), | |
| 459 NOT_TENURED, JS_REGEXP_TYPE); | |
| 460 Add<HStoreNamedField>( | |
| 461 result, HObjectAccess::ForMap(), | |
| 462 Add<HLoadNamedField>(boilerplate, nullptr, HObjectAccess::ForMap())); | |
| 463 Add<HStoreNamedField>( | |
| 464 result, HObjectAccess::ForPropertiesPointer(), | |
| 465 Add<HLoadNamedField>(boilerplate, nullptr, | |
| 466 HObjectAccess::ForPropertiesPointer())); | |
| 467 Add<HStoreNamedField>( | |
| 468 result, HObjectAccess::ForElementsPointer(), | |
| 469 Add<HLoadNamedField>(boilerplate, nullptr, | |
| 470 HObjectAccess::ForElementsPointer())); | |
| 471 for (int offset = JSObject::kHeaderSize; offset < result_size; | |
| 472 offset += kPointerSize) { | |
| 473 HObjectAccess access = HObjectAccess::ForObservableJSObjectOffset(offset); | |
| 474 Add<HStoreNamedField>(result, access, | |
| 475 Add<HLoadNamedField>(boilerplate, nullptr, access)); | |
| 476 } | |
| 477 Push(result); | |
| 478 } | |
| 479 if_notundefined.ElseDeopt(Deoptimizer::kUninitializedBoilerplateInFastClone); | |
| 480 if_notundefined.End(); | |
| 481 | |
| 482 return Pop(); | |
| 483 } | |
| 484 | |
| 485 | |
| 486 Handle<Code> FastCloneRegExpStub::GenerateCode() { | |
| 487 return DoGenerateCode(this); | |
| 488 } | |
| 489 | |
| 490 | |
| 491 template <> | |
| 436 HValue* CodeStubGraphBuilder<FastCloneShallowArrayStub>::BuildCodeStub() { | 492 HValue* CodeStubGraphBuilder<FastCloneShallowArrayStub>::BuildCodeStub() { |
| 437 Factory* factory = isolate()->factory(); | 493 Factory* factory = isolate()->factory(); |
| 438 HValue* undefined = graph()->GetConstantUndefined(); | 494 HValue* undefined = graph()->GetConstantUndefined(); |
| 439 AllocationSiteMode alloc_site_mode = casted_stub()->allocation_site_mode(); | 495 AllocationSiteMode alloc_site_mode = casted_stub()->allocation_site_mode(); |
| 440 HValue* closure = GetParameter(0); | 496 HValue* closure = GetParameter(0); |
| 441 HValue* literal_index = GetParameter(1); | 497 HValue* literal_index = GetParameter(1); |
| 442 | 498 |
| 443 // This stub is very performance sensitive, the generated code must be tuned | 499 // This stub is very performance sensitive, the generated code must be tuned |
| 444 // so that it doesn't build and eager frame. | 500 // so that it doesn't build and eager frame. |
| 445 info()->MarkMustNotHaveEagerFrame(); | 501 info()->MarkMustNotHaveEagerFrame(); |
| (...skipping 1943 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2389 return Pop(); | 2445 return Pop(); |
| 2390 } | 2446 } |
| 2391 | 2447 |
| 2392 | 2448 |
| 2393 Handle<Code> KeyedLoadGenericStub::GenerateCode() { | 2449 Handle<Code> KeyedLoadGenericStub::GenerateCode() { |
| 2394 return DoGenerateCode(this); | 2450 return DoGenerateCode(this); |
| 2395 } | 2451 } |
| 2396 | 2452 |
| 2397 } // namespace internal | 2453 } // namespace internal |
| 2398 } // namespace v8 | 2454 } // namespace v8 |
| OLD | NEW |