| 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 "src/hydrogen.h" | 5 #include "src/hydrogen.h" |
| 6 | 6 |
| 7 #include <sstream> | 7 #include <sstream> |
| 8 | 8 |
| 9 #include "src/v8.h" | 9 #include "src/v8.h" |
| 10 | 10 |
| (...skipping 2783 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2794 } | 2794 } |
| 2795 } | 2795 } |
| 2796 | 2796 |
| 2797 | 2797 |
| 2798 void HGraphBuilder::BuildFillElementsWithHole(HValue* elements, | 2798 void HGraphBuilder::BuildFillElementsWithHole(HValue* elements, |
| 2799 ElementsKind elements_kind, | 2799 ElementsKind elements_kind, |
| 2800 HValue* from, | 2800 HValue* from, |
| 2801 HValue* to) { | 2801 HValue* to) { |
| 2802 // Fast elements kinds need to be initialized in case statements below cause a | 2802 // Fast elements kinds need to be initialized in case statements below cause a |
| 2803 // garbage collection. | 2803 // garbage collection. |
| 2804 Factory* factory = isolate()->factory(); | |
| 2805 | 2804 |
| 2806 double nan_double = FixedDoubleArray::hole_nan_as_double(); | |
| 2807 HValue* hole = IsFastSmiOrObjectElementsKind(elements_kind) | 2805 HValue* hole = IsFastSmiOrObjectElementsKind(elements_kind) |
| 2808 ? Add<HConstant>(factory->the_hole_value()) | 2806 ? graph()->GetConstantHole() |
| 2809 : Add<HConstant>(nan_double); | 2807 : Add<HConstant>(HConstant::kHoleNaN); |
| 2810 | 2808 |
| 2811 // Since we're about to store a hole value, the store instruction below must | 2809 // Since we're about to store a hole value, the store instruction below must |
| 2812 // assume an elements kind that supports heap object values. | 2810 // assume an elements kind that supports heap object values. |
| 2813 if (IsFastSmiOrObjectElementsKind(elements_kind)) { | 2811 if (IsFastSmiOrObjectElementsKind(elements_kind)) { |
| 2814 elements_kind = FAST_HOLEY_ELEMENTS; | 2812 elements_kind = FAST_HOLEY_ELEMENTS; |
| 2815 } | 2813 } |
| 2816 | 2814 |
| 2817 BuildFillElementsWithValue(elements, elements_kind, from, to, hole); | 2815 BuildFillElementsWithValue(elements, elements_kind, from, to, hole); |
| 2818 } | 2816 } |
| 2819 | 2817 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2897 ElementsKind kind = (IsHoleyElementsKind(from_elements_kind) && | 2895 ElementsKind kind = (IsHoleyElementsKind(from_elements_kind) && |
| 2898 IsFastSmiElementsKind(to_elements_kind)) | 2896 IsFastSmiElementsKind(to_elements_kind)) |
| 2899 ? FAST_HOLEY_ELEMENTS : to_elements_kind; | 2897 ? FAST_HOLEY_ELEMENTS : to_elements_kind; |
| 2900 | 2898 |
| 2901 if (IsHoleyElementsKind(from_elements_kind) && | 2899 if (IsHoleyElementsKind(from_elements_kind) && |
| 2902 from_elements_kind != to_elements_kind) { | 2900 from_elements_kind != to_elements_kind) { |
| 2903 IfBuilder if_hole(this); | 2901 IfBuilder if_hole(this); |
| 2904 if_hole.If<HCompareHoleAndBranch>(element); | 2902 if_hole.If<HCompareHoleAndBranch>(element); |
| 2905 if_hole.Then(); | 2903 if_hole.Then(); |
| 2906 HConstant* hole_constant = IsFastDoubleElementsKind(to_elements_kind) | 2904 HConstant* hole_constant = IsFastDoubleElementsKind(to_elements_kind) |
| 2907 ? Add<HConstant>(FixedDoubleArray::hole_nan_as_double()) | 2905 ? Add<HConstant>(HConstant::kHoleNaN) |
| 2908 : graph()->GetConstantHole(); | 2906 : graph()->GetConstantHole(); |
| 2909 Add<HStoreKeyed>(to_elements, key, hole_constant, kind); | 2907 Add<HStoreKeyed>(to_elements, key, hole_constant, kind); |
| 2910 if_hole.Else(); | 2908 if_hole.Else(); |
| 2911 HStoreKeyed* store = Add<HStoreKeyed>(to_elements, key, element, kind); | 2909 HStoreKeyed* store = Add<HStoreKeyed>(to_elements, key, element, kind); |
| 2912 store->SetFlag(HValue::kAllowUndefinedAsNaN); | 2910 store->SetFlag(HValue::kAllowUndefinedAsNaN); |
| 2913 if_hole.End(); | 2911 if_hole.End(); |
| 2914 } else { | 2912 } else { |
| 2915 HStoreKeyed* store = Add<HStoreKeyed>(to_elements, key, element, kind); | 2913 HStoreKeyed* store = Add<HStoreKeyed>(to_elements, key, element, kind); |
| 2916 store->SetFlag(HValue::kAllowUndefinedAsNaN); | 2914 store->SetFlag(HValue::kAllowUndefinedAsNaN); |
| 2917 } | 2915 } |
| 2918 | 2916 |
| (...skipping 5453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8372 length_checker.Else(); | 8370 length_checker.Else(); |
| 8373 HValue* elements = AddLoadElements(checked_object); | 8371 HValue* elements = AddLoadElements(checked_object); |
| 8374 // Ensure that we aren't popping from a copy-on-write array. | 8372 // Ensure that we aren't popping from a copy-on-write array. |
| 8375 if (IsFastSmiOrObjectElementsKind(elements_kind)) { | 8373 if (IsFastSmiOrObjectElementsKind(elements_kind)) { |
| 8376 elements = BuildCopyElementsOnWrite(checked_object, elements, | 8374 elements = BuildCopyElementsOnWrite(checked_object, elements, |
| 8377 elements_kind, length); | 8375 elements_kind, length); |
| 8378 } | 8376 } |
| 8379 reduced_length = AddUncasted<HSub>(length, graph()->GetConstant1()); | 8377 reduced_length = AddUncasted<HSub>(length, graph()->GetConstant1()); |
| 8380 result = AddElementAccess(elements, reduced_length, NULL, | 8378 result = AddElementAccess(elements, reduced_length, NULL, |
| 8381 bounds_check, elements_kind, LOAD); | 8379 bounds_check, elements_kind, LOAD); |
| 8382 Factory* factory = isolate()->factory(); | |
| 8383 double nan_double = FixedDoubleArray::hole_nan_as_double(); | |
| 8384 HValue* hole = IsFastSmiOrObjectElementsKind(elements_kind) | 8380 HValue* hole = IsFastSmiOrObjectElementsKind(elements_kind) |
| 8385 ? Add<HConstant>(factory->the_hole_value()) | 8381 ? graph()->GetConstantHole() |
| 8386 : Add<HConstant>(nan_double); | 8382 : Add<HConstant>(HConstant::kHoleNaN); |
| 8387 if (IsFastSmiOrObjectElementsKind(elements_kind)) { | 8383 if (IsFastSmiOrObjectElementsKind(elements_kind)) { |
| 8388 elements_kind = FAST_HOLEY_ELEMENTS; | 8384 elements_kind = FAST_HOLEY_ELEMENTS; |
| 8389 } | 8385 } |
| 8390 AddElementAccess( | 8386 AddElementAccess( |
| 8391 elements, reduced_length, hole, bounds_check, elements_kind, STORE); | 8387 elements, reduced_length, hole, bounds_check, elements_kind, STORE); |
| 8392 Add<HStoreNamedField>( | 8388 Add<HStoreNamedField>( |
| 8393 checked_object, HObjectAccess::ForArrayLength(elements_kind), | 8389 checked_object, HObjectAccess::ForArrayLength(elements_kind), |
| 8394 reduced_length, STORE_TO_INITIALIZED_ENTRY); | 8390 reduced_length, STORE_TO_INITIALIZED_ENTRY); |
| 8395 | 8391 |
| 8396 if (!ast_context()->IsEffect()) Push(result); | 8392 if (!ast_context()->IsEffect()) Push(result); |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8538 HValue* element = AddUncasted<HLoadKeyed>( | 8534 HValue* element = AddUncasted<HLoadKeyed>( |
| 8539 elements, key, lengthiszero, copy_kind, ALLOW_RETURN_HOLE); | 8535 elements, key, lengthiszero, copy_kind, ALLOW_RETURN_HOLE); |
| 8540 HStoreKeyed* store = | 8536 HStoreKeyed* store = |
| 8541 Add<HStoreKeyed>(elements, new_key, element, copy_kind); | 8537 Add<HStoreKeyed>(elements, new_key, element, copy_kind); |
| 8542 store->SetFlag(HValue::kAllowUndefinedAsNaN); | 8538 store->SetFlag(HValue::kAllowUndefinedAsNaN); |
| 8543 } | 8539 } |
| 8544 loop.EndBody(); | 8540 loop.EndBody(); |
| 8545 | 8541 |
| 8546 // Put a hole at the end. | 8542 // Put a hole at the end. |
| 8547 HValue* hole = IsFastSmiOrObjectElementsKind(kind) | 8543 HValue* hole = IsFastSmiOrObjectElementsKind(kind) |
| 8548 ? Add<HConstant>(isolate()->factory()->the_hole_value()) | 8544 ? graph()->GetConstantHole() |
| 8549 : Add<HConstant>(FixedDoubleArray::hole_nan_as_double()); | 8545 : Add<HConstant>(HConstant::kHoleNaN); |
| 8550 if (IsFastSmiOrObjectElementsKind(kind)) kind = FAST_HOLEY_ELEMENTS; | 8546 if (IsFastSmiOrObjectElementsKind(kind)) kind = FAST_HOLEY_ELEMENTS; |
| 8551 Add<HStoreKeyed>( | 8547 Add<HStoreKeyed>( |
| 8552 elements, new_length, hole, kind, INITIALIZING_STORE); | 8548 elements, new_length, hole, kind, INITIALIZING_STORE); |
| 8553 | 8549 |
| 8554 // Remember new length. | 8550 // Remember new length. |
| 8555 Add<HStoreNamedField>( | 8551 Add<HStoreNamedField>( |
| 8556 receiver, HObjectAccess::ForArrayLength(kind), | 8552 receiver, HObjectAccess::ForArrayLength(kind), |
| 8557 new_length, STORE_TO_INITIALIZED_ENTRY); | 8553 new_length, STORE_TO_INITIALIZED_ENTRY); |
| 8558 } | 8554 } |
| 8559 if_inline.Else(); | 8555 if_inline.Else(); |
| (...skipping 4907 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13467 if (ShouldProduceTraceOutput()) { | 13463 if (ShouldProduceTraceOutput()) { |
| 13468 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 13464 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 13469 } | 13465 } |
| 13470 | 13466 |
| 13471 #ifdef DEBUG | 13467 #ifdef DEBUG |
| 13472 graph_->Verify(false); // No full verify. | 13468 graph_->Verify(false); // No full verify. |
| 13473 #endif | 13469 #endif |
| 13474 } | 13470 } |
| 13475 | 13471 |
| 13476 } } // namespace v8::internal | 13472 } } // namespace v8::internal |
| OLD | NEW |