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

Side by Side Diff: src/hydrogen-instructions.h

Issue 149063010: Remake of the load elimination fix made earlier (r18884). (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rebasing on r19056. Created 6 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « src/hydrogen.cc ('k') | src/hydrogen-instructions.cc » ('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 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 5692 matching lines...) Expand 10 before | Expand all | Expand 10 after
5703 } 5703 }
5704 5704
5705 inline Handle<String> name() const { 5705 inline Handle<String> name() const {
5706 return name_; 5706 return name_;
5707 } 5707 }
5708 5708
5709 inline bool immutable() const { 5709 inline bool immutable() const {
5710 return ImmutableField::decode(value_); 5710 return ImmutableField::decode(value_);
5711 } 5711 }
5712 5712
5713 // Returns true if access is being made to an in-object property that
5714 // was already added to the object.
5715 inline bool existing_inobject_property() const {
5716 return ExistingInobjectPropertyField::decode(value_);
5717 }
5718
5713 inline HObjectAccess WithRepresentation(Representation representation) { 5719 inline HObjectAccess WithRepresentation(Representation representation) {
5714 return HObjectAccess(portion(), offset(), representation, name()); 5720 return HObjectAccess(portion(), offset(), representation, name(),
5721 immutable(), existing_inobject_property());
5715 } 5722 }
5716 5723
5717 static HObjectAccess ForHeapNumberValue() { 5724 static HObjectAccess ForHeapNumberValue() {
5718 return HObjectAccess( 5725 return HObjectAccess(
5719 kDouble, HeapNumber::kValueOffset, Representation::Double()); 5726 kDouble, HeapNumber::kValueOffset, Representation::Double());
5720 } 5727 }
5721 5728
5722 static HObjectAccess ForHeapNumberValueLowestBits() { 5729 static HObjectAccess ForHeapNumberValueLowestBits() {
5723 return HObjectAccess(kDouble, 5730 return HObjectAccess(kDouble,
5724 HeapNumber::kValueOffset, 5731 HeapNumber::kValueOffset,
(...skipping 23 matching lines...) Expand all
5748 kArrayLengths, 5755 kArrayLengths,
5749 JSArray::kLengthOffset, 5756 JSArray::kLengthOffset,
5750 IsFastElementsKind(elements_kind) && 5757 IsFastElementsKind(elements_kind) &&
5751 FLAG_track_fields 5758 FLAG_track_fields
5752 ? Representation::Smi() : Representation::Tagged()); 5759 ? Representation::Smi() : Representation::Tagged());
5753 } 5760 }
5754 5761
5755 static HObjectAccess ForAllocationSiteOffset(int offset); 5762 static HObjectAccess ForAllocationSiteOffset(int offset);
5756 5763
5757 static HObjectAccess ForAllocationSiteList() { 5764 static HObjectAccess ForAllocationSiteList() {
5758 return HObjectAccess(kExternalMemory, 0, Representation::Tagged()); 5765 return HObjectAccess(kExternalMemory, 0, Representation::Tagged(),
5766 Handle<String>::null(), false, false);
5759 } 5767 }
5760 5768
5761 static HObjectAccess ForFixedArrayLength() { 5769 static HObjectAccess ForFixedArrayLength() {
5762 return HObjectAccess( 5770 return HObjectAccess(
5763 kArrayLengths, 5771 kArrayLengths,
5764 FixedArray::kLengthOffset, 5772 FixedArray::kLengthOffset,
5765 FLAG_track_fields ? Representation::Smi() : Representation::Tagged()); 5773 FLAG_track_fields ? Representation::Smi() : Representation::Tagged());
5766 } 5774 }
5767 5775
5768 static HObjectAccess ForStringHashField() { 5776 static HObjectAccess ForStringHashField() {
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
5850 5858
5851 static HObjectAccess ForCellValue() { 5859 static HObjectAccess ForCellValue() {
5852 return HObjectAccess(kInobject, Cell::kValueOffset); 5860 return HObjectAccess(kInobject, Cell::kValueOffset);
5853 } 5861 }
5854 5862
5855 static HObjectAccess ForAllocationMementoSite() { 5863 static HObjectAccess ForAllocationMementoSite() {
5856 return HObjectAccess(kInobject, AllocationMemento::kAllocationSiteOffset); 5864 return HObjectAccess(kInobject, AllocationMemento::kAllocationSiteOffset);
5857 } 5865 }
5858 5866
5859 static HObjectAccess ForCounter() { 5867 static HObjectAccess ForCounter() {
5860 return HObjectAccess(kExternalMemory, 0, Representation::Integer32()); 5868 return HObjectAccess(kExternalMemory, 0, Representation::Integer32(),
5869 Handle<String>::null(), false, false);
5861 } 5870 }
5862 5871
5863 // Create an access to an offset in a fixed array header. 5872 // Create an access to an offset in a fixed array header.
5864 static HObjectAccess ForFixedArrayHeader(int offset); 5873 static HObjectAccess ForFixedArrayHeader(int offset);
5865 5874
5866 // Create an access to an in-object property in a JSObject. 5875 // Create an access to an in-object property in a JSObject.
5867 static HObjectAccess ForJSObjectOffset(int offset, 5876 // This kind of access must be used when the object |map| is known and
5877 // in-object properties are being accessed. Accesses of the in-object
5878 // properties can have different semantics depending on whether corresponding
5879 // property was added to the map or not.
5880 static HObjectAccess ForMapAndOffset(Handle<Map> map, int offset,
5868 Representation representation = Representation::Tagged()); 5881 Representation representation = Representation::Tagged());
5869 5882
5883 // Create an access to an in-object property in a JSObject.
5884 // This kind of access can be used for accessing object header fields or
5885 // in-object properties if the map of the object is not known.
5886 static HObjectAccess ForObservableJSObjectOffset(int offset,
5887 Representation representation = Representation::Tagged()) {
5888 return ForMapAndOffset(Handle<Map>::null(), offset, representation);
5889 }
5890
5870 // Create an access to an in-object property in a JSArray. 5891 // Create an access to an in-object property in a JSArray.
5871 static HObjectAccess ForJSArrayOffset(int offset); 5892 static HObjectAccess ForJSArrayOffset(int offset);
5872 5893
5873 static HObjectAccess ForContextSlot(int index); 5894 static HObjectAccess ForContextSlot(int index);
5874 5895
5875 // Create an access to the backing store of an object. 5896 // Create an access to the backing store of an object.
5876 static HObjectAccess ForBackingStoreOffset(int offset, 5897 static HObjectAccess ForBackingStoreOffset(int offset,
5877 Representation representation = Representation::Tagged()); 5898 Representation representation = Representation::Tagged());
5878 5899
5879 // Create an access to a resolved field (in-object or backing store). 5900 // Create an access to a resolved field (in-object or backing store).
5880 static HObjectAccess ForField(Handle<Map> map, 5901 static HObjectAccess ForField(Handle<Map> map,
5881 LookupResult *lookup, Handle<String> name = Handle<String>::null()); 5902 LookupResult *lookup, Handle<String> name = Handle<String>::null());
5882 5903
5883 // Create an access for the payload of a Cell or JSGlobalPropertyCell. 5904 // Create an access for the payload of a Cell or JSGlobalPropertyCell.
5884 static HObjectAccess ForCellPayload(Isolate* isolate); 5905 static HObjectAccess ForCellPayload(Isolate* isolate);
5885 5906
5886 static HObjectAccess ForJSTypedArrayLength() { 5907 static HObjectAccess ForJSTypedArrayLength() {
5887 return HObjectAccess::ForJSObjectOffset(JSTypedArray::kLengthOffset); 5908 return HObjectAccess::ForObservableJSObjectOffset(
5909 JSTypedArray::kLengthOffset);
5888 } 5910 }
5889 5911
5890 static HObjectAccess ForJSArrayBufferBackingStore() { 5912 static HObjectAccess ForJSArrayBufferBackingStore() {
5891 return HObjectAccess::ForJSObjectOffset( 5913 return HObjectAccess::ForObservableJSObjectOffset(
5892 JSArrayBuffer::kBackingStoreOffset, Representation::External()); 5914 JSArrayBuffer::kBackingStoreOffset, Representation::External());
5893 } 5915 }
5894 5916
5895 static HObjectAccess ForExternalArrayExternalPointer() { 5917 static HObjectAccess ForExternalArrayExternalPointer() {
5896 return HObjectAccess::ForJSObjectOffset( 5918 return HObjectAccess::ForObservableJSObjectOffset(
5897 ExternalArray::kExternalPointerOffset, Representation::External()); 5919 ExternalArray::kExternalPointerOffset, Representation::External());
5898 } 5920 }
5899 5921
5900 static HObjectAccess ForJSArrayBufferViewWeakNext() { 5922 static HObjectAccess ForJSArrayBufferViewWeakNext() {
5901 return HObjectAccess::ForJSObjectOffset(JSArrayBufferView::kWeakNextOffset); 5923 return HObjectAccess::ForObservableJSObjectOffset(
5924 JSArrayBufferView::kWeakNextOffset);
5902 } 5925 }
5903 5926
5904 static HObjectAccess ForJSArrayBufferWeakFirstView() { 5927 static HObjectAccess ForJSArrayBufferWeakFirstView() {
5905 return HObjectAccess::ForJSObjectOffset( 5928 return HObjectAccess::ForObservableJSObjectOffset(
5906 JSArrayBuffer::kWeakFirstViewOffset); 5929 JSArrayBuffer::kWeakFirstViewOffset);
5907 } 5930 }
5908 5931
5909 static HObjectAccess ForJSArrayBufferViewBuffer() { 5932 static HObjectAccess ForJSArrayBufferViewBuffer() {
5910 return HObjectAccess::ForJSObjectOffset(JSArrayBufferView::kBufferOffset); 5933 return HObjectAccess::ForObservableJSObjectOffset(
5934 JSArrayBufferView::kBufferOffset);
5911 } 5935 }
5912 5936
5913 static HObjectAccess ForJSArrayBufferViewByteOffset() { 5937 static HObjectAccess ForJSArrayBufferViewByteOffset() {
5914 return HObjectAccess::ForJSObjectOffset( 5938 return HObjectAccess::ForObservableJSObjectOffset(
5915 JSArrayBufferView::kByteOffsetOffset); 5939 JSArrayBufferView::kByteOffsetOffset);
5916 } 5940 }
5917 5941
5918 static HObjectAccess ForJSArrayBufferViewByteLength() { 5942 static HObjectAccess ForJSArrayBufferViewByteLength() {
5919 return HObjectAccess::ForJSObjectOffset( 5943 return HObjectAccess::ForObservableJSObjectOffset(
5920 JSArrayBufferView::kByteLengthOffset); 5944 JSArrayBufferView::kByteLengthOffset);
5921 } 5945 }
5922 5946
5923 static HObjectAccess ForGlobalObjectNativeContext() { 5947 static HObjectAccess ForGlobalObjectNativeContext() {
5924 return HObjectAccess(kInobject, GlobalObject::kNativeContextOffset); 5948 return HObjectAccess(kInobject, GlobalObject::kNativeContextOffset);
5925 } 5949 }
5926 5950
5927 void PrintTo(StringStream* stream); 5951 void PrintTo(StringStream* stream);
5928 5952
5929 inline bool Equals(HObjectAccess that) const { 5953 inline bool Equals(HObjectAccess that) const {
(...skipping 12 matching lines...) Expand all
5942 kElementsPointer, // elements pointer 5966 kElementsPointer, // elements pointer
5943 kBackingStore, // some field in the backing store 5967 kBackingStore, // some field in the backing store
5944 kDouble, // some double field 5968 kDouble, // some double field
5945 kInobject, // some other in-object field 5969 kInobject, // some other in-object field
5946 kExternalMemory // some field in external memory 5970 kExternalMemory // some field in external memory
5947 }; 5971 };
5948 5972
5949 HObjectAccess(Portion portion, int offset, 5973 HObjectAccess(Portion portion, int offset,
5950 Representation representation = Representation::Tagged(), 5974 Representation representation = Representation::Tagged(),
5951 Handle<String> name = Handle<String>::null(), 5975 Handle<String> name = Handle<String>::null(),
5952 bool immutable = false) 5976 bool immutable = false,
5977 bool existing_inobject_property = true)
5953 : value_(PortionField::encode(portion) | 5978 : value_(PortionField::encode(portion) |
5954 RepresentationField::encode(representation.kind()) | 5979 RepresentationField::encode(representation.kind()) |
5955 ImmutableField::encode(immutable ? 1 : 0) | 5980 ImmutableField::encode(immutable ? 1 : 0) |
5981 ExistingInobjectPropertyField::encode(
5982 existing_inobject_property ? 1 : 0) |
5956 OffsetField::encode(offset)), 5983 OffsetField::encode(offset)),
5957 name_(name) { 5984 name_(name) {
5958 // assert that the fields decode correctly 5985 // assert that the fields decode correctly
5959 ASSERT(this->offset() == offset); 5986 ASSERT(this->offset() == offset);
5960 ASSERT(this->portion() == portion); 5987 ASSERT(this->portion() == portion);
5961 ASSERT(this->immutable() == immutable); 5988 ASSERT(this->immutable() == immutable);
5989 ASSERT(this->existing_inobject_property() == existing_inobject_property);
5962 ASSERT(RepresentationField::decode(value_) == representation.kind()); 5990 ASSERT(RepresentationField::decode(value_) == representation.kind());
5991 ASSERT(!this->existing_inobject_property() || IsInobject());
5963 } 5992 }
5964 5993
5965 class PortionField : public BitField<Portion, 0, 3> {}; 5994 class PortionField : public BitField<Portion, 0, 3> {};
5966 class RepresentationField : public BitField<Representation::Kind, 3, 4> {}; 5995 class RepresentationField : public BitField<Representation::Kind, 3, 4> {};
5967 class ImmutableField : public BitField<bool, 7, 1> {}; 5996 class ImmutableField : public BitField<bool, 7, 1> {};
5968 class OffsetField : public BitField<int, 8, 24> {}; 5997 class ExistingInobjectPropertyField : public BitField<bool, 8, 1> {};
5998 class OffsetField : public BitField<int, 9, 23> {};
5969 5999
5970 uint32_t value_; // encodes portion, representation, immutable, and offset 6000 uint32_t value_; // encodes portion, representation, immutable, and offset
5971 Handle<String> name_; 6001 Handle<String> name_;
5972 6002
5973 friend class HLoadNamedField; 6003 friend class HLoadNamedField;
5974 friend class HStoreNamedField; 6004 friend class HStoreNamedField;
5975 6005
5976 inline Portion portion() const { 6006 inline Portion portion() const {
5977 return PortionField::decode(value_); 6007 return PortionField::decode(value_);
5978 } 6008 }
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after
6344 SetOperandAt(1, key); 6374 SetOperandAt(1, key);
6345 SetOperandAt(2, context); 6375 SetOperandAt(2, context);
6346 SetAllSideEffects(); 6376 SetAllSideEffects();
6347 } 6377 }
6348 }; 6378 };
6349 6379
6350 6380
6351 // Indicates whether the store is a store to an entry that was previously 6381 // Indicates whether the store is a store to an entry that was previously
6352 // initialized or not. 6382 // initialized or not.
6353 enum StoreFieldOrKeyedMode { 6383 enum StoreFieldOrKeyedMode {
6354 // This is a store of either an undefined value to a field or a hole/NaN to
6355 // an entry of a newly allocated object.
6356 PREINITIALIZING_STORE,
6357 // The entry could be either previously initialized or not. 6384 // The entry could be either previously initialized or not.
6358 INITIALIZING_STORE, 6385 INITIALIZING_STORE,
6359 // At the time of this store it is guaranteed that the entry is already 6386 // At the time of this store it is guaranteed that the entry is already
6360 // initialized. 6387 // initialized.
6361 STORE_TO_INITIALIZED_ENTRY 6388 STORE_TO_INITIALIZED_ENTRY
6362 }; 6389 };
6363 6390
6364 6391
6365 class HStoreNamedField V8_FINAL : public HTemplateInstruction<3> { 6392 class HStoreNamedField V8_FINAL : public HTemplateInstruction<3> {
6366 public: 6393 public:
6394 DECLARE_INSTRUCTION_FACTORY_P3(HStoreNamedField, HValue*,
6395 HObjectAccess, HValue*);
6367 DECLARE_INSTRUCTION_FACTORY_P4(HStoreNamedField, HValue*, 6396 DECLARE_INSTRUCTION_FACTORY_P4(HStoreNamedField, HValue*,
6368 HObjectAccess, HValue*, StoreFieldOrKeyedMode); 6397 HObjectAccess, HValue*, StoreFieldOrKeyedMode);
6369 6398
6370 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField) 6399 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField)
6371 6400
6372 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { 6401 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE {
6373 return index == 1; 6402 return index == 1;
6374 } 6403 }
6375 virtual bool HasOutOfBoundsAccess(int size) V8_OVERRIDE { 6404 virtual bool HasOutOfBoundsAccess(int size) V8_OVERRIDE {
6376 return !access().IsInobject() || access().offset() >= size; 6405 return !access().IsInobject() || access().offset() >= size;
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
6463 } 6492 }
6464 6493
6465 void UpdateValue(HValue* value) { 6494 void UpdateValue(HValue* value) {
6466 SetOperandAt(1, value); 6495 SetOperandAt(1, value);
6467 } 6496 }
6468 6497
6469 private: 6498 private:
6470 HStoreNamedField(HValue* obj, 6499 HStoreNamedField(HValue* obj,
6471 HObjectAccess access, 6500 HObjectAccess access,
6472 HValue* val, 6501 HValue* val,
6473 StoreFieldOrKeyedMode store_mode) 6502 StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE)
6474 : access_(access), 6503 : access_(access),
6475 new_space_dominator_(NULL), 6504 new_space_dominator_(NULL),
6476 write_barrier_mode_(UPDATE_WRITE_BARRIER), 6505 write_barrier_mode_(UPDATE_WRITE_BARRIER),
6477 has_transition_(false), 6506 has_transition_(false),
6478 store_mode_(store_mode) { 6507 store_mode_(store_mode) {
6479 // PREINITIALIZING_STORE is only used to mark stores that initialize a 6508 // Stores to a non existing in-object property are allowed only to the
6480 // memory region resulting from HAllocate (possibly through an 6509 // newly allocated objects (via HAllocate or HInnerAllocatedObject).
6481 // HInnerAllocatedObject). 6510 ASSERT(!access.IsInobject() || access.existing_inobject_property() ||
6482 ASSERT(store_mode != PREINITIALIZING_STORE ||
6483 obj->IsAllocate() || obj->IsInnerAllocatedObject()); 6511 obj->IsAllocate() || obj->IsInnerAllocatedObject());
6484 SetOperandAt(0, obj); 6512 SetOperandAt(0, obj);
6485 SetOperandAt(1, val); 6513 SetOperandAt(1, val);
6486 SetOperandAt(2, obj); 6514 SetOperandAt(2, obj);
6487 access.SetGVNFlags(this, true); 6515 access.SetGVNFlags(this, true);
6488 } 6516 }
6489 6517
6490 HObjectAccess access_; 6518 HObjectAccess access_;
6491 HValue* new_space_dominator_; 6519 HValue* new_space_dominator_;
6492 WriteBarrierMode write_barrier_mode_ : 1; 6520 WriteBarrierMode write_barrier_mode_ : 1;
6493 bool has_transition_ : 1; 6521 bool has_transition_ : 1;
6494 StoreFieldOrKeyedMode store_mode_ : 2; 6522 StoreFieldOrKeyedMode store_mode_ : 1;
6495 }; 6523 };
6496 6524
6497 6525
6498 class HStoreNamedGeneric V8_FINAL : public HTemplateInstruction<3> { 6526 class HStoreNamedGeneric V8_FINAL : public HTemplateInstruction<3> {
6499 public: 6527 public:
6500 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreNamedGeneric, HValue*, 6528 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreNamedGeneric, HValue*,
6501 Handle<String>, HValue*, 6529 Handle<String>, HValue*,
6502 StrictModeFlag); 6530 StrictModeFlag);
6503 HValue* object() { return OperandAt(0); } 6531 HValue* object() { return OperandAt(0); }
6504 HValue* value() { return OperandAt(1); } 6532 HValue* value() { return OperandAt(1); }
(...skipping 24 matching lines...) Expand all
6529 } 6557 }
6530 6558
6531 Handle<String> name_; 6559 Handle<String> name_;
6532 StrictModeFlag strict_mode_flag_; 6560 StrictModeFlag strict_mode_flag_;
6533 }; 6561 };
6534 6562
6535 6563
6536 class HStoreKeyed V8_FINAL 6564 class HStoreKeyed V8_FINAL
6537 : public HTemplateInstruction<3>, public ArrayInstructionInterface { 6565 : public HTemplateInstruction<3>, public ArrayInstructionInterface {
6538 public: 6566 public:
6567 DECLARE_INSTRUCTION_FACTORY_P4(HStoreKeyed, HValue*, HValue*, HValue*,
6568 ElementsKind);
6539 DECLARE_INSTRUCTION_FACTORY_P5(HStoreKeyed, HValue*, HValue*, HValue*, 6569 DECLARE_INSTRUCTION_FACTORY_P5(HStoreKeyed, HValue*, HValue*, HValue*,
6540 ElementsKind, StoreFieldOrKeyedMode); 6570 ElementsKind, StoreFieldOrKeyedMode);
6541 6571
6542 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6572 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE {
6543 // kind_fast: tagged[int32] = tagged 6573 // kind_fast: tagged[int32] = tagged
6544 // kind_double: tagged[int32] = double 6574 // kind_double: tagged[int32] = double
6545 // kind_smi : tagged[int32] = smi 6575 // kind_smi : tagged[int32] = smi
6546 // kind_fixed_typed_array: tagged[int32] = (double | int32) 6576 // kind_fixed_typed_array: tagged[int32] = (double | int32)
6547 // kind_external: external[int32] = (double | int32) 6577 // kind_external: external[int32] = (double | int32)
6548 if (index == 0) { 6578 if (index == 0) {
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
6648 6678
6649 bool NeedsCanonicalization(); 6679 bool NeedsCanonicalization();
6650 6680
6651 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 6681 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
6652 6682
6653 DECLARE_CONCRETE_INSTRUCTION(StoreKeyed) 6683 DECLARE_CONCRETE_INSTRUCTION(StoreKeyed)
6654 6684
6655 private: 6685 private:
6656 HStoreKeyed(HValue* obj, HValue* key, HValue* val, 6686 HStoreKeyed(HValue* obj, HValue* key, HValue* val,
6657 ElementsKind elements_kind, 6687 ElementsKind elements_kind,
6658 StoreFieldOrKeyedMode store_mode) 6688 StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE)
6659 : elements_kind_(elements_kind), 6689 : elements_kind_(elements_kind),
6660 index_offset_(0), 6690 index_offset_(0),
6661 is_dehoisted_(false), 6691 is_dehoisted_(false),
6662 is_uninitialized_(false), 6692 is_uninitialized_(false),
6663 store_mode_(store_mode), 6693 store_mode_(store_mode),
6664 new_space_dominator_(NULL) { 6694 new_space_dominator_(NULL) {
6665 SetOperandAt(0, obj); 6695 SetOperandAt(0, obj);
6666 SetOperandAt(1, key); 6696 SetOperandAt(1, key);
6667 SetOperandAt(2, val); 6697 SetOperandAt(2, val);
6668 6698
6669 // PREINITIALIZING_STORE is only used to mark stores that initialize a
6670 // memory region resulting from HAllocate (possibly through an
6671 // HInnerAllocatedObject).
6672 ASSERT(store_mode != PREINITIALIZING_STORE ||
6673 obj->IsAllocate() || obj->IsInnerAllocatedObject());
6674
6675 ASSERT(store_mode != STORE_TO_INITIALIZED_ENTRY || 6699 ASSERT(store_mode != STORE_TO_INITIALIZED_ENTRY ||
6676 elements_kind == FAST_SMI_ELEMENTS); 6700 elements_kind == FAST_SMI_ELEMENTS);
6677 6701
6678 if (IsFastObjectElementsKind(elements_kind)) { 6702 if (IsFastObjectElementsKind(elements_kind)) {
6679 SetFlag(kTrackSideEffectDominators); 6703 SetFlag(kTrackSideEffectDominators);
6680 SetGVNFlag(kDependsOnNewSpacePromotion); 6704 SetGVNFlag(kDependsOnNewSpacePromotion);
6681 } 6705 }
6682 if (is_external()) { 6706 if (is_external()) {
6683 SetGVNFlag(kChangesExternalMemory); 6707 SetGVNFlag(kChangesExternalMemory);
6684 SetFlag(kAllowUndefinedAsNaN); 6708 SetFlag(kAllowUndefinedAsNaN);
(...skipping 14 matching lines...) Expand all
6699 (elements_kind >= UINT8_ELEMENTS && 6723 (elements_kind >= UINT8_ELEMENTS &&
6700 elements_kind <= INT32_ELEMENTS)) { 6724 elements_kind <= INT32_ELEMENTS)) {
6701 SetFlag(kTruncatingToInt32); 6725 SetFlag(kTruncatingToInt32);
6702 } 6726 }
6703 } 6727 }
6704 6728
6705 ElementsKind elements_kind_; 6729 ElementsKind elements_kind_;
6706 uint32_t index_offset_; 6730 uint32_t index_offset_;
6707 bool is_dehoisted_ : 1; 6731 bool is_dehoisted_ : 1;
6708 bool is_uninitialized_ : 1; 6732 bool is_uninitialized_ : 1;
6709 StoreFieldOrKeyedMode store_mode_: 2; 6733 StoreFieldOrKeyedMode store_mode_: 1;
6710 HValue* new_space_dominator_; 6734 HValue* new_space_dominator_;
6711 }; 6735 };
6712 6736
6713 6737
6714 class HStoreKeyedGeneric V8_FINAL : public HTemplateInstruction<4> { 6738 class HStoreKeyedGeneric V8_FINAL : public HTemplateInstruction<4> {
6715 public: 6739 public:
6716 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreKeyedGeneric, HValue*, 6740 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreKeyedGeneric, HValue*,
6717 HValue*, HValue*, StrictModeFlag); 6741 HValue*, HValue*, StrictModeFlag);
6718 6742
6719 HValue* object() { return OperandAt(0); } 6743 HValue* object() { return OperandAt(0); }
(...skipping 660 matching lines...) Expand 10 before | Expand all | Expand 10 after
7380 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 7404 virtual bool IsDeletable() const V8_OVERRIDE { return true; }
7381 }; 7405 };
7382 7406
7383 7407
7384 #undef DECLARE_INSTRUCTION 7408 #undef DECLARE_INSTRUCTION
7385 #undef DECLARE_CONCRETE_INSTRUCTION 7409 #undef DECLARE_CONCRETE_INSTRUCTION
7386 7410
7387 } } // namespace v8::internal 7411 } } // namespace v8::internal
7388 7412
7389 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ 7413 #endif // V8_HYDROGEN_INSTRUCTIONS_H_
OLDNEW
« no previous file with comments | « src/hydrogen.cc ('k') | src/hydrogen-instructions.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698