| 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_HYDROGEN_INSTRUCTIONS_H_ | 5 #ifndef V8_HYDROGEN_INSTRUCTIONS_H_ |
| 6 #define V8_HYDROGEN_INSTRUCTIONS_H_ | 6 #define V8_HYDROGEN_INSTRUCTIONS_H_ |
| 7 | 7 |
| 8 #include <cstring> | 8 #include <cstring> |
| 9 #include <iosfwd> | 9 #include <iosfwd> |
| 10 | 10 |
| (...skipping 6226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6237 static HObjectAccess ForJSArrayBufferBitField() { | 6237 static HObjectAccess ForJSArrayBufferBitField() { |
| 6238 return HObjectAccess::ForObservableJSObjectOffset( | 6238 return HObjectAccess::ForObservableJSObjectOffset( |
| 6239 JSArrayBuffer::kBitFieldOffset, Representation::Integer32()); | 6239 JSArrayBuffer::kBitFieldOffset, Representation::Integer32()); |
| 6240 } | 6240 } |
| 6241 | 6241 |
| 6242 static HObjectAccess ForJSArrayBufferBitFieldSlot() { | 6242 static HObjectAccess ForJSArrayBufferBitFieldSlot() { |
| 6243 return HObjectAccess::ForObservableJSObjectOffset( | 6243 return HObjectAccess::ForObservableJSObjectOffset( |
| 6244 JSArrayBuffer::kBitFieldSlot, Representation::Smi()); | 6244 JSArrayBuffer::kBitFieldSlot, Representation::Smi()); |
| 6245 } | 6245 } |
| 6246 | 6246 |
| 6247 static HObjectAccess ForExternalArrayExternalPointer() { | |
| 6248 return HObjectAccess::ForObservableJSObjectOffset( | |
| 6249 ExternalArray::kExternalPointerOffset, Representation::External()); | |
| 6250 } | |
| 6251 | |
| 6252 static HObjectAccess ForJSArrayBufferViewBuffer() { | 6247 static HObjectAccess ForJSArrayBufferViewBuffer() { |
| 6253 return HObjectAccess::ForObservableJSObjectOffset( | 6248 return HObjectAccess::ForObservableJSObjectOffset( |
| 6254 JSArrayBufferView::kBufferOffset); | 6249 JSArrayBufferView::kBufferOffset); |
| 6255 } | 6250 } |
| 6256 | 6251 |
| 6257 static HObjectAccess ForJSArrayBufferViewByteOffset() { | 6252 static HObjectAccess ForJSArrayBufferViewByteOffset() { |
| 6258 return HObjectAccess::ForObservableJSObjectOffset( | 6253 return HObjectAccess::ForObservableJSObjectOffset( |
| 6259 JSArrayBufferView::kByteOffsetOffset); | 6254 JSArrayBufferView::kByteOffsetOffset); |
| 6260 } | 6255 } |
| 6261 | 6256 |
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6611 class HLoadKeyed final : public HTemplateInstruction<3>, | 6606 class HLoadKeyed final : public HTemplateInstruction<3>, |
| 6612 public ArrayInstructionInterface { | 6607 public ArrayInstructionInterface { |
| 6613 public: | 6608 public: |
| 6614 DECLARE_INSTRUCTION_FACTORY_P4(HLoadKeyed, HValue*, HValue*, HValue*, | 6609 DECLARE_INSTRUCTION_FACTORY_P4(HLoadKeyed, HValue*, HValue*, HValue*, |
| 6615 ElementsKind); | 6610 ElementsKind); |
| 6616 DECLARE_INSTRUCTION_FACTORY_P5(HLoadKeyed, HValue*, HValue*, HValue*, | 6611 DECLARE_INSTRUCTION_FACTORY_P5(HLoadKeyed, HValue*, HValue*, HValue*, |
| 6617 ElementsKind, LoadKeyedHoleMode); | 6612 ElementsKind, LoadKeyedHoleMode); |
| 6618 DECLARE_INSTRUCTION_FACTORY_P6(HLoadKeyed, HValue*, HValue*, HValue*, | 6613 DECLARE_INSTRUCTION_FACTORY_P6(HLoadKeyed, HValue*, HValue*, HValue*, |
| 6619 ElementsKind, LoadKeyedHoleMode, int); | 6614 ElementsKind, LoadKeyedHoleMode, int); |
| 6620 | 6615 |
| 6621 bool is_external() const { | |
| 6622 return IsExternalArrayElementsKind(elements_kind()); | |
| 6623 } | |
| 6624 bool is_fixed_typed_array() const { | 6616 bool is_fixed_typed_array() const { |
| 6625 return IsFixedTypedArrayElementsKind(elements_kind()); | 6617 return IsFixedTypedArrayElementsKind(elements_kind()); |
| 6626 } | 6618 } |
| 6627 bool is_typed_elements() const { | |
| 6628 return is_external() || is_fixed_typed_array(); | |
| 6629 } | |
| 6630 HValue* elements() const { return OperandAt(0); } | 6619 HValue* elements() const { return OperandAt(0); } |
| 6631 HValue* key() const { return OperandAt(1); } | 6620 HValue* key() const { return OperandAt(1); } |
| 6632 HValue* dependency() const { | 6621 HValue* dependency() const { |
| 6633 DCHECK(HasDependency()); | 6622 DCHECK(HasDependency()); |
| 6634 return OperandAt(2); | 6623 return OperandAt(2); |
| 6635 } | 6624 } |
| 6636 bool HasDependency() const { return OperandAt(0) != OperandAt(2); } | 6625 bool HasDependency() const { return OperandAt(0) != OperandAt(2); } |
| 6637 uint32_t base_offset() const { return BaseOffsetField::decode(bit_field_); } | 6626 uint32_t base_offset() const { return BaseOffsetField::decode(bit_field_); } |
| 6638 bool TryIncreaseBaseOffset(uint32_t increase_by_value) override; | 6627 bool TryIncreaseBaseOffset(uint32_t increase_by_value) override; |
| 6639 HValue* GetKey() override { return key(); } | 6628 HValue* GetKey() override { return key(); } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 6650 LoadKeyedHoleMode hole_mode() const { | 6639 LoadKeyedHoleMode hole_mode() const { |
| 6651 return HoleModeField::decode(bit_field_); | 6640 return HoleModeField::decode(bit_field_); |
| 6652 } | 6641 } |
| 6653 | 6642 |
| 6654 Representation RequiredInputRepresentation(int index) override { | 6643 Representation RequiredInputRepresentation(int index) override { |
| 6655 // kind_fast: tagged[int32] (none) | 6644 // kind_fast: tagged[int32] (none) |
| 6656 // kind_double: tagged[int32] (none) | 6645 // kind_double: tagged[int32] (none) |
| 6657 // kind_fixed_typed_array: external[int32] (none) | 6646 // kind_fixed_typed_array: external[int32] (none) |
| 6658 // kind_external: external[int32] (none) | 6647 // kind_external: external[int32] (none) |
| 6659 if (index == 0) { | 6648 if (index == 0) { |
| 6660 return is_typed_elements() ? Representation::External() | 6649 return is_fixed_typed_array() ? Representation::External() |
| 6661 : Representation::Tagged(); | 6650 : Representation::Tagged(); |
| 6662 } | 6651 } |
| 6663 if (index == 1) { | 6652 if (index == 1) { |
| 6664 return ArrayInstructionInterface::KeyedAccessIndexRequirement( | 6653 return ArrayInstructionInterface::KeyedAccessIndexRequirement( |
| 6665 OperandAt(1)->representation()); | 6654 OperandAt(1)->representation()); |
| 6666 } | 6655 } |
| 6667 return Representation::None(); | 6656 return Representation::None(); |
| 6668 } | 6657 } |
| 6669 | 6658 |
| 6670 Representation observed_input_representation(int index) override { | 6659 Representation observed_input_representation(int index) override { |
| 6671 return RequiredInputRepresentation(index); | 6660 return RequiredInputRepresentation(index); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 6700 ? GetDefaultHeaderSizeForElementsKind(elements_kind) | 6689 ? GetDefaultHeaderSizeForElementsKind(elements_kind) |
| 6701 : offset; | 6690 : offset; |
| 6702 bit_field_ = ElementsKindField::encode(elements_kind) | | 6691 bit_field_ = ElementsKindField::encode(elements_kind) | |
| 6703 HoleModeField::encode(mode) | | 6692 HoleModeField::encode(mode) | |
| 6704 BaseOffsetField::encode(offset); | 6693 BaseOffsetField::encode(offset); |
| 6705 | 6694 |
| 6706 SetOperandAt(0, obj); | 6695 SetOperandAt(0, obj); |
| 6707 SetOperandAt(1, key); | 6696 SetOperandAt(1, key); |
| 6708 SetOperandAt(2, dependency != NULL ? dependency : obj); | 6697 SetOperandAt(2, dependency != NULL ? dependency : obj); |
| 6709 | 6698 |
| 6710 if (!is_typed_elements()) { | 6699 if (!is_fixed_typed_array()) { |
| 6711 // I can detect the case between storing double (holey and fast) and | 6700 // I can detect the case between storing double (holey and fast) and |
| 6712 // smi/object by looking at elements_kind_. | 6701 // smi/object by looking at elements_kind_. |
| 6713 DCHECK(IsFastSmiOrObjectElementsKind(elements_kind) || | 6702 DCHECK(IsFastSmiOrObjectElementsKind(elements_kind) || |
| 6714 IsFastDoubleElementsKind(elements_kind)); | 6703 IsFastDoubleElementsKind(elements_kind)); |
| 6715 | 6704 |
| 6716 if (IsFastSmiOrObjectElementsKind(elements_kind)) { | 6705 if (IsFastSmiOrObjectElementsKind(elements_kind)) { |
| 6717 if (IsFastSmiElementsKind(elements_kind) && | 6706 if (IsFastSmiElementsKind(elements_kind) && |
| 6718 (!IsHoleyElementsKind(elements_kind) || | 6707 (!IsHoleyElementsKind(elements_kind) || |
| 6719 mode == NEVER_RETURN_HOLE)) { | 6708 mode == NEVER_RETURN_HOLE)) { |
| 6720 set_type(HType::Smi()); | 6709 set_type(HType::Smi()); |
| 6721 if (SmiValuesAre32Bits() && !RequiresHoleCheck()) { | 6710 if (SmiValuesAre32Bits() && !RequiresHoleCheck()) { |
| 6722 set_representation(Representation::Integer32()); | 6711 set_representation(Representation::Integer32()); |
| 6723 } else { | 6712 } else { |
| 6724 set_representation(Representation::Smi()); | 6713 set_representation(Representation::Smi()); |
| 6725 } | 6714 } |
| 6726 } else { | 6715 } else { |
| 6727 set_representation(Representation::Tagged()); | 6716 set_representation(Representation::Tagged()); |
| 6728 } | 6717 } |
| 6729 | 6718 |
| 6730 SetDependsOnFlag(kArrayElements); | 6719 SetDependsOnFlag(kArrayElements); |
| 6731 } else { | 6720 } else { |
| 6732 set_representation(Representation::Double()); | 6721 set_representation(Representation::Double()); |
| 6733 SetDependsOnFlag(kDoubleArrayElements); | 6722 SetDependsOnFlag(kDoubleArrayElements); |
| 6734 } | 6723 } |
| 6735 } else { | 6724 } else { |
| 6736 if (elements_kind == EXTERNAL_FLOAT32_ELEMENTS || | 6725 if (elements_kind == FLOAT32_ELEMENTS || |
| 6737 elements_kind == EXTERNAL_FLOAT64_ELEMENTS || | |
| 6738 elements_kind == FLOAT32_ELEMENTS || | |
| 6739 elements_kind == FLOAT64_ELEMENTS) { | 6726 elements_kind == FLOAT64_ELEMENTS) { |
| 6740 set_representation(Representation::Double()); | 6727 set_representation(Representation::Double()); |
| 6741 } else { | 6728 } else { |
| 6742 set_representation(Representation::Integer32()); | 6729 set_representation(Representation::Integer32()); |
| 6743 } | 6730 } |
| 6744 | 6731 |
| 6745 if (is_external()) { | 6732 if (is_fixed_typed_array()) { |
| 6746 SetDependsOnFlag(kExternalMemory); | 6733 SetDependsOnFlag(kExternalMemory); |
| 6747 } else if (is_fixed_typed_array()) { | |
| 6748 SetDependsOnFlag(kTypedArrayElements); | 6734 SetDependsOnFlag(kTypedArrayElements); |
| 6749 } else { | 6735 } else { |
| 6750 UNREACHABLE(); | 6736 UNREACHABLE(); |
| 6751 } | 6737 } |
| 6752 // Native code could change the specialized array. | 6738 // Native code could change the specialized array. |
| 6753 SetDependsOnFlag(kCalls); | 6739 SetDependsOnFlag(kCalls); |
| 6754 } | 6740 } |
| 6755 | 6741 |
| 6756 SetFlag(kUseGVN); | 6742 SetFlag(kUseGVN); |
| 6757 } | 6743 } |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7106 DECLARE_INSTRUCTION_FACTORY_P6(HStoreKeyed, HValue*, HValue*, HValue*, | 7092 DECLARE_INSTRUCTION_FACTORY_P6(HStoreKeyed, HValue*, HValue*, HValue*, |
| 7107 ElementsKind, StoreFieldOrKeyedMode, int); | 7093 ElementsKind, StoreFieldOrKeyedMode, int); |
| 7108 | 7094 |
| 7109 Representation RequiredInputRepresentation(int index) override { | 7095 Representation RequiredInputRepresentation(int index) override { |
| 7110 // kind_fast: tagged[int32] = tagged | 7096 // kind_fast: tagged[int32] = tagged |
| 7111 // kind_double: tagged[int32] = double | 7097 // kind_double: tagged[int32] = double |
| 7112 // kind_smi : tagged[int32] = smi | 7098 // kind_smi : tagged[int32] = smi |
| 7113 // kind_fixed_typed_array: tagged[int32] = (double | int32) | 7099 // kind_fixed_typed_array: tagged[int32] = (double | int32) |
| 7114 // kind_external: external[int32] = (double | int32) | 7100 // kind_external: external[int32] = (double | int32) |
| 7115 if (index == 0) { | 7101 if (index == 0) { |
| 7116 return is_typed_elements() ? Representation::External() | 7102 return is_fixed_typed_array() ? Representation::External() |
| 7117 : Representation::Tagged(); | 7103 : Representation::Tagged(); |
| 7118 } else if (index == 1) { | 7104 } else if (index == 1) { |
| 7119 return ArrayInstructionInterface::KeyedAccessIndexRequirement( | 7105 return ArrayInstructionInterface::KeyedAccessIndexRequirement( |
| 7120 OperandAt(1)->representation()); | 7106 OperandAt(1)->representation()); |
| 7121 } | 7107 } |
| 7122 | 7108 |
| 7123 DCHECK_EQ(index, 2); | 7109 DCHECK_EQ(index, 2); |
| 7124 return RequiredValueRepresentation(elements_kind(), store_mode()); | 7110 return RequiredValueRepresentation(elements_kind(), store_mode()); |
| 7125 } | 7111 } |
| 7126 | 7112 |
| 7127 static Representation RequiredValueRepresentation( | 7113 static Representation RequiredValueRepresentation( |
| 7128 ElementsKind kind, StoreFieldOrKeyedMode mode) { | 7114 ElementsKind kind, StoreFieldOrKeyedMode mode) { |
| 7129 if (IsDoubleOrFloatElementsKind(kind)) { | 7115 if (IsDoubleOrFloatElementsKind(kind)) { |
| 7130 return Representation::Double(); | 7116 return Representation::Double(); |
| 7131 } | 7117 } |
| 7132 | 7118 |
| 7133 if (kind == FAST_SMI_ELEMENTS && SmiValuesAre32Bits() && | 7119 if (kind == FAST_SMI_ELEMENTS && SmiValuesAre32Bits() && |
| 7134 mode == STORE_TO_INITIALIZED_ENTRY) { | 7120 mode == STORE_TO_INITIALIZED_ENTRY) { |
| 7135 return Representation::Integer32(); | 7121 return Representation::Integer32(); |
| 7136 } | 7122 } |
| 7137 | 7123 |
| 7138 if (IsFastSmiElementsKind(kind)) { | 7124 if (IsFastSmiElementsKind(kind)) { |
| 7139 return Representation::Smi(); | 7125 return Representation::Smi(); |
| 7140 } | 7126 } |
| 7141 | 7127 |
| 7142 return IsExternalArrayElementsKind(kind) || | 7128 if (IsFixedTypedArrayElementsKind(kind)) { |
| 7143 IsFixedTypedArrayElementsKind(kind) | 7129 return Representation::Integer32(); |
| 7144 ? Representation::Integer32() | 7130 } |
| 7145 : Representation::Tagged(); | 7131 return Representation::Tagged(); |
| 7146 } | |
| 7147 | |
| 7148 bool is_external() const { | |
| 7149 return IsExternalArrayElementsKind(elements_kind()); | |
| 7150 } | 7132 } |
| 7151 | 7133 |
| 7152 bool is_fixed_typed_array() const { | 7134 bool is_fixed_typed_array() const { |
| 7153 return IsFixedTypedArrayElementsKind(elements_kind()); | 7135 return IsFixedTypedArrayElementsKind(elements_kind()); |
| 7154 } | 7136 } |
| 7155 | 7137 |
| 7156 bool is_typed_elements() const { | |
| 7157 return is_external() || is_fixed_typed_array(); | |
| 7158 } | |
| 7159 | |
| 7160 Representation observed_input_representation(int index) override { | 7138 Representation observed_input_representation(int index) override { |
| 7161 if (index < 2) return RequiredInputRepresentation(index); | 7139 if (index < 2) return RequiredInputRepresentation(index); |
| 7162 if (IsUninitialized()) { | 7140 if (IsUninitialized()) { |
| 7163 return Representation::None(); | 7141 return Representation::None(); |
| 7164 } | 7142 } |
| 7165 Representation r = | 7143 Representation r = |
| 7166 RequiredValueRepresentation(elements_kind(), store_mode()); | 7144 RequiredValueRepresentation(elements_kind(), store_mode()); |
| 7167 // For fast object elements kinds, don't assume anything. | 7145 // For fast object elements kinds, don't assume anything. |
| 7168 if (r.IsTagged()) return Representation::None(); | 7146 if (r.IsTagged()) return Representation::None(); |
| 7169 return r; | 7147 return r; |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7239 ElementsKindField::encode(elements_kind)), | 7217 ElementsKindField::encode(elements_kind)), |
| 7240 dominator_(NULL) { | 7218 dominator_(NULL) { |
| 7241 SetOperandAt(0, obj); | 7219 SetOperandAt(0, obj); |
| 7242 SetOperandAt(1, key); | 7220 SetOperandAt(1, key); |
| 7243 SetOperandAt(2, val); | 7221 SetOperandAt(2, val); |
| 7244 | 7222 |
| 7245 if (IsFastObjectElementsKind(elements_kind)) { | 7223 if (IsFastObjectElementsKind(elements_kind)) { |
| 7246 SetFlag(kTrackSideEffectDominators); | 7224 SetFlag(kTrackSideEffectDominators); |
| 7247 SetDependsOnFlag(kNewSpacePromotion); | 7225 SetDependsOnFlag(kNewSpacePromotion); |
| 7248 } | 7226 } |
| 7249 if (is_external()) { | 7227 if (IsFastDoubleElementsKind(elements_kind)) { |
| 7250 SetChangesFlag(kExternalMemory); | |
| 7251 SetFlag(kAllowUndefinedAsNaN); | |
| 7252 } else if (IsFastDoubleElementsKind(elements_kind)) { | |
| 7253 SetChangesFlag(kDoubleArrayElements); | 7228 SetChangesFlag(kDoubleArrayElements); |
| 7254 } else if (IsFastSmiElementsKind(elements_kind)) { | 7229 } else if (IsFastSmiElementsKind(elements_kind)) { |
| 7255 SetChangesFlag(kArrayElements); | 7230 SetChangesFlag(kArrayElements); |
| 7256 } else if (is_fixed_typed_array()) { | 7231 } else if (is_fixed_typed_array()) { |
| 7257 SetChangesFlag(kTypedArrayElements); | 7232 SetChangesFlag(kTypedArrayElements); |
| 7233 SetChangesFlag(kExternalMemory); |
| 7258 SetFlag(kAllowUndefinedAsNaN); | 7234 SetFlag(kAllowUndefinedAsNaN); |
| 7259 } else { | 7235 } else { |
| 7260 SetChangesFlag(kArrayElements); | 7236 SetChangesFlag(kArrayElements); |
| 7261 } | 7237 } |
| 7262 | 7238 |
| 7263 // EXTERNAL_{UNSIGNED_,}{BYTE,SHORT,INT}_ELEMENTS are truncating. | 7239 // {UNSIGNED_,}{BYTE,SHORT,INT}_ELEMENTS are truncating. |
| 7264 if ((elements_kind >= EXTERNAL_INT8_ELEMENTS && | 7240 if (elements_kind >= UINT8_ELEMENTS && elements_kind <= INT32_ELEMENTS) { |
| 7265 elements_kind <= EXTERNAL_UINT32_ELEMENTS) || | |
| 7266 (elements_kind >= UINT8_ELEMENTS && | |
| 7267 elements_kind <= INT32_ELEMENTS)) { | |
| 7268 SetFlag(kTruncatingToInt32); | 7241 SetFlag(kTruncatingToInt32); |
| 7269 } | 7242 } |
| 7270 } | 7243 } |
| 7271 | 7244 |
| 7272 class IsDehoistedField : public BitField<bool, 0, 1> {}; | 7245 class IsDehoistedField : public BitField<bool, 0, 1> {}; |
| 7273 class IsUninitializedField : public BitField<bool, 1, 1> {}; | 7246 class IsUninitializedField : public BitField<bool, 1, 1> {}; |
| 7274 class StoreModeField : public BitField<StoreFieldOrKeyedMode, 2, 1> {}; | 7247 class StoreModeField : public BitField<StoreFieldOrKeyedMode, 2, 1> {}; |
| 7275 class ElementsKindField : public BitField<ElementsKind, 3, 5> {}; | 7248 class ElementsKindField : public BitField<ElementsKind, 3, 5> {}; |
| 7276 | 7249 |
| 7277 uint32_t base_offset_; | 7250 uint32_t base_offset_; |
| (...skipping 807 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8085 }; | 8058 }; |
| 8086 | 8059 |
| 8087 | 8060 |
| 8088 | 8061 |
| 8089 #undef DECLARE_INSTRUCTION | 8062 #undef DECLARE_INSTRUCTION |
| 8090 #undef DECLARE_CONCRETE_INSTRUCTION | 8063 #undef DECLARE_CONCRETE_INSTRUCTION |
| 8091 | 8064 |
| 8092 } } // namespace v8::internal | 8065 } } // namespace v8::internal |
| 8093 | 8066 |
| 8094 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 8067 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
| OLD | NEW |