OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 #ifndef V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ | 5 #ifndef V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ |
6 #define V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ | 6 #define V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ |
7 | 7 |
8 #include <cstring> | 8 #include <cstring> |
9 #include <iosfwd> | 9 #include <iosfwd> |
10 | 10 |
(...skipping 908 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
919 P3 p3, P4 p4, P5 p5) { \ | 919 P3 p3, P4 p4, P5 p5) { \ |
920 return new (zone) I(p1, p2, p3, p4, p5); \ | 920 return new (zone) I(p1, p2, p3, p4, p5); \ |
921 } | 921 } |
922 | 922 |
923 #define DECLARE_INSTRUCTION_FACTORY_P6(I, P1, P2, P3, P4, P5, P6) \ | 923 #define DECLARE_INSTRUCTION_FACTORY_P6(I, P1, P2, P3, P4, P5, P6) \ |
924 static I* New(Isolate* isolate, Zone* zone, HValue* context, P1 p1, P2 p2, \ | 924 static I* New(Isolate* isolate, Zone* zone, HValue* context, P1 p1, P2 p2, \ |
925 P3 p3, P4 p4, P5 p5, P6 p6) { \ | 925 P3 p3, P4 p4, P5 p5, P6 p6) { \ |
926 return new (zone) I(p1, p2, p3, p4, p5, p6); \ | 926 return new (zone) I(p1, p2, p3, p4, p5, p6); \ |
927 } | 927 } |
928 | 928 |
| 929 #define DECLARE_INSTRUCTION_FACTORY_P7(I, P1, P2, P3, P4, P5, P6, P7) \ |
| 930 static I* New(Isolate* isolate, Zone* zone, HValue* context, P1 p1, P2 p2, \ |
| 931 P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) { \ |
| 932 return new (zone) I(p1, p2, p3, p4, p5, p6, p7); \ |
| 933 } |
| 934 |
929 #define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P0(I) \ | 935 #define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P0(I) \ |
930 static I* New(Isolate* isolate, Zone* zone, HValue* context) { \ | 936 static I* New(Isolate* isolate, Zone* zone, HValue* context) { \ |
931 return new (zone) I(context); \ | 937 return new (zone) I(context); \ |
932 } | 938 } |
933 | 939 |
934 #define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(I, P1) \ | 940 #define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(I, P1) \ |
935 static I* New(Isolate* isolate, Zone* zone, HValue* context, P1 p1) { \ | 941 static I* New(Isolate* isolate, Zone* zone, HValue* context, P1 p1) { \ |
936 return new (zone) I(context, p1); \ | 942 return new (zone) I(context, p1); \ |
937 } | 943 } |
938 | 944 |
(...skipping 5561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6500 | 6506 |
6501 static const int kDefaultKeyedHeaderOffsetSentinel = -1; | 6507 static const int kDefaultKeyedHeaderOffsetSentinel = -1; |
6502 | 6508 |
6503 enum LoadKeyedHoleMode { | 6509 enum LoadKeyedHoleMode { |
6504 NEVER_RETURN_HOLE, | 6510 NEVER_RETURN_HOLE, |
6505 ALLOW_RETURN_HOLE, | 6511 ALLOW_RETURN_HOLE, |
6506 CONVERT_HOLE_TO_UNDEFINED | 6512 CONVERT_HOLE_TO_UNDEFINED |
6507 }; | 6513 }; |
6508 | 6514 |
6509 | 6515 |
6510 class HLoadKeyed final : public HTemplateInstruction<3>, | 6516 class HLoadKeyed final : public HTemplateInstruction<4>, |
6511 public ArrayInstructionInterface { | 6517 public ArrayInstructionInterface { |
6512 public: | 6518 public: |
6513 DECLARE_INSTRUCTION_FACTORY_P4(HLoadKeyed, HValue*, HValue*, HValue*, | 6519 DECLARE_INSTRUCTION_FACTORY_P5(HLoadKeyed, HValue*, HValue*, HValue*, HValue*, |
6514 ElementsKind); | 6520 ElementsKind); |
6515 DECLARE_INSTRUCTION_FACTORY_P5(HLoadKeyed, HValue*, HValue*, HValue*, | 6521 DECLARE_INSTRUCTION_FACTORY_P6(HLoadKeyed, HValue*, HValue*, HValue*, HValue*, |
6516 ElementsKind, LoadKeyedHoleMode); | 6522 ElementsKind, LoadKeyedHoleMode); |
6517 DECLARE_INSTRUCTION_FACTORY_P6(HLoadKeyed, HValue*, HValue*, HValue*, | 6523 DECLARE_INSTRUCTION_FACTORY_P7(HLoadKeyed, HValue*, HValue*, HValue*, HValue*, |
6518 ElementsKind, LoadKeyedHoleMode, int); | 6524 ElementsKind, LoadKeyedHoleMode, int); |
6519 | 6525 |
6520 bool is_fixed_typed_array() const { | 6526 bool is_fixed_typed_array() const { |
6521 return IsFixedTypedArrayElementsKind(elements_kind()); | 6527 return IsFixedTypedArrayElementsKind(elements_kind()); |
6522 } | 6528 } |
6523 HValue* elements() const { return OperandAt(0); } | 6529 HValue* elements() const { return OperandAt(0); } |
6524 HValue* key() const { return OperandAt(1); } | 6530 HValue* key() const { return OperandAt(1); } |
6525 HValue* dependency() const { | 6531 HValue* dependency() const { |
6526 DCHECK(HasDependency()); | 6532 DCHECK(HasDependency()); |
6527 return OperandAt(2); | 6533 return OperandAt(2); |
6528 } | 6534 } |
6529 bool HasDependency() const { return OperandAt(0) != OperandAt(2); } | 6535 bool HasDependency() const { return OperandAt(0) != OperandAt(2); } |
| 6536 HValue* backing_store_owner() const { |
| 6537 DCHECK(HasBackingStoreOwner()); |
| 6538 return OperandAt(3); |
| 6539 } |
| 6540 bool HasBackingStoreOwner() const { return OperandAt(0) != OperandAt(3); } |
6530 uint32_t base_offset() const { return BaseOffsetField::decode(bit_field_); } | 6541 uint32_t base_offset() const { return BaseOffsetField::decode(bit_field_); } |
6531 bool TryIncreaseBaseOffset(uint32_t increase_by_value) override; | 6542 bool TryIncreaseBaseOffset(uint32_t increase_by_value) override; |
6532 HValue* GetKey() override { return key(); } | 6543 HValue* GetKey() override { return key(); } |
6533 void SetKey(HValue* key) override { SetOperandAt(1, key); } | 6544 void SetKey(HValue* key) override { SetOperandAt(1, key); } |
6534 bool IsDehoisted() const override { | 6545 bool IsDehoisted() const override { |
6535 return IsDehoistedField::decode(bit_field_); | 6546 return IsDehoistedField::decode(bit_field_); |
6536 } | 6547 } |
6537 void SetDehoisted(bool is_dehoisted) override { | 6548 void SetDehoisted(bool is_dehoisted) override { |
6538 bit_field_ = IsDehoistedField::update(bit_field_, is_dehoisted); | 6549 bit_field_ = IsDehoistedField::update(bit_field_, is_dehoisted); |
6539 } | 6550 } |
(...skipping 10 matching lines...) Expand all Loading... |
6550 // kind_fixed_typed_array: external[int32] (none) | 6561 // kind_fixed_typed_array: external[int32] (none) |
6551 // kind_external: external[int32] (none) | 6562 // kind_external: external[int32] (none) |
6552 if (index == 0) { | 6563 if (index == 0) { |
6553 return is_fixed_typed_array() ? Representation::External() | 6564 return is_fixed_typed_array() ? Representation::External() |
6554 : Representation::Tagged(); | 6565 : Representation::Tagged(); |
6555 } | 6566 } |
6556 if (index == 1) { | 6567 if (index == 1) { |
6557 return ArrayInstructionInterface::KeyedAccessIndexRequirement( | 6568 return ArrayInstructionInterface::KeyedAccessIndexRequirement( |
6558 OperandAt(1)->representation()); | 6569 OperandAt(1)->representation()); |
6559 } | 6570 } |
6560 return Representation::None(); | 6571 if (index == 2) { |
| 6572 return Representation::None(); |
| 6573 } |
| 6574 DCHECK_EQ(3, index); |
| 6575 return HasBackingStoreOwner() ? Representation::Tagged() |
| 6576 : Representation::None(); |
6561 } | 6577 } |
6562 | 6578 |
6563 Representation observed_input_representation(int index) override { | 6579 Representation observed_input_representation(int index) override { |
6564 return RequiredInputRepresentation(index); | 6580 return RequiredInputRepresentation(index); |
6565 } | 6581 } |
6566 | 6582 |
6567 std::ostream& PrintDataTo(std::ostream& os) const override; // NOLINT | 6583 std::ostream& PrintDataTo(std::ostream& os) const override; // NOLINT |
6568 | 6584 |
6569 bool UsesMustHandleHole() const; | 6585 bool UsesMustHandleHole() const; |
6570 bool AllUsesCanTreatHoleAsNaN() const; | 6586 bool AllUsesCanTreatHoleAsNaN() const; |
6571 bool RequiresHoleCheck() const; | 6587 bool RequiresHoleCheck() const; |
6572 | 6588 |
6573 Range* InferRange(Zone* zone) override; | 6589 Range* InferRange(Zone* zone) override; |
6574 | 6590 |
6575 DECLARE_CONCRETE_INSTRUCTION(LoadKeyed) | 6591 DECLARE_CONCRETE_INSTRUCTION(LoadKeyed) |
6576 | 6592 |
6577 protected: | 6593 protected: |
6578 bool DataEquals(HValue* other) override { | 6594 bool DataEquals(HValue* other) override { |
6579 if (!other->IsLoadKeyed()) return false; | 6595 if (!other->IsLoadKeyed()) return false; |
6580 HLoadKeyed* other_load = HLoadKeyed::cast(other); | 6596 HLoadKeyed* other_load = HLoadKeyed::cast(other); |
6581 | 6597 |
6582 if (base_offset() != other_load->base_offset()) return false; | 6598 if (base_offset() != other_load->base_offset()) return false; |
6583 return elements_kind() == other_load->elements_kind(); | 6599 return elements_kind() == other_load->elements_kind(); |
6584 } | 6600 } |
6585 | 6601 |
6586 private: | 6602 private: |
6587 HLoadKeyed(HValue* obj, HValue* key, HValue* dependency, | 6603 HLoadKeyed(HValue* obj, HValue* key, HValue* dependency, |
6588 ElementsKind elements_kind, | 6604 HValue* backing_store_owner, ElementsKind elements_kind, |
6589 LoadKeyedHoleMode mode = NEVER_RETURN_HOLE, | 6605 LoadKeyedHoleMode mode = NEVER_RETURN_HOLE, |
6590 int offset = kDefaultKeyedHeaderOffsetSentinel) | 6606 int offset = kDefaultKeyedHeaderOffsetSentinel) |
6591 : bit_field_(0) { | 6607 : bit_field_(0) { |
6592 offset = offset == kDefaultKeyedHeaderOffsetSentinel | 6608 offset = offset == kDefaultKeyedHeaderOffsetSentinel |
6593 ? GetDefaultHeaderSizeForElementsKind(elements_kind) | 6609 ? GetDefaultHeaderSizeForElementsKind(elements_kind) |
6594 : offset; | 6610 : offset; |
6595 bit_field_ = ElementsKindField::encode(elements_kind) | | 6611 bit_field_ = ElementsKindField::encode(elements_kind) | |
6596 HoleModeField::encode(mode) | | 6612 HoleModeField::encode(mode) | |
6597 BaseOffsetField::encode(offset); | 6613 BaseOffsetField::encode(offset); |
6598 | 6614 |
6599 SetOperandAt(0, obj); | 6615 SetOperandAt(0, obj); |
6600 SetOperandAt(1, key); | 6616 SetOperandAt(1, key); |
6601 SetOperandAt(2, dependency != NULL ? dependency : obj); | 6617 SetOperandAt(2, dependency != nullptr ? dependency : obj); |
| 6618 SetOperandAt(3, backing_store_owner != nullptr ? backing_store_owner : obj); |
| 6619 DCHECK_EQ(HasBackingStoreOwner(), is_fixed_typed_array()); |
6602 | 6620 |
6603 if (!is_fixed_typed_array()) { | 6621 if (!is_fixed_typed_array()) { |
6604 // I can detect the case between storing double (holey and fast) and | 6622 // I can detect the case between storing double (holey and fast) and |
6605 // smi/object by looking at elements_kind_. | 6623 // smi/object by looking at elements_kind_. |
6606 DCHECK(IsFastSmiOrObjectElementsKind(elements_kind) || | 6624 DCHECK(IsFastSmiOrObjectElementsKind(elements_kind) || |
6607 IsFastDoubleElementsKind(elements_kind)); | 6625 IsFastDoubleElementsKind(elements_kind)); |
6608 | 6626 |
6609 if (IsFastSmiOrObjectElementsKind(elements_kind)) { | 6627 if (IsFastSmiOrObjectElementsKind(elements_kind)) { |
6610 if (IsFastSmiElementsKind(elements_kind) && | 6628 if (IsFastSmiElementsKind(elements_kind) && |
6611 (!IsHoleyElementsKind(elements_kind) || | 6629 (!IsHoleyElementsKind(elements_kind) || |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6944 } | 6962 } |
6945 | 6963 |
6946 Handle<Name> name_; | 6964 Handle<Name> name_; |
6947 Handle<TypeFeedbackVector> feedback_vector_; | 6965 Handle<TypeFeedbackVector> feedback_vector_; |
6948 FeedbackVectorSlot slot_; | 6966 FeedbackVectorSlot slot_; |
6949 LanguageMode language_mode_; | 6967 LanguageMode language_mode_; |
6950 InlineCacheState initialization_state_; | 6968 InlineCacheState initialization_state_; |
6951 }; | 6969 }; |
6952 | 6970 |
6953 | 6971 |
6954 class HStoreKeyed final : public HTemplateInstruction<3>, | 6972 class HStoreKeyed final : public HTemplateInstruction<4>, |
6955 public ArrayInstructionInterface { | 6973 public ArrayInstructionInterface { |
6956 public: | 6974 public: |
6957 DECLARE_INSTRUCTION_FACTORY_P4(HStoreKeyed, HValue*, HValue*, HValue*, | |
6958 ElementsKind); | |
6959 DECLARE_INSTRUCTION_FACTORY_P5(HStoreKeyed, HValue*, HValue*, HValue*, | 6975 DECLARE_INSTRUCTION_FACTORY_P5(HStoreKeyed, HValue*, HValue*, HValue*, |
6960 ElementsKind, StoreFieldOrKeyedMode); | 6976 HValue*, ElementsKind); |
6961 DECLARE_INSTRUCTION_FACTORY_P6(HStoreKeyed, HValue*, HValue*, HValue*, | 6977 DECLARE_INSTRUCTION_FACTORY_P6(HStoreKeyed, HValue*, HValue*, HValue*, |
6962 ElementsKind, StoreFieldOrKeyedMode, int); | 6978 HValue*, ElementsKind, StoreFieldOrKeyedMode); |
| 6979 DECLARE_INSTRUCTION_FACTORY_P7(HStoreKeyed, HValue*, HValue*, HValue*, |
| 6980 HValue*, ElementsKind, StoreFieldOrKeyedMode, |
| 6981 int); |
6963 | 6982 |
6964 Representation RequiredInputRepresentation(int index) override { | 6983 Representation RequiredInputRepresentation(int index) override { |
6965 // kind_fast: tagged[int32] = tagged | 6984 // kind_fast: tagged[int32] = tagged |
6966 // kind_double: tagged[int32] = double | 6985 // kind_double: tagged[int32] = double |
6967 // kind_smi : tagged[int32] = smi | 6986 // kind_smi : tagged[int32] = smi |
6968 // kind_fixed_typed_array: tagged[int32] = (double | int32) | 6987 // kind_fixed_typed_array: tagged[int32] = (double | int32) |
6969 // kind_external: external[int32] = (double | int32) | 6988 // kind_external: external[int32] = (double | int32) |
6970 if (index == 0) { | 6989 if (index == 0) { |
6971 return is_fixed_typed_array() ? Representation::External() | 6990 return is_fixed_typed_array() ? Representation::External() |
6972 : Representation::Tagged(); | 6991 : Representation::Tagged(); |
6973 } else if (index == 1) { | 6992 } else if (index == 1) { |
6974 return ArrayInstructionInterface::KeyedAccessIndexRequirement( | 6993 return ArrayInstructionInterface::KeyedAccessIndexRequirement( |
6975 OperandAt(1)->representation()); | 6994 OperandAt(1)->representation()); |
| 6995 } else if (index == 2) { |
| 6996 return RequiredValueRepresentation(elements_kind(), store_mode()); |
6976 } | 6997 } |
6977 | 6998 |
6978 DCHECK_EQ(index, 2); | 6999 DCHECK_EQ(3, index); |
6979 return RequiredValueRepresentation(elements_kind(), store_mode()); | 7000 return HasBackingStoreOwner() ? Representation::Tagged() |
| 7001 : Representation::None(); |
6980 } | 7002 } |
6981 | 7003 |
6982 static Representation RequiredValueRepresentation( | 7004 static Representation RequiredValueRepresentation( |
6983 ElementsKind kind, StoreFieldOrKeyedMode mode) { | 7005 ElementsKind kind, StoreFieldOrKeyedMode mode) { |
6984 if (IsDoubleOrFloatElementsKind(kind)) { | 7006 if (IsDoubleOrFloatElementsKind(kind)) { |
6985 return Representation::Double(); | 7007 return Representation::Double(); |
6986 } | 7008 } |
6987 | 7009 |
6988 if (kind == FAST_SMI_ELEMENTS && SmiValuesAre32Bits() && | 7010 if (kind == FAST_SMI_ELEMENTS && SmiValuesAre32Bits() && |
6989 mode == STORE_TO_INITIALIZED_ENTRY) { | 7011 mode == STORE_TO_INITIALIZED_ENTRY) { |
6990 return Representation::Integer32(); | 7012 return Representation::Integer32(); |
6991 } | 7013 } |
6992 | 7014 |
6993 if (IsFastSmiElementsKind(kind)) { | 7015 if (IsFastSmiElementsKind(kind)) { |
6994 return Representation::Smi(); | 7016 return Representation::Smi(); |
6995 } | 7017 } |
6996 | 7018 |
6997 if (IsFixedTypedArrayElementsKind(kind)) { | 7019 if (IsFixedTypedArrayElementsKind(kind)) { |
6998 return Representation::Integer32(); | 7020 return Representation::Integer32(); |
6999 } | 7021 } |
7000 return Representation::Tagged(); | 7022 return Representation::Tagged(); |
7001 } | 7023 } |
7002 | 7024 |
7003 bool is_fixed_typed_array() const { | 7025 bool is_fixed_typed_array() const { |
7004 return IsFixedTypedArrayElementsKind(elements_kind()); | 7026 return IsFixedTypedArrayElementsKind(elements_kind()); |
7005 } | 7027 } |
7006 | 7028 |
7007 Representation observed_input_representation(int index) override { | 7029 Representation observed_input_representation(int index) override { |
7008 if (index < 2) return RequiredInputRepresentation(index); | 7030 if (index != 2) return RequiredInputRepresentation(index); |
7009 if (IsUninitialized()) { | 7031 if (IsUninitialized()) { |
7010 return Representation::None(); | 7032 return Representation::None(); |
7011 } | 7033 } |
7012 Representation r = | 7034 Representation r = |
7013 RequiredValueRepresentation(elements_kind(), store_mode()); | 7035 RequiredValueRepresentation(elements_kind(), store_mode()); |
7014 // For fast object elements kinds, don't assume anything. | 7036 // For fast object elements kinds, don't assume anything. |
7015 if (r.IsTagged()) return Representation::None(); | 7037 if (r.IsTagged()) return Representation::None(); |
7016 return r; | 7038 return r; |
7017 } | 7039 } |
7018 | 7040 |
7019 HValue* elements() const { return OperandAt(0); } | 7041 HValue* elements() const { return OperandAt(0); } |
7020 HValue* key() const { return OperandAt(1); } | 7042 HValue* key() const { return OperandAt(1); } |
7021 HValue* value() const { return OperandAt(2); } | 7043 HValue* value() const { return OperandAt(2); } |
| 7044 HValue* backing_store_owner() const { |
| 7045 DCHECK(HasBackingStoreOwner()); |
| 7046 return OperandAt(3); |
| 7047 } |
| 7048 bool HasBackingStoreOwner() const { return OperandAt(0) != OperandAt(3); } |
7022 bool value_is_smi() const { return IsFastSmiElementsKind(elements_kind()); } | 7049 bool value_is_smi() const { return IsFastSmiElementsKind(elements_kind()); } |
7023 StoreFieldOrKeyedMode store_mode() const { | 7050 StoreFieldOrKeyedMode store_mode() const { |
7024 return StoreModeField::decode(bit_field_); | 7051 return StoreModeField::decode(bit_field_); |
7025 } | 7052 } |
7026 ElementsKind elements_kind() const override { | 7053 ElementsKind elements_kind() const override { |
7027 return ElementsKindField::decode(bit_field_); | 7054 return ElementsKindField::decode(bit_field_); |
7028 } | 7055 } |
7029 uint32_t base_offset() const { return base_offset_; } | 7056 uint32_t base_offset() const { return base_offset_; } |
7030 bool TryIncreaseBaseOffset(uint32_t increase_by_value) override; | 7057 bool TryIncreaseBaseOffset(uint32_t increase_by_value) override; |
7031 HValue* GetKey() override { return key(); } | 7058 HValue* GetKey() override { return key(); } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7067 return PointersToHereCheckForObject(value(), dominator()); | 7094 return PointersToHereCheckForObject(value(), dominator()); |
7068 } | 7095 } |
7069 | 7096 |
7070 bool NeedsCanonicalization(); | 7097 bool NeedsCanonicalization(); |
7071 | 7098 |
7072 std::ostream& PrintDataTo(std::ostream& os) const override; // NOLINT | 7099 std::ostream& PrintDataTo(std::ostream& os) const override; // NOLINT |
7073 | 7100 |
7074 DECLARE_CONCRETE_INSTRUCTION(StoreKeyed) | 7101 DECLARE_CONCRETE_INSTRUCTION(StoreKeyed) |
7075 | 7102 |
7076 private: | 7103 private: |
7077 HStoreKeyed(HValue* obj, HValue* key, HValue* val, ElementsKind elements_kind, | 7104 HStoreKeyed(HValue* obj, HValue* key, HValue* val, |
| 7105 HValue* backing_store_owner, ElementsKind elements_kind, |
7078 StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE, | 7106 StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE, |
7079 int offset = kDefaultKeyedHeaderOffsetSentinel) | 7107 int offset = kDefaultKeyedHeaderOffsetSentinel) |
7080 : base_offset_(offset == kDefaultKeyedHeaderOffsetSentinel | 7108 : base_offset_(offset == kDefaultKeyedHeaderOffsetSentinel |
7081 ? GetDefaultHeaderSizeForElementsKind(elements_kind) | 7109 ? GetDefaultHeaderSizeForElementsKind(elements_kind) |
7082 : offset), | 7110 : offset), |
7083 bit_field_(IsDehoistedField::encode(false) | | 7111 bit_field_(IsDehoistedField::encode(false) | |
7084 IsUninitializedField::encode(false) | | 7112 IsUninitializedField::encode(false) | |
7085 StoreModeField::encode(store_mode) | | 7113 StoreModeField::encode(store_mode) | |
7086 ElementsKindField::encode(elements_kind)), | 7114 ElementsKindField::encode(elements_kind)), |
7087 dominator_(NULL) { | 7115 dominator_(NULL) { |
7088 SetOperandAt(0, obj); | 7116 SetOperandAt(0, obj); |
7089 SetOperandAt(1, key); | 7117 SetOperandAt(1, key); |
7090 SetOperandAt(2, val); | 7118 SetOperandAt(2, val); |
| 7119 SetOperandAt(3, backing_store_owner != nullptr ? backing_store_owner : obj); |
| 7120 DCHECK_EQ(HasBackingStoreOwner(), is_fixed_typed_array()); |
7091 | 7121 |
7092 if (IsFastObjectElementsKind(elements_kind)) { | 7122 if (IsFastObjectElementsKind(elements_kind)) { |
7093 SetFlag(kTrackSideEffectDominators); | 7123 SetFlag(kTrackSideEffectDominators); |
7094 SetDependsOnFlag(kNewSpacePromotion); | 7124 SetDependsOnFlag(kNewSpacePromotion); |
7095 } | 7125 } |
7096 if (IsFastDoubleElementsKind(elements_kind)) { | 7126 if (IsFastDoubleElementsKind(elements_kind)) { |
7097 SetChangesFlag(kDoubleArrayElements); | 7127 SetChangesFlag(kDoubleArrayElements); |
7098 } else if (IsFastSmiElementsKind(elements_kind)) { | 7128 } else if (IsFastSmiElementsKind(elements_kind)) { |
7099 SetChangesFlag(kArrayElements); | 7129 SetChangesFlag(kArrayElements); |
7100 } else if (is_fixed_typed_array()) { | 7130 } else if (is_fixed_typed_array()) { |
(...skipping 710 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7811 | 7841 |
7812 | 7842 |
7813 | 7843 |
7814 #undef DECLARE_INSTRUCTION | 7844 #undef DECLARE_INSTRUCTION |
7815 #undef DECLARE_CONCRETE_INSTRUCTION | 7845 #undef DECLARE_CONCRETE_INSTRUCTION |
7816 | 7846 |
7817 } // namespace internal | 7847 } // namespace internal |
7818 } // namespace v8 | 7848 } // namespace v8 |
7819 | 7849 |
7820 #endif // V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ | 7850 #endif // V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ |
OLD | NEW |