OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 "hydrogen.h" | 5 #include "hydrogen.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "v8.h" | 9 #include "v8.h" |
10 #include "allocation-site-scopes.h" | 10 #include "allocation-site-scopes.h" |
(...skipping 2507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2518 ElementsKind from_elements_kind, | 2518 ElementsKind from_elements_kind, |
2519 HValue* to_elements, | 2519 HValue* to_elements, |
2520 ElementsKind to_elements_kind, | 2520 ElementsKind to_elements_kind, |
2521 HValue* length, | 2521 HValue* length, |
2522 HValue* capacity) { | 2522 HValue* capacity) { |
2523 int constant_capacity = -1; | 2523 int constant_capacity = -1; |
2524 if (capacity != NULL && | 2524 if (capacity != NULL && |
2525 capacity->IsConstant() && | 2525 capacity->IsConstant() && |
2526 HConstant::cast(capacity)->HasInteger32Value()) { | 2526 HConstant::cast(capacity)->HasInteger32Value()) { |
2527 int constant_candidate = HConstant::cast(capacity)->Integer32Value(); | 2527 int constant_candidate = HConstant::cast(capacity)->Integer32Value(); |
2528 if (constant_candidate <= | 2528 if (constant_candidate <= kElementLoopUnrollThreshold) { |
2529 FastCloneShallowArrayStub::kMaximumInlinedCloneLength) { | |
2530 constant_capacity = constant_candidate; | 2529 constant_capacity = constant_candidate; |
2531 } | 2530 } |
2532 } | 2531 } |
2533 | 2532 |
2534 if (constant_capacity != -1) { | 2533 if (constant_capacity != -1) { |
2535 // Unroll the loop for small elements kinds. | 2534 // Unroll the loop for small elements kinds. |
2536 for (int i = 0; i < constant_capacity; i++) { | 2535 for (int i = 0; i < constant_capacity; i++) { |
2537 HValue* key_constant = Add<HConstant>(i); | 2536 HValue* key_constant = Add<HConstant>(i); |
2538 HInstruction* value = Add<HLoadKeyed>(from_elements, key_constant, | 2537 HInstruction* value = Add<HLoadKeyed>(from_elements, key_constant, |
2539 static_cast<HValue*>(NULL), | 2538 static_cast<HValue*>(NULL), |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2694 int elements_kind_size = IsFastDoubleElementsKind(kind) | 2693 int elements_kind_size = IsFastDoubleElementsKind(kind) |
2695 ? kDoubleSize : kPointerSize; | 2694 ? kDoubleSize : kPointerSize; |
2696 | 2695 |
2697 HValue* boilerplate_elements = AddLoadElements(boilerplate); | 2696 HValue* boilerplate_elements = AddLoadElements(boilerplate); |
2698 HValue* capacity = AddLoadFixedArrayLength(boilerplate_elements); | 2697 HValue* capacity = AddLoadFixedArrayLength(boilerplate_elements); |
2699 HValue* extra = AddUncasted<HMul>(capacity, | 2698 HValue* extra = AddUncasted<HMul>(capacity, |
2700 Add<HConstant>(elements_kind_size)); | 2699 Add<HConstant>(elements_kind_size)); |
2701 extra->ClearFlag(HValue::kCanOverflow); | 2700 extra->ClearFlag(HValue::kCanOverflow); |
2702 extra = AddUncasted<HAdd>(extra, Add<HConstant>(FixedArray::kHeaderSize)); | 2701 extra = AddUncasted<HAdd>(extra, Add<HConstant>(FixedArray::kHeaderSize)); |
2703 extra->ClearFlag(HValue::kCanOverflow); | 2702 extra->ClearFlag(HValue::kCanOverflow); |
| 2703 // This function implicitly relies on the fact that the |
| 2704 // FastCloneShallowArrayStub is called only for literals shorter than |
| 2705 // JSObject::kInitialMaxFastElementArray and therefore the size of the |
| 2706 // resulting folded allocation will always be in allowed range. |
| 2707 // Can't add HBoundsCheck here because otherwise the stub will eager a frame. |
| 2708 |
2704 HValue* elements = NULL; | 2709 HValue* elements = NULL; |
2705 HValue* result = BuildCloneShallowArrayCommon(boilerplate, | 2710 HValue* result = BuildCloneShallowArrayCommon(boilerplate, |
2706 allocation_site, extra, &elements, mode); | 2711 allocation_site, extra, &elements, mode); |
2707 Add<HStoreNamedField>(result, HObjectAccess::ForElementsPointer(), | 2712 Add<HStoreNamedField>(result, HObjectAccess::ForElementsPointer(), |
2708 elements, INITIALIZING_STORE); | 2713 elements, INITIALIZING_STORE); |
2709 | 2714 |
2710 // The allocation for the cloned array above causes register pressure on | 2715 // The allocation for the cloned array above causes register pressure on |
2711 // machines with low register counts. Force a reload of the boilerplate | 2716 // machines with low register counts. Force a reload of the boilerplate |
2712 // elements here to free up a register for the allocation to avoid unnecessary | 2717 // elements here to free up a register for the allocation to avoid unnecessary |
2713 // spillage. | 2718 // spillage. |
(...skipping 9081 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11795 if (ShouldProduceTraceOutput()) { | 11800 if (ShouldProduceTraceOutput()) { |
11796 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 11801 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
11797 } | 11802 } |
11798 | 11803 |
11799 #ifdef DEBUG | 11804 #ifdef DEBUG |
11800 graph_->Verify(false); // No full verify. | 11805 graph_->Verify(false); // No full verify. |
11801 #endif | 11806 #endif |
11802 } | 11807 } |
11803 | 11808 |
11804 } } // namespace v8::internal | 11809 } } // namespace v8::internal |
OLD | NEW |