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

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: Review notes applied 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
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 5723 matching lines...) Expand 10 before | Expand all | Expand 10 after
5734 } 5734 }
5735 5735
5736 inline Handle<String> name() const { 5736 inline Handle<String> name() const {
5737 return name_; 5737 return name_;
5738 } 5738 }
5739 5739
5740 inline bool immutable() const { 5740 inline bool immutable() const {
5741 return ImmutableField::decode(value_); 5741 return ImmutableField::decode(value_);
5742 } 5742 }
5743 5743
5744 // Returns true if access is being made to an in-object property that
5745 // was already added to the object.
5746 inline bool existing_inobject_property() const {
5747 return ExistingInobjectPropertyField::decode(value_);
5748 }
5749
5744 inline HObjectAccess WithRepresentation(Representation representation) { 5750 inline HObjectAccess WithRepresentation(Representation representation) {
5745 return HObjectAccess(portion(), offset(), representation, name()); 5751 return HObjectAccess(portion(), offset(), representation, name(),
5752 immutable(), existing_inobject_property());
5746 } 5753 }
5747 5754
5748 static HObjectAccess ForHeapNumberValue() { 5755 static HObjectAccess ForHeapNumberValue() {
5749 return HObjectAccess( 5756 return HObjectAccess(
5750 kDouble, HeapNumber::kValueOffset, Representation::Double()); 5757 kDouble, HeapNumber::kValueOffset, Representation::Double());
5751 } 5758 }
5752 5759
5753 static HObjectAccess ForHeapNumberValueLowestBits() { 5760 static HObjectAccess ForHeapNumberValueLowestBits() {
5754 return HObjectAccess(kDouble, 5761 return HObjectAccess(kDouble,
5755 HeapNumber::kValueOffset, 5762 HeapNumber::kValueOffset,
(...skipping 23 matching lines...) Expand all
5779 kArrayLengths, 5786 kArrayLengths,
5780 JSArray::kLengthOffset, 5787 JSArray::kLengthOffset,
5781 IsFastElementsKind(elements_kind) && 5788 IsFastElementsKind(elements_kind) &&
5782 FLAG_track_fields 5789 FLAG_track_fields
5783 ? Representation::Smi() : Representation::Tagged()); 5790 ? Representation::Smi() : Representation::Tagged());
5784 } 5791 }
5785 5792
5786 static HObjectAccess ForAllocationSiteOffset(int offset); 5793 static HObjectAccess ForAllocationSiteOffset(int offset);
5787 5794
5788 static HObjectAccess ForAllocationSiteList() { 5795 static HObjectAccess ForAllocationSiteList() {
5789 return HObjectAccess(kExternalMemory, 0, Representation::Tagged()); 5796 return HObjectAccess(kExternalMemory, 0, Representation::Tagged(),
5797 Handle<String>::null(), false, false);
5790 } 5798 }
5791 5799
5792 static HObjectAccess ForFixedArrayLength() { 5800 static HObjectAccess ForFixedArrayLength() {
5793 return HObjectAccess( 5801 return HObjectAccess(
5794 kArrayLengths, 5802 kArrayLengths,
5795 FixedArray::kLengthOffset, 5803 FixedArray::kLengthOffset,
5796 FLAG_track_fields ? Representation::Smi() : Representation::Tagged()); 5804 FLAG_track_fields ? Representation::Smi() : Representation::Tagged());
5797 } 5805 }
5798 5806
5799 static HObjectAccess ForStringHashField() { 5807 static HObjectAccess ForStringHashField() {
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
5881 5889
5882 static HObjectAccess ForCellValue() { 5890 static HObjectAccess ForCellValue() {
5883 return HObjectAccess(kInobject, Cell::kValueOffset); 5891 return HObjectAccess(kInobject, Cell::kValueOffset);
5884 } 5892 }
5885 5893
5886 static HObjectAccess ForAllocationMementoSite() { 5894 static HObjectAccess ForAllocationMementoSite() {
5887 return HObjectAccess(kInobject, AllocationMemento::kAllocationSiteOffset); 5895 return HObjectAccess(kInobject, AllocationMemento::kAllocationSiteOffset);
5888 } 5896 }
5889 5897
5890 static HObjectAccess ForCounter() { 5898 static HObjectAccess ForCounter() {
5891 return HObjectAccess(kExternalMemory, 0, Representation::Integer32()); 5899 return HObjectAccess(kExternalMemory, 0, Representation::Integer32(),
5900 Handle<String>::null(), false, false);
5892 } 5901 }
5893 5902
5894 // Create an access to an offset in a fixed array header. 5903 // Create an access to an offset in a fixed array header.
5895 static HObjectAccess ForFixedArrayHeader(int offset); 5904 static HObjectAccess ForFixedArrayHeader(int offset);
5896 5905
5897 // Create an access to an in-object property in a JSObject. 5906 // Create an access to an in-object property in a JSObject.
5898 static HObjectAccess ForJSObjectOffset(int offset, 5907 // This kind of access must be used when the object |map| is known and
5908 // in-object properties are being accessed. Accesses of the in-object
5909 // properties can have different semantics depending on whether corresponding
5910 // property was added to the map or not.
5911 static HObjectAccess ForMapAndOffset(Handle<Map> map, int offset,
5899 Representation representation = Representation::Tagged()); 5912 Representation representation = Representation::Tagged());
5900 5913
5914 // Create an access to an in-object property in a JSObject.
5915 // This kind of access can be used for accessing object header fields or
5916 // in-object properties if the map of the object is not known.
5917 static HObjectAccess ForObservableJSObjectPropertyAt(int offset,
5918 Representation representation = Representation::Tagged()) {
5919 return ForMapAndOffset(Handle<Map>::null(), offset, representation);
5920 }
5921
5901 // Create an access to an in-object property in a JSArray. 5922 // Create an access to an in-object property in a JSArray.
5902 static HObjectAccess ForJSArrayOffset(int offset); 5923 static HObjectAccess ForJSArrayOffset(int offset);
5903 5924
5904 static HObjectAccess ForContextSlot(int index); 5925 static HObjectAccess ForContextSlot(int index);
5905 5926
5906 // Create an access to the backing store of an object. 5927 // Create an access to the backing store of an object.
5907 static HObjectAccess ForBackingStoreOffset(int offset, 5928 static HObjectAccess ForBackingStoreOffset(int offset,
5908 Representation representation = Representation::Tagged()); 5929 Representation representation = Representation::Tagged());
5909 5930
5910 // Create an access to a resolved field (in-object or backing store). 5931 // Create an access to a resolved field (in-object or backing store).
5911 static HObjectAccess ForField(Handle<Map> map, 5932 static HObjectAccess ForField(Handle<Map> map,
5912 LookupResult *lookup, Handle<String> name = Handle<String>::null()); 5933 LookupResult *lookup, Handle<String> name = Handle<String>::null());
5913 5934
5914 // Create an access for the payload of a Cell or JSGlobalPropertyCell. 5935 // Create an access for the payload of a Cell or JSGlobalPropertyCell.
5915 static HObjectAccess ForCellPayload(Isolate* isolate); 5936 static HObjectAccess ForCellPayload(Isolate* isolate);
5916 5937
5917 static HObjectAccess ForJSTypedArrayLength() { 5938 static HObjectAccess ForJSTypedArrayLength() {
5918 return HObjectAccess::ForJSObjectOffset(JSTypedArray::kLengthOffset); 5939 return HObjectAccess::ForObservableJSObjectPropertyAt(
5940 JSTypedArray::kLengthOffset);
5919 } 5941 }
5920 5942
5921 static HObjectAccess ForJSArrayBufferBackingStore() { 5943 static HObjectAccess ForJSArrayBufferBackingStore() {
5922 return HObjectAccess::ForJSObjectOffset( 5944 return HObjectAccess::ForObservableJSObjectPropertyAt(
5923 JSArrayBuffer::kBackingStoreOffset, Representation::External()); 5945 JSArrayBuffer::kBackingStoreOffset, Representation::External());
5924 } 5946 }
5925 5947
5926 static HObjectAccess ForExternalArrayExternalPointer() { 5948 static HObjectAccess ForExternalArrayExternalPointer() {
5927 return HObjectAccess::ForJSObjectOffset( 5949 return HObjectAccess::ForObservableJSObjectPropertyAt(
5928 ExternalArray::kExternalPointerOffset, Representation::External()); 5950 ExternalArray::kExternalPointerOffset, Representation::External());
5929 } 5951 }
5930 5952
5931 static HObjectAccess ForJSArrayBufferViewWeakNext() { 5953 static HObjectAccess ForJSArrayBufferViewWeakNext() {
5932 return HObjectAccess::ForJSObjectOffset(JSArrayBufferView::kWeakNextOffset); 5954 return HObjectAccess::ForObservableJSObjectPropertyAt(
5955 JSArrayBufferView::kWeakNextOffset);
5933 } 5956 }
5934 5957
5935 static HObjectAccess ForJSArrayBufferWeakFirstView() { 5958 static HObjectAccess ForJSArrayBufferWeakFirstView() {
5936 return HObjectAccess::ForJSObjectOffset( 5959 return HObjectAccess::ForObservableJSObjectPropertyAt(
5937 JSArrayBuffer::kWeakFirstViewOffset); 5960 JSArrayBuffer::kWeakFirstViewOffset);
5938 } 5961 }
5939 5962
5940 static HObjectAccess ForJSArrayBufferViewBuffer() { 5963 static HObjectAccess ForJSArrayBufferViewBuffer() {
5941 return HObjectAccess::ForJSObjectOffset(JSArrayBufferView::kBufferOffset); 5964 return HObjectAccess::ForObservableJSObjectPropertyAt(
5965 JSArrayBufferView::kBufferOffset);
5942 } 5966 }
5943 5967
5944 static HObjectAccess ForJSArrayBufferViewByteOffset() { 5968 static HObjectAccess ForJSArrayBufferViewByteOffset() {
5945 return HObjectAccess::ForJSObjectOffset( 5969 return HObjectAccess::ForObservableJSObjectPropertyAt(
5946 JSArrayBufferView::kByteOffsetOffset); 5970 JSArrayBufferView::kByteOffsetOffset);
5947 } 5971 }
5948 5972
5949 static HObjectAccess ForJSArrayBufferViewByteLength() { 5973 static HObjectAccess ForJSArrayBufferViewByteLength() {
5950 return HObjectAccess::ForJSObjectOffset( 5974 return HObjectAccess::ForObservableJSObjectPropertyAt(
5951 JSArrayBufferView::kByteLengthOffset); 5975 JSArrayBufferView::kByteLengthOffset);
5952 } 5976 }
5953 5977
5954 static HObjectAccess ForGlobalObjectNativeContext() { 5978 static HObjectAccess ForGlobalObjectNativeContext() {
5955 return HObjectAccess(kInobject, GlobalObject::kNativeContextOffset); 5979 return HObjectAccess(kInobject, GlobalObject::kNativeContextOffset);
5956 } 5980 }
5957 5981
5958 void PrintTo(StringStream* stream); 5982 void PrintTo(StringStream* stream);
5959 5983
5960 inline bool Equals(HObjectAccess that) const { 5984 inline bool Equals(HObjectAccess that) const {
(...skipping 12 matching lines...) Expand all
5973 kElementsPointer, // elements pointer 5997 kElementsPointer, // elements pointer
5974 kBackingStore, // some field in the backing store 5998 kBackingStore, // some field in the backing store
5975 kDouble, // some double field 5999 kDouble, // some double field
5976 kInobject, // some other in-object field 6000 kInobject, // some other in-object field
5977 kExternalMemory // some field in external memory 6001 kExternalMemory // some field in external memory
5978 }; 6002 };
5979 6003
5980 HObjectAccess(Portion portion, int offset, 6004 HObjectAccess(Portion portion, int offset,
5981 Representation representation = Representation::Tagged(), 6005 Representation representation = Representation::Tagged(),
5982 Handle<String> name = Handle<String>::null(), 6006 Handle<String> name = Handle<String>::null(),
5983 bool immutable = false) 6007 bool immutable = false,
6008 bool existing_inobject_property = true)
5984 : value_(PortionField::encode(portion) | 6009 : value_(PortionField::encode(portion) |
5985 RepresentationField::encode(representation.kind()) | 6010 RepresentationField::encode(representation.kind()) |
5986 ImmutableField::encode(immutable ? 1 : 0) | 6011 ImmutableField::encode(immutable ? 1 : 0) |
6012 ExistingInobjectPropertyField::encode(
6013 existing_inobject_property ? 1 : 0) |
5987 OffsetField::encode(offset)), 6014 OffsetField::encode(offset)),
5988 name_(name) { 6015 name_(name) {
5989 // assert that the fields decode correctly 6016 // assert that the fields decode correctly
5990 ASSERT(this->offset() == offset); 6017 ASSERT(this->offset() == offset);
5991 ASSERT(this->portion() == portion); 6018 ASSERT(this->portion() == portion);
5992 ASSERT(this->immutable() == immutable); 6019 ASSERT(this->immutable() == immutable);
6020 ASSERT(this->existing_inobject_property() == existing_inobject_property);
5993 ASSERT(RepresentationField::decode(value_) == representation.kind()); 6021 ASSERT(RepresentationField::decode(value_) == representation.kind());
6022 ASSERT(!this->existing_inobject_property() || IsInobject());
5994 } 6023 }
5995 6024
5996 class PortionField : public BitField<Portion, 0, 3> {}; 6025 class PortionField : public BitField<Portion, 0, 3> {};
5997 class RepresentationField : public BitField<Representation::Kind, 3, 4> {}; 6026 class RepresentationField : public BitField<Representation::Kind, 3, 4> {};
5998 class ImmutableField : public BitField<bool, 7, 1> {}; 6027 class ImmutableField : public BitField<bool, 7, 1> {};
5999 class OffsetField : public BitField<int, 8, 24> {}; 6028 class ExistingInobjectPropertyField : public BitField<bool, 8, 1> {};
6029 class OffsetField : public BitField<int, 9, 23> {};
6000 6030
6001 uint32_t value_; // encodes portion, representation, immutable, and offset 6031 uint32_t value_; // encodes portion, representation, immutable, and offset
6002 Handle<String> name_; 6032 Handle<String> name_;
6003 6033
6004 friend class HLoadNamedField; 6034 friend class HLoadNamedField;
6005 friend class HStoreNamedField; 6035 friend class HStoreNamedField;
6006 6036
6007 inline Portion portion() const { 6037 inline Portion portion() const {
6008 return PortionField::decode(value_); 6038 return PortionField::decode(value_);
6009 } 6039 }
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after
6375 SetOperandAt(1, key); 6405 SetOperandAt(1, key);
6376 SetOperandAt(2, context); 6406 SetOperandAt(2, context);
6377 SetAllSideEffects(); 6407 SetAllSideEffects();
6378 } 6408 }
6379 }; 6409 };
6380 6410
6381 6411
6382 // Indicates whether the store is a store to an entry that was previously 6412 // Indicates whether the store is a store to an entry that was previously
6383 // initialized or not. 6413 // initialized or not.
6384 enum StoreFieldOrKeyedMode { 6414 enum StoreFieldOrKeyedMode {
6385 // This is a store of either an undefined value to a field or a hole/NaN to
6386 // an entry of a newly allocated object.
6387 PREINITIALIZING_STORE,
6388 // The entry could be either previously initialized or not. 6415 // The entry could be either previously initialized or not.
6389 INITIALIZING_STORE, 6416 INITIALIZING_STORE,
6390 // At the time of this store it is guaranteed that the entry is already 6417 // At the time of this store it is guaranteed that the entry is already
6391 // initialized. 6418 // initialized.
6392 STORE_TO_INITIALIZED_ENTRY 6419 STORE_TO_INITIALIZED_ENTRY
6393 }; 6420 };
6394 6421
6395 6422
6396 class HStoreNamedField V8_FINAL : public HTemplateInstruction<3> { 6423 class HStoreNamedField V8_FINAL : public HTemplateInstruction<3> {
6397 public: 6424 public:
6425 DECLARE_INSTRUCTION_FACTORY_P3(HStoreNamedField, HValue*,
6426 HObjectAccess, HValue*);
6398 DECLARE_INSTRUCTION_FACTORY_P4(HStoreNamedField, HValue*, 6427 DECLARE_INSTRUCTION_FACTORY_P4(HStoreNamedField, HValue*,
6399 HObjectAccess, HValue*, StoreFieldOrKeyedMode); 6428 HObjectAccess, HValue*, StoreFieldOrKeyedMode);
6400 6429
6401 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField) 6430 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField)
6402 6431
6403 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { 6432 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE {
6404 return index == 1; 6433 return index == 1;
6405 } 6434 }
6406 virtual bool HasOutOfBoundsAccess(int size) V8_OVERRIDE { 6435 virtual bool HasOutOfBoundsAccess(int size) V8_OVERRIDE {
6407 return !access().IsInobject() || access().offset() >= size; 6436 return !access().IsInobject() || access().offset() >= size;
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
6494 } 6523 }
6495 6524
6496 void UpdateValue(HValue* value) { 6525 void UpdateValue(HValue* value) {
6497 SetOperandAt(1, value); 6526 SetOperandAt(1, value);
6498 } 6527 }
6499 6528
6500 private: 6529 private:
6501 HStoreNamedField(HValue* obj, 6530 HStoreNamedField(HValue* obj,
6502 HObjectAccess access, 6531 HObjectAccess access,
6503 HValue* val, 6532 HValue* val,
6504 StoreFieldOrKeyedMode store_mode) 6533 StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE)
6505 : access_(access), 6534 : access_(access),
6506 new_space_dominator_(NULL), 6535 new_space_dominator_(NULL),
6507 write_barrier_mode_(UPDATE_WRITE_BARRIER), 6536 write_barrier_mode_(UPDATE_WRITE_BARRIER),
6508 has_transition_(false), 6537 has_transition_(false),
6509 store_mode_(store_mode) { 6538 store_mode_(store_mode) {
6510 // PREINITIALIZING_STORE is only used to mark stores that initialize a 6539 // Stores to a non existing in-object property are allowed only to the
6511 // memory region resulting from HAllocate (possibly through an 6540 // newly allocated objects (via HAllocate or HInnerAllocatedObject).
6512 // HInnerAllocatedObject). 6541 ASSERT(!access.IsInobject() || access.existing_inobject_property() ||
6513 ASSERT(store_mode != PREINITIALIZING_STORE ||
6514 obj->IsAllocate() || obj->IsInnerAllocatedObject()); 6542 obj->IsAllocate() || obj->IsInnerAllocatedObject());
6515 SetOperandAt(0, obj); 6543 SetOperandAt(0, obj);
6516 SetOperandAt(1, val); 6544 SetOperandAt(1, val);
6517 SetOperandAt(2, obj); 6545 SetOperandAt(2, obj);
6518 access.SetGVNFlags(this, true); 6546 access.SetGVNFlags(this, true);
6519 } 6547 }
6520 6548
6521 HObjectAccess access_; 6549 HObjectAccess access_;
6522 HValue* new_space_dominator_; 6550 HValue* new_space_dominator_;
6523 WriteBarrierMode write_barrier_mode_ : 1; 6551 WriteBarrierMode write_barrier_mode_ : 1;
6524 bool has_transition_ : 1; 6552 bool has_transition_ : 1;
6525 StoreFieldOrKeyedMode store_mode_ : 2; 6553 StoreFieldOrKeyedMode store_mode_ : 1;
6526 }; 6554 };
6527 6555
6528 6556
6529 class HStoreNamedGeneric V8_FINAL : public HTemplateInstruction<3> { 6557 class HStoreNamedGeneric V8_FINAL : public HTemplateInstruction<3> {
6530 public: 6558 public:
6531 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreNamedGeneric, HValue*, 6559 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreNamedGeneric, HValue*,
6532 Handle<String>, HValue*, 6560 Handle<String>, HValue*,
6533 StrictModeFlag); 6561 StrictModeFlag);
6534 HValue* object() { return OperandAt(0); } 6562 HValue* object() { return OperandAt(0); }
6535 HValue* value() { return OperandAt(1); } 6563 HValue* value() { return OperandAt(1); }
(...skipping 24 matching lines...) Expand all
6560 } 6588 }
6561 6589
6562 Handle<String> name_; 6590 Handle<String> name_;
6563 StrictModeFlag strict_mode_flag_; 6591 StrictModeFlag strict_mode_flag_;
6564 }; 6592 };
6565 6593
6566 6594
6567 class HStoreKeyed V8_FINAL 6595 class HStoreKeyed V8_FINAL
6568 : public HTemplateInstruction<3>, public ArrayInstructionInterface { 6596 : public HTemplateInstruction<3>, public ArrayInstructionInterface {
6569 public: 6597 public:
6598 DECLARE_INSTRUCTION_FACTORY_P4(HStoreKeyed, HValue*, HValue*, HValue*,
6599 ElementsKind);
6570 DECLARE_INSTRUCTION_FACTORY_P5(HStoreKeyed, HValue*, HValue*, HValue*, 6600 DECLARE_INSTRUCTION_FACTORY_P5(HStoreKeyed, HValue*, HValue*, HValue*,
6571 ElementsKind, StoreFieldOrKeyedMode); 6601 ElementsKind, StoreFieldOrKeyedMode);
6572 6602
6573 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6603 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE {
6574 // kind_fast: tagged[int32] = tagged 6604 // kind_fast: tagged[int32] = tagged
6575 // kind_double: tagged[int32] = double 6605 // kind_double: tagged[int32] = double
6576 // kind_smi : tagged[int32] = smi 6606 // kind_smi : tagged[int32] = smi
6577 // kind_fixed_typed_array: tagged[int32] = (double | int32) 6607 // kind_fixed_typed_array: tagged[int32] = (double | int32)
6578 // kind_external: external[int32] = (double | int32) 6608 // kind_external: external[int32] = (double | int32)
6579 if (index == 0) { 6609 if (index == 0) {
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
6679 6709
6680 bool NeedsCanonicalization(); 6710 bool NeedsCanonicalization();
6681 6711
6682 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 6712 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
6683 6713
6684 DECLARE_CONCRETE_INSTRUCTION(StoreKeyed) 6714 DECLARE_CONCRETE_INSTRUCTION(StoreKeyed)
6685 6715
6686 private: 6716 private:
6687 HStoreKeyed(HValue* obj, HValue* key, HValue* val, 6717 HStoreKeyed(HValue* obj, HValue* key, HValue* val,
6688 ElementsKind elements_kind, 6718 ElementsKind elements_kind,
6689 StoreFieldOrKeyedMode store_mode) 6719 StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE)
6690 : elements_kind_(elements_kind), 6720 : elements_kind_(elements_kind),
6691 index_offset_(0), 6721 index_offset_(0),
6692 is_dehoisted_(false), 6722 is_dehoisted_(false),
6693 is_uninitialized_(false), 6723 is_uninitialized_(false),
6694 store_mode_(store_mode), 6724 store_mode_(store_mode),
6695 new_space_dominator_(NULL) { 6725 new_space_dominator_(NULL) {
6696 SetOperandAt(0, obj); 6726 SetOperandAt(0, obj);
6697 SetOperandAt(1, key); 6727 SetOperandAt(1, key);
6698 SetOperandAt(2, val); 6728 SetOperandAt(2, val);
6699 6729
6700 // PREINITIALIZING_STORE is only used to mark stores that initialize a
6701 // memory region resulting from HAllocate (possibly through an
6702 // HInnerAllocatedObject).
6703 ASSERT(store_mode != PREINITIALIZING_STORE ||
6704 obj->IsAllocate() || obj->IsInnerAllocatedObject());
6705
6706 ASSERT(store_mode != STORE_TO_INITIALIZED_ENTRY || 6730 ASSERT(store_mode != STORE_TO_INITIALIZED_ENTRY ||
6707 elements_kind == FAST_SMI_ELEMENTS); 6731 elements_kind == FAST_SMI_ELEMENTS);
6708 6732
6709 if (IsFastObjectElementsKind(elements_kind)) { 6733 if (IsFastObjectElementsKind(elements_kind)) {
6710 SetFlag(kTrackSideEffectDominators); 6734 SetFlag(kTrackSideEffectDominators);
6711 SetGVNFlag(kDependsOnNewSpacePromotion); 6735 SetGVNFlag(kDependsOnNewSpacePromotion);
6712 } 6736 }
6713 if (is_external()) { 6737 if (is_external()) {
6714 SetGVNFlag(kChangesExternalMemory); 6738 SetGVNFlag(kChangesExternalMemory);
6715 SetFlag(kAllowUndefinedAsNaN); 6739 SetFlag(kAllowUndefinedAsNaN);
(...skipping 14 matching lines...) Expand all
6730 (elements_kind >= UINT8_ELEMENTS && 6754 (elements_kind >= UINT8_ELEMENTS &&
6731 elements_kind <= INT32_ELEMENTS)) { 6755 elements_kind <= INT32_ELEMENTS)) {
6732 SetFlag(kTruncatingToInt32); 6756 SetFlag(kTruncatingToInt32);
6733 } 6757 }
6734 } 6758 }
6735 6759
6736 ElementsKind elements_kind_; 6760 ElementsKind elements_kind_;
6737 uint32_t index_offset_; 6761 uint32_t index_offset_;
6738 bool is_dehoisted_ : 1; 6762 bool is_dehoisted_ : 1;
6739 bool is_uninitialized_ : 1; 6763 bool is_uninitialized_ : 1;
6740 StoreFieldOrKeyedMode store_mode_: 2; 6764 StoreFieldOrKeyedMode store_mode_: 1;
6741 HValue* new_space_dominator_; 6765 HValue* new_space_dominator_;
6742 }; 6766 };
6743 6767
6744 6768
6745 class HStoreKeyedGeneric V8_FINAL : public HTemplateInstruction<4> { 6769 class HStoreKeyedGeneric V8_FINAL : public HTemplateInstruction<4> {
6746 public: 6770 public:
6747 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreKeyedGeneric, HValue*, 6771 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreKeyedGeneric, HValue*,
6748 HValue*, HValue*, StrictModeFlag); 6772 HValue*, HValue*, StrictModeFlag);
6749 6773
6750 HValue* object() { return OperandAt(0); } 6774 HValue* object() { return OperandAt(0); }
(...skipping 660 matching lines...) Expand 10 before | Expand all | Expand 10 after
7411 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 7435 virtual bool IsDeletable() const V8_OVERRIDE { return true; }
7412 }; 7436 };
7413 7437
7414 7438
7415 #undef DECLARE_INSTRUCTION 7439 #undef DECLARE_INSTRUCTION
7416 #undef DECLARE_CONCRETE_INSTRUCTION 7440 #undef DECLARE_CONCRETE_INSTRUCTION
7417 7441
7418 } } // namespace v8::internal 7442 } } // namespace v8::internal
7419 7443
7420 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ 7444 #endif // V8_HYDROGEN_INSTRUCTIONS_H_
OLDNEW
« src/hydrogen.cc ('K') | « src/hydrogen.cc ('k') | src/hydrogen-instructions.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698