Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(64)

Side by Side Diff: src/hydrogen.cc

Issue 1109353003: Unify internal and external typed arrays a bit (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/hydrogen.h ('k') | src/hydrogen-instructions.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 3149 matching lines...) Expand 10 before | Expand all | Expand 10 after
3160 HValue* HGraphBuilder::BuildArrayBufferViewFieldAccessor(HValue* object, 3160 HValue* HGraphBuilder::BuildArrayBufferViewFieldAccessor(HValue* object,
3161 HValue* checked_object, 3161 HValue* checked_object,
3162 FieldIndex index) { 3162 FieldIndex index) {
3163 NoObservableSideEffectsScope scope(this); 3163 NoObservableSideEffectsScope scope(this);
3164 HObjectAccess access = HObjectAccess::ForObservableJSObjectOffset( 3164 HObjectAccess access = HObjectAccess::ForObservableJSObjectOffset(
3165 index.offset(), Representation::Tagged()); 3165 index.offset(), Representation::Tagged());
3166 HInstruction* buffer = Add<HLoadNamedField>( 3166 HInstruction* buffer = Add<HLoadNamedField>(
3167 object, checked_object, HObjectAccess::ForJSArrayBufferViewBuffer()); 3167 object, checked_object, HObjectAccess::ForJSArrayBufferViewBuffer());
3168 HInstruction* field = Add<HLoadNamedField>(object, checked_object, access); 3168 HInstruction* field = Add<HLoadNamedField>(object, checked_object, access);
3169 3169
3170 IfBuilder if_has_buffer(this); 3170 HInstruction* flags = Add<HLoadNamedField>(
3171 HValue* has_buffer = if_has_buffer.IfNot<HIsSmiAndBranch>(buffer); 3171 buffer, nullptr, HObjectAccess::ForJSArrayBufferBitField());
3172 if_has_buffer.Then(); 3172 HValue* was_neutered_mask =
3173 { 3173 Add<HConstant>(1 << JSArrayBuffer::WasNeutered::kShift);
3174 HInstruction* flags = Add<HLoadNamedField>( 3174 HValue* was_neutered_test =
3175 buffer, has_buffer, HObjectAccess::ForJSArrayBufferBitField()); 3175 AddUncasted<HBitwise>(Token::BIT_AND, flags, was_neutered_mask);
3176 HValue* was_neutered_mask =
3177 Add<HConstant>(1 << JSArrayBuffer::WasNeutered::kShift);
3178 HValue* was_neutered_test =
3179 AddUncasted<HBitwise>(Token::BIT_AND, flags, was_neutered_mask);
3180 3176
3181 IfBuilder if_was_neutered(this); 3177 IfBuilder if_was_neutered(this);
3182 if_was_neutered.If<HCompareNumericAndBranch>( 3178 if_was_neutered.If<HCompareNumericAndBranch>(
3183 was_neutered_test, graph()->GetConstant0(), Token::NE); 3179 was_neutered_test, graph()->GetConstant0(), Token::NE);
3184 if_was_neutered.Then(); 3180 if_was_neutered.Then();
3185 Push(graph()->GetConstant0()); 3181 Push(graph()->GetConstant0());
3186 if_was_neutered.Else(); 3182 if_was_neutered.Else();
3187 Push(field);
3188 if_was_neutered.End();
3189 }
3190 if_has_buffer.Else();
3191 Push(field); 3183 Push(field);
3192 if_has_buffer.End(); 3184 if_was_neutered.End();
3193 3185
3194 return Pop(); 3186 return Pop();
3195 } 3187 }
3196 3188
3197 3189
3198 HGraphBuilder::JSArrayBuilder::JSArrayBuilder(HGraphBuilder* builder, 3190 HGraphBuilder::JSArrayBuilder::JSArrayBuilder(HGraphBuilder* builder,
3199 ElementsKind kind, 3191 ElementsKind kind,
3200 HValue* allocation_site_payload, 3192 HValue* allocation_site_payload,
3201 HValue* constructor_function, 3193 HValue* constructor_function,
3202 AllocationSiteOverrideMode override_mode) : 3194 AllocationSiteOverrideMode override_mode) :
(...skipping 6492 matching lines...) Expand 10 before | Expand all | Expand 10 after
9695 // argument to the construct call. 9687 // argument to the construct call.
9696 if (TryHandleArrayCallNew(expr, function)) return; 9688 if (TryHandleArrayCallNew(expr, function)) return;
9697 9689
9698 HInstruction* call = 9690 HInstruction* call =
9699 PreProcessCall(New<HCallNew>(function, argument_count)); 9691 PreProcessCall(New<HCallNew>(function, argument_count));
9700 return ast_context()->ReturnInstruction(call, expr->id()); 9692 return ast_context()->ReturnInstruction(call, expr->id());
9701 } 9693 }
9702 } 9694 }
9703 9695
9704 9696
9697 HValue* HGraphBuilder::BuildAllocateEmptyArrayBuffer(HValue* byte_length) {
9698 HAllocate* result =
9699 BuildAllocate(Add<HConstant>(JSArrayBuffer::kSizeWithInternalFields),
9700 HType::JSObject(), JS_ARRAY_BUFFER_TYPE, HAllocationMode());
9701 result->MakePrefillWithFiller();
Hannes Payer (out of office) 2015/04/30 10:50:18 Make prefill with filler is not the right thing he
9702
9703 HValue* global_object = Add<HLoadNamedField>(
9704 context(), nullptr,
9705 HObjectAccess::ForContextSlot(Context::GLOBAL_OBJECT_INDEX));
9706 HValue* native_context = Add<HLoadNamedField>(
9707 global_object, nullptr, HObjectAccess::ForGlobalObjectNativeContext());
9708 Add<HStoreNamedField>(
9709 result, HObjectAccess::ForMap(),
9710 Add<HLoadNamedField>(
9711 native_context, nullptr,
9712 HObjectAccess::ForContextSlot(Context::ARRAY_BUFFER_MAP_INDEX)));
9713
9714 Add<HStoreNamedField>(result, HObjectAccess::ForJSArrayBufferBackingStore(),
9715 Add<HConstant>(ExternalReference()));
9716 Add<HStoreNamedField>(result, HObjectAccess::ForJSArrayBufferByteLength(),
9717 byte_length);
9718 Add<HStoreNamedField>(result, HObjectAccess::ForJSArrayBufferBitFieldSlot(),
9719 graph()->GetConstant0());
9720 Add<HStoreNamedField>(
9721 result, HObjectAccess::ForJSArrayBufferBitField(),
9722 Add<HConstant>((1 << JSArrayBuffer::IsExternal::kShift) |
9723 (1 << JSArrayBuffer::IsNeuterable::kShift)));
9724
9725 return result;
9726 }
9727
9728
9705 template <class ViewClass> 9729 template <class ViewClass>
9706 void HGraphBuilder::BuildArrayBufferViewInitialization( 9730 void HGraphBuilder::BuildArrayBufferViewInitialization(
9707 HValue* obj, 9731 HValue* obj,
9708 HValue* buffer, 9732 HValue* buffer,
9709 HValue* byte_offset, 9733 HValue* byte_offset,
9710 HValue* byte_length) { 9734 HValue* byte_length) {
9711 9735
9712 for (int offset = ViewClass::kSize; 9736 for (int offset = ViewClass::kSize;
9713 offset < ViewClass::kSizeWithInternalFields; 9737 offset < ViewClass::kSizeWithInternalFields;
9714 offset += kPointerSize) { 9738 offset += kPointerSize) {
9715 Add<HStoreNamedField>(obj, 9739 Add<HStoreNamedField>(obj,
9716 HObjectAccess::ForObservableJSObjectOffset(offset), 9740 HObjectAccess::ForObservableJSObjectOffset(offset),
9717 graph()->GetConstant0()); 9741 graph()->GetConstant0());
9718 } 9742 }
9719 9743
9720 Add<HStoreNamedField>( 9744 Add<HStoreNamedField>(
9721 obj, 9745 obj,
9722 HObjectAccess::ForJSArrayBufferViewByteOffset(), 9746 HObjectAccess::ForJSArrayBufferViewByteOffset(),
9723 byte_offset); 9747 byte_offset);
9724 Add<HStoreNamedField>( 9748 Add<HStoreNamedField>(
9725 obj, 9749 obj,
9726 HObjectAccess::ForJSArrayBufferViewByteLength(), 9750 HObjectAccess::ForJSArrayBufferViewByteLength(),
9727 byte_length); 9751 byte_length);
9728 9752 Add<HStoreNamedField>(obj, HObjectAccess::ForJSArrayBufferViewBuffer(),
9729 if (buffer != NULL) { 9753 buffer);
9730 Add<HStoreNamedField>(
9731 obj,
9732 HObjectAccess::ForJSArrayBufferViewBuffer(), buffer);
9733 } else {
9734 Add<HStoreNamedField>(
9735 obj,
9736 HObjectAccess::ForJSArrayBufferViewBuffer(),
9737 Add<HConstant>(static_cast<int32_t>(0)));
9738 }
9739 } 9754 }
9740 9755
9741 9756
9742 void HOptimizedGraphBuilder::GenerateDataViewInitialize( 9757 void HOptimizedGraphBuilder::GenerateDataViewInitialize(
9743 CallRuntime* expr) { 9758 CallRuntime* expr) {
9744 ZoneList<Expression*>* arguments = expr->arguments(); 9759 ZoneList<Expression*>* arguments = expr->arguments();
9745 9760
9746 DCHECK(arguments->length()== 4); 9761 DCHECK(arguments->length()== 4);
9747 CHECK_ALIVE(VisitForValue(arguments->at(0))); 9762 CHECK_ALIVE(VisitForValue(arguments->at(0)));
9748 HValue* obj = Pop(); 9763 HValue* obj = Pop();
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
9950 ElementsKind fixed_elements_kind = // Bogus initialization. 9965 ElementsKind fixed_elements_kind = // Bogus initialization.
9951 INT8_ELEMENTS; 9966 INT8_ELEMENTS;
9952 Runtime::ArrayIdToTypeAndSize(array_id, 9967 Runtime::ArrayIdToTypeAndSize(array_id,
9953 &array_type, 9968 &array_type,
9954 &external_elements_kind, 9969 &external_elements_kind,
9955 &fixed_elements_kind, 9970 &fixed_elements_kind,
9956 &element_size); 9971 &element_size);
9957 9972
9958 9973
9959 { // byte_offset is Smi. 9974 { // byte_offset is Smi.
9960 BuildArrayBufferViewInitialization<JSTypedArray>( 9975 HValue* allocated_buffer = buffer;
9961 obj, buffer, byte_offset, byte_length); 9976 if (buffer == NULL) {
9977 allocated_buffer = BuildAllocateEmptyArrayBuffer(byte_length);
9978 }
9979 BuildArrayBufferViewInitialization<JSTypedArray>(obj, allocated_buffer,
9980 byte_offset, byte_length);
9962 9981
9963 9982
9964 HInstruction* length = AddUncasted<HDiv>(byte_length, 9983 HInstruction* length = AddUncasted<HDiv>(byte_length,
9965 Add<HConstant>(static_cast<int32_t>(element_size))); 9984 Add<HConstant>(static_cast<int32_t>(element_size)));
9966 9985
9967 Add<HStoreNamedField>(obj, 9986 Add<HStoreNamedField>(obj,
9968 HObjectAccess::ForJSTypedArrayLength(), 9987 HObjectAccess::ForJSTypedArrayLength(),
9969 length); 9988 length);
9970 9989
9971 HValue* elements; 9990 HValue* elements;
(...skipping 3134 matching lines...) Expand 10 before | Expand all | Expand 10 after
13106 if (ShouldProduceTraceOutput()) { 13125 if (ShouldProduceTraceOutput()) {
13107 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 13126 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
13108 } 13127 }
13109 13128
13110 #ifdef DEBUG 13129 #ifdef DEBUG
13111 graph_->Verify(false); // No full verify. 13130 graph_->Verify(false); // No full verify.
13112 #endif 13131 #endif
13113 } 13132 }
13114 13133
13115 } } // namespace v8::internal 13134 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/hydrogen.h ('k') | src/hydrogen-instructions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698