| 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 |